Merge branch 'master' into dae_refactoring_process
[auf_rh_dae.git] / project / dae / forms.py
index 77f3835..929b73c 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 [%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('-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('-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" % 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):