Rozstřílení seminářové aplikace #60
|  | @ -51,6 +51,9 @@ urlpatterns = [ | ||||||
| 	# Aesop (ma vlastni podadresare) | 	# Aesop (ma vlastni podadresare) | ||||||
| 	path('', include('aesop.urls')), | 	path('', include('aesop.urls')), | ||||||
| 
 | 
 | ||||||
|  | 	# Various = co se nevešlo jinam | ||||||
|  | 	path('', include('various.urls')), | ||||||
|  | 
 | ||||||
| 	# REST API | 	# REST API | ||||||
| #	path('api/', include(router.urls)), | #	path('api/', include(router.urls)), | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ import seminar.models as m | ||||||
| from . import forms as f | from . import forms as f | ||||||
| from .forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm | from .forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm | ||||||
| from seminar.utils import resi_v_rocniku | from seminar.utils import resi_v_rocniku | ||||||
| from seminar.views import formularOKView | from various.views.pomocne import formularOKView | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ from datetime import date | ||||||
| import logging | import logging | ||||||
| import csv | import csv | ||||||
| 
 | 
 | ||||||
| from seminar.views import formularOKView | from various.views.pomocne import formularOKView | ||||||
| from various.autentizace.views import LoginView | from various.autentizace.views import LoginView | ||||||
| from various.autentizace.utils import posli_reset_hesla | from various.autentizace.utils import posli_reset_hesla | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| {% extends 'base.html' %} |  | ||||||
| 
 |  | ||||||
| {% load humanize %} |  | ||||||
| {% load static %} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| {% block content %} |  | ||||||
| 
 |  | ||||||
| <div class=jakresit> |  | ||||||
| 
 |  | ||||||
| {% include 'seminar/jakresit/jakresit_1.svg' %} |  | ||||||
| {% include 'seminar/jakresit/jakresit_2.svg' %} |  | ||||||
| {% include 'seminar/jakresit/jakresit_3.svg' %} |  | ||||||
| 
 |  | ||||||
| </div> |  | ||||||
| {% endblock %} |  | ||||||
|  | @ -65,19 +65,11 @@ urlpatterns = [ | ||||||
| 		org_required(views.TitulyView), | 		org_required(views.TitulyView), | ||||||
| 		name='seminar_cislo_titul' | 		name='seminar_cislo_titul' | ||||||
| 	), | 	), | ||||||
| 	path( |  | ||||||
| 		'stav', |  | ||||||
| 		org_required(views.StavDatabazeView), |  | ||||||
| 		name='stav_databaze' |  | ||||||
| 	), |  | ||||||
| 	path( | 	path( | ||||||
| 		'cislo/<int:trocnik>.<str:tcislo>/odmeny/<int:frocnik>.<str:fcislo>/', | 		'cislo/<int:trocnik>.<str:tcislo>/odmeny/<int:frocnik>.<str:fcislo>/', | ||||||
| 		org_required(views.OdmenyView.as_view()), | 		org_required(views.OdmenyView.as_view()), | ||||||
| 		name="seminar_archiv_odmeny"), | 		name="seminar_archiv_odmeny"), | ||||||
| 
 | 
 | ||||||
| 	path('', views.TitulniStranaView.as_view(), name='titulni_strana'), |  | ||||||
| 	path('jak-resit/', views.JakResitView.as_view(), name='jak_resit'), |  | ||||||
| 
 |  | ||||||
| 	# Dočasné & neodladěné: | 	# Dočasné & neodladěné: | ||||||
| 	path( | 	path( | ||||||
| 		'hidden/hromadne_pridani', | 		'hidden/hromadne_pridani', | ||||||
|  |  | ||||||
|  | @ -18,7 +18,6 @@ from seminar.models import Problem, Cislo, Reseni, Nastaveni, Rocnik, \ | ||||||
| #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from seminar import utils | from seminar import utils | ||||||
| from treenode import treelib | from treenode import treelib | ||||||
| from novinky.views import spravne_novinky |  | ||||||
| import treenode.templatetags as tnltt | import treenode.templatetags as tnltt | ||||||
| import treenode.serializers as vr | import treenode.serializers as vr | ||||||
| from vysledkovky.utils import body_resitelu, VysledkovkaCisla, \ | from vysledkovky.utils import body_resitelu, VysledkovkaCisla, \ | ||||||
|  | @ -37,7 +36,6 @@ from django.conf import settings | ||||||
| import unicodedata | import unicodedata | ||||||
| import logging | import logging | ||||||
| import time | import time | ||||||
| from collections.abc import Sequence |  | ||||||
| import http | import http | ||||||
| 
 | 
 | ||||||
| from seminar.utils import aktivniResitele | from seminar.utils import aktivniResitele | ||||||
|  | @ -226,33 +224,6 @@ def aktualni_temata(rocnik): | ||||||
| 	return Tema.objects.filter(rocnik=rocnik, stav='zadany').order_by('kod') | 	return Tema.objects.filter(rocnik=rocnik, stav='zadany').order_by('kod') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class TitulniStranaView(generic.ListView): |  | ||||||
| 	template_name= 'seminar/titulnistrana/titulnistrana.html' |  | ||||||
| 
 |  | ||||||
| 	def get_queryset(self): |  | ||||||
| 		return spravne_novinky(self.request)[:3] |  | ||||||
| 
 |  | ||||||
| 	def get_context_data(self, **kwargs): |  | ||||||
| 		context = super(TitulniStranaView, self).get_context_data(**kwargs) |  | ||||||
| 		nastaveni = get_object_or_404(Nastaveni) |  | ||||||
| 
 |  | ||||||
| 		deadline = m.Deadline.objects.filter(deadline__gte=timezone.now()).order_by("deadline").first() |  | ||||||
| 		context['nejblizsi_deadline'] = deadline |  | ||||||
| 
 |  | ||||||
| 		# Aktuální témata |  | ||||||
| 		nazvy_a_odkazy_na_aktualni_temata = [] |  | ||||||
| 		akt_temata = aktualni_temata(nastaveni.aktualni_rocnik) |  | ||||||
| 
 |  | ||||||
| 		for tema in akt_temata: |  | ||||||
| 			# FIXME: netuším, jestli funguje tema.verejne_url(), nemáme testdata na témátka - je to asi url vzhledem k ročníku |  | ||||||
| 			nazvy_a_odkazy_na_aktualni_temata.append({'nazev':tema.nazev,'url':tema.verejne_url()}) |  | ||||||
| 
 |  | ||||||
| 		context['aktualni_temata'] = nazvy_a_odkazy_na_aktualni_temata |  | ||||||
| 
 |  | ||||||
| 		print(context) |  | ||||||
| 
 |  | ||||||
| 		return context |  | ||||||
| 
 |  | ||||||
| ### Co je M&M | ### Co je M&M | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -652,47 +623,7 @@ class ClankyResitelView(generic.ListView): | ||||||
| #	queryset = Problem.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod') | #	queryset = Problem.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### Status |  | ||||||
| 
 | 
 | ||||||
| def StavDatabazeView(request): |  | ||||||
| #	nastaveni = Nastaveni.objects.get() |  | ||||||
| 	problemy = utils.seznam_problemu() |  | ||||||
| 	muzi = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_MUZSKE) |  | ||||||
| 	zeny = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_ZENSKE) |  | ||||||
| 	return render(request, 'seminar/stav_databaze.html', |  | ||||||
| 			{ |  | ||||||
| #				'nastaveni': nastaveni, |  | ||||||
| 				'problemy': problemy, |  | ||||||
| 
 |  | ||||||
| 				'resitele': Resitel.objects.all(), |  | ||||||
| 				'muzi': muzi, |  | ||||||
| 				'zeny': zeny, |  | ||||||
| 				'jmena_muzu': utils.histogram([r.osoba.jmeno for r in muzi]), |  | ||||||
| 				'jmena_zen': utils.histogram([r.osoba.jmeno for r in zeny]), |  | ||||||
| 			}) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Interní, nemá se nikdy objevit v urls (jinak to účastníci vytrolí) |  | ||||||
| def formularOKView(request, text='', dalsi_odkazy: Sequence[tuple[str, str]] = ()): |  | ||||||
| 	template_name = 'seminar/formular_ok.html' |  | ||||||
| 	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')), |  | ||||||
| 	] |  | ||||||
| 	context = { |  | ||||||
| 		'odkazy': odkazy, |  | ||||||
| 				'text': text, |  | ||||||
| 	} |  | ||||||
| 	return render(request, template_name, context) |  | ||||||
| 
 |  | ||||||
| #------------------ Jak řešit - možná má být udělané úplně jinak |  | ||||||
| 
 |  | ||||||
| class JakResitView(generic.ListView): |  | ||||||
| 	template_name = 'seminar/jakresit/jak-resit.html' |  | ||||||
| 
 |  | ||||||
| 	def get_queryset(self): |  | ||||||
| 		return None |  | ||||||
| 
 | 
 | ||||||
| class AktualniRocnikRedirectView(RedirectView): | class AktualniRocnikRedirectView(RedirectView): | ||||||
| 	permanent=False | 	permanent=False | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| from django.urls import reverse | from django.urls import reverse | ||||||
| from django.views.generic import FormView, ListView | from django.views.generic import FormView, ListView | ||||||
| 
 | 
 | ||||||
| from seminar.views import formularOKView | from various.views.pomocne import formularOKView | ||||||
| from .forms import SifrovackaForm, NapovedaForm | from .forms import SifrovackaForm, NapovedaForm | ||||||
| from .models import OdpovedUcastnika, SpravnaOdpoved, Napoveda, NapovezenoUcastnikovi | from .models import OdpovedUcastnika, SpravnaOdpoved, Napoveda, NapovezenoUcastnikovi | ||||||
| from personalni.models import Resitel | from personalni.models import Resitel | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								various/templates/various/jakresit/jak-resit.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,16 @@ | ||||||
|  | {% extends 'base.html' %} | ||||||
|  | 
 | ||||||
|  | {% load humanize %} | ||||||
|  | {% load static %} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  | 
 | ||||||
|  | <div class=jakresit> | ||||||
|  | 
 | ||||||
|  | {% include 'various/jakresit/jakresit_1.svg' %} | ||||||
|  | {% include 'various/jakresit/jakresit_2.svg' %} | ||||||
|  | {% include 'various/jakresit/jakresit_3.svg' %} | ||||||
|  | 
 | ||||||
|  | </div> | ||||||
|  | {% endblock %} | ||||||
| Before Width: | Height: | Size: 664 KiB After Width: | Height: | Size: 664 KiB | 
| Before Width: | Height: | Size: 689 KiB After Width: | Height: | Size: 689 KiB | 
| Before Width: | Height: | Size: 767 KiB After Width: | Height: | Size: 767 KiB | 
|  | @ -10,7 +10,7 @@ | ||||||
|   <p> |   <p> | ||||||
|     Na této stránce velmi intenzivně pracujeme. |     Na této stránce velmi intenzivně pracujeme. | ||||||
|     Za dočasnou nedostupnost se omlouváme. |     Za dočasnou nedostupnost se omlouváme. | ||||||
|     Zkuste přejít na <a href="/">titulní stránku</a> |     Zkuste přejít na <a href="/static">titulní stránku</a> | ||||||
|     nebo se podívat na <a href="{% url 'seminar_aktualni_zadani' %}">aktuální zadání</a>. |     nebo se podívat na <a href="{% url 'seminar_aktualni_zadani' %}">aktuální zadání</a>. | ||||||
|   </p> |   </p> | ||||||
|   <img src="{% static '404.png' %}"> |   <img src="{% static '404.png' %}"> | ||||||
| Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB | 
|  | @ -79,7 +79,7 @@ function sousdeadline() { | ||||||
| <div class="graf"> | <div class="graf"> | ||||||
| 
 | 
 | ||||||
| <div class="graf-svg"> | <div class="graf-svg"> | ||||||
|   {% include 'seminar/titulnistrana/graph.svg' %} <!-- TODO: aby to nemuselo být v templates --> |   {% include 'various/titulnistrana/graph.svg' %} <!-- TODO: aby to nemuselo být v templates --> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
|   <span class="zjistit_vic"> |   <span class="zjistit_vic"> | ||||||
							
								
								
									
										9
									
								
								various/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,9 @@ | ||||||
|  | from django.urls import path | ||||||
|  | from .views.final import TitulniStranaView, JakResitView, StavDatabazeView | ||||||
|  | from seminar.utils import org_required | ||||||
|  | 
 | ||||||
|  | urlpatterns = [ | ||||||
|  | 	path('', TitulniStranaView.as_view(), name='titulni_strana'), | ||||||
|  | 	path('jak-resit/', JakResitView.as_view(), name='jak_resit'), | ||||||
|  | 	path('stav', org_required(StavDatabazeView), name='stav_databaze'), | ||||||
|  | ] | ||||||
							
								
								
									
										73
									
								
								various/views/final.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,73 @@ | ||||||
|  | """ | ||||||
|  | Stránky, které se mi nepovedlo lépe zařadit. | ||||||
|  | 
 | ||||||
|  | Oproti `./pomocne.py` se tyto views používají přímo ve various | ||||||
|  | a naopak importují spoustu věcí odjinud | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from django.shortcuts import get_object_or_404, render | ||||||
|  | from django.utils import timezone | ||||||
|  | from django.views import generic | ||||||
|  | 
 | ||||||
|  | import novinky.views | ||||||
|  | import seminar.utils | ||||||
|  | import seminar.views | ||||||
|  | from personalni.models import Resitel | ||||||
|  | from seminar import models as m | ||||||
|  | 
 | ||||||
|  | from ..models import Nastaveni | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TitulniStranaView(generic.ListView): | ||||||
|  | 	template_name = 'various/titulnistrana/titulnistrana.html' | ||||||
|  | 
 | ||||||
|  | 	def get_queryset(self): | ||||||
|  | 		return novinky.views.spravne_novinky(self.request)[:3] | ||||||
|  | 
 | ||||||
|  | 	def get_context_data(self, **kwargs): | ||||||
|  | 		context = super(TitulniStranaView, self).get_context_data(**kwargs) | ||||||
|  | 		nastaveni = get_object_or_404(Nastaveni) | ||||||
|  | 
 | ||||||
|  | 		deadline = m.Deadline.objects.filter( | ||||||
|  | 			deadline__gte=timezone.now()).order_by("deadline").first() | ||||||
|  | 		context['nejblizsi_deadline'] = deadline | ||||||
|  | 
 | ||||||
|  | 		# Aktuální témata | ||||||
|  | 		nazvy_a_odkazy_na_aktualni_temata = [] | ||||||
|  | 		akt_temata = seminar.views.aktualni_temata(nastaveni.aktualni_rocnik) | ||||||
|  | 
 | ||||||
|  | 		for tema in akt_temata: | ||||||
|  | 			# FIXME: netuším, jestli funguje tema.verejne_url(), nemáme testdata na témátka - je to asi url vzhledem k ročníku | ||||||
|  | 			nazvy_a_odkazy_na_aktualni_temata.append({ | ||||||
|  | 				'nazev': tema.nazev, | ||||||
|  | 				'url': tema.verejne_url() | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 		context['aktualni_temata'] = nazvy_a_odkazy_na_aktualni_temata | ||||||
|  | 
 | ||||||
|  | 		return context | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class JakResitView(generic.ListView): | ||||||
|  | 	template_name = 'various/jakresit/jak-resit.html' | ||||||
|  | 
 | ||||||
|  | 	def get_queryset(self): | ||||||
|  | 		return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### Status | ||||||
|  | def StavDatabazeView(request): | ||||||
|  | 	# nastaveni = Nastaveni.objects.get() | ||||||
|  | 	problemy = seminar.utils.seznam_problemu() | ||||||
|  | 	muzi = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_MUZSKE) | ||||||
|  | 	zeny = Resitel.objects.filter(osoba__osloveni=m.Osoba.OSLOVENI_ZENSKE) | ||||||
|  | 	return render(request, 'various/stav_databaze.html', { | ||||||
|  | 		# 'nastaveni': nastaveni, | ||||||
|  | 		'problemy': problemy, | ||||||
|  | 
 | ||||||
|  | 		'resitele': Resitel.objects.all(), | ||||||
|  | 		'muzi': muzi, | ||||||
|  | 		'zeny': zeny, | ||||||
|  | 		'jmena_muzu': seminar.utils.histogram([r.osoba.jmeno for r in muzi]), | ||||||
|  | 		'jmena_zen': seminar.utils.histogram([r.osoba.jmeno for r in zeny]), | ||||||
|  | 	}) | ||||||
							
								
								
									
										26
									
								
								various/views/pomocne.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,26 @@ | ||||||
|  | """ | ||||||
|  | Stránky, které se mi nepovedlo lépe zařadit. | ||||||
|  | 
 | ||||||
|  | Oproti `./final.py` se tyto views importují odjinud | ||||||
|  | tedy ideálně neimportovat sem nic od jinud | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from typing import Sequence | ||||||
|  | 
 | ||||||
|  | from django.shortcuts import render | ||||||
|  | from django.urls import reverse | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Interní, nemá se nikdy objevit v urls (jinak to účastníci vytrolí) | ||||||
|  | def formularOKView(request, text='', dalsi_odkazy: Sequence[tuple[str, str]] = ()): | ||||||
|  | 	template_name = 'seminar/formular_ok.html' | ||||||
|  | 	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')), | ||||||
|  | 	] | ||||||
|  | 	context = { | ||||||
|  | 		'odkazy': odkazy, | ||||||
|  | 		'text': text, | ||||||
|  | 	} | ||||||
|  | 	return render(request, template_name, context) | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| from django.views.generic import FormView, ListView | from django.views.generic import FormView, ListView | ||||||
| 
 | 
 | ||||||
| from seminar.models import Osoba | from seminar.models import Osoba | ||||||
| from seminar.views import formularOKView | from various.views.pomocne import formularOKView | ||||||
| from .forms import UcastnikVyrociForm | from .forms import UcastnikVyrociForm | ||||||
| from .models import UcastnikVyroci | from .models import UcastnikVyroci | ||||||
| 
 | 
 | ||||||
|  |  | ||||||