Commit | Line | Data |
---|---|---|
3fde9fe8 NC |
1 | # -=- encoding: utf-8 -=- |
2 | ||
3 | from django.db import models | |
3fde9fe8 NC |
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 | ||
6e7c919b NC |
11 | def initialize(self): |
12 | """ Copie les données nécessaires à une simulation. """ | |
ba1c941b | 13 | if not self.is_empty(): |
6e7c919b NC |
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 | ||
ba1c941b NC |
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() | |
6e7c919b NC |
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 | ||
0c248d0a NC |
54 | def copy_rh_model(self, obj): |
55 | """ Crée une copie de simulation d'un modèle rh. """ | |
ba1c941b | 56 | initial = dict([('simulation', self)] + |
0c248d0a NC |
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 | ||
0c248d0a NC |
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 | |
3fde9fe8 | 85 | |
ba1c941b NC |
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']: | |
6e7c919b | 109 | raise ValueError(u'Données inconsistantes.') |
ba1c941b | 110 | er.evenement = self.seen_models['evenement'] [er.evenement.id] |
180a4d25 | 111 | |
180a4d25 | 112 | |
6e7c919b NC |
113 | class Classement(rh.Classement_): |
114 | __doc__ = rh.Classement_.__doc__ | |
115 | simulation = models.ForeignKey(Simulation) | |
116 | ||
babf71ec | 117 | |
f31ddfa0 NC |
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 | ||
3fde9fe8 NC |
133 | class Poste(rh.Poste_): |
134 | __doc__ = rh.Poste_.__doc__ | |
135 | simulation = models.ForeignKey(Simulation) | |
136 | ||
137 | ||
f31ddfa0 NC |
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__ | |
3fde9fe8 | 145 | simulation = models.ForeignKey(Simulation) |
6e7c919b NC |
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__ | |
119e48ac | 155 | simulation = models.ForeignKey(Simulation) |