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