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