[#277] Dans le manager par défaut de tous les modèles, ne lister que les objets actifs.
[auf_django_references.git] / auf / django / references / managedref / models.py
1 # encoding: utf-8
2
3 from django.db import models
4
5
6 class ActifsManager(models.Manager):
7 """
8 Manager pour ``ActifsModel``.
9 """
10
11 def get_query_set(self):
12 return super(ActifsManager, self).get_query_set().filter(actif=True)
13
14
15 class ActifsModel(models.Model):
16 """
17 Modèle faisant la gestion des objets actifs/inactifs.
18
19 Le manager par défaut ne liste que les objets actifs. Pour avoir tous
20 les objets, utiliser le manager ``avec_inactifs``.
21 """
22 actif = models.BooleanField(default=True, editable=False)
23
24 # Managers
25 objects = ActifsManager()
26 avec_inactifs = models.Manager()
27
28 class Meta:
29 abstract = True
30
31
32 class Employe(ActifsModel):
33 """
34 Personne en contrat d'employé (CDD ou CDI) à l'AUF
35 """
36 id = models.IntegerField(primary_key=True)
37 nom = models.CharField(max_length=255)
38 prenom = models.CharField(max_length=255)
39 implantation = models.ForeignKey(
40 'references.Implantation',
41 db_column='implantation',
42 related_name='lieu_travail_theorique_de'
43 )
44 implantation_physique = models.ForeignKey(
45 'references.Implantation',
46 db_column='implantation_physique',
47 related_name='lieu_travail_reel_de'
48 )
49 courriel = models.CharField(max_length=255, null=True, blank=True)
50 genre = models.CharField(max_length=3)
51 fonction = models.CharField(max_length=255, null=True, blank=True)
52 telephone_poste = models.CharField(max_length=255, null=True, blank=True)
53 telephone_ip = models.CharField(max_length=255, null=True, blank=True)
54 responsable = models.ForeignKey(
55 'references.Employe',
56 db_column='responsable',
57 related_name='responsable_de',
58 null=True, blank=True
59 )
60 mandat_debut = models.DateField(null=True, blank=True)
61 mandat_fin = models.DateField(null=True, blank=True)
62 date_entree = models.DateField(null=True, blank=True)
63 service = models.ForeignKey('references.Service', db_column='service')
64 poste_type_1 = models.ForeignKey(
65 'references.PosteType',
66 null=True, blank=True,
67 db_column='poste_type_1',
68 related_name='poste_type_1'
69 )
70 poste_type_2 = models.ForeignKey(
71 'references.PosteType',
72 null=True, blank=True,
73 db_column='poste_type_2',
74 related_name='poste_type_2'
75 )
76
77 class Meta:
78 db_table = u'ref_employe'
79 ordering = ['nom']
80
81 def __unicode__(self):
82 return u"%s, %s [%d]" % (self.nom, self.prenom, self.id)
83
84
85 class Authentification(ActifsModel):
86 """Authentification"""
87 id = models.ForeignKey(
88 'references.Employe', primary_key=True, db_column='id'
89 )
90 courriel = models.CharField(max_length=255, unique=True)
91 motdepasse = models.CharField(max_length=255)
92
93 class Meta:
94 db_table = u'ref_authentification'
95 ordering = ['id']
96
97 def __unicode__(self):
98 return u"%s [%d]" % (self.courriel, self.id)
99
100
101 class Service(ActifsModel):
102 """Services (donnée de référence, source: SGRH).
103 """
104 id = models.IntegerField(primary_key=True)
105 nom = models.CharField(max_length=255)
106
107 class Meta:
108 db_table = u'ref_service'
109 ordering = ['nom']
110
111 def __unicode__(self):
112 return "%s (%s)" % (self.nom, self.id)
113
114
115 class PosteType(ActifsModel):
116 """Postes types (donnée de référence, source: SGRH).
117 """
118 id = models.IntegerField(primary_key=True)
119 nom = models.CharField(max_length=255)
120
121 class Meta:
122 db_table = u'ref_poste_type'
123
124 def __unicode__(self):
125 return "%s (%s)" % (self.nom, self.id)
126
127
128 class GroupeArh(ActifsModel):
129 id = models.AutoField(primary_key=True)
130 employe = models.ForeignKey('references.Employe', db_column='employe')
131
132 class Meta:
133 db_table = u'ref_groupe_arh'
134
135
136 class GroupeDirRegion(ActifsModel):
137 id = models.AutoField(primary_key=True)
138 employe = models.ForeignKey('references.Employe', db_column='employe')
139 region = models.ForeignKey('references.Region', db_column='region')
140
141 class Meta:
142 db_table = u'ref_groupe_dir_region'
143
144
145 class GroupeAdmRegion(ActifsModel):
146 id = models.AutoField(primary_key=True)
147 employe = models.ForeignKey('references.Employe', db_column='employe')
148 region = models.ForeignKey('references.Region', db_column='region')
149
150 class Meta:
151 db_table = u'ref_groupe_adm_region'
152
153
154 class GroupeRespImplantation(ActifsModel):
155 id = models.AutoField(primary_key=True)
156 employe = models.ForeignKey('references.Employe', db_column='employe')
157 implantation = models.ForeignKey(
158 'references.Implantation', db_column='implantation'
159 )
160 type = models.CharField(max_length=255, blank=True, null=True)
161
162 class Meta:
163 db_table = u'ref_groupe_resp_implantation'
164
165
166 class GroupeDirProgramme(ActifsModel):
167 id = models.AutoField(primary_key=True)
168 employe = models.ForeignKey('references.Employe', db_column='employe')
169 service = models.ForeignKey('references.Service', db_column='service')
170
171 class Meta:
172 db_table = u'ref_groupe_dir_programme'
173
174
175 class GroupeDirDelegProgrammeReg(ActifsModel):
176 id = models.AutoField(primary_key=True)
177 employe = models.ForeignKey('references.Employe', db_column='employe')
178 region = models.ForeignKey('references.Region', db_column='region')
179
180 class Meta:
181 db_table = u'ref_groupe_dir_deleg_programme_reg'
182
183
184 class GroupeComptable(ActifsModel):
185 id = models.AutoField(primary_key=True)
186 employe = models.ForeignKey('references.Employe', db_column='employe')
187
188 class Meta:
189 db_table = u'ref_groupe_comptable'
190
191
192 class GroupeComptableRegional(ActifsModel):
193 id = models.AutoField(primary_key=True)
194 employe = models.ForeignKey('references.Employe', db_column='employe')
195
196 class Meta:
197 db_table = u'ref_groupe_comptable_regional'
198
199
200 class GroupeComptableLocal(ActifsModel):
201 id = models.AutoField(primary_key=True)
202 employe = models.ForeignKey('references.Employe', db_column='employe')
203
204 class Meta:
205 db_table = u'ref_groupe_comptable_local'
206
207
208 class Discipline(ActifsModel):
209 """ ATTENTION: DÉSUET
210 Discipline (donnée de référence, source: SQI).
211 Une discipline est une catégorie de savoirs scientifiques.
212 Le conseil scientifique fixe la liste des disciplines.
213 """
214
215 id = models.IntegerField(primary_key=True)
216 code = models.CharField(max_length=255, unique=True)
217 nom = models.CharField(max_length=255)
218 nom_long = models.CharField(max_length=255, blank=True)
219 nom_court = models.CharField(max_length=255, blank=True)
220
221 class Meta:
222 db_table = u'ref_discipline'
223 ordering = ['nom']
224
225 def __unicode__(self):
226 return "%s - %s" % (self.code, self.nom)
227
228
229 class Programme(ActifsModel):
230 """ ATTENTION: DÉSUET
231 Programme (donnée de référence, source: SQI).
232 Structure interne par laquelle l'AUF exécute ses projets et activités,
233 dispense ses produits et ses services.
234 """
235
236 id = models.IntegerField(primary_key=True)
237 code = models.CharField(max_length=255, unique=True)
238 nom = models.CharField(max_length=255)
239 nom_long = models.CharField(max_length=255, blank=True)
240 nom_court = models.CharField(max_length=255, blank=True)
241
242 class Meta:
243 db_table = u'ref_programme'
244
245 def __unicode__(self):
246 return "%s - %s" % (self.code, self.nom)
247
248
249 #PROGRAMMATION QUADRIENNALLE
250
251 class Projet(ActifsModel):
252 """Projet (donnée de référence, source: programmation-quadriennalle).
253 """
254 SERVICE_CHOICES = (
255 ('1',
256 "Direction de la langue et de la communication scientifique "
257 "en français"),
258 ('2', "Direction du développement et de la valorisation"),
259 ('3',
260 "Direction de l'innovation pédagogique et de l'économie "
261 "de la connaissance"),
262 ('4', "Direction du renforcement des capacités scientifiques"),
263 )
264
265 id = models.IntegerField(primary_key=True)
266 code = models.CharField(max_length=255, unique=True)
267 nom = models.CharField(max_length=255)
268 presentation = models.TextField(null=True, blank=True)
269 partenaires = models.TextField(null=True, blank=True)
270 service = models.CharField(
271 max_length=255, choices=SERVICE_CHOICES, blank=True, null=True
272 )
273 objectif_specifique = models.ForeignKey(
274 'references.ObjectifSpecifique',
275 blank=True, null=True,
276 db_column='objectif_specifique'
277 )
278 implantation = models.ForeignKey('references.Implantation', null=True,
279 blank=True, db_column='implantation')
280 etablissement = models.ForeignKey('references.Etablissement', null=True,
281 blank=True, db_column='etablissement')
282 date_debut = models.DateField(null=True, blank=True)
283 date_fin = models.DateField(null=True, blank=True)
284
285 class Meta:
286 db_table = u'ref_projet'
287 ordering = ['nom']
288
289 def __unicode__(self):
290 return "%s - %s" % (self.code, self.nom)
291
292
293 class ProjetComposante(ActifsModel):
294 """Composantes des projets (source: programmation-quadriennalle)
295 """
296 id = models.IntegerField(primary_key=True)
297 code = models.CharField(max_length=10)
298 nom = models.CharField(max_length=255)
299 nom_court = models.CharField(max_length=255, null=True, blank=True)
300 description = models.TextField(null=True, blank=True)
301 projet = models.ForeignKey('references.Projet', db_column='projet')
302
303 class Meta:
304 db_table = u'ref_projet_composante'
305 ordering = ['nom']
306
307 def __unicode__(self):
308 return "%s - %s" % (self.code, self.nom)
309
310
311 class UniteProjet(ActifsModel):
312 """Unités de projet (source: programmation-quadriennalle)
313 """
314 id = models.IntegerField(primary_key=True)
315 code = models.CharField(max_length=10, unique=True)
316 nom = models.CharField(max_length=255)
317
318 class Meta:
319 db_table = u'ref_unite_projet'
320 ordering = ['nom']
321
322 def __unicode__(self):
323 return "%s - %s" % (self.code, self.nom)
324
325
326 class ObjectifSpecifique(ActifsModel):
327 id = models.IntegerField(primary_key=True)
328 nom = models.CharField(max_length=255)
329 objectif_strategique = models.ForeignKey('references.ObjectifStrategique',
330 db_column='objectif_strategique')
331
332 class Meta:
333 db_table = u'ref_objectif_specifique'
334 ordering = ['nom']
335
336 def __unicode__(self):
337 return "%s - %s" % (self.id, self.nom)
338
339
340 class ObjectifStrategique(ActifsModel):
341 id = models.IntegerField(primary_key=True)
342 nom = models.CharField(max_length=255)
343 description = models.TextField(null=True, blank=True)
344
345 class Meta:
346 db_table = u'ref_objectif_strategique'
347 ordering = ['nom']
348
349 def __unicode__(self):
350 return "%s - %s" % (self.id, self.nom)
351
352
353 class Thematique(ActifsModel):
354 id = models.IntegerField(primary_key=True)
355 nom = models.CharField(max_length=255)
356
357 class Meta:
358 db_table = u'ref_thematique'
359 ordering = ['nom']
360
361 def __unicode__(self):
362 return "%s - %s" % (self.id, self.nom)
363
364
365 class ProjetUp(ActifsModel):
366 """Projet-unité de projet (source: coda)
367 => codes budgétaires
368 """
369 id = models.AutoField(primary_key=True)
370 code = models.CharField(max_length=255, unique=True)
371 nom = models.CharField(max_length=255)
372 nom_court = models.CharField(max_length=255, blank=True)
373
374
375 class Poste(ActifsModel):
376 """ ATTENTION: DÉSUET
377 Poste (donnée de référence, source: CODA).
378 Un poste est une catégorie destinée à venir raffiner un projet.
379 """
380
381 id = models.IntegerField(primary_key=True)
382 code = models.CharField(max_length=255, unique=True)
383 nom = models.CharField(max_length=255)
384 type = models.CharField(max_length=255, blank=True)
385
386 class Meta:
387 db_table = u'ref_poste'
388
389 def __unicode__(self):
390 return "%s - %s (%s)" % (self.code, self.nom, self.type)
391
392
393 class ProjetPoste(ActifsModel):
394 """
395 ATTENTION: DÉSUET
396 Projet-poste (donnée de référence, source: CODA).
397 Un projet-poste consiste en une raffinement d'un projet par un poste
398 (budgétaire). Subdivision utile pour le suivi budgétaire et comptable.
399 """
400
401 id = models.IntegerField(primary_key=True)
402 code = models.CharField(max_length=255, unique=True)
403 code_projet = models.ForeignKey(
404 'references.Projet', to_field='code', db_column='code_projet'
405 )
406 code_poste = models.ForeignKey(
407 'references.Poste', to_field='code', db_column='code_poste'
408 )
409 code_bureau = models.ForeignKey(
410 'references.Bureau', to_field='code', db_column='code_bureau'
411 )
412 code_programme = models.ForeignKey(
413 'references.Programme', to_field='code', db_column='code_programme'
414 )
415
416 class Meta:
417 db_table = u'ref_projet_poste'
418
419 def __unicode__(self):
420 return "%s" % (self.code)
421
422
423 class Region(ActifsModel):
424 """Région (donnée de référence, source: referentiels_spip).
425 Une région est une subdivision géographique du monde pour la gestion de
426 l'AUF.
427 """
428 code = models.CharField(max_length=255, unique=True)
429 nom = models.CharField(max_length=255, db_index=True)
430 implantation_bureau = models.ForeignKey(
431 'references.Implantation', db_column='implantation_bureau',
432 related_name='gere_region', null=True, blank=True
433 )
434
435 class Meta:
436 db_table = u'ref_region'
437 ordering = ['nom']
438 verbose_name = u"région"
439 verbose_name_plural = u"régions"
440
441 def __unicode__(self):
442 return "%s (%s)" % (self.nom, self.code)
443
444
445 class Bureau(ActifsModel):
446 """
447 Bureau (donnée de référence, source: SQI).
448
449 Référence legacy entre la notion de région et celle d'implantation
450 responsable des régions et du central.
451
452 Un bureau est :
453 - soit le bureau régional d'une région (implantations de type 'Bureau')
454 - soit la notion unique de Service central pour les 2 implantations
455 centrales (implantations de type 'Service central' et 'Siege').
456
457 Ne pas confondre avec les seuls 'bureaux régionaux'.
458 """
459 code = models.CharField(max_length=255, unique=True)
460 nom = models.CharField(max_length=255)
461 nom_court = models.CharField(max_length=255, blank=True)
462 nom_long = models.CharField(max_length=255, blank=True)
463 implantation = models.ForeignKey(
464 'references.Implantation', db_column='implantation'
465 )
466 region = models.ForeignKey('references.Region', db_column='region')
467
468 class Meta:
469 db_table = u'ref_bureau'
470 ordering = ['nom']
471 verbose_name = u"bureau"
472 verbose_name_plural = u"bureaux"
473
474 def __unicode__(self):
475 return "%s (%s)" % (self.nom, self.code)
476
477
478 class Implantation(ActifsModel):
479 """
480 Implantation (donnée de référence, source: Implantus)
481
482 Une implantation est un endroit où l'AUF est présente et offre des
483 services spécifiques. Deux implantations peuvent être au même endroit
484 physique.
485 """
486 STATUT_CHOICES = (
487 (0, u'Fermée ou jamais ouverte'),
488 (1, u'Ouverte'),
489 (2, u'Ouverture imminente'),
490 (3, u'En projet')
491 )
492
493 nom = models.CharField(max_length=255)
494 nom_court = models.CharField(max_length=255, blank=True)
495 nom_long = models.CharField(max_length=255, blank=True)
496 type = models.CharField(max_length=255)
497 bureau_rattachement = models.ForeignKey(
498 'references.Implantation', db_column='bureau_rattachement'
499 )
500 region = models.ForeignKey('references.Region', db_column='region')
501 fuseau_horaire = models.CharField(max_length=255, blank=True)
502 code_meteo = models.CharField(max_length=255, blank=True)
503 # responsable
504 responsable_implantation = models.IntegerField(null=True, blank=True)
505 # adresse postale
506 adresse_postale_precision_avant = models.CharField(
507 max_length=255, blank=True, null=True
508 )
509 adresse_postale_no = models.CharField(max_length=30, blank=True, null=True)
510 adresse_postale_rue = models.CharField(
511 max_length=255, blank=True, null=True
512 )
513 adresse_postale_bureau = models.CharField(
514 max_length=255, blank=True, null=True
515 )
516 adresse_postale_precision = models.CharField(
517 max_length=255, blank=True, null=True
518 )
519 adresse_postale_boite_postale = models.CharField(
520 max_length=255, blank=True, null=True
521 )
522 adresse_postale_ville = models.CharField(max_length=255)
523 adresse_postale_code_postal = models.CharField(
524 max_length=20, blank=True, null=True
525 )
526 adresse_postale_code_postal_avant_ville = models.NullBooleanField()
527 adresse_postale_region = models.CharField(
528 max_length=255, blank=True, null=True
529 )
530 adresse_postale_pays = models.ForeignKey(
531 'references.Pays', to_field='code',
532 db_column='adresse_postale_pays',
533 related_name='impl_adresse_postale'
534 )
535 # adresse physique
536 adresse_physique_precision_avant = models.CharField(
537 max_length=255, blank=True
538 )
539 adresse_physique_no = models.CharField(max_length=30, blank=True)
540 adresse_physique_rue = models.CharField(max_length=255, blank=True)
541 adresse_physique_bureau = models.CharField(max_length=255, blank=True)
542 adresse_physique_precision = models.CharField(max_length=255, blank=True)
543 adresse_physique_ville = models.CharField(max_length=255)
544 adresse_physique_code_postal = models.CharField(max_length=30, blank=True)
545 adresse_physique_code_postal_avant_ville = models.NullBooleanField()
546 adresse_physique_region = models.CharField(max_length=255, blank=True)
547 adresse_physique_pays = models.ForeignKey(
548 'references.Pays', to_field='code',
549 db_column='adresse_physique_pays',
550 related_name='impl_adresse_physique'
551 )
552 # autres coordonnées
553 telephone = models.CharField(max_length=255, blank=True)
554 telephone_interne = models.CharField(max_length=255, blank=True)
555 fax = models.CharField(max_length=255, blank=True)
556 fax_interne = models.CharField(max_length=255, blank=True)
557 courriel = models.EmailField(blank=True)
558 courriel_interne = models.EmailField(blank=True)
559 url = models.URLField(verify_exists=False, max_length=255, blank=True)
560 # traitement
561 statut = models.IntegerField(choices=STATUT_CHOICES)
562 date_ouverture = models.DateField(null=True, blank=True)
563 date_inauguration = models.DateField(null=True, blank=True)
564 date_extension = models.DateField(null=True, blank=True)
565 date_fermeture = models.DateField(null=True, blank=True)
566 hebergement_etablissement = models.CharField(max_length=255, blank=True)
567 hebergement_convention = models.NullBooleanField()
568 hebergement_convention_date = models.DateField(null=True, blank=True)
569 remarque = models.TextField()
570 commentaire = models.CharField(max_length=255, blank=True)
571 # meta
572 modif_date = models.DateField()
573
574 class Managers:
575
576 class Ouvertes(ActifsManager):
577
578 def get_query_set(self):
579 return super(Implantation.Managers.Ouvertes, self) \
580 .get_query_set() \
581 .filter(statut=1)
582
583 objects = ActifsManager()
584 ouvertes = Managers.Ouvertes()
585
586 class Meta:
587 db_table = u'ref_implantation'
588 ordering = ['nom']
589
590 def __unicode__(self):
591 return "%s (%d)" % (self.nom, self.id)
592
593
594 class Pays(ActifsModel):
595 """
596 Pays (donnée de référence, source: SQI).
597
598 Liste AUF basée sur la liste ISO-3166-1.
599 """
600 code = models.CharField(max_length=2, unique=True)
601 code_iso3 = models.CharField(max_length=3, unique=True)
602 nom = models.CharField(max_length=255)
603 region = models.ForeignKey('references.Region', db_column='region')
604 code_bureau = models.ForeignKey('references.Bureau', to_field='code',
605 db_column='code_bureau', blank=True,
606 null=True)
607 nord_sud = models.CharField(max_length=255, blank=True, null=True)
608 developpement = models.CharField(max_length=255, blank=True, null=True)
609 monnaie = models.CharField(max_length=255, blank=True, null=True)
610
611 class Meta:
612 db_table = u'ref_pays'
613 ordering = ['nom']
614 verbose_name = u"pays"
615 verbose_name_plural = u"pays"
616
617 def __unicode__(self):
618 return "%s (%s)" % (self.nom, self.code)
619
620
621 class EtablissementBase(ActifsModel):
622 """
623 Établissement (donnée de référence, source: GDE).
624
625 Un établissement peut être une université, un centre de recherche, un
626 réseau d'établissement... Un établissement peut être membre de l'AUF ou
627 non.
628 """
629 MEMBRE_STATUT_CHOICES = (
630 ('T', 'Titulaire'),
631 ('A', 'Associé'),
632 ('C', 'Candidat'),
633 )
634 QUALITE_CHOICES = (
635 ('ESR', "Établissement d'enseignement supérieur et de recherche"),
636 ('CIR', "Centre ou institution de recherche"),
637 ('RES', "Réseau"),
638 )
639
640 # Infos de base
641 nom = models.CharField(max_length=255)
642 pays = models.ForeignKey(
643 'references.Pays', to_field='code', db_column='pays',
644 related_name='+'
645 )
646 region = models.ForeignKey(
647 'references.Region', db_column='region', blank=True, null=True,
648 related_name='+', verbose_name='région'
649 )
650 implantation = models.ForeignKey(
651 'references.Implantation', db_column='implantation',
652 related_name='+', blank=True, null=True
653 )
654 description = models.TextField(blank=True)
655 historique = models.TextField(blank=True)
656
657 # Membership
658 membre = models.BooleanField()
659 membre_adhesion_date = models.DateField(null=True, blank=True,
660 verbose_name="date d'adhésion")
661 statut = models.CharField(max_length=1, choices=MEMBRE_STATUT_CHOICES,
662 blank=True, null=True)
663 qualite = models.CharField(max_length=3, choices=QUALITE_CHOICES,
664 verbose_name="qualité", blank=True,
665 null=True)
666
667 # Responsable
668 responsable_genre = models.CharField(
669 max_length=1, blank=True, verbose_name='genre'
670 )
671 responsable_nom = models.CharField(
672 max_length=255, blank=True, verbose_name='nom'
673 )
674 responsable_prenom = models.CharField(
675 max_length=255, blank=True, verbose_name='prénom'
676 )
677 responsable_fonction = models.CharField(
678 max_length=255, blank=True, verbose_name='fonction'
679 )
680
681 # Adresse
682 adresse = models.CharField(max_length=255, blank=True)
683 code_postal = models.CharField(max_length=20, blank=True,
684 verbose_name='code postal')
685 cedex = models.CharField(max_length=20, blank=True, verbose_name='CEDEX')
686 ville = models.CharField(max_length=255, blank=True)
687 province = models.CharField(max_length=255, blank=True)
688 telephone = models.CharField(max_length=255, blank=True,
689 verbose_name='téléphone')
690 fax = models.CharField(max_length=255, blank=True)
691 url = models.URLField(verify_exists=False, max_length=255, null=True,
692 blank=True, verbose_name='URL')
693
694 # Meta-données
695 date_modification = models.DateField(verbose_name='date de modification',
696 blank=True, null=True)
697 commentaire = models.TextField(blank=True)
698
699 class Meta:
700 abstract = True
701 ordering = ['pays__nom', 'nom']
702
703 def __unicode__(self):
704 return "%s - %s" % (self.pays.nom, self.nom)
705
706
707 class Etablissement(EtablissementBase):
708
709 class Meta(EtablissementBase.Meta):
710 db_table = u'ref_etablissement'