diff --git a/api/views/autocomplete.py b/api/views/autocomplete.py index 84a915bf..edc81ff7 100644 --- a/api/views/autocomplete.py +++ b/api/views/autocomplete.py @@ -70,23 +70,17 @@ 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): - nastaveni = get_object_or_404(m.Nastaveni) - rocnik = nastaveni.aktualni_rocnik - # Od tohoto místa dál jsem zkoušel spoustu variací podle https://django-polymorphic.readthedocs.io/en/stable/advanced.html - temaQ = Q(Tema___rocnik = rocnik, stav=m.Problem.STAV_ZADANY) - ulohaQ = Q(Uloha___cislo_zadani__rocnik = rocnik, stav=m.Problem.STAV_ZADANY) - clanekQ = Q(Clanek___cislo__rocnik = rocnik, stav=m.Problem.STAV_ZADANY) - qs = m.Problem.objects.filter(temaQ | ulohaQ | clanekQ) - #print(temata, ulohy, clanky) - #ulohy.union(temata, all=True) - #print(ulohy) - #ulohy.union(clanky, all=True) - #print(ulohy) - #qs = ulohy - print(qs) + qs = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY) if self.q: qs = qs.filter( Q(nazev__icontains=self.q)) + + nadproblem_id = int(self.forwarded.get("nadproblem_id", -1)) + if nadproblem_id != -1: + # Seřadíme tak, aby ty s nadproblem==None byly dole (větší motivace tam naklikat konkrétní úlohy) a pak nějak rozumně. + # Tohle je řazení pro odevzdávátko, kde je definován nadproblém, proto je to v tomto ifu. (Jinde si to netroufám řadit) + qs = qs.order_by("nadproblem", "kod", "nazev") + qs = list(filter(lambda problem: problem.hlavni_problem.id == nadproblem_id, qs)) return qs class ProblemAutocomplete(autocomplete.Select2QuerySetView): diff --git a/data/sitetree.json b/data/sitetree.json index 7cfa87b0..5332c20f 100644 --- a/data/sitetree.json +++ b/data/sitetree.json @@ -437,7 +437,7 @@ "insitetree": true, "parent": 21, "sort_order": 36, - "title": "Poslat řešení", + "title": "Nahrát řešení", "tree": 1, "url": "seminar_nahraj_reseni", "urlaspattern": true @@ -719,7 +719,7 @@ "insitetree": true, "parent": 21, "sort_order": 36, - "title": "Nahrát řešení", + "title": "Vložit řešení", "tree": 1, "url": "seminar_vloz_reseni", "urlaspattern": true @@ -1026,6 +1026,36 @@ "model": "sitetree.treeitem", "pk": 51 }, + { + "fields": { + "access_guest": false, + "access_loggedin": false, + "access_perm_type": 1, + "access_permissions": [ + [ + "resitel", + "auth", + "user" + ] + ], + "access_restricted": true, + "alias": null, + "description": "", + "hidden": false, + "hint": "", + "inbreadcrumbs": true, + "inmenu": true, + "insitetree": true, + "parent": 23, + "sort_order": 52, + "title": "Nahrát řešení k nadproblému {{nadproblem_id}}", + "tree": 1, + "url": "seminar_nahraj_reseni nadproblem_id", + "urlaspattern": true + }, + "model": "sitetree.treeitem", + "pk": 52 + }, { "fields": { "access_guest": false, @@ -1041,13 +1071,13 @@ "inmenu": true, "insitetree": true, "parent": 28, - "sort_order": 52, + "sort_order": 53, "title": "Přidat PDF", "tree": 1, "url": "/admin/korektury/korekturovanepdf/add/", "urlaspattern": false }, "model": "sitetree.treeitem", - "pk": 52 + "pk": 53 } -] \ No newline at end of file +] diff --git a/docs/dalsi_soubory.rst b/docs/dalsi_soubory.rst index 1a59ee15..627a59d7 100644 --- a/docs/dalsi_soubory.rst +++ b/docs/dalsi_soubory.rst @@ -28,7 +28,7 @@ Generuje se za pomocí:: nebo (v případě meníčka):: - ./manage.py dumpdata sitetree --natrual-foreign > data/sitetree_new.json + ./manage.py dumpdata sitetree --natural-foreign > data/sitetree_new.json ./fix_json.py data/sitetree_new.json data/sitetree.json deploy_v2 diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 3833ff92..a43bf310 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -1260,3 +1260,22 @@ label[for=id_skola] { .bodovani>input { width: 4em; } + + +/* Select2 používaný hlavně multiple selectem. Přidání checkboxů a změna barvy. */ +/* Podle https://stackoverflow.com/a/48290544 */ +/* U autocomplete.ModelSelect2Multiple vyžaduje 'data-dropdown-css-class': 's2m-se-zaskrtavatky' */ +.s2m-se-zaskrtavatky .select2-results__option[aria-selected=true]:before { + content: '☑ '; + padding: 0 0 0 8px; +} + +.s2m-se-zaskrtavatky .select2-results__option[aria-selected=false]:before { + content: '◻ '; + padding: 0 0 0 8px; +} + +/* Oranžové zvýraznění v Select2 */ +.select2-results__option--highlighted { + background-color: #e84e10 !important; +} diff --git a/odevzdavatko/__init__.py b/odevzdavatko/__init__.py index a4ee2679..ee78a49b 100644 --- a/odevzdavatko/__init__.py +++ b/odevzdavatko/__init__.py @@ -4,8 +4,8 @@ Obsahuje vše, co se týká odevzdávání (+ nahrávání) a opravování řeš Slovníček: Moje řešení = Přehled řešení = Řešení, která odevzdal aktuálního uživatel sám. Došlá řešení = Tabulka + seznam + detail + ... = Řešení, která poslal někdo jiný. - Poslat řešení = Odevdat mé řešení. (Tj. řešení se vztahem k aktuálnímu uživateli.) - Nahrát řešení = Nahrání řešení bez vztahu k aktuálnímu uživateli. + Nahrát řešení = Odevdat mé řešení. (Tj. řešení se vztahem k aktuálnímu uživateli.) + Vlož řešení = Vložit řešení bez vztahu k aktuálnímu uživateli. TODO: Místo vložit řešení v nahrávání a posílání řešení dát něco jiného? -""" \ No newline at end of file +""" diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 0b93d555..074bc6da 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -29,6 +29,8 @@ class PosliReseniForm(forms.Form): attrs={ 'data-placeholder--id': '-1', 'data-placeholder--text': '---', + 'data-close-on-select': 'false', + 'data-dropdown-css-class': 's2m-se-zaskrtavatky', 'data-allow-clear': 'true' }, ), @@ -43,6 +45,8 @@ class PosliReseniForm(forms.Form): url='autocomplete_resitel', attrs = {'data-placeholder--id': '-1', 'data-placeholder--text' : '---', + 'data-close-on-select': 'false', + 'data-dropdown-css-class': 's2m-se-zaskrtavatky', 'data-allow-clear': 'true'}) ) @@ -62,12 +66,6 @@ class PosliReseniForm(forms.Form): #poznamka = models.TextField('neveřejná poznámka', blank=True, # help_text='Neveřejná poznámka k řešení (plain text)') - #TODO body do cisla - #TODO prilohy - - ##def __init__(self, *args, **kwargs): - ## super().__init__(*args, **kwargs) - ## #self.fields['favorite_color'] = forms.ChoiceField(choices=[(color.id, color.name) for color in Resitel.objects.all()]) class NahrajReseniForm(forms.ModelForm): class Meta: @@ -80,23 +78,40 @@ class NahrajReseniForm(forms.ModelForm): url='autocomplete_problem_odevzdatelny', attrs = {'data-placeholder--id': '-1', 'data-placeholder--text' : '---', + 'data-close-on-select': 'false', + 'data-dropdown-css-class': 's2m-se-zaskrtavatky', 'data-allow-clear': 'true'}, + forward=["nadproblem_id"], ), 'resitele': autocomplete.ModelSelect2Multiple( url='autocomplete_resitel_public', attrs = {'data-placeholder--id': '-1', 'data-placeholder--text' : '---', + 'data-close-on-select': 'false', + 'data-dropdown-css-class': 's2m-se-zaskrtavatky', 'data-allow-clear': 'true'}, ) } + nadproblem_id = forms.IntegerField(required=False, disabled=True, widget=forms.HiddenInput()) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # FIXME Z nějakého důvodu se do této třídy dostaneme i bez resitele if 'resitele' in self.fields: # FIXME Mnohem hezčí by to bylo u definice resitele výše, ale nepodařilo se mi to. self.fields['resitele'].required = False + self.fields['resitele'].label = "Další autoři" + if 'problem' in self.fields: + self.fields['problem'].label = "Všechny řešené problémy" + + def clean_problem(self): + problem = self.cleaned_data.get('problem') + for p in problem: + if p.stav != m.Problem.STAV_ZADANY: + raise forms.ValidationError("Problém " + str(p) + " již nelze řešit!") + return problem ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, form = NahrajReseniForm, diff --git a/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html b/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html index 739340c3..ca326d67 100644 --- a/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html +++ b/odevzdavatko/templates/odevzdavatko/nahraj_reseni.html @@ -7,19 +7,20 @@ {% block content %}
Když řešení různých témátek vložíš každé zvlášť, lépe se v nich vyznáme a třeba ti je i rychleji opravíme.
- -Pokud řešíte ve více lidech, je nutné přidat tyto lidi jako „Autory řešení“. V tomto poli se vyhledává podle přezdívek, které si lze nastavit v „Osobní údaje“. Sebe vyplňovat nemusíte a za skupinu odevzdávejte pouze jednou (ne každý sám).
- -