# -*- coding: utf-8 -*- import logging as log from .models import Resitel from reversion import revisions as 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("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("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("merge: Ruzna jmena: %s VS %s", rbase, rmerge) if rbase.rok_maturity != rmerge.rok_maturity: log.error("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() rbase.save()