Merge branch 'master' into test test
authorEric Mc Sween <eric.mcsween@auf.org>
Wed, 9 Jan 2013 17:07:01 +0000 (12:07 -0500)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 9 Jan 2013 17:07:01 +0000 (12:07 -0500)
Conflicts:
project/dae/views.py

project/assets/js/dae-choisir-poste.js [new file with mode: 0644]
project/dae/catalogues.py
project/dae/forms.py
project/dae/models.py
project/dae/templates/dae/embauche-choisir-poste.html
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste.html
project/dae/templates/dae/poste_consulter.html
project/dae/views.py

diff --git a/project/assets/js/dae-choisir-poste.js b/project/assets/js/dae-choisir-poste.js
new file mode 100644 (file)
index 0000000..509ffac
--- /dev/null
@@ -0,0 +1,11 @@
+
+$(document).ready(function() {
+        $(".selectlist input[type=text]").change(function() {
+            var filtre = $(this).val();
+            var choix = $(this).parent().find("option");
+            choix.show();
+            choix.each(function(idx) {
+                if ($(this).html().indexOf(filtre) == -1) $(this).hide();
+                });
+            });
+        });
index 9c1dc52..44fe786 100644 (file)
@@ -14,12 +14,22 @@ class Responsable(object):
             return rh.Poste.objects.none()
 
         self.q = q
-        postes = rh.Poste.objects.filter(
-            Q(nom__icontains=q) |
-            Q(type_poste__nom__icontains=q) |
-            Q(rh_dossiers__employe__nom__icontains=q) |
-            Q(rh_dossiers__employe__prenom__icontains=q)
-            ).distinct()
+        filtre = (
+            Q(poste__nom__icontains=q) |
+            Q(poste__type_poste__nom__icontains=q) |
+            Q(employe__nom__icontains=q) |
+            Q(employe__prenom__icontains=q)
+            )
+
+        dossiers = rh.Dossier.objects.\
+                select_related('poste', 'poste__type_poste').\
+                actifs().\
+                filter(filtre)
+        q = q.lower()
+        postes = list(set([d.poste for d in dossiers if q in
+            unicode(d.employe).lower() or \
+            q in d.poste.nom.lower() or \
+            q in d.poste.type_poste.nom.lower()]))
         return postes
 
     def format_result(self, poste):
@@ -28,7 +38,7 @@ class Responsable(object):
             Q(poste__nom__icontains=q) | Q(employe__nom__icontains=q) |
             Q(employe__prenom__icontains=q)
         )
-        dossiers = rh.Dossier.objects.filter(filtre)
+        dossiers = rh.Dossier.objects.actifs().filter(filtre)
 
         nom_poste = poste.nom
 
@@ -36,7 +46,7 @@ class Responsable(object):
             dossier = dossiers[0]
             employe = dossier.employe
         else:
-            dossiers = poste.rh_dossiers.all()
+            dossiers = poste.rh_dossiers.all().order_by('-date_debut')
             if len(dossiers) > 0:
                 employe = unicode(dossiers[0].employe)
             else:
index 77f3835..c70b924 100644 (file)
@@ -1,20 +1,23 @@
 # -*- encoding: utf-8 -*-
 
 from django import forms
+from django.core.urlresolvers import reverse
 from django.forms.models import BaseInlineFormSet
-from django.contrib.admin import widgets as admin_widgets
-from django.db.models import Q, Max
 from django.forms.models import inlineformset_factory, modelformset_factory
+from django.db.models import Q, Max, Count
+from django.shortcuts import redirect
+from django.contrib.admin import widgets as admin_widgets
 
 from ajax_select.fields import AutoCompleteSelectField
 
 from auf.django.references import models as ref
 from auf.django.workflow.forms import WorkflowFormMixin
+from auf.django.workflow.models import WorkflowCommentaire
 
 from project import groups
 from project.rh import models as rh
 from project.dae import models as dae
-from project.dae.workflow import POSTE_ETATS_BOUTONS
+from project.dae.workflow import POSTE_ETATS_BOUTONS, POSTE_ETAT_FINALISE
 
 
 class BaseInlineFormSetWithInitial(BaseInlineFormSet):
@@ -172,13 +175,13 @@ def label_poste_display(poste):
         annee = poste.date_debut.year
 
     nom = poste.nom
-    
-    try:
-        label = u"%s %s - %s [%s]" % (
-            annee, nom, poste.type_poste.categorie_emploi.nom, poste.id
+    label = u"%s (%s) %s [%s]" % (
+        annee,
+        poste.implantation.nom_court,
+        nom,
+        #poste.type_poste.categorie_emploi.nom,
+        poste.id,
         )
-    except:
-        label = unicode(poste)
     return label
 
 
@@ -381,29 +384,57 @@ class PosteForm(forms.ModelForm):
         return cleaned_data
 
 
-class ChoosePosteForm(forms.ModelForm):
+class ChoosePosteForm(forms.Form):
     class Meta:
-        model = dae.Poste
         fields = ('poste',)
 
     # La liste des choix est laissée vide. Voir PosteForm.__init__.
-    poste = forms.ChoiceField(choices=(), required=False)
+    postes_dae = forms.ChoiceField(choices=(), required=False)
+    postes_rh = forms.ChoiceField(choices=(), required=False)
 
     def __init__(self, request=None, *args, **kwargs):
         super(ChoosePosteForm, self).__init__(*args, **kwargs)
-        self.fields['poste'].choices = self._poste_choices(request)
+        self.fields['postes_dae'].choices = self._poste_dae_choices(request)
+        self.fields['postes_rh'].choices = self._poste_rh_choices(request)
 
-    def _poste_choices(self, request):
-        """ Menu déroulant pour les postes. """
-        dae_ = dae.Poste.objects.ma_region_ou_service(request.user) \
-                .filter(id_rh__isnull=True)
-        copies = dae.Poste.objects.ma_region_ou_service(request.user) \
-                .exclude(id_rh__isnull=True)
+    def _poste_dae_choices(self, request):
+        """ Menu déroulant pour les postes."""
+        postes_dae = dae.Poste.objects.ma_region_ou_service(request.user) \
+                .exclude(etat__in=(POSTE_ETAT_FINALISE, )) \
+                .annotate(num_dae=Count('dae_dossiers')) \
+                .filter(num_dae=0) \
+                .order_by('implantation', '-date_debut', )
 
         return [('', '----------')] + \
-               sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
-                      key=lambda t: t[1])
+               [('dae-%s' % p.id, label_poste_display(p)) for p in postes_dae]
 
+    def _poste_rh_choices(self, request):
+        """ Menu déroulant pour les postes."""
+        postes_dae = dae.Poste.objects.exclude(etat__in=(POSTE_ETAT_FINALISE, ))
+        id_poste_dae_commences = [p.id_rh_id for p in postes_dae if p.id_rh is not None]
+        postes_rh = rh.Poste.objects.ma_region_ou_service(request.user) \
+                .exclude(id__in=id_poste_dae_commences) \
+                .order_by('implantation', '-date_debut', )
+
+        return [('', '----------')] + \
+               [('rh-%s' % p.id, label_poste_display(p)) for p in postes_rh]
+
+    def clean(self):
+        cleaned_data = super(ChoosePosteForm, self).clean()
+        postes_dae = cleaned_data.get("postes_dae")
+        postes_rh = cleaned_data.get("postes_rh")
+        if (postes_dae is u"" and postes_rh is u"") or \
+           (postes_dae is not u"" and postes_rh is not u""):
+                raise forms.ValidationError("Choisissez un poste DAE ou un poste RH")
+        return cleaned_data
+
+    def redirect(self):
+        poste_dae_key = self.cleaned_data.get("postes_dae")
+        if poste_dae_key is not u"":
+            return redirect(reverse('embauche', args=(poste_dae_key,)))
+        poste_rh_key = self.cleaned_data.get("postes_rh")
+        if poste_rh_key is not u"":
+            return redirect("%s?creer_dossier_dae='M'" % reverse('poste', args=(poste_rh_key,)))
 
 class EmployeForm(forms.ModelForm):
     """ Formulaire des employés. """
@@ -461,9 +492,24 @@ class DossierWorkflowForm(WorkflowFormMixin):
     def save(self):
         super(DossierWorkflowForm, self).save()
         poste = self.instance.poste
-        if poste.etat == self._etat_initial:
-            poste.etat = self.instance.etat
-            poste.save()
+
+        # créer le commentaire automatique pour le poste associé
+        commentaire = WorkflowCommentaire()
+        commentaire.content_object = poste
+        texte = u"Validation automatique à travers le dossier [%s] de %s\n%s" %(
+                self.instance.id,
+                self.instance,
+                self.data.get('commentaire', ''),
+                )
+        commentaire.texte = texte
+        commentaire.etat_initial = self.instance._etat_courant
+        commentaire.etat_final = self.instance.etat
+        commentaire.owner = self.request.user
+        commentaire.save()
+
+        # force l'état du poste
+        poste.etat = self.instance.etat
+        poste.save()
 
 
 class ContratForm(forms.ModelForm):
index 158af84..135e7e8 100644 (file)
@@ -692,10 +692,11 @@ class Dossier(DossierWorkflow, rh.Dossier_):
             dae_numerisee_rh = dossier_rh.rh_dossierpieces.create(
                 nom=u'DAE numérisée'
             )
-            dae_numerisee_rh.fichier.save(
-                os.path.basename(self.dae_numerisee.name),
-                self.dae_numerisee
-            )
+            if not settings.DEBUG:
+                dae_numerisee_rh.fichier.save(
+                    os.path.basename(self.dae_numerisee.name),
+                    self.dae_numerisee
+                )
 
         # Fermer les rémunérations qui commencent avant le début du contrat
         dossier_rh.rh_remunerations.filter(
index fa5df7d..f6b6139 100644 (file)
@@ -1,5 +1,5 @@
 {% extends 'base.html' %}
-{% load adminmedia %}
+{% load adminmedia dae %}
 
 {% block title %}RH - DAE - Embauche{% endblock %}
 {% block titre %}Ressources humaines{% endblock %}
@@ -8,20 +8,51 @@
 {% block extrahead %}
   <script src="{{ STATIC_URL }}js/jquery-1.5.1.min.js" type="text/javascript"></script>
   <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/dae.css" />
-  <script src="{{ STATIC_URL }}js/dae.js" type="text/javascript"></script>
-  <script src="{{ STATIC_URL }}js/dae-embauche.js" type="text/javascript"></script>
+  <script src="{{ STATIC_URL }}js/dae-choisir-poste.js" type="text/javascript"></script>
 {% endblock %}
 
 {% block main %}
 <h1>Demande d'autorisation d'engagement de personnel</h1>
+
+    <h2 class="section">SECTION 1 - POSTE</h2>
+
+<form action="{% url poste %}" method="get">
+    <ul>
+        <li>
+            <h3>Créer un nouveau poste pour cette DAE</h3>
+            <input type="hidden" value="N" name="creer_dossier_dae"/>
+            <p><input type="submit" value="Créer le poste, puis la DAE" /></p>
+        </li>
+    </ul>
+</form>
+
 <form action="" method="post" enctype="multipart/form-data">
-  <h2 class="section">SECTION 1 - POSTE</h2>
-  <fieldset>
-    <h2>Poste visé</h2>
-
-    <table cellspacing="0">
-      {{ form.as_table }}
-    </table>
-  </fieldset>
+<ul>
+    <li>
+        <h3>Poste existant, ayant fait l'objet d'une validation dans DAE</h3>
+        {{ form.non_field_errors }}
+        <div class="selectlist">
+            {% if request.user|test_membre_drh %}
+            <span class="info">Filter la liste selon une expression : </span><input type="text" />
+            <span class="info">&nbsp;puis appuyer sur TAB</span>
+            {% endif %}
+             <div>{{ form.postes_dae }}</div>
+        </div>
+        <p><input type="submit" value="Créer la DAE" /></p>
+    </li>
+
+    <li>
+        <h3>Poste existant, déjà dans le SGRH</h3>
+        <div class="selectlist">
+            {% if request.user|test_membre_drh %}
+            <span class="info">Filter la liste selon une expression : </span><input type="text" />
+            <span class="info">&nbsp;puis appuyer sur TAB</span>
+            {% endif %}
+            <div>{{ form.postes_rh }}</div>
+        </div>
+        <p><input type="submit" value="Créer la DAE" /></p>
+    </li>
+</ul>
 </form>
+
 {% endblock %}
index 10b2b16..faa876b 100644 (file)
 <h1 class="gauche">Demande d'autorisation d'engagement de personnel</h1>
 <a class="droite bouton-action" href="#" onclick="window.print(); return false;">Impression</a>
 {% if dossier|est_editable:request.user %}
-<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>
+<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier le dossier</a>
+{% endif %}
+{% if dossier.poste|est_editable:request.user %}
+<a class="droite bouton-action" href="{% url poste dossier.poste.key %}">Modifier le poste</a>
 {% endif %}
 {% if importer and not dossier.dossier_rh %}
 <a class="droite bouton-action" href="{% url embauche_importer dossier.id %}">Importer</a>
index 1fa8c24..4094f00 100644 (file)
@@ -35,7 +35,13 @@ Demande d'autorisation d'engagement
 {% endblock %}
 
 {% block main %}
-<h1>Demande d'autorisation de création de poste</h1>
+
+{% if creer_dossier_dae %}
+    <h1>Demande d'autorisation d'engagement de personnel</h1>
+    <h2 class="section">SECTION 1 - POSTE</h2>
+{% else %}
+    <h1>Demande d'autorisation de création de poste</h1>
+{% endif %}
 
 <form action="" method="post" enctype="multipart/form-data">
 
@@ -84,7 +90,8 @@ Demande d'autorisation d'engagement
         <tr>
             <th>{{ form.responsable.label_tag }} :<br />{{ form.responsable.errors }}</th>
             <td>
-                <span class="info">Recherche intelligente : vous pouvez tapez le nom du poste, ou encore la dernière qui occupe celui-ci. Assurez-vous que le poste de responsable choisi dans la liste est reporté en dessous du champs de recherche, cela signifie qu'il est sélectionné.</span>
+                <span class="info">Recherche intelligente : vous pouvez tapez
+                    le nom du poste, ou encore la personne qui occupe celui-ci. Assurez-vous que le poste de responsable choisi dans la liste est reporté en dessous du champs de recherche, cela signifie qu'il est sélectionné.</span>
                 {{ form.responsable }}
             </td>
         </tr>
@@ -350,8 +357,12 @@ Demande d'autorisation d'engagement
     </div>
     </fieldset>
 
-    <input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
-    <input type="submit" name="save" value="Sauvegarder" />
+    {% if creer_dossier_dae %}
+        <input type="submit" name="save" value="Créer ce poste et une embauche associée" />
+    {% else %}
+        <input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
+        <input type="submit" name="save" value="Sauvegarder" />
+    {% endif %}
 
 </form>
 
index 189f0e3..cdbd621 100644 (file)
@@ -37,6 +37,7 @@
 {% endfor %}
 </table>
 
+{% if not poste.dae_dossiers.all %}
 <form action="" method="post">
 <h2>Votre validation</h2>
 <p>Le poste est actuellement à l'état :  <span class="note">{{ poste.get_etat_display }}</span>.</p>
 </table>
 {{ validationForm.get_input_etats_as_buttons|safe }}
 </form>
+{% endif %}
+
 </fieldset>
 
+
 <div class="print-only">
   <h2>Signatures</h2>
   <p class="signature"> ____________________________________________________________</p>
index 1ac7b48..642baf9 100644 (file)
@@ -7,7 +7,7 @@ from django.contrib import messages
 from django.contrib.auth.decorators import login_required, user_passes_test
 from django.contrib.contenttypes.models import ContentType
 from django.core.paginator import Paginator, InvalidPage
-from django.db.models import Q
+from django.db.models import Q, Count
 from django.http import Http404, HttpResponse, HttpResponseNotFound
 from django.shortcuts import redirect, render, get_object_or_404
 from sendfile import sendfile
@@ -128,6 +128,10 @@ def poste(request, key=None):
     il est automatiquement copié dans dae.
 
     """
+    if 'creer_dossier_dae' in request.GET:
+        creer_dossier_dae = True
+    else:
+        creer_dossier_dae = False
 
     def _dupliquer_poste(poste_dae, poste_rh):
         """
@@ -153,6 +157,8 @@ def poste(request, key=None):
     # Type intervention
     if 'type_intervention' in request.GET:
         data['type_intervention'] = request.GET['type_intervention']
+    if creer_dossier_dae:
+        data['type_intervention'] = request.GET['creer_dossier_dae']
 
     # Poste existant
     poste_rh = None
@@ -221,6 +227,9 @@ def poste(request, key=None):
                 request, messages.SUCCESS,
                 "Le poste %s a été sauvegardé." % poste
             )
+            if creer_dossier_dae:
+                return redirect('embauche', key='dae-%s' % poste.id)
+
             if 'save' in request.POST:
                 return redirect('poste_consulter', key='dae-%s' % poste.id)
             else:
@@ -256,6 +265,7 @@ def poste(request, key=None):
         financementForm=financementForm,
         comparaisons_formset=comparaisons_formset,
         poste_rh=poste_rh,
+        creer_dossier_dae=creer_dossier_dae,
     ))
 
     return render(request, 'dae/poste.html', vars)
@@ -271,8 +281,12 @@ def postes_liste(request):
         content_type.id
     )}
     postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
+            .annotate(num_dae=Count('dae_dossiers')) \
+            .filter(num_dae=0) \
             .extra(select=extra_select).order_by('-id')
     postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
+            .annotate(num_dae=Count('dae_dossiers')) \
+            .filter(num_dae=0) \
             .extra(select=extra_select) \
             .filter(~Q(etat=POSTE_ETAT_FINALISE)) \
             .order_by('-id')
@@ -358,8 +372,14 @@ def embauche_importer(request, dossier_id=None):
 
 @dae_groupe_requis
 def embauche_choisir_poste(request):
+    if request.POST:
+        form = ChoosePosteForm(data=request.POST, request=request)
+        if form.is_valid():
+            return form.redirect()
+    else:
+        form = ChoosePosteForm(request=request)
     c = {
-        'form': ChoosePosteForm(request=request),
+        'form': form,
     }
     return render(request, 'dae/embauche-choisir-poste.html', c)