Débug de pièces jointes
authorNilovna Bascunan-Vasquez <contact@nilovna.com>
Tue, 9 Aug 2011 21:05:22 +0000 (17:05 -0400)
committerNilovna Bascunan-Vasquez <contact@nilovna.com>
Tue, 9 Aug 2011 21:05:22 +0000 (17:05 -0400)
project/recrutement/admin.py
project/recrutement/api.py
project/recrutement/workflow.py
src/auf.django.emploi/auf/django/emploi/api.py
src/auf.django.emploi/auf/django/emploi/forms.py
src/auf.django.emploi/auf/django/emploi/models.py

index 109b9cd..162520a 100644 (file)
@@ -5,17 +5,20 @@ from django.http import HttpResponseRedirect
 from django.contrib import admin
 from django.shortcuts import get_object_or_404
 from django.core.files.storage import default_storage
+from django.forms.models import BaseInlineFormSet
 
 from reversion.admin import VersionAdmin
 from datamaster_modeles.models import Employe, Implantation, Region
-from django.forms.models import BaseInlineFormSet
 
 from project.rh import models as rh
 from recrutement.models import *
-from recrutement.workflow import grp_administrateurs_recrutement,\
-                            grp_evaluateurs_recrutement, grp_drh_recrutement
+from recrutement.workflow import grp_evaluateurs_recrutement, \
+                    grp_drh_recrutement, grp_directeurs_bureau_recrutement, \
+                    grp_administrateurs_recrutement
 from recrutement.forms import *
 
+from project.lib import get_employe_from_user as get_emp
+
 class ProxyEvaluateur(Evaluateur.offres_emploi.through):
     """
     Ce proxy sert uniquement dans l'admin à disposer d'un libellé
@@ -60,11 +63,30 @@ class OffreEmploiAdmin(VersionAdmin):
     _candidatsList.allow_tags = True 
     _candidatsList.short_description = "Afficher la liste des candidats"
 
+    def get_form(self, request, obj=None, **kwargs):
+        form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
+        employe = get_emp(request.user)
+        import pdb;pdb.set_trace()
+        user_groupes = request.user.groups.all()
+        if not grp_drh_recrutement in user_groupes and \
+            not request.user.is_superuser:
+            if form.declared_fields.has_key('region'):
+                region_field = form.declared_fields['region']
+            else:
+                region_field = form.base_fields['region']
+                import pdb;pdb.set_trace()
+                user = request.user
+                region_ids = [g.id for g in user.regions.all()]
+                region_field.queryset = Region.objects.filter(id__in=region_ids)
+        return form
+
     def queryset(self, request):
         qs = self.model._default_manager.get_query_set()
         # Si user est superuser afficher toutes les offres d'emploi  
         user_groupes = request.user.groups.all()
         if not grp_drh_recrutement in user_groupes and \
+            not grp_directeurs_bureau_recrutement in user_groupes and \
+            not grp_administrateurs_recrutement in user_groupes and \
             not request.user.is_superuser:
             """
             Si le user n'est ni un évaluateur ni un administrateur régional,
@@ -75,19 +97,10 @@ class OffreEmploiAdmin(VersionAdmin):
                 try:
                     user = Evaluateur.objects.get(user=request.user)               
                 except Evaluateur.DoesNotExist:       
-                    return qs.none()     
-            elif grp_administrateurs_recrutement in user_groupes: 
-                try:
-                    user = AdministrateurRegional.objects.get(user=request.user)
-                except AdministrateurRegional.DoesNotExist:       
-                    return qs.none()     
+                    return qs.none()       
             else:
                 return qs.none()   
                       
-            if type(user) is AdministrateurRegional:
-                region_ids = [g.id for g in user.regions.all()]
-                return qs.select_related('offre_emploi').\
-                        filter(region__in=region_ids)
             if type(user) is Evaluateur:        
                 candidats = [g for g in user.candidats.all()]
                 offre_emploi_ids = [c.offre_emploi.id for c in candidats]
@@ -96,9 +109,19 @@ class OffreEmploiAdmin(VersionAdmin):
             return qs.none()
         return qs.select_related('offre_emploi')
 
+    def has_add_permission(self, request):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
+            request.user.is_superuser:
+            return True
+        return False  
+
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
             grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return True
@@ -136,6 +159,8 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
                                                                             obj)
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return HttpResponseRedirect(reverse\
                                 ('admin:recrutement_offreemploi_changelist'))
@@ -152,6 +177,8 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
         user_groupes = request.user.groups.all()
         if grp_evaluateurs_recrutement in user_groupes or \
             grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return True
         return False   
@@ -272,23 +299,28 @@ class CandidatAdmin(VersionAdmin):
     calculer_moyenne.allow_tags = True
     calculer_moyenne.short_description = "Moyenne des notes"
 
-    def add_delete_permission(self, request, obj=None) :
+    def has_add_permission(self, request):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
             grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return True
-        return False    
-
-    def has_add_permission(self, request):
-        return self.add_delete_permission(request, request)
+        return False   
 
     def has_delete_permission(self, request, obj=None):
-        return self.add_delete_permission(request, request)
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
+            request.user.is_superuser:
+            return True
+        return False   
 
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
             grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return True
@@ -307,6 +339,8 @@ class CandidatAdmin(VersionAdmin):
         # Si user est superuser afficher tous les candidats       
         user_groupes = request.user.groups.all()
         if not grp_drh_recrutement in user_groupes and \
+            not grp_directeurs_bureau_recrutement in user_groupes and \
+            not grp_administrateurs_recrutement in user_groupes and \
             not request.user.is_superuser:
             # Si le user n'est ni un évaluateur ni un administrateur régional,
             # retourner none
@@ -317,13 +351,6 @@ class CandidatAdmin(VersionAdmin):
                     user = Evaluateur.objects.get(user=request.user)
                 except Evaluateur.DoesNotExist:       
                     return qs.none()       
-                """
-                elif grp_administrateurs_recrutement in user_groupes: 
-                    try:
-                        user = AdministrateurRegional.objects.get(user=obj.user)
-                    except AdministrateurRegional.DoesNotExist:       
-                        return qs.none()    
-                """
             else:
                 return qs.none()   
             ids = [c.id for c in user.candidats.all()]
@@ -360,6 +387,8 @@ class ProxyCandidatAdmin(CandidatAdmin):
         response = super(ProxyCandidatAdmin, self).response_change(request, obj)
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return HttpResponseRedirect(reverse\
                                     ('admin:recrutement_candidat_changelist'))
@@ -375,8 +404,9 @@ class ProxyCandidatAdmin(CandidatAdmin):
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
             grp_evaluateurs_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return True
         return False   
@@ -436,10 +466,6 @@ class CandidatEvaluationAdmin(VersionAdmin):
         un lien pour Évaluer le candidat.
         Sinon afficher la note.
         """
-        #evaluateur = obj.evaluateur
-        #candidat = obj.candidat
-        #candidat_evaluation = CandidatEvaluation.objects.get(candidat=candidat, evaluateur=evaluateur)
-        #import pdb;pdb.set_trace()
         if obj.note is None:
             return "<a href='%s'>Candidat non évalué</a>" % \
                 (reverse('admin:recrutement_candidatevaluation_change', 
@@ -493,7 +519,9 @@ class CandidatEvaluationAdmin(VersionAdmin):
         """
         qs = self.model._default_manager.get_query_set()
         user_groupes = request.user.groups.all()
-        if grp_drh_recrutement in user_groupes  or \
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
             request.user.is_superuser:
             return qs.select_related('offre_emploi')
 
index a6adbdf..7e1e676 100644 (file)
@@ -67,6 +67,7 @@ class API:
     def api_candidat_add(self, offre_id):
         vars = dict()
         offre = emploi.OffreEmploi.objects.get(id=offre_id)
+
         if self.request.method == "POST":
             try:
                 candidat = emploi.Candidat()
@@ -92,6 +93,17 @@ class API:
                 candidat.pays = ref.Pays.objects.get(id=self.request.POST['pays'])
                 candidat.save()
 
+                for i in range(0, int(self.request.POST['candidat_piece-TOTAL_FORMS'])-1):
+                    if self.request.POST['candidat_piece-' + str(i) + '-nom'] is not None:
+                        piece = emploi.CandidatPiece()
+                        piece.candidat = candidat
+                        import pdb;pdb.set_trace()
+                        piece.nom = self.request.POST['candidat_piece-' + str(i) + '-nom']
+                        import pdb;pdb.set_trace()
+                        piece.path = self.request.META['QUERY_STRING']
+                        import pdb;pdb.set_trace()
+                        piece.save()
+
                 evaluateurs = candidat.offre_emploi.evaluateurs.all()
                 for evaluateur in evaluateurs:                
                     candidat_evaluation = CandidatEvaluation()
@@ -103,10 +115,12 @@ class API:
                     courriel_template = CourrielTemplate.objects.get(id=1)
                     send_templated_email(candidat, courriel_template)
                 except:
-                    return api_return(STATUS_OK)               
+                    return api_return(STATUS_OK, simplejson.dumps(
+                                        {'candidat_id': candidat.id}), json=True)               
             except:
                 return api_return(STATUS_ERROR)
-            return api_return(STATUS_OK)
+            return api_return(STATUS_OK, simplejson.dumps(
+                                {'candidat_id': candidat.id}), json=True)  
         return api_return(STATUS_ERROR_BADMETHOD)
         
 
@@ -159,7 +173,7 @@ class API:
                 "duree_affectation": "%s" % offre.duree_affectation,
                 "renumeration": "%s" % offre.renumeration,
                 "debut_affectation": "%s" % offre.debut_affectation,
-                "lieu_affectation": "%s" % offre.lieu_affectation.id} ), 
+                "lieu_affectation": "%s" % offre.lieu_affectation.id}), 
                                                                     json=True)
         return api_return(STATUS_OK)
 
index 5ec17a0..ab8a409 100644 (file)
@@ -14,13 +14,14 @@ def safe_create_groupe(name):
         return None
     return grp
 
-grp_administrateurs_recrutement = safe_create_groupe(name='Administrateurs \
-                                    recrutement')
 grp_evaluateurs_recrutement = safe_create_groupe(name='Évaluateurs')
 grp_drh_recrutement = safe_create_groupe(name='DRH')
+grp_directeurs_bureau_recrutement = safe_create_groupe(name='Directeurs de bureau')
+grp_administrateurs_recrutement = safe_create_groupe(name='Administrateurs')
 
 recrutement_groupes = (
-    grp_administrateurs_recrutement,
     grp_evaluateurs_recrutement,
     grp_drh_recrutement,
+    grp_directeurs_bureau_recrutement,
+    grp_administrateurs_recrutement,
 )
index 61d049c..1fc1987 100644 (file)
@@ -4,12 +4,17 @@ from django.template import Context, RequestContext
 
 from django.utils import simplejson
 from auf.django.emploi import models as emploi
-from auf.django.emploi import forms as emploiForms
 from restkit import request as req
 from restkit import Resource
 from httplib2 import Http
 from urllib import urlencode
 import datamaster_modeles.models as ref
+from poster.encode import MultipartParam
+from poster.encode import multipart_encode
+import urllib2
+
+
+STATUS_OK = '200 OK'
 
 class API:
     def __init__(self, request):
@@ -74,7 +79,14 @@ class API:
     def candidat_add(self, offre_id):
         url = "http://127.0.0.1:8000/api/candidat_add/%s" % offre_id
         r = Resource(url)
-        resp = r.post(payload=self.request.POST)
-        return resp.status    
-
+        import pdb;pdb.set_trace()
+        mp = MultipartParam.from_file('cv', self.request.POST.get('candidat_piece-0-nom'))
+        import pdb;pdb.set_trace()
+        datagen, headers = multipart_encode([image_param])
+        import pdb;pdb.set_trace()
+        resp = r.post(payload=self.request.FILES, params_dict=self.request.POST)
+        if resp.status == STATUS_OK:
+            candidat_id = simplejson.loads(resp.body_string())['candidat_id']
+            return candidat_id
+        return None
         
index 79338eb..7a4a9e3 100644 (file)
@@ -17,6 +17,13 @@ class CandidatPieceForm(inlineformset_factory(Candidat,
     nom = forms.MultipleChoiceField(choices=TYPE_PIECE_CHOICES,
             widget=CheckboxSelectMultiple)
 
+    def __init__(self, *args, **kwargs):
+        super(CandidatPieceForm, self).__init__(*args, **kwargs)
+    
+    def save(self, *args, **kwargs):
+        super(CandidatPieceForm, self).save(*args, **kwargs)
+
+
 class PostulerOffreEmploiForm(ModelForm):
     captcha = CaptchaField()
     action = "http://127.0.0.1:8000/api/candidat_add/"
index fcf5810..35a0851 100755 (executable)
@@ -75,13 +75,13 @@ class OffreEmploi(Metadata):
                         help_text=HELP_TEXT_EN_AFFICHAGE)
     statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES,
                                 default='NOUV')
+    date_limite = models.DateField(verbose_name="Date limite",
+                        help_text=HELP_TEXT_FORMAT_DATE,)  
     nom = models.CharField(max_length=255)
     resume = models.TextField(verbose_name="Résumé", blank=True)
     description = models.TextField()
     poste = models.CharField(max_length=255)
     poste_nom = models.CharField(max_length=255)
-    date_limite = models.DateField(verbose_name="Date limite",
-                        help_text=HELP_TEXT_FORMAT_DATE,)  
     region = models.ForeignKey(ref.Region, db_column='region', 
                 verbose_name="Région")
     bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
@@ -151,9 +151,8 @@ storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
                             base_url=settings.PRIVE_MEDIA_URL)
 
 def candidat_piece_dispatch(instance, filename):
-    path = u'%s/%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.offre_emploi.id,
-            instance.candidat.nom, instance.candidat.prenom, instance.candidat.id, 
-            instance.nom, filename)
+    path = u'%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.nom, 
+        instance.candidat.prenom, instance.candidat.id, instance.nom, filename)
     return path
 
 class CandidatPiece(models.Model):