From: Olivier Larchevêque Date: Fri, 23 Mar 2012 21:08:34 +0000 (-0400) Subject: import DAE X-Git-Tag: 1.6.5~160^2~22 X-Git-Url: http://git.auf.org/?p=auf_rh_dae.git;a=commitdiff_plain;h=47d7067b0abd31800b1263459f37b5a95ea12a27 import DAE --- diff --git a/project/dae/admin.py b/project/dae/admin.py index 945bac3..d5bee3b 100644 --- a/project/dae/admin.py +++ b/project/dae/admin.py @@ -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 "voir la DAE" % 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) diff --git a/project/dae/exporter.py b/project/dae/exporter.py index a43283e..08f4e07 100644 --- a/project/dae/exporter.py +++ b/project/dae/exporter.py @@ -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) - - diff --git a/project/dae/management/commands/dae.py b/project/dae/management/commands/dae.py index 103f55f..0c2b404 100644 --- a/project/dae/management/commands/dae.py +++ b/project/dae/management/commands/dae.py @@ -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)) diff --git a/project/dae/managers.py b/project/dae/managers.py index 197d64c..9d6bd55 100644 --- a/project/dae/managers.py +++ b/project/dae/managers.py @@ -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 + + diff --git a/project/dae/models.py b/project/dae/models.py index eba318d..19f37de 100644 --- a/project/dae/models.py +++ b/project/dae/models.py @@ -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):