Ajout des organigrammes par région (bureau)
[auf_rh_dae.git] / project / rh / admin.py
CommitLineData
53ae644d
OL
1# -*- encoding: utf-8 -*-
2
53ae644d
OL
3import datetime
4
53ae644d 5from django.core.urlresolvers import reverse
50fa9bc1 6from django.contrib import admin
53ae644d
OL
7from django.conf import settings
8from django.db.models import Q
5f36f262 9from django.template.defaultfilters import date
53ae644d 10from ajax_select import make_ajax_form
22343fe7
OL
11from auf.django.metadata.admin import AUFMetadataAdminMixin, \
12 AUFMetadataInlineAdminMixin, \
13 AUF_METADATA_READONLY_FIELDS
53ae644d
OL
14from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
15from dae.utils import get_employe_from_user
a17e2236 16from change_list import ChangeList
a0d365ed 17from groups import grp_drh
53ae644d 18import models as rh
22343fe7 19
82af5c19
JPC
20import auf.django.references.models as ref
21
9da4c195
JPC
22class RegionProxy(ref.Region):
23 """ Proxy utilisé pour les organigrammes par région """
24 class Meta:
25 proxy = True
26 verbose_name = u"Organigramme par région"
27 verbose_name_plural = u"Organigramme par région"
28
29
82af5c19
JPC
30class ImplantationProxy(ref.Implantation):
31 """ Proxy utilisé pour les organigrammes par implantation """
32 class Meta:
33 proxy = True
34 verbose_name = u"Organigramme par implantations"
35 verbose_name_plural = u"Organigramme par implantations"
36
22343fe7 37
5c0f1778
JPC
38class ServiceProxy(rh.Service):
39 """ Proxy utilisé pour les organigrammes opar service """
40 class Meta:
41 proxy = True
42 verbose_name = u"Organigramme par services"
43 verbose_name_plural = u"Organigramme par services"
44
22343fe7 45
5c0f1778
JPC
46class EmployeProxy(rh.Employe):
47 """ Proxy utilisé pour les organigrammes des employés """
22343fe7
OL
48 class Meta:
49 proxy = True
50 verbose_name = u"Organigramme des employés"
51 verbose_name_plural = u"Organigramme des employés"
52
f614ca5c 53
40b35603 54class DateRangeMixin(object):
a17e2236 55 prefixe_recherche_temporelle = ""
22343fe7 56
40b35603 57 def get_changelist(self, request, **kwargs):
22343fe7 58 if 'HTTP_REFERER' in request.META.keys():
910e39e5
OL
59 referer = request.META['HTTP_REFERER']
60 referer = "/".join(referer.split('/')[3:])
61 referer = "/%s" % referer.split('?')[0]
22343fe7
OL
62 change_list_view = 'admin:%s_%s_changelist' % (
63 self.model._meta.app_label,
64 self.model.__name__.lower(),)
910e39e5
OL
65 if referer != reverse(change_list_view):
66 params = request.GET.copy()
22343fe7 67 params.update({'statut': 'Actif'})
910e39e5 68 request.GET = params
40b35603 69 return ChangeList
3195667e 70
22343fe7 71
53ae644d
OL
72# Override of the InlineModelAdmin to support the link in the tabular inline
73class LinkedInline(admin.options.InlineModelAdmin):
74 template = "admin/linked.html"
75 admin_model_path = None
76
77 def __init__(self, *args):
78 super(LinkedInline, self).__init__(*args)
79 if self.admin_model_path is None:
80 self.admin_model_path = self.model.__name__.lower()
81
82
83class ProtectRegionMixin(object):
84
85 def queryset(self, request):
86 from dae.workflow import grp_drh, grp_correspondants_rh
87 qs = super(ProtectRegionMixin, self).queryset(request)
88
89 if request.user.is_superuser:
90 return qs
91
92 user_groups = request.user.groups.all()
93
94 if grp_drh in user_groups:
95 return qs
96
97 if grp_correspondants_rh in user_groups:
98 employe = get_employe_from_user(request.user)
22343fe7
OL
99 q = Q(**{self.model.prefix_implantation: \
100 employe.implantation.region})
53ae644d
OL
101 qs = qs.filter(q).distinct()
102 return qs
103 return qs.none()
104
105 def has_change_permission(self, request, obj=None):
20b4867c 106 user_groups = request.user.groups.all()
a0d365ed
OL
107
108 # Lock pour autoriser uniquement les DRH à utiliser RH
109 if not request.user.is_superuser and not grp_drh in user_groups:
110 return False
111
a18bc295 112 if len(user_groups) == 0 and not request.user.is_superuser:
20b4867c
OL
113 return False
114
53ae644d
OL
115 if obj is None:
116 return True
117 ids = [o.id for o in self.queryset(request)]
118 return obj.id in ids
119
120
121# Inlines
122
123class ReadOnlyInlineMixin(object):
22343fe7 124
53ae644d 125 def get_readonly_fields(self, request, obj=None):
22343fe7
OL
126 return [f.name for f in self.model._meta.fields \
127 if f.name not in AUF_METADATA_READONLY_FIELDS]
53ae644d
OL
128
129
130class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
131 model = rh.AyantDroit
132 form = AyantDroitForm
133 extra = 0
134
135 fieldsets = (
136 (None, {
22343fe7
OL
137 'fields': (
138 ('nom', 'prenom'),
139 ('nom_affichage', 'genre'),
140 'nationalite',
141 'date_naissance',
142 'lien_parente',
143 )}),
53ae644d
OL
144 )
145
146
22343fe7
OL
147class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, \
148 admin.TabularInline):
53ae644d
OL
149 readonly_fields = ('owner', )
150 model = rh.AyantDroitCommentaire
151 extra = 1
152
153
154class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
155 form = ContratForm
156 model = rh.Contrat
157 extra = 1
158
159
160class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
161 template = "admin/rh/dossier/linked.html"
162 exclude = AUF_METADATA_READONLY_FIELDS
163 model = rh.Dossier
164 extra = 0
165 can_delete = False
166
167 def has_add_permission(self, request=None):
168 return False
169
170 def has_change_permission(self, request, obj=None):
171 return False
172
173 def has_delete_permission(self, request, obj=None):
174 return False
175
176
22343fe7
OL
177class DossierCommentaireInline(AUFMetadataInlineAdminMixin, \
178 admin.TabularInline):
53ae644d
OL
179 readonly_fields = ('owner', )
180 model = rh.DossierCommentaire
181 extra = 1
182
183
184class DossierPieceInline(admin.TabularInline):
185 model = rh.DossierPiece
186 extra = 4
187
188
189class EmployeInline(admin.TabularInline):
190 model = rh.Employe
191
22343fe7
OL
192
193class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, \
194 admin.TabularInline):
53ae644d
OL
195 readonly_fields = ('owner', )
196 model = rh.EmployeCommentaire
197 extra = 1
198
199
200class EmployePieceInline(admin.TabularInline):
201 model = rh.EmployePiece
202 extra = 4
203
204
53ae644d
OL
205class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
206 readonly_fields = ('owner', )
207 model = rh.PosteCommentaire
208 extra = 1
209
210
211class PosteFinancementInline(admin.TabularInline):
212 model = rh.PosteFinancement
213
214
215class PostePieceInline(admin.TabularInline):
216 model = rh.PostePiece
217
218
219class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
220 model = rh.Remuneration
221 extra = 1
222
223
224class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
225 pass
226
227
228class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
229 model = rh.TypePoste
230
231
6f037929
OL
232class PosteComparaisonInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
233 model = rh.PosteComparaison
234
53ae644d
OL
235
236class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
33232787 237 list_display = ('_classement', '_date_modification', 'user_modification', )
53ae644d
OL
238 fieldsets = AUFMetadataAdminMixin.fieldsets + (
239 (None, {
22343fe7 240 'fields': ('type', 'echelon', 'degre', 'coefficient',)}),
53ae644d
OL
241 )
242
c5964dc2
OL
243 def _classement(self, obj):
244 return unicode(obj)
245 _classement.short_description = u"Classement"
53ae644d 246
33232787 247 def _date_modification(self, obj):
22343fe7
OL
248 return date(obj.date_modification) \
249 if obj.date_modification is not None else "(aucune)"
33232787
JPC
250 _date_modification.short_description = u'date modification'
251 _date_modification.admin_order_field = 'date_modification'
252
22343fe7 253
53ae644d
OL
254class CommentaireAdmin(admin.ModelAdmin):
255 pass
256
257
53ae644d 258class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
22343fe7
OL
259 list_display = (
260 'code',
261 'nom',
262 '_archive',
263 '_date_modification',
264 'user_modification',
265 )
edb35076 266 list_filter = ('archive', )
53ae644d
OL
267 fieldsets = AUFMetadataAdminMixin.fieldsets + (
268 (None, {
edb35076 269 'fields': ('code', 'nom', 'archive', ),
53ae644d
OL
270 }),
271 )
272
734e1e0c
OL
273 def queryset(self, request):
274 return self.model._base_manager
275
276 def _archive(self, obj):
277 if obj.archive:
278 return "oui"
279 else:
280 return "non"
281 _archive.short_description = u'Archivé'
282
33232787 283 def _date_modification(self, obj):
22343fe7
OL
284 return date(obj.date_modification) \
285 if obj.date_modification is not None else "(aucune)"
33232787
JPC
286 _date_modification.short_description = u'date modification'
287 _date_modification.admin_order_field = 'date_modification'
53ae644d 288
22343fe7
OL
289
290class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
291 ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
53ae644d 292 alphabet_filter = 'employe__nom'
22343fe7
OL
293 search_fields = (
294 'employe__nom',
295 'employe__prenom',
296 'poste__nom',
297 'poste__nom_feminin')
53ae644d
OL
298 list_display = (
299 '_id',
e49ac947
JPC
300 '_apercu',
301 '_nom',
53ae644d
OL
302 '_poste',
303 '_employe',
304 '_date_debut',
305 '_date_fin',
33232787 306 '_date_modification',
c5964dc2 307 'user_modification',
53ae644d 308 )
e49ac947 309 list_display_links = ('_nom',)
53ae644d
OL
310 list_filter = (
311 'poste__implantation__region',
312 'poste__implantation',
53ae644d 313 'poste__type_poste__famille_emploi',
7baa5523 314 'poste__type_poste',
53ae644d 315 'rh_contrats__type_contrat',
53ae644d
OL
316 )
317 inlines = (DossierPieceInline, ContratInline,
318 RemunerationInline,
53ae644d
OL
319 DossierCommentaireInline,
320 )
321 fieldsets = AUFMetadataAdminMixin.fieldsets + (
322 (None, {
22343fe7
OL
323 'fields': (
324 'employe',
325 'poste',
326 'statut',
327 'organisme_bstg',)}),
53ae644d 328 ('Recrutement', {
22343fe7
OL
329 'fields': (
330 'statut_residence',
331 'remplacement',
332 'remplacement_de', )}),
53ae644d 333 ('Rémunération', {
22343fe7
OL
334 'fields': (
335 'classement',
336 ('regime_travail', 'regime_travail_nb_heure_semaine'),)}),
53ae644d 337 ('Occupation du Poste par cet Employe', {
22343fe7
OL
338 'fields': (('date_debut', 'date_fin'), )}
339 ),
53ae644d 340 )
22343fe7
OL
341 form = make_ajax_form(rh.Dossier, {
342 'employe': 'employes',
343 'poste': 'postes',
344 'remplacement_de': 'dossiers',
53ae644d
OL
345 })
346
347 def lookup_allowed(self, key, value):
348 if key in (
349 'employe__nom__istartswith',
53ae644d
OL
350 'poste__implantation__region__id__exact',
351 'poste__implantation__id__exact',
352 'poste__type_poste__id__exact',
353 'poste__type_poste__famille_emploi__id__exact',
354 'rh_contrats__type_contrat__id__exact',
355 ):
356 return True
357
e49ac947
JPC
358 def _id(self, obj):
359 return obj.id
360 _id.short_description = u"#"
361 _id.admin_order_field = "id"
362
363 def _nom(self, obj):
22343fe7
OL
364 return "%d : %s %s" % (
365 obj.date_debut.year,
366 obj.employe.nom.upper(),
367 obj.employe.prenom)
e49ac947
JPC
368 _nom.allow_tags = True
369 _nom.short_description = u"Dossier"
370
e49ac947 371 def _apercu(self, d):
22343fe7
OL
372 apercu_link = u"""<a title="Aperçu du dossier"
373 onclick="return showAddAnotherPopup(this);"
374 href='%s'>
375 <img src="%simg/loupe.png" />
376 </a>""" % \
b10920ea 377 (reverse('dossier_apercu', args=(d.id,)),
822a2c33 378 settings.STATIC_URL,
b10920ea 379 )
e49ac947
JPC
380 return apercu_link
381 _apercu.allow_tags = True
382 _apercu.short_description = u""
53ae644d 383
53ae644d 384 def _date_debut(self, obj):
5f36f262
OL
385 return date(obj.date_debut)
386
53ae644d
OL
387 _date_debut.short_description = u'Occupation début'
388 _date_debut.admin_order_field = 'date_debut'
389
390 def _date_fin(self, obj):
5f36f262 391 return date(obj.date_fin)
53ae644d
OL
392 _date_fin.short_description = u'Occupation fin'
393 _date_fin.admin_order_field = 'date_fin'
394
33232787 395 def _date_modification(self, obj):
22343fe7
OL
396 return date(obj.date_modification) \
397 if obj.date_modification is not None else "(aucune)"
33232787
JPC
398 _date_modification.short_description = u'date modification'
399 _date_modification.admin_order_field = 'date_modification'
400
53ae644d 401 def _poste(self, dossier):
22343fe7
OL
402 link = u"""<a title="Aperçu du poste"
403 onclick="return showAddAnotherPopup(this);"
404 href='%s'><img src="%simg/loupe.png" />
405 </a>
406 <a href="%s" title="Modifier le poste">%s</a>""" % \
53ae644d 407 (reverse('poste_apercu', args=(dossier.poste.id,)),
822a2c33 408 settings.STATIC_URL,
211a0e56
JPC
409 reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
410 dossier.poste,
53ae644d
OL
411 )
412 return link
413 _poste.allow_tags = True
414 _poste.short_description = u'Poste'
415 _poste.admin_order_field = 'poste__nom'
416
417 def _employe(self, obj):
418 employe = obj.employe
419 view_link = reverse('employe_apercu', args=(employe.id,))
420 edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
421
f614ca5c 422 style = ""
22343fe7
OL
423 view = u"""<a href="%s"
424 title="Aperçu l'employé"
425 onclick="return showAddAnotherPopup(this);">
426 <img src="%simg/loupe.png" />
427 </a>""" % (view_link, settings.STATIC_URL,)
e6c107de
JPC
428 return u"""%s<a href='%s' style="%s;">%s</a>""" % \
429 (view, edit_link, style, employe)
53ae644d 430 _employe.allow_tags = True
e49ac947 431 _employe.short_description = u"Employé"
53ae644d 432 _employe.admin_order_field = "employe__nom"
22343fe7 433
53ae644d
OL
434 def save_formset(self, request, form, formset, change):
435 instances = formset.save(commit=False)
436 for instance in instances:
437 if instance.__class__ == rh.DossierCommentaire:
438 instance.owner = request.user
02e69aa2 439 instance.date_creation = datetime.datetime.now()
53ae644d
OL
440 instance.save()
441
442
443class DossierPieceAdmin(admin.ModelAdmin):
444 pass
445
446
447class DossierCommentaireAdmin(admin.ModelAdmin):
448 pass
449
450
22343fe7
OL
451class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
452 ProtectRegionMixin, admin.ModelAdmin,):
7eb6b687 453 prefixe_recherche_temporelle = "rh_dossiers__"
53ae644d
OL
454 alphabet_filter = 'nom'
455 DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
456 search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
457 ordering = ('nom', )
458 form = EmployeAdminForm
22343fe7
OL
459 list_display = (
460 '_id',
461 '_apercu',
462 '_nom',
463 '_dossiers_postes',
464 '_date_modification',
465 'user_modification',
466 )
e49ac947 467 list_display_links = ('_nom',)
22343fe7
OL
468 list_filter = (
469 'rh_dossiers__poste__implantation__region',
470 'rh_dossiers__poste__implantation',
471 'nb_postes',
472 )
53ae644d
OL
473 inlines = (AyantDroitInline,
474 DossierROInline,
475 EmployePieceInline,
476 EmployeCommentaireInline)
477 fieldsets = AUFMetadataAdminMixin.fieldsets + (
478 ('Identification', {
22343fe7
OL
479 'fields': (
480 ('nom', 'prenom'),
481 ('nom_affichage', 'genre'),
482 'nationalite',
483 'date_naissance',
484 )}
485 ),
53ae644d 486 ('Informations personnelles', {
22343fe7
OL
487 'fields': ('situation_famille', 'date_entree', )}
488 ),
53ae644d 489 ('Coordonnées', {
22343fe7
OL
490 'fields': (
491 ('tel_domicile', 'tel_cellulaire'),
492 ('adresse', 'ville'),
493 ('code_postal', 'province'),
494 'pays',
495 )}
496 ),
53ae644d
OL
497 )
498
b10920ea 499 def _apercu(self, obj):
22343fe7
OL
500 return u"""<a title="Aperçu de l'employé"
501 onclick="return showAddAnotherPopup(this);"
502 href='%s'>
503 <img src="%simg/loupe.png" />
504 </a>""" % \
505 (reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
b10920ea
JPC
506 _apercu.allow_tags = True
507 _apercu.short_description = u""
b10920ea 508
53ae644d 509 def _nom(self, obj):
53ae644d 510 edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
e6c107de 511 return u"""<a href='%s'><strong>%s</strong></a>""" % \
e49ac947 512 (edit_link, "%s %s" % (obj.nom.upper(), obj.prenom))
53ae644d 513 _nom.allow_tags = True
e49ac947 514 _nom.short_description = u"Employé"
53ae644d
OL
515 _nom.admin_order_field = "nom"
516
e49ac947
JPC
517 def _id(self, obj):
518 return obj.id
519 _id.short_description = u"#"
520 _id.admin_order_field = "id"
521
33232787 522 def _date_modification(self, obj):
22343fe7
OL
523 return date(obj.date_modification) \
524 if obj.date_modification is not None else "(aucune)"
33232787
JPC
525 _date_modification.short_description = u'date modification'
526 _date_modification.admin_order_field = 'date_modification'
527
a7f013f5 528 def _dossiers_postes(self, obj):
53ae644d
OL
529 l = []
530 for d in obj.rh_dossiers.all().order_by('-date_debut'):
22343fe7
OL
531 dossier = u"""<a title="Aperçu du dossier"
532 href="%s"
533 onclick="return showAddAnotherPopup(this);"
534 title="Aperçu du dossier">
535 <img src="%simg/loupe.png" />
536 </a>
537 <a href="%s">Dossier</a>
538 &nbsp;""" % \
539 (reverse('dossier_apercu', args=(d.id,)),
540 settings.STATIC_URL,
541 reverse('admin:rh_dossier_change', args=(d.id,)))
542
543 poste = u"""<a title="Aperçu du poste"
544 href="%s"
545 onclick="return showAddAnotherPopup(this);"
546 title="Aperçu du poste">
547 <img src="%simg/loupe.png" />
548 </a>
549 <a href="%s">Poste</a>
550 &nbsp;""" % \
551 (reverse('poste_apercu', args=(d.poste.id,)),
552 settings.STATIC_URL,
553 reverse('admin:rh_poste_change', args=(d.poste.id,)))
a7f013f5
JPC
554 link = u"""<li>%s %s - %s : [%s] %s</li>""" % \
555 (dossier, poste,
53ae644d 556 d.date_debut.year,
a7f013f5
JPC
557 d.poste.id,
558 d.poste.nom,
53ae644d 559 )
b5cc0357
OL
560
561 # Dossier terminé en gris non cliquable
a4329fae 562 if d.date_fin is not None and d.date_fin < datetime.date.today():
a7f013f5 563 link = u"""<li style="color: grey">%s : [%s] %s</li>""" % \
b5cc0357 564 (d.date_debut.year,
a7f013f5
JPC
565 d.poste.id,
566 d.poste.nom,
b5cc0357
OL
567 )
568
53ae644d
OL
569 l.append(link)
570 return "<ul>%s</ul>" % "\n".join(l)
a7f013f5
JPC
571 _dossiers_postes.allow_tags = True
572 _dossiers_postes.short_description = u"Dossiers et postes"
53ae644d
OL
573
574 def queryset(self, request):
22343fe7 575 qs = super(EmployeAdmin, self).queryset(request)
53ae644d
OL
576 return qs.select_related(depth=1).order_by('nom')
577
578 def save_formset(self, request, form, formset, change):
579 instances = formset.save(commit=False)
580 for instance in instances:
581 if instance.__class__ == rh.EmployeCommentaire:
582 instance.owner = request.user
02e69aa2 583 instance.date_creation = datetime.datetime.now()
53ae644d
OL
584 instance.save()
585
22343fe7 586
08faf06e 587class EmployeProxyAdmin(EmployeAdmin):
22343fe7 588 list_display = ('_id', '_apercu', '_nom', '_organigramme')
08faf06e
JPC
589 list_display_links = ('_nom',)
590
22343fe7
OL
591 def has_add_permission(self, obj):
592 return False
593
08faf06e
JPC
594 def _organigramme(self, obj):
595 l = []
596 for d in obj.rh_dossiers.all().order_by('-date_debut'):
22343fe7
OL
597 poste = u"""<a title="Aperçu du poste"
598 href="%s"
599 onclick="return showAddAnotherPopup(this);"
600 title="Aperçu du poste">
601 <img src="%simg/loupe.png" />
602 </a>
603 <a href="%s">Poste</a>
604 &nbsp;""" % \
605 (reverse('poste_apercu', args=(d.poste.id,)),
606 settings.STATIC_URL,
607 reverse('admin:rh_poste_change', args=(d.poste.id,)))
608 organigramme = u"""<a href="%s">Organigramme</a>""" % \
609 (reverse('rho_employe', args=(d.poste.id,)))
835748f9 610 link = u"""<li>%s - %s - %s : [%s] %s</li>""" % \
08faf06e
JPC
611 (poste, organigramme,
612 d.date_debut.year,
613 d.poste.id,
614 d.poste.nom,
615 )
616 l.append(link)
617 return "<ul>%s</ul>" % "\n".join(l)
618
619 _organigramme.allow_tags = True
620 _organigramme.short_description = "Organigramme"
621
53ae644d 622
53ae644d
OL
623class EmployeCommentaireAdmin(admin.ModelAdmin):
624 pass
625
626
627class EmployePieceAdmin(admin.ModelAdmin):
628 pass
629
630
631class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
33232787 632 list_display = ('nom', '_date_modification', 'user_modification', )
53ae644d 633 inlines = (TypePosteInline,)
22343fe7
OL
634 fieldsets = AUFMetadataAdminMixin.fieldsets + (
635 (None, {'fields': ('nom', )}),)
53ae644d 636
33232787 637 def _date_modification(self, obj):
22343fe7
OL
638 return date(obj.date_modification) \
639 if obj.date_modification is not None else "(aucune)"
33232787
JPC
640 _date_modification.short_description = u'date modification'
641 _date_modification.admin_order_field = 'date_modification'
53ae644d 642
22343fe7 643
95b630cf 644class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
c5964dc2 645 search_fields = ('nom',)
22343fe7
OL
646 list_display = (
647 'nom',
648 'type',
649 'pays',
650 '_date_modification',
651 'user_modification',
652 )
c5964dc2 653 list_filter = ('type', )
53ae644d 654 inlines = (DossierROInline,)
22343fe7
OL
655 fieldsets = AUFMetadataAdminMixin.fieldsets + (
656 (None, {'fields': ('nom', 'type', 'pays',)}),
53ae644d
OL
657 )
658
33232787 659 def _date_modification(self, obj):
22343fe7
OL
660 return date(obj.date_modification) \
661 if obj.date_modification is not None else "(aucune)"
33232787
JPC
662 _date_modification.short_description = u'date modification'
663 _date_modification.admin_order_field = 'date_modification'
664
53ae644d 665
22343fe7
OL
666class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
667 ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
668 form = make_ajax_form(rh.Poste, {
669 'implantation': 'implantations',
670 'type_poste': 'typepostes',
671 'responsable': 'postes',
672 'valeur_point_min': 'valeurpoints',
673 'valeur_point_max': 'valeurpoints',
53ae644d
OL
674 })
675 alphabet_filter = 'nom'
22343fe7 676 search_fields = (
397bf8dd 677 'id',
22343fe7 678 'nom',
22343fe7
OL
679 'implantation__nom',
680 'implantation__region__code',
681 'implantation__region__nom',
682 'rh_dossiers__employe__nom',
683 'rh_dossiers__employe__prenom',
684 )
53ae644d 685 list_display = (
e49ac947 686 '_id',
8f3ca727 687 '_apercu',
22343fe7 688 '_nom',
53ae644d 689 '_occupe_par',
22343fe7
OL
690 'implantation',
691 '_service',
1ce2ddb9 692 '_responsable',
352fa696 693 'date_debut',
53ae644d 694 'date_fin',
33232787 695 '_date_modification',
53ae644d 696 'user_modification',
53ae644d 697 )
f614ca5c 698 list_filter = (
22343fe7 699 'implantation__region',
53ae644d 700 'implantation',
22343fe7 701 'service',
53ae644d
OL
702 'type_poste',
703 'type_poste__famille_emploi',
4c53dda4 704 'vacant',
53ae644d 705 )
e49ac947 706 list_display_links = ('_nom',)
53ae644d 707 fieldsets = AUFMetadataAdminMixin.fieldsets + (
22343fe7
OL
708 (None, {'fields': (
709 ('nom', 'nom_feminin'),
710 'implantation',
711 'type_poste',
712 'service',
713 'responsable',
714 )}
715 ),
53ae644d 716 ('Contrat', {
22343fe7
OL
717 'fields': ((
718 'regime_travail',
719 'regime_travail_nb_heure_semaine'),
720 )}
721 ),
53ae644d 722 ('Recrutement', {
22343fe7
OL
723 'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)}
724 ),
53ae644d 725 ('Rémunération', {
22343fe7
OL
726 'fields': (('classement_min',
727 'valeur_point_min',
728 'devise_min',
729 'salaire_min',
730 'indemn_min',
731 'autre_min',),
732 ('classement_max',
733 'valeur_point_max',
734 'devise_max',
735 'salaire_max',
736 'indemn_max',
737 'autre_max',),
738 )}),
53ae644d
OL
739 ('Comparatifs de rémunération', {
740 'fields': ('devise_comparaison',
741 ('comp_locale_min', 'comp_locale_max'),
742 ('comp_universite_min', 'comp_universite_max'),
743 ('comp_fonctionpub_min', 'comp_fonctionpub_max'),
744 ('comp_ong_min', 'comp_ong_max'),
22343fe7
OL
745 ('comp_autre_min', 'comp_autre_max'))}
746 ),
53ae644d 747 ('Justification', {
22343fe7
OL
748 'fields': ('justification',)}
749 ),
48a6df80 750 ('Autres Méta-données', {
22343fe7
OL
751 'fields': ('date_debut', 'date_fin')}
752 ),
53ae644d
OL
753 )
754
755 inlines = (PosteFinancementInline,
756 PostePieceInline,
757 DossierROInline,
6f037929 758 PosteComparaisonInline,
53ae644d
OL
759 PosteCommentaireInline, )
760
f614ca5c
OL
761 def lookup_allowed(self, key, value):
762 if key in (
763 'date_debut__gte',
764 'date_debut__isnull',
765 'date_fin__lte',
766 'date_fin__isnull',
7f4d1233
OL
767 'implantation__region__id__exact',
768 'implantation__id__exact',
769 'type_poste__id__exact',
770 'type_poste__famille_emploi__id__exact',
771 'service__id__exact',
d48f0922 772 'service__isnull',
7f4d1233 773 'vacant__exact',
c4a762e1 774 'vacant__isnull',
f614ca5c
OL
775 ):
776 return True
777
8f3ca727 778 def _apercu(self, poste):
22343fe7
OL
779 view_link = u"""<a onclick="return showAddAnotherPopup(this);"
780 title="Aperçu du poste"
781 href='%s'>
782 <img src="%simg/loupe.png" />
783 </a>""" % \
8f3ca727 784 (reverse('poste_apercu', args=(poste.id,)),
22343fe7
OL
785 settings.STATIC_URL,)
786 return view_link
8f3ca727 787 _apercu.allow_tags = True
e49ac947
JPC
788 _apercu.short_description = ''
789
790 def _id(self, obj):
791 return "%s" % obj.id
792 _id.short_description = '#'
793 _id.admin_order_field = 'id'
8f3ca727 794
c5964dc2 795 def _service(self, obj):
1b130b25
JPC
796 if obj.service.supprime:
797 return """<span style="color:red">%s</span>""" % obj.service
798 else:
799 return obj.service
6c2b1160 800 _service.short_description = 'Service'
1b130b25 801 _service.allow_tags = True
53ae644d 802
1ce2ddb9
JPC
803 def _responsable(self, obj):
804 try:
22343fe7
OL
805 responsable = u"""<a href="%s"
806 onclick="return showAddAnotherPopup(this)">
807 <img src="%simg/loupe.png"
808 title="Aperçu du poste" />
809 </a>
810 <a href="%s">%s</a>
811 <br />""" % \
812 (reverse('poste_apercu', args=(obj.responsable.id,)),
813 settings.STATIC_URL,
814 reverse('admin:rh_poste_change', args=(obj.responsable.id,)),
815 obj.responsable.nom)
1ce2ddb9
JPC
816 except:
817 responsable = ''
818
819 try:
1ce2ddb9 820 employe_id = obj.responsable.rh_dossiers.all()[0].id
22343fe7
OL
821 employe = u"""<br />
822 <a href="%s"
823 onclick="return showAddAnotherPopup(this)">
824 <img src="%simg/loupe.png"
825 title="Aperçu de l'employé">
826 </a>
827 <a href="%s">%s</a>""" % \
828 (reverse('employe_apercu', args=(employe_id,)),
829 settings.STATIC_URL,
830 reverse('admin:rh_employe_change', args=(employe_id,)),
831 employe)
1ce2ddb9
JPC
832 except:
833 employe = ""
834
835 return "%s %s" % (responsable, employe)
836 _responsable.short_description = 'Responsable'
837 _responsable.allow_tags = True
838
53ae644d 839 def _nom(self, poste):
e49ac947
JPC
840 return """<a href="%s">%s</a>""" % \
841 (reverse('admin:rh_poste_change', args=(poste.id,)),
22343fe7 842 poste.nom)
53ae644d
OL
843 _nom.allow_tags = True
844 _nom.short_description = u'Nom'
845 _nom.admin_order_field = 'nom'
846
33232787
JPC
847 def _date_modification(self, obj):
848 return date(obj.date_modification)
849 _date_modification.short_description = u'date modification'
850 _date_modification.admin_order_field = 'date_modification'
851
53ae644d
OL
852 def _occupe_par(self, obj):
853 """Formatte la méthode Poste.occupe_par() pour l'admin"""
15c5f55a 854 output = u"Vacant"
3195667e 855 if obj.date_fin is not None and obj.date_fin < datetime.date.now():
954ead19 856 return u"s/o"
53ae644d
OL
857 employes = obj.occupe_par()
858 if employes:
859 l = []
860 for e in employes:
22343fe7
OL
861 link = u"""<a href='%s'
862 title='Aperçu de l\'employer'
863 onclick='return showAddAnotherPopup(this)'>
864 <img src='%simg/loupe.png' />
865 </a>
866 <a href='%s'>%s</a>""" % \
b10920ea 867 (reverse('employe_apercu', args=(e.id,)),
822a2c33 868 settings.STATIC_URL,
b10920ea 869 reverse('admin:rh_employe_change', args=(e.id,)),
22343fe7 870 e)
53ae644d
OL
871 l.append(link)
872 output = "\n<br />".join(l)
873 return output
874 _occupe_par.allow_tags = True
22343fe7 875 _occupe_par.short_description = "Occupé par"
53ae644d
OL
876
877 def save_formset(self, request, form, formset, change):
878 instances = formset.save(commit=False)
879 for instance in instances:
880 if instance.__class__ == rh.PosteCommentaire:
881 instance.owner = request.user
02e69aa2 882 instance.date_creation = datetime.datetime.now()
53ae644d
OL
883 instance.save()
884 formset.save_m2m()
885
886
887class PosteCommentaireAdmin(admin.ModelAdmin):
888 pass
889
890
891class PosteFinancementAdmin(admin.ModelAdmin):
892 pass
893
894
895class PostePieceAdmin(admin.ModelAdmin):
896 fk_name = 'poste'
897
898
899class RemunerationAdmin(admin.ModelAdmin):
900 pass
901
902
903class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
22343fe7 904 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d
OL
905 (None, {
906 'fields': ('employe', 'implantation', ),
907 }),
908 )
22343fe7 909
53ae644d
OL
910
911class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
22343fe7
OL
912 list_display = (
913 'nom',
914 '_archive',
915 '_date_modification',
916 'user_modification',
917 )
cbb0373e 918 list_filter = ('archive', )
22343fe7 919 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d 920 (None, {
cbb0373e 921 'fields': ('nom', 'archive', ),
53ae644d
OL
922 }),
923 )
924
cbb0373e
OL
925 def _archive(self, obj):
926 if obj.archive:
927 return "oui"
928 else:
929 return "non"
930 _archive.short_description = u'Archivé'
931
33232787 932 def _date_modification(self, obj):
22343fe7
OL
933 return date(obj.date_modification) \
934 if obj.date_modification is not None else "(aucune)"
33232787
JPC
935 _date_modification.short_description = u'date modification'
936 _date_modification.admin_order_field = 'date_modification'
937
938
5c0f1778
JPC
939class ServiceProxyAdmin(ServiceAdmin):
940 list_display = ('nom', '_organigramme')
941 list_display_links = ('nom',)
942
943 def has_add_permission(self, obj):
944 return False
945
946 def _organigramme(self, obj):
82af5c19 947 return """<a href="%s">Organigramme</a>""" % (reverse('rho_implantation', args=(obj.id,)))
5c0f1778
JPC
948 _organigramme.allow_tags = True
949 _organigramme.short_description = "Organigramme"
950
53ae644d 951class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
33232787 952 list_display = ('code', 'nom', '_date_modification', 'user_modification', )
22343fe7 953 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d
OL
954 (None, {
955 'fields': ('code', 'nom', ),
956 }),
957 )
958
33232787 959 def _date_modification(self, obj):
22343fe7
OL
960 return date(obj.date_modification) \
961 if obj.date_modification is not None else "(aucune)"
33232787
JPC
962 _date_modification.short_description = u'date modification'
963 _date_modification.admin_order_field = 'date_modification'
964
22343fe7 965
53ae644d 966class TauxChangeAdmin(admin.ModelAdmin):
22343fe7
OL
967 list_display = (
968 'taux',
969 'devise',
970 'annee',
971 '_date_modification',
972 'user_modification',
973 )
53ae644d 974 list_filter = ('devise', )
22343fe7 975 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d
OL
976 (None, {
977 'fields': ('taux', 'devise', 'annee', ),
978 }),
979 )
980
33232787 981 def _date_modification(self, obj):
22343fe7
OL
982 return date(obj.date_modification) \
983 if obj.date_modification is not None else "(aucune)"
33232787
JPC
984 _date_modification.short_description = u'date modification'
985 _date_modification.admin_order_field = 'date_modification'
986
22343fe7 987
53ae644d 988class TypeContratAdmin(admin.ModelAdmin):
22343fe7
OL
989 list_display = (
990 'nom',
991 'nom_long',
992 '_date_modification',
993 'user_modification',
994 )
995 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d
OL
996 (None, {
997 'fields': ('nom', 'nom_long', ),
998 }),
999 )
1000
33232787 1001 def _date_modification(self, obj):
22343fe7
OL
1002 return date(obj.date_modification) \
1003 if obj.date_modification is not None else "(aucune)"
33232787
JPC
1004 _date_modification.short_description = u'date modification'
1005 _date_modification.admin_order_field = 'date_modification'
1006
53ae644d
OL
1007
1008class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
1009 search_fields = ('nom', 'nom_feminin', )
22343fe7
OL
1010 list_display = (
1011 'nom',
1012 'famille_emploi',
1013 '_date_modification',
1014 'user_modification',
1015 )
53ae644d 1016 list_filter = ('famille_emploi', )
22343fe7 1017 fieldsets = AUFMetadataAdminMixin.fieldsets + (
53ae644d 1018 (None, {
22343fe7
OL
1019 'fields': (
1020 'nom',
1021 'nom_feminin',
1022 'is_responsable',
1023 'famille_emploi',
1024 )}
1025 ),
53ae644d
OL
1026 )
1027
33232787 1028 def _date_modification(self, obj):
22343fe7
OL
1029 return date(obj.date_modification) \
1030 if obj.date_modification is not None else "(aucune)"
33232787
JPC
1031 _date_modification.short_description = u'date modification'
1032 _date_modification.admin_order_field = 'date_modification'
1033
53ae644d
OL
1034
1035class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
22343fe7
OL
1036 list_display = (
1037 'nom',
1038 'type_paiement',
1039 'nature_remuneration',
1040 '_date_modification',
1041 'user_modification',)
1042 fieldsets = AUFMetadataAdminMixin.fieldsets + (
1043 (None, {'fields': ('nom', 'type_paiement', 'nature_remuneration',)}),
53ae644d
OL
1044 )
1045
33232787 1046 def _date_modification(self, obj):
22343fe7
OL
1047 return date(obj.date_modification) \
1048 if obj.date_modification is not None else "(aucune)"
33232787
JPC
1049 _date_modification.short_description = u'date modification'
1050 _date_modification.admin_order_field = 'date_modification'
1051
53ae644d
OL
1052
1053class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
33232787 1054 list_display = ('nom', '_date_modification', 'user_modification', )
22343fe7
OL
1055 fieldsets = AUFMetadataAdminMixin.fieldsets + (
1056 (None, {'fields': ('nom', )}),
53ae644d
OL
1057 )
1058
33232787 1059 def _date_modification(self, obj):
22343fe7
OL
1060 return date(obj.date_modification) \
1061 if obj.date_modification is not None else "(aucune)"
33232787
JPC
1062 _date_modification.short_description = u'date modification'
1063 _date_modification.admin_order_field = 'date_modification'
1064
53ae644d
OL
1065
1066class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
22343fe7
OL
1067 list_display = (
1068 '_devise_code',
1069 '_devise_nom',
1070 'annee',
1071 'valeur',
1072 '_date_modification',
1073 'user_modification',
1074 )
c5964dc2 1075 list_filter = ('annee', 'devise', )
22343fe7
OL
1076 fieldsets = AUFMetadataAdminMixin.fieldsets + (
1077 (None, {'fields': ('valeur', 'devise', 'implantation', 'annee', )}),
53ae644d
OL
1078 )
1079
33232787 1080 def _date_modification(self, obj):
22343fe7
OL
1081 return date(obj.date_modification) \
1082 if obj.date_modification is not None else "(aucune)"
33232787
JPC
1083 _date_modification.short_description = u'date modification'
1084 _date_modification.admin_order_field = 'date_modification'
1085
53ae644d
OL
1086 def _devise_code(self, obj):
1087 return obj.devise.code
1088 _devise_code.short_description = "Code de la devise"
1089
1090 def _devise_nom(self, obj):
1091 return obj.devise.nom
1092 _devise_nom.short_description = "Nom de la devise"
1093
82af5c19
JPC
1094class ImplantationProxyAdmin(admin.ModelAdmin):
1095 list_display = ('nom', '_organigramme')
1096 list_display_links = ('nom',)
1097
1098 def has_add_permission(self, obj):
1099 return False
1100
1101 def _organigramme(self, obj):
1102 return """<a href="%s">Organigramme</a>""" % (reverse('rho_implantation', args=(obj.id,)))
1103 _organigramme.allow_tags = True
1104 _organigramme.short_description = "Organigramme"
1105
9da4c195
JPC
1106class RegionProxyAdmin(admin.ModelAdmin):
1107 list_display = ('nom', '_organigramme')
1108 list_display_links = ('nom',)
1109
1110 def has_add_permission(self, obj):
1111 return False
1112
1113 def _organigramme(self, obj):
1114 return """<a href="%s">Organigramme</a>""" % (reverse('rho_region', args=(obj.id,)))
1115 _organigramme.allow_tags = True
1116 _organigramme.short_description = "Organigramme"
1117
1118
82af5c19 1119
53ae644d
OL
1120
1121admin.site.register(rh.Classement, ClassementAdmin)
1122admin.site.register(rh.Devise, DeviseAdmin)
1123admin.site.register(rh.Dossier, DossierAdmin)
22343fe7 1124admin.site.register(EmployeProxy, EmployeProxyAdmin)
5c0f1778 1125admin.site.register(ServiceProxy, ServiceProxyAdmin)
53ae644d
OL
1126admin.site.register(rh.Employe, EmployeAdmin)
1127admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
1128admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
1129admin.site.register(rh.Poste, PosteAdmin)
1130admin.site.register(rh.ResponsableImplantation, ResponsableImplantationAdmin)
1131admin.site.register(rh.Service, ServiceAdmin)
c5964dc2 1132admin.site.register(rh.Statut, StatutAdmin)
53ae644d 1133admin.site.register(rh.TauxChange, TauxChangeAdmin)
c5964dc2 1134admin.site.register(rh.TypeContrat, TypeContratAdmin)
53ae644d
OL
1135admin.site.register(rh.TypePoste, TypePosteAdmin)
1136admin.site.register(rh.TypeRemuneration, TypeRemunerationAdmin)
1137admin.site.register(rh.TypeRevalorisation, TypeRevalorisationAdmin)
1138admin.site.register(rh.ValeurPoint, ValeurPointAdmin)
82af5c19 1139admin.site.register(ImplantationProxy, ImplantationProxyAdmin)
9da4c195 1140admin.site.register(RegionProxy, RegionProxyAdmin)