Browse Source

utils.py: kontrola, že clanek.cislo je konsistentní se strukturou TreeNodů

middleware_test
Anet 4 years ago
parent
commit
2064bd8103
  1. 31
      seminar/utils.py

31
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])
return problemy
## 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

Loading…
Cancel
Save