Příprava na nahrávání obsahu z texu
This commit is contained in:
parent
4fdc0ac0ec
commit
3439a3f15e
2 changed files with 148 additions and 9 deletions
|
@ -49,4 +49,7 @@ urlpatterns = [
|
||||||
staff_member_required(views.obalkovaniView), name='seminar_cislo_resitel_obalkovani'),
|
staff_member_required(views.obalkovaniView), name='seminar_cislo_resitel_obalkovani'),
|
||||||
url(r'^soustredeni/(?P<soustredeni>\d+)/obalky.pdf',
|
url(r'^soustredeni/(?P<soustredeni>\d+)/obalky.pdf',
|
||||||
staff_member_required(views.soustredeniObalkyView), name='seminar_soustredeni_obalky'),
|
staff_member_required(views.soustredeniObalkyView), name='seminar_soustredeni_obalky'),
|
||||||
|
|
||||||
|
url(r'^tex-upload/login/$', views.LoginView, name='seminar_login'),
|
||||||
|
url(r'^tex-upload/$', staff_member_required(views.TexUploadView), name='seminar_tex_upload'),
|
||||||
]
|
]
|
||||||
|
|
154
seminar/views.py
154
seminar/views.py
|
@ -1,15 +1,17 @@
|
||||||
# coding:utf-8
|
# coding:utf-8
|
||||||
|
|
||||||
from django.shortcuts import get_object_or_404, render
|
from django.shortcuts import get_object_or_404, render
|
||||||
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
|
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
|
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||||
|
from django.contrib.auth import authenticate, login
|
||||||
|
|
||||||
from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici
|
from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka
|
||||||
from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
||||||
from . import utils
|
from . import utils
|
||||||
|
|
||||||
|
@ -21,6 +23,10 @@ import shutil
|
||||||
import os
|
import os
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import unicodedata
|
import unicodedata
|
||||||
|
import json
|
||||||
|
import traceback
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def verejna_temata(rocnik):
|
def verejna_temata(rocnik):
|
||||||
"""Vrací queryset zveřejněných témat v daném ročníku.
|
"""Vrací queryset zveřejněných témat v daném ročníku.
|
||||||
|
@ -318,7 +324,7 @@ class CisloView(generic.DetailView):
|
||||||
# za každé řešení doplníme k příslušnému řešiteli a úloze body
|
# za každé řešení doplníme k příslušnému řešiteli a úloze body
|
||||||
for r in reseni:
|
for r in reseni:
|
||||||
vysledky_resitele[r.resitel.id].body_ulohy[problem_index[r.problem.id]] = r.body
|
vysledky_resitele[r.resitel.id].body_ulohy[problem_index[r.problem.id]] = r.body
|
||||||
|
|
||||||
context['vysledkovka'] = vysledkovka
|
context['vysledkovka'] = vysledkovka
|
||||||
context['problemy'] = problemy
|
context['problemy'] = problemy
|
||||||
context['v_cisle_zadane'] = v_cisle_zadane
|
context['v_cisle_zadane'] = v_cisle_zadane
|
||||||
|
@ -360,9 +366,9 @@ def aktualniResitele(rocnik):
|
||||||
return Resitel.objects.filter(rok_maturity__gt = letos.prvni_rok)
|
return Resitel.objects.filter(rok_maturity__gt = letos.prvni_rok)
|
||||||
# # ALERT: pokud nekdo nema vypleny rok maturity, tak neni aktualni, protoze Karel Tesar a jini
|
# # ALERT: pokud nekdo nema vypleny rok maturity, tak neni aktualni, protoze Karel Tesar a jini
|
||||||
# return Resitel.objects.filter(Q(rok_maturity__gt = letos.prvni_rok)|Q(rok_maturity = None))
|
# return Resitel.objects.filter(Q(rok_maturity__gt = letos.prvni_rok)|Q(rok_maturity = None))
|
||||||
|
|
||||||
# Vraci QuerySet aktivnich resitelu =
|
# Vraci QuerySet aktivnich resitelu =
|
||||||
# jeste neodmaturovali &&
|
# jeste neodmaturovali &&
|
||||||
# (pokud je aktualni cislo mensi nez 3, pak (letos || loni) neco poslali
|
# (pokud je aktualni cislo mensi nez 3, pak (letos || loni) neco poslali
|
||||||
# jinak letos neco poslali)
|
# jinak letos neco poslali)
|
||||||
def aktivniResitele(rocnik,cislo):
|
def aktivniResitele(rocnik,cislo):
|
||||||
|
@ -370,11 +376,11 @@ def aktivniResitele(rocnik,cislo):
|
||||||
loni = CisloObalkyStruct()
|
loni = CisloObalkyStruct()
|
||||||
|
|
||||||
aktualni_resitele = aktualniResitele(rocnik)
|
aktualni_resitele = aktualniResitele(rocnik)
|
||||||
|
|
||||||
letos.rocnik = Rocnik.objects.get(rocnik = rocnik)
|
letos.rocnik = Rocnik.objects.get(rocnik = rocnik)
|
||||||
loni.rocnik = Rocnik.objects.get(rocnik = int(rocnik)-1)
|
loni.rocnik = Rocnik.objects.get(rocnik = int(rocnik)-1)
|
||||||
letos.cisla = Cislo.objects.filter(rocnik=letos.rocnik,cislo__lte = cislo)
|
letos.cisla = Cislo.objects.filter(rocnik=letos.rocnik,cislo__lte = cislo)
|
||||||
loni.cisla = Cislo.objects.filter(rocnik=loni.rocnik)
|
loni.cisla = Cislo.objects.filter(rocnik=loni.rocnik)
|
||||||
if int(cislo) > 3:
|
if int(cislo) > 3:
|
||||||
problemy = Problem.objects.filter(cislo_zadani = letos.cisla)
|
problemy = Problem.objects.filter(cislo_zadani = letos.cisla)
|
||||||
else:
|
else:
|
||||||
|
@ -382,7 +388,7 @@ def aktivniResitele(rocnik,cislo):
|
||||||
resitele = aktualni_resitele.filter(reseni = Reseni.objects.filter(problem=problemy)).distinct()
|
resitele = aktualni_resitele.filter(reseni = Reseni.objects.filter(problem=problemy)).distinct()
|
||||||
|
|
||||||
return resitele
|
return resitele
|
||||||
|
|
||||||
|
|
||||||
def cisloObalkyView(request,rocnik,cislo):
|
def cisloObalkyView(request,rocnik,cislo):
|
||||||
return obalkyView(request,aktivniResitele(rocnik,cislo))
|
return obalkyView(request,aktivniResitele(rocnik,cislo))
|
||||||
|
@ -487,3 +493,133 @@ def StavDatabazeView(request):
|
||||||
'jmena_muzu': utils.histogram([r.jmeno for r in muzi]),
|
'jmena_muzu': utils.histogram([r.jmeno for r in muzi]),
|
||||||
'jmena_zen': utils.histogram([r.jmeno for r in zeny]),
|
'jmena_zen': utils.histogram([r.jmeno for r in zeny]),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ensure_csrf_cookie
|
||||||
|
def LoginView(request):
|
||||||
|
"""Pro přihlášení při nahrávání z texu"""
|
||||||
|
q = request.POST
|
||||||
|
# nastavení cookie csrftoken
|
||||||
|
if not q:
|
||||||
|
return JsonResponse({"ok": 1})
|
||||||
|
|
||||||
|
if "username" in q:
|
||||||
|
username = q["username"]
|
||||||
|
password = q["password"]
|
||||||
|
user = authenticate(username=username, password=password)
|
||||||
|
if user is not None and user.is_staff:
|
||||||
|
login(request, user)
|
||||||
|
return JsonResponse({"ok": 1})
|
||||||
|
else:
|
||||||
|
return JsonResponse({"error": "Neplatné uživatelské jméno nebo heslo"})
|
||||||
|
|
||||||
|
|
||||||
|
@ensure_csrf_cookie
|
||||||
|
def TexUploadView(request):
|
||||||
|
|
||||||
|
def uloz_soubory(files, rocnik, cislo):
|
||||||
|
for filename, f in files:
|
||||||
|
path = "{}/{}/{}/{}".format(
|
||||||
|
settings.CISLO_IMG_DIR,
|
||||||
|
rocnik,
|
||||||
|
cislo,
|
||||||
|
filename
|
||||||
|
)
|
||||||
|
|
||||||
|
adresar = os.path.dirname(path)
|
||||||
|
if not os.path.exists(adresar):
|
||||||
|
os.makedirs(adresar)
|
||||||
|
|
||||||
|
with open(path, "wb+") as fout:
|
||||||
|
for chunk in f.chunks():
|
||||||
|
fout.write(chunk)
|
||||||
|
|
||||||
|
q = request.POST
|
||||||
|
# nastavení cookie csrftoken
|
||||||
|
if not q:
|
||||||
|
return JsonResponse({"ok": 1})
|
||||||
|
|
||||||
|
# Odchytíme všechny výjimky a traceback pošleme v odpovědi
|
||||||
|
try:
|
||||||
|
meta = json.loads(q["meta"])
|
||||||
|
html = q["html"]
|
||||||
|
|
||||||
|
if meta["typ"] in ["uloha", "serial", "reseni"]:
|
||||||
|
|
||||||
|
# Uložíme soubory
|
||||||
|
if meta["typ"] != "reseni":
|
||||||
|
c = meta["cislo"]
|
||||||
|
else:
|
||||||
|
# Řešení má nastavené číslo svojí úlohy, ale obrázky jsou
|
||||||
|
# ukládány do čísla, kde řešení vyšlo
|
||||||
|
c = meta["cislo_reseni"]
|
||||||
|
uloz_soubory(request.FILES.items(), meta["rocnik"], c)
|
||||||
|
|
||||||
|
# Zjistíme typ ukládaného problému
|
||||||
|
typy = {
|
||||||
|
"uloha": Problem.TYP_ULOHA,
|
||||||
|
"serial": Problem.TYP_SERIAL,
|
||||||
|
"reseni": Problem.TYP_ULOHA,
|
||||||
|
}
|
||||||
|
problem_typ = typy[meta["typ"]]
|
||||||
|
|
||||||
|
|
||||||
|
# Pokud už problém existuje, vytáhneme jej z db a upravíme
|
||||||
|
|
||||||
|
# Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku ->
|
||||||
|
# číslo/ročník se musí založit ručně v adminu
|
||||||
|
rocnik = Rocnik.objects.get(rocnik=meta["rocnik"])
|
||||||
|
cislo = Cislo.objects.get(rocnik=rocnik, cislo=meta["cislo"])
|
||||||
|
|
||||||
|
existujici = Problem.objects.filter(
|
||||||
|
typ=problem_typ,
|
||||||
|
stav=Problem.STAV_ZADANY,
|
||||||
|
cislo_zadani=cislo,
|
||||||
|
kod=meta["kod"]
|
||||||
|
)
|
||||||
|
|
||||||
|
problem = None
|
||||||
|
if existujici:
|
||||||
|
problem = existujici[0]
|
||||||
|
# Jinak vytvoříme nový
|
||||||
|
else:
|
||||||
|
problem = Problem(
|
||||||
|
typ=problem_typ,
|
||||||
|
stav=Problem.STAV_ZADANY,
|
||||||
|
kod=meta["kod"],
|
||||||
|
cislo_zadani=cislo
|
||||||
|
)
|
||||||
|
|
||||||
|
if meta["typ"] == "reseni":
|
||||||
|
problem.text_reseni = html
|
||||||
|
#při nahrávání řešení už původní zadání atd. neměníme
|
||||||
|
else:
|
||||||
|
problem.text_zadani = html
|
||||||
|
problem.nazev = meta["nazev"]
|
||||||
|
problem.body = meta["body"]
|
||||||
|
|
||||||
|
problem.save()
|
||||||
|
|
||||||
|
# Vrátíme id dané úlohy, aby se k ní dala případně připojit pohádka
|
||||||
|
return JsonResponse({"db_id": problem.id})
|
||||||
|
|
||||||
|
elif meta["typ"] == "pohadka":
|
||||||
|
uloha = Problem.objects.get(typ=Problem.TYP_ULOHA, pk=meta["uloha"])
|
||||||
|
|
||||||
|
# Pokud už příslušná pohádka existuje, jen ji upravíme
|
||||||
|
existujici = Pohadka.objects.filter(uloha=uloha, pred=meta["pred"])
|
||||||
|
pohadka = None
|
||||||
|
if existujici:
|
||||||
|
pohadka = existujici[0]
|
||||||
|
else:
|
||||||
|
pohadka = Pohadka(uloha=uloha, pred=meta["pred"])
|
||||||
|
pohadka.text = q["html"]
|
||||||
|
pohadka.save()
|
||||||
|
|
||||||
|
return JsonResponse({"db_id": pohadka.id})
|
||||||
|
|
||||||
|
except Exception, e:
|
||||||
|
# Pošleme zpátky traceback, ať uživatel ví, v čem je problém
|
||||||
|
tb = "".join(traceback.format_exception(type(e), e, sys.exc_info()[2]))
|
||||||
|
return JsonResponse({"error": tb})
|
||||||
|
|
Loading…
Reference in a new issue