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