merge dev
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 16 Aug 2011 16:35:47 +0000 (12:35 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 16 Aug 2011 16:35:47 +0000 (12:35 -0400)
auf/django/emploi/api.py
auf/django/emploi/forms.py
auf/django/emploi/models.py
auf/django/emploi/settings.py

index 9e9d815..9b368c7 100644 (file)
 # -*- encoding: utf-8 -*
+from django.core import serializers
 from django.shortcuts import render_to_response, redirect, get_object_or_404
 from django.template import Context, RequestContext
-
 from django.utils import simplejson
 from auf.django.emploi import models as emploi
-from restkit import request as req
-from restkit import Resource
-from httplib2 import Http
-from urllib import urlencode
+from restkit import request, Resource
 import datamaster_modeles.models as ref
-from poster.encode import MultipartParam
-from poster.encode import multipart_encode
+import poster
 import urllib2
-import settings
+from auf.django.emploi import settings
+
 
+STATUS_OK = 200
 
-STATUS_OK = '200 OK'
+def req(*args, **kwargs):
+    timeout = 10
+    if not kwargs.has_key('timeout'):
+        kwargs['timeout'] = timeout
+    return request(*args, **kwargs)
 
 class API:
-    def __init__(self, request):
+    def __init__(self, request, env):
         self.request = request
+        self.env = env
 
-    def offre_emploi_liste(self, env):
-
-        if hasattr(settings, "RECRUTEMENT_URL"):
-            url = getattr(settings, "RECRUTEMENT_URL")[env] + "offre_emploi_liste/"
-        else:
-            raise ImportError, "Could not import settings RECRUTEMENT_PATH"
+    def offre_emploi_liste(self,):
+        url = settings.RECRUTEMENT_URLS[self.env] + "offre_emploi_liste/"
         r = req(url)
-        liste_json = r.body_string()
-        try:
-            liste_offres = simplejson.loads(liste_json)
-        except:
-            return []
-        obj_offres_emploi = []
-
-        for offre_dict in liste_offres:
-            offre = emploi.OffreEmploi()
-            offre.est_affiche = offre_dict['est_affiche']
-            offre.statut = offre_dict['statut']
-            offre.nom = offre_dict['nom']
-            offre.resume = offre_dict['resume']
-            offre.description = offre_dict['description']
-            offre.poste_nom = offre_dict['poste_nom']
-            offre.date_limite = offre_dict['date_limite'] 
-            offre.region = ref.Region.objects.get(id=offre_dict['region'])
-            offre.bureau = ref.Bureau.objects.get(id=offre_dict['bureau'])
-            offre.duree_affectation = offre_dict['duree_affectation']
-            offre.renumeration = offre_dict['renumeration']
-            offre.debut_affectation = offre_dict['debut_affectation']
-            offre.lieu_affectation = ref.Implantation.objects.get(id=offre_dict['lieu_affectation'])
-            obj_offres_emploi.append(offre)  
-        return obj_offres_emploi
+        data = r.body_string()
+        offres = [offre.object for offre in serializers.deserialize("json", data)]
+        return offres
 
     def offre_emploi(self, offre_id, env):
-        if hasattr(settings, "RECRUTEMENT_URL"):
-            url = getattr(settings, "RECRUTEMENT_URL")[env] + "offre_emploi/?id=%s"
-        else:
-            raise ImportError, "Could not import settings RECRUTEMENT_PATH"
+        url = settings.RECRUTEMENT_URLS[self.env] + "offre_emploi/?id=%s"
         r = req(url % offre_id)
         offre_json = r.body_string()
-
-        try:
-            offre_dict = simplejson.loads(offre_json)
-        except:
-            return []
-        obj_offres_emploi = []
-
-        offre = emploi.OffreEmploi()
-        offre.est_affiche = offre_dict['est_affiche']
-        offre.statut = offre_dict['statut']
-        offre.nom = offre_dict['nom']
-        offre.resume = offre_dict['resume']
-        offre.description = offre_dict['description']
-        offre.poste_nom = offre_dict['poste_nom']
-        offre.date_limite = offre_dict['date_limite']
-        offre.region = ref.Region.objects.get(id=offre_dict['region'])
-        offre.bureau = ref.Bureau.objects.get(id=offre_dict['bureau'])
-        offre.duree_affectation = offre_dict['duree_affectation']
-        offre.renumeration = offre_dict['renumeration']
-        offre.debut_affectation = offre_dict['debut_affectation']
-        offre.lieu_affectation = ref.Implantation.objects.get(id=offre_dict['lieu_affectation'])
-        obj_offres_emploi.append(offre)
-        return obj_offres_emploi
-
-    def candidat_add(self, offre_id, env):
-        if hasattr(settings, "RECRUTEMENT_URL"):
-            url = getattr(settings, "RECRUTEMENT_URL")[env] + "candidat_add/%s"
+        data = r.body_string()
+        offres = [o.object for o in serializers.deserialize("json", data)]
+        if len(offres) == 0:
+            return offres[0]
         else:
-            raise ImportError, "Could not import settings RECRUTEMENT_PATH"
-        r = Resource(url % offre_id)
-        mp = MultipartParam.from_file('cv', self.request.POST.get('candidat_piece-0-nom'))
-        datagen, headers = multipart_encode([image_param])
-        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 offres
+
+    def candidat_add(self, offre_id,):
+        url = settings.RECRUTEMENT_URLS[self.env] + "candidat_add/%s/" % offre_id
+        r = Resource(url)
+        params = self.request.POST
+        for k, up_file in self.request.FILES.items():
+            params[k] = up_file
+        opener = poster.streaminghttp.register_openers()
+        datagen, headers = poster.encode.multipart_encode(params)
+        request = urllib2.Request(url, datagen, headers)
+        resp = urllib2.urlopen(request)
+        if resp.code == STATUS_OK:
+            candidats = [c.object for c in serializers.deserialize("json", resp.read())]
+            if len(candidats) == 1: 
+                return candidats[0]
         return None
-        
index 7a4a9e3..ae85da1 100644 (file)
@@ -17,34 +17,25 @@ 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/"
+POSTULER_FORM_EXCLUDES = ('actif', 'offre_emploi',) 
+POSTULER_FORM_FIELDS = ('nom', 'prenom', 'genre', 'nationalite', 'situation_famille', 
+                    'nombre_dependant', 'niveau_diplome', 'employeur_actuel', 
+                    'poste_actuel', 'domaine_professionnel', 'telephone', 
+                    'email', 'adresse', 'ville', 'code_postal', 'etat_province',
+                    'pays', )
 
-    def __init__(self, *args, **kwargs):
-        self.offre_emploi = kwargs.pop('offre_id')
-        super(PostulerOffreEmploiForm, self).__init__(*args, **kwargs)
+class NoCaptchaPostulerOffreEmploiForm(ModelForm):
+    class Meta:
+        model = Candidat
+        exclude = POSTULER_FORM_EXCLUDES
+        fields =  POSTULER_FORM_FIELDS
 
-    def save(self, *args, **kwargs): 
-        kwargs2 = kwargs.copy()
-        kwargs2['commit'] = False
-        postulation = super(PostulerOffreEmploiForm, self).save(*args, **kwargs2)
-        if 'commit' not in kwargs or kwargs['commit']:
-            postulation.save()
-        return postulation
+class PostulerOffreEmploiForm(ModelForm):
+    captcha = CaptchaField()
 
     class Meta:
         model = Candidat   
-        exclude = ('actif', 'offre_emploi',)
-        fields = ('nom', 'prenom', 'genre', 'nationalite', 'situation_famille', 
-                    'nombre_dependant', 'niveau_diplome', 'employeur_actuel', 
-                    'poste_actuel', 'domaine_professionnel', 'telephone', 
-                    'email', 'adresse', 'ville', 'code_postal', 'etat_province',
-                    'pays', 'captcha', )
+        exclude = POSTULER_FORM_EXCLUDES
+        fields =  POSTULER_FORM_FIELDS + ('captcha', )
index 35a0851..306cd6e 100755 (executable)
@@ -4,9 +4,8 @@ import datetime
 from django.core.files.storage import FileSystemStorage
 from tinymce import models as tinymce_models
 from django.db import models
-import settings
-
 import datamaster_modeles.models as ref
+import settings
 
 ### CONSTANTES ###
 # HELP_TEXT
@@ -147,12 +146,11 @@ class Candidat(Metadata):
 
 
 # Upload de fichiers
-storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, 
-                            base_url=settings.PRIVE_MEDIA_URL)
+storage_prive = FileSystemStorage(settings.OE_PRIVE_MEDIA_ROOT, 
+                            base_url=settings.OE_PRIVE_MEDIA_URL)
 
 def candidat_piece_dispatch(instance, filename):
-    path = u'%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.nom, 
-        instance.candidat.prenom, instance.candidat.id, instance.nom, filename)
+    path = u'%s/%s/%s' % ('emplois', instance.candidat.id, filename)
     return path
 
 class CandidatPiece(models.Model):
index 0772d21..e60179d 100644 (file)
@@ -3,19 +3,18 @@
 import os
 from django.conf import settings
 
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = getattr(settings, 'OE_MEDIA_ROOT', 
-                        os.path.join(os.path.dirname(__file__), 'media'))
-PRIVE_MEDIA_ROOT = getattr(settings, 'OE_PRIV_MEDIA_ROOT', 
-                        os.path.join(os.path.dirname(__file__), 'media_prive'))
+# default
+MEDIA_ROOT = getattr(settings, 'MEDIA_ROOT', None)
+PRIVE_MEDIA_ROOT = getattr(settings, 'PRIVE_MEDIA_ROOT', None)
+MEDIA_URL = getattr(settings, 'MEDIA_URL', None)
+PRIVE_MEDIA_URL = getattr(settings, 'PRIVE_MEDIA_URL', None)
 
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash if there is a path component (optional in other cases).
-# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = '/media/'
-PRIVE_MEDIA_URL = '/prive/'
+# custom
+OE_MEDIA_ROOT = getattr(settings, 'OE_MEDIA_ROOT', MEDIA_ROOT)
+OE_PRIVE_MEDIA_ROOT = getattr(settings, 'OE_PRIV_MEDIA_ROOT', PRIVE_MEDIA_ROOT)
+OE_MEDIA_URL = getattr(settings, 'OE_MEDIA_URL', MEDIA_URL)
+OE_PRIVE_MEDIA_URL = getattr(settings, 'OE_PRIVE_MEDIA_URL', PRIVE_MEDIA_URL)
 
-RECRUTEMENT_URL = {'DEV':'http://127.0.0.1:8000/api/',
+RECRUTEMENT_URLS = {'DEV': getattr(settings, 'RECRUTEMENT_URL', 'http://127.0.0.1:8000/api/'),
                     'TEST':'http://test.ressources-humaines.auf.org/api/',
                     'PROD':'http://ressources-humaines.auf.org/api/',}