Browse Source
Důvodem je, že mi přijde, že stav databáze je dosti složitá a neviditelná věc, na to, aby byla přímo v seminářiv3
Jonas Havelka
1 year ago
5 changed files with 124 additions and 119 deletions
@ -1,96 +0,0 @@ |
|||
|
|||
import datetime |
|||
|
|||
from django.contrib.contenttypes.models import ContentType |
|||
|
|||
from personalni.models import Resitel |
|||
from tvorba.models import Clanek |
|||
from treenode.models import CisloNode |
|||
import treenode.treelib as t |
|||
|
|||
|
|||
def histogram(seznam): |
|||
d = {} |
|||
for i in seznam: |
|||
if i not in d: |
|||
d[i] = 0 |
|||
d[i] += 1 |
|||
return d |
|||
|
|||
|
|||
def seznam_problemu(): |
|||
"""Funkce pro hledání nekonzistencí v databázi a dalších nežádoucích stavů webu/databáze. |
|||
|
|||
Nijak nesouvisí s Problémy zadanými řešitelům.""" |
|||
# FIXME: přejmenovat funkci? |
|||
# FIXME: Tak, jak je napsaná, asi spíš patří někam k views a ne do utils (?) |
|||
problemy = [] |
|||
|
|||
# Pomocna fce k formatovani problemovych hlasek |
|||
def prb(cls, msg, objs=None): |
|||
s = '<b>%s:</b> %s' % (cls.__name__, msg) |
|||
if objs: |
|||
s += ' [' |
|||
for o in objs: |
|||
try: |
|||
url = o.admin_url() |
|||
except: |
|||
url = None |
|||
if url: |
|||
s += '<a href="%s">%s</a>, ' % (url, o.pk,) |
|||
else: |
|||
s += '%s, ' % (o.pk,) |
|||
s = s[:-2] + ']' |
|||
problemy.append(s) |
|||
|
|||
# Duplicita jmen |
|||
jmena = {} |
|||
for r in Resitel.objects.all(): |
|||
j = r.osoba.plne_jmeno() |
|||
if j not in jmena: |
|||
jmena[j] = [] |
|||
jmena[j].append(r) |
|||
for j in jmena: |
|||
if len(jmena[j]) > 1: |
|||
prb(Resitel, 'Duplicitní jméno "%s"' % (j,), jmena[j]) |
|||
|
|||
# Data maturity a narození |
|||
for r in Resitel.objects.all(): |
|||
if not r.rok_maturity: |
|||
prb(Resitel, 'Neznámý rok maturity', [r]) |
|||
if r.rok_maturity and (r.rok_maturity < 1990 or r.rok_maturity > datetime.date.today().year + 10): |
|||
prb(Resitel, 'Podezřelé datum maturity', [r]) |
|||
if r.osoba.datum_narozeni and ( |
|||
r.osoba.datum_narozeni.year < 1970 or r.osoba.datum_narozeni.year > datetime.date.today().year - 12): |
|||
prb(Resitel, 'Podezřelé datum narození', [r]) |
|||
# if not r.email: |
|||
# prb(Resitel, u'Neznámý email', [r]) |
|||
|
|||
## Kontroly konzistence databáze a TreeNodů |
|||
|
|||
# Články |
|||
for clanek in 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(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(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 |
@ -1,3 +1,25 @@ |
|||
from django.shortcuts import render |
|||
|
|||
# Create your views here. |
|||
from various import utils |
|||
from personalni.models import Resitel |
|||
|
|||
|
|||
def StavDatabazeView(request): |
|||
# nastaveni = Nastaveni.objects.get() |
|||
problemy = utils.seznam_problemu() |
|||
muzi = Resitel.objects.filter(osoba__pohlavi_muz=True) |
|||
zeny = Resitel.objects.filter(osoba__pohlavi_muz=False) |
|||
return render( |
|||
request, |
|||
'seminar/stav_databaze.html', |
|||
{ |
|||
# 'nastaveni': nastaveni, |
|||
'problemy': problemy, |
|||
|
|||
'resitele': Resitel.objects.all(), |
|||
'muzi': muzi, |
|||
'zeny': zeny, |
|||
'jmena_muzu': utils.histogram([r.osoba.jmeno for r in muzi]), |
|||
'jmena_zen': utils.histogram([r.osoba.jmeno for r in zeny]), |
|||
} |
|||
) |
|||
|
Loading…
Reference in new issue