From 3a542b85cb7a5fab753d5fefa4023a47631de553 Mon Sep 17 00:00:00 2001 From: Nilovna Bascunan-Vasquez Date: Tue, 9 Aug 2011 17:05:22 -0400 Subject: [PATCH] =?utf8?q?D=C3=A9bug=20de=20pi=C3=A8ces=20jointes?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- project/recrutement/admin.py | 92 ++++++++++++++------- project/recrutement/api.py | 20 ++++- project/recrutement/workflow.py | 7 +- src/auf.django.emploi/auf/django/emploi/api.py | 20 ++++- src/auf.django.emploi/auf/django/emploi/forms.py | 7 ++ src/auf.django.emploi/auf/django/emploi/models.py | 9 +- 6 files changed, 108 insertions(+), 47 deletions(-) diff --git a/project/recrutement/admin.py b/project/recrutement/admin.py index 109b9cd..162520a 100644 --- a/project/recrutement/admin.py +++ b/project/recrutement/admin.py @@ -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 "Candidat non évalué" % \ (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') diff --git a/project/recrutement/api.py b/project/recrutement/api.py index a6adbdf..7e1e676 100644 --- a/project/recrutement/api.py +++ b/project/recrutement/api.py @@ -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) diff --git a/project/recrutement/workflow.py b/project/recrutement/workflow.py index 5ec17a0..ab8a409 100644 --- a/project/recrutement/workflow.py +++ b/project/recrutement/workflow.py @@ -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, ) diff --git a/src/auf.django.emploi/auf/django/emploi/api.py b/src/auf.django.emploi/auf/django/emploi/api.py index 61d049c..1fc1987 100644 --- a/src/auf.django.emploi/auf/django/emploi/api.py +++ b/src/auf.django.emploi/auf/django/emploi/api.py @@ -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 diff --git a/src/auf.django.emploi/auf/django/emploi/forms.py b/src/auf.django.emploi/auf/django/emploi/forms.py index 79338eb..7a4a9e3 100644 --- a/src/auf.django.emploi/auf/django/emploi/forms.py +++ b/src/auf.django.emploi/auf/django/emploi/forms.py @@ -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/" diff --git a/src/auf.django.emploi/auf/django/emploi/models.py b/src/auf.django.emploi/auf/django/emploi/models.py index fcf5810..35a0851 100755 --- a/src/auf.django.emploi/auf/django/emploi/models.py +++ b/src/auf.django.emploi/auf/django/emploi/models.py @@ -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): -- 1.7.10.4