[#3252] Ajout d'une colonne Employe.telephone_ip_nomade
[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 )
177 type = models.CharField(max_length=255, blank=True, null=True)
b98fea67
EMS
178
179 class Meta:
e488f68e
EMS
180 db_table = u'ref_groupe_resp_implantation'
181 managed = MANAGED
b98fea67 182
a10aee41 183
e488f68e 184class GroupeDirProgramme(ActifsModel):
e488f68e
EMS
185 employe = models.ForeignKey('references.Employe', db_column='employe')
186 service = models.ForeignKey('references.Service', db_column='service')
b98fea67
EMS
187
188 class Meta:
e488f68e
EMS
189 db_table = u'ref_groupe_dir_programme'
190 managed = MANAGED
b98fea67 191
a10aee41 192
e488f68e 193class GroupeDirDelegProgrammeReg(ActifsModel):
e488f68e
EMS
194 employe = models.ForeignKey('references.Employe', db_column='employe')
195 region = models.ForeignKey('references.Region', db_column='region')
b98fea67
EMS
196
197 class Meta:
e488f68e
EMS
198 db_table = u'ref_groupe_dir_deleg_programme_reg'
199 managed = MANAGED
b98fea67 200
a10aee41 201
e488f68e 202class GroupeComptable(ActifsModel):
e488f68e 203 employe = models.ForeignKey('references.Employe', db_column='employe')
b98fea67
EMS
204
205 class Meta:
e488f68e
EMS
206 db_table = u'ref_groupe_comptable'
207 managed = MANAGED
b98fea67 208
a10aee41 209
e488f68e 210class GroupeComptableRegional(ActifsModel):
e488f68e 211 employe = models.ForeignKey('references.Employe', db_column='employe')
b98fea67
EMS
212
213 class Meta:
e488f68e
EMS
214 db_table = u'ref_groupe_comptable_regional'
215 managed = MANAGED
b98fea67 216
b98fea67 217
e488f68e 218class GroupeComptableLocal(ActifsModel):
e488f68e 219 employe = models.ForeignKey('references.Employe', db_column='employe')
b98fea67
EMS
220
221 class Meta:
e488f68e
EMS
222 db_table = u'ref_groupe_comptable_local'
223 managed = MANAGED
224
b98fea67 225
e488f68e 226class Discipline(ActifsModel):
4ea539be
EMS
227 """
228 ATTENTION: DÉSUET
e488f68e
EMS
229 Discipline (donnée de référence, source: SQI).
230 Une discipline est une catégorie de savoirs scientifiques.
231 Le conseil scientifique fixe la liste des disciplines.
232 """
e488f68e
EMS
233 code = models.CharField(max_length=255, unique=True)
234 nom = models.CharField(max_length=255)
235 nom_long = models.CharField(max_length=255, blank=True)
236 nom_court = models.CharField(max_length=255, blank=True)
b98fea67
EMS
237
238 class Meta:
e488f68e
EMS
239 db_table = u'ref_discipline'
240 ordering = ['nom']
241 managed = MANAGED
b98fea67 242
e488f68e 243 def __unicode__(self):
31f61f7a 244 return self.nom
a10aee41 245
b98fea67 246
e488f68e 247class Programme(ActifsModel):
4ea539be
EMS
248 """
249 ATTENTION: DÉSUET
e488f68e
EMS
250 Programme (donnée de référence, source: SQI).
251 Structure interne par laquelle l'AUF exécute ses projets et activités,
252 dispense ses produits et ses services.
253 """
e488f68e
EMS
254 code = models.CharField(max_length=255, unique=True)
255 nom = models.CharField(max_length=255)
256 nom_long = models.CharField(max_length=255, blank=True)
257 nom_court = models.CharField(max_length=255, blank=True)
b98fea67 258
e488f68e
EMS
259 class Meta:
260 db_table = u'ref_programme'
261 managed = MANAGED
262
263 def __unicode__(self):
31f61f7a 264 return self.nom
e488f68e
EMS
265
266
267#PROGRAMMATION QUADRIENNALLE
268
269class Projet(ActifsModel):
4ea539be
EMS
270 """
271 Projet (donnée de référence, source: programmation-quadriennalle).
e488f68e
EMS
272 """
273 SERVICE_CHOICES = (
4ea539be
EMS
274 (u'1',
275 u"Direction de la langue et de la communication scientifique "
276 u"en français"),
277 (u'2', u"Direction du développement et de la valorisation"),
278 (u'3',
279 u"Direction de l'innovation pédagogique et de l'économie "
280 u"de la connaissance"),
281 (u'4', u"Direction du renforcement des capacités scientifiques"),
e488f68e 282 )
4ea539be 283
e488f68e
EMS
284 code = models.CharField(max_length=255, unique=True)
285 nom = models.CharField(max_length=255)
286 presentation = models.TextField(null=True, blank=True)
287 partenaires = models.TextField(null=True, blank=True)
288 service = models.CharField(
289 max_length=255, choices=SERVICE_CHOICES, blank=True, null=True
290 )
291 objectif_specifique = models.ForeignKey(
292 'references.ObjectifSpecifique',
293 blank=True, null=True,
294 db_column='objectif_specifique'
295 )
296 implantation = models.ForeignKey('references.Implantation', null=True,
297 blank=True, db_column='implantation')
298 etablissement = models.ForeignKey('references.Etablissement', null=True,
299 blank=True, db_column='etablissement')
300 date_debut = models.DateField(null=True, blank=True)
301 date_fin = models.DateField(null=True, blank=True)
b98fea67
EMS
302
303 class Meta:
e488f68e
EMS
304 db_table = u'ref_projet'
305 ordering = ['nom']
306 managed = MANAGED
307
308 def __unicode__(self):
309 return "%s - %s" % (self.code, self.nom)
b98fea67 310
b98fea67 311
e488f68e 312class ProjetComposante(ActifsModel):
4ea539be
EMS
313 """
314 Composantes des projets (source: programmation-quadriennalle)
e488f68e 315 """
e488f68e
EMS
316 code = models.CharField(max_length=10)
317 nom = models.CharField(max_length=255)
318 nom_court = models.CharField(max_length=255, null=True, blank=True)
319 description = models.TextField(null=True, blank=True)
320 projet = models.ForeignKey('references.Projet', db_column='projet')
b98fea67
EMS
321
322 class Meta:
e488f68e
EMS
323 db_table = u'ref_projet_composante'
324 ordering = ['nom']
325 managed = MANAGED
326
327 def __unicode__(self):
328 return "%s - %s" % (self.code, self.nom)
b98fea67 329
b98fea67 330
e488f68e 331class UniteProjet(ActifsModel):
4ea539be
EMS
332 """
333 Unités de projet (source: programmation-quadriennalle)
e488f68e 334 """
e488f68e
EMS
335 code = models.CharField(max_length=10, unique=True)
336 nom = models.CharField(max_length=255)
b98fea67
EMS
337
338 class Meta:
e488f68e
EMS
339 db_table = u'ref_unite_projet'
340 ordering = ['nom']
341 managed = MANAGED
b98fea67 342
e488f68e
EMS
343 def __unicode__(self):
344 return "%s - %s" % (self.code, self.nom)
b98fea67 345
e488f68e
EMS
346
347class ObjectifSpecifique(ActifsModel):
e488f68e 348 nom = models.CharField(max_length=255)
4ea539be
EMS
349 objectif_strategique = models.ForeignKey(
350 'references.ObjectifStrategique', db_column='objectif_strategique'
351 )
b98fea67
EMS
352
353 class Meta:
e488f68e
EMS
354 db_table = u'ref_objectif_specifique'
355 ordering = ['nom']
356 managed = MANAGED
357
358 def __unicode__(self):
359 return "%s - %s" % (self.id, self.nom)
b98fea67 360
b98fea67 361
e488f68e 362class ObjectifStrategique(ActifsModel):
e488f68e
EMS
363 nom = models.CharField(max_length=255)
364 description = models.TextField(null=True, blank=True)
b98fea67 365
52169434 366 class Meta:
e488f68e
EMS
367 db_table = u'ref_objectif_strategique'
368 ordering = ['nom']
369 managed = MANAGED
370
371 def __unicode__(self):
372 return "%s - %s" % (self.id, self.nom)
52169434 373
b98fea67 374
e488f68e 375class Thematique(ActifsModel):
e488f68e 376 nom = models.CharField(max_length=255)
b98fea67
EMS
377
378 class Meta:
e488f68e
EMS
379 db_table = u'ref_thematique'
380 ordering = ['nom']
381 managed = MANAGED
b98fea67 382
e488f68e
EMS
383 def __unicode__(self):
384 return "%s - %s" % (self.id, self.nom)
a10aee41 385
e488f68e
EMS
386
387class ProjetUp(ActifsModel):
4ea539be
EMS
388 """
389 Projet-unité de projet (source: coda)
390 => codes budgétaires
e488f68e 391 """
e488f68e
EMS
392 code = models.CharField(max_length=255, unique=True)
393 nom = models.CharField(max_length=255)
394 nom_court = models.CharField(max_length=255, blank=True)
b98fea67
EMS
395
396 class Meta:
e488f68e
EMS
397 managed = MANAGED
398
b98fea67 399
e488f68e 400class Poste(ActifsModel):
4ea539be
EMS
401 """
402 ATTENTION: DÉSUET
e488f68e
EMS
403 Poste (donnée de référence, source: CODA).
404 Un poste est une catégorie destinée à venir raffiner un projet.
405 """
e488f68e
EMS
406 code = models.CharField(max_length=255, unique=True)
407 nom = models.CharField(max_length=255)
408 type = models.CharField(max_length=255, blank=True)
652c5d02
EMS
409
410 class Meta:
e488f68e
EMS
411 db_table = u'ref_poste'
412 managed = MANAGED
413
414 def __unicode__(self):
415 return "%s - %s (%s)" % (self.code, self.nom, self.type)
416
417
418class ProjetPoste(ActifsModel):
419 """
420 ATTENTION: DÉSUET
421 Projet-poste (donnée de référence, source: CODA).
422 Un projet-poste consiste en une raffinement d'un projet par un poste
423 (budgétaire). Subdivision utile pour le suivi budgétaire et comptable.
424 """
e488f68e
EMS
425 code = models.CharField(max_length=255, unique=True)
426 code_projet = models.ForeignKey(
427 'references.Projet', to_field='code', db_column='code_projet'
428 )
429 code_poste = models.ForeignKey(
430 'references.Poste', to_field='code', db_column='code_poste'
431 )
432 code_bureau = models.ForeignKey(
433 'references.Bureau', to_field='code', db_column='code_bureau'
434 )
435 code_programme = models.ForeignKey(
436 'references.Programme', to_field='code', db_column='code_programme'
437 )
652c5d02 438
e488f68e
EMS
439 class Meta:
440 db_table = u'ref_projet_poste'
441 managed = MANAGED
652c5d02 442
e488f68e 443 def __unicode__(self):
31f61f7a 444 return self.code
652c5d02 445
652c5d02 446
e488f68e 447class Region(ActifsModel):
4ea539be
EMS
448 """
449 Région (donnée de référence, source: referentiels_spip).
e488f68e
EMS
450 Une région est une subdivision géographique du monde pour la gestion de
451 l'AUF.
452 """
453 code = models.CharField(max_length=255, unique=True)
454 nom = models.CharField(max_length=255, db_index=True)
455 implantation_bureau = models.ForeignKey(
456 'references.Implantation', db_column='implantation_bureau',
457 related_name='gere_region', null=True, blank=True
458 )
652c5d02 459
e488f68e
EMS
460 class Meta:
461 db_table = u'ref_region'
462 ordering = ['nom']
463 verbose_name = u"région"
464 verbose_name_plural = u"régions"
465 managed = MANAGED
466
467 def __unicode__(self):
31f61f7a 468 return self.nom
e488f68e
EMS
469
470
471class Bureau(ActifsModel):
472 """
473 Bureau (donnée de référence, source: SQI).
474
475 Référence legacy entre la notion de région et celle d'implantation
476 responsable des régions et du central.
477
478 Un bureau est :
479 - soit le bureau régional d'une région (implantations de type 'Bureau')
480 - soit la notion unique de Service central pour les 2 implantations
481 centrales (implantations de type 'Service central' et 'Siege').
482
483 Ne pas confondre avec les seuls 'bureaux régionaux'.
484 """
485 code = models.CharField(max_length=255, unique=True)
486 nom = models.CharField(max_length=255)
487 nom_court = models.CharField(max_length=255, blank=True)
488 nom_long = models.CharField(max_length=255, blank=True)
489 implantation = models.ForeignKey(
490 'references.Implantation', db_column='implantation'
491 )
492 region = models.ForeignKey('references.Region', db_column='region')
652c5d02
EMS
493
494 class Meta:
e488f68e
EMS
495 db_table = u'ref_bureau'
496 ordering = ['nom']
497 verbose_name = u"bureau"
498 verbose_name_plural = u"bureaux"
499 managed = MANAGED
500
501 def __unicode__(self):
31f61f7a 502 return self.nom
e488f68e
EMS
503
504
505class Implantation(ActifsModel):
506 """
507 Implantation (donnée de référence, source: Implantus)
508
509 Une implantation est un endroit où l'AUF est présente et offre des
510 services spécifiques. Deux implantations peuvent être au même endroit
511 physique.
512 """
513 STATUT_CHOICES = (
514 (0, u'Fermée ou jamais ouverte'),
515 (1, u'Ouverte'),
516 (2, u'Ouverture imminente'),
517 (3, u'En projet')
518 )
519
520 nom = models.CharField(max_length=255)
521 nom_court = models.CharField(max_length=255, blank=True)
522 nom_long = models.CharField(max_length=255, blank=True)
523 type = models.CharField(max_length=255)
524 bureau_rattachement = models.ForeignKey(
525 'references.Implantation', db_column='bureau_rattachement'
526 )
527 region = models.ForeignKey('references.Region', db_column='region')
528 fuseau_horaire = models.CharField(max_length=255, blank=True)
529 code_meteo = models.CharField(max_length=255, blank=True)
530 # responsable
531 responsable_implantation = models.IntegerField(null=True, blank=True)
532 # adresse postale
533 adresse_postale_precision_avant = models.CharField(
534 max_length=255, blank=True, null=True
535 )
536 adresse_postale_no = models.CharField(max_length=30, blank=True, null=True)
537 adresse_postale_rue = models.CharField(
538 max_length=255, blank=True, null=True
539 )
540 adresse_postale_bureau = models.CharField(
541 max_length=255, blank=True, null=True
542 )
543 adresse_postale_precision = models.CharField(
544 max_length=255, blank=True, null=True
545 )
546 adresse_postale_boite_postale = models.CharField(
547 max_length=255, blank=True, null=True
548 )
549 adresse_postale_ville = models.CharField(max_length=255)
550 adresse_postale_code_postal = models.CharField(
551 max_length=20, blank=True, null=True
552 )
553 adresse_postale_code_postal_avant_ville = models.NullBooleanField()
554 adresse_postale_region = models.CharField(
555 max_length=255, blank=True, null=True
556 )
557 adresse_postale_pays = models.ForeignKey(
558 'references.Pays', to_field='code',
559 db_column='adresse_postale_pays',
560 related_name='impl_adresse_postale'
561 )
562 # adresse physique
563 adresse_physique_precision_avant = models.CharField(
564 max_length=255, blank=True
565 )
566 adresse_physique_no = models.CharField(max_length=30, blank=True)
567 adresse_physique_rue = models.CharField(max_length=255, blank=True)
568 adresse_physique_bureau = models.CharField(max_length=255, blank=True)
569 adresse_physique_precision = models.CharField(max_length=255, blank=True)
570 adresse_physique_ville = models.CharField(max_length=255)
571 adresse_physique_code_postal = models.CharField(max_length=30, blank=True)
572 adresse_physique_code_postal_avant_ville = models.NullBooleanField()
573 adresse_physique_region = models.CharField(max_length=255, blank=True)
574 adresse_physique_pays = models.ForeignKey(
575 'references.Pays', to_field='code',
576 db_column='adresse_physique_pays',
577 related_name='impl_adresse_physique'
578 )
579 # autres coordonnées
580 telephone = models.CharField(max_length=255, blank=True)
581 telephone_interne = models.CharField(max_length=255, blank=True)
582 fax = models.CharField(max_length=255, blank=True)
583 fax_interne = models.CharField(max_length=255, blank=True)
584 courriel = models.EmailField(blank=True)
585 courriel_interne = models.EmailField(blank=True)
586 url = models.URLField(verify_exists=False, max_length=255, blank=True)
587 # traitement
588 statut = models.IntegerField(choices=STATUT_CHOICES)
589 date_ouverture = models.DateField(null=True, blank=True)
590 date_inauguration = models.DateField(null=True, blank=True)
591 date_extension = models.DateField(null=True, blank=True)
592 date_fermeture = models.DateField(null=True, blank=True)
593 hebergement_etablissement = models.CharField(max_length=255, blank=True)
594 hebergement_convention = models.NullBooleanField()
595 hebergement_convention_date = models.DateField(null=True, blank=True)
596 remarque = models.TextField()
597 commentaire = models.CharField(max_length=255, blank=True)
598 # meta
599 modif_date = models.DateField()
600
601 class Managers:
602
603 class Ouvertes(ActifsManager):
604
605 def get_query_set(self):
606 return super(Implantation.Managers.Ouvertes, self) \
607 .get_query_set() \
608 .filter(statut=1)
609
610 objects = ActifsManager()
611 ouvertes = Managers.Ouvertes()
652c5d02 612
e488f68e
EMS
613 class Meta:
614 db_table = u'ref_implantation'
615 ordering = ['nom']
616 managed = MANAGED
617
618 def __unicode__(self):
31f61f7a 619 return self.nom
e488f68e
EMS
620
621
622class Pays(ActifsModel):
623 """
624 Pays (donnée de référence, source: SQI).
625
626 Liste AUF basée sur la liste ISO-3166-1.
627 """
4ea539be
EMS
628 NORD_SUD_CHOICES = (
629 (u'Nord', u'Nord'),
630 (u'Sud', u'Sud'),
631 )
632 DEVELOPPEMENT_CHOICES = (
633 (u'Elevé', u'Elevé'),
634 (u'Faible', u'Faible'),
635 (u'Intermédiaire', u'Intermédiaire'),
636 (u'inconnu', u'Inconnu'),
637 )
638
e488f68e
EMS
639 code = models.CharField(max_length=2, unique=True)
640 code_iso3 = models.CharField(max_length=3, unique=True)
641 nom = models.CharField(max_length=255)
642 region = models.ForeignKey('references.Region', db_column='region')
643 code_bureau = models.ForeignKey('references.Bureau', to_field='code',
644 db_column='code_bureau', blank=True,
645 null=True)
4ea539be
EMS
646 nord_sud = models.CharField(
647 max_length=255, blank=True, null=True,
648 )
e488f68e
EMS
649 developpement = models.CharField(max_length=255, blank=True, null=True)
650 monnaie = models.CharField(max_length=255, blank=True, null=True)
652c5d02 651
e488f68e
EMS
652 class Meta:
653 db_table = u'ref_pays'
654 ordering = ['nom']
655 verbose_name = u"pays"
656 verbose_name_plural = u"pays"
657 managed = MANAGED
658
659 def __unicode__(self):
31f61f7a 660 return self.nom
e488f68e
EMS
661
662
663class _Etablissement(ActifsModel):
664 """
665 Superclasse pour les modèles ``Etablissement`` et ``EtablissementBase``
666 """
4ea539be 667 STATUT_CHOICES = (
e488f68e
EMS
668 ('T', 'Titulaire'),
669 ('A', 'Associé'),
670 ('C', 'Candidat'),
671 )
672 QUALITE_CHOICES = (
673 ('ESR', "Établissement d'enseignement supérieur et de recherche"),
674 ('CIR', "Centre ou institution de recherche"),
675 ('RES', "Réseau"),
676 )
677
678 # Infos de base
679 nom = models.CharField(max_length=255)
d6fb2d75 680 sigle = models.CharField(max_length=16, blank=True)
e488f68e
EMS
681 pays = models.ForeignKey(
682 'references.Pays', to_field='code', db_column='pays',
683 related_name='+'
684 )
685 region = models.ForeignKey(
686 'references.Region', db_column='region', blank=True, null=True,
687 related_name='+', verbose_name='région'
688 )
689 implantation = models.ForeignKey(
690 'references.Implantation', db_column='implantation',
691 related_name='+', blank=True, null=True
692 )
693 description = models.TextField(blank=True)
694 historique = models.TextField(blank=True)
695
696 # Membership
697 membre = models.BooleanField()
4ea539be 698 membre_adhesion_date = models.DateField(
5d0f5ab0 699 u"date d'adhésion", null=True, blank=True
4ea539be
EMS
700 )
701 statut = models.CharField(
702 max_length=1, choices=STATUT_CHOICES, blank=True, null=True
703 )
704 qualite = models.CharField(
5d0f5ab0
EMS
705 u'qualité', max_length=3, choices=QUALITE_CHOICES, blank=True,
706 null=True
4ea539be 707 )
e488f68e
EMS
708
709 # Responsable
5d0f5ab0
EMS
710 responsable_genre = models.CharField(u'genre', max_length=1, blank=True)
711 responsable_nom = models.CharField(u'nom', max_length=255, blank=True)
e488f68e 712 responsable_prenom = models.CharField(
5d0f5ab0 713 u'prénom', max_length=255, blank=True
e488f68e
EMS
714 )
715 responsable_fonction = models.CharField(
5d0f5ab0 716 u'fonction', max_length=255, blank=True
e488f68e 717 )
9e3d8970 718 responsable_courriel = models.EmailField(u'courriel', blank=True)
e488f68e
EMS
719
720 # Adresse
721 adresse = models.CharField(max_length=255, blank=True)
5d0f5ab0
EMS
722 code_postal = models.CharField(u'code postal', max_length=20, blank=True)
723 cedex = models.CharField(u'CEDEX', max_length=20, blank=True)
e488f68e
EMS
724 ville = models.CharField(max_length=255, blank=True)
725 province = models.CharField(max_length=255, blank=True)
5d0f5ab0 726 telephone = models.CharField(u'téléphone', max_length=255, blank=True)
e488f68e 727 fax = models.CharField(max_length=255, blank=True)
5d0f5ab0
EMS
728 url = models.URLField(
729 u'URL', verify_exists=False, max_length=255, blank=True
730 )
e488f68e
EMS
731
732 # Meta-données
5d0f5ab0
EMS
733 date_modification = models.DateField(
734 u'date de modification', blank=True, null=True
735 )
e488f68e 736 commentaire = models.TextField(blank=True)
652c5d02
EMS
737
738 class Meta:
e488f68e
EMS
739 abstract = True
740 ordering = ['pays__nom', 'nom']
741 managed = MANAGED
652c5d02 742
e488f68e
EMS
743 def __unicode__(self):
744 return "%s - %s" % (self.pays.nom, self.nom)
652c5d02 745
652c5d02 746
e488f68e
EMS
747class Etablissement(_Etablissement):
748 """
749 Établissement (donnée de référence, source: GDE).
652c5d02 750
e488f68e
EMS
751 Un établissement peut être une université, un centre de recherche, un
752 réseau d'établissement... Un établissement peut être membre de l'AUF ou
753 non.
754 """
755 class Meta(_Etablissement.Meta):
756 db_table = u'ref_etablissement'
757 managed = MANAGED
652c5d02 758
652c5d02 759
e488f68e
EMS
760class EtablissementBase(_Etablissement):
761 """
762 Modèle de base pour créer des établissements locaux pouvant être
763 liés à des établissements des données de référence.
764 """
88438641
EMS
765 ref = models.OneToOneField(Etablissement, blank=True, null=True,
766 related_name='%(app_label)s_%(class)s')
652c5d02
EMS
767
768 class Meta:
769 abstract = True
770
771 def save(self, *args, **kwargs):
772 if self.ref and not self.pk:
773 # Nouvel établissement faisant référence à un établissement dans
774 # les références. On copie tous les champs.
775 for f in self.ref._meta.fields:
776 if f.attname != 'id':
777 setattr(self, f.attname, getattr(self.ref, f.attname))
778 super(EtablissementBase, self).save(*args, **kwargs)