[#1823] Première phase pour régionnalisation
authorPA Parent <paparent@paparent.me>
Mon, 21 Nov 2011 16:37:25 +0000 (11:37 -0500)
committerPA Parent <paparent@paparent.me>
Mon, 21 Nov 2011 16:37:25 +0000 (11:37 -0500)
project/rh/lib.py
project/rh/models.py

index d9d5496..e832a89 100644 (file)
@@ -3,9 +3,40 @@
 from django.db import models
 from django.contrib import admin
 from django.conf import settings
+from django.db.models import Q
 from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
 from project.rh import models as rh
 from forms import DossierForm, ContratForm
+from dae.utils import get_employe_from_user
+
+
+class ProtectRegionMixin(object):
+
+    def queryset(self, request):
+        qs = super(ProtectRegionMixin, self).queryset(request)
+
+        if request.user.is_superuser:
+            return qs
+
+        employe = get_employe_from_user(request.user)
+
+        q = Q(**{self.model.prefix_implantation: employe.implantation.region})
+        qs = qs.filter(q).distinct()
+        return qs
+
+    def has_change_permission(self, request, obj=None):
+        if request.user.is_superuser:
+            return True
+
+        if obj:
+            employe = get_employe_from_user(request.user)
+            if employe.implantation.region in obj.get_regions():
+                return True
+            else:
+                return False
+
+        return True
+
 
 # Inlines
 
@@ -100,7 +131,7 @@ class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
 
 # Admins
 
-class AyantDroitAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class AyantDroitAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
     """
     L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
     """
@@ -188,7 +219,7 @@ class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     )
 
 
-class DossierAdmin(AUFMetadataAdminMixin, admin.ModelAdmin,):
+class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin,):
     form = DossierForm
     alphabet_filter = 'employe__nom'
     search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
@@ -252,7 +283,7 @@ class DossierCommentaireAdmin(admin.ModelAdmin):
     pass
 
 
-class EmployeAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
     alphabet_filter = 'nom'
     search_fields = ('id', 'nom', 'prenom', 'nom_affichage', 'actif', )
     list_filter = ('actif', )
@@ -307,7 +338,7 @@ class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
         )
 
 
-class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class OrganismeBstgAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
     search_fields = ('nom', )
     list_display = ('nom', 'type', 'pays', )
     inlines = (DossierROInline,)
@@ -318,7 +349,7 @@ class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
         )
 
 
-class PosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class PosteAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
     alphabet_filter = 'nom'
     search_fields = ('nom', 'implantation__code', 'implantation__nom', 'implantation__region__code', 'implantation__region__nom', )
     list_display = ('nom', 'implantation', 'service', 'type_poste', 'date_debut', 'date_fin', )
@@ -367,6 +398,7 @@ class PosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
             instance.save()
         formset.save_m2m()
 
+
 class PosteCommentaireAdmin(admin.ModelAdmin):
     pass
 
index ae03df7..f3cfbc8 100644 (file)
@@ -194,6 +194,10 @@ class Poste_(AUFMetadata):
         # self.dossier_set.all() fonctionne pas
         return False
 
+    prefix_implantation = "implantation__region"
+    def get_regions(self):
+        return [self.implantation.region]
+
 
 class Poste(Poste_):
     __doc__ = Poste_.__doc__
@@ -404,6 +408,14 @@ class Employe(AUFMetadata):
             pass
         return poste
 
+    prefix_implantation = "dossiers__poste__implantation__region"
+    def get_regions(self):
+        regions = []
+        for d in self.dossiers.all():
+            regions.append(d.poste.implantation.region)
+        return regions
+
+
 class EmployePiece(models.Model):
     """Documents relatifs à un employé.
     Ex.: CV...
@@ -476,6 +488,14 @@ class AyantDroit(AUFMetadata):
             nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
         return nom_affichage
 
+    prefix_implantation = "employe__dossiers__poste__implantation__region"
+    def get_regions(self):
+        regions = []
+        for d in self.employe.dossiers.all():
+            regions.append(d.poste.implantation.region)
+        return regions
+
+
 class AyantDroitCommentaire(Commentaire):
     ayant_droit = models.ForeignKey('AyantDroit', db_column='ayant_droit',
                             related_name='+')
@@ -573,6 +593,10 @@ class Dossier_(AUFMetadata):
             poste = self.poste.nom_feminin            
         return u'%s - %s' % (self.employe, poste)
 
+    prefix_implantation = "poste__implantation__region"
+    def get_regions(self):
+        return [self.poste.implantation.region]
+
 
 class Dossier(Dossier_):
     __doc__ = Dossier_.__doc__
@@ -921,6 +945,11 @@ class OrganismeBstg(AUFMetadata):
     def __unicode__(self):
         return u'%s (%s)' % (self.nom, self.get_type_display())
 
+    prefix_implantation = "pays__region"
+    def get_regions(self):
+        return [self.pays.region]
+
+
 class Statut(AUFMetadata):
     """Statut de l'Employe dans le cadre d'un Dossier particulier.
     """