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