merge branche dev
[auf_rh_dae.git] / project / budget / models.py
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 class Dossier(rh.Dossier_):
118 __doc__ = rh.Dossier_.__doc__
119 simulation = models.ForeignKey(Simulation)
120
121
122 class Evenement(rh.Evenement_):
123 __doc__ = rh.Evenement_.__doc__
124 simulation = models.ForeignKey(Simulation)
125
126
127 class EvenementRemuneration(rh.EvenementRemuneration_):
128 __doc__ = rh.EvenementRemuneration_.__doc__
129 simulation = models.ForeignKey(Simulation)
130
131
132 class Poste(rh.Poste_):
133 __doc__ = rh.Poste_.__doc__
134 simulation = models.ForeignKey(Simulation)
135
136
137 class PosteFinancement(rh.PosteFinancement_):
138 __doc__ = rh.PosteFinancement_.__doc__
139 simulation = models.ForeignKey(Simulation)
140
141
142 class Remuneration(rh.Remuneration_):
143 __doc__ = rh.Remuneration_.__doc__
144 simulation = models.ForeignKey(Simulation)
145
146
147 class TauxChange(rh.TauxChange_):
148 __doc__ = rh.TauxChange_.__doc__
149 simulation = models.ForeignKey(Simulation)
150
151
152 class ValeurPoint(rh.ValeurPoint_):
153 __doc__ = rh.ValeurPoint_.__doc__
154 simulation = models.ForeignKey(Simulation)