-# -*- encoding: utf-8
+# -*- encoding: utf-8 -*-
+
+from collections import defaultdict
+import datetime
+
+from django.db import models
+from django import forms
+from django.core.urlresolvers import reverse
from django.contrib import admin
-from rh.models import *
-from rh.lib import *
-
-AyantDroitInline.model = AyantDroit
-AyantDroitCommentaireInline.model = AyantDroitCommentaire
-ContratInline.model = Contrat
-DossierROInline.model = Dossier
-DossierCommentaireInline.model = DossierCommentaire
-DossierPieceInline.model = DossierPiece
-EmployeInline.model = Employe
-EmployeCommentaireInline.model = EmployeCommentaire
-EmployePieceInline.model = EmployePiece
-#EvenementInline.model = Evenement
-#EvenementRemunerationInline.model = EvenementRemuneration
-PosteCommentaireInline.model = PosteCommentaire
-PosteFinancementInline.model = PosteFinancement
-PostePieceInline.model = PostePiece
-RemunerationInline.model = Remuneration
-TypePosteInline.model = TypePoste
-
-#admin.site.register(AyantDroit, AyantDroitAdmin)
-#admin.site.register(AyantDroitCommentaire, AyantDroitCommentaireAdmin)
-admin.site.register(Classement, ClassementAdmin)
-#admin.site.register(Commentaire, CommentaireAdmin)
-#admin.site.register(Contrat, ContratAdmin)
-admin.site.register(Devise, DeviseAdmin)
-admin.site.register(Dossier, DossierAdmin)
-#admin.site.register(DossierCommentaire, DossierCommentaireAdmin)
-#admin.site.register(DossierPiece, DossierPieceAdmin)
-admin.site.register(Employe, EmployeAdmin)
-#admin.site.register(EmployeCommentaire, EmployeCommentaireAdmin)
-#admin.site.register(EmployePiece, EmployePieceAdmin)
-#admin.site.register(Evenement, EvenementAdmin)
-#admin.site.register(EvenementRemuneration, EvenementRemunerationAdmin)
-admin.site.register(FamilleEmploi, FamilleEmploiAdmin)
-admin.site.register(OrganismeBstg, OrganismeBstgAdmin)
-admin.site.register(Poste, PosteAdmin)
-#admin.site.register(PosteCommentaire, PosteCommentaireAdmin)
-#admin.site.register(PosteFinancement, PosteFinancementAdmin)
-#admin.site.register(PostePiece, PostePieceAdmin)
-#admin.site.register(Remuneration, RemunerationAdmin)
-admin.site.register(ResponsableImplantation, ResponsableImplantationAdmin)
-admin.site.register(Service, ServiceAdmin)
-admin.site.register(Statut, StatutAdmin) # FIXME: timeout in admin
-admin.site.register(TauxChange, TauxChangeAdmin)
-admin.site.register(TypeContrat, TypeContratAdmin) # FIXME: timeout in admin
-admin.site.register(TypePoste, TypePosteAdmin)
-admin.site.register(TypeRemuneration, TypeRemunerationAdmin)
-admin.site.register(TypeRevalorisation, TypeRevalorisationAdmin)
-admin.site.register(ValeurPoint, ValeurPointAdmin)
+from django.conf import settings
+from django.db.models import Q
+from ajax_select import make_ajax_form
+from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
+from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
+from dae.utils import get_employe_from_user
+import models as rh
+
+# Override of the InlineModelAdmin to support the link in the tabular inline
+class LinkedInline(admin.options.InlineModelAdmin):
+ template = "admin/linked.html"
+ admin_model_path = None
+
+ def __init__(self, *args):
+ super(LinkedInline, self).__init__(*args)
+ if self.admin_model_path is None:
+ self.admin_model_path = self.model.__name__.lower()
+
+
+class ProtectRegionMixin(object):
+
+ def queryset(self, request):
+ from dae.workflow import grp_drh, grp_correspondants_rh
+ qs = super(ProtectRegionMixin, self).queryset(request)
+
+ if request.user.is_superuser:
+ return qs
+
+ user_groups = request.user.groups.all()
+
+ if grp_drh in user_groups:
+ return qs
+
+ if grp_correspondants_rh in user_groups:
+ employe = get_employe_from_user(request.user)
+ q = Q(**{self.model.prefix_implantation: employe.implantation.region})
+ qs = qs.filter(q).distinct()
+ return qs
+ return qs.none()
+
+ def has_change_permission(self, request, obj=None):
+ if obj is None:
+ return True
+ ids = [o.id for o in self.queryset(request)]
+ return obj.id in ids
+
+
+# Inlines
+
+class ReadOnlyInlineMixin(object):
+ def get_readonly_fields(self, request, obj=None):
+ return [f.name for f in self.model._meta.fields if f.name not in AUF_METADATA_READONLY_FIELDS]
+
+
+class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
+ model = rh.AyantDroit
+ form = AyantDroitForm
+ extra = 0
+
+ fieldsets = (
+ (None, {
+ 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
+ }),
+ )
+
+
+class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ readonly_fields = ('owner', )
+ model = rh.AyantDroitCommentaire
+ extra = 1
+
+
+class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ form = ContratForm
+ model = rh.Contrat
+ extra = 1
+
+
+class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
+ template = "admin/rh/dossier/linked.html"
+ exclude = AUF_METADATA_READONLY_FIELDS
+ model = rh.Dossier
+ extra = 0
+ can_delete = False
+
+ def has_add_permission(self, request=None):
+ return False
+
+ def has_change_permission(self, request, obj=None):
+ return False
+
+ def has_delete_permission(self, request, obj=None):
+ return False
+
+
+class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ readonly_fields = ('owner', )
+ model = rh.DossierCommentaire
+ extra = 1
+
+
+class DossierPieceInline(admin.TabularInline):
+ model = rh.DossierPiece
+ extra = 4
+
+
+class EmployeInline(admin.TabularInline):
+ model = rh.Employe
+
+class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ readonly_fields = ('owner', )
+ model = rh.EmployeCommentaire
+ extra = 1
+
+
+class EmployePieceInline(admin.TabularInline):
+ model = rh.EmployePiece
+ extra = 4
+
+
+#class EvenementInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+# model = rh.Evenement
+# extra = 1
+
+
+#class EvenementRemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+# model = EvenementRemuneration
+# extra = 1
+
+#class EvenementAdmin(admin.ModelAdmin):
+# inlines = (EvenementRemunerationInline,)
+#
+#
+#class EvenementRemunerationAdmin(admin.ModelAdmin):
+# pass
+
+
+class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ readonly_fields = ('owner', )
+ model = rh.PosteCommentaire
+ extra = 1
+
+
+class PosteFinancementInline(admin.TabularInline):
+ model = rh.PosteFinancement
+
+
+class PostePieceInline(admin.TabularInline):
+ model = rh.PostePiece
+
+
+class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ model = rh.Remuneration
+ extra = 1
+
+
+class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
+ pass
+
+
+class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+ model = rh.TypePoste
+
+
+class AyantDroitAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+ """
+ L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
+ """
+ alphabet_filter = 'nom'
+ search_fields = ('nom', 'prenom', 'employe__nom', 'employe__prenom', )
+ list_display = ('_employe', 'lien_parente', '_ayantdroit', )
+ inlines = (AyantDroitCommentaireInline,)
+ readonly_fields = AUFMetadataAdminMixin.readonly_fields + ('employe',)
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ ("Lien avec l'employé", {
+ 'fields': (('employe', 'lien_parente'), )
+ }),
+
+ ('Identification', {
+ 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
+ }),
+ )
+
+ def save_formset(self, request, form, formset, change):
+ instances = formset.save(commit=False)
+ for instance in instances:
+ if instance.__class__ == rh.AyantDroitCommentaire:
+ instance.owner = request.user
+ instance.save()
+
+ def _ayantdroit(self, obj):
+ return unicode(obj)
+ _ayantdroit.short_description = u'Ayant droit'
+
+ def _employe(self, obj):
+ return unicode(obj.employe)
+ _employe.short_description = u'Employé'
+
+ def has_add_permission(self, request):
+ return False
+
+class AyantDroitCommentaireAdmin(admin.ModelAdmin):
+ pass
+
+
+class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('type', 'echelon', 'degre', 'coefficient', )
+ }),
+ )
+
+
+class CommentaireAdmin(admin.ModelAdmin):
+ pass
+
+
+#class ContratAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+# form = ContratForm
+# alphabet_filter = 'dossier__employe__nom'
+# search_fields = ('dossier__employe__nom', 'dossier__employe__prenom', 'dossier__poste__nom', 'dossier__poste__nom_feminin', )
+# list_display = ('id', '_employe', '_poste', 'date_debut', 'date_fin', '_implantation', )
+# fieldsets = AUFMetadataAdminMixin.fieldsets + (
+# (None, {
+# 'fields': ('dossier', 'type_contrat', 'date_debut', 'date_fin', )
+# }),
+# )
+#
+# def lookup_allowed(self, key, value):
+# if key in ('dossier__employe__nom__istartswith', ):
+# return True
+#
+# def _employe(self, obj):
+# return unicode(obj.dossier.employe)
+# _employe.short_description = "Employé"
+#
+# def _poste(self, obj):
+# return obj.dossier.poste.nom
+# _poste.short_description = "Poste"
+#
+# def _implantation(self, obj):
+# return obj.dossier.poste.implantation
+# _poste.short_description = "Implantation"
+
+class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('code', 'nom', ),
+ }),
+ )
+
+
+class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
+ alphabet_filter = 'employe__nom'
+ search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
+ list_display = (
+ '_id',
+ '_poste',
+ '_employe',
+ '_date_debut',
+ '_date_fin',
+ 'date_modification',
+ 'actif',
+ )
+ list_filter = (
+ 'poste__implantation__region',
+ 'poste__implantation',
+ 'poste__type_poste',
+ 'poste__type_poste__famille_emploi',
+ 'rh_contrats__type_contrat',
+ 'actif',
+ )
+ inlines = (DossierPieceInline, ContratInline,
+ RemunerationInline,
+ #EvenementInline,
+ DossierCommentaireInline,
+ )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
+ }),
+ ('Recrutement', {
+ 'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
+ }),
+ ('Rémunération', {
+ 'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
+ }),
+ ('Occupation du Poste par cet Employe', {
+ 'fields': (('date_debut', 'date_fin'), )
+ }),
+ )
+ form = make_ajax_form(rh.Dossier, {
+ 'employe' : 'employes',
+ 'poste' : 'postes',
+ 'remplacement_de' : 'dossiers',
+ })
+
+ def lookup_allowed(self, key, value):
+ if key in (
+ 'employe__nom__istartswith',
+ 'actif__exact',
+ 'poste__implantation__region__id__exact',
+ 'poste__implantation__id__exact',
+ 'poste__type_poste__id__exact',
+ 'poste__type_poste__famille_emploi__id__exact',
+ 'rh_contrats__type_contrat__id__exact',
+ ):
+ return True
+
+ def _id(self, d):
+ link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % \
+ (reverse('dossier_apercu', args=(d.id,)),
+ d.id,
+ reverse('admin:rh_dossier_change', args=(d.id,)),
+ settings.MEDIA_URL,
+ )
+ return link
+ _id.allow_tags = True
+ _id.short_description = u'#'
+ _id.admin_order_field = 'id'
+
+
+ def _actif(self, dossier):
+ if dossier.employe.actif:
+ html = """<img alt="True" src="%simg/admin/icon-yes.gif">"""
+ else:
+ html = """<img alt="False" src="%simg/admin/icon-no.gif">"""
+ return html % settings.ADMIN_MEDIA_PREFIX
+ _actif.allow_tags = True
+ _actif.short_description = u'Employé actif'
+ _actif.admin_order_field = 'employe__actif'
+
+ def _date_debut(self, obj):
+ return obj.date_debut
+ _date_debut.short_description = u'Occupation début'
+ _date_debut.admin_order_field = 'date_debut'
+
+ def _date_fin(self, obj):
+ return obj.date_fin
+ _date_fin.short_description = u'Occupation fin'
+ _date_fin.admin_order_field = 'date_fin'
+
+ def _poste(self, dossier):
+ link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
+ (reverse('poste_apercu', args=(dossier.poste.id,)),
+ dossier.poste,
+ reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
+ settings.MEDIA_URL,
+ )
+ return link
+ _poste.allow_tags = True
+ _poste.short_description = u'Poste'
+ _poste.admin_order_field = 'poste__nom'
+
+ def _employe(self, obj):
+ employe = obj.employe
+ view_link = reverse('employe_apercu', args=(employe.id,))
+ edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
+
+ if employe.actif == False:
+ style = "color: grey";
+ edit = ""
+ else:
+ style = ""
+ edit = u"""<a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % (edit_link, settings.MEDIA_URL,)
+ return u"""<a onclick="return showAddAnotherPopup(this);" href='%s' style="%s;">[%s] %s %s</a>%s
+ """ % \
+ (view_link, style, employe.id, employe.nom.upper(), employe.prenom.title(), edit)
+ _employe.allow_tags = True
+ _employe.short_description = u"Employé ([code] NOM Prénom)"
+ _employe.admin_order_field = "employe__nom"
+
+ def save_formset(self, request, form, formset, change):
+ instances = formset.save(commit=False)
+ for instance in instances:
+ if instance.__class__ == rh.DossierCommentaire:
+ instance.owner = request.user
+ instance.save()
+
+
+class DossierPieceAdmin(admin.ModelAdmin):
+ pass
+
+
+class DossierCommentaireAdmin(admin.ModelAdmin):
+ pass
+
+
+class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+ alphabet_filter = 'nom'
+ DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
+ ordering = ('nom', )
+ form = EmployeAdminForm
+ list_display = ('_nom', '_dossiers', 'date_modification', 'user_modification', 'actif',)
+ list_filter = ('rh_dossiers__poste__implantation__region', 'rh_dossiers__poste__implantation', 'actif', )
+ inlines = (AyantDroitInline,
+ DossierROInline,
+ EmployePieceInline,
+ EmployeCommentaireInline)
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ ('Identification', {
+ 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
+ }),
+ ('Informations personnelles', {
+ 'fields': ('situation_famille', 'date_entree', )
+ }),
+ ('Coordonnées', {
+ 'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
+ }),
+ )
+
+ def _nom(self, obj):
+ view_link = reverse('employe_apercu', args=(obj.id,))
+ edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
+ return u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>[%s] %s %s</a>
+ <a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % \
+ (view_link, obj.id, obj.nom.upper(), obj.prenom.title(), edit_link, settings.MEDIA_URL,)
+ _nom.allow_tags = True
+ _nom.short_description = u"Employé ([code] NOM Prénom)"
+ _nom.admin_order_field = "nom"
+
+ def _dossiers(self, obj):
+ l = []
+ for d in obj.rh_dossiers.all().order_by('-date_debut'):
+ style = ""
+ edit = u"""<a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % (reverse('admin:rh_dossier_change', args=(d.id,)), settings.MEDIA_URL,)
+ if d.date_fin is not None:
+ edit = ""
+ style = u"color: grey";
+ link = u"""<li><a style="%s;" onclick="return showAddAnotherPopup(this);" href='%s'>%s : %s</a>%s</li>""" % \
+ (style,
+ reverse('dossier_apercu', args=(d.id,)),
+ d.date_debut.year,
+ d.poste,
+ edit,
+ )
+ l.append(link)
+ return "<ul>%s</ul>" % "\n".join(l)
+ _dossiers.allow_tags = True
+ _dossiers.short_description = u"Dossiers"
+
+ def queryset(self, request):
+ qs = super(EmployeAdmin, self).queryset(request)
+ return qs.select_related(depth=1).order_by('nom')
+
+ def save_formset(self, request, form, formset, change):
+ instances = formset.save(commit=False)
+ for instance in instances:
+ if instance.__class__ == rh.EmployeCommentaire:
+ instance.owner = request.user
+ instance.save()
+
+
+
+class EmployeCommentaireAdmin(admin.ModelAdmin):
+ pass
+
+
+class EmployePieceAdmin(admin.ModelAdmin):
+ pass
+
+
+class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ inlines = (TypePosteInline,)
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', )
+ }),
+ )
+
+
+class OrganismeBstgAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+ search_fields = ('nom', )
+ list_display = ('nom', 'type', 'pays', )
+ inlines = (DossierROInline,)
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', 'type', 'pays', )
+ }),
+ )
+
+
+class PosteAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
+ form = make_ajax_form(rh.Poste, {
+ 'implantation' : 'implantations',
+ 'type_poste' : 'typepostes',
+ 'responsable' : 'postes',
+ 'valeur_point_min' : 'valeurpoints',
+ 'valeur_point_max' : 'valeurpoints',
+ })
+ alphabet_filter = 'nom'
+ search_fields = ('nom',
+ 'implantation__code',
+ 'implantation__nom',
+ 'implantation__region__code',
+ 'implantation__region__nom',
+ )
+ list_display = (
+ '_nom',
+ '_occupe_par',
+ 'implantation',
+ 'service',
+ 'date_debut',
+ 'date_fin',
+ 'date_modification',
+ 'user_modification',
+ 'actif',
+ )
+ list_filter = ('service',
+ 'implantation__region',
+ 'implantation',
+ 'type_poste',
+ 'type_poste__famille_emploi',
+ 'actif',
+ )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
+ 'service', 'responsable')
+ }),
+ ('Contrat', {
+ 'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
+ }),
+ ('Recrutement', {
+ 'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)
+ }),
+ ('Rémunération', {
+ 'fields': (('classement_min', 'valeur_point_min', 'devise_min', 'salaire_min', 'indemn_min', 'autre_min', ),
+ ('classement_max', 'valeur_point_max' ,'devise_max', 'salaire_max', 'indemn_max', 'autre_max', ),
+ )
+ }),
+ ('Comparatifs de rémunération', {
+ 'fields': ('devise_comparaison',
+ ('comp_locale_min', 'comp_locale_max'),
+ ('comp_universite_min', 'comp_universite_max'),
+ ('comp_fonctionpub_min', 'comp_fonctionpub_max'),
+ ('comp_ong_min', 'comp_ong_max'),
+ ('comp_autre_min', 'comp_autre_max'))
+ }),
+ ('Justification', {
+ 'fields': ('justification',)
+ }),
+ ('Autres Metadata', {
+ 'fields': ('date_debut', 'date_fin')
+ }),
+ )
+
+ inlines = (PosteFinancementInline,
+ PostePieceInline,
+ DossierROInline,
+ PosteCommentaireInline, )
+
+
+ def _nom(self, poste):
+ link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
+ (reverse('poste_apercu', args=(poste.id,)),
+ poste.nom,
+ reverse('admin:rh_poste_change', args=(poste.id,)),
+ settings.MEDIA_URL,
+ )
+ return link
+ _nom.allow_tags = True
+ _nom.short_description = u'Nom'
+ _nom.admin_order_field = 'nom'
+
+ def _occupe_par(self, obj):
+ """Formatte la méthode Poste.occupe_par() pour l'admin"""
+ output = "VACANT"
+ employes = obj.occupe_par()
+ if employes:
+ l = []
+ for e in employes:
+ link = "<a href='%s'>%s</a>" % \
+ (reverse('admin:rh_employe_change', args=(e.id,)),
+ e)
+ l.append(link)
+ output = "\n<br />".join(l)
+ return output
+ _occupe_par.allow_tags = True
+ _occupe_par.short_description = "Occupé par"
+
+ def save_formset(self, request, form, formset, change):
+ instances = formset.save(commit=False)
+ for instance in instances:
+ if instance.__class__ == rh.PosteCommentaire:
+ instance.owner = request.user
+ instance.save()
+ formset.save_m2m()
+
+
+class PosteCommentaireAdmin(admin.ModelAdmin):
+ pass
+
+
+class PosteFinancementAdmin(admin.ModelAdmin):
+ pass
+
+
+class PostePieceAdmin(admin.ModelAdmin):
+ fk_name = 'poste'
+
+
+class RemunerationAdmin(admin.ModelAdmin):
+ pass
+
+
+class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('employe', 'implantation', ),
+ }),
+ )
+
+
+class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ list_display = ('nom', 'actif', )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', ),
+ }),
+ )
+
+class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('code', 'nom', ),
+ }),
+ )
+
+class TauxChangeAdmin(admin.ModelAdmin):
+ list_display = ('taux', 'devise', 'annee', )
+ list_filter = ('devise', )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('taux', 'devise', 'annee', ),
+ }),
+ )
+
+class TypeContratAdmin(admin.ModelAdmin):
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', 'nom_long', ),
+ }),
+ )
+
+
+class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ search_fields = ('nom', 'nom_feminin', )
+ list_display = ('nom', 'famille_emploi', )
+ list_filter = ('famille_emploi', )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi', )
+ }),
+ )
+
+
+class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ list_display = ('nom', 'type_paiement', 'nature_remuneration', )
+ #inlines = (RemunerationROInline,) utilité?
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', 'type_paiement', 'nature_remuneration', )
+ }),
+ )
+
+
+class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ #inlines = (RemunerationROInline,) utilité?
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('nom', )
+ }),
+ )
+
+
+class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur', )
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
+ (None, {
+ 'fields': ('valeur', 'devise', 'implantation', 'annee', )
+ }),
+ )
+
+ def _devise_code(self, obj):
+ return obj.devise.code
+ _devise_code.short_description = "Code de la devise"
+
+ def _devise_nom(self, obj):
+ return obj.devise.nom
+ _devise_nom.short_description = "Nom de la devise"
+
+
+admin.site.register(rh.Classement, ClassementAdmin)
+admin.site.register(rh.Devise, DeviseAdmin)
+admin.site.register(rh.Dossier, DossierAdmin)
+admin.site.register(rh.Employe, EmployeAdmin)
+admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
+admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
+admin.site.register(rh.Poste, PosteAdmin)
+admin.site.register(rh.ResponsableImplantation, ResponsableImplantationAdmin)
+admin.site.register(rh.Service, ServiceAdmin)
+admin.site.register(rh.Statut, StatutAdmin) # FIXME: timeout in admin
+admin.site.register(rh.TauxChange, TauxChangeAdmin)
+admin.site.register(rh.TypeContrat, TypeContratAdmin) # FIXME: timeout in admin
+admin.site.register(rh.TypePoste, TypePosteAdmin)
+admin.site.register(rh.TypeRemuneration, TypeRemunerationAdmin)
+admin.site.register(rh.TypeRevalorisation, TypeRevalorisationAdmin)
+admin.site.register(rh.ValeurPoint, ValeurPointAdmin)
-# -*- encoding: utf-8 -*-
-
-from collections import defaultdict
-import datetime
-
-from django.db import models
-from django import forms
-from django.core.urlresolvers import reverse
-from django.contrib import admin
-from django.conf import settings
-from django.db.models import Q
-from ajax_select import make_ajax_form
-from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
-from project.rh import models as rh
-from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
-from dae.utils import get_employe_from_user
-
-
-# Override of the InlineModelAdmin to support the link in the tabular inline
-class LinkedInline(admin.options.InlineModelAdmin):
- template = "admin/linked.html"
- admin_model_path = None
-
- def __init__(self, *args):
- super(LinkedInline, self).__init__(*args)
- if self.admin_model_path is None:
- self.admin_model_path = self.model.__name__.lower()
-
-
-class ProtectRegionMixin(object):
-
- def queryset(self, request):
- from dae.workflow import grp_drh, grp_correspondants_rh
- qs = super(ProtectRegionMixin, self).queryset(request)
-
- if request.user.is_superuser:
- return qs
-
- user_groups = request.user.groups.all()
-
- if grp_drh in user_groups:
- return qs
-
- if grp_correspondants_rh in user_groups:
- employe = get_employe_from_user(request.user)
- q = Q(**{self.model.prefix_implantation: employe.implantation.region})
- qs = qs.filter(q).distinct()
- return qs
- return qs.none()
-
- def has_change_permission(self, request, obj=None):
- if obj is None:
- return True
- ids = [o.id for o in self.queryset(request)]
- return obj.id in ids
-
-
-# Inlines
-
-class ReadOnlyInlineMixin(object):
- def get_readonly_fields(self, request, obj=None):
- return [f.name for f in self.model._meta.fields if f.name not in AUF_METADATA_READONLY_FIELDS]
-
-
-class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
- model = models.Model # à remplacer dans admin.py
- form = AyantDroitForm
- extra = 0
-
- fieldsets = (
- (None, {
- 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
- }),
- )
-
-
-class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- readonly_fields = ('owner', )
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- form = ContratForm
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
- template = "admin/rh/dossier/linked.html"
- exclude = AUF_METADATA_READONLY_FIELDS
- model = models.Model # à remplacer dans admin.py
- extra = 0
- can_delete = False
-
- def has_add_permission(self, request=None):
- return False
-
- def has_change_permission(self, request, obj=None):
- return False
-
- def has_delete_permission(self, request, obj=None):
- return False
-
-
-class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- readonly_fields = ('owner', )
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class DossierPieceInline(admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
- extra = 4
-
-
-class EmployeInline(admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
-
-class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- readonly_fields = ('owner', )
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class EmployePieceInline(admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
- extra = 4
-
-
-class EvenementInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class EvenementRemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- readonly_fields = ('owner', )
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class PosteFinancementInline(admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
-
-
-class PostePieceInline(admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
-
-
-class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
- extra = 1
-
-
-class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
- pass
-
-
-class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
- model = models.Model # à remplacer dans admin.py
-
-
-# Admins
-
-class AyantDroitAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
- """
- L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
- """
- alphabet_filter = 'nom'
- search_fields = ('nom', 'prenom', 'employe__nom', 'employe__prenom', )
- list_display = ('_employe', 'lien_parente', '_ayantdroit', )
- inlines = (AyantDroitCommentaireInline,)
- readonly_fields = AUFMetadataAdminMixin.readonly_fields + ('employe',)
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- ("Lien avec l'employé", {
- 'fields': (('employe', 'lien_parente'), )
- }),
-
- ('Identification', {
- 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
- }),
- )
-
- def save_formset(self, request, form, formset, change):
- instances = formset.save(commit=False)
- for instance in instances:
- if instance.__class__ == rh.AyantDroitCommentaire:
- instance.owner = request.user
- instance.save()
-
- def _ayantdroit(self, obj):
- return unicode(obj)
- _ayantdroit.short_description = u'Ayant droit'
-
- def _employe(self, obj):
- return unicode(obj.employe)
- _employe.short_description = u'Employé'
-
- def has_add_permission(self, request):
- return False
-
-class AyantDroitCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('type', 'echelon', 'degre', 'coefficient', )
- }),
- )
-
-
-class CommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-#class ContratAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-# form = ContratForm
-# alphabet_filter = 'dossier__employe__nom'
-# search_fields = ('dossier__employe__nom', 'dossier__employe__prenom', 'dossier__poste__nom', 'dossier__poste__nom_feminin', )
-# list_display = ('id', '_employe', '_poste', 'date_debut', 'date_fin', '_implantation', )
-# fieldsets = AUFMetadataAdminMixin.fieldsets + (
-# (None, {
-# 'fields': ('dossier', 'type_contrat', 'date_debut', 'date_fin', )
-# }),
-# )
-#
-# def lookup_allowed(self, key, value):
-# if key in ('dossier__employe__nom__istartswith', ):
-# return True
-#
-# def _employe(self, obj):
-# return unicode(obj.dossier.employe)
-# _employe.short_description = "Employé"
-#
-# def _poste(self, obj):
-# return obj.dossier.poste.nom
-# _poste.short_description = "Poste"
-#
-# def _implantation(self, obj):
-# return obj.dossier.poste.implantation
-# _poste.short_description = "Implantation"
-
-class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('code', 'nom', ),
- }),
- )
-
-
-class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
- alphabet_filter = 'employe__nom'
- search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
- list_display = (
- '_id',
- '_poste',
- '_employe',
- '_date_debut',
- '_date_fin',
- 'date_modification',
- 'actif',
- )
- list_filter = (
- 'poste__implantation__region',
- 'poste__implantation',
- 'poste__type_poste',
- 'poste__type_poste__famille_emploi',
- 'rh_contrats__type_contrat',
- 'actif',
- )
- inlines = (DossierPieceInline, ContratInline,
- RemunerationInline,
- #EvenementInline,
- DossierCommentaireInline,
- )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
- }),
- ('Recrutement', {
- 'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
- }),
- ('Rémunération', {
- 'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
- }),
- ('Occupation du Poste par cet Employe', {
- 'fields': (('date_debut', 'date_fin'), )
- }),
- )
- form = make_ajax_form(rh.Dossier, {
- 'employe' : 'employes',
- 'poste' : 'postes',
- 'remplacement_de' : 'dossiers',
- })
-
- def lookup_allowed(self, key, value):
- if key in (
- 'employe__nom__istartswith',
- 'actif__exact',
- 'poste__implantation__region__id__exact',
- 'poste__implantation__id__exact',
- 'poste__type_poste__id__exact',
- 'poste__type_poste__famille_emploi__id__exact',
- 'rh_contrats__type_contrat__id__exact',
- ):
- return True
-
- def _id(self, d):
- link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % \
- (reverse('dossier_apercu', args=(d.id,)),
- d.id,
- reverse('admin:rh_dossier_change', args=(d.id,)),
- settings.MEDIA_URL,
- )
- return link
- _id.allow_tags = True
- _id.short_description = u'#'
- _id.admin_order_field = 'id'
-
-
- def _actif(self, dossier):
- if dossier.employe.actif:
- html = """<img alt="True" src="%simg/admin/icon-yes.gif">"""
- else:
- html = """<img alt="False" src="%simg/admin/icon-no.gif">"""
- return html % settings.ADMIN_MEDIA_PREFIX
- _actif.allow_tags = True
- _actif.short_description = u'Employé actif'
- _actif.admin_order_field = 'employe__actif'
-
- def _date_debut(self, obj):
- return obj.date_debut
- _date_debut.short_description = u'Occupation début'
- _date_debut.admin_order_field = 'date_debut'
-
- def _date_fin(self, obj):
- return obj.date_fin
- _date_fin.short_description = u'Occupation fin'
- _date_fin.admin_order_field = 'date_fin'
-
- def _poste(self, dossier):
- link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
- (reverse('poste_apercu', args=(dossier.poste.id,)),
- dossier.poste,
- reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
- settings.MEDIA_URL,
- )
- return link
- _poste.allow_tags = True
- _poste.short_description = u'Poste'
- _poste.admin_order_field = 'poste__nom'
-
- def _employe(self, obj):
- employe = obj.employe
- view_link = reverse('employe_apercu', args=(employe.id,))
- edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
-
- if employe.actif == False:
- style = "color: grey";
- edit = ""
- else:
- style = ""
- edit = u"""<a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % (edit_link, settings.MEDIA_URL,)
- return u"""<a onclick="return showAddAnotherPopup(this);" href='%s' style="%s;">[%s] %s %s</a>%s
- """ % \
- (view_link, style, employe.id, employe.nom.upper(), employe.prenom.title(), edit)
- _employe.allow_tags = True
- _employe.short_description = u"Employé ([code] NOM Prénom)"
- _employe.admin_order_field = "employe__nom"
-
- def save_formset(self, request, form, formset, change):
- instances = formset.save(commit=False)
- for instance in instances:
- if instance.__class__ == rh.DossierCommentaire:
- instance.owner = request.user
- instance.save()
-
-
-class DossierPieceAdmin(admin.ModelAdmin):
- pass
-
-
-class DossierCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
- alphabet_filter = 'nom'
- DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
- ordering = ('nom', )
- form = EmployeAdminForm
- list_display = ('_nom', '_dossiers', 'date_modification', 'user_modification', 'actif',)
- list_filter = ('rh_dossiers__poste__implantation__region', 'rh_dossiers__poste__implantation', 'actif', )
- inlines = (AyantDroitInline,
- DossierROInline,
- EmployePieceInline,
- EmployeCommentaireInline)
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- ('Identification', {
- 'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
- }),
- ('Informations personnelles', {
- 'fields': ('situation_famille', 'date_entree', )
- }),
- ('Coordonnées', {
- 'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
- }),
- )
-
- def _nom(self, obj):
- view_link = reverse('employe_apercu', args=(obj.id,))
- edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
- return u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>[%s] %s %s</a>
- <a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % \
- (view_link, obj.id, obj.nom.upper(), obj.prenom.title(), edit_link, settings.MEDIA_URL,)
- _nom.allow_tags = True
- _nom.short_description = u"Employé ([code] NOM Prénom)"
- _nom.admin_order_field = "nom"
-
- def _dossiers(self, obj):
- l = []
- for d in obj.rh_dossiers.all().order_by('-date_debut'):
- style = ""
- edit = u"""<a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % (reverse('admin:rh_dossier_change', args=(d.id,)), settings.MEDIA_URL,)
- if d.date_fin is not None:
- edit = ""
- style = u"color: grey";
- link = u"""<li><a style="%s;" onclick="return showAddAnotherPopup(this);" href='%s'>%s : %s</a>%s</li>""" % \
- (style,
- reverse('dossier_apercu', args=(d.id,)),
- d.date_debut.year,
- d.poste,
- edit,
- )
- l.append(link)
- return "<ul>%s</ul>" % "\n".join(l)
- _dossiers.allow_tags = True
- _dossiers.short_description = u"Dossiers"
-
- def queryset(self, request):
- qs = super(EmployeAdmin, self).queryset(request)
- return qs.select_related(depth=1).order_by('nom')
-
- def save_formset(self, request, form, formset, change):
- instances = formset.save(commit=False)
- for instance in instances:
- if instance.__class__ == rh.EmployeCommentaire:
- instance.owner = request.user
- instance.save()
-
-
-
-class EmployeCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class EmployePieceAdmin(admin.ModelAdmin):
- pass
-
-
-class EvenementAdmin(admin.ModelAdmin):
- inlines = (EvenementRemunerationInline,)
-
-
-class EvenementRemunerationAdmin(admin.ModelAdmin):
- pass
-
-
-class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- inlines = (TypePosteInline,)
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', )
- }),
- )
-
-
-class OrganismeBstgAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
- search_fields = ('nom', )
- list_display = ('nom', 'type', 'pays', )
- inlines = (DossierROInline,)
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', 'type', 'pays', )
- }),
- )
-
-
-class PosteAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
- form = make_ajax_form(rh.Poste, {
- 'implantation' : 'implantations',
- 'type_poste' : 'typepostes',
- 'responsable' : 'postes',
- 'valeur_point_min' : 'valeurpoints',
- 'valeur_point_max' : 'valeurpoints',
- })
- alphabet_filter = 'nom'
- search_fields = ('nom',
- 'implantation__code',
- 'implantation__nom',
- 'implantation__region__code',
- 'implantation__region__nom',
- )
- list_display = (
- '_nom',
- '_occupe_par',
- 'implantation',
- 'service',
- 'date_debut',
- 'date_fin',
- 'date_modification',
- 'user_modification',
- 'actif',
- )
- list_filter = ('service',
- 'implantation__region',
- 'implantation',
- 'type_poste',
- 'type_poste__famille_emploi',
- 'actif',
- )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
- 'service', 'responsable')
- }),
- ('Contrat', {
- 'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
- }),
- ('Recrutement', {
- 'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)
- }),
- ('Rémunération', {
- 'fields': (('classement_min', 'valeur_point_min', 'devise_min', 'salaire_min', 'indemn_min', 'autre_min', ),
- ('classement_max', 'valeur_point_max' ,'devise_max', 'salaire_max', 'indemn_max', 'autre_max', ),
- )
- }),
- ('Comparatifs de rémunération', {
- 'fields': ('devise_comparaison',
- ('comp_locale_min', 'comp_locale_max'),
- ('comp_universite_min', 'comp_universite_max'),
- ('comp_fonctionpub_min', 'comp_fonctionpub_max'),
- ('comp_ong_min', 'comp_ong_max'),
- ('comp_autre_min', 'comp_autre_max'))
- }),
- ('Justification', {
- 'fields': ('justification',)
- }),
- ('Autres Metadata', {
- 'fields': ('date_debut', 'date_fin')
- }),
- )
-
- inlines = (PosteFinancementInline,
- PostePieceInline,
- DossierROInline,
- PosteCommentaireInline, )
-
-
- def _nom(self, poste):
- link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
- (reverse('poste_apercu', args=(poste.id,)),
- poste.nom,
- reverse('admin:rh_poste_change', args=(poste.id,)),
- settings.MEDIA_URL,
- )
- return link
- _nom.allow_tags = True
- _nom.short_description = u'Nom'
- _nom.admin_order_field = 'nom'
-
- def _occupe_par(self, obj):
- """Formatte la méthode Poste.occupe_par() pour l'admin"""
- output = "VACANT"
- employes = obj.occupe_par()
- if employes:
- l = []
- for e in employes:
- link = "<a href='%s'>%s</a>" % \
- (reverse('admin:rh_employe_change', args=(e.id,)),
- e)
- l.append(link)
- output = "\n<br />".join(l)
- return output
- _occupe_par.allow_tags = True
- _occupe_par.short_description = "Occupé par"
-
- def save_formset(self, request, form, formset, change):
- instances = formset.save(commit=False)
- for instance in instances:
- if instance.__class__ == rh.PosteCommentaire:
- instance.owner = request.user
- instance.save()
- formset.save_m2m()
-
-
-class PosteCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class PosteFinancementAdmin(admin.ModelAdmin):
- pass
-
-
-class PostePieceAdmin(admin.ModelAdmin):
- fk_name = 'poste'
-
-
-class RemunerationAdmin(admin.ModelAdmin):
- pass
-
-
-class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('employe', 'implantation', ),
- }),
- )
-
-
-class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- list_display = ('nom', 'actif', )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', ),
- }),
- )
-
-class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('code', 'nom', ),
- }),
- )
-
-class TauxChangeAdmin(admin.ModelAdmin):
- list_display = ('taux', 'devise', 'annee', )
- list_filter = ('devise', )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('taux', 'devise', 'annee', ),
- }),
- )
-
-class TypeContratAdmin(admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', 'nom_long', ),
- }),
- )
-
-
-class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- search_fields = ('nom', 'nom_feminin', )
- list_display = ('nom', 'famille_emploi', )
- list_filter = ('famille_emploi', )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi', )
- }),
- )
-
-
-class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- list_display = ('nom', 'type_paiement', 'nature_remuneration', )
- #inlines = (RemunerationROInline,) utilité?
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', 'type_paiement', 'nature_remuneration', )
- }),
- )
-
-
-class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- #inlines = (RemunerationROInline,) utilité?
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('nom', )
- }),
- )
-
-
-class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur', )
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('valeur', 'devise', 'implantation', 'annee', )
- }),
- )
-
- def _devise_code(self, obj):
- return obj.devise.code
- _devise_code.short_description = "Code de la devise"
-
- def _devise_nom(self, obj):
- return obj.devise.nom
- _devise_nom.short_description = "Nom de la devise"
-
def calc_remun(dossier):
thisyear = datetime.date.today().year
remun[n] = [sums[n], sums_euro[n]]
return remun, remun_sum, remun_sum_euro
+
+