merge recrutement + bypass rh.Poste dependancy
[auf_rh_dae.git] /
1 # -=- encoding: utf-8 -=-
2
3 from django.db import models
4 from rh import models as rh
5
6
7 class Simulation(models.Model):
8     nom = models.CharField(max_length=255,
9                             verbose_name=u'Nom de la simulation')
10
11     def initialize(self):
12         """ Copie les données nécessaires à une simulation. """
13         if not self.is_empty():
14             raise ValueError(u'Cette simulation a déjà été initialisée.')
15
16         self.seen_models = {}
17
18         for model in [rh.Poste, rh.Dossier, rh.Remuneration, rh.Evenement,
19                       rh.EvenementRemuneration, rh.Classement, rh.ValeurPoint,
20                       rh.TauxChange]:
21             self.seen_models[model.__class__.__name__.lower()] = \
22                     self.copy_rh_models(model)
23
24     def is_empty(self):
25         for attr in ['classement_set', 'dossier_set', 'evenement_set',
26                      'evenementremuneration_set', 'poste_set',
27                      'remuneration_set', 'valeurpoint_set', 'tauxchange_set']:
28             if not getattr(self, attr).all().count() == 0:
29                 return False
30         return True
31
32     def reset(self):
33         for attr in ['classement_set', 'dossier_set', 'evenement_set',
34                      'evenementremuneration_set', 'poste_set',
35                      'remuneration_set', 'valeurpoint_set', 'tauxchange_set']:
36             getattr(self, attr).all().delete()
37
38     def copy_rh_models(self, model):
39         """ Crée une copie de simulation de tous les enregistrements d'un
40         modèle donné et en retourne la liste indexée dans un dictionnaire.
41
42         Opère une translation des id si nécessaire. """
43         xlate = getattr(self, 'xlate_%s' % model.__class__.__name__.lower(),
44                         None)
45         seen = {}
46         for orig in model.objects.all():
47             sim = self.copy_rh_model(orig)
48             if xlate is not None:
49                 xlate(sim)
50             sim.save()
51             seen[orig.id] = sim
52         return seen
53
54     def copy_rh_model(self, obj):
55         """ Crée une copie de simulation d'un modèle rh. """
56         initial = dict([('simulation', self)] +
57                        [(f.name, getattr(obj, f.name))
58                         for f in obj._meta.fields
59                         if not isinstance(f, models.AutoField) and
60                            not f in obj._meta.parents.values()])
61         return globals()[obj.__class__.__name__](**initial)
62
63     def initialize(self):
64         """ Copie les données nécessaires à une simulation. """
65         if (self.poste_set.all().count() > 0 or
66           self.dossier_set.all().count() > 0):
67             raise ValueError(u'Cette simulation a déjà été initialisée.')
68
69         postes = {}
70         for rh_p in rh.Poste.objects.all():
71             sim_p = self.copy_rh_model(rh_p)
72             sim_p.save()
73             postes[rh_p.id] = sim_p
74
75         dossiers = {}
76         for rh_d in rh.Dossier.objects.all():
77             sim_d = self.copy_rh_model(rh_d)
78             if not sim_d.poste.id in postes:
79                 self.poste_set.all().delete()
80                 self.dossier_set.all().delete()
81                 raise ValueError(u'Données inconsistantes.')
82             sim_d.poste = postes[sim_d.poste.id]
83             sim_d.save()
84             dossiers[rh_d.id] = sim_d
85
86     def xlate_dossier(self, d):
87         if not d.poste.id in self.seen_models['poste']:
88             raise ValueError(u'Données inconsistantes.')
89         d.poste = self.seen_models['poste'][d.poste.id]
90         if not d.classement.id in self.seen_models['classement']:
91             raise ValueError(u'Données inconsistantes.')
92         d.classement = self.seen_models['classement'] [d.classement.id]
93
94     def xlate_evenement(self, e):
95         if not e.dossier.id in self.seen_models['dossier']:
96             raise ValueError(u'Données inconsistantes.')
97         e.dossier = self.seen_models['dossier'][e.dossier.id]
98
99     def xlate_remuneration(self, r):
100         if not r.dossier.id in self.seen_models['dossier']:
101             raise ValueError(u'Données inconsistantes.')
102         r.dossier = self.seen_models['dossier'] [r.dossier.id]
103
104     def xlate_evenementremuneration(self, er):
105         if not er.dossier.id in self.seen_models['dossier']:
106             raise ValueError(u'Données inconsistantes.')
107         er.dossier = self.seen_models['dossier'] [er.dossier.id]
108         if not er.evenement.id in self.seen_models['evenement']:
109             raise ValueError(u'Données inconsistantes.')
110         er.evenement = self.seen_models['evenement'] [er.evenement.id]
111
112
113 class Classement(rh.Classement_):
114     __doc__ = rh.Classement_.__doc__
115     simulation = models.ForeignKey(Simulation)
116
117
118 class Dossier(rh.Dossier_):
119     __doc__ = rh.Dossier_.__doc__
120     simulation = models.ForeignKey(Simulation)
121
122
123 class Evenement(rh.Evenement_):
124     __doc__ = rh.Evenement_.__doc__
125     simulation = models.ForeignKey(Simulation)
126
127
128 class EvenementRemuneration(rh.EvenementRemuneration_):
129     __doc__ = rh.EvenementRemuneration_.__doc__
130     simulation = models.ForeignKey(Simulation)
131
132
133 class Poste(rh.Poste_):
134     __doc__ = rh.Poste_.__doc__
135     simulation = models.ForeignKey(Simulation)
136
137
138 class PosteFinancement(rh.PosteFinancement_):
139     __doc__ = rh.PosteFinancement_.__doc__
140     simulation = models.ForeignKey(Simulation)
141
142
143 class Remuneration(rh.Remuneration_):
144     __doc__ = rh.Remuneration_.__doc__
145     simulation = models.ForeignKey(Simulation)
146
147
148 class TauxChange(rh.TauxChange_):
149     __doc__ = rh.TauxChange_.__doc__
150     simulation = models.ForeignKey(Simulation)
151
152
153 class ValeurPoint(rh.ValeurPoint_):
154     __doc__ = rh.ValeurPoint_.__doc__
155     simulation = models.ForeignKey(Simulation)