import DAE
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 23 Mar 2012 21:08:34 +0000 (17:08 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 23 Mar 2012 21:08:34 +0000 (17:08 -0400)
project/dae/admin.py
project/dae/exporter.py
project/dae/management/commands/dae.py
project/dae/managers.py
project/dae/models.py

index 945bac3..d5bee3b 100644 (file)
@@ -1,10 +1,13 @@
 # -*- encoding: utf-8 -*-
 
-from django.contrib import admin
 from django import forms
+from django.core.urlresolvers import reverse
+from django.contrib import admin
+from django.contrib import messages
+from django.shortcuts import redirect
 from reversion.admin import VersionAdmin
 from auf.django.workflow.models import WorkflowCommentaire
-from models import Poste, Dossier
+from models import Poste, Dossier, DossierFinalise
 
 class PosteAdmin(VersionAdmin):
     list_display = ('nom', 'implantation', 'etat', )
@@ -89,6 +92,53 @@ class DossierStatutAdmin(VersionAdmin):
         form.user = request.user
         return form
 
+
+class ImportDossierAdmin(admin.ModelAdmin):
+    list_display = ('_poste', '_employe', '_dae', )
+    actions = ['importer_dans_RH', ]
+
+    def _employe(self, obj):
+        return obj.employe
+
+    def _poste(self, obj):
+        return obj.poste.nom
+
+    def _implantation(self, obj):
+        return obj.poste.implantation
+
+    def _dae(self, obj):
+        url = reverse('embauche_consulter', args=(obj.id, ))
+        return "<a href='%s'>voir la DAE</a>" % url
+    _dae.allow_tags = True
+
+    def has_delete_permission(self, request, obj=None):
+        return False
+
+    def has_add_permission(self, request):
+        return False
+
+    def has_change_permission(self, request, obj=None):
+        if obj is None:
+            return True
+        else:
+            return False
+
+    def get_actions(self, request):
+        actions = super(ImportDossierAdmin, self).get_actions(request)
+        del actions['delete_selected']
+        return actions
+
+    def importer_dans_RH(self, request, data):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        dae = [d for d in Dossier.objects.filter(id__in=selected)]
+        for d in dae:
+            copie = d.importer()
+            messages.add_message(request, messages.SUCCESS, u"%s importé dans\
+                    RH" % d)
+            url = reverse('admin:rh_dossier_change', args=(copie.id, ))
+            return redirect(url)
+
 admin.site.register(Poste, PosteAdmin)
 admin.site.register(Dossier, DossierAdmin)
 admin.site.register(ProxyDossierStatut, DossierStatutAdmin)
+admin.site.register(DossierFinalise, ImportDossierAdmin)
index a43283e..08f4e07 100644 (file)
@@ -6,7 +6,8 @@ import os
 import  shutil
 
 from django.conf import settings
-from project.rh import  models as rh
+from project.rh import models as rh
+import models as dae
 
 SKIP = "** SKIP **"
 
@@ -28,10 +29,12 @@ class SuperCopier(object):
             self.stdout.write(txt)
 
     def clean_id(self, source, copy, parent, field, value):
-        self.out(SKIP, 1)
+        self.out(SKIP, 2)
         return []
 
     def parent(self, parent, child):
+        if not self.dry_run:
+            parent.save()
         klass = parent.__class__.__name__.lower()
         k = "%s_id" % klass
         setattr(child, k, parent.id)
@@ -56,9 +59,6 @@ class SuperCopier(object):
             else:
                 setattr(copy, f.name, value)
 
-        if not self.dry_run:
-            copy.save()
-    
         for obj_composition in obj._meta._related_objects_cache:
             app_label, dummy = obj_composition.name.split(':')
             field_name = obj_composition.field.rel.related_name
@@ -76,7 +76,7 @@ class SuperCopier(object):
                 # no reverse relation
                 self.out(" %s %s" % (field_name, str(e)), 1)
                 continue
-            
+
             for child in children:
                 child_copy = self.duplicate(child, parent=copy, level=level+1,)
                 parentship_fct = "parent_%s" % (field_name)
@@ -85,9 +85,9 @@ class SuperCopier(object):
                 else:
                     parentship = getattr(self, "parent")
                 parentship(copy, child_copy)
-                
                 if not self.dry_run:
                     child_copy.save()
+    
         return copy
 
 
@@ -113,6 +113,10 @@ class PosteCopier(SuperCopier):
         self.out(SKIP, 1)
         return []
 
+    def clean_poste(self, source, copy, parent, field, value):
+        self.out(SKIP, 1)
+        return []
+
     def clean_fichier(self, source, copy, parent, field, value):
         filename = value.path.split('/')[-1]
         copy.poste_id = parent.id
@@ -152,6 +156,11 @@ class DossierCopier(SuperCopier):
         self.out(SKIP, 1)
         return []
 
+    def clean_dossier(self, source, copy, parent, field, value):
+        self.out(SKIP, 1)
+        return []
+
+
     def clean_employe(self, source, copy, parent, field, value):
         if source.employe.id_rh is not None:
             copy.employe = source.employe.id_rh
@@ -164,8 +173,17 @@ class DossierCopier(SuperCopier):
             copy.employe = nouvel_employe
 
     def clean_poste(self, source, copy, parent, field, value):
-        copier = PosteCopier(verbosity=self.verbosity, dry_run=self.dry_run)
-        poste = copier.duplicate(value)
+        # poste comparaison a un champs nommé poste
+        if isinstance(value, unicode):
+            setattr(copy, field.name, value)
+            return
+
+        if dae.ImportPoste.objects.filter(dae=value).exists():
+            poste = dae.ImportPoste.get(dae=value).rh
+        else:
+            copier = PosteCopier(verbosity=self.verbosity,
+                    dry_run=self.dry_run)
+            poste = copier.duplicate(value)
         copy.poste_id = poste.id
 
     def clean_fichier(self, source, copy, parent, field, value):
@@ -194,5 +212,3 @@ class DossierCopier(SuperCopier):
         dst = os.path.join(settings.PRIVE_MEDIA_ROOT, new_value)
         shutil.copy(src, dst)
         setattr(copy, field.name, new_value)
-
-
index 103f55f..0c2b404 100644 (file)
@@ -3,7 +3,6 @@
 from django.core.management.base import BaseCommand
 
 from project.dae import  models as dae
-from project.dae import exporter
 
 class Command(BaseCommand):
 
@@ -29,17 +28,7 @@ class Command(BaseCommand):
             return
 
 
-        dry_run = True
-        if len(args) >= 3 and args[2] == "run":
-            dry_run = False
-
-        verbosity = 0
-        if len(args) >= 4:
-            verbosity = int(args[3])
-
-        class_copier = getattr(exporter, "%sCopier" %  classname.title())
-        copier = class_copier(verbosity=verbosity, dry_run=dry_run)
-
-        copy = copier.duplicate(obj)
-        self.stdout.write(u"\n[%s] DAE:%s => RH:%s\n" % (obj.__class__.__name__, obj.id, copy.id))
+        copy = obj.importer()
+        self.stdout.write(u"\n[%s] DAE:%s => RH:%s\n" %
+                (obj.__class__.__name__, obj.id, copy.id))
         
index 197d64c..9d6bd55 100644 (file)
@@ -3,17 +3,13 @@
 from django.db import models
 from django.db.models import Q
 from utils import get_employe_from_user
-from workflow import MAP_GROUPE_ETATS_A_FAIRE
-from workflow import dae_groupes, \
-                     grp_administrateurs, \
-                     grp_directeurs_bureau, \
-                     grp_drh, \
+from workflow import MAP_GROUPE_ETATS_A_FAIRE, DOSSIER_ETAT_FINALISE
+from workflow import grp_drh, \
                      grp_drh2, \
                      grp_accior, \
                      grp_abf, \
                      grp_haute_direction, \
-                     grp_service_utilisateurs, \
-                     grp_correspondants_rh
+                     grp_service_utilisateurs
 
 from rh.managers import DossierManager as RHDossierManager
 from rh.managers import PosteManager as RHPosteManager
@@ -57,3 +53,10 @@ class PosteComparaisonManager(RHPosteComparaisonManager, TodoManagerMixin):
 class DossierComparaisonManager(RHDossierComparaisonManager, TodoManagerMixin):
     pass
 
+class DossierFinaliseManager(models.Manager):
+    def get_query_set(self):
+        qs = super(DossierFinaliseManager,
+                self).get_query_set().filter(etat=DOSSIER_ETAT_FINALISE)
+        return qs
+
+
index eba318d..19f37de 100644 (file)
@@ -11,7 +11,7 @@ from workflow import DOSSIER_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REGION_FINALISA
 from auf.django.metadata.models import AUFMetadata
 from managers import *
 from rh.models import HELP_TEXT_DATE
-
+from exporter import DossierCopier, PosteCopier
 
 # Upload de fichiers
 UPLOAD_STORAGE = FileSystemStorage(settings.PRIVE_MEDIA_ROOT)
@@ -54,47 +54,9 @@ class Poste(PosteWorkflow, rh.Poste_):
     # Managers
     objects = PosteManager()
 
-
-    def est_importe(self):
-        """Test si le poste a déjà été importé"""
-        return ImportPoste.objects.filter(dae=self).exists()
-
-    def importer(self):
-        if self.est_importe():
-            return ImportPoste.objects.get(dae=self)
-        rh_poste = rh.Poste()
-        # Faire une copie profonde de l'objet.
-        # PosteFinancement, PosteComparaison, Remun modele a ajuster...
-
-        def copy_model(src, dst, exclude=[]):
-            keys = [f.name for f in src._meta.fields if f.name not in ['id', ] + exclude]
-            for k in keys:
-                setattr(dst, k, getattr(src, k))
-            return dst
-        
-        rh_poste = copy_model(self, rh_poste)
-        rh_poste.save()
-        print rh_poste.id
-
-        for o in self.dae_financements.all():
-            rh_financement = rh.PosteFinancement()
-            rh_financement = copy_model(o, rh_financement, exclude=['poste',])
-            rh_financement.poste = rh_poste
-            rh_financement.save()
-
-        for o in self.dae_pieces.all():
-            rh_piece = rh.PostePiece()
-            rh_piece = copy_model(o, rh_piece, exclude=['poste',])
-            rh_piece.poste = rh_poste
-            rh_piece.save()
-
-        for o in self.dae_comparaisons_internes.all():
-            rh_comp = rh.PosteComparaison()
-            rh_comp = copy_model(o, rh_financement, exclude=['poste',])
-            rh_comp.poste = rh_poste
-            rh_comp.save()
-
-        return rh_poste
+    def importer(self, verbosity=0, dry_run=False):
+        copieur = PosteCopier(verbosity=verbosity, dry_run=dry_run)
+        return copieur.duplicate(self)
 
     def _get_key(self):
         """
@@ -453,14 +415,9 @@ class Dossier(DossierWorkflow, rh.Dossier_):
     def __unicode__(self):
         return u'[%s] %s - %s' % (self.poste.implantation, self.poste.nom, self.employe)
 
-    def est_importe(self):
-        """Test si le dossier a déjà été importé"""
-        return dae.ImportDossier.objects.filter(dae=self).exists()
-
-    def importer(self):
-        if not self.poste.est_importe():
-            raise Exception('Le poste de cette DAE doît être importé')
-        return True
+    def importer(self, verbosity=0, dry_run=False):
+        copieur = DossierCopier(verbosity=verbosity, dry_run=dry_run)
+        return copieur.duplicate(self)
 
     def get_salaire_anterieur_euros(self):
         if self.devise_anterieur is None:
@@ -611,6 +568,16 @@ class Remuneration(rh.Remuneration_):
 class Contrat(rh.Contrat_):
     pass
 
+
+class DossierFinalise(Dossier):
+
+    objects = DossierFinaliseManager()
+
+    class Meta:
+        proxy = True
+        verbose_name = "Import d'un dossier finalisé"
+        verbose_name_plural = "Import des dossiers finalisés"
+
 # modèle de liaison entre les systèmes
 
 class ImportDossier(models.Model):