1591: Créer une app formulaire-recrutement qui permettra à un candidat de postuler...
authornilovna.bascunan-vasquez <nilovna.bascunan-vasquez@localhost.localdomain>
Fri, 3 Jun 2011 16:57:08 +0000 (12:57 -0400)
committernilovna.bascunan-vasquez <nilovna.bascunan-vasquez@localhost.localdomain>
Fri, 3 Jun 2011 16:57:08 +0000 (12:57 -0400)
project/recrutement/admin.py
project/recrutement/forms.py
project/recrutement/models.py
project/recrutement/templates/recrutement/postuler_appel_offre.html [new file with mode: 0644]
project/recrutement/views.py
project/settings.py
project/urls.py

index c4c2c35..bda3d3b 100644 (file)
@@ -17,22 +17,26 @@ class OffreEmploiAdmin(VersionAdmin):
     list_filter = ('region',)
         
     def _candidatsList(self, obj):     
-        return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats</a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id)
+        return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
+            </a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id)
     _candidatsList.allow_tags = True 
     _candidatsList.short_description = "Liste des candidats"   
 
     def queryset(self, request):
         """
-        Spécifie un queryset limité, autrement Django exécute un select_related()
-        sans paramètre, ce qui a pour effet de charger tous les objets FK, sans limite
-        de profondeur. Dès qu'on arrive, dans les modèles de Region, il existe plusieurs
-        boucles, ce qui conduit à la génération d'une requête infinie.
+        Spécifie un queryset limité, autrement Django exécute un 
+        select_related() sans paramètre, ce qui a pour effet de charger tous 
+        les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les 
+        modèles de Region, il existe plusieurs boucles, ce qui conduit à la 
+        génération d'une requête infinie.
         """
         user_email = request.user.email
         user = get_object_or_404(Employe, courriel=user_email)
         user_implantation = user.implantation
-        implantation_region = get_object_or_404(Implantation, id=user_implantation.id)
-        user_region = get_object_or_404(Region, id=implantation_region.region.id)
+        implantation_region = get_object_or_404(Implantation, 
+                                id=user_implantation.id)
+        user_region = get_object_or_404(Region, 
+                        id=implantation_region.region.id)
         qs = self.model._default_manager.get_query_set()
         return qs.select_related('offre_emploi').filter(region=user_region.id)
 
@@ -46,8 +50,9 @@ class EvaluateurInline(admin.TabularInline):
 
 class CandidatAdmin(VersionAdmin):
     date_hierarchy = 'date_creation'
-    list_display = ('nom', 'prenom', 'offre_emploi','statut', '_actions', 'evaluer_candidat')
-    list_filter = ('offre_emploi',)
+    list_display = ('nom', 'prenom', 'offre_emploi','statut', '_actions', 
+                    'evaluer_candidat', )
+    list_filter = ('offre_emploi', )
     fieldsets = (
         ('Informations personnelles', {
             'fields': ('prenom','nom','genre', 'nationalite', 'date_naissance',
@@ -57,8 +62,8 @@ class CandidatAdmin(VersionAdmin):
             'fields': ('adresse', 'ville', 'etat_province', 'pays', )
         }),
         ('Informations professionnelles', {
-            'fields': ('offre_emploi','niveau_diplome','employeur_actuel','poste_actuel',
-                        'domaine_professionnel',)
+            'fields': ('offre_emploi','niveau_diplome','employeur_actuel', 
+                        'poste_actuel', 'domaine_professionnel',)
         }),  
         ('Options avancées', {
             'classes': ('collapse',),
@@ -74,27 +79,31 @@ class CandidatAdmin(VersionAdmin):
     actions = ['affecter_candidats_evaluateur']
     def affecter_candidats_evaluateur(modeladmin, obj):
         selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
-        return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+"?ids=%s" % (",".join(selected)))
+        return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+
+                "?ids=%s" % (",".join(selected)))
     affecter_candidats_evaluateur.short_description = "Affecter evaluateur"
 
-    
     def evaluer_candidat(self, obj):
-        return "<a href='%s?id=%s'>Évaluer le candidat</a>" % (reverse('evaluer_candidat'), obj.id)
+        return "<a href='%s?id=%s'>Évaluer le candidat \
+                </a>" % (reverse('evaluer_candidat'), obj.id)
     evaluer_candidat.allow_tags = True    
     evaluer_candidat.short_description = "Évaluer"
 
     def queryset(self, obj):
         """
-        Spécifie un queryset limité, autrement Django exécute un select_related()
-        sans paramètre, ce qui a pour effet de charger tous les objets FK, sans limite
-        de profondeur. Dès qu'on arrive, dans les modèles de Region, il existe plusieurs
-        boucles, ce qui conduit à la génération d'une requête infinie.
+        Spécifie un queryset limité, autrement Django exécute un 
+        select_related() sans paramètre, ce qui a pour effet de charger tous 
+        les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les 
+        modèles de Region, il existe plusieurs boucles, ce qui conduit à la 
+        génération d'une requête infinie.
         """
         qs = self.model._default_manager.get_query_set()
         return qs.select_related('offre_emploi')
 
     def _actions(self, obj):
-        return "<a href='%s?id=%s'>Voir l'offre d'emploi</a>" % (reverse('admin:recrutement_offreemploi_changelist'), obj.offre_emploi.id)
+        return "<a href='%s?id=%s'>Voir l'offre d'emploi</a> \
+                " % (reverse('admin:recrutement_offreemploi_changelist'), 
+                obj.offre_emploi.id)
     _actions.allow_tags = True
     _actions.short_description = "Offre d'emploi"
 
@@ -123,10 +132,11 @@ class CandidatEvaluationAdmin(VersionAdmin):
 
     def queryset(self, obj):
         """
-        Spécifie un queryset limité, autrement Django exécute un select_related()
-        sans paramètre, ce qui a pour effet de charger tous les objets FK, sans limite
-        de profondeur. Dès qu'on arrive, dans les modèles de Region, il existe plusieurs
-        boucles, ce qui conduit à la génération d'une requête infinie.
+        Spécifie un queryset limité, autrement Django exécute un 
+        select_related() sans paramètre, ce qui a pour effet de charger tous 
+        les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les 
+        modèles de Region, il existe plusieurs boucles, ce qui conduit à la 
+        génération d'une requête infinie.
         """
         qs = self.model._default_manager.get_query_set()
         return qs.select_related('offre_emploi')
index a643e2c..1bc2654 100644 (file)
@@ -4,7 +4,7 @@ import os
 from django import forms
 from django.contrib import admin
 from django.forms.models import inlineformset_factory
-#from form_utils.forms import BetterModelForm
+from form_utils.forms import BetterModelForm
 from django.forms import ModelForm
 from models import *
 
@@ -24,7 +24,8 @@ class CandidatEvaluationForm(ModelForm):
         model = CandidatEvaluation  
 
 class EvaluateurForm(forms.Form):
-    evaluateurs = forms.ModelMultipleChoiceField(queryset=Evaluateur.objects.all())
+    evaluateurs = forms.ModelMultipleChoiceField(queryset=
+                    Evaluateur.objects.all())
 
     def __init__(self, *args, **kwargs):
         self.candidats = kwargs.pop('candidats')
@@ -38,7 +39,27 @@ class EvaluateurForm(forms.Form):
 ################################################################################
 # OFFRE EMPLOI
 ################################################################################
-class PostulerOffreEmploiForm(ModelForm):
+class PostulerOffreEmploiForm(BetterModelForm):
+    def __init__(self, *args, **kwargs):   
+        self.offre_emploi = kwargs.pop('offre_emploi')   
+        self.actif = True
+        # Statut de la cadidature à Nouveau
+        self.statut = STATUT_CHOICES[0]     
+        super(PostulerOffreEmploiForm, self).__init__(*args, **kwargs)
+
+    def save(self):
+        super(PostulerOffreEmploiForm, self).save()
+
     class Meta:
-        fields = ('note', 'commentaire', 'evaluateur')
-        model = OffreEmploi  
+        fieldsets = [
+            ('Informations personnelles', {
+                'fields': ['prenom','nom','genre', 'nationalite', 
+                            'date_naissance', 'situation_famille', 
+                            'nombre_dependant',]}),
+            ('Adresse', {
+                'fields': ['adresse', 'ville', 'etat_province', 'pays', ]}),
+            ('Informations professionnelles', {
+                'fields': ['niveau_diplome', 'employeur_actuel', 
+                            'poste_actuel', 'domaine_professionnel', ]
+            })]
+        model = Candidat  
index 2a06ee6..ff30747 100755 (executable)
@@ -31,7 +31,6 @@ class Metadata(models.Model):
 
 
 class OffreEmploi(Metadata):
-    # TODO : Afficher les bureaux selon la région choisies?
     nom = models.CharField(max_length=255)
     resume = models.TextField()
     description = models.TextField()
@@ -66,8 +65,8 @@ STATUT_CHOICES = (
 
 class Candidat(Metadata):
     # TODO : Automatiser le statut à la création à Nouveau    
-    statut = models.CharField(max_length=4, 
-                              choices=STATUT_CHOICES)
+    statut = models.CharField(max_length=4, choices=STATUT_CHOICES, 
+                default='NOUV')
     offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
                     related_name='+')
     prenom = models.CharField(max_length=255)
diff --git a/project/recrutement/templates/recrutement/postuler_appel_offre.html b/project/recrutement/templates/recrutement/postuler_appel_offre.html
new file mode 100644 (file)
index 0000000..d77dcb1
--- /dev/null
@@ -0,0 +1,29 @@
+{% extends 'base.html' %}
+
+{% 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">
+        {{ form.as_p }}
+        <div class="submit-row">
+            <input type="submit" name="_save" class="default" value="Enregistrer">
+        </div>
+    </form>
+
+
+
+</div>
+
+{% endblock %}
index f9a1d5e..c8db232 100755 (executable)
@@ -20,7 +20,8 @@ def evaluer_candidat(request):
     if request.method == "POST":
         candidat_evaluation = CandidatEvaluation()
         candidat_evaluation.candidat = candidat
-        form = CandidatEvaluationForm(request.POST, instance=candidat_evaluation, candidat=candidat) 
+        form = CandidatEvaluationForm(request.POST, 
+                instance=candidat_evaluation, candidat=candidat) 
         if form.is_valid():       
             form.save()    
             messages.add_message(request, messages.SUCCESS, 
@@ -31,7 +32,7 @@ def evaluer_candidat(request):
         form = CandidatEvaluationForm(candidat=candidat)
 
     c = {'form' : form}   
-    return render_to_response("recrutement/evaluer_candidat.html", Context(c), \
+    return render_to_response("recrutement/evaluer_candidat.html", Context(c),
                 context_instance = RequestContext(request))
 
 def affecter_evaluateurs_candidats(request):
@@ -48,4 +49,25 @@ def affecter_evaluateurs_candidats(request):
         form = EvaluateurForm(candidats=candidats)
 
     c = {'form' : form}   
-    return render_to_response("recrutement/affecter_evaluateurs.html", Context(c), context_instance = RequestContext(request))
+    return render_to_response("recrutement/affecter_evaluateurs.html", 
+            Context(c), context_instance = RequestContext(request))
+
+def postuler_appel_offre(request):
+    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)
+        if form.is_valid():
+            form.save()
+            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:
+        form = PostulerOffreEmploiForm(offre_emploi=offre_emploi)
+
+    c = {'form' : form}   
+    return render_to_response("recrutement/postuler_appel_offre.html", 
+            Context(c), context_instance = RequestContext(request))
index 75a02bc..756de53 100644 (file)
@@ -4,6 +4,7 @@ import os
 import socket
 from conf import *
 
+
 PROJET_TITRE = "Demande d'autorisation d'embauche"
 
 # Rapports d'erreurs
@@ -49,7 +50,6 @@ MIDDLEWARE_CLASSES = (
 
 ROOT_URLCONF = 'project.urls'
 
-
 INSTALLED_APPS = (
     'auf.django.skin',
     'admin_tools',
@@ -70,7 +70,9 @@ INSTALLED_APPS = (
     'project.rh_v1',
     'project.dae',
     'project.budget', 
-    'project.recrutement', 
+    'project.recrutement',
+    'form_utils',
+#    'private_files', 
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = (
@@ -106,3 +108,5 @@ AJAX_LOOKUP_CHANNELS = {
     'responsables' : ('dae.catalogues', 'Responsable'),
     'dossiers' : ('dae.catalogues', 'Dossier'),
 }
+
+#FILE_PROTECTION_METHOD = 'basic'
index c33e5aa..fc71517 100644 (file)
@@ -21,6 +21,7 @@ urlpatterns = patterns(
     url(r'^recrutement/affecter_evaluateurs_candidats/$', 'recrutement.views.affecter_evaluateurs_candidats', 
         name='affecter_evaluateurs_candidats'),
     url(r'^recrutement/evaluer_candidat/$', 'recrutement.views.evaluer_candidat', name='evaluer_candidat'),
+    url(r'^recrutement/postuler_appel_offre/$', 'recrutement.views.postuler_appel_offre', name='postuler_appel_offre'),    
     (r'^', include('project.rh.urls')),
     (r'^prive/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.PRIVE_MEDIA_ROOT}),
 )