diff --git a/seminar/templates/seminar/novinky.html b/seminar/templates/seminar/novinky.html
index 0ac99356..ccf40831 100644
--- a/seminar/templates/seminar/novinky.html
+++ b/seminar/templates/seminar/novinky.html
@@ -3,6 +3,9 @@
{% if not novinka.zverejneno and user.is_staff %}
+
{% endif %}
{% if novinka.zverejneno or user.is_staff %}
{# datum #}
diff --git a/seminar/templates/seminar/pracuje_se.html b/seminar/templates/seminar/pracuje_se.html
index 5349707d..f081edea 100644
--- a/seminar/templates/seminar/pracuje_se.html
+++ b/seminar/templates/seminar/pracuje_se.html
@@ -1,11 +1,11 @@
{% load staticfiles %}
{% block content %}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Tady se pracuje
{% endblock %}{% endblock %}
-
+
Na této stránce velmi intenzivně pracujeme.
diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html
index 636ad01b..fcbcde26 100644
--- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html
+++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html
@@ -14,10 +14,6 @@
{% endblock %}{% endblock %}
{% block content %}
-
- Na galeriích ze soustředění a dalších informacích ještě pracujeme.
-
-
{# Projdi vsechna soustredeni #}
{% for soustredeni in object_list %}
{# Kdyz je verejne -> zobraz #}
@@ -27,10 +23,10 @@
{% endif %}
{# misto soustredeni TODO upravit#}
-
+
{{soustredeni.get_typ_display}}
{{soustredeni.misto}}
-
+
-
{{soustredeni.datum_zacatku}} – {{soustredeni.datum_konce}}
@@ -62,7 +58,7 @@
{% if user.is_staff %}
{# Účastníci #}
- Soustředění se zúčastnili tito účastníci:
+ Soustředění se zúčastnili tito účastníci:
{% for i in soustredeni.soustredeni_ucastnici_set.all %}
{{i.resitel}}{% if forloop.last %}.{% else %},{% endif %}
@@ -70,7 +66,7 @@
Nic!
{% endfor %}
- Soustředění se účastnili tito organizátoři:
+ Soustředění se účastnili tito organizátoři:
{% for i in soustredeni.soustredeni_organizatori_set.all %}
{{i.organizator}}{% if forloop.last %}.{% else %},{% endif %}
diff --git a/seminar/templates/seminar/stare_novinky.html b/seminar/templates/seminar/stare_novinky.html
index 821889bf..af4c017d 100644
--- a/seminar/templates/seminar/stare_novinky.html
+++ b/seminar/templates/seminar/stare_novinky.html
@@ -2,11 +2,11 @@
{% block content %}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Archiv novinek
{% endblock %}{% endblock %}
-
+
{% include 'seminar/novinky.html' %}
diff --git a/seminar/templates/seminar/stav_databaze.html b/seminar/templates/seminar/stav_databaze.html
index a8170290..66ea364f 100644
--- a/seminar/templates/seminar/stav_databaze.html
+++ b/seminar/templates/seminar/stav_databaze.html
@@ -2,13 +2,13 @@
{% block content %}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Stav databáze
{% endblock %}{% endblock %}
-
+
- Řešitelé
+ Řešitelé
Řešitelů: {{ resitele |length}} ({{ muzi |length}} mužů, {{ zeny |length}} žen)
Křestní jména mužů:
@@ -16,9 +16,9 @@
Křestní jména žen:
{% for n, c in jmena_zen.items %}{{ n }} ({{ c }}), {% endfor %}
-
Nastavení
+ Nastavení
- Problémy
+ Problémy
{% for p in problemy %}
{{ p |safe }}
{% endfor %}
diff --git a/seminar/templates/seminar/titulnistrana.html b/seminar/templates/seminar/titulnistrana.html
index ae949d7e..2031779a 100644
--- a/seminar/templates/seminar/titulnistrana.html
+++ b/seminar/templates/seminar/titulnistrana.html
@@ -6,11 +6,11 @@
{% block content %}
{# Uvitaci text #}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Vítej!
{% endblock %}{% endblock %}
-
+
M&M je korespondeční seminář. Několikrát do roka zdarma vydáváme časopis a v něm zajímavé podněty k přemýšlení. Ty na ně můžeš reagovat.
@@ -26,7 +26,7 @@ M&M je korespondeční seminář. Několikrát do roka zdarma vydáváme ča
{% endif %}
{# Novinky #}
- Novinky
+ Novinky
{% include 'seminar/novinky.html' %}
Archiv novinek
@@ -59,7 +59,7 @@ M&M je korespondeční seminář. Několikrát do roka zdarma vydáváme ča
-
+
diff --git a/seminar/templates/seminar/zadani/AktualniVysledkovka.html b/seminar/templates/seminar/zadani/AktualniVysledkovka.html
index 8e0898ca..341e7c00 100644
--- a/seminar/templates/seminar/zadani/AktualniVysledkovka.html
+++ b/seminar/templates/seminar/zadani/AktualniVysledkovka.html
@@ -10,11 +10,11 @@
{% block content %}
{% with nastaveni.aktualni_rocnik as rocnik %}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Výsledky
{% endblock %}{% endblock %}
-
+
{% if vysledkovka %}
{% include "seminar/vysledkovka_rocnik.html" %}
@@ -24,7 +24,7 @@
{% if user.is_staff and vysledkovka_s_neverejnymi %}
- Výsledky včetně neveřejných
+ Výsledky včetně neveřejných
{% with vysledkovka_s_neverejnymi as vysledkovka %}
{% include "seminar/vysledkovka_rocnik.html" %}
{% endwith %}
diff --git a/seminar/templates/seminar/zadani/AktualniZadani.html b/seminar/templates/seminar/zadani/AktualniZadani.html
index a9f84a64..ab870c2b 100644
--- a/seminar/templates/seminar/zadani/AktualniZadani.html
+++ b/seminar/templates/seminar/zadani/AktualniZadani.html
@@ -32,7 +32,7 @@
{% for sada in jednorazove_problemy %}
{# podnadpisy, kdyz neni zakomentuje se nadpis #}
{% if not sada %}{% endif %}
{# publikace jednotlivych zadani #}
{% for problem in sada %}
@@ -41,7 +41,7 @@
{% endfor %}
{# TODO použít {{problem.kod_v_rocniku}} ? vrací 4.u1 místo 4.1 #}
- {{problem.cislo_zadani.cislo}}.{{problem.kod}} {{problem.nazev}} {{ problem.body_v_zavorce }}
+ {{problem.cislo_zadani.cislo}}.{{problem.kod}} {{problem.nazev}} {{ problem.body_v_zavorce }}
{% autoescape off %}{{problem.text_zadani}}{% endautoescape %}
{% endfor %}
@@ -51,11 +51,11 @@
{% if user.is_staff and not verejne%}{% endif %}
{% else %}
- Aktuálně nejsou zveřejněny žádné úlohy
+ Aktuálně nejsou zveřejněny žádné úlohy
{% endif %}
- Témata
+ Témata
{% for problem in temata %}
{# TODO použít {{problem.kod_v_rocniku}} ? vrací t4 místo 4 #}
diff --git a/seminar/templates/seminar/zadani/Temata.html b/seminar/templates/seminar/zadani/Temata.html
index d39d2c34..ec700a1f 100644
--- a/seminar/templates/seminar/zadani/Temata.html
+++ b/seminar/templates/seminar/zadani/Temata.html
@@ -10,11 +10,11 @@
{% block content %}
{% with nastaveni.aktualni_rocnik as ar %}
-
+
{% block nadpis1a %}{% block nadpis1b %}
Témata
{% endblock %}{% endblock %}
-
+
Témata jsou hlavním obsahem časopisu M&M. Obvykle představují
@@ -30,6 +30,7 @@
Letos jsme pro tebe připravili tato témata:
{% endif %}
+ {# seznam temat s odkazy doprostred teto stranky #}
{% for problem in temata %}
{# TODO použít {{problem.kod_v_rocniku}} ? vrací t4 místo 4 #}
@@ -38,11 +39,35 @@
{% endfor %}
+ {# nahled kazdeho tematu #}
{% for problem in temata %}
{# TODO použít {{problem.kod_v_rocniku}} ? vrací t4 místo 4 #}
- Téma {{problem.kod}}: {{problem.nazev}}
+ Téma {{problem.kod}}: {{problem.nazev}}
{% autoescape off %}{{problem.text_zadani}}{% endautoescape %}
+ {# kdyz je reseni pridej odkaz na samostatnou stranku s tematem #}
+ {% if problem.text_reseni %}
+ Více
+ {% else %}
+ Stejně
+ {% endif%}
+ {# prime odkazy na prispevky #}
+ {% if problem.prispevky %}
+ K tématu přišly a zveřejnili jsme následující příspěvky
+
+
+ {% for prispevek in problem.prispevky %}
+ {% if not prispevek.zverejnit %}{% endif %}
+ {% endfor %}
+
+
+ {% endif %}
{% empty %}
Aktuálně nejsou zadána žádná témata k řešení.
diff --git a/seminar/urls.py b/seminar/urls.py
index 545d0d02..9da2858e 100644
--- a/seminar/urls.py
+++ b/seminar/urls.py
@@ -4,38 +4,49 @@ from django.contrib.auth.decorators import user_passes_test
from . import views, export
from utils import staff_member_required
from prednasky.views import newPrednaska, Prednaska_hotovo
+from django.views.generic.base import RedirectView
staff_member_required = user_passes_test(lambda u: u.is_staff)
urlpatterns = [
# prednasky
- url(r'^prednasky/$', newPrednaska),
- url(r'^prednasky/hotovo$', Prednaska_hotovo),
+ #url(r'^prednasky/$', newPrednaska),
+ #url(r'^prednasky/hotovo$', Prednaska_hotovo),
+ # REDIRECTy
+ url(r'^jak-resit/$', RedirectView.as_view(url='/co-je-MaM/jak-resit/')),
+
+ # Organizatori
url(r'^co-je-MaM/organizatori/$', views.CojemamOrganizatoriView.as_view(), name='organizatori'),
url(r'^co-je-MaM/organizatori/organizovali/$', views.CojemamOrganizatoriStariView.as_view(), name='stari_organizatori'),
+ # Archiv
url(r'^archiv/cisla/$', views.CislaView.as_view()),
url(r'^archiv/temata/$', views.ArchivTemataView.as_view()),
url(r'^rocnik/(?P \d+)/$', views.RocnikView.as_view(), name='seminar_rocnik'),
url(r'^cislo/(?P\d+)\.(?P[0-9-]+)/$', views.CisloView.as_view(), name='seminar_cislo'),
url(r'^problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'),
+ url(r'^problem/(?P\d+)/(?P\d+)/$', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
+ # Soustredeni
url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(),
name = 'seminar_seznam_soustredeni'),
url(r'^soustredeni/probehlo/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'),
url(r'^soustredeni/(?P\d+)/fotogalerie/', include('galerie.urls')),
+ # Zadani
url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'),
url(r'^zadani/vysledkova-listina/$', views.ZadaniAktualniVysledkovkaView, name='seminar_vysledky'),
url(r'^$', views.TitulniStranaView.as_view(), name='titulni_strana'),
url(r'^stare-novinky/$', views.StareNovinkyView.as_view(), name='stare_novinky'),
+ # Clanky
url(r'^clanky/resitel/$', views.ClankyResitelView.as_view(), name='clanky_resitel'),
url(r'^clanky/org/$', views.ClankyOrganizatorView.as_view(), name='clanky_organizator'),
+ # Aesop
url(r'^aesop-export/mam-rocnik-(?P\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'),
url(r'^aesop-export/mam-sous-(?P[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'),
url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'),
@@ -52,6 +63,11 @@ urlpatterns = [
staff_member_required(views.StavDatabazeView), name='stav_databaze'),
url(r'^cislo/(?P\d+).(?P[0-9-]+)/obalkovani$',
staff_member_required(views.obalkovaniView), name='seminar_cislo_resitel_obalkovani'),
+ url(r'^cislo/(?P\d+).(?P[0-9-]+)/tex-download.json$',
+ staff_member_required(views.texDownloadView), name='seminar_tex_download'),
url(r'^soustredeni/(?P\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'),
]
diff --git a/seminar/views.py b/seminar/views.py
index 0f4c6e50..aa320a57 100644
--- a/seminar/views.py
+++ b/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, Prispevek
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.
@@ -45,9 +51,15 @@ def AktualniZadaniView(request):
def ZadaniTemataView(request):
nastaveni = get_object_or_404(Nastaveni)
+ temata = verejna_temata(nastaveni.aktualni_rocnik)
+ for t in temata:
+ if request.user.is_staff:
+ t.prispevky = t.prispevek_set.filter(problem=t)
+ else:
+ t.prispevky = t.prispevek_set.filter(problem=t, zverejnit=True)
return render(request, 'seminar/zadani/Temata.html',
{
- 'temata': verejna_temata(nastaveni.aktualni_rocnik)
+ 'temata': temata,
}
)
@@ -241,6 +253,45 @@ class ProblemView(generic.DetailView):
context['reseni'] = Reseni.objects.filter(problem=context['problem']).select_related('resitel').order_by('resitel__prijmeni')
return context
+class PrispevekView(generic.DetailView):
+ model = Prispevek
+ template_name = 'seminar/archiv/prispevek.html'
+
+ # Vlastni ziskavani objektu z databaze podle prispevku
+ # pokud je prispevek neverejny zobrazi se jenom orgum
+ def get_object(self, queryset=None):
+ if queryset is None:
+ queryset = self.get_queryset()
+ problem_arg = self.kwargs.get('pk')
+ prispevek_arg = self.kwargs.get('prispevek')
+ queryset = queryset.filter(pk=prispevek_arg)
+
+ try:
+ obj = queryset.get()
+ except queryset.model.DoesNotExist:
+ raise Http404(_("No %(verbose_name)s found matching the query") %
+ {'verbose_name': queryset.model._meta.verbose_name})
+
+ if self.request.user.is_staff or obj.zverejnit:
+ return obj
+ else:
+ raise Http404()
+
+ def get_context_data(self, **kwargs):
+ context = super(PrispevekView, self).get_context_data(**kwargs)
+ # snaho o ziskani titulu
+ titul = ''
+ try:
+ resitel = context['prispevek'].reseni.resitel
+ cislo = context['prispevek'].reseni.cislo_body
+ body = VysledkyKCisluOdjakziva.objects.get(resitel=resitel,
+ cislo=cislo).body
+ titul = resitel.get_titul(body)
+ except:
+ pass
+ context['titul'] = titul
+ return context
+
class RadekVysledkovky(object):
@@ -318,7 +369,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 +411,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 +421,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 +433,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))
@@ -408,11 +459,22 @@ def obalkovaniView(request, rocnik, cislo):
rocnik = Rocnik.objects.get(rocnik=rocnik)
cislo = Cislo.objects.get(rocnik=rocnik, cislo=cislo)
- reseni = Reseni.objects.filter(cislo_body=cislo)
- serazena_reseni = sorted(reseni, key=lambda r: (r.resitel.prijmeni, r.resitel.jmeno, r.problem.typ, r.problem.kod))
+ reseni = (
+ Reseni.objects.filter(cislo_body=cislo)
+ .order_by(
+ 'resitel__prijmeni',
+ 'resitel__jmeno',
+ 'problem__typ',
+ 'problem__kod'
+ )
+ )
problemy = sorted(set(r.problem for r in reseni), key=lambda p: (p.typ, p.kod))
- return render(request, 'seminar/archiv/cislo_obalkovani.html', {'cislo': cislo, 'problemy': problemy, 'reseni': serazena_reseni})
+ return render(
+ request,
+ 'seminar/archiv/cislo_obalkovani.html',
+ {'cislo': cislo, 'problemy': problemy, 'reseni': reseni}
+ )
### Tituly
@@ -438,7 +500,7 @@ def TitulyView(request, rocnik, cislo):
else:
broken = True
- return render(request, 'seminar/archiv/tituly.tex',{'resitele': resitele,'broken':broken})
+ return render(request, 'seminar/archiv/tituly.tex',{'resitele': resitele,'broken':broken},content_type="text/plain")
### Soustredeni
@@ -487,3 +549,177 @@ 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 = os.path.join(
+ settings.MEDIA_ROOT,
+ 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})
+
+
+def texDownloadView(request, rocnik, cislo):
+ """View posílající JSON se zadanými a řešenými problémy pro založení čísla
+ """
+ cislo = Cislo.objects.get(rocnik__rocnik=rocnik, cislo=cislo)
+ zadane = Problem.objects.filter(
+ cislo_zadani=cislo,
+ stav=Problem.STAV_ZADANY
+ )
+ resene = Problem.objects.filter(
+ cislo_reseni=cislo,
+ stav=Problem.STAV_ZADANY,
+ typ=Problem.TYP_ULOHA
+ )
+ pred_pohadky = Pohadka.objects.filter(uloha__cislo_zadani=cislo, pred=True)
+ po_pohadky = Pohadka.objects.filter(uloha__cislo_zadani=cislo, pred=False)
+
+ response = {
+ "zadane": [
+ {
+ "nazev": p.nazev,
+ "typ": p.typ,
+ "kod": p.kod,
+ "body": p.body,
+ "zadani": p.text_zadani,
+ "pred_pohadky": [x.text for x in pred_pohadky.filter(uloha=p)],
+ "po_pohadky": [x.text for x in po_pohadky.filter(uloha=p)],
+ } for p in zadane
+ ],
+ "resene": [
+ {
+ "nazev": p.nazev,
+ "typ": p.typ,
+ "kod": p.kod,
+ "body": p.body,
+ "zadani": p.text_zadani,
+ "reseni": p.text_reseni,
+ "cislo_zadani": p.cislo_zadani.cislo,
+ } for p in resene
+ ],
+ }
+ return JsonResponse(response)
|