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