From ab1a8c351d31b394a9f03d657f8531aadb5ca391 Mon Sep 17 00:00:00 2001 From: Serghei MIHAI Date: Fri, 20 Jun 2014 15:50:37 +0200 Subject: [PATCH] families synchronizing updated to prevend cascade data deletion --- synchro_orleans/data/models.py | 38 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/synchro_orleans/data/models.py b/synchro_orleans/data/models.py index 01879ba..5b5512b 100644 --- a/synchro_orleans/data/models.py +++ b/synchro_orleans/data/models.py @@ -93,34 +93,54 @@ class FamilleManager(models.Manager): csv_reader = reader(source, delimiter = ';') caption = csv_reader.next() attrs = map(lambda e: self.attribute_mappings[e], caption) + fields = [field.name for field in self.model._meta.fields] families = () families_links = () + existing_families = dict((fam.id, fam) for fam in self.all()) + links = () for row in csv_reader: params = dict(zip(attrs, row)) - obj_id = params['id'] + obj_id = int(params['id']) pers1 = params.pop('pers1') pers2 = params.pop('pers2') + families_links += ((obj_id, pers1, pers2),) + changed = False # transform all inputs to unicode for key, value in params.iteritems(): params[key] = unicode(value, 'utf-8') - families += (Famille(**params),) + if obj_id not in existing_families: + families += (Famille(**params),) + else: + obj = existing_families.pop(obj_id) + for field in fields: + if getattr(obj, field) != params[field]: + changed = True + setattr(obj, field, params[field]) + if changed: + obj.save() + if existing_families: + self.filter(id__in=existing_families).delete() + + if families: + self.bulk_create(families) + + for link in families_links: + family, pers1, pers2 = link for person in (pers1, pers2): try: member = Personne.objects.get(pk=person) - famille = self.get(pk=obj_id) - families_links += (LiaisonParentFamille(famille = famille, - personne = member),) - except: + famille = self.get(pk=family) + links += (LiaisonParentFamille(famille = famille, + personne = member),) + except ValueError: pass - self.all().delete() - self.bulk_create(families) LiaisonParentFamille.objects.all().delete() - LiaisonParentFamille.objects.bulk_create(families_links) + LiaisonParentFamille.objects.bulk_create(links) class FactureManager(models.Manager):