From 049eec24c9a639d4f04a28f648c288abd9462a8c Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Sun, 25 Oct 2015 12:23:38 +0100 Subject: [PATCH] Mergovadlo Resitelu --- seminar/tools.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 seminar/tools.py diff --git a/seminar/tools.py b/seminar/tools.py new file mode 100644 index 00000000..7d7aac1d --- /dev/null +++ b/seminar/tools.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +import logging as log +from .models import Resitel +import reversion + +def merge_props(r1, r2, prop, pretend=True, smaller=False, equal=True): + """Merge r2.`prop` into r1.`prop`. + + If r1.`prop` unset, use r1.`prop`=r2.`prop`. + If both set and equal=True, warn if not equal. + If both set and smaller=True, use the smaller one. + With pretend=True does not modify r1. + """ + a1 = r1.__getattribute__(prop) + a2 = r2.__getattribute__(prop) + if not a1: + if not pretend: + r1.__setattr__(prop, a2) + elif a2: + if equal and a1 != a2: + log.warn(u"merge: Ruzna %s: %s VS %s", prop, a1, a2) + if smaller: + if not pretend: + r1.__setattr__(prop, min(a1, a2)) + + +def merge_Resitel(rbase, rmerge, pretend=True): + """Zahrne data a vztahy Resitele rmerge do Resitele rbase, pak smaze rmerge. + + Selze pro uzivatele s user!=NULL. S pretend=True nezmeni databazi. + """ + # Ma relace: skola + # Je v relaci: user, reseni, soustredeni_ucastnici, vysledky_base(VIEW) + + log.info(u"merge: %s <- %s", unicode(rbase), unicode(rmerge)) + + assert not rbase.user + assert not rmerge.user + assert rbase != rmerge + + if (rbase.jmeno != rmerge.jmeno) or (rbase.prijmeni != rmerge.prijmeni): + log.error(u"merge: Ruzna jmena: %s VS %s", rbase, rmerge) + if rbase.rok_maturity != rmerge.rok_maturity: + log.error(u"merge: Ruzne roky maturity: %s VS %s", rbase.rok_maturity, rmerge.rok_maturity) + + with reversion.create_revision(): + reversion.set_comment('Merge duplicitnich Resitelu: %r <- %r' % (rbase.pk, rmerge.pk)) + + merge_props(rbase, rmerge, 'skola', pretend=pretend) + merge_props(rbase, rmerge, 'datum_narozeni', pretend=pretend) + merge_props(rbase, rmerge, 'datum_prihlaseni', pretend=pretend) + merge_props(rbase, rmerge, 'datum_souhlasu_zasilani', pretend=pretend, smaller=True, equal=False) + merge_props(rbase, rmerge, 'datum_souhlasu_udaje', pretend=pretend, smaller=True, equal=False) + merge_props(rbase, rmerge, 'email', pretend=pretend) + if rmerge.import_mamoper_id and not pretend: + rbase.import_mamoper_id += ' ' + rmerge.import_mamoper_id + if rmerge.poznamka and not pretend: + rbase.poznamka += ' ' + rmerge.poznamka + merge_props(rbase, rmerge, 'mesto', pretend=pretend) + merge_props(rbase, rmerge, 'pohlavi_muz', pretend=pretend) + merge_props(rbase, rmerge, 'psc', pretend=pretend) + merge_props(rbase, rmerge, 'stat', pretend=pretend) + merge_props(rbase, rmerge, 'telefon', pretend=pretend) + merge_props(rbase, rmerge, 'ulice', pretend=pretend) + merge_props(rbase, rmerge, 'zasilat', pretend=pretend) + + for res in rmerge.reseni.all(): + if not pretend: + res.resitel = rbase + res.save() + + for uc in rmerge.soustredeni_ucastnici_set.all(): + if not pretend: + uc.resitel = rbase + uc.save() + + if not pretend: + rmerge.delete() + +