Browse Source

Příprava na nahrávání obsahu z texu

remotes/origin/temata
Matěj Kocián 9 years ago
parent
commit
3439a3f15e
  1. 3
      seminar/urls.py
  2. 154
      seminar/views.py

3
seminar/urls.py

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

@ -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…
Cancel
Save