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'),
|
||||
url(r'^soustredeni/(?P<soustredeni>\d+)/obalky.pdf',
|
||||
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
|
||||
|
||||
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.exceptions import PermissionDenied, ObjectDoesNotExist
|
||||
from django.views import generic
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.http import Http404
|
||||
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 . import utils
|
||||
|
||||
|
@ -21,6 +23,10 @@ import shutil
|
|||
import os
|
||||
from django.conf import settings
|
||||
import unicodedata
|
||||
import json
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
|
||||
def verejna_temata(rocnik):
|
||||
"""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
|
||||
for r in reseni:
|
||||
vysledky_resitele[r.resitel.id].body_ulohy[problem_index[r.problem.id]] = r.body
|
||||
|
||||
|
||||
context['vysledkovka'] = vysledkovka
|
||||
context['problemy'] = problemy
|
||||
context['v_cisle_zadane'] = v_cisle_zadane
|
||||
|
@ -360,9 +366,9 @@ def aktualniResitele(rocnik):
|
|||
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
|
||||
# return Resitel.objects.filter(Q(rok_maturity__gt = letos.prvni_rok)|Q(rok_maturity = None))
|
||||
|
||||
# Vraci QuerySet aktivnich resitelu =
|
||||
# jeste neodmaturovali &&
|
||||
|
||||
# Vraci QuerySet aktivnich resitelu =
|
||||
# jeste neodmaturovali &&
|
||||
# (pokud je aktualni cislo mensi nez 3, pak (letos || loni) neco poslali
|
||||
# jinak letos neco poslali)
|
||||
def aktivniResitele(rocnik,cislo):
|
||||
|
@ -370,11 +376,11 @@ def aktivniResitele(rocnik,cislo):
|
|||
loni = CisloObalkyStruct()
|
||||
|
||||
aktualni_resitele = aktualniResitele(rocnik)
|
||||
|
||||
|
||||
letos.rocnik = Rocnik.objects.get(rocnik = rocnik)
|
||||
loni.rocnik = Rocnik.objects.get(rocnik = int(rocnik)-1)
|
||||
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:
|
||||
problemy = Problem.objects.filter(cislo_zadani = letos.cisla)
|
||||
else:
|
||||
|
@ -382,7 +388,7 @@ def aktivniResitele(rocnik,cislo):
|
|||
resitele = aktualni_resitele.filter(reseni = Reseni.objects.filter(problem=problemy)).distinct()
|
||||
|
||||
return resitele
|
||||
|
||||
|
||||
|
||||
def cisloObalkyView(request,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_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