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'),
|
||||
]
|
||||
|
|
140
seminar/views.py
140
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.
|
||||
|
@ -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