dont grap deleted thingS
[auf_rh_dae.git] / project / rh / admin.py
1 # -*- encoding: utf-8 -*-
2
3 from collections import defaultdict
4 import datetime
5
6 from django.db import models
7 from django import forms
8 from django.core.urlresolvers import reverse
9 from django.contrib import admin
10 from django.contrib.admin.views.main import ChangeList as DjangoChangeList
11 from django.conf import settings
12 from django.db.models import Q
13 from django.template.defaultfilters import date
14 from ajax_select import make_ajax_form
15 from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
16 from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
17 from dae.utils import get_employe_from_user
18 from groups import grp_drh
19 import models as rh
20 import filters
21
22 ################################################################################
23 # FILTRAGE PAR DATE
24 ################################################################################
25 class DateRangeMixin(object):
26 """
27 Mixin pour que le model admin utilise le changelist trafiqué permettant de filter par range
28 non strict.
29 Par défaut, le filtrage est configuré sur aujourd'hui, soit les actifs
30 """
31 date_borne_gauche = 'date_debut'
32 date_borne_droite = 'date_fin'
33 def get_changelist(self, request, **kwargs):
34 if request.META.has_key('HTTP_REFERER'):
35 referer = request.META['HTTP_REFERER']
36 referer = "/".join(referer.split('/')[3:])
37 referer = "/%s" % referer.split('?')[0]
38 change_list_view = 'admin:%s_%s_changelist' % (self.model._meta.app_label, self.model.__name__.lower())
39 if referer != reverse(change_list_view):
40 params = request.GET.copy()
41 today = datetime.date.today()
42 params.update({'%s__gte' % self.date_borne_gauche : str(today), '%s__lte' % self.date_borne_droite : str(today) })
43 request.GET = params
44 return ChangeList
45
46 class ChangeList(DjangoChangeList):
47
48 def __init__(self, *args, **kwargs):
49 super(ChangeList, self).__init__(*args, **kwargs)
50
51 def get_query_set(self):
52 old = self.params.copy()
53 date_debut = None
54 date_fin = None
55 for k, v in self.params.items():
56 if 'date_debut' in k:
57 prefix_debut = "".join(k.split('date_debut')[0:-1]) + 'date_debut'
58 date_debut = v
59 del self.params[k]
60 elif 'date_fin' in k:
61 prefix_fin = "".join(k.split('date_fin')[0:-1]) + 'date_fin'
62 date_fin = v
63 del self.params[k]
64 qs = super(ChangeList, self).get_query_set()
65
66 if date_fin is None and date_debut is not None:
67 date_fin = date_debut
68 prefix_fin = prefix_debut.replace('debut', 'fin')
69 if date_debut is None and date_fin is not None:
70 date_debut = date_fin
71 prefix_debut = prefix_fin.replace('fin', 'debut')
72
73 if date_debut is not None and date_fin is not None:
74 q_left = (Q(**{'%s__isnull' % prefix_debut : True}) | Q(**{'%s__lte' % prefix_debut : date_debut})) & (Q(**{'%s__gte' % prefix_fin : date_debut}) & Q(**{'%s__lte' % prefix_fin : date_fin}))
75 q_right = (Q(**{'%s__isnull' % prefix_fin : True}) | Q(**{'%s__gte' % prefix_fin : date_fin})) & (Q(**{'%s__gte' % prefix_debut : date_debut}) & Q(**{'%s__lte' % prefix_debut : date_fin}))
76 q_both = Q(**{'%s__isnull' % prefix_fin : True}) | Q(**{'%s__lte' % prefix_fin : date_fin}) & (Q(**{'%s__isnull' % prefix_debut : True}) | Q(**{'%s__gte' % prefix_debut : date_debut}))
77 q_non_supprime = Q(**{'%s__exact' % prefix_debut.replace('date_debut', 'supprime') : False})
78 q = (q_left | q_right | q_both) & q_non_supprime
79 qs = qs.filter(q).distinct()
80
81 self.params = old
82 return qs
83
84 ################################################################################
85
86 # Override of the InlineModelAdmin to support the link in the tabular inline
87 class LinkedInline(admin.options.InlineModelAdmin):
88 template = "admin/linked.html"
89 admin_model_path = None
90
91 def __init__(self, *args):
92 super(LinkedInline, self).__init__(*args)
93 if self.admin_model_path is None:
94 self.admin_model_path = self.model.__name__.lower()
95
96
97 class ProtectRegionMixin(object):
98
99 def queryset(self, request):
100 from dae.workflow import grp_drh, grp_correspondants_rh
101 qs = super(ProtectRegionMixin, self).queryset(request)
102
103 if request.user.is_superuser:
104 return qs
105
106 user_groups = request.user.groups.all()
107
108 if grp_drh in user_groups:
109 return qs
110
111 if grp_correspondants_rh in user_groups:
112 employe = get_employe_from_user(request.user)
113 q = Q(**{self.model.prefix_implantation: employe.implantation.region})
114 qs = qs.filter(q).distinct()
115 return qs
116 return qs.none()
117
118 def has_change_permission(self, request, obj=None):
119 user_groups = request.user.groups.all()
120
121 # Lock pour autoriser uniquement les DRH à utiliser RH
122 if not request.user.is_superuser and not grp_drh in user_groups:
123 return False
124
125 if len(user_groups) == 0 and not request.user.is_superuser:
126 return False
127
128 if obj is None:
129 return True
130 ids = [o.id for o in self.queryset(request)]
131 return obj.id in ids
132
133
134 # Inlines
135
136 class ReadOnlyInlineMixin(object):
137 def get_readonly_fields(self, request, obj=None):
138 return [f.name for f in self.model._meta.fields if f.name not in AUF_METADATA_READONLY_FIELDS]
139
140
141 class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
142 model = rh.AyantDroit
143 form = AyantDroitForm
144 extra = 0
145
146 fieldsets = (
147 (None, {
148 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
149 }),
150 )
151
152
153 class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
154 readonly_fields = ('owner', )
155 model = rh.AyantDroitCommentaire
156 extra = 1
157
158
159 class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
160 form = ContratForm
161 model = rh.Contrat
162 extra = 1
163
164
165 class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
166 template = "admin/rh/dossier/linked.html"
167 exclude = AUF_METADATA_READONLY_FIELDS
168 model = rh.Dossier
169 extra = 0
170 can_delete = False
171
172 def has_add_permission(self, request=None):
173 return False
174
175 def has_change_permission(self, request, obj=None):
176 return False
177
178 def has_delete_permission(self, request, obj=None):
179 return False
180
181
182 class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
183 readonly_fields = ('owner', )
184 model = rh.DossierCommentaire
185 extra = 1
186
187
188 class DossierPieceInline(admin.TabularInline):
189 model = rh.DossierPiece
190 extra = 4
191
192
193 class EmployeInline(admin.TabularInline):
194 model = rh.Employe
195
196 class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
197 readonly_fields = ('owner', )
198 model = rh.EmployeCommentaire
199 extra = 1
200
201
202 class EmployePieceInline(admin.TabularInline):
203 model = rh.EmployePiece
204 extra = 4
205
206
207 class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
208 readonly_fields = ('owner', )
209 model = rh.PosteCommentaire
210 extra = 1
211
212
213 class PosteFinancementInline(admin.TabularInline):
214 model = rh.PosteFinancement
215
216
217 class PostePieceInline(admin.TabularInline):
218 model = rh.PostePiece
219
220
221 class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
222 model = rh.Remuneration
223 extra = 1
224
225
226 class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
227 pass
228
229
230 class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
231 model = rh.TypePoste
232
233
234 class PosteComparaisonInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
235 model = rh.PosteComparaison
236
237
238 class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
239 list_display = ('_classement', 'date_modification', 'user_modification', )
240 fieldsets = AUFMetadataAdminMixin.fieldsets + (
241 (None, {
242 'fields': ('type', 'echelon', 'degre', 'coefficient', )
243 }),
244 )
245
246 def _classement(self, obj):
247 return unicode(obj)
248 _classement.short_description = u"Classement"
249
250 class CommentaireAdmin(admin.ModelAdmin):
251 pass
252
253
254 class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
255 list_display = ('code', 'nom', 'date_modification', 'user_modification', )
256 fieldsets = AUFMetadataAdminMixin.fieldsets + (
257 (None, {
258 'fields': ('code', 'nom', ),
259 }),
260 )
261
262
263 class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
264 alphabet_filter = 'employe__nom'
265 search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
266 list_display = (
267 '_id',
268 '_poste',
269 '_employe',
270 '_date_debut',
271 '_date_fin',
272 'date_modification',
273 'user_modification',
274 )
275 list_filter = (
276 'poste__implantation__region',
277 'poste__implantation',
278 'poste__type_poste',
279 'poste__type_poste__famille_emploi',
280 'rh_contrats__type_contrat',
281 'date_debut',
282 'date_fin',
283 )
284 inlines = (DossierPieceInline, ContratInline,
285 RemunerationInline,
286 DossierCommentaireInline,
287 )
288 fieldsets = AUFMetadataAdminMixin.fieldsets + (
289 (None, {
290 'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
291 }),
292 ('Recrutement', {
293 'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
294 }),
295 ('Rémunération', {
296 'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
297 }),
298 ('Occupation du Poste par cet Employe', {
299 'fields': (('date_debut', 'date_fin'), )
300 }),
301 )
302 form = make_ajax_form(rh.Dossier, {
303 'employe' : 'employes',
304 'poste' : 'postes',
305 'remplacement_de' : 'dossiers',
306 })
307
308 def lookup_allowed(self, key, value):
309 if key in (
310 'employe__nom__istartswith',
311 'poste__implantation__region__id__exact',
312 'poste__implantation__id__exact',
313 'poste__type_poste__id__exact',
314 'poste__type_poste__famille_emploi__id__exact',
315 'rh_contrats__type_contrat__id__exact',
316 'date_debut__gte',
317 'date_debut__isnull',
318 'date_fin__lte',
319 'date_fin__isnull',
320 ):
321 return True
322
323 def _id(self, d):
324 apercu_link = u"""<a title="Aperçu du dossier" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
325 (reverse('dossier_apercu', args=(d.id,)),
326 settings.STATIC_URL,
327 )
328 link = u"""%s&nbsp;<a href="%s" title="Modifier le dossier"><strong>%s</strong></a>""" % \
329 (apercu_link,
330 reverse('admin:rh_dossier_change', args=(d.id,)),
331 d.id,
332 )
333 return link
334 _id.allow_tags = True
335 _id.short_description = u"Dossier__#"
336 _id.admin_order_field = 'id'
337
338
339 def _date_debut(self, obj):
340 return date(obj.date_debut)
341
342 _date_debut.short_description = u'Occupation début'
343 _date_debut.admin_order_field = 'date_debut'
344
345 def _date_fin(self, obj):
346 return date(obj.date_fin)
347 _date_fin.short_description = u'Occupation fin'
348 _date_fin.admin_order_field = 'date_fin'
349
350 def _poste(self, dossier):
351 link = u"""<a title="Aperçu du poste" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a> <a href="%s" title="Modifier le poste">%s</a>""" % \
352 (reverse('poste_apercu', args=(dossier.poste.id,)),
353 settings.STATIC_URL,
354 reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
355 dossier.poste,
356 )
357 return link
358 _poste.allow_tags = True
359 _poste.short_description = u'Poste'
360 _poste.admin_order_field = 'poste__nom'
361
362 def _employe(self, obj):
363 employe = obj.employe
364 view_link = reverse('employe_apercu', args=(employe.id,))
365 edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
366
367 style = ""
368 view = u"""<a href="%s" title="Aperçu l'employé" onclick="return showAddAnotherPopup(this);"><img src="%simg/loupe.png" /></a>""" % (view_link, settings.STATIC_URL,)
369 return u"""%s<a href='%s' style="%s;">[%s] %s %s</a>""" % \
370 (view, edit_link, style, employe.id, employe.nom.upper(), employe.prenom.title())
371 _employe.allow_tags = True
372 _employe.short_description = u"Employé ([code] NOM Prénom)"
373 _employe.admin_order_field = "employe__nom"
374
375 def save_formset(self, request, form, formset, change):
376 instances = formset.save(commit=False)
377 for instance in instances:
378 if instance.__class__ == rh.DossierCommentaire:
379 instance.owner = request.user
380 instance.date_creation = datetime.datetime.now()
381 instance.save()
382
383
384 class DossierPieceAdmin(admin.ModelAdmin):
385 pass
386
387
388 class DossierCommentaireAdmin(admin.ModelAdmin):
389 pass
390
391
392 class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin,):
393 alphabet_filter = 'nom'
394 DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
395 search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
396 ordering = ('nom', )
397 form = EmployeAdminForm
398 list_display = ('_apercu', '_nom', '_dossiers', 'date_modification', 'user_modification', )
399 list_filter = ('rh_dossiers__poste__implantation__region', 'rh_dossiers__poste__implantation', 'nb_postes', 'rh_dossiers__date_debut', 'rh_dossiers__date_fin')
400 date_borne_gauche = 'rh_dossiers__date_debut'
401 date_borne_droite = 'rh_dossiers__date_fin'
402 inlines = (AyantDroitInline,
403 DossierROInline,
404 EmployePieceInline,
405 EmployeCommentaireInline)
406 fieldsets = AUFMetadataAdminMixin.fieldsets + (
407 ('Identification', {
408 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
409 }),
410 ('Informations personnelles', {
411 'fields': ('situation_famille', 'date_entree', )
412 }),
413 ('Coordonnées', {
414 'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
415 }),
416 )
417
418 def _apercu(self, obj):
419 return u"""<a title="Aperçu de l'employé" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
420 (reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
421 _apercu.allow_tags = True
422 _apercu.short_description = u""
423 _apercu.admin_order_field = ""
424
425 def _nom(self, obj):
426 edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
427 return u"""<a href='%s'><strong>[%s] %s %s</strong></a>""" % \
428 (edit_link, obj.id, obj.nom.upper(), obj.prenom.title(),)
429 _nom.allow_tags = True
430 _nom.short_description = u"Employé ([code] NOM Prénom)"
431 _nom.admin_order_field = "nom"
432
433 def _dossiers(self, obj):
434 l = []
435 for d in obj.rh_dossiers.all().order_by('-date_debut'):
436 apercu = u"""<a title="Aperçu du dossier" href="%s" onclick="return showAddAnotherPopup(this);" title="Aperçu du dossier"><img src="%simg/loupe.png" /></a>""" % \
437 (reverse('dossier_apercu', args=(d.id,)), settings.STATIC_URL,)
438 link = u"""<li>%s<a href='%s'>%s : %s</a></li>""" % \
439 (apercu,
440 reverse('admin:rh_dossier_change', args=(d.id,)),
441 d.date_debut.year,
442 d.poste,
443 )
444
445 # Dossier terminé en gris non cliquable
446 if d.date_fin is not None:
447 link = u"""<li style="color: grey">%s : %s</li>""" % \
448 (d.date_debut.year,
449 d.poste,
450 )
451
452 l.append(link)
453 return "<ul>%s</ul>" % "\n".join(l)
454 _dossiers.allow_tags = True
455 _dossiers.short_description = u"Dossiers"
456
457 def queryset(self, request):
458 qs = super(EmployeAdmin, self).queryset(request)
459 return qs.select_related(depth=1).order_by('nom')
460
461 def save_formset(self, request, form, formset, change):
462 instances = formset.save(commit=False)
463 for instance in instances:
464 if instance.__class__ == rh.EmployeCommentaire:
465 instance.owner = request.user
466 instance.date_creation = datetime.datetime.now()
467 instance.save()
468
469
470
471 class EmployeCommentaireAdmin(admin.ModelAdmin):
472 pass
473
474
475 class EmployePieceAdmin(admin.ModelAdmin):
476 pass
477
478
479 class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
480 list_display = ('nom', 'date_modification', 'user_modification', )
481 inlines = (TypePosteInline,)
482 fieldsets = AUFMetadataAdminMixin.fieldsets + (
483 (None, {
484 'fields': ('nom', )
485 }),
486 )
487
488
489 class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
490 search_fields = ('nom',)
491 list_display = ('nom', 'type', 'pays', 'date_modification', 'user_modification', )
492 list_filter = ('type', )
493 inlines = (DossierROInline,)
494 fieldsets = AUFMetadataAdminMixin.fieldsets + (
495 (None, {
496 'fields': ('nom', 'type', 'pays', )
497 }),
498 )
499
500
501 class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
502 form = make_ajax_form(rh.Poste, {
503 'implantation' : 'implantations',
504 'type_poste' : 'typepostes',
505 'responsable' : 'postes',
506 'valeur_point_min' : 'valeurpoints',
507 'valeur_point_max' : 'valeurpoints',
508 })
509 alphabet_filter = 'nom'
510 search_fields = ('nom',
511 'implantation__code',
512 'implantation__nom',
513 'implantation__region__code',
514 'implantation__region__nom',
515 )
516 list_display = (
517 '_apercu',
518 '_nom',
519 '_occupe_par',
520 'implantation',
521 '_service',
522 'date_debut',
523 'date_fin',
524 'date_modification',
525 'user_modification',
526 )
527 list_filter = (
528 'service',
529 'implantation__region',
530 'implantation',
531 'type_poste',
532 'type_poste__famille_emploi',
533 'date_debut',
534 'date_fin',
535 'vacant',
536 )
537 fieldsets = AUFMetadataAdminMixin.fieldsets + (
538 (None, {
539 'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
540 'service', 'responsable')
541 }),
542 ('Contrat', {
543 'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
544 }),
545 ('Recrutement', {
546 'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)
547 }),
548 ('Rémunération', {
549 'fields': (('classement_min', 'valeur_point_min', 'devise_min', 'salaire_min', 'indemn_min', 'autre_min', ),
550 ('classement_max', 'valeur_point_max' ,'devise_max', 'salaire_max', 'indemn_max', 'autre_max', ),
551 )
552 }),
553 ('Comparatifs de rémunération', {
554 'fields': ('devise_comparaison',
555 ('comp_locale_min', 'comp_locale_max'),
556 ('comp_universite_min', 'comp_universite_max'),
557 ('comp_fonctionpub_min', 'comp_fonctionpub_max'),
558 ('comp_ong_min', 'comp_ong_max'),
559 ('comp_autre_min', 'comp_autre_max'))
560 }),
561 ('Justification', {
562 'fields': ('justification',)
563 }),
564 ('Autres Méta-données', {
565 'fields': ('date_debut', 'date_fin')
566 }),
567 )
568
569 inlines = (PosteFinancementInline,
570 PostePieceInline,
571 DossierROInline,
572 PosteComparaisonInline,
573 PosteCommentaireInline, )
574
575
576 def lookup_allowed(self, key, value):
577 if key in (
578 'date_debut__gte',
579 'date_debut__isnull',
580 'date_fin__lte',
581 'date_fin__isnull',
582 'implantation__region__id__exact',
583 'implantation__id__exact',
584 'type_poste__id__exact',
585 'type_poste__famille_emploi__id__exact',
586 'service__id__exact',
587 'vacant__exact',
588 ):
589 return True
590
591
592 def _apercu(self, poste):
593 view_link = u"""<a onclick="return showAddAnotherPopup(this);" title="Aperçu du poste" href='%s'><img src="%simg/loupe.png" /></a>""" % \
594 (reverse('poste_apercu', args=(poste.id,)),
595 settings.STATIC_URL,
596 )
597 edit_link = u"""<a href="%s" title="Modifier le poste"><strong>%s</strong></a>""" % \
598 (reverse('admin:rh_poste_change', args=(poste.id,)),
599 poste.id,
600 )
601 return view_link + edit_link
602 _apercu.allow_tags = True
603 _apercu.short_description = 'Poste __#'
604 _apercu.admin_order_field = 'id'
605
606 def _service(self, obj):
607 return obj.service
608
609 def _nom(self, poste):
610 return poste.nom
611 _nom.allow_tags = True
612 _nom.short_description = u'Nom'
613 _nom.admin_order_field = 'nom'
614
615 def _occupe_par(self, obj):
616 """Formatte la méthode Poste.occupe_par() pour l'admin"""
617 output = u"Vacant"
618 if obj.date_fin is not None and obj.date_fin < datetime.date.now():
619 return u"s/o"
620 employes = obj.occupe_par()
621 if employes:
622 l = []
623 for e in employes:
624 link = "<a href='%s' title='Aperçu de l\'employer' onclick='return showAddAnotherPopup(this)'><img src='%simg/loupe.png' /></a> <a href='%s'>%s</a>" % \
625 (reverse('employe_apercu', args=(e.id,)),
626 settings.STATIC_URL,
627 reverse('admin:rh_employe_change', args=(e.id,)),
628 e
629 )
630 l.append(link)
631 output = "\n<br />".join(l)
632 return output
633 _occupe_par.allow_tags = True
634 _occupe_par.short_description = "Occupé par"
635
636 def save_formset(self, request, form, formset, change):
637 instances = formset.save(commit=False)
638 for instance in instances:
639 if instance.__class__ == rh.PosteCommentaire:
640 instance.owner = request.user
641 instance.date_creation = datetime.datetime.now()
642 instance.save()
643 formset.save_m2m()
644
645
646 class PosteCommentaireAdmin(admin.ModelAdmin):
647 pass
648
649
650 class PosteFinancementAdmin(admin.ModelAdmin):
651 pass
652
653
654 class PostePieceAdmin(admin.ModelAdmin):
655 fk_name = 'poste'
656
657
658 class RemunerationAdmin(admin.ModelAdmin):
659 pass
660
661
662 class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
663 fieldsets = AUFMetadataAdminMixin.fieldsets + (
664 (None, {
665 'fields': ('employe', 'implantation', ),
666 }),
667 )
668
669
670 class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
671 list_display = ('nom', 'date_modification', 'user_modification', )
672 fieldsets = AUFMetadataAdminMixin.fieldsets + (
673 (None, {
674 'fields': ('nom', ),
675 }),
676 )
677
678 class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
679 list_display = ('code', 'nom', 'date_modification', 'user_modification', )
680 fieldsets = AUFMetadataAdminMixin.fieldsets + (
681 (None, {
682 'fields': ('code', 'nom', ),
683 }),
684 )
685
686 class TauxChangeAdmin(admin.ModelAdmin):
687 list_display = ('taux', 'devise', 'annee', 'date_modification', 'user_modification', )
688 list_filter = ('devise', )
689 fieldsets = AUFMetadataAdminMixin.fieldsets + (
690 (None, {
691 'fields': ('taux', 'devise', 'annee', ),
692 }),
693 )
694
695 class TypeContratAdmin(admin.ModelAdmin):
696 list_display = ('nom', 'nom_long', 'date_modification', 'user_modification', )
697 fieldsets = AUFMetadataAdminMixin.fieldsets + (
698 (None, {
699 'fields': ('nom', 'nom_long', ),
700 }),
701 )
702
703
704 class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
705 search_fields = ('nom', 'nom_feminin', )
706 list_display = ('nom', 'famille_emploi', 'date_modification', 'user_modification', )
707 list_filter = ('famille_emploi', )
708 fieldsets = AUFMetadataAdminMixin.fieldsets + (
709 (None, {
710 'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi', )
711 }),
712 )
713
714
715 class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
716 list_display = ('nom', 'type_paiement', 'nature_remuneration', 'date_modification', 'user_modification', )
717 fieldsets = AUFMetadataAdminMixin.fieldsets + (
718 (None, {
719 'fields': ('nom', 'type_paiement', 'nature_remuneration', )
720 }),
721 )
722
723
724 class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
725 list_display = ('nom', 'date_modification', 'user_modification', )
726 fieldsets = AUFMetadataAdminMixin.fieldsets + (
727 (None, {
728 'fields': ('nom', )
729 }),
730 )
731
732
733 class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
734 list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur', 'date_modification', 'user_modification', )
735 list_filter = ('annee', 'devise', )
736 fieldsets = AUFMetadataAdminMixin.fieldsets + (
737 (None, {
738 'fields': ('valeur', 'devise', 'implantation', 'annee', )
739 }),
740 )
741
742 def _devise_code(self, obj):
743 return obj.devise.code
744 _devise_code.short_description = "Code de la devise"
745
746 def _devise_nom(self, obj):
747 return obj.devise.nom
748 _devise_nom.short_description = "Nom de la devise"
749
750
751 admin.site.register(rh.Classement, ClassementAdmin)
752 admin.site.register(rh.Devise, DeviseAdmin)
753 admin.site.register(rh.Dossier, DossierAdmin)
754 admin.site.register(rh.Employe, EmployeAdmin)
755 admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
756 admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
757 admin.site.register(rh.Poste, PosteAdmin)
758 admin.site.register(rh.ResponsableImplantation, ResponsableImplantationAdmin)
759 admin.site.register(rh.Service, ServiceAdmin)
760 admin.site.register(rh.Statut, StatutAdmin)
761 admin.site.register(rh.TauxChange, TauxChangeAdmin)
762 admin.site.register(rh.TypeContrat, TypeContratAdmin)
763 admin.site.register(rh.TypePoste, TypePosteAdmin)
764 admin.site.register(rh.TypeRemuneration, TypeRemunerationAdmin)
765 admin.site.register(rh.TypeRevalorisation, TypeRevalorisationAdmin)
766 admin.site.register(rh.ValeurPoint, ValeurPointAdmin)