Merge branch 'dev' into recrutement
authorNilovna Bascunan-Vasquez <contact@nilovna.com>
Tue, 9 Aug 2011 21:09:01 +0000 (17:09 -0400)
committerNilovna Bascunan-Vasquez <contact@nilovna.com>
Tue, 9 Aug 2011 21:09:01 +0000 (17:09 -0400)
18 files changed:
project/recrutement/admin.py
project/recrutement/api.py
project/recrutement/forms.py
project/recrutement/migrations/0001_initial.py [new file with mode: 0644]
project/recrutement/migrations/__init__.py [new file with mode: 0644]
project/recrutement/models.py
project/recrutement/templates/admin/recrutement/candidat/change_form.html [new file with mode: 0644]
project/recrutement/urls.py
project/recrutement/views.py
project/recrutement/workflow.py
project/urls.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
src/auf.django.emploi/auf/django/emploi/templates/emploi/pieces.html [new file with mode: 0644]
src/auf.django.emploi/auf/django/emploi/templates/emploi/postuler_appel_offre.html [new file with mode: 0644]
src/auf.django.emploi/auf/django/emploi/templates/recrutement/pieces.html [deleted file]
src/auf.django.emploi/auf/django/emploi/templates/recrutement/postuler_appel_offre.html [deleted file]

index b817bd5..162520a 100644 (file)
@@ -5,23 +5,19 @@ 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 *
 
-"""
-class MetaAdmin(VersionAdmin):
-    def get_actions(self, request):
-    
-Pour refactoring
-"""
+from project.lib import get_employe_from_user as get_emp
 
 class ProxyEvaluateur(Evaluateur.offres_emploi.through):
     """
@@ -39,10 +35,10 @@ class EvaluateurInline(admin.TabularInline):
 
 class OffreEmploiAdmin(VersionAdmin):
     date_hierarchy = 'date_creation'
-    list_display = ('nom', 'resume', 'date_limite', 'region',  'statut', 
+    list_display = ('nom', 'date_limite', 'region',  'statut', 
                     'est_affiche', '_candidatsList', )
-    exclude = ('poste_nom',)
-    list_filter = ('statut', 'est_affiche', )
+    exclude = ('actif', 'poste_nom', 'resume',)
+    list_filter = ('statut',)
     actions = ['affecter_evaluateurs_offre_emploi', ]
     form = OffreEmploiForm
     inlines = [EvaluateurInline, ]
@@ -67,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,
@@ -82,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]
@@ -103,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
@@ -114,10 +130,9 @@ class OffreEmploiAdmin(VersionAdmin):
 class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
     list_display = ('nom', 'resume', 'date_limite', 'region', 'statut', 
                     'est_affiche')
-    readonly_fields = ('description', 'bureau',
-                        'duree_affectation', 'renumeration',
-                        'debut_affectation', 'lieu_affectation', 'nom',
-                        'resume', 'date_limite', 'region')
+    readonly_fields = ('description', 'bureau', 'duree_affectation', 
+                        'renumeration', 'debut_affectation', 'lieu_affectation',
+                        'nom', 'resume', 'date_limite', 'region')
     fieldsets = (
         ('Nom', {
             'fields': ('nom', )        
@@ -133,19 +148,24 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
                         'renumeration', )
         }),
     )        
-
+    inlines = []
     def get_actions(self, request):
         actions = super(ProxyOffreEmploiAdmin, self).get_actions(request)
         del actions['affecter_evaluateurs_offre_emploi']
         return actions
 
     def response_change(self, request, obj):
-        response = super(ProxyOffreEmploiAdmin, self).response_change(request, obj)
+        response = super(ProxyOffreEmploiAdmin, 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_offreemploi_changelist'))
-        return HttpResponseRedirect(reverse('admin:recrutement_proxyoffreemploi_changelist'))
+            return HttpResponseRedirect(reverse\
+                                ('admin:recrutement_offreemploi_changelist'))
+        return HttpResponseRedirect(reverse\
+                            ('admin:recrutement_proxyoffreemploi_changelist'))
 
     def has_add_permission(self, request):
         return False
@@ -157,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   
@@ -191,11 +213,13 @@ class CandidatEvaluationInline(admin.TabularInline):
         return self.readonly_fields
 
 class CandidatAdmin(VersionAdmin):
+    exclude = ('actif', )
     date_hierarchy = 'date_creation'
     list_display = ('nom', 'prenom', 'offre_emploi','statut',
                     'voir_offre_emploi', 'calculer_moyenne', 
                     'afficher_candidat',)
     list_filter = ('offre_emploi', )
+
     fieldsets = (
         ("Offre d'emploi", {
             'fields': ('offre_emploi', )
@@ -267,7 +291,7 @@ class CandidatAdmin(VersionAdmin):
         notes = [evaluation.note for evaluation in evaluations.all() \
                     if evaluation.note is not None]
  
-        if len(notes) > 0 and offre_emploi.date_limite <= datetime.date.today():
+        if len(notes) > 0:
             moyenne_votes = float(sum(notes)) / len(notes)
         else:
             moyenne_votes = "Non disponible"
@@ -275,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
@@ -310,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
@@ -320,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()]
@@ -363,9 +387,13 @@ 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'))
-        return HttpResponseRedirect(reverse('admin:recrutement_proxycandidat_changelist'))
+            return HttpResponseRedirect(reverse\
+                                    ('admin:recrutement_candidat_changelist'))
+        return HttpResponseRedirect(reverse\
+                                ('admin:recrutement_proxycandidat_changelist'))
 
     def has_add_permission(self, request):
         return False
@@ -376,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   
@@ -437,20 +466,15 @@ 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)
         if obj.note is None:
             return "<a href='%s'>Candidat non évalué</a>" % \
                 (reverse('admin:recrutement_candidatevaluation_change', 
-                args=(candidat_evaluation.id,)))
+                args=(obj.id,)))
         return "<a href='%s'>%s</a>" % \
             (reverse('admin:recrutement_candidatevaluation_change', 
             args=(candidat_evaluation.id,)), obj.note)
-        return 
     _note.allow_tags = True
-    _note.short_description = "Votre note"    
+    _note.short_description = "Note"    
     _note.admin_order_field = 'note'    
 
     def _candidat(self, obj):
@@ -495,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 e8ca95a..7e1e676 100644 (file)
@@ -1,15 +1,17 @@
 # -*- encoding: utf-8 -*
+from datetime import date
 from django.http import HttpResponse
 from django.template import RequestContext, Template
 from django.shortcuts import render_to_response, redirect, get_object_or_404
 from django.utils import simplejson
 from django.contrib import messages
 
+import datamaster_modeles.models as ref
 from auf.django.emploi import models as emploi
 from auf.django.emploi import forms as emploiForms
 from project.recrutement.models import Evaluateur, CandidatEvaluation, \
                                 CourrielTemplate
-from project.recrutement.views import *
+from project.recrutement.views import send_templated_email
 
 STATUS_OK = 200
 
@@ -18,16 +20,19 @@ STATUS_ERROR_NOT_FOUND = 404
 STATUS_ERROR_PERMISSIONS = 403
 STATUS_ERROR_BADMETHOD = 405
 
-def api(request, method):
+def api(request, method, offre_id=None):
     # TODO: Sécurité : 
     #       L'échange d'information doit être possible qu'avec les HOST désirés.
 
     #if request.method != 'POST':
     #    return api_return(STATUS_ERROR_BADMETHOD)
-    
+
     api = API(request)
     if hasattr(api, 'api_%s' % method):
-        return getattr(api, 'api_%s' % method)()
+        if offre_id is None:
+            return getattr(api, 'api_%s' % method)()
+        else:
+            return api.api_candidat_add(offre_id)
     
     return api_return(STATUS_ERROR)
 
@@ -59,85 +64,116 @@ class API:
     def __init__(self, request):
         self.request = request
 
-    def api_candidat_add(self):
+    def api_candidat_add(self, offre_id):
         vars = dict()
-        offre_emploi = get_object_or_404(emploi.OffreEmploi, id=self.request.GET.get('id'))
-        cand = emploi.Candidat()
-        cand.offre_emploi = offre_emploi
+        offre = emploi.OffreEmploi.objects.get(id=offre_id)
 
         if self.request.method == "POST":
-            form = emploiForms.PostulerOffreEmploiForm(self.request.POST,
-                     instance=cand, offre_emploi=offre_emploi)
-            piecesForm = emploiForms.CandidatPieceForm(self.request.POST, self.request.FILES,
-                        instance=cand)
-            
-            if form.is_valid() and piecesForm.is_valid():
-                offre = form.save()
-                piecesForm.instance = offre
-                piecesForm.save() 
-         
-                """courriel_template = CourrielTemplate.objects.\
-                            get(id=1)
-                send_templated_email(cand, courriel_template)
-                """
-                evaluateurs = offre_emploi.evaluateurs.all()
+            try:
+                candidat = emploi.Candidat()
+                candidat.offre_emploi = offre
+                candidat.nom = self.request.POST['nom']
+                candidat.prenom = self.request.POST['prenom']
+                candidat.genre = self.request.POST['genre']
+                candidat.nationalite = ref.Pays.objects.get\
+                                        (id=self.request.POST['nationalite'])
+                candidat.situation_famille = self.request.POST['situation_famille']
+                candidat.nombre_dependant = self.request.POST['nombre_dependant']
+                candidat.niveau_diplome = self.request.POST['niveau_diplome']
+                candidat.employeur_actuel = self.request.POST['employeur_actuel']
+                candidat.poste_actuel = self.request.POST['poste_actuel']
+                candidat.domaine_professionnel = self.request.\
+                                                    POST['domaine_professionnel']
+                candidat.telephone = self.request.POST['telephone']
+                candidat.email = self.request.POST['email']
+                candidat.adresse = self.request.POST['adresse']
+                candidat.ville = self.request.POST['ville']
+                candidat.etat_province = self.request.POST['etat_province']
+                candidat.code_postal = self.request.POST['code_postal']
+                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()
-                    candidat_evaluation.candidat = cand
+                    candidat_evaluation.candidat = candidat
                     candidat_evaluation.evaluateur = evaluateur
                     candidat_evaluation.save()
 
-                return api_return(STATUS_OK)
-            else:
-                messages.add_message(self.request, messages.ERROR,
-                            'Il y a des erreurs dans le formulaire.')
-        else:
-            form = emploiForms.PostulerOffreEmploiForm(instance=cand,
-                    offre_emploi=offre_emploi)
-            piecesForm = emploiForms.CandidatPieceForm(instance=cand)
-
-        vars.update(dict(form=form, candidat=cand, piecesForm=piecesForm, ))
-     
-        return render_to_response('recrutement/postuler_appel_offre.html', vars, 
-                RequestContext(self.request))
-
+                try:
+                    courriel_template = CourrielTemplate.objects.get(id=1)
+                    send_templated_email(candidat, courriel_template)
+                except:
+                    return api_return(STATUS_OK, simplejson.dumps(
+                                        {'candidat_id': candidat.id}), json=True)               
+            except:
+                return api_return(STATUS_ERROR)
+            return api_return(STATUS_OK, simplejson.dumps(
+                                {'candidat_id': candidat.id}), json=True)  
+        return api_return(STATUS_ERROR_BADMETHOD)
+        
 
     def api_offre_emploi_liste(self):
-        return api_return(STATUS_OK, simplejson.dumps(
-                            [{"id": "%s" % offre.id, 
-                            "est_affiche": "%s" % offre.est_affiche,
-                            "statut": "%s" % offre.statut,
-                            "nom": "%s" % offre.nom, 
-                            "resume": "%s" % offre.resume,
-                            "description": "%s" % offre.description,
-                            "poste_nom": "%s" % offre.poste_nom,
-                            "region": "%s" % offre.region.id,
-                            "bureau": "%s" % offre.bureau.id,
-                            "date_limite": "%s" % offre.date_limite,
-                            "duree_affectation": "%s" % offre.duree_affectation,
-                            "renumeration": "%s" % offre.renumeration,
-                            "debut_affectation": "%s" % offre.debut_affectation,
-                            "lieu_affectation": "%s" % offre.lieu_affectation.id} 
-                            for offre in emploi.OffreEmploi.objects.all()]), json=True)
+        offres_emploi = []
+        for offre in emploi.OffreEmploi.objects.all():
+            if offre.est_affiche is True and \
+                offre.statut == "AFFI" and \
+                offre.date_limite >= date.today():
+                offres_emploi.append(offre)
+        if offres_emploi:
+            return api_return(STATUS_OK, simplejson.dumps(
+                        [{"id": "%s" % offre.id, 
+                        "est_affiche": "%s" % offre.est_affiche,
+                        "statut": "%s" % offre.statut,
+                        "nom": "%s" % offre.nom, 
+                        "resume": "%s" % offre.resume,
+                        "description": "%s" % offre.description,
+                        "poste_nom": "%s" % offre.poste_nom,
+                        "region": "%s" % offre.region.id,
+                        "bureau": "%s" % offre.bureau.id,
+                        "date_limite": "%s" % offre.date_limite,
+                        "duree_affectation": "%s" % offre.duree_affectation,
+                        "renumeration": "%s" % offre.renumeration,
+                        "debut_affectation": "%s" % offre.debut_affectation,
+                        "lieu_affectation": "%s" % offre.lieu_affectation.id} 
+                                for offre in offres_emploi]), json=True)
+        return api_return(STATUS_OK)
         
     def api_offre_emploi(self):
         try:
             offre = emploi.OffreEmploi.objects.get(id=self.request.GET.get('id'))
         except emploi.OffreEmploi.DoesNotExist:
             return api_return(STATUS_ERROR, "ID d'offre d'emploi invalide")
-        return api_return(STATUS_OK, simplejson.dumps(
-            {"id": "%s" % offre.id,
-            "est_affiche": "%s" % offre.est_affiche,
-            "statut": "%s" % offre.statut,
-            "nom": "%s" % offre.nom, 
-            "resume": "%s" % offre.resume,
-            "description": "%s" % offre.description,
-            "poste_nom": "%s" % offre.poste_nom,
-            "region": "%s" % offre.region.id,
-            "bureau": "%s" % offre.bureau.id,
-            "date_limite": "%s" % offre.date_limite,
-            "duree_affectation": "%s" % offre.duree_affectation,
-            "renumeration": "%s" % offre.renumeration,
-            "debut_affectation": "%s" % offre.debut_affectation,
-            "lieu_affectation": "%s" % offre.lieu_affectation.id} ), json=True)
+    
+        if offre.est_affiche is True and \
+            offre.statut == "AFFI" and \
+            offre.date_limite >= date.today():
+            return api_return(STATUS_OK, simplejson.dumps(
+                {"id": "%s" % offre.id,
+                "est_affiche": "%s" % offre.est_affiche,
+                "statut": "%s" % offre.statut,
+                "nom": "%s" % offre.nom, 
+                "resume": "%s" % offre.resume,
+                "description": "%s" % offre.description,
+                "poste_nom": "%s" % offre.poste_nom,
+                "region": "%s" % offre.region.id,
+                "bureau": "%s" % offre.bureau.id,
+                "date_limite": "%s" % offre.date_limite,
+                "duree_affectation": "%s" % offre.duree_affectation,
+                "renumeration": "%s" % offre.renumeration,
+                "debut_affectation": "%s" % offre.debut_affectation,
+                "lieu_affectation": "%s" % offre.lieu_affectation.id}), 
+                                                                    json=True)
+        return api_return(STATUS_OK)
 
index 2c54120..5b52584 100644 (file)
@@ -73,7 +73,7 @@ class OffreEmploiForm(ModelForm):
         kwargs2 = kwargs.copy()
         kwargs2['commit'] = False
         offre = super(OffreEmploiForm, self).save(*args, **kwargs2)
-        offre.poste = self.cleaned_data.get("poste")
+        offre.poste = self.cleaned_data.get("poste").id
         offre.poste_nom = self.cleaned_data.get("poste").nom
         if 'commit' not in kwargs or kwargs['commit']:
             offre.save()
@@ -89,11 +89,6 @@ class OffreEmploiForm(ModelForm):
                 raise forms.ValidationError("La date limite ne peut pas être \
                         supérieure à la date d'affection.")
 
-        """if date_limite < datetime.date.today() or \
-            debut_affectation < datetime.date.today():
-            raise forms.ValidationError("La date limite et/ou la date \
-                d'affection doivent être supérieures à la date d'aujourdhui.")
-        """
         return cleaned_data
 
 ################################################################################
diff --git a/project/recrutement/migrations/0001_initial.py b/project/recrutement/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..43782c7
--- /dev/null
@@ -0,0 +1,332 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding model 'Evaluateur'
+        db.create_table('recrutement_evaluateur', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)),
+        ))
+        db.send_create_signal('recrutement', ['Evaluateur'])
+
+        # Adding M2M table for field offres_emploi on 'Evaluateur'
+        db.create_table('recrutement_evaluateur_offres_emploi', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('evaluateur', models.ForeignKey(orm['recrutement.evaluateur'], null=False)),
+            ('offreemploi', models.ForeignKey(orm['emploi.offreemploi'], null=False))
+        ))
+        db.create_unique('recrutement_evaluateur_offres_emploi', ['evaluateur_id', 'offreemploi_id'])
+
+        # Adding model 'AdministrateurRegional'
+        db.create_table('recrutement_administrateurregional', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)),
+        ))
+        db.send_create_signal('recrutement', ['AdministrateurRegional'])
+
+        # Adding M2M table for field regions on 'AdministrateurRegional'
+        db.create_table('recrutement_administrateurregional_regions', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('administrateurregional', models.ForeignKey(orm['recrutement.administrateurregional'], null=False)),
+            ('region', models.ForeignKey(orm['datamaster_modeles.region'], null=False))
+        ))
+        db.create_unique('recrutement_administrateurregional_regions', ['administrateurregional_id', 'region_id'])
+
+        # Adding model 'CandidatEvaluation'
+        db.create_table('recrutement_candidatevaluation', (
+            ('candidat', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', db_column='candidat', to=orm['emploi.Candidat'])),
+            ('commentaire', self.gf('django.db.models.fields.TextField')(default='Aucun', null=True, blank=True)),
+            ('note', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
+            ('date', self.gf('django.db.models.fields.DateField')(auto_now_add=True, blank=True)),
+            ('evaluateur', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', db_column='evaluateur', to=orm['recrutement.Evaluateur'])),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('recrutement', ['CandidatEvaluation'])
+
+        # Adding model 'CourrielTemplate'
+        db.create_table('recrutement_courrieltemplate', (
+            ('plain_text', self.gf('django.db.models.fields.TextField')()),
+            ('html', self.gf('tinymce.models.HTMLField')()),
+            ('sujet', self.gf('django.db.models.fields.CharField')(max_length=100)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('nom_modele', self.gf('django.db.models.fields.CharField')(max_length=100)),
+        ))
+        db.send_create_signal('recrutement', ['CourrielTemplate'])
+
+        # Adding model 'CandidatCourriel'
+        db.create_table('recrutement_candidatcourriel', (
+            ('plain_text', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('html', self.gf('tinymce.models.HTMLField')(null=True, blank=True)),
+            ('sujet', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('template', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', db_column='template', to=orm['recrutement.CourrielTemplate'])),
+        ))
+        db.send_create_signal('recrutement', ['CandidatCourriel'])
+
+        # Adding M2M table for field candidats on 'CandidatCourriel'
+        db.create_table('recrutement_candidatcourriel_candidats', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('candidatcourriel', models.ForeignKey(orm['recrutement.candidatcourriel'], null=False)),
+            ('candidat', models.ForeignKey(orm['recrutement.candidat'], null=False))
+        ))
+        db.create_unique('recrutement_candidatcourriel_candidats', ['candidatcourriel_id', 'candidat_id'])
+    
+        # Création du template de courriel par défaut. (Confirmation de postulation à l'offre d'emploi
+        template = orm.CourrielTemplate()
+        template.id = 1
+        template.nom_modele = "Confirmation de postulation pour une offre d'emploi (envoi automatique)"
+        template.sujet = "Confirmation de postulation pour l'offre d'emploi: {{ offre_emploi }}"
+        template.plain_text = "Bonjour {{ genre_candidat }} {{ nom_candidat }},\n\nCe courriel est pour vous confirmer que nous avons bien reçu votre candidature pour l'offre d'emploi {{ offre_emploi }}.\n\n Merci de l'intérêt que vous portez à l'AUF." 
+        template.html = "<p>Bonjour {{ genre_candidat }} {{ nom_candidat }},<br /> \
+                            Ce courriel est pour vous confirmer que nous \
+                            avons bien reçu votre candidature pour l'offre \
+                            d'emploi {{ offre_emploi }}. <br /> <br /> \
+                            Merci de l'intérêt que vous portez à l'AUF.</p>"
+        template.save()
+
+    
+    def backwards(self, orm):
+        
+        # Deleting model 'Evaluateur'
+        db.delete_table('recrutement_evaluateur')
+
+        # Removing M2M table for field offres_emploi on 'Evaluateur'
+        db.delete_table('recrutement_evaluateur_offres_emploi')
+
+        # Deleting model 'AdministrateurRegional'
+        db.delete_table('recrutement_administrateurregional')
+
+        # Removing M2M table for field regions on 'AdministrateurRegional'
+        db.delete_table('recrutement_administrateurregional_regions')
+
+        # Deleting model 'CandidatEvaluation'
+        db.delete_table('recrutement_candidatevaluation')
+
+        # Deleting model 'CourrielTemplate'
+        db.delete_table('recrutement_courrieltemplate')
+
+        # Deleting model 'CandidatCourriel'
+        db.delete_table('recrutement_candidatcourriel')
+
+        # Removing M2M table for field candidats on 'CandidatCourriel'
+        db.delete_table('recrutement_candidatcourriel_candidats')
+    
+    
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'datamaster_modeles.bureau': {
+            'Meta': {'object_name': 'Bureau', 'db_table': "u'ref_bureau'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'db_column': "'implantation'"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_court': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'nom_long': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"})
+        },
+        'datamaster_modeles.implantation': {
+            'Meta': {'object_name': 'Implantation', 'db_table': "u'ref_implantation'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'adresse_physique_bureau': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_code_postal': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'adresse_physique_code_postal_avant_ville': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'adresse_physique_no': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'adresse_physique_pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'impl_adresse_physique'", 'to_field': "'code'", 'db_column': "'adresse_physique_pays'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'adresse_physique_precision': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_precision_avant': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_region': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_rue': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_ville': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'adresse_postale_boite_postale': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_bureau': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_code_postal': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_code_postal_avant_ville': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'adresse_postale_no': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'impl_adresse_postale'", 'to_field': "'code'", 'db_column': "'adresse_postale_pays'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'adresse_postale_precision': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_precision_avant': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_region': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_rue': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_ville': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'bureau_rattachement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'db_column': "'bureau_rattachement'"}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'code_meteo': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'commentaire': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'courriel': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'courriel_interne': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'date_extension': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_fermeture': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_inauguration': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_ouverture': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'fax': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'fax_interne': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'fuseau_horaire': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'hebergement_convention': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'hebergement_convention_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'hebergement_etablissement': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'modif_date': ('django.db.models.fields.DateField', [], {}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_court': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'nom_long': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"}),
+            'remarque': ('django.db.models.fields.TextField', [], {}),
+            'responsable_implantation': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'statut': ('django.db.models.fields.IntegerField', [], {}),
+            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'telephone_interne': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'datamaster_modeles.pays': {
+            'Meta': {'object_name': 'Pays', 'db_table': "u'ref_pays'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2'}),
+            'code_bureau': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Bureau']", 'to_field': "'code'", 'db_column': "'code_bureau'"}),
+            'code_iso3': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3', 'blank': 'True'}),
+            'developpement': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'monnaie': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nord_sud': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"})
+        },
+        'datamaster_modeles.region': {
+            'Meta': {'object_name': 'Region', 'db_table': "u'ref_region'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation_bureau': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'gere_region'", 'db_column': "'implantation_bureau'", 'to': "orm['datamaster_modeles.Implantation']"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'emploi.candidat': {
+            'Meta': {'object_name': 'Candidat'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'adresse': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'code_postal': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_creation': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'domaine_professionnel': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '255'}),
+            'employeur_actuel': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'etat_province': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'genre': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'nationalite': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'nationalite'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'niveau_diplome': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nombre_dependant': ('django.db.models.fields.IntegerField', [], {}),
+            'offre_emploi': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'offre_emploi'", 'to': "orm['emploi.OffreEmploi']"}),
+            'pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'pays'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'poste_actuel': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'prenom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'situation_famille': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'statut': ('django.db.models.fields.CharField', [], {'default': "'NOUV'", 'max_length': '4'}),
+            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'ville': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'emploi.offreemploi': {
+            'Meta': {'object_name': 'OffreEmploi'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'bureau': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Bureau']", 'db_column': "'bureau'"}),
+            'date_creation': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_limite': ('django.db.models.fields.DateField', [], {}),
+            'debut_affectation': ('django.db.models.fields.DateField', [], {}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'duree_affectation': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'est_affiche': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'lieu_affectation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'db_column': "'implantation'"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'poste': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'poste_nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"}),
+            'renumeration': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'resume': ('django.db.models.fields.TextField', [], {}),
+            'statut': ('django.db.models.fields.CharField', [], {'default': "'NOUV'", 'max_length': '4'})
+        },
+        'recrutement.administrateurregional': {
+            'Meta': {'object_name': 'AdministrateurRegional'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'regions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['datamaster_modeles.Region']", 'symmetrical': 'False'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'recrutement.candidat': {
+            'Meta': {'object_name': 'Candidat', 'db_table': "'emploi_candidat'", '_ormbases': ['emploi.Candidat']}
+        },
+        'recrutement.candidatcourriel': {
+            'Meta': {'object_name': 'CandidatCourriel'},
+            'candidats': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['emploi.Candidat']", 'symmetrical': 'False'}),
+            'html': ('tinymce.models.HTMLField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'plain_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'sujet': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'template'", 'to': "orm['recrutement.CourrielTemplate']"})
+        },
+        'recrutement.candidatevaluation': {
+            'Meta': {'object_name': 'CandidatEvaluation'},
+            'candidat': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'candidat'", 'to': "orm['emploi.Candidat']"}),
+            'commentaire': ('django.db.models.fields.TextField', [], {'default': "'Aucun'", 'null': 'True', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'evaluateur': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'evaluateur'", 'to': "orm['recrutement.Evaluateur']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'recrutement.courrieltemplate': {
+            'Meta': {'object_name': 'CourrielTemplate'},
+            'html': ('tinymce.models.HTMLField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'nom_modele': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'plain_text': ('django.db.models.fields.TextField', [], {}),
+            'sujet': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'recrutement.evaluateur': {
+            'Meta': {'object_name': 'Evaluateur'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'offres_emploi': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'evaluateurs'", 'blank': 'True', 'to': "orm['emploi.OffreEmploi']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        }
+    }
+    
+    complete_apps = ['recrutement']
diff --git a/project/recrutement/migrations/__init__.py b/project/recrutement/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
index 3b30f2b..7789294 100755 (executable)
@@ -7,6 +7,8 @@ from tinymce import models as tinymce_models
 from django.db import models
 import settings
 
+from south.modelsinspector import add_introspection_rules
+add_introspection_rules([], ["^tinymce.models.HTMLField"])
 import datamaster_modeles.models as ref
 from recrutement.workflow import grp_evaluateurs_recrutement
 from auf.django.emploi import models as emploi
@@ -48,6 +50,17 @@ class Candidat(emploi.Candidat):
     class Meta:
         proxy = True
 
+    def moyenne_notes(self):
+        evaluations = CandidatEvaluation.objects.filter(candidat=self)
+        notes = [evaluation.note for evaluation in evaluations.all() \
+                    if evaluation.note is not None]
+
+        if len(notes) > 0:
+            moyenne_votes = float(sum(notes)) / len(notes)
+        else:
+            moyenne_votes = "Non disponible"
+        return moyenne_votes
+
 class OffreEmploi(emploi.OffreEmploi):
     class Meta:
         proxy = True
@@ -141,11 +154,14 @@ class CourrielTemplate(models.Model):
     html = tinymce_models.HTMLField(verbose_name='Texte en HTML', 
                                     help_text=HELP_TEXT_TAGS_ACCEPTES,  )
 
+
     def __unicode__(self):
         return u'%s' % self.nom_modele
 
     class Meta:
         ordering = ['nom_modele',]
+        verbose_name = "Modèle de courriel"
+        verbose_name_plural = "Modèles de courriel"
 
 class CandidatCourriel(models.Model):
     candidats = models.ManyToManyField(Candidat, verbose_name="Candidats", )
diff --git a/project/recrutement/templates/admin/recrutement/candidat/change_form.html b/project/recrutement/templates/admin/recrutement/candidat/change_form.html
new file mode 100644 (file)
index 0000000..457d40e
--- /dev/null
@@ -0,0 +1,75 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+
+{% block extrahead %}{{ block.super }}
+{% url admin:jsi18n as jsi18nurl %}
+<script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
+{{ media }}
+{% endblock %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %}
+
+{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
+
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
+     {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo;
+     {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
+</div>
+{% endif %}{% endblock %}
+
+{% block content %}<div id="content-main">
+{% block object-tools %}
+{% if change %}{% if not is_popup %}
+  <ul class="object-tools"><li><a href="history/" class="historylink">{% trans "History" %}</a></li>
+  {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
+  </ul>
+{% endif %}{% endif %}
+{% endblock %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if save_on_top %}{% submit_row %}{% endif %}
+{% if errors %}
+    <p class="errornote">
+    {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+    </p>
+    {{ adminform.form.non_field_errors }}
+{% endif %}
+
+{% for fieldset in adminform %}
+  {% include "admin/includes/fieldset.html" %}
+{% endfor %}
+
+{% block after_field_sets %}{% endblock %}
+
+{% for inline_admin_formset in inline_admin_formsets %}
+    {% include inline_admin_formset.opts.template %}
+{% endfor %}
+
+<fieldset class="module aligned ">
+    <h2>Moyenne des notes</h2>
+        <div class="form-row">
+            <label>Moyenne:</label>
+            <p>{{ original.moyenne_notes }}</p>
+        </div>
+</fieldset>
+
+{% block after_related_objects %}{% endblock %}
+
+{% submit_row %}
+
+{% if adminform and add %}
+   <script type="text/javascript">document.getElementById("{{ adminform.first_field.id_for_label }}").focus();</script>
+{% endif %}
+
+{# JavaScript for prepopulated fields #}
+{% prepopulated_fields_js %}
+
+</div>
+</form></div>
+{% endblock %}
index f7d59bf..b2ae6f6 100644 (file)
@@ -2,6 +2,12 @@
 from django.conf.urls.defaults import patterns, url
 
 
+"""    url(r'^pieces/$', 'recrutement.api.postuler_appel_offre', 
+    name='pieces'),
+
+url(r'^postuler_appel_offre/$', 
+    'recrutement.api.postuler_appel_offre', name='postuler_appel_offre'), 
+"""  
 
 
 urlpatterns = patterns('',
@@ -19,9 +25,4 @@ urlpatterns = patterns('',
         'recrutement.views.selectionner_template', 
         name='selectionner_template'),
 
-    url(r'^pieces/$', 'recrutement.views.postuler_appel_offre', 
-        name='pieces'),
-
-    url(r'^postuler_appel_offre/$', 
-        'recrutement.views.postuler_appel_offre', name='postuler_appel_offre'),   
 )
index 65753e5..bc52ef8 100755 (executable)
@@ -12,7 +12,6 @@ from django.core.mail import EmailMultiAlternatives
 from forms import *
 from models import *
 from recrutement.workflow import grp_evaluateurs_recrutement
-from views import *
 
 def index(request):
     return render_to_response('recrutement/index.html', {}, 
@@ -67,43 +66,6 @@ def envoyer_courriel_candidats(request):
     return render_to_response("recrutement/envoyer_courriel_candidats.html", 
             Context(c), context_instance = RequestContext(request))
 
-def postuler_appel_offre(request):
-    vars = dict()
-    offre_emploi = get_object_or_404(OffreEmploi, id=request.GET.get('id'))
-    candidat = Candidat()
-    candidat.offre_emploi = offre_emploi
-
-    if request.method == "POST":
-        form = PostulerOffreEmploiForm(request.POST,
-                 instance=candidat, offre_emploi=offre_emploi)
-        piecesForm = CandidatPieceForm(request.POST, request.FILES,
-                    instance=candidat)
-        if form.is_valid() and piecesForm.is_valid():
-            offre = form.save()
-            piecesForm.instance = offre
-            piecesForm.save() 
-     
-            courriel_template = CourrielTemplate.objects.\
-                        get(nom_modele='Confirmation postulation (automatique)')
-            emp.send_templated_email(candidat, courriel_template)
-     
-            messages.add_message(request, messages.SUCCESS, 
-                            "Votre application à l'appel d'offre d'emploi a \
-                            été effectuée.")       
-            return redirect("admin:recrutement_offreemploi_changelist")
-        else:
-            messages.add_message(request, messages.ERROR,
-                        'Il y a des erreurs dans le formulaire.')
-    else:
-        form = PostulerOffreEmploiForm(instance=candidat,
-                offre_emploi=offre_emploi)
-        piecesForm = CandidatPieceForm(instance=candidat)
-
-    vars.update(dict(form=form, candidat=candidat, piecesForm=piecesForm, ))
-    return render_to_response('recrutement/postuler_appel_offre.html', vars, 
-            RequestContext(request))
-
 def affecter_evaluateurs_offre_emploi(request):
     offre_emploi_ids = request.GET.get('ids').split(',')
     offres_emploi = OffreEmploi.objects.filter(id__in=offre_emploi_ids)
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 c0438ad..8a539f9 100644 (file)
@@ -14,6 +14,8 @@ urlpatterns = patterns(
     url(r'^$', 'project.views.accueil', name='accueil'),
 
     (r'^admin/', include(admin.site.urls)),
+    url(r'^api/(?P<method>[a-z_-]+)/(?P<offre_id>\d+)$', 'recrutement.api.api', 
+            name='recrutement_api'),
     url(r'^api/(?P<method>[a-z_-]+)/$', 'recrutement.api.api', 
             name='recrutement_api'),
     (r'^connexion/$', 'django.contrib.auth.views.login'),
index 5a7e778..1fc1987 100644 (file)
@@ -4,9 +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):
@@ -16,7 +24,10 @@ class API:
         url = "http://127.0.0.1:8000/api/offre_emploi_liste/"
         r = req(url)
         liste_json = r.body_string()
-        liste_offres = simplejson.loads(liste_json)
+        try:
+            liste_offres = simplejson.loads(liste_json)
+        except:
+            return []
         obj_offres_emploi = []
 
         for offre_dict in liste_offres:
@@ -41,7 +52,11 @@ class API:
         url = "http://127.0.0.1:8000/api/offre_emploi/?id=%s"
         r = req(url % (offre_id))
         offre_json = r.body_string()
-        offre_dict = simplejson.loads(offre_json)
+
+        try:
+            offre_dict = simplejson.loads(offre_json)
+        except:
+            return []
         obj_offres_emploi = []
 
         offre = emploi.OffreEmploi()
@@ -62,7 +77,16 @@ class API:
         return obj_offres_emploi
 
     def candidat_add(self, offre_id):
-        url = "http://127.0.0.1:8000/api/candidat_add/?id=%s" % (offre_id)
-        return redirect(url)
-
+        url = "http://127.0.0.1:8000/api/candidat_add/%s" % offre_id
+        r = Resource(url)
+        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 7f963cc..7a4a9e3 100644 (file)
@@ -7,21 +7,29 @@ from django.forms import ModelForm
 
 from captcha.fields import CaptchaField
 
-from auf.django.emploi import models as emploi
+from models import *
 
 ################################################################################
 # OFFRE EMPLOI
 ################################################################################
-class CandidatPieceForm(inlineformset_factory(emploi.Candidat,
-                        emploi.CandidatPiece)):
-    nom = forms.MultipleChoiceField(choices=emploi.TYPE_PIECE_CHOICES,
+class CandidatPieceForm(inlineformset_factory(Candidat,
+                        CandidatPiece)):
+    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/"
 
     def __init__(self, *args, **kwargs):
-        self.offre_emploi = kwargs.pop('offre_emploi')     
+        self.offre_emploi = kwargs.pop('offre_id')
         super(PostulerOffreEmploiForm, self).__init__(*args, **kwargs)
 
     def save(self, *args, **kwargs): 
@@ -33,7 +41,7 @@ class PostulerOffreEmploiForm(ModelForm):
         return postulation
 
     class Meta:
-        model = emploi.Candidat   
+        model = Candidat   
         exclude = ('actif', 'offre_emploi',)
         fields = ('nom', 'prenom', 'genre', 'nationalite', 'situation_famille', 
                     'nombre_dependant', 'niveau_diplome', 'employeur_actuel', 
index 8fa2e92..35a0851 100755 (executable)
@@ -17,11 +17,13 @@ HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
                             {{ offre_emploi }}. Ces champs seront \
                             automatiquement remplacés par les informations de \
                             chaque candidat."
-
+HELP_TEXT_EN_AFFICHAGE = "En cochant cette case, l'offre d'emploi sera affichée\
+                         sur le site institutionnel dès qu'elle aura le statut \
+                        'En diffusion' et ce, jusqu'à la date limite."
 
 STATUT_OFFRE_EMPLOI_CHOICES = (
     ('NOUV', 'Nouveau'),
-    ('AFFI', 'Offre d\'emploi en affichage'),
+    ('AFFI', 'En diffusion'),
     ('EVAL', 'En évaluation des candidatures'),
     ('ENTR', 'En entrevue'),
     ('TERM', 'Terminé'),
@@ -69,16 +71,17 @@ class Metadata(models.Model):
 
 class OffreEmploi(Metadata):
     est_affiche = models.BooleanField(default=False, 
-                                    verbose_name="En affichage sur le site")
+                        verbose_name="À afficher sur le site institutionnel",
+                        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é")
+    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', )
@@ -127,7 +130,7 @@ class Candidat(Metadata):
     adresse = models.CharField(max_length=255)
     ville = models.CharField(max_length=255)
     etat_province = models.CharField(max_length=255, 
-                    verbose_name="État/Province")
+                    verbose_name="État/Province", blank=True)
     code_postal = models.CharField(max_length=255, blank=True)
     pays = models.ForeignKey(ref.Pays, db_column='pays',
             related_name='+')
@@ -148,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):
diff --git a/src/auf.django.emploi/auf/django/emploi/templates/emploi/pieces.html b/src/auf.django.emploi/auf/django/emploi/templates/emploi/pieces.html
new file mode 100644 (file)
index 0000000..d8587d7
--- /dev/null
@@ -0,0 +1,30 @@
+<table>
+    {% for f in piecesForm.management_form %}
+        {{ f }}
+    {% endfor %}
+    <tr>  
+        <th></th> 
+        {% for field in piecesForm.forms.0 %}
+            {% if not field.is_hidden %}
+                <th>{{ field.label }}</th>
+            {% endif %}
+        {% endfor %}
+    </tr>
+    {% for f in piecesForm.forms %}
+    <tr>
+        <td>
+            {{ f.errors }}
+            {% if f.initial.fichier %}
+                <a href="{{ f.initial.fichier.url }}" target="_blank">Télécharger</a>
+            {% endif %}
+        </td>
+        {% for field in f %} 
+            {% if not field.is_hidden %}
+                <td>{{ field }}</td>
+            {% else %}
+                {{ field }}
+            {% endif %}
+        {% endfor %}
+    </tr>
+    {% endfor %}
+</table>
diff --git a/src/auf.django.emploi/auf/django/emploi/templates/emploi/postuler_appel_offre.html b/src/auf.django.emploi/auf/django/emploi/templates/emploi/postuler_appel_offre.html
new file mode 100644 (file)
index 0000000..f6931be
--- /dev/null
@@ -0,0 +1,123 @@
+{% extends "base.html" %}
+{% block Contenu%}
+
+<div id="content-main">
+    {% block object-tools %}{% endblock %}
+
+    <h1>Poster pour un appel d'offre d'emploi</h1>
+
+    <form action="" method="post" enctype="multipart/form-data">
+        <fieldset>
+            <h2>Informations personnelles</h2>
+            <table id="informations_personnelles">
+                <tbody>
+                <tr>
+                    <td>{{ form.prenom.label }}</td>
+                    <td>{{ form.prenom }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.nom.label }}</td>
+                    <td>{{ form.nom }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.genre.label }}</td>
+                    <td>{{ form.genre }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.nationalite.label }}</td>
+                    <td>{{ form.nationalite }}</td>
+                <tr>
+                    <td>{{ form.situation_famille.label }}</td>
+                    <td>{{ form.situation_famille }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.nombre_dependant.label }}</td>
+                    <td>{{ form.nombre_dependant }}<br />
+                        <span class="info">{{ form.nombre_dependant.help_text }}</span>
+                    </td>
+                </tr>
+                </tbody>
+            </table>            
+        </fieldset>
+        <fieldset>
+            <h2>Coordonnées</h2>
+            <table id="coordonnees">
+                <tbody>
+                <tr>
+                    <td>{{ form.telephone.label }}</td>
+                    <td>{{ form.telephone }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.email.label }}</td>
+                    <td>{{ form.email }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.adresse.label }}</td>
+                    <td>{{ form.adresse }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.ville.label }}</td>
+                    <td>{{ form.ville }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.etat_province.label }}</td>
+                    <td>{{ form.etat_province }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.code_postal.label }}</td>
+                    <td>{{ form.code_postal }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.pays.label }}</td>
+                    <td>{{ form.pays }}</td>
+                </tr>
+                </tbody>
+            </table>
+        </fieldset>
+        <fieldset>
+            <h2>Informations professionnelles</h2>
+            <table id="informations_professionnelles">
+                <tbody>
+                <tr>
+                    <td>{{ form.niveau_diplome.label }}</td>
+                    <td>{{ form.niveau_diplome }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.employeur_actuel.label }}</td>
+                    <td>{{ form.employeur_actuel }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.poste_actuel.label }}</td>
+                    <td>{{ form.poste_actuel }}</td>
+                </tr>
+                <tr>
+                    <td>{{ form.domaine_professionnel.label }}</td>
+                    <td>{{ form.domaine_professionnel }}</td>
+                </tr>
+                </tbody>
+            </table>
+        </fieldset>
+        <fieldset>
+            <h2>Pièces jointes</h2>
+            <p class="info">CV, lettre de motivation...</p>
+            {% include "recrutement/pieces.html" %}
+        </fieldset>
+        <fieldset>
+            <h2>Vérification CAPTCHA</h2>
+            <p class="info">Entrez les caractères figurant dans l'image ci-dessous.</p>
+                <tr>
+                    <td>
+                        {{ form.captcha }}
+                        {{ form.captcha.errors }}
+                    </td>
+                </tr>
+        </fieldset>
+        <div class="submit-row">
+            <input type="submit" name="save" value="Enregistrer" />
+        </div>
+    </form>
+
+
+</div>
+
+{% endblock %}
diff --git a/src/auf.django.emploi/auf/django/emploi/templates/recrutement/pieces.html b/src/auf.django.emploi/auf/django/emploi/templates/recrutement/pieces.html
deleted file mode 100644 (file)
index d8587d7..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<table>
-    {% for f in piecesForm.management_form %}
-        {{ f }}
-    {% endfor %}
-    <tr>  
-        <th></th> 
-        {% for field in piecesForm.forms.0 %}
-            {% if not field.is_hidden %}
-                <th>{{ field.label }}</th>
-            {% endif %}
-        {% endfor %}
-    </tr>
-    {% for f in piecesForm.forms %}
-    <tr>
-        <td>
-            {{ f.errors }}
-            {% if f.initial.fichier %}
-                <a href="{{ f.initial.fichier.url }}" target="_blank">Télécharger</a>
-            {% endif %}
-        </td>
-        {% for field in f %} 
-            {% if not field.is_hidden %}
-                <td>{{ field }}</td>
-            {% else %}
-                {{ field }}
-            {% endif %}
-        {% endfor %}
-    </tr>
-    {% endfor %}
-</table>
diff --git a/src/auf.django.emploi/auf/django/emploi/templates/recrutement/postuler_appel_offre.html b/src/auf.django.emploi/auf/django/emploi/templates/recrutement/postuler_appel_offre.html
deleted file mode 100644 (file)
index 53569f0..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-{% extends 'base.html' %}
-{% load adminmedia %}
-
-{% block title %}RH{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
-{% block sous_titre %}Accueil{% endblock %}
-
-{% block main %}
-<div id="content-main">
-    {% block object-tools %}{% endblock %}
-
-
-
-
-    <div class="module">
-    <h2>Poster pour un appel d'offre d'emploi</h2>
-    </div>
-       
-    <form action="" method="post" enctype="multipart/form-data">
-        <fieldset>
-            <h2>Informations personnelles</h2>
-            <table id="informations_personnelles">
-                <tbody>
-                <tr>
-                    <td>{{ form.prenom.label }}</td>
-                    <td>{{ form.prenom }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.nom.label }}</td>
-                    <td>{{ form.nom }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.genre.label }}</td>
-                    <td>{{ form.genre }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.nationalite.label }}</td>
-                    <td>{{ form.nationalite }}</td>
-                <tr>
-                    <td>{{ form.situation_famille.label }}</td>
-                    <td>{{ form.situation_famille }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.nombre_dependant.label }}</td>
-                    <td>{{ form.nombre_dependant }}<br />
-                        <span class="info">{{ form.nombre_dependant.help_text }}
-                        </span>
-                    </td>
-                </tr>
-                </tbody>
-            </table>            
-        </fieldset>
-        <fieldset>
-            <h2>Coordonnées</h2>
-            <table id="coordonnees">
-                <tbody>
-                <tr>
-                    <td>{{ form.telephone.label }}</td>
-                    <td>{{ form.telephone }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.email.label }}</td>
-                    <td>{{ form.email }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.adresse.label }}</td>
-                    <td>{{ form.adresse }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.ville.label }}</td>
-                    <td>{{ form.ville }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.etat_province.label }}</td>
-                    <td>{{ form.etat_province }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.code_postal.label }}</td>
-                    <td>{{ form.code_postal }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.pays.label }}</td>
-                    <td>{{ form.pays }}</td>
-                </tr>
-                </tbody>
-            </table>
-        </fieldset>
-        <fieldset>
-            <h2>Informations professionnelles</h2>
-            <table id="informations_professionnelles">
-                <tbody>
-                <tr>
-                    <td>{{ form.niveau_diplome.label }}</td>
-                    <td>{{ form.niveau_diplome }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.employeur_actuel.label }}</td>
-                    <td>{{ form.employeur_actuel }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.poste_actuel.label }}</td>
-                    <td>{{ form.poste_actuel }}</td>
-                </tr>
-                <tr>
-                    <td>{{ form.domaine_professionnel.label }}</td>
-                    <td>{{ form.domaine_professionnel }}</td>
-                </tr>
-                </tbody>
-            </table>
-        </fieldset>
-        <fieldset>
-            <h2>Pièces jointes</h2>
-            <p class="info">CV, lettre de motivation...</p>
-            {% include "recrutement/pieces.html" %}
-        </fieldset>
-        <fieldset>
-            <h2>Vérification CAPTCHA</h2>
-            <p class="info">Entrez les caractères figurant dans l'image ci-dessous.</p>
-                <tr>
-                    <td>
-                        {{ form.captcha }}
-                        {{ form.captcha.errors }}
-                    </td>
-                </tr>
-        </fieldset>
-        <div class="submit-row">
-            <input type="submit" name="save" value="Enregistrer" />
-        </div>
-    </form>
-
-
-
-</div>
-
-{% endblock %}