From 2064bd810364945767ee3c2113fc3d7afcaaf80e Mon Sep 17 00:00:00 2001 From: Anet Date: Fri, 19 Jun 2020 14:32:35 +0200 Subject: [PATCH] =?UTF-8?q?utils.py:=20kontrola,=20=C5=BEe=20clanek.cislo?= =?UTF-8?q?=20je=20konsistentn=C3=AD=20se=20strukturou=20TreeNod=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/utils.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/seminar/utils.py b/seminar/utils.py index 19223b9b..f504ceb5 100644 --- a/seminar/utils.py +++ b/seminar/utils.py @@ -3,8 +3,10 @@ import datetime from django.contrib.auth.decorators import user_passes_test from html.parser import HTMLParser +from django.contrib.contenttypes.models import ContentType import seminar.models as m +import seminar.treelib as t staff_member_required = user_passes_test(lambda u: u.is_staff) @@ -86,6 +88,31 @@ def seznam_problemu(): # if not r.email: # prb(Resitel, u'Neznámý email', [r]) + ## Kontroly konzistence databáze a TreeNodů + + # Články + for clanek in m.Clanek.objects.all(): + # získáme řešení svázané se článkem a z něj node ve stromě + reseni = clanek.reseni_set + if (reseni.count() != 1): + raise ValueError("Článek k sobě má nejedno řešení!") + r = reseni.first() + clanek_node = r.text_cely # vazba na ReseniNode z Reseni + # content type je věc pomáhající rozeznávat různé typy objektů v django-polymorphic + # protože isinstance vrátí vždy jen TreeNode + # https://django-polymorphic.readthedocs.io/en/stable/migrating.html + cislonode_ct = ContentType.objects.get_for_model(m.CisloNode) + node = clanek_node + while node is not None: + node_ct = node.polymorphic_ctype + if node_ct == cislonode_ct: # dostali jsme se k CisloNode + # zkontrolujeme, že stromové číslo odpovídá atributu + # .cislonode je opačná vazba k treenode_ptr, abychom z TreeNode dostali + # CisloNode + if clanek.cislo != node.cislonode.cislo: + prb(m.Clanek, "Číslo otištění uložené u článku nesedí s " + "číslem otištění podle struktury treenodů.", [clanek]) + break + node = t.get_parent(node) + return problemy - -