1 # -=- encoding: utf-8 -=-
3 from django
.conf
import settings
4 from django
.db
import models
6 MANAGED
= getattr(settings
, 'AUF_REFERENCES_MANAGED', False)
9 ### Gestion des actifs/inactifs
11 class ActifsManager(models
.Manager
):
13 Manager pour ``ActifsModel``.
16 def get_query_set(self
):
17 return super(ActifsManager
, self
).get_query_set().filter(actif
=True)
20 class ActifsModel(models
.Model
):
22 Modèle faisant la gestion des objets actifs/inactifs.
24 Le manager par défaut ne liste que les objets actifs. Pour avoir tous
25 les objets, utiliser le manager ``avec_inactifs``.
27 actif
= models
.BooleanField(default
=True, editable
=False)
30 objects
= ActifsManager()
31 avec_inactifs
= models
.Manager()
37 ### Modèles pour les données de référence
39 class Employe(ActifsModel
):
41 Personne en contrat d'employé (CDD ou CDI) à l'AUF
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'
55 implantation_physique
= models
.ForeignKey(
56 'references.Implantation',
57 db_column
='implantation_physique',
58 related_name
='lieu_travail_reel_de'
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(
68 db_column
='responsable',
69 related_name
='responsable_de',
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'
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'
90 db_table
= u
'ref_employe'
94 def __unicode__(self
):
95 return u
"%s, %s" % (self
.nom
, self
.prenom
)
98 class Authentification(ActifsModel
):
102 id = models
.ForeignKey(
103 'references.Employe', primary_key
=True, db_column
='id'
105 courriel
= models
.CharField(max_length
=255, unique
=True)
106 motdepasse
= models
.CharField(max_length
=255)
109 db_table
= u
'ref_authentification'
113 def __unicode__(self
):
117 class Service(ActifsModel
):
119 Services (donnée de référence, source: SGRH).
121 nom
= models
.CharField(max_length
=255)
124 db_table
= u
'ref_service'
128 def __unicode__(self
):
132 class PosteType(ActifsModel
):
134 Postes types (donnée de référence, source: SGRH).
136 nom
= models
.CharField(max_length
=255)
139 db_table
= u
'ref_poste_type'
142 def __unicode__(self
):
146 class GroupeArh(ActifsModel
):
147 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
150 db_table
= u
'ref_groupe_arh'
154 class GroupeDirRegion(ActifsModel
):
155 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
156 region
= models
.ForeignKey('references.Region', db_column
='region')
159 db_table
= u
'ref_groupe_dir_region'
163 class GroupeAdmRegion(ActifsModel
):
164 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
165 region
= models
.ForeignKey('references.Region', db_column
='region')
168 db_table
= u
'ref_groupe_adm_region'
172 class GroupeRespImplantation(ActifsModel
):
173 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
174 implantation
= models
.ForeignKey(
175 'references.Implantation', db_column
='implantation'
179 db_table
= u
'ref_groupe_resp_implantation'
183 class GroupeDirProgramme(ActifsModel
):
184 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
185 service
= models
.ForeignKey('references.Service', db_column
='service')
188 db_table
= u
'ref_groupe_dir_programme'
192 class GroupeDirDelegProgrammeReg(ActifsModel
):
193 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
194 region
= models
.ForeignKey('references.Region', db_column
='region')
197 db_table
= u
'ref_groupe_dir_deleg_programme_reg'
201 class GroupeComptable(ActifsModel
):
202 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
205 db_table
= u
'ref_groupe_comptable'
209 class GroupeComptableRegional(ActifsModel
):
210 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
213 db_table
= u
'ref_groupe_comptable_regional'
217 class GroupeComptableLocal(ActifsModel
):
218 employe
= models
.ForeignKey('references.Employe', db_column
='employe')
221 db_table
= u
'ref_groupe_comptable_local'
225 class Discipline(ActifsModel
):
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.
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)
238 db_table
= u
'ref_discipline'
242 def __unicode__(self
):
246 class Programme(ActifsModel
):
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.
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)
259 db_table
= u
'ref_programme'
262 def __unicode__(self
):
266 #PROGRAMMATION QUADRIENNALLE
268 class Projet(ActifsModel
):
270 Projet (donnée de référence, source: programmation-quadriennalle).
274 u
"Direction de la langue et de la communication scientifique "
276 (u
'2', u
"Direction du développement et de la valorisation"),
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"),
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
290 objectif_specifique
= models
.ForeignKey(
291 'references.ObjectifSpecifique',
292 blank
=True, null
=True,
293 db_column
='objectif_specifique'
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)
303 db_table
= u
'ref_projet'
307 def __unicode__(self
):
308 return "%s - %s" % (self
.code
, self
.nom
)
311 class ProjetComposante(ActifsModel
):
313 Composantes des projets (source: programmation-quadriennalle)
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')
322 db_table
= u
'ref_projet_composante'
326 def __unicode__(self
):
327 return "%s - %s" % (self
.code
, self
.nom
)
330 class UniteProjet(ActifsModel
):
332 Unités de projet (source: programmation-quadriennalle)
334 code
= models
.CharField(max_length
=10, unique
=True)
335 nom
= models
.CharField(max_length
=255)
338 db_table
= u
'ref_unite_projet'
342 def __unicode__(self
):
343 return "%s - %s" % (self
.code
, self
.nom
)
346 class ObjectifSpecifique(ActifsModel
):
347 nom
= models
.CharField(max_length
=255)
348 objectif_strategique
= models
.ForeignKey(
349 'references.ObjectifStrategique', db_column
='objectif_strategique'
353 db_table
= u
'ref_objectif_specifique'
357 def __unicode__(self
):
358 return "%s - %s" % (self
.id, self
.nom
)
361 class ObjectifStrategique(ActifsModel
):
362 nom
= models
.CharField(max_length
=255)
363 description
= models
.TextField(null
=True, blank
=True)
366 db_table
= u
'ref_objectif_strategique'
370 def __unicode__(self
):
371 return "%s - %s" % (self
.id, self
.nom
)
374 class Thematique(ActifsModel
):
375 nom
= models
.CharField(max_length
=255)
378 db_table
= u
'ref_thematique'
382 def __unicode__(self
):
383 return "%s - %s" % (self
.id, self
.nom
)
386 class ProjetUp(ActifsModel
):
388 Projet-unité de projet (source: coda)
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)
399 class Poste(ActifsModel
):
402 Poste (donnée de référence, source: CODA).
403 Un poste est une catégorie destinée à venir raffiner un projet.
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)
410 db_table
= u
'ref_poste'
413 def __unicode__(self
):
414 return "%s - %s (%s)" % (self
.code
, self
.nom
, self
.type)
417 class ProjetPoste(ActifsModel
):
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.
424 code
= models
.CharField(max_length
=255, unique
=True)
425 code_projet
= models
.ForeignKey(
426 'references.Projet', to_field
='code', db_column
='code_projet'
428 code_poste
= models
.ForeignKey(
429 'references.Poste', to_field
='code', db_column
='code_poste'
431 code_bureau
= models
.ForeignKey(
432 'references.Bureau', to_field
='code', db_column
='code_bureau'
434 code_programme
= models
.ForeignKey(
435 'references.Programme', to_field
='code', db_column
='code_programme'
439 db_table
= u
'ref_projet_poste'
442 def __unicode__(self
):
446 class Region(ActifsModel
):
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
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
460 db_table
= u
'ref_region'
462 verbose_name
= u
"région"
463 verbose_name_plural
= u
"régions"
466 def __unicode__(self
):
470 class ZoneAdministrative(ActifsModel
):
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".
478 code
= models
.CharField(max_length
=4, primary_key
=True)
479 nom
= models
.CharField(max_length
=100)
482 db_table
= 'ref_zoneadministrative'
484 verbose_name
= u
'zone administrative'
485 verbose_name_plural
= u
'zones administratives'
488 def __unicode__(self
):
492 class Bureau(ActifsModel
):
494 Bureau (donnée de référence, source: SQI).
496 Référence legacy entre la notion de région et celle d'implantation
497 responsable des régions et du central.
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').
504 Ne pas confondre avec les seuls 'bureaux régionaux'.
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'
513 region
= models
.ForeignKey('references.Region', db_column
='region')
516 db_table
= u
'ref_bureau'
518 verbose_name
= u
"bureau"
519 verbose_name_plural
= u
"bureaux"
522 def __unicode__(self
):
526 class Implantation(ActifsModel
):
528 Implantation (donnée de référence, source: Implantus)
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
535 (0, u
'Fermée ou jamais ouverte'),
537 (2, u
'Ouverture imminente'),
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'
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)
553 responsable_implantation
= models
.IntegerField(null
=True, blank
=True)
555 adresse_postale_precision_avant
= models
.CharField(
556 max_length
=255, blank
=True, null
=True
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
562 adresse_postale_bureau
= models
.CharField(
563 max_length
=255, blank
=True, null
=True
565 adresse_postale_precision
= models
.CharField(
566 max_length
=255, blank
=True, null
=True
568 adresse_postale_boite_postale
= models
.CharField(
569 max_length
=255, blank
=True, null
=True
571 adresse_postale_ville
= models
.CharField(max_length
=255)
572 adresse_postale_code_postal
= models
.CharField(
573 max_length
=20, blank
=True, null
=True
575 adresse_postale_code_postal_avant_ville
= models
.NullBooleanField()
576 adresse_postale_region
= models
.CharField(
577 max_length
=255, blank
=True, null
=True
579 adresse_postale_pays
= models
.ForeignKey(
580 'references.Pays', to_field
='code',
581 db_column
='adresse_postale_pays',
582 related_name
='impl_adresse_postale'
585 adresse_physique_precision_avant
= models
.CharField(
586 max_length
=255, blank
=True
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'
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)
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)
621 modif_date
= models
.DateField()
625 class Ouvertes(ActifsManager
):
627 def get_query_set(self
):
628 return super(Implantation
.Managers
.Ouvertes
, self
) \
632 objects
= ActifsManager()
633 ouvertes
= Managers
.Ouvertes()
636 db_table
= u
'ref_implantation'
640 def __unicode__(self
):
644 class Pays(ActifsModel
):
646 Pays (donnée de référence, source: SQI).
648 Liste AUF basée sur la liste ISO-3166-1.
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'),
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,
668 nord_sud
= models
.CharField(
669 max_length
=255, blank
=True, null
=True,
671 developpement
= models
.CharField(max_length
=255, blank
=True, null
=True)
672 monnaie
= models
.CharField(max_length
=255, blank
=True, null
=True)
675 db_table
= u
'ref_pays'
677 verbose_name
= u
"pays"
678 verbose_name_plural
= u
"pays"
681 def __unicode__(self
):
685 class _Etablissement(ActifsModel
):
687 Superclasse pour les modèles ``Etablissement`` et ``EtablissementBase``
695 ('ESR', "Établissement d'enseignement supérieur et de recherche"),
696 ('CIR', "Centre ou institution de recherche"),
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',
707 region
= models
.ForeignKey(
708 'references.Region', db_column
='region', blank
=True, null
=True,
709 related_name
='+', verbose_name
='région'
711 implantation
= models
.ForeignKey(
712 'references.Implantation', db_column
='implantation',
713 related_name
='+', blank
=True, null
=True
715 description
= models
.TextField(blank
=True)
716 historique
= models
.TextField(blank
=True)
719 membre
= models
.BooleanField()
720 membre_adhesion_date
= models
.DateField(
721 u
"date d'adhésion", null
=True, blank
=True
723 statut
= models
.CharField(
724 max_length
=1, choices
=STATUT_CHOICES
, blank
=True, null
=True
726 qualite
= models
.CharField(
727 u
'qualité', max_length
=3, choices
=QUALITE_CHOICES
, blank
=True,
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
737 responsable_fonction
= models
.CharField(
738 u
'fonction', max_length
=255, blank
=True
740 responsable_courriel
= models
.EmailField(u
'courriel', blank
=True)
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
755 date_modification
= models
.DateField(
756 u
'date de modification', blank
=True, null
=True
758 commentaire
= models
.TextField(blank
=True)
762 ordering
= ['pays__nom', 'nom']
765 def __unicode__(self
):
766 return "%s - %s" % (self
.pays
.nom
, self
.nom
)
769 class Etablissement(_Etablissement
):
771 Établissement (donnée de référence, source: GDE).
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
777 class Meta(_Etablissement
.Meta
):
778 db_table
= u
'ref_etablissement'
782 class EtablissementBase(_Etablissement
):
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.
787 ref
= models
.OneToOneField(Etablissement
, blank
=True, null
=True,
788 related_name
='%(app_label)s_%(class)s')
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
)