From 5db14ea24214360104445359a4f10910c4600654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 30 Oct 2024 15:03:17 +0100 Subject: [PATCH 01/22] =?UTF-8?q?=C4=8C=C3=A1ste=C4=8Dn=C3=A9=20=C5=99e?= =?UTF-8?q?=C5=A1en=C3=AD=20#1465=20(Podez=C5=99el=C3=A9=20`seminar`e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/tests/test_skola_autocomplete.py | 4 ++-- api/views/exports.py | 2 +- galerie/views.py | 2 +- novinky/templates/novinky/novinky.html | 2 +- odevzdavatko/admin.py | 2 +- odevzdavatko/forms.py | 2 +- odevzdavatko/templatetags/barvy_reseni.py | 4 ++-- odevzdavatko/templatetags/jmena.py | 4 ++-- personalni/admin.py | 2 +- personalni/forms.py | 2 +- personalni/tests.py | 2 +- personalni/utils.py | 6 ++--- personalni/views.py | 24 ++++++++++--------- prednasky/admin.py | 2 +- prednasky/views.py | 3 ++- .../treenode/treenode_recursive.html | 12 +++++----- .../tvorba/archiv/problem_clanek.html | 2 +- .../templates/tvorba/archiv/problem_tema.html | 2 +- .../tvorba/archiv/problem_uloha.html | 2 +- .../tvorba/archiv/problem_uloha_tema.html | 2 +- .../tvorba/clanky/organizatorske_clanky.html | 2 +- vyroci/views.py | 2 +- 22 files changed, 45 insertions(+), 42 deletions(-) diff --git a/api/tests/test_skola_autocomplete.py b/api/tests/test_skola_autocomplete.py index 75019983..f5bf420a 100644 --- a/api/tests/test_skola_autocomplete.py +++ b/api/tests/test_skola_autocomplete.py @@ -1,6 +1,6 @@ from django.test import TestCase, tag from django.urls import reverse -import seminar.models as m +from personalni.models import Skola from personalni.utils import sync_skoly @tag('stejny-model-na-produkci') @@ -48,7 +48,7 @@ class OrgSkolyAutocompleteTestCase(TestCase): """Testuje, že pro každého orga je jeho škola ve výsledném QuerySetu""" for pfx, id in self.spravna_data: with self.subTest(prefix=pfx, spravne_id=id): - spravna_skola = m.Skola.objects.get(id=id) + spravna_skola = Skola.objects.get(id=id) # Zeptáme se view, co si myslí resp = self.client.get(reverse('autocomplete_skola')+'?q='+pfx).json() ids = [int(x['id']) for x in resp['results']] diff --git a/api/views/exports.py b/api/views/exports.py index 5c1d57af..1545c2bc 100644 --- a/api/views/exports.py +++ b/api/views/exports.py @@ -1,4 +1,4 @@ -import seminar.models as m +import personalni.models as m from django.core import serializers as ser from django.http import HttpResponse def exportSkolView(request): diff --git a/galerie/views.py b/galerie/views.py index 872bb46e..cf9ade8b 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -6,7 +6,7 @@ from django.template import RequestContext from datetime import datetime from galerie.models import Obrazek, Galerie -from seminar.models import Soustredeni +from soustredeni.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm def zobrazit(galerie, request): diff --git a/novinky/templates/novinky/novinky.html b/novinky/templates/novinky/novinky.html index 535349a5..59f9377b 100644 --- a/novinky/templates/novinky/novinky.html +++ b/novinky/templates/novinky/novinky.html @@ -4,7 +4,7 @@ {% if not novinka.zverejneno and user.je_org %}
{% endif %} {% if novinka.zverejneno or user.je_org %} diff --git a/odevzdavatko/admin.py b/odevzdavatko/admin.py index 6048eb36..b789e3c5 100644 --- a/odevzdavatko/admin.py +++ b/odevzdavatko/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from django_reverse_admin import ReverseModelAdmin -import seminar.models as m +import odevzdavatko.models as m class PrilohaReseniInline(admin.TabularInline): diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 583523e3..0ba86654 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -4,7 +4,7 @@ from django.forms import formset_factory from django.forms.models import inlineformset_factory from django.utils import timezone -from seminar.models import Resitel +from personalni.models import Resitel import seminar.models as m import logging diff --git a/odevzdavatko/templatetags/barvy_reseni.py b/odevzdavatko/templatetags/barvy_reseni.py index 5a3791fd..f0324ad9 100644 --- a/odevzdavatko/templatetags/barvy_reseni.py +++ b/odevzdavatko/templatetags/barvy_reseni.py @@ -2,11 +2,11 @@ from django import template register = template.Library() from functools import cache -import seminar.models as m +from odevzdavatko.models import Reseni @register.filter @cache -def barva_reseni(r: m.Reseni): +def barva_reseni(r: Reseni): """Vrátí nějakou barvu pro daný problém, ve tvaru '#RRGGBB' Efektivně hešujeme do barev.""" diff --git a/odevzdavatko/templatetags/jmena.py b/odevzdavatko/templatetags/jmena.py index 9fe91ff5..9a08acaa 100644 --- a/odevzdavatko/templatetags/jmena.py +++ b/odevzdavatko/templatetags/jmena.py @@ -2,8 +2,8 @@ from django import template register = template.Library() from personalni.utils import normalizuj_jmeno -import seminar.models as m # jen kvůli typové anotaci… +from personalni.models import Osoba # jen kvůli typové anotaci… @register.filter -def jmeno_jako_prefix(o: m.Osoba): +def jmeno_jako_prefix(o: Osoba): return normalizuj_jmeno(o).replace(' ', '_') diff --git a/personalni/admin.py b/personalni/admin.py index 3418769a..f940ca4a 100644 --- a/personalni/admin.py +++ b/personalni/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from django.contrib.auth.models import Group from django_reverse_admin import ReverseModelAdmin from django.contrib.messages import WARNING, ERROR, SUCCESS -import seminar.models as m +import personalni.models as m from datetime import datetime @admin.action(description="Sjednoť telefony") diff --git a/personalni/forms.py b/personalni/forms.py index ea0891e7..57e1b398 100644 --- a/personalni/forms.py +++ b/personalni/forms.py @@ -4,7 +4,7 @@ from django.contrib.auth.forms import PasswordResetForm from django.core.exceptions import ObjectDoesNotExist from django.contrib.auth.models import User -from seminar.models import Skola, Resitel, Osoba +from personalni.models import Skola, Resitel, Osoba from datetime import date import logging diff --git a/personalni/tests.py b/personalni/tests.py index 31aac8e8..a73d7863 100644 --- a/personalni/tests.py +++ b/personalni/tests.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User, Group from django.contrib.admin.sites import AdminSite from personalni.admin import OsobaAdmin # Tohle bude peklo, až jednou ty modely fakt rozstřelíme… Možná vyrobit various.all_models, které půjdou importovat jako m? :-) -import seminar.models as m +import personalni.models as m import logging logger = logging.getLogger(__name__) diff --git a/personalni/utils.py b/personalni/utils.py index 4aac1e28..02e541da 100644 --- a/personalni/utils.py +++ b/personalni/utils.py @@ -1,4 +1,3 @@ -import seminar.models as m from various.utils import bez_diakritiky_translate import re @@ -7,9 +6,10 @@ from django.contrib.auth.decorators import permission_required, user_passes_test from django.contrib.auth.models import AnonymousUser from django.db import transaction -import seminar.models as m import soustredeni.models +from odevzdavatko.models import Reseni_Resitele + from .models import Osoba, Organizator, Skola, Resitel, Prijemce @@ -97,7 +97,7 @@ def merge_resitele(cilovy, zdrojovy): # Přepojit všechny vazby ze zdrojového na cílového print('Přepojuji vazby') # Vazby: Škola (hotovo), Řešení_Řešitelé, Konfery_Účastníci, Soustředění_Účastníci, Osoba (vyřeší se později, nejde přepojit) - ct = m.Reseni_Resitele.objects.filter(resitele=zdrojovy).update(resitele=cilovy) + ct = Reseni_Resitele.objects.filter(resitele=zdrojovy).update(resitele=cilovy) print(f' Přepojeno {ct} řešení') ct = soustredeni.models.Konfery_Ucastnici.objects.filter(resitel=zdrojovy).update(resitel=cilovy) print(f' Přepojeno {ct} konfer') diff --git a/personalni/views.py b/personalni/views.py index 12768c34..d994974d 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -17,7 +17,9 @@ from django.http import HttpResponse from django.utils import timezone import seminar.models as s -import seminar.models as m +import personalni.models as m +from soustredeni.models import Soustredeni +from odevzdavatko.models import Hodnoceni from .forms import PrihlaskaForm, ProfileEditForm, PoMaturiteProfileEditForm from datetime import date @@ -91,7 +93,7 @@ class OrgoRozcestnikView(TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['posledni_soustredeni'] = s.Soustredeni.objects.order_by('-datum_konce').first() + context['posledni_soustredeni'] = Soustredeni.objects.order_by('-datum_konce').first() nastaveni = s.Nastaveni.objects.first() aktualni_rocnik = nastaveni.aktualni_rocnik context['posledni_cislo_url'] = nastaveni.aktualni_cislo.verejne_url() @@ -99,14 +101,14 @@ class OrgoRozcestnikView(TemplateView): # pokud nechceme haluzit kód (= poradi) dalšího čísla, bude asi potřeba jít # přes treenody (a dát si přitom pozor na MezicisloNode) - neobodovana_reseni = s.Hodnoceni.objects.filter(body__isnull=True) - reseni_mimo_cislo = s.Hodnoceni.objects.filter(deadline_body__isnull=True) + neobodovana_reseni = Hodnoceni.objects.filter(body__isnull=True) + reseni_mimo_cislo = Hodnoceni.objects.filter(deadline_body__isnull=True) context['pocet_neobodovanych_reseni'] = neobodovana_reseni.count() context['pocet_reseni_mimo_cislo'] = reseni_mimo_cislo.count() u = self.request.user - os = s.Osoba.objects.get(user=u) - organizator = s.Organizator.objects.get(osoba=os) + os = m.Osoba.objects.get(user=u) + organizator = m.Organizator.objects.get(osoba=os) context['muj_pocet_neobodovanych_reseni'] = neobodovana_reseni.filter(Q(problem__garant=organizator) | Q(problem__autor=organizator) | Q(problem__opravovatele__in=[organizator])).distinct().count() context['muj_pocet_reseni_mimo_cislo'] = reseni_mimo_cislo.filter(Q(problem__garant=organizator) | Q(problem__autor=organizator) | Q(problem__opravovatele__in=[organizator])).count() @@ -134,12 +136,12 @@ class OrgoRozcestnikView(TemplateView): class ResitelView(LoginRequiredMixin,generic.DetailView): - model = s.Resitel + model = m.Resitel template_name = 'personalni/profil/resitel.html' def get_object(self, queryset=None): print(self.request.user) - return s.Resitel.objects.get(osoba__user=self.request.user) + return m.Resitel.objects.get(osoba__user=self.request.user) ### Formulare @@ -160,7 +162,7 @@ def resitelEditView(request): err_logger = logging.getLogger('seminar.prihlaska.problem') ## Načtení objektů Osoba a Resitel patřících k aktuálně přihlášenému uživateli u = request.user - osoba_edit = s.Osoba.objects.get(user=u) + osoba_edit = m.Osoba.objects.get(user=u) if hasattr(osoba_edit,'resitel'): resitel_edit = osoba_edit.resitel else: @@ -266,7 +268,7 @@ def prihlaskaView(request): resitel_grp = Group.objects.filter(name__exact='resitel').first() u.groups.add(resitel_grp) - o = s.Osoba( + o = m.Osoba( jmeno = fcd['jmeno'], prijmeni = fcd['prijmeni'], osloveni = fcd['osloveni'], @@ -328,7 +330,7 @@ def prihlaskaView(request): if kolize.count() > 1: # Jednu z nich jsme právě uložili err_logger.warning(f'Zaregistrovala se osoba s kolizním jménem. ID osob: {[o.id for o in kolize]}') - r = s.Resitel( + r = m.Resitel( prezdivka_resitele=fcd['prezdivka_resitele'] if fcd['prezdivka_resitele'] != "" else None, rok_maturity = fcd['rok_maturity'], zasilat = fcd['zasilat'], diff --git a/prednasky/admin.py b/prednasky/admin.py index d086cd0c..19eace7f 100644 --- a/prednasky/admin.py +++ b/prednasky/admin.py @@ -5,7 +5,7 @@ from django.utils.safestring import mark_safe from django.utils.html import escape from .models import Prednaska, Seznam, STAV_NAVRH -from seminar.models import Soustredeni +from soustredeni.models import Soustredeni class Seznam_PrednaskaInline(admin.TabularInline): diff --git a/prednasky/views.py b/prednasky/views.py index 699b690d..368c98d9 100644 --- a/prednasky/views.py +++ b/prednasky/views.py @@ -6,7 +6,8 @@ from django.db.models import Sum from django.forms import Form from prednasky.models import Prednaska, Hlasovani, Seznam, STAV_NAVRH -from seminar.models import Soustredeni, Osoba +from soustredeni.models import Soustredeni +from personalni.models import Osoba def newPrednaska(request): # hlasovani se vztahuje k nejnovejsimu soustredeni diff --git a/treenode/templates/treenode/treenode_recursive.html b/treenode/templates/treenode/treenode_recursive.html index 6da7a96f..4a54f41f 100644 --- a/treenode/templates/treenode/treenode_recursive.html +++ b/treenode/templates/treenode/treenode_recursive.html @@ -25,20 +25,20 @@ - nejsou testovací data
{% endif %} -{% include "seminar/treenode_name.html" %} +{% include "treenode/treenode_name.html" %} {%if obj.children %}
- {% with kam="před" kam_slug="syn" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="před" kam_slug="syn" %} {% include "treenode/treenode_add_stub.html" %} {% endwith %} {%for ch in obj.children %} {# ----------- Vypisujeme podstrom ----------#} - {%with obj=ch depth=depth|add:"1" %} {%include "seminar/treenode_recursive.html" %} {%endwith%} + {%with obj=ch depth=depth|add:"1" %} {%include "treenode/treenode_recursive.html" %} {%endwith%} {# ----------- Přidáváme mezi syny / za posledního -------- #} {% if forloop.last %} - {% with kam="za" kam_slug="za" obj=ch %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="za" kam_slug="za" obj=ch %} {% include "treenode/treenode_add_stub.html" %} {% endwith %} {% else %} - {% with kam="mezi" obj=ch kam_slug="za" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="mezi" obj=ch kam_slug="za" %} {% include "treenode/treenode_add_stub.html" %} {% endwith %} {% endif %} {# ----------- Prohazujeme sousedy ----------#}
@@ -50,6 +50,6 @@
{% else %} {# ----------- Přidáváme prvního syna ----------#} - {% with kam="jako syna" kam_slug="syn" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="jako syna" kam_slug="syn" %} {% include "treenode/treenode_add_stub.html" %} {% endwith %} {%endif%}
diff --git a/tvorba/templates/tvorba/archiv/problem_clanek.html b/tvorba/templates/tvorba/archiv/problem_clanek.html index a59e8b87..f14eeb7f 100644 --- a/tvorba/templates/tvorba/archiv/problem_clanek.html +++ b/tvorba/templates/tvorba/archiv/problem_clanek.html @@ -1,4 +1,4 @@ -{% extends "seminar/archiv/problem.html" %} +{% extends "tvorba/archiv/problem.html" %} {% block problem %} {% if problem.cislo_zadani %} diff --git a/tvorba/templates/tvorba/archiv/problem_tema.html b/tvorba/templates/tvorba/archiv/problem_tema.html index 8bb851ea..322f4200 100644 --- a/tvorba/templates/tvorba/archiv/problem_tema.html +++ b/tvorba/templates/tvorba/archiv/problem_tema.html @@ -1,4 +1,4 @@ -{% extends "seminar/archiv/problem.html" %} +{% extends "tvorba/archiv/problem.html" %} {% block problem %}

diff --git a/tvorba/templates/tvorba/archiv/problem_uloha.html b/tvorba/templates/tvorba/archiv/problem_uloha.html index 9a146389..a9d96479 100644 --- a/tvorba/templates/tvorba/archiv/problem_uloha.html +++ b/tvorba/templates/tvorba/archiv/problem_uloha.html @@ -1,4 +1,4 @@ -{% extends "seminar/archiv/problem.html" %} +{% extends "tvorba/archiv/problem.html" %} {% block problem %}

diff --git a/tvorba/templates/tvorba/archiv/problem_uloha_tema.html b/tvorba/templates/tvorba/archiv/problem_uloha_tema.html index 9a146389..a9d96479 100644 --- a/tvorba/templates/tvorba/archiv/problem_uloha_tema.html +++ b/tvorba/templates/tvorba/archiv/problem_uloha_tema.html @@ -1,4 +1,4 @@ -{% extends "seminar/archiv/problem.html" %} +{% extends "tvorba/archiv/problem.html" %} {% block problem %}

diff --git a/tvorba/templates/tvorba/clanky/organizatorske_clanky.html b/tvorba/templates/tvorba/clanky/organizatorske_clanky.html index a7fb03c9..816daad8 100644 --- a/tvorba/templates/tvorba/clanky/organizatorske_clanky.html +++ b/tvorba/templates/tvorba/clanky/organizatorske_clanky.html @@ -1,4 +1,4 @@ -{% extends 'seminar/clanky/resitelske_clanky.html' %} +{% extends 'tvorba/clanky/resitelske_clanky.html' %} {% block nadpis1a %} Organizátorské články diff --git a/vyroci/views.py b/vyroci/views.py index 455d6e25..9c5b5194 100644 --- a/vyroci/views.py +++ b/vyroci/views.py @@ -1,6 +1,6 @@ from django.views.generic import FormView, ListView -from seminar.models import Osoba +from personalni.models import Osoba from various.views.pomocne import formularOKView from .forms import UcastnikVyrociForm from .models import UcastnikVyroci -- 2.39.5 From 8fd582d194599e681447a718bccd51dada10fa28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 11:44:17 +0100 Subject: [PATCH 02/22] =?UTF-8?q?Dal=C5=A1=C3=AD=20=C4=8D=C3=A1ste=C4=8Dn?= =?UTF-8?q?=C3=A9=20=C5=99e=C5=A1en=C3=AD=20#1465=20(Podez=C5=99el=C3=A9?= =?UTF-8?q?=20`seminar`e).=20Z=C3=A1m=C4=9Brn=C4=9B=20se=20vyh=C3=BDb?= =?UTF-8?q?=C3=A1=20treenode.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/views/autocomplete.py | 18 ++-- mamweb/admin.py | 4 +- odevzdavatko/forms.py | 23 +++-- odevzdavatko/models.py | 16 ++-- odevzdavatko/views.py | 92 ++++++++++--------- personalni/views.py | 12 ++- soustredeni/models.py | 8 +- soustredeni/testutils.py | 4 +- tvorba/templatetags/deadliny.py | 22 ++--- tvorba/testutils.py | 56 +++++------ tvorba/utils.py | 2 +- tvorba/views/__init__.py | 55 ++++++----- tvorba/views/docasne.py | 14 +-- various/autentizace/views.py | 1 - .../commands/generate_thumbnails.py | 2 +- .../pregeneruj_zmrazene_vysledkovky.py | 4 +- various/management/commands/testdata.py | 4 +- various/testutils.py | 4 +- various/views/final.py | 27 +++--- vysledkovky/utils.py | 77 ++++++++-------- 20 files changed, 232 insertions(+), 213 deletions(-) diff --git a/api/views/autocomplete.py b/api/views/autocomplete.py index edc81ff7..006b7185 100644 --- a/api/views/autocomplete.py +++ b/api/views/autocomplete.py @@ -5,7 +5,9 @@ from dal import autocomplete from django.shortcuts import get_object_or_404 from django.db.models import Q -import seminar.models as m +from personalni.models import Skola, Resitel +from tvorba.models import Problem +from various.models import Nastaveni from .helpers import LoginRequiredAjaxMixin # TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr) @@ -13,7 +15,7 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView): """ View k :mod:`dal.autocomplete` pro vyhledávání škol hlavně při registraci. """ def get_queryset(self): # Don't forget to filter out results depending on the visitor ! - qs = m.Skola.objects.all() + qs = Skola.objects.all() if self.q: words = self.q.split(' ') #TODO re split podle bileho znaku partq = Q() @@ -31,7 +33,7 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView): class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView): """ View k :mod:`dal.autocomplete` pro vyhledávání řešitelů především v odevzdávátku. """ def get_queryset(self): - qs = m.Resitel.objects.all() + qs = Resitel.objects.all() if self.q: parts = self.q.split() query = Q() @@ -51,8 +53,8 @@ class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2Quer především v odevzdávátku. """ def get_queryset(self): - letos = m.Nastaveni.get_solo().aktualni_rocnik - qs = m.Resitel.objects.filter( + letos = Nastaveni.get_solo().aktualni_rocnik + qs = Resitel.objects.filter( rok_maturity__gte=letos.druhy_rok() ).filter( prezdivka_resitele__isnull=False @@ -70,7 +72,7 @@ class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2Quer class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView): """ View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """ def get_queryset(self): - qs = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY) + qs = Problem.objects.filter(stav=Problem.STAV_ZADANY) if self.q: qs = qs.filter( Q(nazev__icontains=self.q)) @@ -87,12 +89,12 @@ class ProblemAutocomplete(autocomplete.Select2QuerySetView): """ View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """ def get_queryset(self): # FIXME i starší úlohy - nastaveni = get_object_or_404(m.Nastaveni) + nastaveni = get_object_or_404(Nastaveni) rocnik = nastaveni.aktualni_rocnik temaQ = Q(Tema___rocnik = rocnik) ulohaQ = Q(Uloha___cislo_zadani__rocnik=rocnik) clanekQ = Q(Clanek___cislo__rocnik=rocnik) - qs = m.Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev") + qs = Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev") if self.q: qs = qs.filter( Q(nazev__icontains=self.q)) diff --git a/mamweb/admin.py b/mamweb/admin.py index 04d564cc..ba3d9648 100644 --- a/mamweb/admin.py +++ b/mamweb/admin.py @@ -43,7 +43,7 @@ def get_app_list(self, request, app_label=None): app_dict = self._build_app_dict(request, label=app_label) aplikace_nahore = [ - 'seminar', + 'tvorba', 'personalni', 'novinky', 'korektury', @@ -57,7 +57,7 @@ def get_app_list(self, request, app_label=None): # Sort the models alphabetically within each app. for app in app_list: - app['models'].sort(key=lambda x: locale.strxfrm('žž' + x['name'].lower()) if (x['name'].endswith("(Node)")) else locale.strxfrm(x['name'].lower())) + app['models'].sort(key=lambda x: locale.strxfrm(x['name'].lower())) return app_list diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 0ba86654..1b5c43a3 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -5,7 +5,10 @@ from django.forms.models import inlineformset_factory from django.utils import timezone from personalni.models import Resitel -import seminar.models as m +from tvorba.models import Problem, Deadline +from various.models import Nastaveni + +from odevzdavatko.models import Reseni, PrilohaReseni, Hodnoceni import logging @@ -22,7 +25,7 @@ class DateInput(forms.DateInput): class PosliReseniForm(forms.Form): problem = forms.ModelMultipleChoiceField( - queryset=m.Problem.objects.all(), + queryset=Problem.objects.all(), label="Problémy", widget=autocomplete.ModelSelect2Multiple( url='autocomplete_problem', @@ -58,7 +61,7 @@ class PosliReseniForm(forms.Form): #cas_doruceni = models.DateTimeField('čas_doručení', default=timezone.now, blank=True) - forma = forms.ChoiceField(label="Forma řešení",choices = m.Reseni.FORMA_CHOICES) + forma = forms.ChoiceField(label="Forma řešení",choices = Reseni.FORMA_CHOICES) #forma = models.CharField('forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, # default=FORMA_EMAIL) @@ -69,7 +72,7 @@ class PosliReseniForm(forms.Form): class NahrajReseniForm(forms.ModelForm): class Meta: - model = m.Reseni + model = Reseni fields = ('problem', 'resitele') help_texts = {'problem':''} # Nezobrazovat help text ve formuláři @@ -109,11 +112,11 @@ class NahrajReseniForm(forms.ModelForm): def clean_problem(self): problem = self.cleaned_data.get('problem') for p in problem: - if p.stav != m.Problem.STAV_ZADANY: + if p.stav != Problem.STAV_ZADANY: raise forms.ValidationError("Problém " + str(p) + " již nelze řešit!") return problem -ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, +ReseniSPrilohamiFormSet = inlineformset_factory(Reseni, PrilohaReseni, form = NahrajReseniForm, fields = ('soubor','res_poznamka'), widgets = {'res_poznamka':forms.TextInput()}, @@ -125,7 +128,7 @@ ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, class JednoHodnoceniForm(forms.ModelForm): class Meta: - model = m.Hodnoceni + model = Hodnoceni fields = ('problem', 'body', 'deadline_body', 'feedback',) widgets = { 'problem': autocomplete.ModelSelect2( @@ -158,7 +161,7 @@ OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm, class PoznamkaReseniForm(forms.ModelForm): class Meta: - model = m.Reseni + model = Reseni fields = ('poznamka',) # FIXME: Ideálně by mělo být součástí třídy níž, ale neumím to udělat @@ -198,7 +201,7 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): from django.db.utils import OperationalError try: - aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik + aktualni_rocnik = Nastaveni.get_solo().aktualni_rocnik except OperationalError: # django.db.utils.OperationalError: no such table: seminar_nastaveni # Nemáme databázi, takže to selhalo. Pro jistotu vrátíme aspoň dvě možnosti, ať to nepadá dál @@ -214,7 +217,7 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): result.append(("0001-01-01", f"Odjakživa")) - for deadline in m.Deadline.objects.filter( + for deadline in Deadline.objects.filter( deadline__lte=timezone.now(), cislo__rocnik=aktualni_rocnik ).order_by("deadline"): diff --git a/odevzdavatko/models.py b/odevzdavatko/models.py index a52f370f..600b9b48 100644 --- a/odevzdavatko/models.py +++ b/odevzdavatko/models.py @@ -9,7 +9,7 @@ from django.urls import reverse_lazy from django.utils import timezone from django.conf import settings -import tvorba.models as am +from tvorba.models import Problem, Deadline, Cislo, Uloha, aux_generate_filename from seminar.models import base as bm from odevzdavatko.utils import vzorecek_na_prepocet, inverze_vzorecku_na_prepocet @@ -29,7 +29,7 @@ class Reseni(bm.SeminarModelBase): id = models.AutoField(primary_key = True) # Ke každé dvojici řešní a problém existuje nanejvýš jedno hodnocení, doplnění vazby. - problem = models.ManyToManyField(am.Problem, verbose_name='problém', help_text='Problém', + problem = models.ManyToManyField(Problem, verbose_name='problém', help_text='Problém', through='Hodnoceni') resitele = models.ManyToManyField(Resitel, verbose_name='autoři řešení', @@ -79,7 +79,7 @@ class Reseni(bm.SeminarModelBase): # NOTE: Potenciální DB HOG (bez select_related) def deadline_reseni(self): - return am.Deadline.objects.filter(deadline__gte=self.cas_doruceni).order_by("deadline").first() + return Deadline.objects.filter(deadline__gte=self.cas_doruceni).order_by("deadline").first() ## Pravdepodobne uz nebude potreba: # def save(self, *args, **kwargs): @@ -101,16 +101,16 @@ class Hodnoceni(bm.SeminarModelBase): body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name='body', blank=True, null=True) - cislo_body = models.ForeignKey(am.Cislo, verbose_name='číslo pro body', + cislo_body = models.ForeignKey(Cislo, verbose_name='číslo pro body', related_name='hodnoceni', blank=True, null=True, on_delete=models.PROTECT) # V ročníku < 26 nastaveno na deadline vygenerovaný pro původní cislo_body - deadline_body = models.ForeignKey(am.Deadline, verbose_name='deadline pro body', + deadline_body = models.ForeignKey(Deadline, verbose_name='deadline pro body', related_name='hodnoceni', blank=True, null=True, on_delete=models.PROTECT) reseni = models.ForeignKey(Reseni, verbose_name='řešení', on_delete=models.CASCADE) - problem = models.ForeignKey(am.Problem, verbose_name='problém', + problem = models.ForeignKey(Problem, verbose_name='problém', related_name='hodnoceni', on_delete=models.PROTECT) feedback = models.TextField('zpětná vazba', blank=True, default='', help_text='Zpětná vazba řešiteli (plain text)') @@ -166,7 +166,7 @@ class Hodnoceni(bm.SeminarModelBase): @property def body_neprepocitane_max(self): - if not isinstance(self.problem.get_real_instance(), am.Uloha): + if not isinstance(self.problem.get_real_instance(), Uloha): return None return self.problem.uloha.max_body @@ -176,7 +176,7 @@ class Hodnoceni(bm.SeminarModelBase): def generate_filename(self, filename): return os.path.join( settings.SEMINAR_RESENI_DIR, - am.aux_generate_filename(self, filename) + aux_generate_filename(self, filename) ) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index cbe9019e..1a294c4e 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -17,10 +17,14 @@ from decimal import Decimal from itertools import groupby import logging -import seminar.models as m from . import forms as f from .forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm +from .models import Hodnoceni, Reseni + +from personalni.models import Resitel, Osoba, Organizator +from tvorba.models import Problem, Deadline, Rocnik from tvorba.utils import resi_v_rocniku +from various.models import Nastaveni from various.views.pomocne import formularOKView logger = logging.getLogger(__name__) @@ -40,20 +44,20 @@ logger = logging.getLogger(__name__) class TabulkaOdevzdanychReseniView(ListView): template_name = 'odevzdavatko/tabulka.html' - model = m.Hodnoceni + model = Hodnoceni def inicializuj_osy_tabulky(self): """Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů""" # FIXME: jméno metody není vypovídající... # NOTE: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistují ty objekty (?). TODO: Otestovat # TODO: Prefetches, Select related, ... - self.resitele = m.Resitel.objects.all() - self.problemy = m.Problem.objects.all() - self.reseni = m.Reseni.objects.all() + self.resitele = Resitel.objects.all() + self.problemy = Problem.objects.all() + self.reseni = Reseni.objects.all() - self.aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci + self.aktualni_rocnik = Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci if 'rocnik' in self.kwargs: - self.aktualni_rocnik = get_object_or_404(m.Rocnik, rocnik=self.kwargs['rocnik']) + self.aktualni_rocnik = get_object_or_404(Rocnik, rocnik=self.kwargs['rocnik']) form = FiltrForm(self.request.GET, rocnik=self.aktualni_rocnik) if form.is_valid(): @@ -86,14 +90,14 @@ class TabulkaOdevzdanychReseniView(ListView): self.resitele = self.resitele.filter(rok_maturity__gt=self.aktualni_rocnik.prvni_rok) if problemy == FiltrForm.PROBLEMY_MOJE: - org = m.Organizator.objects.get(osoba__user=self.request.user) + org = Organizator.objects.get(osoba__user=self.request.user) self.problemy = self.problemy.filter( Q(autor=org)|Q(garant=org)|Q(opravovatele=org), - Q(stav=m.Problem.STAV_ZADANY)|Q(stav=m.Problem.STAV_VYRESENY), + Q(stav=Problem.STAV_ZADANY)|Q(stav=Problem.STAV_VYRESENY), ) elif problemy == FiltrForm.PROBLEMY_LETOSNI: self.problemy = self.problemy.filter( - Q(stav=m.Problem.STAV_ZADANY)|Q(stav=m.Problem.STAV_VYRESENY), + Q(stav=Problem.STAV_ZADANY)|Q(stav=Problem.STAV_VYRESENY), ) #self.problemy = list(filter(lambda problem: problem.rocnik() == self.aktualni_rocnik, self.problemy)) # DB HOG? # FIXME: některé problémy nemají ročník.... # NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy. @@ -121,8 +125,8 @@ class TabulkaOdevzdanychReseniView(ListView): ctx = super().get_context_data(*args, **kwargs) ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele - tabulka: dict[m.Problem, dict[m.Resitel, list[tuple[m.Reseni, m.Hodnoceni]]]] = dict() - soucty: dict[m.Problem, dict[m.Resitel, Decimal]] = dict() + tabulka: dict[Problem, dict[Resitel, list[tuple[Reseni, Hodnoceni]]]] = dict() + soucty: dict[Problem, dict[Resitel, Decimal]] = dict() def pridej_reseni(resitel, hodnoceni): problem = hodnoceni.problem @@ -143,11 +147,11 @@ class TabulkaOdevzdanychReseniView(ListView): for resitel in hodnoceni.reseni.resitele.all(): pridej_reseni(resitel, hodnoceni) - hodnoty: list[list[tuple[Decimal,list[tuple[m.Reseni, m.Hodnoceni]]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy + jejich součty, v každé buňce seznam řešení k danému řešiteli a problému. - resitele_do_tabulky: list[m.Resitel] = [] + hodnoty: list[list[tuple[Decimal,list[tuple[Reseni, Hodnoceni]]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy + jejich součty, v každé buňce seznam řešení k danému řešiteli a problému. + resitele_do_tabulky: list[Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek: list[tuple[Decimal,list[tuple[m.Reseni, m.Hodnoceni]]]] = [] # podle pořadí v self.problemy + resiteluv_radek: list[tuple[Decimal,list[tuple[Reseni, Hodnoceni]]]] = [] # podle pořadí v self.problemy for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append((soucty[problem][resitel], tabulka[problem][resitel])) @@ -162,7 +166,7 @@ class TabulkaOdevzdanychReseniView(ListView): # Pro použití hacku na automatické {{form.media}} v template: ctx['form'] = ctx['filtr'] # Pro maximum v přesměrovátku ročníků - ctx['aktualni_rocnik'] = m.Nastaveni.get_solo().aktualni_rocnik + ctx['aktualni_rocnik'] = Nastaveni.get_solo().aktualni_rocnik ctx['barvicky'] = self.barvicky if 'rocnik' in self.kwargs: ctx['rocnik'] = self.kwargs['rocnik'] @@ -178,7 +182,7 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi Asi už bude zastaralý v okamžiku, kdy se tenhle komentář nasadí na produkci :-) V případě, že takové řešení existuje jen jedno, tak na něj přesměruje.""" - model = m.Reseni + model = Reseni template_name = 'odevzdavatko/seznam.html' def get_queryset(self): @@ -190,8 +194,8 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi if problem_id is None: raise ValueError("Nemám problém! (To je problém!)") - resitel = m.Resitel.objects.get(id=resitel_id) - problem = m.Problem.objects.get(id=problem_id) + resitel = Resitel.objects.get(id=resitel_id) + problem = Problem.objects.get(id=problem_id) qs = qs.filter( problem__in=[problem], resitele__in=[resitel], @@ -221,13 +225,13 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi ## XXX: https://docs.djangoproject.com/en/3.1/topics/class-based-views/mixins/#avoid-anything-more-complex class DetailReseniView(DetailView): """ Náhled na řešení. Editace je v :py:class:`EditReseniView`. """ - model = m.Reseni + model = Reseni template_name = 'odevzdavatko/detail.html' def aktualni_hodnoceni(self): - self.reseni = get_object_or_404(m.Reseni, id=self.kwargs['pk']) + self.reseni = get_object_or_404(Reseni, id=self.kwargs['pk']) result = [] # Slovníky s klíči problem, body, deadline_body -- initial data pro f.OhodnoceniReseniFormSet - for hodn in m.Hodnoceni.objects.filter(reseni=self.reseni): + for hodn in Hodnoceni.objects.filter(reseni=self.reseni): seznam_atributu = [ "problem", "body", @@ -284,7 +288,7 @@ class EditReseniView(DetailReseniView): def hodnoceniReseniView(request, pk, *args, **kwargs): - reseni = get_object_or_404(m.Reseni, pk=pk) + reseni = get_object_or_404(Reseni, pk=pk) success_url = reverse('odevzdavatko_detail_reseni', kwargs={'pk': pk}) # FIXME: Použit initial i tady a nebastlit hodnocení tak nízkoúrovňově @@ -300,7 +304,7 @@ def hodnoceniReseniView(request, pk, *args, **kwargs): poznamka_form.save() # Smažeme všechna dosavadní hodnocení tohoto řešení - qs = m.Hodnoceni.objects.filter(reseni=reseni) + qs = Hodnoceni.objects.filter(reseni=reseni) logger.info(f"Will delete {qs.count()} objects: {qs}") qs.delete() @@ -311,7 +315,7 @@ def hodnoceniReseniView(request, pk, *args, **kwargs): del(data_for_hodnoceni["body_celkem"]) del(data_for_hodnoceni["body_neprepocitane"]) del(data_for_hodnoceni["body_neprepocitane_celkem"]) - hodnoceni = m.Hodnoceni( + hodnoceni = Hodnoceni( reseni=reseni, **form.cleaned_data, ) @@ -332,14 +336,14 @@ def hodnoceniReseniView(request, pk, *args, **kwargs): class PrehledOdevzdanychReseni(ListView): - model = m.Hodnoceni + model = Hodnoceni template_name = 'odevzdavatko/prehled_reseni.html' def get_queryset(self): if not self.request.user.is_authenticated: raise RuntimeError("Uživatel měl být přihlášený!") # get_or_none, aby neexistence řešitele (např. u orgů) neházela chybu - resitel = m.Resitel.objects.filter(osoba__user=self.request.user).first() + resitel = Resitel.objects.filter(osoba__user=self.request.user).first() qs = super().get_queryset() qs = qs.filter(reseni__resitele__in=[resitel]) # Setřídíme podle času doručení řešení, aby se netřídily podle okamžiku vyrobení Hodnocení @@ -360,13 +364,13 @@ class PrehledOdevzdanychReseni(ListView): # Přehled všech řešení kvůli debugování class SeznamReseniView(ListView): - model = m.Reseni + model = Reseni template_name = 'odevzdavatko/seznam.html' class SeznamAktualnichReseniView(SeznamReseniView): def get_queryset(self): qs = super().get_queryset() - akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi... + akt_rocnik = Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi... resitele = resi_v_rocniku(akt_rocnik) qs = qs.filter(resitele__in=resitele) # FIXME: Najde řešení i ze starých ročníků, která odevzdal alespoň jeden aktuální řešitel return qs @@ -378,7 +382,7 @@ class VlozReseniView(LoginRequiredMixin, FormView): def form_valid(self, form): data = form.cleaned_data - nove_reseni = m.Reseni.objects.create( + nove_reseni = Reseni.objects.create( cas_doruceni=data['cas_doruceni'], forma=data['forma'], poznamka=data['poznamka'], @@ -405,35 +409,35 @@ class VlozReseniView(LoginRequiredMixin, FormView): class NahrajReseniRozcestnikTematekView(LoginRequiredMixin, ListView): - model = m.Problem + model = Problem template_name = 'odevzdavatko/nahraj_reseni_nadproblem.html' def get_queryset(self): - return super().get_queryset().filter(stav=m.Problem.STAV_ZADANY, nadproblem__isnull=True) + return super().get_queryset().filter(stav=Problem.STAV_ZADANY, nadproblem__isnull=True) class NahrajReseniView(LoginRequiredMixin, CreateView): - model = m.Reseni + model = Reseni template_name = 'odevzdavatko/nahraj_reseni.html' form_class = f.NahrajReseniForm - nadproblem: m.Problem + nadproblem: Problem def setup(self, request, *args, **kwargs): super().setup(request, *args, **kwargs) nadproblem_id = self.kwargs["nadproblem_id"] - self.nadproblem = get_object_or_404(m.Problem, id=nadproblem_id) + self.nadproblem = get_object_or_404(Problem, id=nadproblem_id) def get(self, request, *args, **kwargs): # Zaříznutí nezadaných problémů - if self.nadproblem.stav != m.Problem.STAV_ZADANY: + if self.nadproblem.stav != Problem.STAV_ZADANY: raise PermissionDenied() # Zaříznutí starých řešitelů: # FIXME: Je to tady dost naprasené, mělo by to asi být jinde… - osoba = m.Osoba.objects.get(user=self.request.user) + osoba = Osoba.objects.get(user=self.request.user) resitel = osoba.resitel - if resitel.rok_maturity <= m.Nastaveni.get_solo().aktualni_rocnik.prvni_rok: + if resitel.rok_maturity <= Nastaveni.get_solo().aktualni_rocnik.prvni_rok: return render(request, 'universal.html', { 'title': 'Nelze odevzdat', 'error': 'Zdá se, že jsi již odmaturoval/a, a tedy nemůžeš odevzdat do našeho semináře řešení.', @@ -445,7 +449,7 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): nadproblem_id = self.nadproblem.id return { "nadproblem_id": nadproblem_id, - "problem": [] if self.nadproblem.podproblem.filter(stav=m.Problem.STAV_ZADANY).exists() else nadproblem_id + "problem": [] if self.nadproblem.podproblem.filter(stav=Problem.STAV_ZADANY).exists() else nadproblem_id } @@ -457,7 +461,7 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): data['prilohy'] = f.ReseniSPrilohamiFormSet() data["nadproblem_id"] = self.nadproblem.id - data["nadproblem"] = get_object_or_404(m.Problem, id=self.nadproblem.id) + data["nadproblem"] = get_object_or_404(Problem, id=self.nadproblem.id) return data # FIXME prepsat tak, aby form_valid se volalo jen tehdy, kdyz je form i formset validni @@ -469,17 +473,17 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): return super().form_invalid(form) with transaction.atomic(): self.object = form.save() - self.object.resitele.add(m.Resitel.objects.get(osoba__user = self.request.user)) + self.object.resitele.add(Resitel.objects.get(osoba__user = self.request.user)) self.object.resitele.add(*form.cleaned_data["resitele"]) self.object.cas_doruceni = timezone.now() - self.object.forma = m.Reseni.FORMA_UPLOAD + self.object.forma = Reseni.FORMA_UPLOAD self.object.save() prilohy.instance = self.object prilohy.save() for hodnoceni in self.object.hodnoceni_set.all(): - hodnoceni.deadline_body = m.Deadline.objects.filter(deadline__gte=self.object.cas_doruceni).first() + hodnoceni.deadline_body = Deadline.objects.filter(deadline__gte=self.object.cas_doruceni).first() hodnoceni.save() # Pošleme mail opravovatelům a garantovi @@ -497,7 +501,7 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): # FIXME: Víc informativní obsah mailů, možná vč. příloh? prijemci = map(lambda it: it.osoba.email, prijemci) - resitel = m.Osoba.objects.get(user = self.request.user) + resitel = Osoba.objects.get(user = self.request.user) seznam = "problému " + str(problemy[0]) if len(problemy) == 1 else 'následujícím problémům:\n' + ', \n'.join(map(str, problemy)) seznam_do_subjectu = "problému " + str(problemy[0]) + ("" if len(problemy) == 1 else f" (a dalším { len(problemy) - 1 })") diff --git a/personalni/views.py b/personalni/views.py index d994974d..9e29d5b7 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -16,10 +16,12 @@ from django.db import transaction from django.http import HttpResponse from django.utils import timezone -import seminar.models as s + import personalni.models as m from soustredeni.models import Soustredeni from odevzdavatko.models import Hodnoceni +from tvorba.models import Clanek, Uloha, Tema +from various.models import Nastaveni from .forms import PrihlaskaForm, ProfileEditForm, PoMaturiteProfileEditForm from datetime import date @@ -94,7 +96,7 @@ class OrgoRozcestnikView(TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['posledni_soustredeni'] = Soustredeni.objects.order_by('-datum_konce').first() - nastaveni = s.Nastaveni.objects.first() + nastaveni = Nastaveni.objects.first() aktualni_rocnik = nastaveni.aktualni_rocnik context['posledni_cislo_url'] = nastaveni.aktualni_cislo.verejne_url() # TODO možná chceme odkazovat na právě rozpracované číslo, a ne to poslední vydané @@ -118,11 +120,11 @@ class OrgoRozcestnikView(TemplateView): context["pocty_neopravenych_reseni"] = [(it['problem__nazev'], it['cas'].date) for it in pocty_neopravenych_reseni.all()] #FIXME: přidat stav='STAV_ZADANY' - temata = s.Tema.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), + temata = Tema.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), rocnik=aktualni_rocnik).distinct() - ulohy = s.Uloha.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), + ulohy = Uloha.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), cislo_zadani__rocnik=aktualni_rocnik).distinct() - clanky = s.Clanek.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), + clanky = Clanek.objects.filter(Q(garant=organizator) | Q(autor=organizator) | Q(opravovatele__in=[organizator]), cislo__rocnik=aktualni_rocnik).distinct() context['temata'] = temata diff --git a/soustredeni/models.py b/soustredeni/models.py index 23553c34..a86992f5 100644 --- a/soustredeni/models.py +++ b/soustredeni/models.py @@ -10,7 +10,7 @@ from django.conf import settings from personalni.models import Resitel, Organizator from seminar.models.base import SeminarModelBase -import tvorba.models as am +from tvorba.models import Rocnik, Problem, aux_generate_filename logger = logging.getLogger(__name__) @@ -27,7 +27,7 @@ class Soustredeni(SeminarModelBase): # Interní ID id = models.AutoField(primary_key = True) - rocnik = models.ForeignKey(am.Rocnik, verbose_name='ročník', related_name='soustredeni', + rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='soustredeni', on_delete=models.PROTECT) datum_zacatku = models.DateField('datum začátku', blank=True, null=True, @@ -143,13 +143,13 @@ class Soustredeni_Organizatori(SeminarModelBase): def generate_filename_konfera(self, filename): return os.path.join( settings.SEMINAR_KONFERY_DIR, - am.aux_generate_filename(self, filename) + aux_generate_filename(self, filename) ) ## @reversion.register(ignore_duplicates=True) -class Konfera(am.Problem): +class Konfera(Problem): class Meta: db_table = 'seminar_konfera' verbose_name = 'Konfera' diff --git a/soustredeni/testutils.py b/soustredeni/testutils.py index 6591cbb3..ff51073b 100644 --- a/soustredeni/testutils.py +++ b/soustredeni/testutils.py @@ -6,7 +6,7 @@ from typing import Sequence import lorem from .models import Soustredeni, Konfera -import seminar.models as am # tvorba +from tvorba.models import Rocnik import personalni.models as pm logger = logging.getLogger(__name__) @@ -25,7 +25,7 @@ def gen_soustredeni( for _ in range(1, 10): # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) datum_zacatku = datetime.date(rnd.randint(2000, 2020), rnd.randint(1, 12), rnd.randint(1, 28)) working_sous = Soustredeni.objects.create( - rocnik=am.Rocnik.objects.order_by('?').first(), + rocnik=Rocnik.objects.order_by('?').first(), verejne_db=rnd.choice([True, False]), misto=rnd.choice(['Kremrolovice', 'Indiánov', 'U zmzliny', 'Vafláreň', 'Větrník', 'Horní Rakvička', 'Dolní cheesecake']), typ=rnd.choice(['jarni', 'podzimni', 'vikend']), diff --git a/tvorba/templatetags/deadliny.py b/tvorba/templatetags/deadliny.py index 199a1eef..837efcc0 100644 --- a/tvorba/templatetags/deadliny.py +++ b/tvorba/templatetags/deadliny.py @@ -1,30 +1,30 @@ from django import template from django.utils.safestring import mark_safe register = template.Library() -import seminar.models as m +from tvorba.models import Deadline @register.filter(name='deadline_kratseji') -def deadline_kratsi_text(deadline: m.Deadline): +def deadline_kratsi_text(deadline: Deadline): if deadline is None: return 'NONE' strings = { - m.Deadline.TYP_PRVNI: f"{deadline.cislo} ⭯", - m.Deadline.TYP_SOUS: f"{deadline.cislo} Ⓢ", - m.Deadline.TYP_PRVNI_A_SOUS: f"{deadline.cislo} ⭯Ⓢ", - m.Deadline.TYP_CISLA: f"{deadline.cislo} ✓", + Deadline.TYP_PRVNI: f"{deadline.cislo} ⭯", + Deadline.TYP_SOUS: f"{deadline.cislo} Ⓢ", + Deadline.TYP_PRVNI_A_SOUS: f"{deadline.cislo} ⭯Ⓢ", + Deadline.TYP_CISLA: f"{deadline.cislo} ✓", } return strings[deadline.typ] @register.filter(name='deadline_html') -def deadline_html(deadline: m.Deadline): +def deadline_html(deadline: Deadline): if deadline is None: return 'Neznámý deadline' text = deadline_kratsi_text(deadline) classes = { - m.Deadline.TYP_PRVNI: 'preddeadline', - m.Deadline.TYP_SOUS: 'sous_deadline', - m.Deadline.TYP_PRVNI_A_SOUS: 'sous_deadline', - m.Deadline.TYP_CISLA: 'final_deadline', + Deadline.TYP_PRVNI: 'preddeadline', + Deadline.TYP_SOUS: 'sous_deadline', + Deadline.TYP_PRVNI_A_SOUS: 'sous_deadline', + Deadline.TYP_CISLA: 'final_deadline', } return mark_safe(f'{text}') diff --git a/tvorba/testutils.py b/tvorba/testutils.py index 18440679..323acb38 100644 --- a/tvorba/testutils.py +++ b/tvorba/testutils.py @@ -6,7 +6,9 @@ import lorem import django.contrib.auth import logging -from seminar.models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, UlohaZadaniNode +from .models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha + +from odevzdavatko.models import Reseni, Hodnoceni import seminar.models as m from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after @@ -54,12 +56,12 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi rnd.choice(jmeno), rnd.choice(kde)] ) - text_zadani = Text.objects.create( + text_zadani = m.Text.objects.create( na_web = text, do_cisla = text, ) - zad = TextNode.objects.create(text = text_zadani, root = p.cislo_zadani.rocnik.rocniknode) - uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad, root = p.cislo_zadani.rocnik.rocniknode) + zad = m.TextNode.objects.create(text = text_zadani, root = p.cislo_zadani.rocnik.rocniknode) + uloha_zadani = m.UlohaZadaniNode.objects.create(uloha = p, first_child = zad, root = p.cislo_zadani.rocnik.rocniknode) p.ulohazadaninode = uloha_zadani otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani) @@ -76,12 +78,12 @@ def gen_vzoroveho_reseni_ulohy(rnd, organizatori, uloha, pocet_opravovatelu): # Generování vzorového řešení. obsah = rnd.choice(reseni) - text_vzoraku = Text.objects.create( + text_vzoraku = m.Text.objects.create( na_web = obsah, do_cisla = obsah ) - vzorak = TextNode.objects.create(text = text_vzoraku, root = uloha.cislo_zadani.rocnik.rocniknode) - uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak, root = uloha.cislo_zadani.rocnik.rocniknode) + vzorak = m.TextNode.objects.create(text = text_vzoraku, root = uloha.cislo_zadani.rocnik.rocniknode) + uloha_vzorak = m.UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak, root = uloha.cislo_zadani.rocnik.rocniknode) uloha.ulohavzoraknode = uloha_vzorak uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) @@ -132,7 +134,7 @@ def gen_rocniky(last_rocnik, size): node = None for ri in range(min(last_rocnik - size, 1), last_rocnik + 1): rocnik = Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) - node2 = RocnikNode.objects.create(rocnik = rocnik, succ = node) + node2 = m.RocnikNode.objects.create(rocnik = rocnik, succ = node) rocnik.save() node = node2 rocniky.append(rocnik) @@ -167,7 +169,7 @@ def gen_cisla(rnd, rocniky): datum_vydani=vydano, verejne_db=True, ) - node2 = CisloNode.objects.get(cislo = cislo) + node2 = m.CisloNode.objects.get(cislo = cislo) node2.succ = node node2.root = rocnik.rocniknode cislo.save() @@ -195,7 +197,7 @@ def add_first_child(node, child): def get_text(): odstavec = lorem.paragraph() - return Text.objects.create(na_web = odstavec, do_cisla = odstavec) + return m.Text.objects.create(na_web = odstavec, do_cisla = odstavec) def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): tema = Tema.objects.create( @@ -215,32 +217,32 @@ def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): for cislo in cisla: # Přidáme TemaVCisleNode do daného čísla cislo_node = cislo.cislonode - tema_cislo_node = TemaVCisleNode.objects.create(tema = tema, root = cislo_node.root) + tema_cislo_node = m.TemaVCisleNode.objects.create(tema = tema, root = cislo_node.root) insert_last_child(cislo_node, tema_cislo_node) # Přidávání obsahu do čísla cast_node = m.CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod), root=cislo_node.root) add_first_child(tema_cislo_node, cast_node) - text_node = TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node, text_node) cast_node2 = m.CastNode.objects.create(nadpis = "První podproblém", root=cislo_node.root) add_first_child(text_node, cast_node2) - text_node2 = TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node2 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node2, text_node2) cast_node3 = m.CastNode.objects.create(nadpis = "Druhý podproblém", root=cislo_node.root) add_first_child(text_node2, cast_node3) - text_node3 = TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node3 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3, text_node3) cast_node4 = m.CastNode.objects.create(nadpis = "Třetí podproblém", root=cislo_node.root) add_first_child(text_node3, cast_node4) - text_node4 = TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node4 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3, text_node4) cast_node3a = m.CastNode.objects.create(nadpis = "Podproblém paralelní s " @@ -248,7 +250,7 @@ def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): cast_node3.succ = cast_node3a cast_node3.save() - text_node3a = TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node3a = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3a, text_node3a) # Občas přidáme mezičíslo @@ -261,8 +263,8 @@ def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): add_first_child(mezicislo_node, cast_node_mezicislo) odstavec = lorem.paragraph() - text_mezicislo = Text.objects.create(na_web = odstavec, do_cisla = odstavec) - text_node_mezicislo = TextNode.objects.create(text = text_mezicislo, root=cislo_node.root) + text_mezicislo = m.Text.objects.create(na_web = odstavec, do_cisla = odstavec) + text_node_mezicislo = m.TextNode.objects.create(text = text_mezicislo, root=cislo_node.root) add_first_child(cast_node_mezicislo, text_node_mezicislo) return tema @@ -306,7 +308,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): # Vyrobíme TemaVCisleNody pro obsah for i in range(zacatek_tematu, konec_tematu+1): - node = TemaVCisleNode.objects.create(tema = t,root=rocnik.rocniknode) + node = m.TemaVCisleNode.objects.create(tema = t,root=rocnik.rocniknode) # FIXME: Není to off-by-one? otec = cisla[i-1].cislonode otec_syn(otec, node) @@ -359,12 +361,12 @@ def gen_ulohy_tematu(rnd, organizatori, resitele, tema, kod, cislo, cislo_se_vzo rnd.choice(jmeno), rnd.choice(kde)] ) - text_zadani = Text.objects.create( + text_zadani = m.Text.objects.create( na_web = obsah, do_cisla = obsah, ) - zad = TextNode.objects.create(text = text_zadani, root=tema.temavcislenode_set.first().root) - uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad, root=tema.temavcislenode_set.first().root) + zad = m.TextNode.objects.create(text = text_zadani, root=tema.temavcislenode_set.first().root) + uloha_zadani = m.UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad, root=tema.temavcislenode_set.first().root) uloha.ulohazadaninode = uloha_zadani # Generování řešení a hodnocení k úloze @@ -396,7 +398,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, else: cislo_se_vzorakem = cislo_se_vzorakem.first() - for tema_node in all_children_of_type(cislo.cislonode, TemaVCisleNode): + for tema_node in all_children_of_type(cislo.cislonode, m.TemaVCisleNode): tema = tema_node.tema # Pokud už témátko skončilo, žádné úložky negenerujeme @@ -419,7 +421,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, # Najdeme správný TemaVCisleNode pro vložení vzoráku res_tema_node = None; for node in all_children(cislo_se_vzorakem.cislonode): - if isinstance(node, TemaVCisleNode): + if isinstance(node, m.TemaVCisleNode): if node.tema == tema: res_tema_node = node if res_tema_node is None: @@ -448,16 +450,16 @@ def gen_clanek(rnd, organizatori, resitele): ) clanek.save() - reseni = m.Reseni.objects.create( + reseni = Reseni.objects.create( zverejneno=True, ) reseni.resitele.add(rnd.choice(resitele)) reseni.save() - cislo = m.Cislo.objects.get(rocnik__rocnik=22, poradi=2) + cislo = Cislo.objects.get(rocnik__rocnik=22, poradi=2) cislonode = cislo.cislonode - hodnoceni = m.Hodnoceni.objects.create( + hodnoceni = Hodnoceni.objects.create( body=15.0, cislo_body=cislo, reseni=reseni, diff --git a/tvorba/utils.py b/tvorba/utils.py index ba0c5d5b..c2feadd9 100644 --- a/tvorba/utils.py +++ b/tvorba/utils.py @@ -2,7 +2,7 @@ from django.core.exceptions import ObjectDoesNotExist import personalni.models -import seminar.models as m +import tvorba.models as m def resi_v_rocniku(rocnik, cislo=None): diff --git a/tvorba/views/__init__.py b/tvorba/views/__init__.py index 823ddd96..e45eaaa6 100644 --- a/tvorba/views/__init__.py +++ b/tvorba/views/__init__.py @@ -14,12 +14,11 @@ from django.db.models import Q, Sum, Count from django.views.generic.base import RedirectView from django.core.exceptions import PermissionDenied -import seminar.models as s import seminar.models as m -from seminar.models import Problem, Cislo, Reseni, Nastaveni, Rocnik, \ - Resitel, Novinky, Tema, Clanek, \ - Deadline # Tohle je stare a chceme se toho zbavit. Pouzivejte s.ToCoChci -#from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva +from personalni.models import Resitel +from soustredeni.models import Konfera +from tvorba.models import Problem, Cislo, Rocnik, Tema, Clanek, Deadline, Uloha +from various.models import Nastaveni from treenode import treelib import treenode.templatetags as tnltt import treenode.serializers as vr @@ -58,7 +57,7 @@ def get_problemy_k_tematu(tema): # FIXME: Pozor, níž je ještě jeden ProblemView! #class ProblemView(generic.DetailView): -# model = s.Problem +# model = Problem # # Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView # template_name = TreeNodeView.template_name # @@ -70,17 +69,17 @@ def get_problemy_k_tematu(tema): # if False: # # Hezčí formátování zbytku :-P # pass -# elif isinstance(self.object, s.Clanek) or isinstance(self.object, s.Konfera): +# elif isinstance(self.object, Clanek) or isinstance(self.object, Konfera): # # Tyhle Problémy mají ŘešeníNode # context['tnldata'] = TNLData.from_treenode(self.object.reseninode,user) -# elif isinstance(self.object, s.Uloha): +# elif isinstance(self.object, Uloha): # # FIXME: Teď vždycky zobrazujeme i vzorák! Možná by bylo hezčí/lepší mít to stejně jako pro Téma: procházet jen dosažitelné z Ročníku / čísla / whatever # tnl_zadani = TNLData.from_treenode(self.object.ulohazadaninode,user) # tnl_vzorak = TNLData.from_treenode(self.object.ulohavzoraknode,user) # context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak]) -# elif isinstance(self.object, s.Tema): +# elif isinstance(self.object, Tema): # rocniknode = self.object.rocnik.rocniknode -# context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, s.TemaVCisleNode)) +# context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, m.TemaVCisleNode)) # else: # raise ValueError("Obecný problém nejde zobrazit.") # return context @@ -115,7 +114,7 @@ def ZadaniTemataView(request): nastaveni = get_object_or_404(Nastaveni) verejne = nastaveni.aktualni_cislo.verejne() akt_rocnik = nastaveni.aktualni_cislo.rocnik - temata = s.Tema.objects.filter(rocnik=akt_rocnik, stav='zadany') + temata = Tema.objects.filter(rocnik=akt_rocnik, stav='zadany') return render(request, 'tvorba/tematka/rozcestnik.html', { 'tematka': temata, @@ -140,14 +139,14 @@ def ZadaniTemataView(request): # # #def TematkoView(request, rocnik, tematko): -# nastaveni = s.Nastaveni.objects.first() -# rocnik_object = s.Rocnik.objects.filter(rocnik=rocnik) -# tematko_object = s.Tema.objects.filter(rocnik=rocnik_object[0], kod=tematko) +# nastaveni = Nastaveni.objects.first() +# rocnik_object = Rocnik.objects.filter(rocnik=rocnik) +# tematko_object = Tema.objects.filter(rocnik=rocnik_object[0], kod=tematko) # seznam = vytahniZLesaSeznam(tematko_object[0], nastaveni.aktualni_rocnik().rocniknode) # for node, depth in seznam: -# if node.isinstance(node, s.KonferaNode): +# if node.isinstance(node, m.KonferaNode): # raise Exception("Not implemented yet") -# if node.isinstance(node, s.PohadkaNode): # Mohu ignorovat, má pod sebou +# if node.isinstance(node, m.PohadkaNode): # Mohu ignorovat, má pod sebou # pass # # return render(request, 'tvorba/tematka/toaletak.html', {}) @@ -155,8 +154,8 @@ def ZadaniTemataView(request): # #def TemataRozcestnikView(request): # print("=============================================") -# nastaveni = s.Nastaveni.objects.first() -# tematka_objects = s.Tema.objects.filter(rocnik=nastaveni.aktualni_rocnik()) +# nastaveni = Nastaveni.objects.first() +# tematka_objects = Tema.objects.filter(rocnik=nastaveni.aktualni_rocnik()) # tematka = [] #List tematka obsahuje pro kazde tematko object a list vsech TemaVCisleNodu - implementované pomocí slovníku # for tematko_object in tematka_objects: # print("AKTUALNI TEMATKO") @@ -278,7 +277,7 @@ def resiteleRocnikuCsvExportView(request, rocnik): assert request.method in ('GET', 'HEAD') return dataResiteluCsvResponse( utils.resi_v_rocniku( - get_object_or_404(m.Rocnik, rocnik=rocnik) + get_object_or_404(Rocnik, rocnik=rocnik) ) ) @@ -291,10 +290,10 @@ def resiteleRocnikuCsvExportView(request, rocnik): # def get_template_names(self, **kwargs): # # FIXME: Switch podle typu není hezký, ale nechtělo se mi to přepisovat celé. Správně by se tohle mělo řešit polymorfismem. # spravne_templaty = { -# s.Uloha: "uloha", -# s.Tema: "tema", -# s.Konfera: "konfera", -# s.Clanek: "clanek", +# Uloha: "uloha", +# Tema: "tema", +# Konfera: "konfera", +# Clanek: "clanek", # } # context = super().get_context_data(**kwargs) # return ['tvorba/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html'] @@ -340,10 +339,10 @@ class CisloView(generic.DetailView): deadliny_s_vysledkovkami = [] nadpisy = { - m.Deadline.TYP_CISLA: "Výsledkovka", - m.Deadline.TYP_PRVNI: "Výsledkovka do prvního deadlinu", - m.Deadline.TYP_PRVNI_A_SOUS: "Výsledkovka do prvního deadlinu a deadlinu pro účast na soustředění", - m.Deadline.TYP_SOUS: "Výsledkovka do deadlinu pro účast na soustředění", + Deadline.TYP_CISLA: "Výsledkovka", + Deadline.TYP_PRVNI: "Výsledkovka do prvního deadlinu", + Deadline.TYP_PRVNI_A_SOUS: "Výsledkovka do prvního deadlinu a deadlinu pro účast na soustředění", + Deadline.TYP_SOUS: "Výsledkovka do deadlinu pro účast na soustředění", } for deadline in deadliny: @@ -580,5 +579,5 @@ class AktualniRocnikRedirectView(RedirectView): pattern_name = 'seminar_rocnik' def get_redirect_url(self, *args, **kwargs): - aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik.rocnik + aktualni_rocnik = Nastaveni.get_solo().aktualni_rocnik.rocnik return super().get_redirect_url(rocnik=aktualni_rocnik, *args, **kwargs) diff --git a/tvorba/views/docasne.py b/tvorba/views/docasne.py index cbad789b..453909ca 100644 --- a/tvorba/views/docasne.py +++ b/tvorba/views/docasne.py @@ -5,13 +5,13 @@ from django.db import transaction from django.forms import Form, CharField, IntegerField from django.views.generic import FormView -import seminar.models as m +from tvorba.models import Cislo, Problem, Uloha, Tema from django.shortcuts import render, get_object_or_404 def problemView(request, pk): # Pokud problém neexistuje, hodíme obyčejnou 404 # Taktéž v případě, že takový problém nemá být vidět - problem = get_object_or_404(m.Problem, id=pk, stav__in=[m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY]) + problem = get_object_or_404(Problem, id=pk, stav__in=[Problem.STAV_ZADANY, Problem.STAV_VYRESENY]) # Problém existuje, neumíme ho zobrazit, renderujeme nějakou haluz template = 'universal.html' ctx = { @@ -32,7 +32,7 @@ class HromadnePridaniForm(Form): def clean_tema(self): """ Kontrola, že `tema` je název právě jednoho tématu """ - if m.Tema.objects.filter( + if Tema.objects.filter( nazev__exact=self.cleaned_data['tema'], nadproblem=None).count() != 1: raise ValidationError("Špatný nebo nepřesně zadaný název témátka") @@ -67,20 +67,20 @@ class HromadnePridaniView(FormView): dil = cd["dil"] body = list(map(int, cd["body"].split(","))) - t = m.Problem.objects.get(nazev__exact=tema, nadproblem=None) + t = Problem.objects.get(nazev__exact=tema, nadproblem=None) with transaction.atomic(): pfx = f"{t.nazev}, díl {dil}, " for k, b in enumerate(body, 1): - u = m.Uloha.objects.create( + u = Uloha.objects.create( nadproblem=t, nazev=pfx + f"{'úloha' if b > 0 else 'problém'} {k}", autor=t.autor, garant=t.garant, max_body=b, - cislo_zadani=m.Cislo.get(t.rocnik.rocnik, dil), + cislo_zadani=Cislo.get(t.rocnik.rocnik, dil), kod=k, - stav=m.Problem.STAV_ZADANY, + stav=Problem.STAV_ZADANY, ) u.opravovatele.set(t.opravovatele.all()) return super().form_valid(form) diff --git a/various/autentizace/views.py b/various/autentizace/views.py index 73b51c54..dc24984f 100644 --- a/various/autentizace/views.py +++ b/various/autentizace/views.py @@ -55,5 +55,4 @@ class PasswordResetCompleteView(auth_views.PasswordResetCompleteView): class PasswordChangeView(auth_views.PasswordChangeView): - # template_name = 'seminar/password_change.html' success_url = reverse_lazy('titulni_strana') diff --git a/various/management/commands/generate_thumbnails.py b/various/management/commands/generate_thumbnails.py index e52ea9bc..77d8a135 100644 --- a/various/management/commands/generate_thumbnails.py +++ b/various/management/commands/generate_thumbnails.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from seminar.models import Cislo +from tvorba.models import Cislo from subprocess import CalledProcessError import logging diff --git a/various/management/commands/pregeneruj_zmrazene_vysledkovky.py b/various/management/commands/pregeneruj_zmrazene_vysledkovky.py index d728ab0f..ba3f3103 100644 --- a/various/management/commands/pregeneruj_zmrazene_vysledkovky.py +++ b/various/management/commands/pregeneruj_zmrazene_vysledkovky.py @@ -1,11 +1,11 @@ from django.core.management.base import BaseCommand -import seminar.models as m +from tvorba.models import Deadline class Command(BaseCommand): help = "Všem deadlinům se zveřejněnou výsledkovkou vygeneruj výsledkovku" def handle(self, *args, **options): - for deadline in m.Deadline.objects.filter(verejna_vysledkovka=True): + for deadline in Deadline.objects.filter(verejna_vysledkovka=True): deadline.vygeneruj_vysledkovku() diff --git a/various/management/commands/testdata.py b/various/management/commands/testdata.py index 8f591fa5..7cfc726b 100644 --- a/various/management/commands/testdata.py +++ b/various/management/commands/testdata.py @@ -4,7 +4,9 @@ from django.core.management.base import BaseCommand from django.core.management import call_command from django.conf import settings -from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni +from odevzdavatko.models import Reseni +from personalni.models import Skola, Resitel +from tvorba.models import Rocnik, Cislo, Problem from various.testutils import create_test_data import django.contrib.auth User = django.contrib.auth.get_user_model() diff --git a/various/testutils.py b/various/testutils.py index 52411ef6..95433324 100644 --- a/various/testutils.py +++ b/various/testutils.py @@ -7,7 +7,9 @@ from django.contrib.flatpages.models import FlatPage from django.contrib.sites.models import Site from django.db import transaction -from seminar.models import Rocnik, Cislo, Nastaveni, Osoba, Organizator +from personalni.models import Osoba, Organizator +from tvorba.models import Rocnik, Cislo +from various.models import Nastaveni from korektury.testutils import create_test_pdf from novinky.testutils import gen_novinky diff --git a/various/views/final.py b/various/views/final.py index de23a718..d21c00be 100644 --- a/various/views/final.py +++ b/various/views/final.py @@ -14,8 +14,9 @@ from django.views import generic import novinky.views import treenode.treelib as t import tvorba.views -from personalni.models import Resitel -from seminar import models as m +import seminar.models as m +from personalni.models import Resitel, Osoba +from tvorba.models import Clanek, Deadline from ..models import Nastaveni @@ -30,7 +31,7 @@ class TitulniStranaView(generic.ListView): context = super(TitulniStranaView, self).get_context_data(**kwargs) nastaveni = get_object_or_404(Nastaveni) - deadline = m.Deadline.objects.filter( + deadline = Deadline.objects.filter( deadline__gte=timezone.now()).order_by("deadline").first() context['nejblizsi_deadline'] = deadline @@ -93,31 +94,31 @@ def seznam_problemu(): # Duplicita jmen jmena = {} - for r in m.Resitel.objects.all(): + for r in Resitel.objects.all(): j = r.osoba.plne_jmeno() if j not in jmena: jmena[j] = [] jmena[j].append(r) for j in jmena: if len(jmena[j]) > 1: - prb(m.Resitel, 'Duplicitní jméno "%s"' % (j,), jmena[j]) + prb(Resitel, 'Duplicitní jméno "%s"' % (j,), jmena[j]) # Data maturity a narození - for r in m.Resitel.objects.all(): + for r in Resitel.objects.all(): if not r.rok_maturity: - prb(m.Resitel, 'Neznámý rok maturity', [r]) + prb(Resitel, 'Neznámý rok maturity', [r]) if r.rok_maturity and (r.rok_maturity < 1990 or r.rok_maturity > datetime.date.today().year + 10): - prb(m.Resitel, 'Podezřelé datum maturity', [r]) + prb(Resitel, 'Podezřelé datum maturity', [r]) if r.osoba.datum_narozeni and ( r.osoba.datum_narozeni.year < 1970 or r.osoba.datum_narozeni.year > datetime.date.today().year - 12): - prb(m.Resitel, 'Podezřelé datum narození', [r]) + prb(Resitel, 'Podezřelé datum narození', [r]) # if not r.email: # prb(Resitel, u'Neznámý email', [r]) ## Kontroly konzistence databáze a TreeNodů # Články - for clanek in m.Clanek.objects.all(): + for clanek in Clanek.objects.all(): # získáme řešení svázané se článkem a z něj node ve stromě reseni = clanek.reseni_set if (reseni.count() != 1): @@ -136,7 +137,7 @@ def seznam_problemu(): # .cislonode je opačná vazba k treenode_ptr, abychom z TreeNode dostali # CisloNode if clanek.cislo != node.cislonode.cislo: - prb(m.Clanek, "Číslo otištění uložené u článku nesedí s " + prb(Clanek, "Číslo otištění uložené u článku nesedí s " "číslem otištění podle struktury treenodů.", [clanek]) break node = t.get_parent(node) @@ -146,8 +147,8 @@ def seznam_problemu(): def StavDatabazeView(request): # nastaveni = Nastaveni.objects.get() problemy = seznam_problemu() - muzi = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_MUZSKE) - zeny = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_ZENSKE) + muzi = Resitel.objects.filter(osoba__osloveni=Osoba.OSLOVENI_MUZSKE) + zeny = Resitel.objects.filter(osoba__osloveni=Osoba.OSLOVENI_ZENSKE) return render(request, 'various/stav_databaze.html', { # 'nastaveni': nastaveni, 'problemy': problemy, diff --git a/vysledkovky/utils.py b/vysledkovky/utils.py index 7cd914f4..0a6c1897 100644 --- a/vysledkovky/utils.py +++ b/vysledkovky/utils.py @@ -2,7 +2,10 @@ import abc from functools import cached_property from typing import Union, Iterable # TODO: s pythonem 3.10 přepsat na '|' -import seminar.models as m +from odevzdavatko.models import Hodnoceni +from personalni.models import Resitel +from soustredeni.models import Konfera +from tvorba.models import Cislo, Rocnik, Deadline, Problem, Clanek from django.db.models import Q, Sum from tvorba.utils import resi_v_rocniku @@ -18,11 +21,11 @@ class FixedIterator: def body_resitelu( - za: Union[m.Cislo, m.Rocnik, None] = None, - do: m.Deadline = None, - od: m.Deadline = None, + za: Union[Cislo, Rocnik, None] = None, + do: Deadline = None, + od: Deadline = None, jen_verejne: bool = True, - resitele: Iterable[m.Resitel] = None, + resitele: Iterable[Resitel] = None, null=0 # Výchozí hodnota, pokud pro daného řešitele nejsou body ) -> dict[int, int]: filtr = Q() @@ -31,9 +34,9 @@ def body_resitelu( filtr &= Q(reseni__hodnoceni__deadline_body__verejna_vysledkovka=True) # Zjistíme, typ objektu v parametru "za" - if isinstance(za, m.Rocnik): + if isinstance(za, Rocnik): filtr &= Q(reseni__hodnoceni__deadline_body__cislo__rocnik=za) - elif isinstance(za, m.Cislo): + elif isinstance(za, Cislo): filtr &= Q(reseni__hodnoceni__deadline_body__cislo=za) if do: @@ -42,7 +45,7 @@ def body_resitelu( if od: filtr &= Q(reseni__hodnoceni__deadline_body__deadline__gte=od.deadline) - resiteleQuery = m.Resitel.objects.all() + resiteleQuery = Resitel.objects.all() if resitele is not None: resitele_id = [r.id for r in resitele] @@ -63,12 +66,12 @@ def body_resitelu( class Vysledkovka(abc.ABC): jen_verejne: bool - rocnik: m.Rocnik - do_deadlinu: m.Deadline + rocnik: Rocnik + do_deadlinu: Deadline @property @abc.abstractmethod - def aktivni_resitele(self) -> list[m.Resitel]: + def aktivni_resitele(self) -> list[Resitel]: ... @cached_property @@ -143,20 +146,20 @@ class Vysledkovka(abc.ABC): class VysledkovkaRocniku(Vysledkovka): - def __init__(self, rocnik: m.Rocnik, jen_verejne: bool = True): + def __init__(self, rocnik: Rocnik, jen_verejne: bool = True): self.rocnik = rocnik self.jen_verejne = jen_verejne - deadliny = m.Deadline.objects.filter(cislo__rocnik=rocnik) + deadliny = Deadline.objects.filter(cislo__rocnik=rocnik) if jen_verejne: deadliny = deadliny.filter(verejna_vysledkovka=True) self.do_deadlinu = deadliny.order_by("deadline").last() @cached_property - def aktivni_resitele(self) -> list[m.Resitel]: + def aktivni_resitele(self) -> list[Resitel]: return list(resi_v_rocniku(self.rocnik)) @cached_property - def cisla_rocniku(self) -> list[m.Cislo]: + def cisla_rocniku(self) -> list[Cislo]: """ Vrátí všechna čísla daného ročníku. """ if self.jen_verejne: return self.rocnik.verejne_vysledkovky_cisla() @@ -164,7 +167,7 @@ class VysledkovkaRocniku(Vysledkovka): return self.rocnik.cisla.all().order_by('poradi') @cached_property - def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: # Výstup: m.Cislo.id → ( m.Resitel.id → body ) + def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: # Výstup: Cislo.id → ( Resitel.id → body ) # TODO: Body jsou decimal! body_cisla_slovnik = dict() for cislo in self.cisla_rocniku: @@ -197,7 +200,7 @@ class VysledkovkaRocniku(Vysledkovka): radky_vysledkovky = [] setrizeni_resitele_dict = dict() - for r in m.Resitel.objects.filter( + for r in Resitel.objects.filter( id__in=self.setrizeni_resitele_id ).select_related('osoba'): setrizeni_resitele_dict[r.id] = r @@ -227,31 +230,31 @@ class VysledkovkaRocniku(Vysledkovka): class VysledkovkaCisla(Vysledkovka): def __init__( self, - cislo: m.Cislo, + cislo: Cislo, jen_verejne: bool = True, - do_deadlinu: m.Deadline = None + do_deadlinu: Deadline = None ): self.cislo = cislo self.rocnik = cislo.rocnik self.jen_verejne = jen_verejne if do_deadlinu is None: - do_deadlinu = m.Deadline.objects.filter(cislo=cislo).last() + do_deadlinu = Deadline.objects.filter(cislo=cislo).last() self.do_deadlinu = do_deadlinu @cached_property - def aktivni_resitele(self) -> list[m.Resitel]: + def aktivni_resitele(self) -> list[Resitel]: # TODO možná chytřeji vybírat aktivní řešitele return list(resi_v_rocniku(self.rocnik)) @cached_property - def problemy(self) -> list[m.Problem]: + def problemy(self) -> list[Problem]: """ Vrátí seznam všech problémů s body v daném čísle. """ - return m.Problem.objects.filter( - hodnoceni__in=m.Hodnoceni.objects.filter(deadline_body__cislo=self.cislo) + return Problem.objects.filter( + hodnoceni__in=Hodnoceni.objects.filter(deadline_body__cislo=self.cislo) ).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem') @cached_property - def hlavni_problemy(self) -> list[m.Problem]: + def hlavni_problemy(self) -> list[Problem]: """ Vrátí seznam všech problémů, které již nemají nadproblém. """ # hlavní problémy čísla # (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) @@ -269,7 +272,7 @@ class VysledkovkaCisla(Vysledkovka): # Není cached, protože si myslím, že queryset lze použít ve for jen jednou. @property def hodnoceni_do_cisla(self): - hodnoceni = m.Hodnoceni.objects.prefetch_related('reseni__resitele').select_related('problem', 'reseni') + hodnoceni = Hodnoceni.objects.prefetch_related('reseni__resitele').select_related('problem', 'reseni') if self.jen_verejne: hodnoceni = hodnoceni.filter(deadline_body__verejna_vysledkovka=True) return hodnoceni.filter( @@ -347,7 +350,7 @@ class VysledkovkaCisla(Vysledkovka): return self.sectene_body[2] @cached_property - def temata_a_spol(self) -> list[m.Problem]: + def temata_a_spol(self) -> list[Problem]: if self.rocnik.rocnik < ROCNIK_ZRUSENI_TEMAT: return self.hlavni_problemy else: @@ -358,7 +361,7 @@ class VysledkovkaCisla(Vysledkovka): return len(self.hlavni_problemy) - len(self.temata_a_spol) > 0 @cached_property - def podproblemy(self) -> dict[int, list[m.Problem]]: + def podproblemy(self) -> dict[int, list[Problem]]: podproblemy = {hp.id: [] for hp in self.temata_a_spol} temata_a_spol = set(self.temata_a_spol) podproblemy[-1] = [] @@ -375,7 +378,7 @@ class VysledkovkaCisla(Vysledkovka): return podproblemy @cached_property - def podproblemy_seznam(self) -> list[list[m.Problem]]: + def podproblemy_seznam(self) -> list[list[Problem]]: return [self.podproblemy[it.id] for it in self.temata_a_spol] + [self.podproblemy[-1]] @cached_property @@ -405,7 +408,7 @@ class VysledkovkaCisla(Vysledkovka): radky_vysledkovky = [] setrizeni_resitele_slovnik = {} - setrizeni_resitele = m.Resitel.objects.filter(id__in=self.setrizeni_resitele_id).select_related('osoba') + setrizeni_resitele = Resitel.objects.filter(id__in=self.setrizeni_resitele_id).select_related('osoba') for r in setrizeni_resitele: setrizeni_resitele_slovnik[r.id] = r @@ -456,29 +459,29 @@ class VysledkovkaCisla(Vysledkovka): @staticmethod def ne_clanek_ne_konfera(problem): inst = problem.get_real_instance() - return not (isinstance(inst, m.Clanek) or isinstance(inst, m.Konfera)) + return not (isinstance(inst, Clanek) or isinstance(inst, Konfera)) class VysledkovkaDoTeXu(VysledkovkaCisla): def __init__( self, - nejake_cislo: m.Cislo, - od_vyjma: m.Deadline, - do_vcetne: m.Deadline + nejake_cislo: Cislo, + od_vyjma: Deadline, + do_vcetne: Deadline ): super().__init__(nejake_cislo, False, do_vcetne) self.od_deadlinu = od_vyjma @cached_property - def problemy(self) -> list[m.Problem]: - return m.Problem.objects.filter(hodnoceni__in=m.Hodnoceni.objects.filter( + def problemy(self) -> list[Problem]: + return Problem.objects.filter(hodnoceni__in=Hodnoceni.objects.filter( deadline_body__deadline__gt=self.od_deadlinu.deadline, deadline_body__deadline__lte=self.do_deadlinu.deadline, )).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem') @property def hodnoceni_do_cisla(self): - hodnoceni = m.Hodnoceni.objects.prefetch_related( + hodnoceni = Hodnoceni.objects.prefetch_related( 'problem', 'reseni', 'reseni__resitele') if self.jen_verejne: hodnoceni = hodnoceni.filter(deadline_body__verejna_vysledkovka=True) -- 2.39.5 From f8b1f0978c5e8001bf65b3a95b77f8440ab5a81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 12:38:47 +0100 Subject: [PATCH 03/22] =?UTF-8?q?P=C5=99ejmenov=C3=A1n=C3=AD=20URLs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aesop/urls.py | 6 ++-- aesop/views.py | 4 +-- api/urls.py | 2 +- data/sitetree.json | 34 +++++++++--------- .../templates/odevzdavatko/nahraj_reseni.html | 2 +- .../nahraj_reseni_nadproblem.html | 2 +- .../templates/odevzdavatko/vloz_reseni.html | 2 +- odevzdavatko/urls.py | 8 ++--- odevzdavatko/views.py | 2 +- .../personalni/profil/orgorozcestnik.html | 2 +- .../templates/personalni/profil/resitel.html | 6 ++-- .../templates/personalni/udaje/edit.html | 2 +- .../templates/personalni/udaje/prihlaska.html | 2 +- personalni/urls.py | 6 ++-- soustredeni/models.py | 2 +- .../soustredeni/seznam_soustredeni.html | 2 +- soustredeni/urls.py | 6 ++-- treenode/urls.py | 10 +++--- tvorba/models.py | 6 ++-- tvorba/templates/tvorba/archiv/cislo.html | 4 +-- tvorba/templates/tvorba/archiv/rocnik.html | 2 +- .../tvorba/zadani/AktualniVysledkovka.html | 2 +- tvorba/urls.py | 36 +++++++++---------- tvorba/views/__init__.py | 2 +- .../templates/autentizace/login.html | 2 +- various/log_filters.py | 4 +-- various/templates/various/pracuje_se.html | 2 +- various/views/pomocne.py | 2 +- 28 files changed, 81 insertions(+), 81 deletions(-) diff --git a/aesop/urls.py b/aesop/urls.py index f39a0ba8..42122cd3 100644 --- a/aesop/urls.py +++ b/aesop/urls.py @@ -5,16 +5,16 @@ urlpatterns = [ path( 'aesop-export/mam-rocnik-.csv', views.ExportRocnikView.as_view(), - name='seminar_export_rocnik' + name='aesop_export_rocnik' ), path( 'aesop-export/mam-sous-.csv', views.ExportSousView.as_view(), - name='seminar_export_sous' + name='aesop_export_sous' ), path( 'aesop-export/index.csv', views.ExportIndexView.as_view(), - name='seminar_export_index' + name='aesop_export_index' ), ] diff --git a/aesop/views.py b/aesop/views.py index 1ff6c7ee..56a6d266 100644 --- a/aesop/views.py +++ b/aesop/views.py @@ -14,10 +14,10 @@ class ExportIndexView(generic.View): def get(self, request): ls = [] for r in Rocnik.objects.filter(exportovat = True): - url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) + url = reverse('aesop_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) ls.append(url.split('/')[-1]) for s in Soustredeni.objects.filter(exportovat = True): - url = reverse('seminar_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()}) + url = reverse('aesop_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()}) ls.append(url.split('/')[-1]) return HttpResponse('\n'.join(ls) + '\n', content_type='text/plain; charset=utf-8') diff --git a/api/urls.py b/api/urls.py index be58d3f9..ebb89534 100644 --- a/api/urls.py +++ b/api/urls.py @@ -17,5 +17,5 @@ urlpatterns = [ # Ceka na autocomplete v3 # path('autocomplete/organizatori/', # org_member_required(views.OrganizatorAutocomplete.as_view()), - # name='seminar_autocomplete_organizator') + # name='autocomplete_organizator') ] diff --git a/data/sitetree.json b/data/sitetree.json index 61868d9e..c19462e6 100644 --- a/data/sitetree.json +++ b/data/sitetree.json @@ -73,7 +73,7 @@ "sort_order": 3, "title": "Aktuální
ročník", "tree": 1, - "url": "seminar_aktualni_zadani", + "url": "tvorba_aktualni_zadani", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -121,7 +121,7 @@ "sort_order": 5, "title": "Archiv", "tree": 1, - "url": "seminar_archiv_rocniky", + "url": "tvorba_archiv_rocniky", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -289,7 +289,7 @@ "sort_order": 43, "title": "Výsledková listina", "tree": 1, - "url": "seminar_aktualni_vysledky", + "url": "tvorba_aktualni_vysledky", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -361,7 +361,7 @@ "sort_order": 20, "title": "Proběhlo", "tree": 1, - "url": "seminar_seznam_soustredeni", + "url": "soustredeni_probehlo", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -409,7 +409,7 @@ "sort_order": 23, "title": "Osobní údaje", "tree": 1, - "url": "seminar_resitel_edit", + "url": "personalni_resitel_edit", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -439,7 +439,7 @@ "sort_order": 36, "title": "Nahrát řešení", "tree": 1, - "url": "seminar_nahraj_reseni", + "url": "odevzdavatko_nahraj_reseni", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -463,7 +463,7 @@ "sort_order": 35, "title": "Témata", "tree": 1, - "url": "seminar_archiv_temata", + "url": "tvorba_archiv_temata", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -589,7 +589,7 @@ "sort_order": 15, "title": "Aktuální číslo", "tree": 1, - "url": "seminar_aktualni_zadani", + "url": "tvorba_aktualni_zadani", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -613,7 +613,7 @@ "sort_order": 24, "title": "Čísla", "tree": 1, - "url": "seminar_archiv_rocniky", + "url": "tvorba_archiv_rocniky", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -721,7 +721,7 @@ "sort_order": 36, "title": "Vložit řešení", "tree": 1, - "url": "seminar_vloz_reseni", + "url": "odevzdavatko_vloz_reseni", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -804,7 +804,7 @@ "sort_order": 37, "title": "Moje řešení", "tree": 1, - "url": "seminar_resitel_odevzdana_reseni", + "url": "odevzdavatko_resitel_odevzdana_reseni", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -828,7 +828,7 @@ "sort_order": 33, "title": "Aktuální ročník", "tree": 1, - "url": "seminar_aktualni_rocnik", + "url": "tvorba_aktualni_rocnik", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -900,7 +900,7 @@ "sort_order": 46, "title": "Ročník {{rocnik.rocnik}}", "tree": 1, - "url": "seminar_rocnik rocnik.rocnik", + "url": "tvorba_rocnik rocnik.rocnik", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -924,7 +924,7 @@ "sort_order": 47, "title": "Číslo {{ cislo.rocnik.rocnik }}.{{ cislo.poradi }}", "tree": 1, - "url": "seminar_cislo cislo.rocnik.rocnik cislo.poradi", + "url": "tvorba_cislo cislo.rocnik.rocnik cislo.poradi", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -1061,7 +1061,7 @@ "sort_order": 52, "title": "Nahrát řešení k nadproblému {{nadproblem_id}}", "tree": 1, - "url": "seminar_nahraj_reseni nadproblem_id", + "url": "odevzdavatko_nahraj_reseni nadproblem_id", "urlaspattern": true }, "model": "sitetree.treeitem", @@ -1109,10 +1109,10 @@ "sort_order": 54, "title": "Export do abstraktů sousu {{ soustredeni.id }}", "tree": 1, - "url": "seminar_soustredeni_abstrakty soustredeni.id", + "url": "soustredeni_abstrakty soustredeni.id", "urlaspattern": true }, "model": "sitetree.treeitem", "pk": 54 } -] \ No newline at end of file +] diff --git a/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html b/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html index ca326d67..6b8fee05 100644 --- a/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html +++ b/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html @@ -11,7 +11,7 @@ {% endblock %}

-
+ {% csrf_token %} diff --git a/odevzdavatko/templates/odevzdavatko/nahraj_reseni_nadproblem.html b/odevzdavatko/templates/odevzdavatko/nahraj_reseni_nadproblem.html index ccf505fa..0c8e1496 100644 --- a/odevzdavatko/templates/odevzdavatko/nahraj_reseni_nadproblem.html +++ b/odevzdavatko/templates/odevzdavatko/nahraj_reseni_nadproblem.html @@ -12,7 +12,7 @@ -
  • proběhlá soustředění +
  • proběhlá soustředění
    • vytvoření galerie
    • stažení seznamu účastníků
    • diff --git a/personalni/templates/personalni/profil/resitel.html b/personalni/templates/personalni/profil/resitel.html index 0bd92d63..f7abc1ca 100644 --- a/personalni/templates/personalni/profil/resitel.html +++ b/personalni/templates/personalni/profil/resitel.html @@ -10,9 +10,9 @@ Odhlásit se
      -Upravit údaje
      -Nahrát řešení
      -Již odevzdaná řešení
      +Upravit údaje
      +Nahrát řešení
      +Již odevzdaná řešení
      {% endblock %} diff --git a/personalni/templates/personalni/udaje/edit.html b/personalni/templates/personalni/udaje/edit.html index 085e4246..883e8e4c 100644 --- a/personalni/templates/personalni/udaje/edit.html +++ b/personalni/templates/personalni/udaje/edit.html @@ -11,7 +11,7 @@

      Změnit heslo

      - + {% include "personalni/udaje/udaje.html"%} diff --git a/personalni/templates/personalni/udaje/prihlaska.html b/personalni/templates/personalni/udaje/prihlaska.html index f26936de..af0a16c9 100644 --- a/personalni/templates/personalni/udaje/prihlaska.html +++ b/personalni/templates/personalni/udaje/prihlaska.html @@ -14,7 +14,7 @@

      Tučně popsaná pole jsou povinná.

      -
      + {% include "personalni/udaje/udaje.html" %}

      GDPR diff --git a/personalni/urls.py b/personalni/urls.py index 8abbb434..c4820b90 100644 --- a/personalni/urls.py +++ b/personalni/urls.py @@ -7,15 +7,15 @@ urlpatterns = [ path( 'org/rozcestnik/', org_required(views.OrgoRozcestnikView.as_view()), - name='seminar_org_rozcestnik' + name='personalni_org_rozcestnik' ), - path('prihlaska/', views.prihlaskaView, name='seminar_prihlaska'), + path('prihlaska/', views.prihlaskaView, name='personalni_prihlaska'), path( 'resitel/osobni-udaje/', login_required(views.resitelEditView), - name='seminar_resitel_edit' + name='personalni_resitel_edit' ), # Obecný view na profil -- orgům dá rozcestník, řešitelům jejich stránku diff --git a/soustredeni/models.py b/soustredeni/models.py index a86992f5..509c3cc2 100644 --- a/soustredeni/models.py +++ b/soustredeni/models.py @@ -75,7 +75,7 @@ class Soustredeni(SeminarModelBase): def verejne_url(self): #return reverse('seminar_soustredeni', kwargs={'pk': self.id}) - return reverse('seminar_seznam_soustredeni') + return reverse('soustredeni_probehlo') @reversion.register(ignore_duplicates=True) diff --git a/soustredeni/templates/soustredeni/seznam_soustredeni.html b/soustredeni/templates/soustredeni/seznam_soustredeni.html index ac33852a..fb79a7a0 100644 --- a/soustredeni/templates/soustredeni/seznam_soustredeni.html +++ b/soustredeni/templates/soustredeni/seznam_soustredeni.html @@ -40,7 +40,7 @@
      Vytvořit novou fotogalerii
      Vygenerovat obálky pro účastníky
      - Vygenerovat účastníky a vedoucí do abstraktů
      + Vygenerovat účastníky a vedoucí do abstraktů
      Seznam účastníků - HTML tabulka pro tisk, CSV, diff --git a/soustredeni/urls.py b/soustredeni/urls.py index 0daae321..3ef7edae 100644 --- a/soustredeni/urls.py +++ b/soustredeni/urls.py @@ -7,7 +7,7 @@ urlpatterns = [ path( 'probehlo/', views.SoustredeniListView.as_view(), - name='seminar_seznam_soustredeni' + name='soustredeni_probehlo' ), path( '/', @@ -37,12 +37,12 @@ urlpatterns = [ path( 'obalky.pdf', org_required(views.soustredeniObalkyView), - name='seminar_soustredeni_obalky' + name='soustredeni_obalky' ), path( 'abstrakty', org_required(views.SoustredeniAbstraktyView.as_view()), - name='seminar_soustredeni_abstrakty' + name='soustredeni_abstrakty' ), path( 'fotogalerie/', diff --git a/treenode/urls.py b/treenode/urls.py index 60dc88ad..347fd275 100644 --- a/treenode/urls.py +++ b/treenode/urls.py @@ -2,16 +2,16 @@ from django.urls import path, re_path from . import views urlpatterns = [ - #path('treenode//', views.TreeNodeView.as_view(), name='seminar_treenode'), - #path('treenode//json/', views.TreeNodeJSONView.as_view(), name='seminar_treenode_json'), - #path('treenode/text//', views.TextWebView.as_view(), name='seminar_textnode_web'), + #path('treenode//', views.TreeNodeView.as_view(), name='treenode'), + #path('treenode//json/', views.TreeNodeJSONView.as_view(), name='treenode_json'), + #path('treenode/text//', views.TextWebView.as_view(), name='treenode_textnode_web'), #path('treenode/editor/pridat////', views.TreeNodePridatView.as_view(), name='treenode_pridat'), #path('treenode/editor/smazat//', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'), #path('treenode/editor/odvesitpryc//', views.TreeNodeOdvesitPrycView.as_view(), name='treenode_odvesitpryc'), #path('treenode/editor/podvesit///', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'), #path('treenode/editor/prohodit//', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'), - #path('treenode/sirotcinec/', views.SirotcinecView.as_view(), name='seminar_treenode_sirotcinec'), - #path('problem/(?P\d+)/(?P\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'), + #path('treenode/sirotcinec/', views.SirotcinecView.as_view(), name='treenode_sirotcinec'), + #path('problem/(?P\d+)/(?P\d+)/', views.PrispevekView.as_view(), name='treenode_problem_prispevek'), re_path(r'^temp/vue/.*$',views.VueTestView.as_view(),name='vue_test_view'), path('temp/image_upload/', views.NahrajObrazekKTreeNoduView.as_view()), diff --git a/tvorba/models.py b/tvorba/models.py index d7290ae3..c26fc9f0 100644 --- a/tvorba/models.py +++ b/tvorba/models.py @@ -96,7 +96,7 @@ class Rocnik(SeminarModelBase): return self.prvni_rok + 1 def verejne_url(self): - return reverse('seminar_rocnik', kwargs={'rocnik': self.rocnik}) + return reverse('tvorba_rocnik', kwargs={'rocnik': self.rocnik}) @classmethod def cached_rocnik(cls, r_id): @@ -171,7 +171,7 @@ class Cislo(SeminarModelBase): verejne.boolean = True def verejne_url(self): - return reverse('seminar_cislo', kwargs={'rocnik': self.rocnik.rocnik, 'cislo': self.poradi}) + return reverse('tvorba_cislo', kwargs={'rocnik': self.rocnik.rocnik, 'cislo': self.poradi}) def absolute_url(self): return "https://" + str(get_current_site(None)) + self.verejne_url() @@ -508,7 +508,7 @@ class Problem(SeminarModelBase,PolymorphicModel): # verejne.boolean = True def verejne_url(self): - return reverse('seminar_problem', kwargs={'pk': self.id}) + return reverse('tvorba_problem', kwargs={'pk': self.id}) def admin_url(self): return reverse('admin:tvorba_problem_change', args=(self.id, )) diff --git a/tvorba/templates/tvorba/archiv/cislo.html b/tvorba/templates/tvorba/archiv/cislo.html index ca8f4714..f3394e6c 100644 --- a/tvorba/templates/tvorba/archiv/cislo.html +++ b/tvorba/templates/tvorba/archiv/cislo.html @@ -39,8 +39,8 @@
    • Tituly (TeX, 2. deadline předchozího čísla a 1.deadline tohoto)
    • Výsledkovka (TeX, 2. deadline předchozího čísla a 1.deadline tohoto)
    • Odměny
    • -
    • Tituly do závěrečného čísla (TeX, 2. deadline předchozího čísla a oba tohoto)
    • -
    • Výsledkovka závěrečného čísla ročníku (TeX, 2. deadline předchozího čísla a oba tohoto)
    • +
    • Tituly do závěrečného čísla (TeX, 2. deadline předchozího čísla a oba tohoto)
    • +
    • Výsledkovka závěrečného čísla ročníku (TeX, 2. deadline předchozího čísla a oba tohoto)
    {% endif %} diff --git a/tvorba/templates/tvorba/archiv/rocnik.html b/tvorba/templates/tvorba/archiv/rocnik.html index 77141998..6792fb93 100644 --- a/tvorba/templates/tvorba/archiv/rocnik.html +++ b/tvorba/templates/tvorba/archiv/rocnik.html @@ -121,7 +121,7 @@

    Výsledkovka ročníku (LaTeX, včetně neveřejných)

    Tituly (TeX, včetně neveřejných, všechny, nevhodné do mamtexu)

    {# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #} -

    CSV export řešitelů

    +

    CSV export řešitelů

    Výsledková listina včetně neveřejných bodů

    {% include "vysledkovky/vysledkovka_rocnik.html" with vysledkovka=vysledkovka_neverejna %} diff --git a/tvorba/templates/tvorba/zadani/AktualniVysledkovka.html b/tvorba/templates/tvorba/zadani/AktualniVysledkovka.html index 640600f3..9d39b03d 100644 --- a/tvorba/templates/tvorba/zadani/AktualniVysledkovka.html +++ b/tvorba/templates/tvorba/zadani/AktualniVysledkovka.html @@ -17,7 +17,7 @@

    Staré výsledkové listiny najdete - v archivu. + v archivu.

    {% if user.je_org and vysledkovka_s_neverejnymi %} diff --git a/tvorba/urls.py b/tvorba/urls.py index e662491c..950de6cc 100644 --- a/tvorba/urls.py +++ b/tvorba/urls.py @@ -7,19 +7,19 @@ urlpatterns = [ # path('/t/', views.TematkoView), # Archiv - path('archiv/rocniky/', views.ArchivView.as_view(), name="seminar_archiv_rocniky"), - path('archiv/temata/', views.ArchivTemataView.as_view(), name="seminar_archiv_temata"), + path('archiv/rocniky/', views.ArchivView.as_view(), name="tvorba_archiv_rocniky"), + path('archiv/temata/', views.ArchivTemataView.as_view(), name="tvorba_archiv_temata"), - path('rocnik//', views.RocnikView.as_view(), name='seminar_rocnik'), - path('cislo/./', views.CisloView.as_view(), name='seminar_cislo'), - path('problem//', views.problemView, name='seminar_problem'), + path('rocnik//', views.RocnikView.as_view(), name='tvorba_rocnik'), + path('cislo/./', views.CisloView.as_view(), name='tvorba_cislo'), + path('problem//', views.problemView, name='tvorba_problem'), # Zadani -# path('aktualni/zadani/', views.AktualniZadaniView.as_view(), name='seminar_aktualni_zadani'), # Dočasně ad-hoc jednoduchá věc. - path('aktualni/zadani/', views.AktualniZadaniView, name='seminar_aktualni_zadani'), - #path('aktualni/temata/', views.ZadaniTemataView, name='seminar_temata'), - path('aktualni/vysledkova-listina/', views.ZadaniAktualniVysledkovkaView, name='seminar_aktualni_vysledky'), - path('aktualni/rocnik/', views.AktualniRocnikRedirectView.as_view(), name='seminar_aktualni_rocnik'), +# path('aktualni/zadani/', views.AktualniZadaniView.as_view(), name='tvorba_aktualni_zadani'), # Dočasně ad-hoc jednoduchá věc. + path('aktualni/zadani/', views.AktualniZadaniView, name='tvorba_aktualni_zadani'), + #path('aktualni/temata/', views.ZadaniTemataView, name='tvorba_temata'), + path('aktualni/vysledkova-listina/', views.ZadaniAktualniVysledkovkaView, name='tvorba_aktualni_vysledky'), + path('aktualni/rocnik/', views.AktualniRocnikRedirectView.as_view(), name='tvorba_aktualni_rocnik'), # Clanky path('archiv/clanky/', views.ClankyResitelView.as_view(), name='clanky_resitel'), @@ -29,42 +29,42 @@ urlpatterns = [ path( 'rocnik//vysledkovka.tex', org_required(views.RocnikVysledkovkaView.as_view()), - name='seminar_rocnik_vysledkovka' + name='tvorba_rocnik_vysledkovka' ), path( 'rocnik//resitele.csv', org_required(views.resiteleRocnikuCsvExportView), - name='seminar_rocnik_resitele_csv' + name='tvorba_rocnik_resitele_csv' ), path( 'rocnik//tituly.tex', org_required(views.TitulyViewRocnik), - name='seminar_rocnik_titul' + name='tvorba_rocnik_titul' ), path( 'rocnik//posledni_vysledkovka.tex', org_required(views.PosledniCisloVysledkovkaView.as_view()), - name='seminar_rocnik_posledni_vysledkovka' + name='tvorba_rocnik_posledni_vysledkovka' ), path( 'cislo/./vysledkovka.tex', org_required(views.CisloVysledkovkaView.as_view()), - name='seminar_cislo_vysledkovka' + name='tvorba_cislo_vysledkovka' ), path( 'cislo/./obalky.pdf', org_required(views.cisloObalkyView), - name='seminar_cislo_obalky' + name='tvorba_cislo_obalky' ), path( 'cislo/./tituly.tex', org_required(views.TitulyView), - name='seminar_cislo_titul' + name='tvorba_cislo_titul' ), path( 'cislo/./odmeny/./', org_required(views.OdmenyView.as_view()), - name="seminar_archiv_odmeny"), + name="tvorba_archiv_odmeny"), # Dočasné & neodladěné: path( diff --git a/tvorba/views/__init__.py b/tvorba/views/__init__.py index e45eaaa6..2bef3591 100644 --- a/tvorba/views/__init__.py +++ b/tvorba/views/__init__.py @@ -576,7 +576,7 @@ class ClankyResitelView(generic.ListView): class AktualniRocnikRedirectView(RedirectView): permanent=False - pattern_name = 'seminar_rocnik' + pattern_name = 'tvorba_rocnik' def get_redirect_url(self, *args, **kwargs): aktualni_rocnik = Nastaveni.get_solo().aktualni_rocnik.rocnik diff --git a/various/autentizace/templates/autentizace/login.html b/various/autentizace/templates/autentizace/login.html index 2dbabcc4..76a14f9f 100644 --- a/various/autentizace/templates/autentizace/login.html +++ b/various/autentizace/templates/autentizace/login.html @@ -33,7 +33,7 @@ Ješte nejsi zaregistrován? - + diff --git a/various/log_filters.py b/various/log_filters.py index f037dcde..d6d7fc63 100644 --- a/various/log_filters.py +++ b/various/log_filters.py @@ -12,8 +12,8 @@ class StripSensitiveFormDataFilter(Filter): if hasattr(record, 'request') and record.request.path in [ reverse('login'), reverse('logout'), - reverse('seminar_prihlaska'), - reverse('seminar_resitel_edit'), + reverse('personalni_prihlaska'), + reverse('personalni_resitel_edit'), reverse('reset_password'), reverse('reset_password_done'), # FIXME diff --git a/various/templates/various/pracuje_se.html b/various/templates/various/pracuje_se.html index 1a396534..e7f707e4 100644 --- a/various/templates/various/pracuje_se.html +++ b/various/templates/various/pracuje_se.html @@ -11,7 +11,7 @@ Na této stránce velmi intenzivně pracujeme. Za dočasnou nedostupnost se omlouváme. Zkuste přejít na titulní stránku - nebo se podívat na aktuální zadání. + nebo se podívat na aktuální zadání.

    {% endblock %} diff --git a/various/views/pomocne.py b/various/views/pomocne.py index e25ed9df..61f1d630 100644 --- a/various/views/pomocne.py +++ b/various/views/pomocne.py @@ -17,7 +17,7 @@ def formularOKView(request, text='', dalsi_odkazy: Sequence[tuple[str, str]] = ( odkazy = list(dalsi_odkazy) + [ # (Text, odkaz) ('Vrátit se na titulní stránku', reverse('titulni_strana')), - ('Zobrazit aktuální zadání', reverse('seminar_aktualni_zadani')), + ('Zobrazit aktuální zadání', reverse('tvorba_aktualni_zadani')), ] context = { 'odkazy': odkazy, -- 2.39.5 From 28fef9a3938767da98b8031e3e0fde5fac2d123f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 12:58:02 +0100 Subject: [PATCH 04/22] =?UTF-8?q?Pojmenovan=C3=A9=20URL=20m=C3=ADsto=20rel?= =?UTF-8?q?ativn=C3=ADch=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tvorba/templates/tvorba/archiv/cislo.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tvorba/templates/tvorba/archiv/cislo.html b/tvorba/templates/tvorba/archiv/cislo.html index f3394e6c..b33f83de 100644 --- a/tvorba/templates/tvorba/archiv/cislo.html +++ b/tvorba/templates/tvorba/archiv/cislo.html @@ -35,10 +35,10 @@

    Orgovské odkazy

    -- 2.39.5 From eb6eb2d6fbc18bc9c22a4461cc1d58e43ebb5e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 13:17:39 +0100 Subject: [PATCH 05/22] =?UTF-8?q?P=C5=99ejmenov=C3=A1n=C3=AD=20logger?= =?UTF-8?q?=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/settings_common.py | 4 ++-- personalni/forms.py | 4 ++-- personalni/views.py | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mamweb/settings_common.py b/mamweb/settings_common.py index 743dbead..19616ac1 100644 --- a/mamweb/settings_common.py +++ b/mamweb/settings_common.py @@ -279,11 +279,11 @@ LOGGING = { 'filters': ['Http404AsInfo'], }, - 'seminar.prihlaska.form':{ + 'personalni.prihlaska.form':{ 'handlers': ['console','registration_logfile'], 'level': 'INFO' }, - 'seminar.prihlaska.problem':{ + 'personalni.prihlaska.problem':{ 'handlers': ['console','mail_registration','registration_error_log'], 'level': 'INFO' }, diff --git a/personalni/forms.py b/personalni/forms.py index 57e1b398..50b9d705 100644 --- a/personalni/forms.py +++ b/personalni/forms.py @@ -27,7 +27,7 @@ class TelInput(forms.TextInput): class UdajeForm(forms.Form): username = None - err_logger = logging.getLogger('seminar.prihlaska.problem') + err_logger = logging.getLogger('personalni.prihlaska.problem') jmeno = forms.CharField(label='Jméno', max_length=256, required=True) prezdivka_resitele = forms.CharField(label='Přezdívka (veřejná)', max_length=256, required=False) @@ -147,7 +147,7 @@ class PrihlaskaForm(PasswordResetForm, UdajeForm): class ProfileEditForm(UdajeForm): - err_logger = logging.getLogger('seminar.edit.problem') + err_logger = logging.getLogger('personalni.edit.problem') username = forms.CharField( label='Přihlašovací jméno', max_length=256, diff --git a/personalni/views.py b/personalni/views.py index 9e29d5b7..7c95325c 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -161,7 +161,7 @@ def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): @sensitive_post_parameters('jmeno', 'prijmeni', 'email', 'telefon', 'datum_narozeni', 'ulice', 'mesto', 'psc', 'skola') def resitelEditView(request): - err_logger = logging.getLogger('seminar.prihlaska.problem') + err_logger = logging.getLogger('personalni.prihlaska.problem') ## Načtení objektů Osoba a Resitel patřících k aktuálně přihlášenému uživateli u = request.user osoba_edit = m.Osoba.objects.get(user=u) @@ -199,7 +199,7 @@ def resitelEditView(request): ## Změny v osobě fcd = form.cleaned_data form_hash = hash(frozenset(fcd.items())) - form_logger = logging.getLogger('seminar.prihlaska.form') + form_logger = logging.getLogger('personalni.prihlaska.form') form_logger.info("EDIT:" + str(fcd) + str(form_hash)) # TODO možná logovat jinak osoba_edit.jmeno = fcd['jmeno'] osoba_edit.prijmeni = fcd['prijmeni'] @@ -248,9 +248,9 @@ def resitelEditView(request): @sensitive_post_parameters('jmeno', 'prijmeni', 'email', 'telefon', 'datum_narozeni', 'ulice', 'mesto', 'psc', 'skola', 'jak_se_dozvedeli') def prihlaskaView(request): - generic_logger = logging.getLogger('seminar.prihlaska') - err_logger = logging.getLogger('seminar.prihlaska.problem') - form_logger = logging.getLogger('seminar.prihlaska.form') + generic_logger = logging.getLogger('personalni.prihlaska') + err_logger = logging.getLogger('personalni.prihlaska.problem') + form_logger = logging.getLogger('personalni.prihlaska.form') if request.method == 'POST': form = PrihlaskaForm(request.POST) # TODO vyresit, co se bude v jakych situacich zobrazovat -- 2.39.5 From 9ca59672618cfea69e30ca1977739e1c0381e69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 13:20:28 +0100 Subject: [PATCH 06/22] =?UTF-8?q?P=C5=99esun=20vue=20(zat=C3=ADm)=20do=20t?= =?UTF-8?q?reenod=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- make/push_compiled_vue_to_test | 2 +- vue_frontend/vue.config.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/make/push_compiled_vue_to_test b/make/push_compiled_vue_to_test index 99495a7b..0241074c 100755 --- a/make/push_compiled_vue_to_test +++ b/make/push_compiled_vue_to_test @@ -4,7 +4,7 @@ set -exuo pipefail . make/lib.sh scp vue_frontend/webpack-stats.json "$GIMLI_LOGIN:$TESTWEB/vue_frontend/" -rsync -ave ssh seminar/static/seminar/vue "$GIMLI_LOGIN:$TESTWEB/seminar/static/seminar/" +rsync -ave ssh treenode/static/treenode/vue "$GIMLI_LOGIN:$TESTWEB/treenode/static/treenode/" ssh "$GIMLI_LOGIN" " set -euxo pipefail cd $TESTWEB diff --git a/vue_frontend/vue.config.js b/vue_frontend/vue.config.js index e4fc61ce..afe78eee 100644 --- a/vue_frontend/vue.config.js +++ b/vue_frontend/vue.config.js @@ -17,9 +17,9 @@ module.exports = { filenameHashing: false, productionSourceMap: true, publicPath: process.env.NODE_ENV === 'production' - ? '/static/seminar/vue/' + ? '/static/treenode/vue/' : 'http://localhost:8080/', - outputDir: '../seminar/static/seminar/vue/', + outputDir: '../treenode/static/treenode/vue/', chainWebpack: config => { -- 2.39.5 From 07d1505e2a62b654da3da2e9ae91ad6c405f7588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 13:50:48 +0100 Subject: [PATCH 07/22] =?UTF-8?q?Odst=C5=99el=20(import=C5=AF)=20treenod?= =?UTF-8?q?=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models/odevzdavatko.py | 2 +- treenode/admin.py | 73 +++++++++--------- treenode/forms.py | 4 +- treenode/models/__init__.py | 2 + treenode/models/pomocne.py | 1 + treenode/serializers.py | 132 +++++++++++++++++---------------- treenode/templatetags.py | 34 +++++---- treenode/tests.py | 12 +-- treenode/treelib.py | 6 +- treenode/views.py | 82 ++++++++++---------- treenode/viewsets.py | 25 ++++--- tvorba/models.py | 6 +- tvorba/testutils.py | 80 ++++++++++---------- tvorba/views/__init__.py | 8 +- various/views/final.py | 5 +- 15 files changed, 246 insertions(+), 226 deletions(-) create mode 100644 treenode/models/__init__.py create mode 100644 treenode/models/pomocne.py diff --git a/seminar/models/odevzdavatko.py b/seminar/models/odevzdavatko.py index efc88e74..6079a708 100644 --- a/seminar/models/odevzdavatko.py +++ b/seminar/models/odevzdavatko.py @@ -1,6 +1,6 @@ from django.db import models -from seminar.models import treenode as tm +from treenode import models as tm from odevzdavatko.models import Reseni class ReseniNode(tm.TreeNode): diff --git a/treenode/admin.py b/treenode/admin.py index 8ffe4fc8..6f3bfadb 100644 --- a/treenode/admin.py +++ b/treenode/admin.py @@ -4,25 +4,26 @@ from django.forms import widgets from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter -import seminar.models as m +from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode +from .models.pomocne import Text, Obrazek # Polymorfismus pro stromy # TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html -@admin.register(m.TreeNode) +@admin.register(TreeNode) class TreeNodeAdmin(PolymorphicParentModelAdmin): - base_model = m.TreeNode + base_model = TreeNode child_models = [ - m.RocnikNode, - m.CisloNode, - m.MezicisloNode, - m.TemaVCisleNode, - m.UlohaZadaniNode, - m.PohadkaNode, - m.UlohaVzorakNode, - m.TextNode, - m.CastNode, - m.OrgTextNode, + RocnikNode, + CisloNode, + MezicisloNode, + TemaVCisleNode, + UlohaZadaniNode, + PohadkaNode, + UlohaVzorakNode, + TextNode, + CastNode, + OrgTextNode, ] actions = ['aktualizuj_nazvy'] @@ -36,64 +37,64 @@ class TreeNodeAdmin(PolymorphicParentModelAdmin): self.message_user(request, "Názvy aktualizovány.") aktualizuj_nazvy.short_description = "Aktualizuj vybraným TreeNodům názvy" -@admin.register(m.RocnikNode) +@admin.register(RocnikNode) class RocnikNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.RocnikNode + base_model = RocnikNode show_in_index = True -@admin.register(m.CisloNode) +@admin.register(CisloNode) class CisloNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.CisloNode + base_model = CisloNode show_in_index = True -@admin.register(m.MezicisloNode) +@admin.register(MezicisloNode) class MezicisloNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.MezicisloNode + base_model = MezicisloNode show_in_index = True -@admin.register(m.TemaVCisleNode) +@admin.register(TemaVCisleNode) class TemaVCisleNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.TemaVCisleNode + base_model = TemaVCisleNode show_in_index = True -@admin.register(m.UlohaZadaniNode) +@admin.register(UlohaZadaniNode) class UlohaZadaniNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.UlohaZadaniNode + base_model = UlohaZadaniNode show_in_index = True -@admin.register(m.PohadkaNode) +@admin.register(PohadkaNode) class PohadkaNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.PohadkaNode + base_model = PohadkaNode show_in_index = True -@admin.register(m.UlohaVzorakNode) +@admin.register(UlohaVzorakNode) class UlohaVzorakNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.UlohaVzorakNode + base_model = UlohaVzorakNode show_in_index = True -@admin.register(m.TextNode) +@admin.register(TextNode) class TextNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.TextNode + base_model = TextNode show_in_index = True -@admin.register(m.CastNode) +@admin.register(CastNode) class TextNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.CastNode + base_model = CastNode show_in_index = True fields = ('nadpis',) -@admin.register(m.OrgTextNode) +@admin.register(OrgTextNode) class TextNodeAdmin(PolymorphicChildModelAdmin): - base_model = m.OrgTextNode + base_model = OrgTextNode show_in_index = True class TextAdminInline(admin.TabularInline): - model = m.Text + model = Text formfield_overrides = { models.TextField: {'widget': widgets.TextInput} } exclude = ['text_zkraceny_set', 'text_zkraceny'] -admin.site.register(m.Text) -admin.site.register(m.Obrazek) +admin.site.register(Text) +admin.site.register(Obrazek) diff --git a/treenode/forms.py b/treenode/forms.py index 704084f7..61243720 100644 --- a/treenode/forms.py +++ b/treenode/forms.py @@ -1,5 +1,5 @@ from django import forms -import seminar.models as m +from .models.pomocne import Obrazek # pro přidání políčka do formuláře je potřeba # - mít v modelu tu položku, kterou chci upravovat @@ -10,5 +10,5 @@ import seminar.models as m class NahrajObrazekKTreeNoduForm(forms.ModelForm): class Meta: - model = m.Obrazek + model = Obrazek fields = ('na_web',) diff --git a/treenode/models/__init__.py b/treenode/models/__init__.py new file mode 100644 index 00000000..f068a819 --- /dev/null +++ b/treenode/models/__init__.py @@ -0,0 +1,2 @@ +from seminar.models.odevzdavatko import * +from seminar.models.treenode import * diff --git a/treenode/models/pomocne.py b/treenode/models/pomocne.py new file mode 100644 index 00000000..6592da81 --- /dev/null +++ b/treenode/models/pomocne.py @@ -0,0 +1 @@ +from seminar.models.pomocne import * diff --git a/treenode/serializers.py b/treenode/serializers.py index eedb03b1..d26964d1 100644 --- a/treenode/serializers.py +++ b/treenode/serializers.py @@ -1,7 +1,11 @@ from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer -import seminar.models as m +from odevzdavatko.models import Reseni +from tvorba.models import Problem, Uloha + +from .models import RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, OrgTextNode, PohadkaNode, TextNode, TreeNode, CastNode, UlohaZadaniNode, UlohaVzorakNode, ReseniNode +from .models.pomocne import Text from treenode import treelib DEFAULT_NODE_DEPTH = 2 @@ -9,57 +13,57 @@ DEFAULT_NODE_DEPTH = 2 class TextSerializer(serializers.ModelSerializer): class Meta: - model = m.Text + model = Text fields = '__all__' class ProblemSerializer(serializers.ModelSerializer): class Meta: - model = m.Problem + model = Problem fields = '__all__' class UlohaSerializer(serializers.ModelSerializer): class Meta: - model = m.Uloha + model = Uloha fields = '__all__' class ReseniSerializer(serializers.ModelSerializer): class Meta: - model = m.Reseni + model = Reseni fields = '__all__' class RocnikNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.RocnikNode + model = RocnikNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class CisloNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.CisloNode + model = CisloNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class MezicisloNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.MezicisloNode + model = MezicisloNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class TemaVCisleNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.TemaVCisleNode + model = TemaVCisleNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class OrgTextNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.OrgTextNode + model = OrgTextNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class PohadkaNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.PohadkaNode + model = PohadkaNode fields = '__all__' depth = DEFAULT_NODE_DEPTH @@ -67,7 +71,7 @@ class TextNodeSerializer(serializers.ModelSerializer): text = TextSerializer() class Meta: - model = m.TextNode + model = TextNode fields = ('id','text','polymorphic_ctype') depth = DEFAULT_NODE_DEPTH @@ -80,7 +84,7 @@ class TextNodeWriteSerializer(serializers.ModelSerializer): return node class Meta: - model = m.TextNode + model = TextNode fields = ('id','text') depth = DEFAULT_NODE_DEPTH @@ -93,26 +97,26 @@ class TextNodeCreateSerializer(serializers.ModelSerializer): temp_text = validated_data.pop('text') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') - refnode = m.TreeNode.objects.get(pk=refnode_id) - text = m.Text.objects.create(**temp_text) + refnode = TreeNode.objects.get(pk=refnode_id) + text = Text.objects.create(**temp_text) if where == 'syn': - node = treelib.create_child(refnode,m.TextNode,text=text) + node = treelib.create_child(refnode,TextNode,text=text) elif where == 'za': - node = treelib.create_node_after(refnode,m.TextNode,text=text) + node = treelib.create_node_after(refnode,TextNode,text=text) elif where == 'pred': - node = treelib.create_node_before(refnode,m.TextNode,text=text) + node = treelib.create_node_before(refnode,TextNode,text=text) node.where = None node.refnode = None return node class Meta: - model = m.TextNode + model = TextNode fields = ('text','where','refnode') depth = DEFAULT_NODE_DEPTH class CastNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.CastNode + model = CastNode fields = '__all__' depth = DEFAULT_NODE_DEPTH @@ -124,25 +128,25 @@ class CastNodeCreateSerializer(serializers.ModelSerializer): temp_nadpis = validated_data.pop('nadpis') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') - refnode = m.TreeNode.objects.get(pk=refnode_id) + refnode = TreeNode.objects.get(pk=refnode_id) if where == 'syn': - node = treelib.create_child(refnode,m.CastNode,nadpis=temp_nadpis) + node = treelib.create_child(refnode,CastNode,nadpis=temp_nadpis) elif where == 'za': - node = treelib.create_node_after(refnode,m.CastNode,nadpis=temp_nadpis) + node = treelib.create_node_after(refnode,CastNode,nadpis=temp_nadpis) elif where == 'pred': - node = treelib.create_node_before(refnode,m.CastNode,nadpis=temp_nadpis) + node = treelib.create_node_before(refnode,CastNode,nadpis=temp_nadpis) node.where = None node.refnode = None return node class Meta: - model = m.CastNode + model = CastNode fields = ('nadpis','where','refnode') depth = DEFAULT_NODE_DEPTH class UlohaZadaniNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.UlohaZadaniNode + model = UlohaZadaniNode fields = '__all__' depth = DEFAULT_NODE_DEPTH @@ -157,7 +161,7 @@ class UlohaZadaniNodeWriteSerializer(serializers.ModelSerializer): return node class Meta: - model = m.TextNode + model = TextNode fields = ('id','uloha') depth = DEFAULT_NODE_DEPTH @@ -171,28 +175,28 @@ class UlohaZadaniNodeCreateSerializer(serializers.ModelSerializer): temp_uloha = validated_data.pop('uloha') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') - refnode = m.TreeNode.objects.get(pk=refnode_id) + refnode = TreeNode.objects.get(pk=refnode_id) # Z cesty ke koreni stromu zjistime, v jakem jsme tematu a v jakem cisle cislo = None tema = None travelnode = refnode while travelnode is not None: - if isinstance(travelnode, m.TemaVCisleNode): + if isinstance(travelnode, TemaVCisleNode): tema = travelnode.tema - if isinstance(travelnode, m.CisloNode): + if isinstance(travelnode, CisloNode): cislo = travelnode.cislo travelnode = treelib.get_parent(travelnode) # Vyrobime ulohu - uloha = m.Uloha.objects.create(cislo_zadani=cislo, nadproblem = tema, **temp_uloha) + uloha = Uloha.objects.create(cislo_zadani=cislo, nadproblem = tema, **temp_uloha) # A vyrobime UlohaZadaniNode if where == 'syn': - node = treelib.create_child(refnode,m.UlohaZadaniNode,uloha = uloha) + node = treelib.create_child(refnode,UlohaZadaniNode,uloha = uloha) elif where == 'za': - node = treelib.create_node_after(refnode,m.UlohaZadaniNode,uloha = uloha) + node = treelib.create_node_after(refnode,UlohaZadaniNode,uloha = uloha) elif where == 'pred': - node = treelib.create_node_before(refnode,m.UlohaZadaniNode,uloha = uloha) + node = treelib.create_node_before(refnode,UlohaZadaniNode,uloha = uloha) node.where = None node.refnode = None node.max_body = None @@ -200,21 +204,21 @@ class UlohaZadaniNodeCreateSerializer(serializers.ModelSerializer): return node class Meta: - model = m.UlohaZadaniNode + model = UlohaZadaniNode fields = ('uloha','where','refnode') depth = DEFAULT_NODE_DEPTH class UlohaVzorakNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.UlohaVzorakNode + model = UlohaVzorakNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class UlohaVzorakNodeWriteSerializer(serializers.ModelSerializer): - uloha = serializers.PrimaryKeyRelatedField(queryset=m.Uloha.objects.all(), many=False, read_only=False) + uloha = serializers.PrimaryKeyRelatedField(queryset=Uloha.objects.all(), many=False, read_only=False) class Meta: - model = m.UlohaVzorakNode + model = UlohaVzorakNode fields = ('id','uloha') depth = DEFAULT_NODE_DEPTH @@ -226,17 +230,17 @@ class UlohaVzorakNodeCreateSerializer(serializers.ModelSerializer): def create(self, validated_data): uloha_id = validated_data.pop('uloha_id') - uloha = m.Uloha.objects.get(pk=uloha_id) + uloha = Uloha.objects.get(pk=uloha_id) where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') - refnode = m.TreeNode.objects.get(pk=refnode_id) + refnode = TreeNode.objects.get(pk=refnode_id) if where == 'syn': - node = treelib.create_child(refnode,m.UlohaVzorakNode,uloha = uloha) + node = treelib.create_child(refnode,UlohaVzorakNode,uloha = uloha) elif where == 'za': - node = treelib.create_node_after(refnode,m.UlohaVzorakNode,uloha = uloha) + node = treelib.create_node_after(refnode,UlohaVzorakNode,uloha = uloha) elif where == 'pred': - node = treelib.create_node_before(refnode,m.UlohaVzorakNode,uloha = uloha) + node = treelib.create_node_before(refnode,UlohaVzorakNode,uloha = uloha) node.refnode = None node.where = None node.uloha_id = None @@ -244,7 +248,7 @@ class UlohaVzorakNodeCreateSerializer(serializers.ModelSerializer): return node class Meta: - model = m.UlohaVzorakNode + model = UlohaVzorakNode fields = ('refnode', 'uloha_id', 'where') depth = DEFAULT_NODE_DEPTH @@ -253,15 +257,15 @@ class UlohaVzorakNodeCreateSerializer(serializers.ModelSerializer): class ReseniNodeSerializer(serializers.ModelSerializer): class Meta: - model = m.ReseniNode + model = ReseniNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class ReseniNodeWriteSerializer(serializers.ModelSerializer): - reseni = serializers.PrimaryKeyRelatedField(queryset=m.Reseni.objects.all(), many=False, read_only=False) + reseni = serializers.PrimaryKeyRelatedField(queryset=Reseni.objects.all(), many=False, read_only=False) class Meta: - model = m.ReseniNode + model = ReseniNode fields = ('id','reseni') depth = DEFAULT_NODE_DEPTH @@ -273,41 +277,41 @@ class ReseniNodeCreateSerializer(serializers.ModelSerializer): def create(self,validated_data): # text_zadani = validated_data.pop('text_zadani') reseni_id = validated_data.pop('reseni_id') - reseni = m.Reseni.objects.get(pk=reseni_id) + reseni = Reseni.objects.get(pk=reseni_id) where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') - refnode = m.TreeNode.objects.get(pk=refnode_id) + refnode = TreeNode.objects.get(pk=refnode_id) # A vyrobime UlohaZadaniNode if where == 'syn': - node = treelib.create_child(refnode,m.ReseniNode,reseni = reseni) + node = treelib.create_child(refnode,ReseniNode,reseni = reseni) elif where == 'za': - node = treelib.create_node_after(refnode,m.ReseniNode,reseni = reseni) + node = treelib.create_node_after(refnode,ReseniNode,reseni = reseni) elif where == 'pred': - node = treelib.create_node_before(refnode,m.ReseniNode,reseni = reseni) + node = treelib.create_node_before(refnode,ReseniNode,reseni = reseni) node.where = None node.refnode = None node.reseni_id = None return node class Meta: - model = m.ReseniNode + model = ReseniNode fields = ('reseni_id','where','refnode') depth = DEFAULT_NODE_DEPTH class TreeNodeSerializer(PolymorphicSerializer): model_serializer_mapping = { - m.RocnikNode: RocnikNodeSerializer, - m.CisloNode: CisloNodeSerializer, - m.MezicisloNode: MezicisloNodeSerializer, - m.TemaVCisleNode: TemaVCisleNodeSerializer, - m.OrgTextNode: OrgTextNodeSerializer, - m.UlohaZadaniNode: UlohaZadaniNodeSerializer, - m.UlohaVzorakNode: UlohaVzorakNodeSerializer, - m.PohadkaNode: PohadkaNodeSerializer, - m.TextNode: TextNodeSerializer, - m.CastNode: CastNodeSerializer, - m.ReseniNode: ReseniNodeSerializer, + RocnikNode: RocnikNodeSerializer, + CisloNode: CisloNodeSerializer, + MezicisloNode: MezicisloNodeSerializer, + TemaVCisleNode: TemaVCisleNodeSerializer, + OrgTextNode: OrgTextNodeSerializer, + UlohaZadaniNode: UlohaZadaniNodeSerializer, + UlohaVzorakNode: UlohaVzorakNodeSerializer, + PohadkaNode: PohadkaNodeSerializer, + TextNode: TextNodeSerializer, + CastNode: CastNodeSerializer, + ReseniNode: ReseniNodeSerializer, } diff --git a/treenode/templatetags.py b/treenode/templatetags.py index e5efe701..701965c5 100644 --- a/treenode/templatetags.py +++ b/treenode/templatetags.py @@ -1,6 +1,6 @@ from django import template from enum import Enum -import seminar.models as m +from .models import RocnikNode, CisloNode, CastNode, TextNode, TemaVCisleNode, UlohaVzorakNode, UlohaZadaniNode, PohadkaNode register = template.Library() @@ -11,8 +11,8 @@ def nodeType(value): if isinstance(value,CastNode): return "Část" if isinstance(value,TextNode): return "Text" if isinstance(value,TemaVCisleNode): return "Téma v čísle" - if isinstance(value,KonferaNode): return "Konfera" - if isinstance(value,ClanekNode): return "Článek" + # if isinstance(value,KonferaNode): return "Konfera" # FIXME neexistuje + # if isinstance(value,ClanekNode): return "Článek" # FIXME neexistuje if isinstance(value,UlohaVzorakNode): return "Vzorák" if isinstance(value,UlohaZadaniNode): return "Zadání úlohy" if isinstance(value,PohadkaNode): return "Pohádka" @@ -22,53 +22,57 @@ def nodeType(value): @register.filter def isRocnik(value): - return isinstance(value, m.RocnikNode) + return isinstance(value, RocnikNode) @register.filter def isCislo(value): - return isinstance(value, m.CisloNode) + return isinstance(value, CisloNode) @register.filter def isCast(value): - return isinstance(value, m.CastNode) + return isinstance(value, CastNode) @register.filter def isText(value): - return isinstance(value, m.TextNode) + return isinstance(value, TextNode) @register.filter def isTemaVCisle(value): - return isinstance(value, m.TemaVCisleNode) + return isinstance(value, TemaVCisleNode) @register.filter def isKonfera(value): - return isinstance(value, m.KonferaNode) + # FIXME neexistuje + # return isinstance(value, KonferaNode) + return False @register.filter def isClanek(value): - return isinstance(value, m.ClanekNode) + # FIXME neexistuje + # return isinstance(value, seminar.models.ClanekNode) + return False @register.filter def isUlohaVzorak(value): - return isinstance(value, m.UlohaVzorakNode) + return isinstance(value, UlohaVzorakNode) @register.filter def isUlohaZadani(value): - return isinstance(value, m.UlohaZadaniNode) + return isinstance(value, UlohaZadaniNode) @register.filter def isPohadka(value): - return isinstance(value, m.PohadkaNode) + return isinstance(value, PohadkaNode) @register.filter def isReseni(value): return False -# return isinstance(value, m.OtisteneReseniNode) +# return isinstance(value, OtisteneReseniNode) @register.filter def isOrgText(value): return False -# return isinstance(value, m.OrgTextNode) +# return isinstance(value, OrgTextNode) ### diff --git a/treenode/tests.py b/treenode/tests.py index 32a77196..e9617b4b 100644 --- a/treenode/tests.py +++ b/treenode/tests.py @@ -1,16 +1,16 @@ from django.test import TestCase import treenode.treelib as tl -import seminar.models as m +from .models import CastNode class SimpleTreeLibTests(TestCase): def setUp(self): # Vyrobíme pár nějakých Nodů - self.root = m.CastNode(root=None, first_child=None, succ=None, nadpis="Root") + self.root = CastNode(root=None, first_child=None, succ=None, nadpis="Root") self.root.save() - self.some_node = m.CastNode(root=self.root, first_child=None, succ=None, nadpis="Přetržené") - self.other_node = m.CastNode(root=self.root, first_child=None, succ=None, nadpis="Dítě") - self.some_orphan = m.CastNode(root=None, first_child=None, succ=None, nadpis="Ošklivé") - self.other_orphan = m.CastNode(root=None, first_child=None, succ=None, nadpis="Káčátko") + self.some_node = CastNode(root=self.root, first_child=None, succ=None, nadpis="Přetržené") + self.other_node = CastNode(root=self.root, first_child=None, succ=None, nadpis="Dítě") + self.some_orphan = CastNode(root=None, first_child=None, succ=None, nadpis="Ošklivé") + self.other_orphan = CastNode(root=None, first_child=None, succ=None, nadpis="Káčátko") # Trochu je pospojujeme self.root.first_child = self.some_node diff --git a/treenode/treelib.py b/treenode/treelib.py index 1835bf1c..5b05a86e 100644 --- a/treenode/treelib.py +++ b/treenode/treelib.py @@ -238,7 +238,7 @@ class TreeLibError(RuntimeError): # Editace stromu: def create_node_after(predecessor, type, **kwargs): - from seminar.models import TreeNode + from .models import TreeNode if predecessor is None: raise TreeLibError("Nelze vyrábět sirotky! (predecessor=None)") if not issubclass(type, TreeNode): @@ -255,7 +255,7 @@ def create_node_after(predecessor, type, **kwargs): # Vyrábí prvního syna, ostatní nalepí za (existují-li) def create_child(parent, type, **kwargs): - from seminar.models import TreeNode + from .models import TreeNode if parent is None: raise TreeLibError("Nelze vyrábět sirotky! (parent=None)") if not issubclass(type, TreeNode): @@ -293,7 +293,7 @@ def insert_last_child(parent, node): last.save() def create_node_before(successor, type, **kwargs): - from seminar.models import TreeNode + from .models import TreeNode if successor is None: raise TreeLibError("Nelze vyrábět sirotky! (successor=None)") if not issubclass(type, TreeNode): diff --git a/treenode/views.py b/treenode/views.py index 2c300263..ee8cd897 100644 --- a/treenode/views.py +++ b/treenode/views.py @@ -6,8 +6,8 @@ from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import PermissionDenied -import seminar.models as s -import seminar.models as m +from .models import TemaVCisleNode, RocnikNode, CisloNode, UlohaVzorakNode, UlohaZadaniNode, TreeNode, CastNode, TextNode, ReseniNode, PohadkaNode, OrgTextNode +from .models.pomocne import Text, Obrazek from treenode import treelib import treenode.forms as f import treenode.templatetags as tnltt @@ -29,7 +29,7 @@ class TNLData(object): if parent: self.tema_in_path = parent.tema_in_path - if isinstance(anode, m.TemaVCisleNode): + if isinstance(anode, TemaVCisleNode): self.tema_in_path = True def add_edit_options(self): @@ -51,11 +51,11 @@ class TNLData(object): (All of them have method verejne.)""" parent = anode # chceme začít už od konkrétního node včetně while True: - rocnik = isinstance(parent, s.RocnikNode) - cislo = isinstance(parent, s.CisloNode) - uloha = (isinstance(parent, s.UlohaVzorakNode) or - isinstance(parent, s.UlohaZadaniNode)) - tema = isinstance(parent, s.TemaVCisleNode) + rocnik = isinstance(parent, RocnikNode) + cislo = isinstance(parent, CisloNode) + uloha = (isinstance(parent, UlohaVzorakNode) or + isinstance(parent, UlohaZadaniNode)) + tema = isinstance(parent, TemaVCisleNode) if (rocnik or cislo or uloha or tema) or parent==None: break @@ -158,7 +158,7 @@ class TNLData(object): class TreeNodeView(generic.DetailView): - model = s.TreeNode + model = TreeNode template_name = 'treenode/treenode.html' def get_context_data(self,**kwargs): @@ -168,7 +168,7 @@ class TreeNodeView(generic.DetailView): class TreeNodeJSONView(generic.DetailView): - model = s.TreeNode + model = TreeNode def get(self,request,*args, **kwargs): self.object = self.get_object() @@ -178,21 +178,21 @@ class TreeNodeJSONView(generic.DetailView): class TreeNodePridatView(generic.View): type_from_str = { - 'rocnikNode': m.RocnikNode, - 'cisloNode': m.CisloNode, - 'castNode': m.CastNode, - 'textNode': m.TextNode, - 'temaVCisleNode': m.TemaVCisleNode, - 'reseniNode': m.ReseniNode, - 'ulohaZadaniNode': m.UlohaZadaniNode, - 'ulohaVzorakNode': m.UlohaVzorakNode, - 'pohadkaNode': m.PohadkaNode, - 'orgText': m.OrgTextNode, + 'rocnikNode': RocnikNode, + 'cisloNode': CisloNode, + 'castNode': CastNode, + 'textNode': TextNode, + 'temaVCisleNode': TemaVCisleNode, + 'reseniNode': ReseniNode, + 'ulohaZadaniNode': UlohaZadaniNode, + 'ulohaVzorakNode': UlohaVzorakNode, + 'pohadkaNode': PohadkaNode, + 'orgText': OrgTextNode, } def post(self, request, *args, **kwargs): ######## FIXME: ROZEPSANE, NEFUNGUJE, DOPSAT !!!!!! ########### - node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + node = TreeNode.objects.get(pk=self.kwargs['pk']) kam = self.kwargs['kam'] co = self.kwargs['co'] typ = self.type_from_str[co] @@ -202,19 +202,19 @@ class TreeNodePridatView(generic.View): if kam not in ('pred','syn','za'): raise ValidationError('Přidat lze pouze před nebo za node nebo jako syna') - if co == m.TextNode: - new_obj = m.Text() + if co == TextNode: + new_obj = Text() new_obj.save() - elif co == m.CastNode: - new_obj = m.CastNode() + elif co == CastNode: + new_obj = CastNode() new_obj.nadpis = request.POST.get('pridat-castNode-{}-{}'.format(node.id,kam)) new_obj.save() - elif co == m.ReseniNode: + elif co == ReseniNode: new_obj = m pass - elif co == m.UlohaZadaniNode: + elif co == UlohaZadaniNode: pass - elif co == m.UlohaReseniNode: + elif co == UlohaReseniNode: pass else: new_obj = None @@ -225,15 +225,15 @@ class TreeNodePridatView(generic.View): if kam == 'syn': - if typ == m.TextNode: - text_obj = m.Text() + if typ == TextNode: + text_obj = Text() text_obj.save() node = treelib.create_child(node, typ, text=text_obj) else: node = treelib.create_child(node, typ) if kam == 'za': - if typ == m.TextNode: - text_obj = m.Text() + if typ == TextNode: + text_obj = Text() text_obj.save() node = treelib.create_node_after(node, typ, text=text_obj) else: @@ -244,7 +244,7 @@ class TreeNodePridatView(generic.View): class TreeNodeSmazatView(generic.base.View): def post(self, request, *args, **kwargs): - node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + node = TreeNode.objects.get(pk=self.kwargs['pk']) if node.first_child: raise NotImplementedError('Mazání TreeNode se syny není zatím podporováno!') treelib.disconnect_node(node) @@ -254,7 +254,7 @@ class TreeNodeSmazatView(generic.base.View): class TreeNodeOdvesitPrycView(generic.base.View): def post(self, request, *args, **kwargs): - node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + node = TreeNode.objects.get(pk=self.kwargs['pk']) treelib.disconnect_node(node) node.root = None node.save() @@ -263,7 +263,7 @@ class TreeNodeOdvesitPrycView(generic.base.View): class TreeNodePodvesitView(generic.base.View): def post(self, request, *args, **kwargs): - node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + node = TreeNode.objects.get(pk=self.kwargs['pk']) kam = self.kwargs['kam'] if kam == 'pred': treelib.lower_node(node) @@ -274,21 +274,21 @@ class TreeNodePodvesitView(generic.base.View): class TreeNodeProhoditView(generic.base.View): def post(self, request, *args, **kwargs): - node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + node = TreeNode.objects.get(pk=self.kwargs['pk']) treelib.swap_succ(node) return redirect(request.headers.get('referer')) #FIXME ve formulari predat puvodni url a vratit redirect na ni class SirotcinecView(generic.ListView): - model = s.TreeNode + model = TreeNode template_name = 'treenode/orphanage.html' def get_queryset(self): - return s.TreeNode.objects.not_instance_of(s.RocnikNode).filter(root=None,prev=None,succ=None,father_of_first=None) + return TreeNode.objects.not_instance_of(RocnikNode).filter(root=None,prev=None,succ=None,father_of_first=None) # FIXME pouzit Django REST Framework class TextWebView(generic.DetailView): - model = s.Text + model = Text def get(self,request,*args, **kwargs): self.object = self.get_object() @@ -300,7 +300,7 @@ class VueTestView(generic.TemplateView): class NahrajObrazekKTreeNoduView(LoginRequiredMixin, CreateView): - model = s.Obrazek + model = Obrazek form_class = f.NahrajObrazekKTreeNoduForm def get_initial(self): @@ -316,7 +316,7 @@ class NahrajObrazekKTreeNoduView(LoginRequiredMixin, CreateView): print(form) self.object = form.save(commit=False) print(self.object.na_web) - self.object.text = m.Text.objects.get(pk=int(self.request.headers['Textid'])) + self.object.text = Text.objects.get(pk=int(self.request.headers['Textid'])) self.object.save() return JsonResponse({"url":self.object.na_web.url}) diff --git a/treenode/viewsets.py b/treenode/viewsets.py index 16dce6d6..5280b5e4 100644 --- a/treenode/viewsets.py +++ b/treenode/viewsets.py @@ -3,7 +3,12 @@ from rest_framework import status from rest_framework.response import Response from django.core.exceptions import PermissionDenied from rest_framework.permissions import BasePermission, AllowAny -from seminar import models as m + +from odevzdavatko.models import Reseni +from tvorba.models import Problem, Uloha + +from .models import TextNode, CastNode, UlohaVzorakNode, UlohaZadaniNode, ReseniNode +from .models.pomocne import Text import treenode.serializers as views from treenode.permissions import AllowWrite @@ -66,17 +71,17 @@ class ReadWriteSerializerMixin(object): return self.create_serializer_class class TextViewSet(PermissionMixin, viewsets.ModelViewSet): - queryset = m.Text.objects.all() + queryset = Text.objects.all() serializer_class = views.TextSerializer class TextNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet): - queryset = m.TextNode.objects.all() + queryset = TextNode.objects.all() read_serializer_class = views.TextNodeSerializer write_serializer_class = views.TextNodeWriteSerializer create_serializer_class = views.TextNodeCreateSerializer class CastNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet): - queryset = m.CastNode.objects.all() + queryset = CastNode.objects.all() read_serializer_class = views.CastNodeSerializer write_serializer_class = views.CastNodeSerializer create_serializer_class = views.CastNodeCreateSerializer @@ -95,7 +100,7 @@ class UlohaVzorakNodeViewSet(PermissionMixin, ReadWriteSerializerMixin, viewsets create_serializer_class = views.UlohaVzorakNodeCreateSerializer def get_queryset(self): - queryset = m.UlohaVzorakNode.objects.all() + queryset = UlohaVzorakNode.objects.all() nazev = self.request.query_params.get('nazev',None) if nazev is not None: queryset = queryset.filter(nazev__contains=nazev) @@ -114,7 +119,7 @@ class ReseniViewSet(viewsets.ModelViewSet): serializer_class = views.ReseniSerializer def get_queryset(self): - queryset = m.Reseni.objects.all() + queryset = Reseni.objects.all() #FIXME upravit nazvy dle skutecnych polozek reseni nazev = self.request.query_params.get('nazev',None) if nazev is not None: @@ -128,7 +133,7 @@ class UlohaViewSet(viewsets.ModelViewSet): serializer_class = views.UlohaSerializer def get_queryset(self): - queryset = m.Uloha.objects.all() + queryset = Uloha.objects.all() nazev = self.request.query_params.get('nazev',None) if nazev is not None: queryset = queryset.filter(nazev__contains=nazev) @@ -138,13 +143,13 @@ class UlohaViewSet(viewsets.ModelViewSet): return queryset class UlohaZadaniNodeViewSet(ReadWriteSerializerMixin, viewsets.ModelViewSet): - queryset = m.UlohaZadaniNode.objects.all() + queryset = UlohaZadaniNode.objects.all() read_serializer_class = views.UlohaZadaniNodeSerializer write_serializer_class = views.UlohaZadaniNodeWriteSerializer create_serializer_class = views.UlohaZadaniNodeCreateSerializer class ReseniNodeViewSet(ReadWriteSerializerMixin, viewsets.ModelViewSet): - queryset = m.ReseniNode.objects.all() + queryset = ReseniNode.objects.all() read_serializer_class = views.ReseniNodeSerializer write_serializer_class = views.ReseniNodeWriteSerializer create_serializer_class = views.ReseniNodeCreateSerializer @@ -155,7 +160,7 @@ class ProblemViewSet(viewsets.ModelViewSet): serializer_class = views.ProblemSerializer def get_queryset(self): - queryset = m.Problem.objects.all() + queryset = Problem.objects.all() ucel = self.request.query_params.get('ucel',None) rocnik = self.request.query_params.get('rocnik',None) tema = self.request.query_params.get('tema',None) diff --git a/tvorba/models.py b/tvorba/models.py index c26fc9f0..c00d0935 100644 --- a/tvorba/models.py +++ b/tvorba/models.py @@ -297,7 +297,7 @@ class Cislo(SeminarModelBase): except ObjectDoesNotExist: # Neexistující *Node nemá smysl aktualizovat, ale je potřeba ho naopak vyrobit logger.warning(f'Číslo {self} nemělo ČísloNode, vyrábím…') - from seminar.models.treenode import CisloNode + from treenode.models import CisloNode CisloNode.objects.create(cislo=self) def zlomovy_deadline_pro_papirove_cislo(self): @@ -572,7 +572,7 @@ class Tema(Problem): def cislo_node(self): tema_node_set = self.temavcislenode_set.all() tema_cisla_vyskyt = [] - from seminar.models.treenode import CisloNode + from treenode.models import CisloNode for tn in tema_node_set: tema_cisla_vyskyt.append( treelib.get_upper_node_of_type(tn, CisloNode).cislo) @@ -648,7 +648,7 @@ class Uloha(Problem): def cislo_node(self): zadani_node = self.ulohazadaninode - from seminar.models.treenode import CisloNode + from treenode.models import CisloNode return treelib.get_upper_node_of_type(zadani_node, CisloNode) diff --git a/tvorba/testutils.py b/tvorba/testutils.py index 323acb38..4bbed8e4 100644 --- a/tvorba/testutils.py +++ b/tvorba/testutils.py @@ -6,10 +6,12 @@ import lorem import django.contrib.auth import logging -from .models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha +from .models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha, Clanek from odevzdavatko.models import Reseni, Hodnoceni -import seminar.models as m +# TODO zbavit se treenodů do treenode.testutils (ty pak klidně volat odtud) +from treenode.models import TextNode, UlohaZadaniNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, CastNode, MezicisloNode, ReseniNode +from treenode.models.pomocne import Text from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after @@ -56,12 +58,12 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi rnd.choice(jmeno), rnd.choice(kde)] ) - text_zadani = m.Text.objects.create( + text_zadani = Text.objects.create( na_web = text, do_cisla = text, ) - zad = m.TextNode.objects.create(text = text_zadani, root = p.cislo_zadani.rocnik.rocniknode) - uloha_zadani = m.UlohaZadaniNode.objects.create(uloha = p, first_child = zad, root = p.cislo_zadani.rocnik.rocniknode) + zad = TextNode.objects.create(text = text_zadani, root = p.cislo_zadani.rocnik.rocniknode) + uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad, root = p.cislo_zadani.rocnik.rocniknode) p.ulohazadaninode = uloha_zadani otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani) @@ -78,12 +80,12 @@ def gen_vzoroveho_reseni_ulohy(rnd, organizatori, uloha, pocet_opravovatelu): # Generování vzorového řešení. obsah = rnd.choice(reseni) - text_vzoraku = m.Text.objects.create( + text_vzoraku = Text.objects.create( na_web = obsah, do_cisla = obsah ) - vzorak = m.TextNode.objects.create(text = text_vzoraku, root = uloha.cislo_zadani.rocnik.rocniknode) - uloha_vzorak = m.UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak, root = uloha.cislo_zadani.rocnik.rocniknode) + vzorak = TextNode.objects.create(text = text_vzoraku, root = uloha.cislo_zadani.rocnik.rocniknode) + uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak, root = uloha.cislo_zadani.rocnik.rocniknode) uloha.ulohavzoraknode = uloha_vzorak uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) @@ -134,7 +136,7 @@ def gen_rocniky(last_rocnik, size): node = None for ri in range(min(last_rocnik - size, 1), last_rocnik + 1): rocnik = Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) - node2 = m.RocnikNode.objects.create(rocnik = rocnik, succ = node) + node2 = RocnikNode.objects.create(rocnik = rocnik, succ = node) rocnik.save() node = node2 rocniky.append(rocnik) @@ -169,7 +171,7 @@ def gen_cisla(rnd, rocniky): datum_vydani=vydano, verejne_db=True, ) - node2 = m.CisloNode.objects.get(cislo = cislo) + node2 = CisloNode.objects.get(cislo = cislo) node2.succ = node node2.root = rocnik.rocniknode cislo.save() @@ -197,7 +199,7 @@ def add_first_child(node, child): def get_text(): odstavec = lorem.paragraph() - return m.Text.objects.create(na_web = odstavec, do_cisla = odstavec) + return Text.objects.create(na_web = odstavec, do_cisla = odstavec) def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): tema = Tema.objects.create( @@ -217,54 +219,54 @@ def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): for cislo in cisla: # Přidáme TemaVCisleNode do daného čísla cislo_node = cislo.cislonode - tema_cislo_node = m.TemaVCisleNode.objects.create(tema = tema, root = cislo_node.root) + tema_cislo_node = TemaVCisleNode.objects.create(tema = tema, root = cislo_node.root) insert_last_child(cislo_node, tema_cislo_node) # Přidávání obsahu do čísla - cast_node = m.CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod), root=cislo_node.root) + cast_node = CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod), root=cislo_node.root) add_first_child(tema_cislo_node, cast_node) - text_node = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node = TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node, text_node) - cast_node2 = m.CastNode.objects.create(nadpis = "První podproblém", root=cislo_node.root) + cast_node2 = CastNode.objects.create(nadpis = "První podproblém", root=cislo_node.root) add_first_child(text_node, cast_node2) - text_node2 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node2 = TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node2, text_node2) - cast_node3 = m.CastNode.objects.create(nadpis = "Druhý podproblém", root=cislo_node.root) + cast_node3 = CastNode.objects.create(nadpis = "Druhý podproblém", root=cislo_node.root) add_first_child(text_node2, cast_node3) - text_node3 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node3 = TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3, text_node3) - cast_node4 = m.CastNode.objects.create(nadpis = "Třetí podproblém", root=cislo_node.root) + cast_node4 = CastNode.objects.create(nadpis = "Třetí podproblém", root=cislo_node.root) add_first_child(text_node3, cast_node4) - text_node4 = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node4 = TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3, text_node4) - cast_node3a = m.CastNode.objects.create(nadpis = "Podproblém paralelní s " + cast_node3a = CastNode.objects.create(nadpis = "Podproblém paralelní s " "druhým podproblémem", root=cislo_node.root) cast_node3.succ = cast_node3a cast_node3.save() - text_node3a = m.TextNode.objects.create(text = get_text(), root=cislo_node.root) + text_node3a = TextNode.objects.create(text = get_text(), root=cislo_node.root) add_first_child(cast_node3a, text_node3a) # Občas přidáme mezičíslo if rnd.randint(1, 3) == 1: - create_node_after(cislo_node, m.MezicisloNode, root=cislo_node.root) + create_node_after(cislo_node, MezicisloNode, root=cislo_node.root) mezicislo_node = cislo_node.succ - cast_node_mezicislo = m.CastNode.objects.create( + cast_node_mezicislo = CastNode.objects.create( nadpis = "Příspěvek k mezičíslu".format(cislo.kod), root=cislo_node.root) add_first_child(mezicislo_node, cast_node_mezicislo) odstavec = lorem.paragraph() - text_mezicislo = m.Text.objects.create(na_web = odstavec, do_cisla = odstavec) - text_node_mezicislo = m.TextNode.objects.create(text = text_mezicislo, root=cislo_node.root) + text_mezicislo = Text.objects.create(na_web = odstavec, do_cisla = odstavec) + text_node_mezicislo = TextNode.objects.create(text = text_mezicislo, root=cislo_node.root) add_first_child(cast_node_mezicislo, text_node_mezicislo) return tema @@ -308,7 +310,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): # Vyrobíme TemaVCisleNody pro obsah for i in range(zacatek_tematu, konec_tematu+1): - node = m.TemaVCisleNode.objects.create(tema = t,root=rocnik.rocniknode) + node = TemaVCisleNode.objects.create(tema = t,root=rocnik.rocniknode) # FIXME: Není to off-by-one? otec = cisla[i-1].cislonode otec_syn(otec, node) @@ -361,12 +363,12 @@ def gen_ulohy_tematu(rnd, organizatori, resitele, tema, kod, cislo, cislo_se_vzo rnd.choice(jmeno), rnd.choice(kde)] ) - text_zadani = m.Text.objects.create( + text_zadani = Text.objects.create( na_web = obsah, do_cisla = obsah, ) - zad = m.TextNode.objects.create(text = text_zadani, root=tema.temavcislenode_set.first().root) - uloha_zadani = m.UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad, root=tema.temavcislenode_set.first().root) + zad = TextNode.objects.create(text = text_zadani, root=tema.temavcislenode_set.first().root) + uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad, root=tema.temavcislenode_set.first().root) uloha.ulohazadaninode = uloha_zadani # Generování řešení a hodnocení k úloze @@ -398,7 +400,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, else: cislo_se_vzorakem = cislo_se_vzorakem.first() - for tema_node in all_children_of_type(cislo.cislonode, m.TemaVCisleNode): + for tema_node in all_children_of_type(cislo.cislonode, TemaVCisleNode): tema = tema_node.tema # Pokud už témátko skončilo, žádné úložky negenerujeme @@ -421,7 +423,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, # Najdeme správný TemaVCisleNode pro vložení vzoráku res_tema_node = None; for node in all_children(cislo_se_vzorakem.cislonode): - if isinstance(node, m.TemaVCisleNode): + if isinstance(node, TemaVCisleNode): if node.tema == tema: res_tema_node = node if res_tema_node is None: @@ -440,7 +442,7 @@ def otec_syn(otec, syn): def gen_clanek(rnd, organizatori, resitele): logger.info("Generuji článek do čísla 22.2") - clanek = m.Clanek.objects.create( + clanek = Clanek.objects.create( nazev="Článek o Lorem ipsum", nadproblem=None, stav='vyreseny', @@ -467,7 +469,7 @@ def gen_clanek(rnd, organizatori, resitele): ) hodnoceni.save() - reseninode = m.ReseniNode.objects.create( + reseninode = ReseniNode.objects.create( reseni=reseni ) reseninode.save() @@ -483,26 +485,26 @@ def gen_clanek(rnd, organizatori, resitele): # FIXME: Ten, kdo vymyslel TreeLib (mj. týž, kdo psal tenhle kód), # nevyrobil vhodnou funkci, takže to postavíme pozpátku pomocí create_child # (které vyrábí _prvního_ syna) - create_child(reseninode, m.CastNode, nadpis="Lorem ipsum") + create_child(reseninode, CastNode, nadpis="Lorem ipsum") # Taky ten člověk nevyrobil vracení nových věcí... castnode = reseninode.first_child # Úvodní odstaveček obsah = "Tohle je zamyšlení o textu lorem ipsum. Začneme a skončíme ukázkou." - text = m.Text.objects.create( + text = Text.objects.create( na_web=obsah, do_cisla=obsah, ) text.save() - create_child(reseninode, m.TextNode, text=text) + create_child(reseninode, TextNode, text=text) # Několik odstavců lorem ipsum for _ in range(rnd.randint(3, 7)): lipsum = lorem.paragraph() - text = m.Text.objects.create( + text = Text.objects.create( na_web=lipsum, do_cisla=lipsum, ) text.save() - create_child(castnode, m.TextNode, text=text) + create_child(castnode, TextNode, text=text) logger.info(f"Článek vygenerován (reseni={reseni.id}, treenode={reseninode.id})") diff --git a/tvorba/views/__init__.py b/tvorba/views/__init__.py index 2bef3591..2e9836e9 100644 --- a/tvorba/views/__init__.py +++ b/tvorba/views/__init__.py @@ -14,10 +14,10 @@ from django.db.models import Q, Sum, Count from django.views.generic.base import RedirectView from django.core.exceptions import PermissionDenied -import seminar.models as m from personalni.models import Resitel from soustredeni.models import Konfera from tvorba.models import Problem, Cislo, Rocnik, Tema, Clanek, Deadline, Uloha +from treenode.models import TemaVCisleNode, PohadkaNode from various.models import Nastaveni from treenode import treelib import treenode.templatetags as tnltt @@ -79,7 +79,7 @@ def get_problemy_k_tematu(tema): # context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak]) # elif isinstance(self.object, Tema): # rocniknode = self.object.rocnik.rocniknode -# context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, m.TemaVCisleNode)) +# context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, TemaVCisleNode)) # else: # raise ValueError("Obecný problém nejde zobrazit.") # return context @@ -144,9 +144,9 @@ def ZadaniTemataView(request): # tematko_object = Tema.objects.filter(rocnik=rocnik_object[0], kod=tematko) # seznam = vytahniZLesaSeznam(tematko_object[0], nastaveni.aktualni_rocnik().rocniknode) # for node, depth in seznam: -# if node.isinstance(node, m.KonferaNode): +# if node.isinstance(node, KonferaNode): # FIXME neexistuje # raise Exception("Not implemented yet") -# if node.isinstance(node, m.PohadkaNode): # Mohu ignorovat, má pod sebou +# if node.isinstance(node, PohadkaNode): # Mohu ignorovat, má pod sebou # pass # # return render(request, 'tvorba/tematka/toaletak.html', {}) diff --git a/various/views/final.py b/various/views/final.py index d21c00be..a1df0cfa 100644 --- a/various/views/final.py +++ b/various/views/final.py @@ -14,7 +14,8 @@ from django.views import generic import novinky.views import treenode.treelib as t import tvorba.views -import seminar.models as m + +from treenode.models import CisloNode from personalni.models import Resitel, Osoba from tvorba.models import Clanek, Deadline @@ -128,7 +129,7 @@ def seznam_problemu(): # content type je věc pomáhající rozeznávat různé typy objektů v django-polymorphic # protože isinstance vrátí vždy jen TreeNode # https://django-polymorphic.readthedocs.io/en/stable/migrating.html - cislonode_ct = ContentType.objects.get_for_model(m.CisloNode) + cislonode_ct = ContentType.objects.get_for_model(CisloNode) node = clanek_node while node is not None: node_ct = node.polymorphic_ctype -- 2.39.5 From dc0ff80632248bb8cce52aae1ecf7d9f5ef29d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 13:51:43 +0100 Subject: [PATCH 08/22] =?UTF-8?q?P=C5=99ehl=C3=ADdnut=C3=BD=20import=20sem?= =?UTF-8?q?inar.models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aesop/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aesop/views.py b/aesop/views.py index 56a6d266..c38c503b 100644 --- a/aesop/views.py +++ b/aesop/views.py @@ -6,7 +6,8 @@ from django.views import generic from django.utils.encoding import force_str from .utils import default_ovvpfile -from seminar.models import Rocnik, Soustredeni +from soustredeni.models import Soustredeni +from tvorba.models import Rocnik from vysledkovky import utils from tvorba.utils import aktivniResitele -- 2.39.5 From 7f21d10c26d6a983f7bb42f739456d225cab5bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 14:02:07 +0100 Subject: [PATCH 09/22] =?UTF-8?q?Ha,=20tak=20jsem=20se=20n=C4=9Bkde=20zamo?= =?UTF-8?q?tal=20do=20import=20cyklu=20a=20musel=20jsem=20ReseniNode=20d?= =?UTF-8?q?=C3=A1t=20tam,=20kam=20pat=C5=99=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models/__init__.py | 1 - seminar/models/odevzdavatko.py | 20 -------------------- seminar/models/treenode.py | 17 +++++++++++++++++ treenode/models/__init__.py | 1 - 4 files changed, 17 insertions(+), 22 deletions(-) delete mode 100644 seminar/models/odevzdavatko.py diff --git a/seminar/models/__init__.py b/seminar/models/__init__.py index 95e449ab..4b57e025 100644 --- a/seminar/models/__init__.py +++ b/seminar/models/__init__.py @@ -1,5 +1,4 @@ from .tvorba import * -from .odevzdavatko import * from .base import * from .pomocne import * from .treenode import * diff --git a/seminar/models/odevzdavatko.py b/seminar/models/odevzdavatko.py deleted file mode 100644 index 6079a708..00000000 --- a/seminar/models/odevzdavatko.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import models - -from treenode import models as tm -from odevzdavatko.models import Reseni - -class ReseniNode(tm.TreeNode): - class Meta: - db_table = 'seminar_nodes_otistene_reseni' - verbose_name = 'Otištěné řešení (Node)' - verbose_name_plural = 'Otištěná řešení (Node)' - reseni = models.ForeignKey(Reseni, - on_delete=models.PROTECT, - verbose_name = 'reseni') - - def aktualizuj_nazev(self): - self.nazev = "ReseniNode: "+str(self.reseni) - - def getOdkazStr(self): - return str(self.reseni) - diff --git a/seminar/models/treenode.py b/seminar/models/treenode.py index eee40281..8600c4b4 100644 --- a/seminar/models/treenode.py +++ b/seminar/models/treenode.py @@ -9,6 +9,7 @@ from unidecode import unidecode # Používám pro získání ID odkazu (ještě from polymorphic.models import PolymorphicModel from personalni.models import Organizator +from odevzdavatko.models import Reseni from .pomocne import Text @@ -263,3 +264,19 @@ class CastNode(TreeNode): def getOdkazStr(self): return str(self.nadpis) + + +class ReseniNode(TreeNode): + class Meta: + db_table = 'seminar_nodes_otistene_reseni' + verbose_name = 'Otištěné řešení (Node)' + verbose_name_plural = 'Otištěná řešení (Node)' + reseni = models.ForeignKey(Reseni, + on_delete=models.PROTECT, + verbose_name = 'reseni') + + def aktualizuj_nazev(self): + self.nazev = "ReseniNode: "+str(self.reseni) + + def getOdkazStr(self): + return str(self.reseni) diff --git a/treenode/models/__init__.py b/treenode/models/__init__.py index f068a819..36b2521c 100644 --- a/treenode/models/__init__.py +++ b/treenode/models/__init__.py @@ -1,2 +1 @@ -from seminar.models.odevzdavatko import * from seminar.models.treenode import * -- 2.39.5 From 007332804e7d26838434a352bff0cf84273df656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 1 Nov 2024 16:40:21 +0100 Subject: [PATCH 10/22] =?UTF-8?q?Fix:=20A=C5=A5=20to=20alespo=C5=88=20neh?= =?UTF-8?q?=C3=A1z=C3=AD=20chybu.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tvorba/templates/tvorba/archiv/cislo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tvorba/templates/tvorba/archiv/cislo.html b/tvorba/templates/tvorba/archiv/cislo.html index b33f83de..fdd0db43 100644 --- a/tvorba/templates/tvorba/archiv/cislo.html +++ b/tvorba/templates/tvorba/archiv/cislo.html @@ -38,7 +38,7 @@
  • Obálky (PDF)
  • Tituly (TeX, 2. deadline předchozího čísla a 1.deadline tohoto)
  • Výsledkovka (TeX, 2. deadline předchozího čísla a 1.deadline tohoto)
  • -
  • Odměny
  • +
  • {% if prevcislo %}Odměny{% else %}Pro toto číslo neumíme spočítat odměny.{% endif %}{# FIXME (Jediné číslo, kde toto neumíme je to úplně první.) #}
  • Tituly do závěrečného čísla (TeX, 2. deadline předchozího čísla a oba tohoto)
  • Výsledkovka závěrečného čísla ročníku (TeX, 2. deadline předchozího čísla a oba tohoto)
  • -- 2.39.5 From 9b14e4a333380a6a7d8550a05f858b490c55a95a Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Sun, 3 Nov 2024 01:46:18 +0100 Subject: [PATCH 11/22] =?UTF-8?q?Treenode:=20=C5=BE=C3=A1dn=C3=A9=20pomocn?= =?UTF-8?q?=C3=A9=20treenody=20nebudou.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- treenode/admin.py | 2 +- treenode/forms.py | 2 +- treenode/models/__init__.py | 1 - treenode/models/pomocne.py | 1 - treenode/serializers.py | 2 +- treenode/views.py | 2 +- treenode/viewsets.py | 2 +- tvorba/testutils.py | 2 +- 8 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 treenode/models/__init__.py delete mode 100644 treenode/models/pomocne.py diff --git a/treenode/admin.py b/treenode/admin.py index 6f3bfadb..fb8a8781 100644 --- a/treenode/admin.py +++ b/treenode/admin.py @@ -5,7 +5,7 @@ from django.forms import widgets from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode -from .models.pomocne import Text, Obrazek +from .models import Text, Obrazek # Polymorfismus pro stromy # TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html diff --git a/treenode/forms.py b/treenode/forms.py index 61243720..12ef293b 100644 --- a/treenode/forms.py +++ b/treenode/forms.py @@ -1,5 +1,5 @@ from django import forms -from .models.pomocne import Obrazek +from .models import Obrazek # pro přidání políčka do formuláře je potřeba # - mít v modelu tu položku, kterou chci upravovat diff --git a/treenode/models/__init__.py b/treenode/models/__init__.py deleted file mode 100644 index 36b2521c..00000000 --- a/treenode/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from seminar.models.treenode import * diff --git a/treenode/models/pomocne.py b/treenode/models/pomocne.py deleted file mode 100644 index 6592da81..00000000 --- a/treenode/models/pomocne.py +++ /dev/null @@ -1 +0,0 @@ -from seminar.models.pomocne import * diff --git a/treenode/serializers.py b/treenode/serializers.py index d26964d1..435a14d4 100644 --- a/treenode/serializers.py +++ b/treenode/serializers.py @@ -5,7 +5,7 @@ from odevzdavatko.models import Reseni from tvorba.models import Problem, Uloha from .models import RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, OrgTextNode, PohadkaNode, TextNode, TreeNode, CastNode, UlohaZadaniNode, UlohaVzorakNode, ReseniNode -from .models.pomocne import Text +from .models import Text from treenode import treelib DEFAULT_NODE_DEPTH = 2 diff --git a/treenode/views.py b/treenode/views.py index ee8cd897..bc817faf 100644 --- a/treenode/views.py +++ b/treenode/views.py @@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import PermissionDenied from .models import TemaVCisleNode, RocnikNode, CisloNode, UlohaVzorakNode, UlohaZadaniNode, TreeNode, CastNode, TextNode, ReseniNode, PohadkaNode, OrgTextNode -from .models.pomocne import Text, Obrazek +from .models import Text, Obrazek from treenode import treelib import treenode.forms as f import treenode.templatetags as tnltt diff --git a/treenode/viewsets.py b/treenode/viewsets.py index 5280b5e4..e668436e 100644 --- a/treenode/viewsets.py +++ b/treenode/viewsets.py @@ -8,7 +8,7 @@ from odevzdavatko.models import Reseni from tvorba.models import Problem, Uloha from .models import TextNode, CastNode, UlohaVzorakNode, UlohaZadaniNode, ReseniNode -from .models.pomocne import Text +from .models import Text import treenode.serializers as views from treenode.permissions import AllowWrite diff --git a/tvorba/testutils.py b/tvorba/testutils.py index 4bbed8e4..53229d18 100644 --- a/tvorba/testutils.py +++ b/tvorba/testutils.py @@ -11,7 +11,7 @@ from .models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha, Clanek from odevzdavatko.models import Reseni, Hodnoceni # TODO zbavit se treenodů do treenode.testutils (ty pak klidně volat odtud) from treenode.models import TextNode, UlohaZadaniNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, CastNode, MezicisloNode, ReseniNode -from treenode.models.pomocne import Text +from treenode.models import Text from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after -- 2.39.5 From 527a7b3ea615bb058e0a32da395661b55ed17b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 14:58:25 +0100 Subject: [PATCH 12/22] =?UTF-8?q?Pojmenovan=C3=A9=20URL=20m=C3=ADsto=20?= =?UTF-8?q?=C4=8Dist=C3=A9ho=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- novinky/templates/novinky/novinky.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novinky/templates/novinky/novinky.html b/novinky/templates/novinky/novinky.html index 59f9377b..a1acbeaa 100644 --- a/novinky/templates/novinky/novinky.html +++ b/novinky/templates/novinky/novinky.html @@ -4,7 +4,7 @@ {% if not novinka.zverejneno and user.je_org %}
    {% endif %} {% if novinka.zverejneno or user.je_org %} -- 2.39.5 From 1c146ac5c35d84a284e39ba216e25004327314de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 15:07:51 +0100 Subject: [PATCH 13/22] Admin ReseniNode --- treenode/admin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/treenode/admin.py b/treenode/admin.py index fb8a8781..56beb97a 100644 --- a/treenode/admin.py +++ b/treenode/admin.py @@ -4,7 +4,7 @@ from django.forms import widgets from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter -from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode +from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode, ReseniNode from .models import Text, Obrazek # Polymorfismus pro stromy @@ -24,6 +24,7 @@ class TreeNodeAdmin(PolymorphicParentModelAdmin): TextNode, CastNode, OrgTextNode, + ReseniNode, ] actions = ['aktualizuj_nazvy'] @@ -88,6 +89,10 @@ class TextNodeAdmin(PolymorphicChildModelAdmin): base_model = OrgTextNode show_in_index = True +@admin.register(ReseniNode) +class ReseniNodeAdmin(PolymorphicChildModelAdmin): + base_model = ReseniNode + show_in_index = True class TextAdminInline(admin.TabularInline): model = Text -- 2.39.5 From ac6c41cc8844b8a89ed19782f23f9f1f99b91050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 15:10:36 +0100 Subject: [PATCH 14/22] =?UTF-8?q?N=C3=A1zev=20url=20seznamu=20v=C5=A1ech?= =?UTF-8?q?=20soust=C5=99ed=C4=9Bn=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soustredeni/models.py | 2 +- soustredeni/urls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soustredeni/models.py b/soustredeni/models.py index 509c3cc2..8a6f6853 100644 --- a/soustredeni/models.py +++ b/soustredeni/models.py @@ -75,7 +75,7 @@ class Soustredeni(SeminarModelBase): def verejne_url(self): #return reverse('seminar_soustredeni', kwargs={'pk': self.id}) - return reverse('soustredeni_probehlo') + return reverse('soustredeni_seznam') @reversion.register(ignore_duplicates=True) diff --git a/soustredeni/urls.py b/soustredeni/urls.py index 3ef7edae..181700f5 100644 --- a/soustredeni/urls.py +++ b/soustredeni/urls.py @@ -7,7 +7,7 @@ urlpatterns = [ path( 'probehlo/', views.SoustredeniListView.as_view(), - name='soustredeni_probehlo' + name='soustredeni_seznam' ), path( '/', -- 2.39.5 From d0cb46b658a4b8776d7307229457ee6d97bc8f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 17:40:36 +0100 Subject: [PATCH 15/22] =?UTF-8?q?N=C3=A1zev=20url=20seznamu=20v=C5=A1ech?= =?UTF-8?q?=20soust=C5=99ed=C4=9Bn=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/sitetree.json | 2 +- personalni/templates/personalni/profil/orgorozcestnik.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/sitetree.json b/data/sitetree.json index c19462e6..4505941c 100644 --- a/data/sitetree.json +++ b/data/sitetree.json @@ -361,7 +361,7 @@ "sort_order": 20, "title": "Proběhlo", "tree": 1, - "url": "soustredeni_probehlo", + "url": "soustredeni_seznam", "urlaspattern": true }, "model": "sitetree.treeitem", diff --git a/personalni/templates/personalni/profil/orgorozcestnik.html b/personalni/templates/personalni/profil/orgorozcestnik.html index 27071b66..2dbc853b 100644 --- a/personalni/templates/personalni/profil/orgorozcestnik.html +++ b/personalni/templates/personalni/profil/orgorozcestnik.html @@ -78,7 +78,7 @@
  • hlasování o přednáškách
  • -
  • proběhlá soustředění +
  • proběhlá soustředění
    • vytvoření galerie
    • stažení seznamu účastníků
    • -- 2.39.5 From a372aa1bc2a8f16ca608b7620c243d9916de4f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 17:46:27 +0100 Subject: [PATCH 16/22] Seminar v dokumentaci --- docs/struktura.rst | 9 +++++---- .../2021-12-06-testovani_dokumentace_codereview.md | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/struktura.rst b/docs/struktura.rst index 439e39e9..46eaee23 100644 --- a/docs/struktura.rst +++ b/docs/struktura.rst @@ -10,11 +10,9 @@ věci jako chybové hlášky a vzhled M&M stránek (menu, patička, atd.). Aktu i veškeré csv. Další jsou pak jednotlivé aplikace (pokud něco hledáte, tak zřejmě chcete najít -tu aplikaci, která tomu odpovídá, respektive se k ní dostat přes url), za -zmínku stojí seminar, kde jsou takové ty věci, co zbyly. Plus jsou tam aktuálně -téměř všechny modely, protože je těžké je přesunout jinam. +tu aplikaci, která tomu odpovídá, respektive se k ní dostat přes url). -**TLDR: Nevšímejte si složky data/ a souborů přímo v kořenové složce.** +**TLDR: Nevšímejte si složek data/ seminar/ a souborů přímo v kořenové složce.** Kromě věcí potřebných ke gitu, :doc:`ke spuštění ` a fukci djanga, dalších drobností, lokální databáze a již zmíněných aplikací jsou tu ``data``, kde je takový ten obsah webu, co by se měl dát snadno měnit (tudíž musí být v @@ -22,6 +20,9 @@ databázi), tj. statické stránky, menu a obrázky v pozadí menu. Ten je třeb měnit hlavně na produkci a sekundárně tady (může to dělat i newebař a nechcete přepsat jeho práci). Vše, co nejsou aplikace je popsáno :doc:`tady `. +Ještě je tu aplikace ``seminar/``, kde bylo původně skoro všechno, a tak nám +tam zbývá spoustu historických migrací (čehož se jen tak nezbavíme). + Základy djanga -------------- diff --git a/docs/zapisy/2021-12-06-testovani_dokumentace_codereview.md b/docs/zapisy/2021-12-06-testovani_dokumentace_codereview.md index c2cfc1b5..e0da9440 100644 --- a/docs/zapisy/2021-12-06-testovani_dokumentace_codereview.md +++ b/docs/zapisy/2021-12-06-testovani_dokumentace_codereview.md @@ -116,7 +116,7 @@ Aktuálně: Jakýsi coding style zhruba existuje, není popsaný, šíří se li - Nesmí být striktně vynucovaný - Musel by být hodně nastavitelný - Nechceme mít kód plný `#NOQA: WTF42` -- Nejspíš vždycky bude mít false positives (`tvorba.utils.roman_numerals`) i false negatives (`seminar.models.tvorba.Cislo.posli_cislo_mailem`) +- Nejspíš vždycky bude mít false positives (`tvorba.utils.roman_numerals`) i false negatives (`tvorba.models.Cislo.posli_cislo_mailem`) - Možná dobrý sluha, ale určitě špatný pán (also: špatná zkušenost ☺) - __Důsledek:__ Hrozí, že těch falešných varování bude moc, čímž to ztratí smysl úplně - Potenciálně by šlo aplikovat jen lokálně na změny? -- 2.39.5 From 62a42675f80dc286ec59859f0adad2ed0b27b769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 18:53:38 +0100 Subject: [PATCH 17/22] mv SeminarModelBase a OverwriteStorage --- odevzdavatko/models.py | 8 ++--- personalni/models.py | 2 +- seminar/migrations/0100_auto_20211129_2354.py | 5 +-- seminar/models/__init__.py | 3 -- seminar/models/base.py | 23 ------------ seminar/models/tvorba.py | 14 -------- soustredeni/models.py | 2 +- treenode/models.py | 2 +- tvorba/migrations/0001_tvorba_create.py | 4 +-- tvorba/models.py | 3 +- various/models.py | 36 ++++++++++++++++--- 11 files changed, 44 insertions(+), 58 deletions(-) delete mode 100644 seminar/models/base.py delete mode 100644 seminar/models/tvorba.py diff --git a/odevzdavatko/models.py b/odevzdavatko/models.py index dea32f83..3b510fe7 100644 --- a/odevzdavatko/models.py +++ b/odevzdavatko/models.py @@ -10,13 +10,13 @@ from django.utils import timezone from django.conf import settings from tvorba.models import Problem, Deadline, Cislo, Uloha, aux_generate_filename -from seminar.models import base as bm +from various.models import SeminarModelBase from odevzdavatko.utils import vzorecek_na_prepocet, inverze_vzorecku_na_prepocet from personalni.models import Resitel @reversion.register(ignore_duplicates=True) -class Reseni(bm.SeminarModelBase): +class Reseni(SeminarModelBase): class Meta: db_table = 'seminar_reseni' @@ -88,7 +88,7 @@ class Reseni(bm.SeminarModelBase): # self.cislo_body = self.problem.cislo_reseni # super(Reseni, self).save(*args, **kwargs) -class Hodnoceni(bm.SeminarModelBase): +class Hodnoceni(SeminarModelBase): class Meta: db_table = 'seminar_hodnoceni' verbose_name = 'Hodnocení' @@ -181,7 +181,7 @@ def generate_filename(self, filename): @reversion.register(ignore_duplicates=True) -class PrilohaReseni(bm.SeminarModelBase): +class PrilohaReseni(SeminarModelBase): class Meta: db_table = 'seminar_priloha_reseni' diff --git a/personalni/models.py b/personalni/models.py index b8bcbdec..636b132e 100644 --- a/personalni/models.py +++ b/personalni/models.py @@ -11,7 +11,7 @@ from django_countries.fields import CountryField from reversion import revisions as reversion -from seminar.models.base import SeminarModelBase +from various.models import SeminarModelBase logger = logging.getLogger(__name__) diff --git a/seminar/migrations/0100_auto_20211129_2354.py b/seminar/migrations/0100_auto_20211129_2354.py index 80906d4e..87f0b824 100644 --- a/seminar/migrations/0100_auto_20211129_2354.py +++ b/seminar/migrations/0100_auto_20211129_2354.py @@ -1,7 +1,8 @@ # Generated by Django 2.2.24 on 2021-11-29 22:54 from django.db import migrations, models -import seminar.models.tvorba +import various.models +import seminar.models class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='pdf', - field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=seminar.models.tvorba.OverwriteStorage(), upload_to=seminar.models.tvorba.cislo_pdf_filename, verbose_name='pdf'), + field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=various.models.OverwriteStorage(), upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), ), ] diff --git a/seminar/models/__init__.py b/seminar/models/__init__.py index e0377ff0..bd660e0c 100644 --- a/seminar/models/__init__.py +++ b/seminar/models/__init__.py @@ -1,6 +1,3 @@ -from .tvorba import * -from .base import * - from various.models import Nastaveni from personalni.models import Organizator, Resitel, Skola, Prijemce, Osoba from soustredeni.models import Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Konfera, Konfery_Ucastnici diff --git a/seminar/models/base.py b/seminar/models/base.py deleted file mode 100644 index 6ea34242..00000000 --- a/seminar/models/base.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.urls import reverse -from django.db import models - - -class SeminarModelBase(models.Model): - - class Meta: - abstract = True - - def verejne(self): - return False - - # def get_absolute_url(self): - # return "https://" + str(get_current_site(None)) + self.verejne_url() - - def admin_url(self): - app_name = self._meta.app_label - model_name = self._meta.model_name - return reverse('admin:{}_{}_change'.format(app_name, model_name), args=(self.id, )) - -# def verejne_url(self): -# return None - diff --git a/seminar/models/tvorba.py b/seminar/models/tvorba.py deleted file mode 100644 index c1f91196..00000000 --- a/seminar/models/tvorba.py +++ /dev/null @@ -1,14 +0,0 @@ -import os -import logging - -from django.core.files.storage import FileSystemStorage - -logger = logging.getLogger(__name__) - -class OverwriteStorage(FileSystemStorage): - """ Varianta FileSystemStorage, která v případě, že soubor cílového - jména již existuje, ho smaže a místo něj uloží soubor nový""" - def get_available_name(self,name, max_length=None): - if self.exists(name): - os.remove(os.path.join(self.location,name)) - return super().get_available_name(name,max_length) diff --git a/soustredeni/models.py b/soustredeni/models.py index 8a6f6853..57e3741f 100644 --- a/soustredeni/models.py +++ b/soustredeni/models.py @@ -9,7 +9,7 @@ from django.conf import settings from personalni.models import Resitel, Organizator -from seminar.models.base import SeminarModelBase +from various.models import SeminarModelBase from tvorba.models import Rocnik, Problem, aux_generate_filename logger = logging.getLogger(__name__) diff --git a/treenode/models.py b/treenode/models.py index e5f91c4d..54e9b896 100644 --- a/treenode/models.py +++ b/treenode/models.py @@ -8,7 +8,7 @@ from unidecode import unidecode # Používám pro získání ID odkazu (ještě from polymorphic.models import PolymorphicModel -from seminar.models import SeminarModelBase +from various.models import SeminarModelBase from personalni.models import Organizator from odevzdavatko.models import Reseni diff --git a/tvorba/migrations/0001_tvorba_create.py b/tvorba/migrations/0001_tvorba_create.py index 085cb5b4..e8a6b027 100644 --- a/tvorba/migrations/0001_tvorba_create.py +++ b/tvorba/migrations/0001_tvorba_create.py @@ -4,7 +4,7 @@ import datetime from django.db import migrations, models import django.db.models.deletion import django.utils.timezone -import seminar.models.tvorba +import various.models import tvorba.models import taggit.managers @@ -35,7 +35,7 @@ class Migration(migrations.Migration): ('datum_vydani', models.DateField(blank=True, help_text='Datum vydání finální verze', null=True, verbose_name='datum vydání')), ('verejne_db', models.BooleanField(db_column='verejne', default=False, verbose_name='číslo zveřejněno')), ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k číslu (plain text)', verbose_name='neveřejná poznámka')), - ('pdf', models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=seminar.models.tvorba.OverwriteStorage(), upload_to=tvorba.models.cislo_pdf_filename, verbose_name='pdf')), + ('pdf', models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=various.models.OverwriteStorage(), upload_to=tvorba.models.cislo_pdf_filename, verbose_name='pdf')), ('titulka_nahled', models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=tvorba.models.cislo_png_filename, verbose_name='Obrázek titulní strany')), ('rocnik', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='cisla', to='tvorba.rocnik', verbose_name='ročník')), ], diff --git a/tvorba/models.py b/tvorba/models.py index c00d0935..3a3a6b4e 100644 --- a/tvorba/models.py +++ b/tvorba/models.py @@ -31,8 +31,7 @@ from polymorphic.models import PolymorphicModel from django.core.mail import EmailMessage -from seminar.models.base import SeminarModelBase -from seminar.models.tvorba import OverwriteStorage +from various.models import SeminarModelBase, OverwriteStorage from personalni.models import Prijemce, Organizator logger = logging.getLogger(__name__) diff --git a/various/models.py b/various/models.py index 85ba4702..363c3137 100644 --- a/various/models.py +++ b/various/models.py @@ -1,11 +1,12 @@ +import os + from django.db import models +from django.core.files.storage import FileSystemStorage +from django.urls import reverse from reversion import revisions as reversion from solo.models import SingletonModel -from tvorba.models import Cislo - -from django.urls import reverse @reversion.register(ignore_duplicates=True) class Nastaveni(SingletonModel): @@ -14,10 +15,10 @@ class Nastaveni(SingletonModel): db_table = 'seminar_nastaveni' verbose_name = 'Nastavení semináře' -# aktualni_rocnik = models.ForeignKey(Rocnik, verbose_name='aktuální ročník', +# aktualni_rocnik = models.ForeignKey("tvorba.Rocnik", verbose_name='aktuální ročník', # null=False, on_delete=models.PROTECT) - aktualni_cislo = models.ForeignKey(Cislo, verbose_name='Aktuální číslo', + aktualni_cislo = models.ForeignKey("tvorba.Cislo", verbose_name='Aktuální číslo', null=True, blank=False, on_delete=models.PROTECT, ) @@ -37,3 +38,28 @@ class Nastaveni(SingletonModel): def verejne(self): return False + + +class OverwriteStorage(FileSystemStorage): + """ Varianta FileSystemStorage, která v případě, že soubor cílového + jména již existuje, ho smaže a místo něj uloží soubor nový""" + def get_available_name(self,name, max_length=None): + if self.exists(name): + os.remove(os.path.join(self.location,name)) + return super().get_available_name(name,max_length) + + +class SeminarModelBase(models.Model): + class Meta: + abstract = True + + def verejne(self): + return False + + # def get_absolute_url(self): + # return "https://" + str(get_current_site(None)) + self.verejne_url() + + def admin_url(self): + app_name = self._meta.app_label + model_name = self._meta.model_name + return reverse('admin:{}_{}_change'.format(app_name, model_name), args=(self.id, )) -- 2.39.5 From f5c2e2212142dfd640625121740367215ac2672f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 18:54:01 +0100 Subject: [PATCH 18/22] =?UTF-8?q?Zapomenut=C3=BD=20seminar.models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- treenode/templatetags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/treenode/templatetags.py b/treenode/templatetags.py index 701965c5..d2d3d83e 100644 --- a/treenode/templatetags.py +++ b/treenode/templatetags.py @@ -49,7 +49,7 @@ def isKonfera(value): @register.filter def isClanek(value): # FIXME neexistuje - # return isinstance(value, seminar.models.ClanekNode) + # return isinstance(value, ClanekNode) return False @register.filter -- 2.39.5 From c1938c8ff7f2641d6994657de85f1c6ddaa159c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 19:56:07 +0100 Subject: [PATCH 19/22] =?UTF-8?q?Odst=C5=99el=20funkc=C3=AD=20pro=20migrac?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/migrations/0001_initial.py | 5 +++-- .../0001_squashed_0098_auto_20210906_0305.py | 21 +++++++++++-------- seminar/migrations/0002_add_body_views.py | 6 +----- .../migrations/0028_add_body_celkem_views.py | 6 +----- .../migrations/0029_fix_body_celkem_views.py | 6 +----- seminar/migrations/0031_cislo_pdf.py | 4 ++-- .../migrations/0032_cislo_pdf_blank_typos.py | 5 +++-- seminar/migrations/0041_konfery.py | 7 ++++--- seminar/migrations/0042_auto_20161005_0847.py | 6 +++--- seminar/migrations/0081_auto_20200408_2221.py | 5 +++-- seminar/migrations/0082_auto_20200506_1951.py | 4 ++-- seminar/migrations/0100_auto_20211129_2354.py | 4 ++-- seminar/migrations/0103_deadline.py | 12 +++++------ .../0105_odstraneni_deadlinu_cisla.py | 2 +- .../0106_remove_cislo_verejna_vysledkovka.py | 2 +- seminar/models.py | 12 +++++++++++ seminar/models/__init__.py | 18 ---------------- 17 files changed, 57 insertions(+), 68 deletions(-) create mode 100644 seminar/models.py delete mode 100644 seminar/models/__init__.py diff --git a/seminar/migrations/0001_initial.py b/seminar/migrations/0001_initial.py index cd36a7dc..9b7a35a5 100644 --- a/seminar/migrations/0001_initial.py +++ b/seminar/migrations/0001_initial.py @@ -2,10 +2,11 @@ from __future__ import unicode_literals from django.db import models, migrations import django_countries.fields -import seminar.models import django.utils.timezone from django.conf import settings +from odevzdavatko.models import generate_filename + class Migration(migrations.Migration): @@ -75,7 +76,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(serialize=False, primary_key=True)), ('timestamp', models.DateTimeField(auto_now=True, verbose_name='vytvo\u0159eno')), - ('soubor', models.FileField(upload_to=seminar.models.generate_filename, verbose_name='soubor')), + ('soubor', models.FileField(upload_to=generate_filename, verbose_name='soubor')), ('poznamka', models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka k p\u0159\xedloze \u0159e\u0161en\xed (plain text), nap\u0159. o p\u016fvodu', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True)), ], options={ diff --git a/seminar/migrations/0001_squashed_0098_auto_20210906_0305.py b/seminar/migrations/0001_squashed_0098_auto_20210906_0305.py index a95f9c1b..f9eea4fe 100644 --- a/seminar/migrations/0001_squashed_0098_auto_20210906_0305.py +++ b/seminar/migrations/0001_squashed_0098_auto_20210906_0305.py @@ -7,9 +7,12 @@ import django.db.models.deletion import django.utils.timezone import django_countries.fields import imagekit.models.fields -import seminar.models import taggit.managers +from soustredeni.models import generate_filename_konfera +from odevzdavatko.models import generate_filename +from tvorba.models import cislo_pdf_filename, cislo_png_filename + from datetime import date from django.db.models import Q from treenode.treelib import get_parent @@ -962,7 +965,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('timestamp', models.DateTimeField(auto_now=True, verbose_name='vytvořeno')), - ('soubor', models.FileField(upload_to=seminar.models.generate_filename, verbose_name='soubor')), + ('soubor', models.FileField(upload_to=generate_filename, verbose_name='soubor')), ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k příloze řešení (plain text), např. o původu', verbose_name='neveřejná poznámka')), ('reseni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='prilohy', to='seminar.Reseni', verbose_name='řešení')), ], @@ -1284,7 +1287,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='cislo', name='pdf', - field=models.FileField(blank=True, help_text='Pdf čísla, které si mohou řešitelé stáhnout', null=True, upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + field=models.FileField(blank=True, help_text='Pdf čísla, které si mohou řešitelé stáhnout', null=True, upload_to=cislo_pdf_filename, verbose_name='pdf'), ), migrations.AlterField( model_name='problem', @@ -1361,8 +1364,8 @@ class Migration(migrations.Migration): ('abstrakt', models.TextField(blank=True, help_text='Abstrakt konfery tak, jak byl uveden ve sborníku', verbose_name='abstrakt')), ('org_poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka ke konfeře(plain text)', verbose_name='neveřejná poznámka')), ('typ_prezentace', models.CharField(choices=[(b'veletrh', 'Veletrh (postery)'), (b'prezentace', 'Prezentace (přednáška)')], default=b'veletrh', max_length=16, verbose_name='typ prezentace')), - ('prezentace', models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace')), - ('materialy', models.FileField(help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy')), + ('prezentace', models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=generate_filename_konfera, verbose_name='prezentace')), + ('materialy', models.FileField(help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=generate_filename_konfera, verbose_name='materialy')), ('organizator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Organizator', verbose_name='organizátor')), ('soustredeni', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Soustredeni', verbose_name='soustředění')), ], @@ -1400,12 +1403,12 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='konfera', name='materialy', - field=models.FileField(blank=True, help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy'), + field=models.FileField(blank=True, help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=generate_filename_konfera, verbose_name='materialy'), ), migrations.AlterField( model_name='konfera', name='prezentace', - field=models.FileField(blank=True, help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace'), + field=models.FileField(blank=True, help_text='Prezentace nebo fotka posteru', upload_to=generate_filename_konfera, verbose_name='prezentace'), ), migrations.AddField( model_name='konfera', @@ -2648,12 +2651,12 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='pdf', - field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, upload_to=cislo_pdf_filename, verbose_name='pdf'), ), migrations.AddField( model_name='cislo', name='titulka_nahled', - field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=seminar.models.cislo_png_filename, verbose_name='Obrázek titulní strany'), + field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=cislo_png_filename, verbose_name='Obrázek titulní strany'), ), migrations.AlterField( model_name='treenode', diff --git a/seminar/migrations/0002_add_body_views.py b/seminar/migrations/0002_add_body_views.py index 1ece029e..19851d58 100644 --- a/seminar/migrations/0002_add_body_views.py +++ b/seminar/migrations/0002_add_body_views.py @@ -1,10 +1,6 @@ from __future__ import unicode_literals -from django.db import models, migrations -import django_countries.fields -import seminar.models -import django.utils.timezone -from django.conf import settings +from django.db import migrations CREATE_VIEWS=""" create view seminar_body_za_cislo as diff --git a/seminar/migrations/0028_add_body_celkem_views.py b/seminar/migrations/0028_add_body_celkem_views.py index c26baec2..b4e7fd90 100644 --- a/seminar/migrations/0028_add_body_celkem_views.py +++ b/seminar/migrations/0028_add_body_celkem_views.py @@ -1,10 +1,6 @@ from __future__ import unicode_literals -from django.db import models, migrations -import django_countries.fields -import seminar.models -import django.utils.timezone -from django.conf import settings +from django.db import migrations CREATE_VIEWS=""" drop view seminar_body_k_cislu; diff --git a/seminar/migrations/0029_fix_body_celkem_views.py b/seminar/migrations/0029_fix_body_celkem_views.py index b2b9f24a..8577f3e9 100644 --- a/seminar/migrations/0029_fix_body_celkem_views.py +++ b/seminar/migrations/0029_fix_body_celkem_views.py @@ -1,10 +1,6 @@ from __future__ import unicode_literals -from django.db import models, migrations -import django_countries.fields -import seminar.models -import django.utils.timezone -from django.conf import settings +from django.db import migrations CREATE_VIEWS=""" diff --git a/seminar/migrations/0031_cislo_pdf.py b/seminar/migrations/0031_cislo_pdf.py index b2b65102..8392a581 100644 --- a/seminar/migrations/0031_cislo_pdf.py +++ b/seminar/migrations/0031_cislo_pdf.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django.db import models, migrations -import seminar.models +from tvorba.models import cislo_pdf_filename class Migration(migrations.Migration): @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='cislo', name='pdf', - field=models.FileField(help_text='Pdf \u010d\xedsla, kter\xe9 si mohou \u0159e\u0161itel\xe9 st\xe1hnout', upload_to=seminar.models.cislo_pdf_filename, null=True, verbose_name='pdf'), + field=models.FileField(help_text='Pdf \u010d\xedsla, kter\xe9 si mohou \u0159e\u0161itel\xe9 st\xe1hnout', upload_to=cislo_pdf_filename, null=True, verbose_name='pdf'), preserve_default=True, ), ] diff --git a/seminar/migrations/0032_cislo_pdf_blank_typos.py b/seminar/migrations/0032_cislo_pdf_blank_typos.py index b72ad75d..3d37d347 100644 --- a/seminar/migrations/0032_cislo_pdf_blank_typos.py +++ b/seminar/migrations/0032_cislo_pdf_blank_typos.py @@ -2,7 +2,8 @@ from __future__ import unicode_literals from django.db import models, migrations import django_countries.fields -import seminar.models + +from tvorba.models import cislo_pdf_filename class Migration(migrations.Migration): @@ -25,7 +26,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='pdf', - field=models.FileField(help_text='Pdf \u010d\xedsla, kter\xe9 si mohou \u0159e\u0161itel\xe9 st\xe1hnout', upload_to=seminar.models.cislo_pdf_filename, null=True, verbose_name='pdf', blank=True), + field=models.FileField(help_text='Pdf \u010d\xedsla, kter\xe9 si mohou \u0159e\u0161itel\xe9 st\xe1hnout', upload_to=cislo_pdf_filename, null=True, verbose_name='pdf', blank=True), preserve_default=True, ), migrations.AlterField( diff --git a/seminar/migrations/0041_konfery.py b/seminar/migrations/0041_konfery.py index bb040465..d4941c3b 100644 --- a/seminar/migrations/0041_konfery.py +++ b/seminar/migrations/0041_konfery.py @@ -2,7 +2,8 @@ from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion -import seminar.models + +from soustredeni.models import generate_filename_konfera class Migration(migrations.Migration): @@ -21,8 +22,8 @@ class Migration(migrations.Migration): ('abstrakt', models.TextField(help_text='Abstrakt konfery tak, jak byl uveden ve sborn\xedku', verbose_name='abstrakt', blank=True)), ('org_poznamka', models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka ke konfe\u0159e(plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True)), ('typ_prezentace', models.CharField(default=b'veletrh', max_length=16, verbose_name='typ prezentace', choices=[(b'veletrh', 'Veletrh (postery)'), (b'prezentace', 'Prezentace (p\u0159edn\xe1\u0161ka)')])), - ('prezentace', models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace')), - ('materialy', models.FileField(help_text='Dal\u0161\xed materi\xe1ly ke konfe\u0159e zabalen\xe9 do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy')), + ('prezentace', models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=generate_filename_konfera, verbose_name='prezentace')), + ('materialy', models.FileField(help_text='Dal\u0161\xed materi\xe1ly ke konfe\u0159e zabalen\xe9 do jednoho souboru', upload_to=generate_filename_konfera, verbose_name='materialy')), ('organizator', models.ForeignKey(related_name='konfery', on_delete=django.db.models.deletion.SET_NULL, verbose_name='organiz\xe1tor', to='seminar.Organizator', null=True)), ], options={ diff --git a/seminar/migrations/0042_auto_20161005_0847.py b/seminar/migrations/0042_auto_20161005_0847.py index e606e325..c06986c3 100644 --- a/seminar/migrations/0042_auto_20161005_0847.py +++ b/seminar/migrations/0042_auto_20161005_0847.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion -import seminar.models +from soustredeni.models import generate_filename_konfera class Migration(migrations.Migration): @@ -15,12 +15,12 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='konfera', name='materialy', - field=models.FileField(help_text='Dal\u0161\xed materi\xe1ly ke konfe\u0159e zabalen\xe9 do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy', blank=True), + field=models.FileField(help_text='Dal\u0161\xed materi\xe1ly ke konfe\u0159e zabalen\xe9 do jednoho souboru', upload_to=generate_filename_konfera, verbose_name='materialy', blank=True), ), migrations.AlterField( model_name='konfera', name='prezentace', - field=models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace', blank=True), + field=models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=generate_filename_konfera, verbose_name='prezentace', blank=True), ), migrations.AlterField( model_name='konfera', diff --git a/seminar/migrations/0081_auto_20200408_2221.py b/seminar/migrations/0081_auto_20200408_2221.py index 6cf908bb..0f1edb75 100644 --- a/seminar/migrations/0081_auto_20200408_2221.py +++ b/seminar/migrations/0081_auto_20200408_2221.py @@ -1,7 +1,8 @@ # Generated by Django 2.2.9 on 2020-04-08 20:21 from django.db import migrations, models -import seminar.models + +from tvorba.models import cislo_pdf_filename class Migration(migrations.Migration): @@ -19,6 +20,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='pdf', - field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, upload_to=cislo_pdf_filename, verbose_name='pdf'), ), ] diff --git a/seminar/migrations/0082_auto_20200506_1951.py b/seminar/migrations/0082_auto_20200506_1951.py index 3132c434..99ef70e9 100644 --- a/seminar/migrations/0082_auto_20200506_1951.py +++ b/seminar/migrations/0082_auto_20200506_1951.py @@ -1,7 +1,7 @@ # Generated by Django 2.2.12 on 2020-05-06 17:51 from django.db import migrations, models -import seminar.models +from tvorba.models import cislo_png_filename class Migration(migrations.Migration): @@ -14,6 +14,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='titulka_nahled', - field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=seminar.models.cislo_png_filename, verbose_name='Obrázek titulní strany'), + field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=cislo_png_filename, verbose_name='Obrázek titulní strany'), ), ] diff --git a/seminar/migrations/0100_auto_20211129_2354.py b/seminar/migrations/0100_auto_20211129_2354.py index 87f0b824..dfe92833 100644 --- a/seminar/migrations/0100_auto_20211129_2354.py +++ b/seminar/migrations/0100_auto_20211129_2354.py @@ -2,7 +2,7 @@ from django.db import migrations, models import various.models -import seminar.models +from tvorba.models import cislo_pdf_filename class Migration(migrations.Migration): @@ -15,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='cislo', name='pdf', - field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=various.models.OverwriteStorage(), upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, storage=various.models.OverwriteStorage(), upload_to=cislo_pdf_filename, verbose_name='pdf'), ), ] diff --git a/seminar/migrations/0103_deadline.py b/seminar/migrations/0103_deadline.py index 78577373..ba24df13 100644 --- a/seminar/migrations/0103_deadline.py +++ b/seminar/migrations/0103_deadline.py @@ -5,7 +5,7 @@ from django.db import migrations, models import django.db.models.deletion from django.utils import timezone -import seminar.models as m +from tvorba.models import Deadline as mDeadline def vytvor_deadliny(apps, schema_editor): @@ -16,7 +16,7 @@ def vytvor_deadliny(apps, schema_editor): if cislo.rocnik.rocnik < 26: Deadline.objects.create( cislo=cislo, - typ=m.Deadline.TYP_CISLA, + typ=mDeadline.TYP_CISLA, deadline=timezone.make_aware(datetime.datetime.combine(datetime.date(1994 + cislo.rocnik.rocnik, 6, int(cislo.poradi[0])), datetime.time.min)), verejna_vysledkovka=cislo.verejna_vysledkovka, ) @@ -33,24 +33,24 @@ def vytvor_deadliny(apps, schema_editor): if cislo.datum_deadline_soustredeni and cislo.datum_deadline_soustredeni == cislo.datum_preddeadline: vytvor_deadline( date=cislo.datum_deadline_soustredeni, - typ=m.Deadline.TYP_PRVNI_A_SOUS + typ=mDeadline.TYP_PRVNI_A_SOUS ) else: if cislo.datum_deadline_soustredeni: vytvor_deadline( date=cislo.datum_deadline_soustredeni, - typ=m.Deadline.TYP_SOUS + typ=mDeadline.TYP_SOUS ) if cislo.datum_preddeadline: vytvor_deadline( date=cislo.datum_preddeadline, - typ=m.Deadline.TYP_PRVNI + typ=mDeadline.TYP_PRVNI ) if cislo.datum_deadline: vytvor_deadline( date=cislo.datum_deadline, - typ=m.Deadline.TYP_CISLA + typ=mDeadline.TYP_CISLA ) diff --git a/seminar/migrations/0105_odstraneni_deadlinu_cisla.py b/seminar/migrations/0105_odstraneni_deadlinu_cisla.py index c3ab3541..262de179 100644 --- a/seminar/migrations/0105_odstraneni_deadlinu_cisla.py +++ b/seminar/migrations/0105_odstraneni_deadlinu_cisla.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.15 on 2022-10-09 10:14 from django.db import migrations -from seminar.models import Deadline +from tvorba.models import Deadline def vrat_deadliny(apps, schema_editor): diff --git a/seminar/migrations/0106_remove_cislo_verejna_vysledkovka.py b/seminar/migrations/0106_remove_cislo_verejna_vysledkovka.py index edccf3c9..e9e652b3 100644 --- a/seminar/migrations/0106_remove_cislo_verejna_vysledkovka.py +++ b/seminar/migrations/0106_remove_cislo_verejna_vysledkovka.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.15 on 2022-10-09 11:04 from django.db import migrations -from seminar.models import Deadline +from tvorba.models import Deadline def vrat_verejnost(apps, schema_editor): diff --git a/seminar/models.py b/seminar/models.py new file mode 100644 index 00000000..8c034a82 --- /dev/null +++ b/seminar/models.py @@ -0,0 +1,12 @@ +# Tento soubor slouží pouze pro shell a podobné. Nikde neimportovat v kódu! +from galerie.models import * +from header_fotky.models import * +from korektury.models import * +from novinky.models import * +from odevzdavatko.models import * +from personalni.models import * +from prednasky.models import * +from soustredeni.models import * +from treenode.models import * +from tvorba.models import * +from various.models import * diff --git a/seminar/models/__init__.py b/seminar/models/__init__.py deleted file mode 100644 index bd660e0c..00000000 --- a/seminar/models/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -from various.models import Nastaveni -from personalni.models import Organizator, Resitel, Skola, Prijemce, Osoba -from soustredeni.models import Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Konfera, Konfery_Ucastnici -from novinky.models import Novinky -from odevzdavatko.models import Reseni, PrilohaReseni, Reseni_Resitele, Hodnoceni -from tvorba.models import ZmrazenaVysledkovka, Deadline, Cislo, Rocnik, Pohadka, Tema, Problem, Problemy_Opravovatele, Uloha, Clanek -from treenode.models import UlohaVzorakNode, UlohaZadaniNode, CisloNode, TemaVCisleNode, OrgTextNode, Obrazek, RocnikNode, PohadkaNode, TextNode, MezicisloNode, ReseniNode, CastNode, Text, TreeNode - -# Kvůli migr. 0041 -from soustredeni.models import generate_filename_konfera -# migr. 0001 -from odevzdavatko.models import generate_filename -# migr. 0031, 0032, 0081 -from tvorba.models import cislo_pdf_filename -# migr. 0082 -from tvorba.models import cislo_png_filename -# migr 0100 (hack) -import tvorba.models as tvorba -- 2.39.5 From 71948383d229280656d2795d7455aaa2705314c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 20:19:34 +0100 Subject: [PATCH 20/22] Upraven popis aplikace seminar --- seminar/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/seminar/__init__.py b/seminar/__init__.py index 09ee5004..849682d8 100644 --- a/seminar/__init__.py +++ b/seminar/__init__.py @@ -1,6 +1,4 @@ """ -Zde bývalo vše. Teď tu zbývají všechny modely a části webu jako archiv, -přehled orgů, aktuální (k aktuálnímu číslu) věci, titulka a jak řešit. - -Také je tu generování testovacích (lokálních) dat. -""" \ No newline at end of file +Zde bývalo vše. Teď tu zbývají migrace. +A kód pro `import seminar.models as m` pro ./manage.py shell. +""" -- 2.39.5 From 227d438ebd8e7e1ff3a2efc6bbd37d233ec540ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 20:22:04 +0100 Subject: [PATCH 21/22] =?UTF-8?q?Posledn=C3=AD=20obrana=20proti=20importov?= =?UTF-8?q?=C3=A1n=C3=AD=20seminar.models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/seminar/models.py b/seminar/models.py index 8c034a82..efb5e48c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -1,4 +1,7 @@ # Tento soubor slouží pouze pro shell a podobné. Nikde neimportovat v kódu! + +print("Naimportoval jsi `seminar.models`. Pevně věřím, že to nebylo nikde v kódu. Díky.") + from galerie.models import * from header_fotky.models import * from korektury.models import * -- 2.39.5 From bf726df1170bc0ed9e2dfb709c406c7369e524ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 5 Nov 2024 20:30:55 +0100 Subject: [PATCH 22/22] =?UTF-8?q?P=C5=99eps=C3=A1n=C3=AD=20loggeru,=20prot?= =?UTF-8?q?o=C5=BEe=20to=20vypad=C3=A1=20l=C3=A9pe=20(i=20kdyby=20to=20nef?= =?UTF-8?q?ungovalo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personalni/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/personalni/forms.py b/personalni/forms.py index 50b9d705..350d9b7b 100644 --- a/personalni/forms.py +++ b/personalni/forms.py @@ -147,7 +147,7 @@ class PrihlaskaForm(PasswordResetForm, UdajeForm): class ProfileEditForm(UdajeForm): - err_logger = logging.getLogger('personalni.edit.problem') + err_logger = logging.getLogger('personalni.prihlaska.problem.edit') username = forms.CharField( label='Přihlašovací jméno', max_length=256, -- 2.39.5