c6c595015418a696081e9c41eda2ee1440eafeeb
[auf_django_references.git] / auf / django / references / models.py
1 # -=- encoding: utf-8 -=-
2
3 from django.conf import settings
4 from django.db import models
5
6 MANAGED = getattr(settings, 'AUF_REFERENCES_MANAGED', False)
7
8
9 ### Gestion des actifs/inactifs
10
11 class 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)
18
19
20 class ActifsModel(models.Model):
21 """
22 Modèle faisant la gestion des objets actifs/inactifs.
23
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()
32
33 class Meta:
34 abstract = True
35
36
37 ### Modèles pour les données de référence
38
39 class Employe(ActifsModel):
40 """
41 Personne en contrat d'employé (CDD ou CDI) à l'AUF
42 """
43 GENRE_CHOICES = (
44 (u'h', u'Homme'),
45 (u'f', u'Femme'),
46 )
47
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)
61 genre = models.CharField(max_length=3, choices=GENRE_CHOICES)
62 fonction = models.CharField(max_length=255, null=True, blank=True)
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)
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 )
88
89 class Meta:
90 db_table = u'ref_employe'
91 ordering = ['nom']
92 managed = MANAGED
93
94 def __unicode__(self):
95 return u"%s, %s" % (self.nom, self.prenom)
96
97
98 class Authentification(ActifsModel):
99 """
100 Authentification
101 """
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)
107
108 class Meta:
109 db_table = u'ref_authentification'
110 ordering = ['id']
111 managed = MANAGED
112
113 def __unicode__(self):
114 return self.courriel
115
116
117 class Service(ActifsModel):
118 """
119 Services (donnée de référence, source: SGRH).
120 """
121 nom = models.CharField(max_length=255)
122
123 class Meta:
124 db_table = u'ref_service'
125 ordering = ['nom']
126 managed = MANAGED
127
128 def __unicode__(self):
129 return self.nom
130
131
132 class PosteType(ActifsModel):
133 """
134 Postes types (donnée de référence, source: SGRH).
135 """
136 nom = models.CharField(max_length=255)
137
138 class Meta:
139 db_table = u'ref_poste_type'
140 managed = MANAGED
141
142 def __unicode__(self):
143 return self.nom
144
145
146 class GroupeArh(ActifsModel):
147 employe = models.ForeignKey('references.Employe', db_column='employe')
148
149 class Meta:
150 db_table = u'ref_groupe_arh'
151 managed = MANAGED
152
153
154 class GroupeDirRegion(ActifsModel):
155 employe = models.ForeignKey('references.Employe', db_column='employe')
156 region = models.ForeignKey('references.Region', db_column='region')
157
158 class Meta:
159 db_table = u'ref_groupe_dir_region'
160 managed = MANAGED
161
162
163 class GroupeAdmRegion(ActifsModel):
164 employe = models.ForeignKey('references.Employe', db_column='employe')
165 region = models.ForeignKey('references.Region', db_column='region')
166
167 class Meta:
168 db_table = u'ref_groupe_adm_region'
169 managed = MANAGED
170
171
172 class GroupeRespImplantation(ActifsModel):
173 employe = models.ForeignKey('references.Employe', db_column='employe')
174 implantation = models.ForeignKey(
175 'references.Implantation', db_column='implantation'
176 )
177
178 class Meta:
179 db_table = u'ref_groupe_resp_implantation'
180 managed = MANAGED
181
182
183 class GroupeDirProgramme(ActifsModel):
184 employe = models.ForeignKey('references.Employe', db_column='employe')
185 service = models.ForeignKey('references.Service', db_column='service')
186
187 class Meta:
188 db_table = u'ref_groupe_dir_programme'
189 managed = MANAGED
190
191
192 class GroupeDirDelegProgrammeReg(ActifsModel):
193 employe = models.ForeignKey('references.Employe', db_column='employe')
194 region = models.ForeignKey('references.Region', db_column='region')
195
196 class Meta:
197 db_table = u'ref_groupe_dir_deleg_programme_reg'
198 managed = MANAGED
199
200
201 class GroupeComptable(ActifsModel):
202 employe = models.ForeignKey('references.Employe', db_column='employe')
203
204 class Meta:
205 db_table = u'ref_groupe_comptable'
206 managed = MANAGED
207
208
209 class GroupeComptableRegional(ActifsModel):
210 employe = models.ForeignKey('references.Employe', db_column='employe')
211
212 class Meta:
213 db_table = u'ref_groupe_comptable_regional'
214 managed = MANAGED
215
216
217 class GroupeComptableLocal(ActifsModel):
218 employe = models.ForeignKey('references.Employe', db_column='employe')
219
220 class Meta:
221 db_table = u'ref_groupe_comptable_local'
222 managed = MANAGED
223
224
225 class Discipline(ActifsModel):
226 """
227 ATTENTION: DÉSUET
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 """
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)
236
237 class Meta:
238 db_table = u'ref_discipline'
239 ordering = ['nom']
240 managed = MANAGED
241
242 def __unicode__(self):
243 return self.nom
244
245
246 class Programme(ActifsModel):
247 """
248 ATTENTION: DÉSUET
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 """
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)
257
258 class Meta:
259 db_table = u'ref_programme'
260 managed = MANAGED
261
262 def __unicode__(self):
263 return self.nom
264
265
266 #PROGRAMMATION QUADRIENNALLE
267
268 class Projet(ActifsModel):
269 """
270 Projet (donnée de référence, source: programmation-quadriennalle).
271 """
272 SERVICE_CHOICES = (
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"),
281 )
282
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)
301
302 class Meta:
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)
309
310
311 class ProjetComposante(ActifsModel):
312 """
313 Composantes des projets (source: programmation-quadriennalle)
314 """
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')
320
321 class Meta:
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)
328
329
330 class UniteProjet(ActifsModel):
331 """
332 Unités de projet (source: programmation-quadriennalle)
333 """
334 code = models.CharField(max_length=10, unique=True)
335 nom = models.CharField(max_length=255)
336
337 class Meta:
338 db_table = u'ref_unite_projet'
339 ordering = ['nom']
340 managed = MANAGED
341
342 def __unicode__(self):
343 return "%s - %s" % (self.code, self.nom)
344
345
346 class ObjectifSpecifique(ActifsModel):
347 nom = models.CharField(max_length=255)
348 objectif_strategique = models.ForeignKey(
349 'references.ObjectifStrategique', db_column='objectif_strategique'
350 )
351
352 class Meta:
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)
359
360
361 class ObjectifStrategique(ActifsModel):
362 nom = models.CharField(max_length=255)
363 description = models.TextField(null=True, blank=True)
364
365 class Meta:
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)
372
373
374 class Thematique(ActifsModel):
375 nom = models.CharField(max_length=255)
376
377 class Meta:
378 db_table = u'ref_thematique'
379 ordering = ['nom']
380 managed = MANAGED
381
382 def __unicode__(self):
383 return "%s - %s" % (self.id, self.nom)
384
385
386 class ProjetUp(ActifsModel):
387 """
388 Projet-unité de projet (source: coda)
389 => codes budgétaires
390 """
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)
394
395 class Meta:
396 managed = MANAGED
397
398
399 class Poste(ActifsModel):
400 """
401 ATTENTION: DÉSUET
402 Poste (donnée de référence, source: CODA).
403 Un poste est une catégorie destinée à venir raffiner un projet.
404 """
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)
408
409 class Meta:
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
417 class 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 """
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 )
437
438 class Meta:
439 db_table = u'ref_projet_poste'
440 managed = MANAGED
441
442 def __unicode__(self):
443 return self.code
444
445
446 class Region(ActifsModel):
447 """
448 Région (donnée de référence, source: referentiels_spip).
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 )
458
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):
467 return self.nom
468
469
470 class 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
492 class 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')
514
515 class Meta:
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):
523 return self.nom
524
525
526 class 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')
549 zone_administrative = models.ForeignKey('references.ZoneAdministrative')
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()
634
635 class Meta:
636 db_table = u'ref_implantation'
637 ordering = ['nom']
638 managed = MANAGED
639
640 def __unicode__(self):
641 return self.nom
642
643
644 class 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 """
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
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)
668 nord_sud = models.CharField(
669 max_length=255, blank=True, null=True,
670 )
671 developpement = models.CharField(max_length=255, blank=True, null=True)
672 monnaie = models.CharField(max_length=255, blank=True, null=True)
673
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):
682 return self.nom
683
684
685 class _Etablissement(ActifsModel):
686 """
687 Superclasse pour les modèles ``Etablissement`` et ``EtablissementBase``
688 """
689 STATUT_CHOICES = (
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)
702 sigle = models.CharField(max_length=16, blank=True)
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)
717
718 # Membership
719 membre = models.BooleanField()
720 membre_adhesion_date = models.DateField(
721 u"date d'adhésion", null=True, blank=True
722 )
723 statut = models.CharField(
724 max_length=1, choices=STATUT_CHOICES, blank=True, null=True
725 )
726 qualite = models.CharField(
727 u'qualité', max_length=3, choices=QUALITE_CHOICES, blank=True,
728 null=True
729 )
730
731 # Responsable
732 responsable_genre = models.CharField(u'genre', max_length=1, blank=True)
733 responsable_nom = models.CharField(u'nom', max_length=255, blank=True)
734 responsable_prenom = models.CharField(
735 u'prénom', max_length=255, blank=True
736 )
737 responsable_fonction = models.CharField(
738 u'fonction', max_length=255, blank=True
739 )
740 responsable_courriel = models.EmailField(u'courriel', blank=True)
741
742 # Adresse
743 adresse = models.CharField(max_length=255, blank=True)
744 code_postal = models.CharField(u'code postal', max_length=20, blank=True)
745 cedex = models.CharField(u'CEDEX', max_length=20, blank=True)
746 ville = models.CharField(max_length=255, blank=True)
747 province = models.CharField(max_length=255, blank=True)
748 telephone = models.CharField(u'téléphone', max_length=255, blank=True)
749 fax = models.CharField(max_length=255, blank=True)
750 url = models.URLField(
751 u'URL', verify_exists=False, max_length=255, blank=True
752 )
753
754 # Meta-données
755 date_modification = models.DateField(
756 u'date de modification', blank=True, null=True
757 )
758 commentaire = models.TextField(blank=True)
759
760 class Meta:
761 abstract = True
762 ordering = ['pays__nom', 'nom']
763 managed = MANAGED
764
765 def __unicode__(self):
766 return "%s - %s" % (self.pays.nom, self.nom)
767
768
769 class Etablissement(_Etablissement):
770 """
771 Établissement (donnée de référence, source: GDE).
772
773 Un établissement peut être une université, un centre de recherche, un
774 réseau d'établissement... Un établissement peut être membre de l'AUF ou
775 non.
776 """
777 class Meta(_Etablissement.Meta):
778 db_table = u'ref_etablissement'
779 managed = MANAGED
780
781
782 class EtablissementBase(_Etablissement):
783 """
784 Modèle de base pour créer des établissements locaux pouvant être
785 liés à des établissements des données de référence.
786 """
787 ref = models.OneToOneField(Etablissement, blank=True, null=True,
788 related_name='%(app_label)s_%(class)s')
789
790 class Meta:
791 abstract = True
792
793 def save(self, *args, **kwargs):
794 if self.ref and not self.pk:
795 # Nouvel établissement faisant référence à un établissement dans
796 # les références. On copie tous les champs.
797 for f in self.ref._meta.fields:
798 if f.attname != 'id':
799 setattr(self, f.attname, getattr(self.ref, f.attname))
800 super(EtablissementBase, self).save(*args, **kwargs)