[#3252] Ajout d'une colonne Employe.telephone_ip_nomade
[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 type = models.CharField(max_length=255, blank=True, null=True)
178
179 class Meta:
180 db_table = u'ref_groupe_resp_implantation'
181 managed = MANAGED
182
183
184 class GroupeDirProgramme(ActifsModel):
185 employe = models.ForeignKey('references.Employe', db_column='employe')
186 service = models.ForeignKey('references.Service', db_column='service')
187
188 class Meta:
189 db_table = u'ref_groupe_dir_programme'
190 managed = MANAGED
191
192
193 class GroupeDirDelegProgrammeReg(ActifsModel):
194 employe = models.ForeignKey('references.Employe', db_column='employe')
195 region = models.ForeignKey('references.Region', db_column='region')
196
197 class Meta:
198 db_table = u'ref_groupe_dir_deleg_programme_reg'
199 managed = MANAGED
200
201
202 class GroupeComptable(ActifsModel):
203 employe = models.ForeignKey('references.Employe', db_column='employe')
204
205 class Meta:
206 db_table = u'ref_groupe_comptable'
207 managed = MANAGED
208
209
210 class GroupeComptableRegional(ActifsModel):
211 employe = models.ForeignKey('references.Employe', db_column='employe')
212
213 class Meta:
214 db_table = u'ref_groupe_comptable_regional'
215 managed = MANAGED
216
217
218 class GroupeComptableLocal(ActifsModel):
219 employe = models.ForeignKey('references.Employe', db_column='employe')
220
221 class Meta:
222 db_table = u'ref_groupe_comptable_local'
223 managed = MANAGED
224
225
226 class Discipline(ActifsModel):
227 """
228 ATTENTION: DÉSUET
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 """
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)
237
238 class Meta:
239 db_table = u'ref_discipline'
240 ordering = ['nom']
241 managed = MANAGED
242
243 def __unicode__(self):
244 return self.nom
245
246
247 class Programme(ActifsModel):
248 """
249 ATTENTION: DÉSUET
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 """
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)
258
259 class Meta:
260 db_table = u'ref_programme'
261 managed = MANAGED
262
263 def __unicode__(self):
264 return self.nom
265
266
267 #PROGRAMMATION QUADRIENNALLE
268
269 class Projet(ActifsModel):
270 """
271 Projet (donnée de référence, source: programmation-quadriennalle).
272 """
273 SERVICE_CHOICES = (
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"),
282 )
283
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)
302
303 class Meta:
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)
310
311
312 class ProjetComposante(ActifsModel):
313 """
314 Composantes des projets (source: programmation-quadriennalle)
315 """
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')
321
322 class Meta:
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)
329
330
331 class UniteProjet(ActifsModel):
332 """
333 Unités de projet (source: programmation-quadriennalle)
334 """
335 code = models.CharField(max_length=10, unique=True)
336 nom = models.CharField(max_length=255)
337
338 class Meta:
339 db_table = u'ref_unite_projet'
340 ordering = ['nom']
341 managed = MANAGED
342
343 def __unicode__(self):
344 return "%s - %s" % (self.code, self.nom)
345
346
347 class ObjectifSpecifique(ActifsModel):
348 nom = models.CharField(max_length=255)
349 objectif_strategique = models.ForeignKey(
350 'references.ObjectifStrategique', db_column='objectif_strategique'
351 )
352
353 class Meta:
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)
360
361
362 class ObjectifStrategique(ActifsModel):
363 nom = models.CharField(max_length=255)
364 description = models.TextField(null=True, blank=True)
365
366 class Meta:
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)
373
374
375 class Thematique(ActifsModel):
376 nom = models.CharField(max_length=255)
377
378 class Meta:
379 db_table = u'ref_thematique'
380 ordering = ['nom']
381 managed = MANAGED
382
383 def __unicode__(self):
384 return "%s - %s" % (self.id, self.nom)
385
386
387 class ProjetUp(ActifsModel):
388 """
389 Projet-unité de projet (source: coda)
390 => codes budgétaires
391 """
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)
395
396 class Meta:
397 managed = MANAGED
398
399
400 class Poste(ActifsModel):
401 """
402 ATTENTION: DÉSUET
403 Poste (donnée de référence, source: CODA).
404 Un poste est une catégorie destinée à venir raffiner un projet.
405 """
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)
409
410 class Meta:
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
418 class 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 """
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 )
438
439 class Meta:
440 db_table = u'ref_projet_poste'
441 managed = MANAGED
442
443 def __unicode__(self):
444 return self.code
445
446
447 class Region(ActifsModel):
448 """
449 Région (donnée de référence, source: referentiels_spip).
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 )
459
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):
468 return self.nom
469
470
471 class 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')
493
494 class Meta:
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):
502 return self.nom
503
504
505 class 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()
612
613 class Meta:
614 db_table = u'ref_implantation'
615 ordering = ['nom']
616 managed = MANAGED
617
618 def __unicode__(self):
619 return self.nom
620
621
622 class 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 """
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
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)
646 nord_sud = models.CharField(
647 max_length=255, blank=True, null=True,
648 )
649 developpement = models.CharField(max_length=255, blank=True, null=True)
650 monnaie = models.CharField(max_length=255, blank=True, null=True)
651
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):
660 return self.nom
661
662
663 class _Etablissement(ActifsModel):
664 """
665 Superclasse pour les modèles ``Etablissement`` et ``EtablissementBase``
666 """
667 STATUT_CHOICES = (
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)
680 sigle = models.CharField(max_length=16, blank=True)
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()
698 membre_adhesion_date = models.DateField(
699 u"date d'adhésion", null=True, blank=True
700 )
701 statut = models.CharField(
702 max_length=1, choices=STATUT_CHOICES, blank=True, null=True
703 )
704 qualite = models.CharField(
705 u'qualité', max_length=3, choices=QUALITE_CHOICES, blank=True,
706 null=True
707 )
708
709 # Responsable
710 responsable_genre = models.CharField(u'genre', max_length=1, blank=True)
711 responsable_nom = models.CharField(u'nom', max_length=255, blank=True)
712 responsable_prenom = models.CharField(
713 u'prénom', max_length=255, blank=True
714 )
715 responsable_fonction = models.CharField(
716 u'fonction', max_length=255, blank=True
717 )
718 responsable_courriel = models.EmailField(u'courriel', blank=True)
719
720 # Adresse
721 adresse = models.CharField(max_length=255, blank=True)
722 code_postal = models.CharField(u'code postal', max_length=20, blank=True)
723 cedex = models.CharField(u'CEDEX', max_length=20, blank=True)
724 ville = models.CharField(max_length=255, blank=True)
725 province = models.CharField(max_length=255, blank=True)
726 telephone = models.CharField(u'téléphone', max_length=255, blank=True)
727 fax = models.CharField(max_length=255, blank=True)
728 url = models.URLField(
729 u'URL', verify_exists=False, max_length=255, blank=True
730 )
731
732 # Meta-données
733 date_modification = models.DateField(
734 u'date de modification', blank=True, null=True
735 )
736 commentaire = models.TextField(blank=True)
737
738 class Meta:
739 abstract = True
740 ordering = ['pays__nom', 'nom']
741 managed = MANAGED
742
743 def __unicode__(self):
744 return "%s - %s" % (self.pays.nom, self.nom)
745
746
747 class Etablissement(_Etablissement):
748 """
749 Établissement (donnée de référence, source: GDE).
750
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
758
759
760 class 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 """
765 ref = models.OneToOneField(Etablissement, blank=True, null=True,
766 related_name='%(app_label)s_%(class)s')
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)