Merge branch 'master' into recrutement
authorPA Parent <paparent@paparent.me>
Tue, 12 Jun 2012 19:46:04 +0000 (15:46 -0400)
committerPA Parent <paparent@paparent.me>
Tue, 12 Jun 2012 19:46:04 +0000 (15:46 -0400)
buildout.cfg
project/dashboard.py
project/recrutement/admin.py
project/recrutement/templates/admin/recrutement/candidat/change_list.html [new file with mode: 0644]
project/recrutement/templates/recrutement/selectionner_statut.html [new file with mode: 0644]
project/recrutement/views.py
project/settings.py
versions.cfg

index 0213d45..50ed453 100644 (file)
@@ -13,6 +13,7 @@ find-links = http://pypi.auf.org/simple/auf.recipe.django/
     http://pypi.auf.org/simple/auf.django.admingroup/
     http://pypi.auf.org/simple/auf.django.permissions/
     http://pypi.auf.org/simple/auf.django.emploi/
+    http://pypi.auf.org/simple/auf.django.export/
     http://pypi.auf.org/django-alphafilter/
     http://pypi.auf.org/simple/auf.django.references/
 develop = src/qbe
@@ -34,6 +35,7 @@ eggs =
     auf.django.admingroup
     auf.django.auth
     auf.django.emploi
+    auf.django.export
     auf.django.metadata
     auf.django.permissions
     auf.django.references
index 39b516b..22b476d 100644 (file)
@@ -17,23 +17,46 @@ from django.utils.translation import ugettext_lazy as _
 
 class CustomIndexDashboard(Dashboard):
     """
-    Custom index dashboard for SIGMA.
+    Custom index dashboard for SGRH.
     """
     def init_with_context(self, context):
 
         # append an app list module for "Applications"
-        self.children.append(modules.AppList(
+        self.children.append(modules.Group(
             _('Applications'),
-            models=(
-                'project.dae.models.*',
-                'project.recrutement.models.*',
-                'project.rh.models.AyantDroit',
-                'project.rh.models.Dossier',
-                'project.rh.models.DossierInactif',
-                'project.rh.models.Employe',
-                'project.rh.models.EmployeInactif',
-                'project.rh.models.Poste',
-            ),
+            display='stacked',
+            children=[
+                modules.ModelList(
+                    title='Demande d\'autorisation d\'engagement',
+                    models=(
+                        'project.dae.models.*',
+                    )
+                ),
+                modules.ModelList(
+                    title='Gestion des candidatures',
+                    models=(
+                        'auf.django.emploi.models.OffreEmploi',
+                        'project.recrutement.models.ProxyOffreEmploi',
+                        'auf.django.emploi.models.Candidat',
+                        'project.recrutement.models.ProxyCandidat',
+                        'project.recrutement.models.CandidatEvaluation',
+                        'project.recrutement.models.MesCandidatEvaluation',
+                        'project.recrutement.models.Evaluateur',
+                        'project.recrutement.models.CourrielTemplate',
+                    )
+                ),
+                modules.ModelList(
+                    title='Gestion des personnels',
+                    models=(
+                        'project.rh.models.AyantDroit',
+                        'project.rh.models.Dossier',
+                        'project.rh.models.DossierInactif',
+                        'project.rh.models.Employe',
+                        'project.rh.models.EmployeInactif',
+                        'project.rh.models.Poste',
+                    )
+                ),
+            ]
         ))
 
         # append an app list module for "Configuration"
index 38dd9a3..b0972b1 100644 (file)
@@ -6,13 +6,18 @@ from django.conf import settings
 from django.contrib import admin
 from django.core.urlresolvers import reverse
 from django.db.models import Avg
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+
+from auf.django.emploi.models import STATUT_CHOICES
 from django.forms.models import BaseInlineFormSet
 from django.http import HttpResponseRedirect
 from django.shortcuts import redirect
 from reversion.admin import VersionAdmin
 
 from auf.django.emploi.models import OffreEmploi, Candidat, CandidatPiece
-from auf.django.references.models import Region, Bureau
+from auf.django.references.models import Region, Bureau, Implantation
+from auf.django.export.admin import ExportAdmin
 
 from project.groups import get_employe_from_user as get_emp
 from project.rh import models as rh
@@ -82,7 +87,7 @@ class OffreEmploiAdmin(BaseAdmin, VersionAdmin):
     ### Afficher la liste des candidats pour l'offre d'emploi
     def _candidatsList(self, obj):
         return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
-            </a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id)
+            </a>" % (reverse('admin:emploi_candidat_changelist'), obj.id)
     _candidatsList.allow_tags = True
     _candidatsList.short_description = "Afficher la liste des candidats"
 
@@ -200,6 +205,13 @@ class OffreEmploiAdmin(BaseAdmin, VersionAdmin):
             return True
         return False
 
+    def formfield_for_foreignkey(self, db_field, request, **kwargs):
+        if db_field.name == 'lieu_affectation':
+            employe = get_emp(request.user)
+            kwargs["queryset"] = Implantation.objects.filter(region=employe.implantation.region)
+            return db_field.formfield(**kwargs)
+        return super(OffreEmploiAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
+
 
 class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
     list_display = (
@@ -245,20 +257,10 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = request.user.groups.all()
-        if request.user.is_superuser is True or \
-            grp_correspondants_rh in user_groupes or \
-            grp_drh in user_groupes or \
-            grp_drh2 in user_groupes or \
-            grp_directeurs_bureau in user_groupes or \
-            grp_administrateurs in user_groupes or \
-            grp_haute_direction in user_groupes:
-            return True
-
         if obj is not None:
             return True
 
-        return False
+        return not super(ProxyOffreEmploiAdmin, self).has_change_permission(request, obj)
 
 
 class CandidatPieceInline(admin.TabularInline):
@@ -298,15 +300,15 @@ class CandidatEvaluationInline(admin.TabularInline):
             return self.readonly_fields + ('evaluateur', 'note', 'commentaire')
         return self.readonly_fields
 
-
-class CandidatAdmin(BaseAdmin, VersionAdmin):
+class CandidatAdmin(BaseAdmin, VersionAdmin, ExportAdmin):
+    change_list_template = 'admin/recrutement/candidat/change_list.html'
     search_fields = ('nom', 'prenom')
     exclude = ('actif', )
     list_editable = ('statut', )
     list_display = ('_candidat', 'offre_emploi',
                     'voir_offre_emploi', 'calculer_moyenne',
                     'afficher_candidat', '_date_creation', 'statut', )
-    list_filter = ('offre_emploi', 'offre_emploi__region', 'statut', )
+    list_filter = ('offre_emploi__nom', 'offre_emploi__region', 'statut', )
 
     fieldsets = (
         ("Offre d'emploi", {
@@ -338,7 +340,13 @@ class CandidatAdmin(BaseAdmin, VersionAdmin):
         CandidatPieceInline,
         CandidatEvaluationInline,
     ]
-    actions = ['envoyer_courriel_candidats']
+    actions = ['envoyer_courriel_candidats', 'changer_statut']
+
+    export_fields = ['statut', 'offre_emploi', 'prenom', 'nom', 'genre',
+                     'nationalite', 'situation_famille', 'nombre_dependant',
+                     'niveau_diplome', 'employeur_actuel', 'poste_actuel',
+                     'domaine_professionnel', 'telephone', 'email', 'adresse',
+                     'ville', 'etat_province', 'code_postal', 'pays']
 
     def _candidat(self, obj):
         txt = u"%s %s (%s)" % (obj.nom.upper(), obj.prenom, obj.genre)
@@ -368,6 +376,23 @@ class CandidatAdmin(BaseAdmin, VersionAdmin):
         )
     envoyer_courriel_candidats.short_description = u'Envoyer courriel'
 
+    ### Changer le statut à des candidats
+    def changer_statut(modeladmin, request, queryset):
+        if request.POST.get('post'):
+            queryset.update(statut=request.POST.get('statut'))
+            return None
+
+        context = {
+            'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME,
+            'queryset': queryset,
+            'status': STATUT_CHOICES,
+        }
+
+        return render_to_response("recrutement/selectionner_statut.html",
+                context, context_instance = RequestContext(request))
+
+    changer_statut.short_description = u'Changer statut'
+
     ### Évaluer un candidat
     def evaluer_candidat(self, obj):
         return "<a href='%s?candidat__id__exact=%s'>" \
@@ -383,7 +408,7 @@ class CandidatAdmin(BaseAdmin, VersionAdmin):
         items = [u"<li><a href='%s%s'>%s</li>" % \
                 (settings.OE_PRIVE_MEDIA_URL, pj.path, pj.get_nom_display()) \
                 for pj in obj.pieces_jointes()]
-        html = "<a href='%s'>Voir le candidat</a>" % (
+        html = "<a href='%s'>Candidature</a>" % (
             reverse('admin:recrutement_proxycandidat_change', args=(obj.id,))
         )
         return "%s<ul>%s</ul>" % (html, "\n".join(items))
@@ -468,6 +493,13 @@ class CandidatAdmin(BaseAdmin, VersionAdmin):
             return True
         return False
 
+    def formfield_for_foreignkey(self, db_field, request, **kwargs):
+        if db_field.name == 'offre_emploi':
+            employe = get_emp(request.user)
+            kwargs["queryset"] = OffreEmploi.objects.filter(region=employe.implantation.region)
+            return db_field.formfield(**kwargs)
+        return super(CandidatAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
+
     def get_changelist(self, request, **kwargs):
         return OrderedChangeList
 
@@ -544,23 +576,13 @@ class ProxyCandidatAdmin(CandidatAdmin):
         return False
 
     def has_change_permission(self, request, obj=None):
-        user_groupes = request.user.groups.all()
-        if request.user.is_superuser is True or \
-            grp_correspondants_rh in user_groupes or \
-            grp_drh in user_groupes or \
-            grp_drh2 in user_groupes or \
-            grp_directeurs_bureau in user_groupes or \
-            grp_administrateurs in user_groupes or \
-            grp_haute_direction in user_groupes:
-            return True
-
         if obj is not None:
             evaluateur = Evaluateur.objects.get(user=request.user)
             for e in obj.evaluations.all():
                 if e.evaluateur == evaluateur:
                     return True
 
-        return False
+        return not super(ProxyCandidatAdmin, self).has_change_permission(request, obj)
 
     def get_actions(self, request):
         return None
@@ -751,7 +773,7 @@ class CandidatEvaluationAdmin(BaseAdmin):
             grp_directeurs_bureau in user_groupes or \
             grp_administrateurs in user_groupes or \
             grp_haute_direction in user_groupes:
-            return qs
+            return qs.filter(candidat__statut__in=('REC', 'SEL'))
 
         evaluateur = Evaluateur.objects.get(user=request.user)
         candidats_evaluations = \
@@ -762,6 +784,7 @@ class CandidatEvaluationAdmin(BaseAdmin):
 
 
 class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin):
+    list_filter = []
 
     def has_change_permission(self, request, obj=None):
         try:
diff --git a/project/recrutement/templates/admin/recrutement/candidat/change_list.html b/project/recrutement/templates/admin/recrutement/candidat/change_list.html
new file mode 100644 (file)
index 0000000..253a058
--- /dev/null
@@ -0,0 +1,17 @@
+{% extends "admin/change_list.html" %}
+{% load i18n %}
+
+
+{% block object-tools %}
+    <ul class="object-tools">
+        {% if not is_popup %}
+                       <li><a href="{{ export_csv_url }}">{% trans 'Export CSV' %}</a></li>
+                       <li><a href="{{ export_ods_url }}">{% trans 'Export ODS' %}</a></li>
+            <li><a href="{{recoverlist_url}}" class="recoverlink">{% blocktrans with cl.opts.verbose_name_plural|escape as name %}Recover deleted {{name}}{% endblocktrans %}</a></li>
+        {% endif %}
+               {% if has_add_permission %}
+            <li><a href="{{add_url}}{% if is_popup %}?_popup=1{% endif %}" class="addlink">{% blocktrans with cl.opts.verbose_name|escape as name %}Add {{name}}{% endblocktrans %}</a></li>
+        {% endif %}
+    </ul>
+{% endblock %}
+
diff --git a/project/recrutement/templates/recrutement/selectionner_statut.html b/project/recrutement/templates/recrutement/selectionner_statut.html
new file mode 100644 (file)
index 0000000..b60e3e8
--- /dev/null
@@ -0,0 +1,60 @@
+{% extends 'admin/base_site.html' %}
+{% load i18n adminmedia form_utils_tags %}
+
+{% block title %}RH - Recrutement{% endblock %}
+{% block sous_titre %}Changer statut aux candidats{% endblock %}
+{% block extrahead %}
+{{ form.media }}
+{% endblock %}
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../">{% trans "Recrutement" %}</a> &rsaquo;
+     {% trans "Changer statut - Sélectionner le statut" %}
+</div>
+{% endif %}{% endblock %}
+
+
+{% block content %}
+<div id="content-main">
+    {% block object-tools %}{% endblock %}
+
+    <div class="module">
+        <h2>Sélectionner le statut</h2>
+
+        <form action="" method="post">{% csrf_token %}
+            <table>
+                <tr>
+                    <td>Changer le statut des candidats suivant:</td>
+                    <td>
+                        <ul>
+                            {{ queryset|unordered_list }}
+                        </ul>
+                    </td>
+                </tr>
+                <tr>
+                    <td>Nouveau statut</td>
+                    <td>
+                        <select name="statut">
+                        {% for statut in status %}
+                        <option value="{{ statut.0 }}">{{ statut.1 }}</option>
+                        {% endfor %}
+                        </select>
+                    </td>
+                </tr>
+            </table>
+            {% for obj in queryset %}
+            <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk }}" />
+            {% endfor %}
+            <input type="hidden" name="action" value="changer_statut" />
+            <input type="hidden" name="post" value="yes" />
+            <div class="submit-row">
+                <input type="submit" value="Changer">
+            </div>
+        </form>
+    </div>
+
+
+</div>
+
+{% endblock %}
index e751c55..3538ac0 100644 (file)
@@ -113,7 +113,7 @@ def affecter_evaluateurs_offre_emploi(request):
                 request, messages.SUCCESS,
                 "Les évaluateurs ont été affectés aux offres d'emploi."
             )
-            return redirect("admin:recrutement_proxyoffreemploi_changelist")
+            return redirect("admin:emploi_offreemploi_changelist")
     else:
         form = forms.EvaluateurForm(offres_emploi=offres_emploi)
     c = {
index 96525ff..755a4bd 100644 (file)
@@ -75,6 +75,7 @@ INSTALLED_APPS = (
     'auf.django.workflow',
     'auf.django.permissions',
     'auf.django.emploi',
+    'auf.django.export',
     'admin_tools',
     'admin_tools.theming',
     'admin_tools.menu',
index b4a5bfb..6e7682f 100644 (file)
@@ -60,5 +60,8 @@ setuptools = 0.6c12dev-r88846
 # Added by Buildout Versions at 2012-05-30 13:39:28.023002
 django-picklefield = 0.2.1
 
+# Added by Buildout Versions at 2012-06-06 10:42:23.231268
+auf.django.export = 0.3
+
 # Added by Buildout Versions at 2012-06-08 11:15:52.545562
 auf.django.emploi = 1.2dev