Commit | Line | Data |
---|---|---|
652c5d02 EMS |
1 | # encoding: utf-8 |
2 | ||
3 | from django.db import models | |
4 | ||
5 | ||
cda9da6f | 6 | class ActifsManager(models.Manager): |
d95f7b46 EMS |
7 | """ |
8 | Manager pour ``ActifsModel``. | |
9 | """ | |
cda9da6f EMS |
10 | |
11 | def get_query_set(self): | |
12 | return super(ActifsManager, self).get_query_set().filter(actif=True) | |
13 | ||
14 | ||
d95f7b46 EMS |
15 | class ActifsModel(models.Model): |
16 | """ | |
17 | Modèle faisant la gestion des objets actifs/inactifs. | |
18 | ||
19 | Le manager par défaut ne liste que les objets actifs. Pour avoir tous | |
20 | les objets, utiliser le manager ``avec_inactifs``. | |
21 | """ | |
22 | actif = models.BooleanField(default=True, editable=False) | |
23 | ||
24 | # Managers | |
25 | objects = ActifsManager() | |
26 | avec_inactifs = models.Manager() | |
27 | ||
28 | class Meta: | |
29 | abstract = True | |
30 | ||
31 | ||
32 | class Employe(ActifsModel): | |
66a35422 EMS |
33 | """ |
34 | Personne en contrat d'employé (CDD ou CDI) à l'AUF | |
a10aee41 EMS |
35 | """ |
36 | id = models.IntegerField(primary_key=True) | |
37 | nom = models.CharField(max_length=255) | |
38 | prenom = models.CharField(max_length=255) | |
77f6e088 EMS |
39 | implantation = models.ForeignKey( |
40 | 'references.Implantation', | |
41 | db_column='implantation', | |
42 | related_name='lieu_travail_theorique_de' | |
43 | ) | |
44 | implantation_physique = models.ForeignKey( | |
45 | 'references.Implantation', | |
46 | db_column='implantation_physique', | |
47 | related_name='lieu_travail_reel_de' | |
48 | ) | |
a10aee41 EMS |
49 | courriel = models.CharField(max_length=255, null=True, blank=True) |
50 | genre = models.CharField(max_length=3) | |
51 | fonction = models.CharField(max_length=255, null=True, blank=True) | |
52 | telephone_poste = models.CharField(max_length=255, null=True, blank=True) | |
53 | telephone_ip = models.CharField(max_length=255, null=True, blank=True) | |
77f6e088 EMS |
54 | responsable = models.ForeignKey( |
55 | 'references.Employe', | |
56 | db_column='responsable', | |
57 | related_name='responsable_de', | |
58 | null=True, blank=True | |
59 | ) | |
a10aee41 EMS |
60 | mandat_debut = models.DateField(null=True, blank=True) |
61 | mandat_fin = models.DateField(null=True, blank=True) | |
62 | date_entree = models.DateField(null=True, blank=True) | |
77f6e088 | 63 | service = models.ForeignKey('references.Service', db_column='service') |
66a35422 | 64 | poste_type_1 = models.ForeignKey( |
77f6e088 EMS |
65 | 'references.PosteType', |
66 | null=True, blank=True, | |
67 | db_column='poste_type_1', | |
68 | related_name='poste_type_1' | |
69 | ) | |
66a35422 | 70 | poste_type_2 = models.ForeignKey( |
77f6e088 EMS |
71 | 'references.PosteType', |
72 | null=True, blank=True, | |
73 | db_column='poste_type_2', | |
74 | related_name='poste_type_2' | |
75 | ) | |
a10aee41 EMS |
76 | |
77 | class Meta: | |
78 | db_table = u'ref_employe' | |
79 | ordering = ['nom'] | |
80 | ||
81 | def __unicode__(self): | |
82 | return u"%s, %s [%d]" % (self.nom, self.prenom, self.id) | |
83 | ||
84 | ||
d95f7b46 | 85 | class Authentification(ActifsModel): |
a10aee41 | 86 | """Authentification""" |
66a35422 EMS |
87 | id = models.ForeignKey( |
88 | 'references.Employe', primary_key=True, db_column='id' | |
89 | ) | |
a10aee41 EMS |
90 | courriel = models.CharField(max_length=255, unique=True) |
91 | motdepasse = models.CharField(max_length=255) | |
a10aee41 EMS |
92 | |
93 | class Meta: | |
94 | db_table = u'ref_authentification' | |
95 | ordering = ['id'] | |
96 | ||
97 | def __unicode__(self): | |
98 | return u"%s [%d]" % (self.courriel, self.id) | |
99 | ||
100 | ||
d95f7b46 | 101 | class Service(ActifsModel): |
a10aee41 EMS |
102 | """Services (donnée de référence, source: SGRH). |
103 | """ | |
104 | id = models.IntegerField(primary_key=True) | |
105 | nom = models.CharField(max_length=255) | |
a10aee41 EMS |
106 | |
107 | class Meta: | |
108 | db_table = u'ref_service' | |
109 | ordering = ['nom'] | |
110 | ||
111 | def __unicode__(self): | |
112 | return "%s (%s)" % (self.nom, self.id) | |
113 | ||
114 | ||
d95f7b46 | 115 | class PosteType(ActifsModel): |
a10aee41 EMS |
116 | """Postes types (donnée de référence, source: SGRH). |
117 | """ | |
118 | id = models.IntegerField(primary_key=True) | |
119 | nom = models.CharField(max_length=255) | |
a10aee41 EMS |
120 | |
121 | class Meta: | |
122 | db_table = u'ref_poste_type' | |
123 | ||
124 | def __unicode__(self): | |
125 | return "%s (%s)" % (self.nom, self.id) | |
126 | ||
127 | ||
d95f7b46 | 128 | class GroupeArh(ActifsModel): |
a10aee41 | 129 | id = models.AutoField(primary_key=True) |
77f6e088 | 130 | employe = models.ForeignKey('references.Employe', db_column='employe') |
a10aee41 EMS |
131 | |
132 | class Meta: | |
133 | db_table = u'ref_groupe_arh' | |
134 | ||
135 | ||
d95f7b46 | 136 | class GroupeDirRegion(ActifsModel): |
a10aee41 | 137 | id = models.AutoField(primary_key=True) |
77f6e088 EMS |
138 | employe = models.ForeignKey('references.Employe', db_column='employe') |
139 | region = models.ForeignKey('references.Region', db_column='region') | |
a10aee41 EMS |
140 | |
141 | class Meta: | |
142 | db_table = u'ref_groupe_dir_region' | |
143 | ||
144 | ||
d95f7b46 | 145 | class GroupeAdmRegion(ActifsModel): |
a10aee41 | 146 | id = models.AutoField(primary_key=True) |
77f6e088 EMS |
147 | employe = models.ForeignKey('references.Employe', db_column='employe') |
148 | region = models.ForeignKey('references.Region', db_column='region') | |
a10aee41 EMS |
149 | |
150 | class Meta: | |
151 | db_table = u'ref_groupe_adm_region' | |
152 | ||
153 | ||
d95f7b46 | 154 | class GroupeRespImplantation(ActifsModel): |
a10aee41 | 155 | id = models.AutoField(primary_key=True) |
77f6e088 | 156 | employe = models.ForeignKey('references.Employe', db_column='employe') |
66a35422 EMS |
157 | implantation = models.ForeignKey( |
158 | 'references.Implantation', db_column='implantation' | |
159 | ) | |
a10aee41 | 160 | type = models.CharField(max_length=255, blank=True, null=True) |
a10aee41 EMS |
161 | |
162 | class Meta: | |
163 | db_table = u'ref_groupe_resp_implantation' | |
164 | ||
165 | ||
d95f7b46 | 166 | class GroupeDirProgramme(ActifsModel): |
a10aee41 | 167 | id = models.AutoField(primary_key=True) |
77f6e088 EMS |
168 | employe = models.ForeignKey('references.Employe', db_column='employe') |
169 | service = models.ForeignKey('references.Service', db_column='service') | |
a10aee41 EMS |
170 | |
171 | class Meta: | |
172 | db_table = u'ref_groupe_dir_programme' | |
173 | ||
174 | ||
d95f7b46 | 175 | class GroupeDirDelegProgrammeReg(ActifsModel): |
a10aee41 | 176 | id = models.AutoField(primary_key=True) |
77f6e088 EMS |
177 | employe = models.ForeignKey('references.Employe', db_column='employe') |
178 | region = models.ForeignKey('references.Region', db_column='region') | |
a10aee41 EMS |
179 | |
180 | class Meta: | |
181 | db_table = u'ref_groupe_dir_deleg_programme_reg' | |
182 | ||
183 | ||
d95f7b46 | 184 | class GroupeComptable(ActifsModel): |
a10aee41 | 185 | id = models.AutoField(primary_key=True) |
77f6e088 | 186 | employe = models.ForeignKey('references.Employe', db_column='employe') |
a10aee41 EMS |
187 | |
188 | class Meta: | |
189 | db_table = u'ref_groupe_comptable' | |
190 | ||
191 | ||
d95f7b46 | 192 | class GroupeComptableRegional(ActifsModel): |
a10aee41 | 193 | id = models.AutoField(primary_key=True) |
77f6e088 | 194 | employe = models.ForeignKey('references.Employe', db_column='employe') |
a10aee41 EMS |
195 | |
196 | class Meta: | |
197 | db_table = u'ref_groupe_comptable_regional' | |
198 | ||
199 | ||
d95f7b46 | 200 | class GroupeComptableLocal(ActifsModel): |
a10aee41 | 201 | id = models.AutoField(primary_key=True) |
77f6e088 | 202 | employe = models.ForeignKey('references.Employe', db_column='employe') |
a10aee41 EMS |
203 | |
204 | class Meta: | |
205 | db_table = u'ref_groupe_comptable_local' | |
206 | ||
207 | ||
d95f7b46 | 208 | class Discipline(ActifsModel): |
a10aee41 EMS |
209 | """ ATTENTION: DÉSUET |
210 | Discipline (donnée de référence, source: SQI). | |
211 | Une discipline est une catégorie de savoirs scientifiques. | |
212 | Le conseil scientifique fixe la liste des disciplines. | |
213 | """ | |
214 | ||
215 | id = models.IntegerField(primary_key=True) | |
216 | code = models.CharField(max_length=255, unique=True) | |
217 | nom = models.CharField(max_length=255) | |
218 | nom_long = models.CharField(max_length=255, blank=True) | |
219 | nom_court = models.CharField(max_length=255, blank=True) | |
a10aee41 EMS |
220 | |
221 | class Meta: | |
222 | db_table = u'ref_discipline' | |
223 | ordering = ['nom'] | |
224 | ||
225 | def __unicode__(self): | |
226 | return "%s - %s" % (self.code, self.nom) | |
227 | ||
228 | ||
d95f7b46 | 229 | class Programme(ActifsModel): |
a10aee41 EMS |
230 | """ ATTENTION: DÉSUET |
231 | Programme (donnée de référence, source: SQI). | |
66a35422 EMS |
232 | Structure interne par laquelle l'AUF exécute ses projets et activités, |
233 | dispense ses produits et ses services. | |
a10aee41 EMS |
234 | """ |
235 | ||
236 | id = models.IntegerField(primary_key=True) | |
237 | code = models.CharField(max_length=255, unique=True) | |
238 | nom = models.CharField(max_length=255) | |
239 | nom_long = models.CharField(max_length=255, blank=True) | |
240 | nom_court = models.CharField(max_length=255, blank=True) | |
a10aee41 EMS |
241 | |
242 | class Meta: | |
243 | db_table = u'ref_programme' | |
244 | ||
245 | def __unicode__(self): | |
246 | return "%s - %s" % (self.code, self.nom) | |
247 | ||
248 | ||
249 | #PROGRAMMATION QUADRIENNALLE | |
250 | ||
d95f7b46 | 251 | class Projet(ActifsModel): |
a10aee41 EMS |
252 | """Projet (donnée de référence, source: programmation-quadriennalle). |
253 | """ | |
254 | SERVICE_CHOICES = ( | |
66a35422 EMS |
255 | ('1', |
256 | "Direction de la langue et de la communication scientifique " | |
257 | "en français"), | |
a10aee41 | 258 | ('2', "Direction du développement et de la valorisation"), |
66a35422 EMS |
259 | ('3', |
260 | "Direction de l'innovation pédagogique et de l'économie " | |
261 | "de la connaissance"), | |
a10aee41 EMS |
262 | ('4', "Direction du renforcement des capacités scientifiques"), |
263 | ) | |
264 | ||
265 | id = models.IntegerField(primary_key=True) | |
266 | code = models.CharField(max_length=255, unique=True) | |
267 | nom = models.CharField(max_length=255) | |
268 | presentation = models.TextField(null=True, blank=True) | |
269 | partenaires = models.TextField(null=True, blank=True) | |
66a35422 EMS |
270 | service = models.CharField( |
271 | max_length=255, choices=SERVICE_CHOICES, blank=True, null=True | |
272 | ) | |
77f6e088 EMS |
273 | objectif_specifique = models.ForeignKey( |
274 | 'references.ObjectifSpecifique', | |
275 | blank=True, null=True, | |
276 | db_column='objectif_specifique' | |
277 | ) | |
278 | implantation = models.ForeignKey('references.Implantation', null=True, | |
279 | blank=True, db_column='implantation') | |
280 | etablissement = models.ForeignKey('references.Etablissement', null=True, | |
281 | blank=True, db_column='etablissement') | |
a10aee41 EMS |
282 | date_debut = models.DateField(null=True, blank=True) |
283 | date_fin = models.DateField(null=True, blank=True) | |
a10aee41 EMS |
284 | |
285 | class Meta: | |
286 | db_table = u'ref_projet' | |
287 | ordering = ['nom'] | |
288 | ||
289 | def __unicode__(self): | |
290 | return "%s - %s" % (self.code, self.nom) | |
291 | ||
292 | ||
d95f7b46 | 293 | class ProjetComposante(ActifsModel): |
a10aee41 EMS |
294 | """Composantes des projets (source: programmation-quadriennalle) |
295 | """ | |
296 | id = models.IntegerField(primary_key=True) | |
297 | code = models.CharField(max_length=10) | |
298 | nom = models.CharField(max_length=255) | |
299 | nom_court = models.CharField(max_length=255, null=True, blank=True) | |
300 | description = models.TextField(null=True, blank=True) | |
77f6e088 | 301 | projet = models.ForeignKey('references.Projet', db_column='projet') |
a10aee41 EMS |
302 | |
303 | class Meta: | |
304 | db_table = u'ref_projet_composante' | |
305 | ordering = ['nom'] | |
306 | ||
307 | def __unicode__(self): | |
308 | return "%s - %s" % (self.code, self.nom) | |
309 | ||
310 | ||
d95f7b46 | 311 | class UniteProjet(ActifsModel): |
a10aee41 EMS |
312 | """Unités de projet (source: programmation-quadriennalle) |
313 | """ | |
314 | id = models.IntegerField(primary_key=True) | |
315 | code = models.CharField(max_length=10, unique=True) | |
316 | nom = models.CharField(max_length=255) | |
a10aee41 EMS |
317 | |
318 | class Meta: | |
319 | db_table = u'ref_unite_projet' | |
320 | ordering = ['nom'] | |
321 | ||
322 | def __unicode__(self): | |
323 | return "%s - %s" % (self.code, self.nom) | |
324 | ||
325 | ||
d95f7b46 | 326 | class ObjectifSpecifique(ActifsModel): |
a10aee41 EMS |
327 | id = models.IntegerField(primary_key=True) |
328 | nom = models.CharField(max_length=255) | |
77f6e088 EMS |
329 | objectif_strategique = models.ForeignKey('references.ObjectifStrategique', |
330 | db_column='objectif_strategique') | |
a10aee41 EMS |
331 | |
332 | class Meta: | |
333 | db_table = u'ref_objectif_specifique' | |
334 | ordering = ['nom'] | |
335 | ||
336 | def __unicode__(self): | |
337 | return "%s - %s" % (self.id, self.nom) | |
338 | ||
339 | ||
d95f7b46 | 340 | class ObjectifStrategique(ActifsModel): |
a10aee41 EMS |
341 | id = models.IntegerField(primary_key=True) |
342 | nom = models.CharField(max_length=255) | |
343 | description = models.TextField(null=True, blank=True) | |
a10aee41 EMS |
344 | |
345 | class Meta: | |
346 | db_table = u'ref_objectif_strategique' | |
347 | ordering = ['nom'] | |
348 | ||
349 | def __unicode__(self): | |
350 | return "%s - %s" % (self.id, self.nom) | |
351 | ||
352 | ||
d95f7b46 | 353 | class Thematique(ActifsModel): |
a10aee41 EMS |
354 | id = models.IntegerField(primary_key=True) |
355 | nom = models.CharField(max_length=255) | |
a10aee41 EMS |
356 | |
357 | class Meta: | |
358 | db_table = u'ref_thematique' | |
359 | ordering = ['nom'] | |
360 | ||
361 | def __unicode__(self): | |
362 | return "%s - %s" % (self.id, self.nom) | |
363 | ||
364 | ||
d95f7b46 | 365 | class ProjetUp(ActifsModel): |
a10aee41 EMS |
366 | """Projet-unité de projet (source: coda) |
367 | => codes budgétaires | |
368 | """ | |
369 | id = models.AutoField(primary_key=True) | |
370 | code = models.CharField(max_length=255, unique=True) | |
371 | nom = models.CharField(max_length=255) | |
372 | nom_court = models.CharField(max_length=255, blank=True) | |
a10aee41 EMS |
373 | |
374 | ||
d95f7b46 | 375 | class Poste(ActifsModel): |
a10aee41 EMS |
376 | """ ATTENTION: DÉSUET |
377 | Poste (donnée de référence, source: CODA). | |
378 | Un poste est une catégorie destinée à venir raffiner un projet. | |
379 | """ | |
380 | ||
381 | id = models.IntegerField(primary_key=True) | |
382 | code = models.CharField(max_length=255, unique=True) | |
383 | nom = models.CharField(max_length=255) | |
384 | type = models.CharField(max_length=255, blank=True) | |
a10aee41 EMS |
385 | |
386 | class Meta: | |
387 | db_table = u'ref_poste' | |
388 | ||
389 | def __unicode__(self): | |
390 | return "%s - %s (%s)" % (self.code, self.nom, self.type) | |
391 | ||
392 | ||
d95f7b46 | 393 | class ProjetPoste(ActifsModel): |
66a35422 EMS |
394 | """ |
395 | ATTENTION: DÉSUET | |
a10aee41 | 396 | Projet-poste (donnée de référence, source: CODA). |
66a35422 EMS |
397 | Un projet-poste consiste en une raffinement d'un projet par un poste |
398 | (budgétaire). Subdivision utile pour le suivi budgétaire et comptable. | |
a10aee41 EMS |
399 | """ |
400 | ||
401 | id = models.IntegerField(primary_key=True) | |
402 | code = models.CharField(max_length=255, unique=True) | |
66a35422 EMS |
403 | code_projet = models.ForeignKey( |
404 | 'references.Projet', to_field='code', db_column='code_projet' | |
405 | ) | |
406 | code_poste = models.ForeignKey( | |
407 | 'references.Poste', to_field='code', db_column='code_poste' | |
408 | ) | |
409 | code_bureau = models.ForeignKey( | |
410 | 'references.Bureau', to_field='code', db_column='code_bureau' | |
411 | ) | |
412 | code_programme = models.ForeignKey( | |
413 | 'references.Programme', to_field='code', db_column='code_programme' | |
414 | ) | |
a10aee41 EMS |
415 | |
416 | class Meta: | |
417 | db_table = u'ref_projet_poste' | |
418 | ||
419 | def __unicode__(self): | |
420 | return "%s" % (self.code) | |
421 | ||
422 | ||
d95f7b46 | 423 | class Region(ActifsModel): |
652c5d02 | 424 | """Région (donnée de référence, source: referentiels_spip). |
66a35422 EMS |
425 | Une région est une subdivision géographique du monde pour la gestion de |
426 | l'AUF. | |
652c5d02 EMS |
427 | """ |
428 | code = models.CharField(max_length=255, unique=True) | |
429 | nom = models.CharField(max_length=255, db_index=True) | |
66a35422 EMS |
430 | implantation_bureau = models.ForeignKey( |
431 | 'references.Implantation', db_column='implantation_bureau', | |
432 | related_name='gere_region', null=True, blank=True | |
433 | ) | |
cda9da6f | 434 | |
652c5d02 EMS |
435 | class Meta: |
436 | db_table = u'ref_region' | |
437 | ordering = ['nom'] | |
438 | verbose_name = u"région" | |
439 | verbose_name_plural = u"régions" | |
440 | ||
441 | def __unicode__(self): | |
442 | return "%s (%s)" % (self.nom, self.code) | |
443 | ||
444 | ||
d95f7b46 | 445 | class Bureau(ActifsModel): |
66a35422 EMS |
446 | """ |
447 | Bureau (donnée de référence, source: SQI). | |
448 | ||
449 | Référence legacy entre la notion de région et celle d'implantation | |
450 | responsable des régions et du central. | |
451 | ||
652c5d02 EMS |
452 | Un bureau est : |
453 | - soit le bureau régional d'une région (implantations de type 'Bureau') | |
66a35422 EMS |
454 | - soit la notion unique de Service central pour les 2 implantations |
455 | centrales (implantations de type 'Service central' et 'Siege'). | |
456 | ||
652c5d02 EMS |
457 | Ne pas confondre avec les seuls 'bureaux régionaux'. |
458 | """ | |
459 | code = models.CharField(max_length=255, unique=True) | |
460 | nom = models.CharField(max_length=255) | |
461 | nom_court = models.CharField(max_length=255, blank=True) | |
462 | nom_long = models.CharField(max_length=255, blank=True) | |
66a35422 EMS |
463 | implantation = models.ForeignKey( |
464 | 'references.Implantation', db_column='implantation' | |
465 | ) | |
77f6e088 | 466 | region = models.ForeignKey('references.Region', db_column='region') |
652c5d02 EMS |
467 | |
468 | class Meta: | |
469 | db_table = u'ref_bureau' | |
470 | ordering = ['nom'] | |
471 | verbose_name = u"bureau" | |
472 | verbose_name_plural = u"bureaux" | |
473 | ||
474 | def __unicode__(self): | |
475 | return "%s (%s)" % (self.nom, self.code) | |
476 | ||
477 | ||
d95f7b46 | 478 | class Implantation(ActifsModel): |
66a35422 EMS |
479 | """ |
480 | Implantation (donnée de référence, source: Implantus) | |
481 | ||
482 | Une implantation est un endroit où l'AUF est présente et offre des | |
483 | services spécifiques. Deux implantations peuvent être au même endroit | |
484 | physique. | |
652c5d02 | 485 | """ |
27cd0e44 EMS |
486 | STATUT_CHOICES = ( |
487 | (0, u'Fermée ou jamais ouverte'), | |
488 | (1, u'Ouverte'), | |
489 | (2, u'Ouverture imminente'), | |
490 | (3, u'En projet') | |
491 | ) | |
492 | ||
652c5d02 EMS |
493 | nom = models.CharField(max_length=255) |
494 | nom_court = models.CharField(max_length=255, blank=True) | |
495 | nom_long = models.CharField(max_length=255, blank=True) | |
496 | type = models.CharField(max_length=255) | |
66a35422 EMS |
497 | bureau_rattachement = models.ForeignKey( |
498 | 'references.Implantation', db_column='bureau_rattachement' | |
499 | ) | |
77f6e088 | 500 | region = models.ForeignKey('references.Region', db_column='region') |
652c5d02 EMS |
501 | fuseau_horaire = models.CharField(max_length=255, blank=True) |
502 | code_meteo = models.CharField(max_length=255, blank=True) | |
503 | # responsable | |
66a35422 | 504 | responsable_implantation = models.IntegerField(null=True, blank=True) |
652c5d02 | 505 | # adresse postale |
66a35422 EMS |
506 | adresse_postale_precision_avant = models.CharField( |
507 | max_length=255, blank=True, null=True | |
508 | ) | |
652c5d02 | 509 | adresse_postale_no = models.CharField(max_length=30, blank=True, null=True) |
66a35422 EMS |
510 | adresse_postale_rue = models.CharField( |
511 | max_length=255, blank=True, null=True | |
512 | ) | |
513 | adresse_postale_bureau = models.CharField( | |
514 | max_length=255, blank=True, null=True | |
515 | ) | |
516 | adresse_postale_precision = models.CharField( | |
517 | max_length=255, blank=True, null=True | |
518 | ) | |
519 | adresse_postale_boite_postale = models.CharField( | |
520 | max_length=255, blank=True, null=True | |
521 | ) | |
652c5d02 | 522 | adresse_postale_ville = models.CharField(max_length=255) |
66a35422 EMS |
523 | adresse_postale_code_postal = models.CharField( |
524 | max_length=20, blank=True, null=True | |
525 | ) | |
652c5d02 | 526 | adresse_postale_code_postal_avant_ville = models.NullBooleanField() |
66a35422 EMS |
527 | adresse_postale_region = models.CharField( |
528 | max_length=255, blank=True, null=True | |
529 | ) | |
530 | adresse_postale_pays = models.ForeignKey( | |
531 | 'references.Pays', to_field='code', | |
532 | db_column='adresse_postale_pays', | |
533 | related_name='impl_adresse_postale' | |
534 | ) | |
652c5d02 | 535 | # adresse physique |
66a35422 EMS |
536 | adresse_physique_precision_avant = models.CharField( |
537 | max_length=255, blank=True | |
538 | ) | |
652c5d02 EMS |
539 | adresse_physique_no = models.CharField(max_length=30, blank=True) |
540 | adresse_physique_rue = models.CharField(max_length=255, blank=True) | |
541 | adresse_physique_bureau = models.CharField(max_length=255, blank=True) | |
542 | adresse_physique_precision = models.CharField(max_length=255, blank=True) | |
543 | adresse_physique_ville = models.CharField(max_length=255) | |
544 | adresse_physique_code_postal = models.CharField(max_length=30, blank=True) | |
545 | adresse_physique_code_postal_avant_ville = models.NullBooleanField() | |
546 | adresse_physique_region = models.CharField(max_length=255, blank=True) | |
66a35422 EMS |
547 | adresse_physique_pays = models.ForeignKey( |
548 | 'references.Pays', to_field='code', | |
549 | db_column='adresse_physique_pays', | |
550 | related_name='impl_adresse_physique' | |
551 | ) | |
652c5d02 EMS |
552 | # autres coordonnées |
553 | telephone = models.CharField(max_length=255, blank=True) | |
554 | telephone_interne = models.CharField(max_length=255, blank=True) | |
555 | fax = models.CharField(max_length=255, blank=True) | |
556 | fax_interne = models.CharField(max_length=255, blank=True) | |
557 | courriel = models.EmailField(blank=True) | |
558 | courriel_interne = models.EmailField(blank=True) | |
559 | url = models.URLField(verify_exists=False, max_length=255, blank=True) | |
560 | # traitement | |
27cd0e44 | 561 | statut = models.IntegerField(choices=STATUT_CHOICES) |
652c5d02 EMS |
562 | date_ouverture = models.DateField(null=True, blank=True) |
563 | date_inauguration = models.DateField(null=True, blank=True) | |
564 | date_extension = models.DateField(null=True, blank=True) | |
565 | date_fermeture = models.DateField(null=True, blank=True) | |
66a35422 | 566 | hebergement_etablissement = models.CharField(max_length=255, blank=True) |
652c5d02 EMS |
567 | hebergement_convention = models.NullBooleanField() |
568 | hebergement_convention_date = models.DateField(null=True, blank=True) | |
569 | remarque = models.TextField() | |
570 | commentaire = models.CharField(max_length=255, blank=True) | |
571 | # meta | |
652c5d02 EMS |
572 | modif_date = models.DateField() |
573 | ||
574 | class Managers: | |
575 | ||
d95f7b46 | 576 | class Ouvertes(ActifsManager): |
652c5d02 EMS |
577 | |
578 | def get_query_set(self): | |
66a35422 EMS |
579 | return super(Implantation.Managers.Ouvertes, self) \ |
580 | .get_query_set() \ | |
d95f7b46 | 581 | .filter(statut=1) |
652c5d02 | 582 | |
d95f7b46 | 583 | objects = ActifsManager() |
652c5d02 | 584 | ouvertes = Managers.Ouvertes() |
652c5d02 EMS |
585 | |
586 | class Meta: | |
587 | db_table = u'ref_implantation' | |
588 | ordering = ['nom'] | |
589 | ||
590 | def __unicode__(self): | |
591 | return "%s (%d)" % (self.nom, self.id) | |
592 | ||
593 | ||
d95f7b46 | 594 | class Pays(ActifsModel): |
66a35422 EMS |
595 | """ |
596 | Pays (donnée de référence, source: SQI). | |
597 | ||
598 | Liste AUF basée sur la liste ISO-3166-1. | |
599 | """ | |
652c5d02 EMS |
600 | code = models.CharField(max_length=2, unique=True) |
601 | code_iso3 = models.CharField(max_length=3, unique=True) | |
602 | nom = models.CharField(max_length=255) | |
77f6e088 EMS |
603 | region = models.ForeignKey('references.Region', db_column='region') |
604 | code_bureau = models.ForeignKey('references.Bureau', to_field='code', | |
652c5d02 EMS |
605 | db_column='code_bureau', blank=True, |
606 | null=True) | |
607 | nord_sud = models.CharField(max_length=255, blank=True, null=True) | |
608 | developpement = models.CharField(max_length=255, blank=True, null=True) | |
609 | monnaie = models.CharField(max_length=255, blank=True, null=True) | |
652c5d02 EMS |
610 | |
611 | class Meta: | |
612 | db_table = u'ref_pays' | |
613 | ordering = ['nom'] | |
614 | verbose_name = u"pays" | |
615 | verbose_name_plural = u"pays" | |
616 | ||
617 | def __unicode__(self): | |
618 | return "%s (%s)" % (self.nom, self.code) | |
619 | ||
620 | ||
d95f7b46 | 621 | class EtablissementBase(ActifsModel): |
652c5d02 EMS |
622 | """ |
623 | Établissement (donnée de référence, source: GDE). | |
66a35422 EMS |
624 | |
625 | Un établissement peut être une université, un centre de recherche, un | |
626 | réseau d'établissement... Un établissement peut être membre de l'AUF ou | |
627 | non. | |
652c5d02 | 628 | """ |
948fc6a6 EMS |
629 | MEMBRE_STATUT_CHOICES = ( |
630 | ('T', 'Titulaire'), | |
631 | ('A', 'Associé'), | |
632 | ('C', 'Candidat'), | |
633 | ) | |
634 | QUALITE_CHOICES = ( | |
635 | ('ESR', "Établissement d'enseignement supérieur et de recherche"), | |
636 | ('CIR', "Centre ou institution de recherche"), | |
637 | ('RES', "Réseau"), | |
638 | ) | |
639 | ||
640 | # Infos de base | |
652c5d02 | 641 | nom = models.CharField(max_length=255) |
66a35422 EMS |
642 | pays = models.ForeignKey( |
643 | 'references.Pays', to_field='code', db_column='pays', | |
644 | related_name='+' | |
645 | ) | |
646 | region = models.ForeignKey( | |
647 | 'references.Region', db_column='region', blank=True, null=True, | |
648 | related_name='+', verbose_name='région' | |
649 | ) | |
650 | implantation = models.ForeignKey( | |
651 | 'references.Implantation', db_column='implantation', | |
652 | related_name='+', blank=True, null=True | |
653 | ) | |
83ca080a EMS |
654 | description = models.TextField(blank=True) |
655 | historique = models.TextField(blank=True) | |
948fc6a6 EMS |
656 | |
657 | # Membership | |
652c5d02 | 658 | membre = models.BooleanField() |
948fc6a6 EMS |
659 | membre_adhesion_date = models.DateField(null=True, blank=True, |
660 | verbose_name="date d'adhésion") | |
661 | statut = models.CharField(max_length=1, choices=MEMBRE_STATUT_CHOICES, | |
662 | blank=True, null=True) | |
663 | qualite = models.CharField(max_length=3, choices=QUALITE_CHOICES, | |
664 | verbose_name="qualité", blank=True, | |
665 | null=True) | |
666 | ||
667 | # Responsable | |
66a35422 EMS |
668 | responsable_genre = models.CharField( |
669 | max_length=1, blank=True, verbose_name='genre' | |
670 | ) | |
671 | responsable_nom = models.CharField( | |
672 | max_length=255, blank=True, verbose_name='nom' | |
673 | ) | |
674 | responsable_prenom = models.CharField( | |
675 | max_length=255, blank=True, verbose_name='prénom' | |
676 | ) | |
677 | responsable_fonction = models.CharField( | |
678 | max_length=255, blank=True, verbose_name='fonction' | |
679 | ) | |
948fc6a6 EMS |
680 | |
681 | # Adresse | |
652c5d02 | 682 | adresse = models.CharField(max_length=255, blank=True) |
948fc6a6 EMS |
683 | code_postal = models.CharField(max_length=20, blank=True, |
684 | verbose_name='code postal') | |
685 | cedex = models.CharField(max_length=20, blank=True, verbose_name='CEDEX') | |
652c5d02 EMS |
686 | ville = models.CharField(max_length=255, blank=True) |
687 | province = models.CharField(max_length=255, blank=True) | |
948fc6a6 EMS |
688 | telephone = models.CharField(max_length=255, blank=True, |
689 | verbose_name='téléphone') | |
652c5d02 | 690 | fax = models.CharField(max_length=255, blank=True) |
948fc6a6 EMS |
691 | url = models.URLField(verify_exists=False, max_length=255, null=True, |
692 | blank=True, verbose_name='URL') | |
693 | ||
694 | # Meta-données | |
948fc6a6 EMS |
695 | date_modification = models.DateField(verbose_name='date de modification', |
696 | blank=True, null=True) | |
697 | commentaire = models.TextField(blank=True) | |
698 | ||
652c5d02 EMS |
699 | class Meta: |
700 | abstract = True | |
701 | ordering = ['pays__nom', 'nom'] | |
702 | ||
703 | def __unicode__(self): | |
948fc6a6 | 704 | return "%s - %s" % (self.pays.nom, self.nom) |
652c5d02 EMS |
705 | |
706 | ||
707 | class Etablissement(EtablissementBase): | |
708 | ||
709 | class Meta(EtablissementBase.Meta): | |
710 | db_table = u'ref_etablissement' |