Création à la volée des évaluations à chaque fois qu'on affiche la liste
[auf_rh_dae.git] / project / recrutement / admin.py
index 79bd6da..c2b14aa 100644 (file)
@@ -2,7 +2,7 @@
 
 import textwrap
 
 
 import textwrap
 
-from auf.django.emploi.models import OffreEmploi, Candidat, CandidatPiece
+from auf.django.emploi.models import CandidatPiece, Candidat, OffreEmploi
 from auf.django.references.models import Region, Bureau, Implantation
 from django.conf import settings
 from django.contrib import admin
 from auf.django.references.models import Region, Bureau, Implantation
 from django.conf import settings
 from django.contrib import admin
@@ -19,13 +19,15 @@ from django.shortcuts import redirect
 from reversion.admin import VersionAdmin
 
 from project import groups
 from reversion.admin import VersionAdmin
 
 from project import groups
+from project.permissions import get_user_groupnames
 
 from project.rh import models as rh
 from project.recrutement.forms import OffreEmploiForm
 from project.recrutement.models import \
         Evaluateur, CandidatEvaluation, \
         ProxyOffreEmploi, ProxyCandidat, MesCandidatEvaluation, \
 
 from project.rh import models as rh
 from project.recrutement.forms import OffreEmploiForm
 from project.recrutement.models import \
         Evaluateur, CandidatEvaluation, \
         ProxyOffreEmploi, ProxyCandidat, MesCandidatEvaluation, \
-        CourrielTemplate
+        CourrielTemplate, OffreEmploiEvaluateur
+
 
 ### CONSTANTES
 IMPLANTATIONS_CENTRALES = [15, 19]
 
 ### CONSTANTES
 IMPLANTATIONS_CENTRALES = [15, 19]
@@ -104,7 +106,7 @@ class OffreEmploiAdminMixin(BaseAdmin):
     ### Afficher la liste des candidats pour l'offre d'emploi
     def _candidatsList(self, obj):
         return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
     ### Afficher la liste des candidats pour l'offre d'emploi
     def _candidatsList(self, obj):
         return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
-            </a>" % (reverse('admin:emploi_candidat_changelist'), obj.id)
+            </a>" % (reverse('admin:recrutement_proxycandidat_changelist'), obj.id)
     _candidatsList.allow_tags = True
     _candidatsList.short_description = "Afficher la liste des candidats"
 
     _candidatsList.allow_tags = True
     _candidatsList.short_description = "Afficher la liste des candidats"
 
@@ -112,50 +114,53 @@ class OffreEmploiAdminMixin(BaseAdmin):
     def get_form(self, request, obj=None, **kwargs):
         form = super(OffreEmploiAdminMixin, self).get_form(request, obj, **kwargs)
         employe = groups.get_employe_from_user(request.user)
     def get_form(self, request, obj=None, **kwargs):
         form = super(OffreEmploiAdminMixin, self).get_form(request, obj, **kwargs)
         employe = groups.get_employe_from_user(request.user)
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
 
         # Region
 
         # Region
-        if 'region' in form.declared_fields:
+        region_field = None
+        if 'region' in form.declared_fields.keys():
             region_field = form.declared_fields['region']
             region_field = form.declared_fields['region']
-        else:
+        if 'region' in form.base_fields.keys():
             region_field = form.base_fields['region']
             region_field = form.base_fields['region']
-
-        if groups.DRH_NIVEAU_1 in user_groupes or \
-           groups.DRH_NIVEAU_2 in user_groupes or \
-           groups.HAUTE_DIRECTION in user_groupes:
-            region_field.queryset = Region.objects.all()
-        else:
-            region_field.queryset = Region.objects.\
+        if region_field:
+            if groups.DRH_NIVEAU_1 in user_groupes or \
+               groups.DRH_NIVEAU_2 in user_groupes or \
+               groups.HAUTE_DIRECTION in user_groupes:
+                region_field.queryset = Region.objects.all()
+            else:
+                region_field.queryset = Region.objects.\
                                     filter(id=employe.implantation.region.id)
 
         # Poste
                                     filter(id=employe.implantation.region.id)
 
         # Poste
-        if 'poste' in form.declared_fields:
+        poste_field = None
+        if 'poste' in form.declared_fields.keys():
             poste_field = form.declared_fields['poste']
             poste_field = form.declared_fields['poste']
-        else:
+        if 'poste' in form.base_fields.keys():
             poste_field = form.base_fields['poste']
             poste_field = form.base_fields['poste']
-
-        if groups.DRH_NIVEAU_1 in user_groupes or \
-           groups.DRH_NIVEAU_2 in user_groupes or \
-           groups.HAUTE_DIRECTION in user_groupes:
-            poste_field.queryset = rh.Poste.objects.all()
-        else:
-            poste_field.queryset = rh.Poste.objects.\
-                    filter(implantation__region=employe.implantation.region).\
-                    exclude(implantation__in=IMPLANTATIONS_CENTRALES)
+        if poste_field:
+            if groups.DRH_NIVEAU_1 in user_groupes or \
+               groups.DRH_NIVEAU_2 in user_groupes or \
+               groups.HAUTE_DIRECTION in user_groupes:
+                poste_field.queryset = rh.Poste.objects.all()
+            else:
+                poste_field.queryset = rh.Poste.objects.\
+                        filter(implantation__region=employe.implantation.region).\
+                        exclude(implantation__in=IMPLANTATIONS_CENTRALES)
 
         # Bureau
 
         # Bureau
-        if 'bureau' in form.declared_fields:
+        bureau_field = None
+        if 'bureau' in form.declared_fields.keys():
             bureau_field = form.declared_fields['bureau']
             bureau_field = form.declared_fields['bureau']
-        else:
+        if 'bureau' in form.base_fields.keys():
             bureau_field = form.base_fields['bureau']
             bureau_field = form.base_fields['bureau']
-
-        if groups.DRH_NIVEAU_1 in user_groupes or \
-            groups.DRH_NIVEAU_2 in user_groupes or \
-            groups.HAUTE_DIRECTION in user_groupes:
-            bureau_field.queryset = Bureau.objects.all()
-        else:
-            bureau_field.queryset = \
-                    Bureau.objects.filter(region=employe.implantation.region)
+        if bureau_field:
+            if groups.DRH_NIVEAU_1 in user_groupes or \
+                groups.DRH_NIVEAU_2 in user_groupes or \
+                groups.HAUTE_DIRECTION in user_groupes:
+                bureau_field.queryset = Bureau.objects.all()
+            else:
+                bureau_field.queryset = \
+                        Bureau.objects.filter(region=employe.implantation.region)
 
         return form
 
 
         return form
 
@@ -164,7 +169,7 @@ class OffreEmploiAdminMixin(BaseAdmin):
     def queryset(self, request):
         qs = self.model._default_manager.get_query_set() \
                 .select_related('offre_emploi')
     def queryset(self, request):
         qs = self.model._default_manager.get_query_set() \
                 .select_related('offre_emploi')
-        user_groupes = request.user.groups.all()
+        user_groupes = get_user_groupnames(request.user)
         if groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
         if groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
@@ -190,7 +195,7 @@ class OffreEmploiAdminMixin(BaseAdmin):
 
     ### Permission add, delete, change
     def has_add_permission(self, request):
 
     ### Permission add, delete, change
     def has_add_permission(self, request):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
@@ -201,31 +206,52 @@ class OffreEmploiAdminMixin(BaseAdmin):
         return False
 
     def has_delete_permission(self, request, obj=None):
         return False
 
     def has_delete_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
-            groups.DIRECTEUR_DE_BUREAU in user_groupes or \
-            groups.ADMINISTRATEURS in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
             return True
             groups.HAUTE_DIRECTION in user_groupes:
             return True
+
+        if obj is not None:
+            employe = groups.get_employe_from_user(request.user)
+            if (groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+                groups.ADMINISTRATEURS in user_groupes) and ( 
+                employe.implantation.region == obj.lieu_affectation.region):
+                return True
+
         return False
 
     def has_change_permission(self, request, obj=None):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
-            groups.DIRECTEUR_DE_BUREAU in user_groupes or \
-            groups.ADMINISTRATEURS in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
             return True
             groups.HAUTE_DIRECTION in user_groupes:
             return True
+
+        if obj is not None:
+            employe = groups.get_employe_from_user(request.user)
+            if (groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+                groups.ADMINISTRATEURS in user_groupes) and ( 
+                employe.implantation.region == obj.lieu_affectation.region):
+                return True
+        else:
+            if  groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+                    groups.ADMINISTRATEURS in user_groupes:
+                return True
+
+
         return False
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'lieu_affectation':
         return False
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'lieu_affectation':
-            employe = groups.get_employe_from_user(request.user)
-            kwargs["queryset"] = Implantation.objects.filter(region=employe.implantation.region)
+            user_groupes = [g.name for g in request.user.groups.all()]
+            if not (request.user.is_superuser is True or \
+                groups.DRH_NIVEAU_1 in user_groupes or \
+                groups.DRH_NIVEAU_2 in user_groupes):
+                employe = groups.get_employe_from_user(request.user)
+                kwargs["queryset"] = Implantation.objects.filter(region=employe.implantation.region)
             return db_field.formfield(**kwargs)
         return super(OffreEmploiAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
             return db_field.formfield(**kwargs)
         return super(OffreEmploiAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
@@ -265,11 +291,6 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdminMixin):
     def response_change(self, request, obj):
         return redirect('admin:recrutement_proxyoffreemploi_changelist')
 
     def response_change(self, request, obj):
         return redirect('admin:recrutement_proxyoffreemploi_changelist')
 
-    ### Formulaire
-    def get_form(self, request, obj=None, **kwargs):
-        form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
-        return form
-
     ### Permissions add, delete, change
     def has_add_permission(self, request):
         return False
     ### Permissions add, delete, change
     def has_add_permission(self, request):
         return False
@@ -278,16 +299,6 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdminMixin):
         return False
 
     def has_change_permission(self, request, obj=None):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
-        if request.user.is_superuser is True or \
-            groups.CORRESPONDANT_RH in user_groupes or \
-            groups.DRH_NIVEAU_1 in user_groupes or \
-            groups.DRH_NIVEAU_2 in user_groupes or \
-            groups.DIRECTEUR_DE_BUREAU in user_groupes or \
-            groups.ADMINISTRATEURS in user_groupes or \
-            groups.HAUTE_DIRECTION in user_groupes:
-            return True
-
         if obj is not None:
             return True
 
         if obj is not None:
             return True
 
@@ -489,7 +500,7 @@ class CandidatAdminMixin(BaseAdmin, ExportAdmin):
 
     ### Permissions add, delete, change
     def has_add_permission(self, request):
 
     ### Permissions add, delete, change
     def has_add_permission(self, request):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
@@ -501,7 +512,7 @@ class CandidatAdminMixin(BaseAdmin, ExportAdmin):
         return False
 
     def has_delete_permission(self, request, obj=None):
         return False
 
     def has_delete_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
@@ -513,7 +524,7 @@ class CandidatAdminMixin(BaseAdmin, ExportAdmin):
         return False
 
     def has_change_permission(self, request, obj=None):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
         if request.user.is_superuser is True or \
             groups.CORRESPONDANT_RH in user_groupes or \
             groups.DRH_NIVEAU_1 in user_groupes or \
@@ -527,7 +538,15 @@ class CandidatAdminMixin(BaseAdmin, ExportAdmin):
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'offre_emploi':
             employe = groups.get_employe_from_user(request.user)
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'offre_emploi':
             employe = groups.get_employe_from_user(request.user)
-            kwargs["queryset"] = OffreEmploi.objects.filter(region=employe.implantation.region)
+            user_groupes = [g.name for g in request.user.groups.all()]
+            if request.user.is_superuser is True or \
+                groups.CORRESPONDANT_RH in user_groupes or \
+                groups.DRH_NIVEAU_1 in user_groupes or \
+                groups.DRH_NIVEAU_2 in user_groupes:
+                qs_offres = OffreEmploi.objects.all()
+            else:
+                qs_offres =OffreEmploi.objects.filter(region=employe.implantation.region)
+            kwargs["queryset"] = qs_offres
             return db_field.formfield(**kwargs)
         return super(CandidatAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
             return db_field.formfield(**kwargs)
         return super(CandidatAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
@@ -546,7 +565,7 @@ class CandidatAdminMixin(BaseAdmin, ExportAdmin):
                 .select_related('offre_emploi') \
                 .annotate(moyenne=Avg('evaluations__note'))
 
                 .select_related('offre_emploi') \
                 .annotate(moyenne=Avg('evaluations__note'))
 
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
         if groups.DRH_NIVEAU_1 in user_groupes or \
             groups.DRH_NIVEAU_2 in user_groupes or \
             groups.HAUTE_DIRECTION in user_groupes:
@@ -613,23 +632,17 @@ class ProxyCandidatAdmin(CandidatAdminMixin):
         return False
 
     def has_change_permission(self, request, obj=None):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
-        if request.user.is_superuser is True or \
-            groups.CORRESPONDANT_RH in user_groupes or \
-            groups.DRH_NIVEAU_1 in user_groupes or \
-            groups.DRH_NIVEAU_2 in user_groupes or \
-            groups.DIRECTEUR_DE_BUREAU in user_groupes or \
-            groups.ADMINISTRATEURS in user_groupes or \
-            groups.HAUTE_DIRECTION in user_groupes:
-            return True
-
         if obj is not None:
         if obj is not None:
-            evaluateur = Evaluateur.objects.get(user=request.user)
-            for e in obj.evaluations.all():
-                if e.evaluateur == evaluateur:
-                    return True
-
-        return not super(ProxyCandidatAdmin, self).has_change_permission(request, obj)
+            return obj in self.queryset(request)
+            #try:
+            #    evaluateur = Evaluateur.objects.get(user=request.user)
+            #    for e in obj.evaluations.all():
+            #        if e.evaluateur == evaluateur:
+            #            return True
+            #    return False
+            #except:
+            #    pass
+        return super(ProxyCandidatAdmin, self).has_change_permission(request, obj)
 
     def get_actions(self, request):
         return None
 
     def get_actions(self, request):
         return None
@@ -667,7 +680,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin):
 
     ### Permissions add, delete, change
     def has_add_permission(self, request):
 
     ### Permissions add, delete, change
     def has_add_permission(self, request):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
@@ -676,7 +689,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin):
         return False
 
     def has_delete_permission(self, request, obj=None):
         return False
 
     def has_delete_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
@@ -685,7 +698,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin):
         return False
 
     def has_change_permission(self, request, obj=None):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
         if request.user.is_superuser is True or \
                 groups.DRH_NIVEAU_1 in user_groupes or \
                 groups.DRH_NIVEAU_2 in user_groupes or \
@@ -790,7 +803,7 @@ class CandidatEvaluationAdmin(BaseAdmin):
         mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
         le request.user
         """
         mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
         le request.user
         """
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
 
         if request.user.is_superuser or \
             groups.CORRESPONDANT_RH in user_groupes or \
 
         if request.user.is_superuser or \
             groups.CORRESPONDANT_RH in user_groupes or \
@@ -812,8 +825,7 @@ class CandidatEvaluationAdmin(BaseAdmin):
         """
         qs = self.model._default_manager.get_query_set() \
                 .select_related('offre_emploi')
         """
         qs = self.model._default_manager.get_query_set() \
                 .select_related('offre_emploi')
-        user_groupes = request.user.groups.all()
-        user_groupes = [g.name for g in request.user.groups.all()]
+        user_groupes = get_user_groupnames(request.user)
 
         if request.user.is_superuser or \
             groups.CORRESPONDANT_RH in user_groupes or \
 
         if request.user.is_superuser or \
             groups.CORRESPONDANT_RH in user_groupes or \
@@ -852,13 +864,27 @@ class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin):
 
     def queryset(self, request):
         qs = self.model._default_manager.get_query_set() \
 
     def queryset(self, request):
         qs = self.model._default_manager.get_query_set() \
-                .select_related('offre_emploi')
+            .select_related('offre_emploi')
         evaluateur = Evaluateur.objects.get(user=request.user)
         evaluateur = Evaluateur.objects.get(user=request.user)
-        candidats_evaluations = \
-            CandidatEvaluation.objects.filter(evaluateur=evaluateur,
-                    candidat__statut__in=('REC', ))
-        candidats_evaluations_ids = [ce.id for ce in candidats_evaluations]
-        return qs.filter(id__in=candidats_evaluations_ids)
+
+        # XXX: Pas l'idéal, mais on doit créer les objets CandidatEvaluation
+        # ici pour garder la liste à jour. Idéalement, il vaudrait peut-être
+        # mieux utiliser directement les objets Candidat.
+        for candidat in Candidat.objects .filter(
+            offre_emploi__offreemploievaluateur__evaluateur=evaluateur,
+        ).exclude(evaluations__evaluateur=evaluateur):
+            print candidat, candidat.offre_emploi
+            CandidatEvaluation.objects.get_or_create(
+                candidat=candidat, evaluateur=evaluateur
+            )
+
+        return qs.filter(
+            evaluateur=evaluateur, candidat__statut__in=('NOUV', 'REC')
+        )
+
+
+class OffreEmploiEvaluateurAdmin(BaseAdmin):
+    pass
 
 
 class CourrielTemplateAdmin(BaseAdmin, VersionAdmin):
 
 
 class CourrielTemplateAdmin(BaseAdmin, VersionAdmin):
@@ -876,3 +902,4 @@ admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
 admin.site.register(MesCandidatEvaluation, MesCandidatEvaluationAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
 admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
 admin.site.register(MesCandidatEvaluation, MesCandidatEvaluationAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
 admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
+admin.site.register(OffreEmploiEvaluateur, OffreEmploiEvaluateurAdmin)