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 |
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