diff --git a/aesop/apps.py b/aesop/apps.py index c2d509f1..4e8b4787 100644 --- a/aesop/apps.py +++ b/aesop/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/aesop/urls.py b/aesop/urls.py index f39a0ba8..946a873b 100644 --- a/aesop/urls.py +++ b/aesop/urls.py @@ -1,3 +1,10 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``aesop-export/mam-rocnik-.csv`` (seminar_export_rocnik) :class:`~aesop.views.ExportRocnikView` +- ``aesop-export/mam-sous-.csv`` (seminar_export_sous) :class:`~aesop.views.ExportSousView` +- ``aesop-export/index.csv`` (seminar_export_index) :class:`~aesop.views.ExportIndexView` +""" from django.urls import path from aesop import views diff --git a/aesop/views.py b/aesop/views.py index d815b5d5..4d1748b7 100644 --- a/aesop/views.py +++ b/aesop/views.py @@ -1,3 +1,8 @@ +""" +Soubor sloužící k deklaraci jednotlivých „views“ (nejčastěji funkce beroucí request +a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo +třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`) +""" import django from django.shortcuts import get_object_or_404 from django.http import HttpResponse diff --git a/api/apps.py b/api/apps.py index d87006dd..6a2bdbc4 100644 --- a/api/apps.py +++ b/api/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/api/urls.py b/api/urls.py index e869df80..23aafe36 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,3 +1,15 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``api/expor/skoly/`` (export_skoly) :func:`~api.views.exports.exportSkolView` +- ``api/autocomplete/skola/`` (autocomplete_skola) :class:`~api.views.autocomplete.SkolaAutocomplete` +- ``api/autocomplete/resitel/`` (autocomplete_resitel) :class:`~api.views.autocomplete.ResitelAutocomplete` +- ``api/autocomplete/problem/odevzdatelny`` (autocomplete_problem_odevzdatelny) :class:`~api.views.autocomplete.OdevzdatelnyProblemAutocomplete` + +Na autocomplete v3 čeká: + +- ``autocomplete/organizatori/`` (seminar_autocomplete_organizator) :class:`~api.views.autocomplete.OrganizatorAutocomplete` +""" from django.urls import path from . import views from seminar.utils import org_required diff --git a/api/views/__init__.py b/api/views/__init__.py index fc00554e..13ce91ba 100644 --- a/api/views/__init__.py +++ b/api/views/__init__.py @@ -1,2 +1,7 @@ +""" +Soubory sloužící k deklaraci jednotlivých „views“ (nejčastěji funkce beroucí request +a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo +třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`) +""" from .autocomplete import * from .exports import * diff --git a/api/views/autocomplete.py b/api/views/autocomplete.py index 630e9106..217df008 100644 --- a/api/views/autocomplete.py +++ b/api/views/autocomplete.py @@ -1,3 +1,6 @@ +""" + Views k :mod:`dal.autocomplete` pro vyhledávání objektů nějaké třídy v databázi. +""" from dal import autocomplete from django.shortcuts import get_object_or_404 from django.db.models import Q @@ -7,6 +10,7 @@ from .helpers import LoginRequiredAjaxMixin # TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr) 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() @@ -25,6 +29,7 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView): return qs 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() if self.q: @@ -40,6 +45,7 @@ class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetVie return qs 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 diff --git a/api/views/exports.py b/api/views/exports.py index 6df7d32b..5c1d57af 100644 --- a/api/views/exports.py +++ b/api/views/exports.py @@ -2,6 +2,9 @@ import seminar.models as m from django.core import serializers as ser from django.http import HttpResponse def exportSkolView(request): + """ + „view“, který vrací json se seznamem škol, u kterých je uvedeno: 'id', 'izo', 'nazev', 'kratky_nazev', 'ulice', 'mesto', 'psc', 'stat', 'je_zs', 'je_ss' + """ # Některé fieldy nechceme: Kontaktní osoby, AESOP ID, org poznámky. fields = ('id', 'izo', 'nazev', 'kratky_nazev', 'ulice', 'mesto', 'psc', 'stat', 'je_zs', 'je_ss') # TODO: Použít JSONL, aby protistrana mohla číst po řádkách a nesežralo to tunu paměti úplně hned diff --git a/api/views/helpers.py b/api/views/helpers.py index 652344bc..cecbb53f 100644 --- a/api/views/helpers.py +++ b/api/views/helpers.py @@ -2,6 +2,9 @@ from django.http import JsonResponse class LoginRequiredAjaxMixin(object): + """ + Objekt přidávající povinnost být přihlášený k zobrazení daného view. + """ def dispatch(self, request, *args, **kwargs): #if request.is_ajax() and not request.user.is_authenticated: # Pokud to otevřu jako stránku, tak se omezení neuplatní, takže to asi nechceme if not request.user.is_authenticated: diff --git a/docs/dalsi_soubory.rst b/docs/dalsi_soubory.rst new file mode 100644 index 00000000..1a59ee15 --- /dev/null +++ b/docs/dalsi_soubory.rst @@ -0,0 +1,92 @@ +Další soubory/složky v kořenovém adresáři +========================================= + +media +----- +Složka, kam django nahrává soubory „jako by je nahrávalo do databáze“. + +static +------ +Složka, kam django nakopíruje všechno ze složek static a pak na to z templatů / kódu jde ukazovat pomocí ``static``. + +_git_hooks +---------- +Hooky do gitu pro kontrolu Pythoního stylu. Především ``flake8``. + +Zbylo tu z minulosti mamwebu. + +data +---- +Obsahuje data, která patří do databáze, ale jsou přímo součástí webu jako +takového. Aktuálně jsou to statické stránky, meníčko a rozložení obrázků +v pozadí meníčka. + +Generuje se za pomocí:: + + ./manage.py dumpdata flatpages > data/flat_new.json + ./fix_json.py data/flat_new.json data/flat.json + +nebo (v případě meníčka):: + + ./manage.py dumpdata sitetree --natrual-foreign > data/sitetree_new.json + ./fix_json.py data/sitetree_new.json data/sitetree.json + +deploy_v2 +--------- +Věci, které byly potřeba při nasazování nového (2021) webu. + +docs +---- +Zde je dokumentace webu. Viz :ref:`Sphinx na našem webu`. + +setup +----- +Tato složka obsahuje různé konfiguráky potřebné k rozběhnutí webu na serveru. + +vue_frontend +------------ +Obsahuje první pokusy o editory treenodů ve vue. + +.gitignore +---------- +Klasické `.gitignore`_ + +.. _.gitignore: https://git-scm.com/docs/gitignore + +checklinks.sh +------------- +„Týrací“ skript na kontrolu, že nic, kam se lze proklikat na webu, nehází chybu. + +constraints.txt +--------------- +Obsahuje omezení na :ref:`requirements.txt`. + +convert_spaces_to_tabs.sh +------------------------- +Skript na změnu odsazování. + +db-local.sqlite3 +---------------- +Lokální databáze (na serveru není). + +diff_db_backup.sh +----------------- +Nevím. Typoval bych skript na diff záloh (resp. dumpů) databáze. + +Makefile +-------- +Klasické `Makefile`_. Obsahuje například vytvoření virtual_env, instalaci a nasazování webu. + +.. _Makefile: https://www.gnu.org/software/make/manual/make.html + +manage.py +--------- +Základní soubor djanga. + +README.md +--------- +Většina je spíš zbytek po bývalých webařích. + +requirements.txt +---------------- +Seznam balíčků, které jsou potřeba pro běh mamwebu. (Cílem je vytvoření virtualenvu se všemi těmito balíčky, např. pomocí daného příkazu v :ref:`Makefile`.) diff --git a/docs/default_doc.rst b/docs/default_doc.rst new file mode 100644 index 00000000..9175d632 --- /dev/null +++ b/docs/default_doc.rst @@ -0,0 +1,55 @@ +Defaultní dokumentace speciálních souborů +========================================= + +Drobná nápověda k běžným django souborům. (Do nich jsem to vkládal copy-paste.) + +admin.py +-------- +Soubor sloužící k definici toho, co bude v adminu. Většinou pouhým zavoláním +funkce :func:`django.contrib.admin.site.register`, v případě, že chceme něco +upravit, tak jako třída rozšiřující :class:`django.contrib.admin.ModelAdmin` +s dekorátorem :func:`django.contrib.admin.register`. + +Zde se definuje admin pro: + +apps.py +------- +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. + +forms.py +-------- +Formuláře (:class:`django.forms.Form`) umožňují jednoduchou tvorbu formulářů, +které lze pak jednoduše dát do frontendu i zpracovat na backendu. + +Pro přidání políčka do formuláře je potřeba + - mít v modelu tu položku, kterou chci upravovat + - přidat do views (prihlaskaView, resitelEditView) + - přidat do forms + - includovat do html + +models.py +--------- +Tento soubor slouží k definici databázového modelu. + +Třídy rozšiřují většinou :class:`django.db.models.Model` a jejich atributy jsou +většinou sloupce v databázi (tj. nastaví se na hodnotu něčeho z :mod:`django.db.models`). +Na výběr jsou: + + - :class:`django.db.models.TextField` + - :class:`django.db.models.ForeignKey` + - :class:`django.db.models.DateField` + - :class:`django.db.models.DateTimeField` + - :class:`django.db.models.ImageField` + - :class:`django.db.models.CharField` + +testutils.py +------------ +Soubor sloužící ke generování testdat. + +urls.py +------- +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +views.py +-------- + diff --git a/docs/index.rst b/docs/index.rst index e64a5ff3..0f779e42 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,6 +12,7 @@ Vítejte v dokumentaci M&Mího webu! vyvoj sphinx + dalsi_soubory modules/modules diff --git a/docs/sphinx.rst b/docs/sphinx.rst index dcf70ca7..99a92d74 100644 --- a/docs/sphinx.rst +++ b/docs/sphinx.rst @@ -6,9 +6,10 @@ Dokumentace se zkompiluje příkazem ``make html`` ve složce ``doc``. Složka ``modules`` je automaticiky generována a přegenerovávána. (**Nic v ní neupravovat!**) Jinak všechny rst, co jsou ve složce ``doc`` a jejích podsložkách nezačínajících podtržítkem, budou v dokumentaci a to je přesně to, co editovat pro změnu dokumentace (kromě dokumentace přímo v Pythonu). -Sphinx se píše v rst: `Návod na syntaxi rst`_ +Sphinx se píše v rst: `Návod na syntaxi rst`_ `Cheat sheet`_ .. _Návod na syntaxi rst: https://sphinx-tutorial.readthedocs.io/step-1/#sections +.. _Cheat sheet: https://sphinx-tutorial.readthedocs.io/cheatsheet/ Problém ------- diff --git a/galerie/urls.py b/galerie/urls.py index d299165f..2e311cd8 100644 --- a/galerie/urls.py +++ b/galerie/urls.py @@ -1,5 +1,12 @@ -# coding: utf-8 +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: +- ``/`` :func:`~galerie.views.nahled` +- ``//`` :func:`~galerie.views.detail` +- ``/new/`` :func:`~galerie.views.new_galerie` +- ``/plus//`` :func:`~galerie.views.plus_galerie` +- ``/minus//`` :func:`~galerie.views.minus_galerie` +""" from django.urls import path from seminar.utils import org_required from . import views diff --git a/header_fotky/__init__.py b/header_fotky/__init__.py index e69de29b..6ba2ea0d 100644 --- a/header_fotky/__init__.py +++ b/header_fotky/__init__.py @@ -0,0 +1,6 @@ +""" +Aplikace umožňující „na uživatelské úrovni“ měnit obrázek v pozadí meníčka. + +Umožňuje uložit obrázek a následně popsat, na kterých stránkách (podle url) +a v který čas (den/noc) se má zobrazovat. +""" \ No newline at end of file diff --git a/header_fotky/admin.py b/header_fotky/admin.py index 35d3427b..b939541b 100644 --- a/header_fotky/admin.py +++ b/header_fotky/admin.py @@ -1,9 +1,24 @@ +""" +Soubor sloužící k definici toho, co bude v adminu. Většinou pouhým zavoláním +funkce :func:`django.contrib.admin.site.register`, v případě, že chceme něco +upravit, tak jako třída rozšiřující :class:`django.contrib.admin.ModelAdmin` +s dekorátorem :func:`django.contrib.admin.register`. + +Zde se definuje admin pro: + +- :class:`~header_fotky.models.FotkaHeader` +- :class:`~header_fotky.models.FotkaUrlVazba` +""" from django.contrib import admin from django.contrib.admin import ModelAdmin import header_fotky.models as m class FotkaPozadiAdmin(ModelAdmin): + """ + Nastaví čas vložení (:attr:`~header_fotky.models.FotkaHeader.cas`) jako + readonly = neměnitelný + """ readonly_fields = ['cas'] admin.site.register(m.FotkaHeader, FotkaPozadiAdmin) diff --git a/header_fotky/apps.py b/header_fotky/apps.py index 084aa955..13f93ed4 100644 --- a/header_fotky/apps.py +++ b/header_fotky/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/header_fotky/context_processors.py b/header_fotky/context_processors.py index be259cbf..0040cb5f 100644 --- a/header_fotky/context_processors.py +++ b/header_fotky/context_processors.py @@ -1,4 +1,8 @@ - +""" +Context processory lze přidat do djanga v :mod:`~mamweb.settings` a dělají to, +že do contextu (tj. to, z čeho se např. berou proměnné v templatech) libovolné +stránky přidají další věci. +""" from datetime import datetime, date import random @@ -8,7 +12,15 @@ from header_fotky.models import FotkaUrlVazba def vzhled(request): - ''' Podle casu prida do templatu, zdali je nebo neni noc ''' + """ + Podle času přidá do contextu, zdali je nebo není noc. Dále podle dení + doby a url přidá do contextu správnou fotku. + + url adresu nejprve vyzkouší celou, pak postupně odřezává věci za + lomítkem, dokud nenajde url, pro kterou existuje alespoň jedna fotka. + Z fotek pro toto url zkusí vybrat tu ve správné denní době a až poté + libovolnou. (Z více možných fotek pro 1 url a 1 dobu vybírá náhodně.) + """ hodin = datetime.now().hour if (hodin <= 6) or (hodin >= 20): noc = True diff --git a/header_fotky/models.py b/header_fotky/models.py index 481a652c..750cc575 100644 --- a/header_fotky/models.py +++ b/header_fotky/models.py @@ -1,9 +1,24 @@ +""" +Tento soubor slouží k definici databázového modelu. + +Třídy rozšiřují většinou :class:`django.db.models.Model` a jejich atributy jsou +většinou sloupce v databázi (tj. nastaví se na hodnotu něčeho z :mod:`django.db.models`). +Na výběr jsou: + + - :class:`django.db.models.TextField` + - :class:`django.db.models.ForeignKey` + - :class:`django.db.models.DateField` + - :class:`django.db.models.DateTimeField` + - :class:`django.db.models.ImageField` + - :class:`django.db.models.CharField` +""" from django.core.exceptions import ValidationError from django.db import models from django.utils import timezone class FotkaHeader(models.Model): + """ fotka pro :mod:`fotka_header`, konkrétně :class:`~fotka_header.models.FotkaUrlVazba` """ class Meta: ordering = ['-cas'] db_table = 'fotky_header' @@ -11,27 +26,34 @@ class FotkaHeader(models.Model): verbose_name_plural = u'fotky do pozadí menu' cas = models.DateTimeField(u'čas vložení fotky', default=timezone.now, help_text='Čas vložení fotky') + """ čas vložení fotky """ nazev = models.CharField( u'název fotky', null=False, blank=False, unique=True, primary_key=True, max_length=50, help_text='Název např. archiv_noc' ) + """ jméno fotky na webu """ fotka = models.ImageField(upload_to='header', null=False, blank=False) + """ soubor fotky (Nahrává se automaticky do složky ``media``.) """ def __str__(self): return self.nazev def clean(self): + """ kontroluje, zda sedí poměr stran """ if not self.fotka: raise ValidationError("Chybí obrázek") - """ Kontroluje, zda sedí poměr stran """ if abs(self.fotka.width - (self.fotka.height * 970 / 350)) > 2: raise ValidationError("Obrázek by měl mít rozměry 970w na 350h, nebo alespoň podobný poměr stran.") super().clean() class FotkaUrlVazba(models.Model): + """ + spojení :class:`~fotka_header.models.FotkaHeader` a url + (resp. „prefixu“ url), na které má být zobrazována + """ class Meta: ordering = ['url'] db_table = 'fotky_url_vazby' @@ -42,11 +64,13 @@ class FotkaUrlVazba(models.Model): u'URL', blank=True, null=False, max_length=100, help_text='url prefix stránek např: /archiv/ nebo /' ) + """ url prefix stránek, kde má být fotka zobrazena, např: /archiv/ nebo / """ fotka = models.ForeignKey( FotkaHeader, blank=False, null=False, verbose_name='fotka', on_delete=models.CASCADE ) + """ :class:`~fotka_header.models.FotkaHeader`, která má být zobrazována """ DOBA_DEN = 'den' DOBA_NOC = 'noc' @@ -57,9 +81,11 @@ class FotkaUrlVazba(models.Model): (DOBA_OBOJI, 'Zobrazovat pořád')] denni_doba = models.CharField('denní doba', max_length=16, choices=DOBA_CHOICES, blank=False, default=DOBA_OBOJI) + """ dení doba, kdy tam má být zobrazována """ def __str__(self): return self.url def url_fotky(self): + """ vrací url fotky (tj. url, kde reálně získám soubor fotky) """ return self.fotka.fotka.url diff --git a/korektury/__init__.py b/korektury/__init__.py index e69de29b..811204aa 100644 --- a/korektury/__init__.py +++ b/korektury/__init__.py @@ -0,0 +1,5 @@ +""" + Seznam pdf k opravě a `opraf`_ v djangu místo PHP. + + .. _opraf: https://github.com/vitstradal/opraf +""" \ No newline at end of file diff --git a/korektury/admin.py b/korektury/admin.py index 64b2032f..2e91ae75 100644 --- a/korektury/admin.py +++ b/korektury/admin.py @@ -1,3 +1,13 @@ +""" +Soubor sloužící k definici toho, co bude v adminu. Většinou pouhým zavoláním +funkce :func:`django.contrib.admin.site.register`, v případě, že chceme něco +upravit, tak jako třída rozšiřující :class:`django.contrib.admin.ModelAdmin` +s dekorátorem :func:`django.contrib.admin.register`. + +Zde se definuje admin pro: + +- :class:`korektury.models.KorekturovanePDF` +""" from django.contrib import admin from reversion.admin import VersionAdmin from korektury.models import KorekturovanePDF @@ -7,10 +17,18 @@ from django.urls import reverse # Register your models here. class KorekturovanePDFAdmin(VersionAdmin): + """ + nastaví čas vložení (:attr:`~koretkury.models.KorekturovanePDF.cas`) a počet + stran (:attr:`~koretkury.models.KorekturovanePDF.stran`) jako readonly = + neměnitelný + + Při prvním uložení pošle e-mail. + """ readonly_fields = ['cas', 'stran'] def get_readonly_fields(self, request, obj=None): + """ Nevím, proč to tu je - Jidáš """ if obj: return self.readonly_fields + ['pdf'] return self.readonly_fields @@ -26,6 +44,9 @@ class KorekturovanePDFAdmin(VersionAdmin): search_fields = [] def save_model(self, request, obj, form, change): + """ + Pokud je soubor nový a má se poslat e-mail, tak pošle e-mail o novém pdf. + """ super().save_model(request, obj, form, change) if not change and obj.poslat_mail: # Je nový a má se poslat mail odkaz = request.build_absolute_uri(reverse('korektury', kwargs={'pdf': obj.id})) diff --git a/korektury/forms.py b/korektury/forms.py index 7385e687..2fd439a6 100644 --- a/korektury/forms.py +++ b/korektury/forms.py @@ -1,6 +1,17 @@ +""" +Formuláře (:class:`django.forms.Form`) umožňují jednoduchou tvorbu formulářů, +které lze pak jednoduše dát do frontendu i zpracovat na backendu. + +Pro přidání políčka do formuláře je potřeba + - mít v modelu tu položku, kterou chci upravovat + - přidat do views (prihlaskaView, resitelEditView) + - přidat do forms + - includovat do html +""" from django import forms class OpravaForm(forms.Form): + """ formulář k přidání opravy (:class:`korektury.models.Oprava`) """ text = forms.CharField(max_length=256) autor = forms.CharField(max_length=20) x = forms.IntegerField() diff --git a/korektury/models.py b/korektury/models.py index 240323a8..6cef59bc 100644 --- a/korektury/models.py +++ b/korektury/models.py @@ -1,4 +1,17 @@ -# -*- coding: utf-8 -*- +""" +Tento soubor slouží k definici databázového modelu. + +Třídy rozšiřují většinou :class:`django.db.models.Model` a jejich atributy jsou +většinou sloupce v databázi (tj. nastaví se na hodnotu něčeho z :mod:`django.db.models`). +Na výběr jsou: + + - :class:`django.db.models.TextField` + - :class:`django.db.models.ForeignKey` + - :class:`django.db.models.DateField` + - :class:`django.db.models.DateTimeField` + - :class:`django.db.models.ImageField` + - :class:`django.db.models.CharField` +""" import os from django.db import models from django.utils import timezone @@ -16,6 +29,7 @@ from unidecode import unidecode def generate_filename(self, filename): + """ vyrobí jméno souboru podle původního jména a času nahrátí """ clean = get_valid_filename( unidecode( filename.replace('/', '-').replace('\0', '').replace(":", "_") diff --git a/korektury/testutils.py b/korektury/testutils.py index 5e75173e..5664982b 100644 --- a/korektury/testutils.py +++ b/korektury/testutils.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící ke generování testdat. +""" import logging import os from shutil import copyfile, rmtree @@ -11,6 +14,7 @@ logger = logging.getLogger(__name__) @transaction.atomic def create_test_pdf(rnd, organizatori): + """ Vyrobí testovací pdf ke korekturování. Nevyrábí korektury! """ logger.info('Vyrábím testovací pdf ke korekturovani') try: testpdfs = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'testpdfs') diff --git a/korektury/urls.py b/korektury/urls.py index dcd1d965..96eb4dd4 100644 --- a/korektury/urls.py +++ b/korektury/urls.py @@ -1,3 +1,11 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``korektury/`` (korektury_list) :class:`~korektury.views.KorekturySeskupeneListView` +- ``korektury/neseskupene/`` (korektury_neseskupene_list) :class:`~korektury.views.KorekturyAktualniListView` +- ``korektury/zastarale/`` (korektury_stare_list) :class:`~korektury.views.KorekturyZastaraleListView` +- ``korektury//`` (korektury) :class:`~korektury.views.KorekturyView` +""" from django.urls import path from seminar.utils import org_required from . import views diff --git a/korektury/views.py b/korektury/views.py index 97a34dbf..76f28ec8 100644 --- a/korektury/views.py +++ b/korektury/views.py @@ -1,4 +1,8 @@ -# -*- coding: utf-8 -*- +""" +Soubor sloužící k deklaraci jednotlivých „views“ (nejčastěji funkce beroucí request +a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo +třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`) +""" from django.shortcuts import get_object_or_404, render from django.views import generic from django.utils.translation import ugettext as _ diff --git a/mamweb/admin.py b/mamweb/admin.py index 9c421309..2ad1aaaa 100644 --- a/mamweb/admin.py +++ b/mamweb/admin.py @@ -1,3 +1,8 @@ +""" +Soubor sloužící k úpravě základních vlastností adminu. Zde se do adminu přidává +CKEditor, nastavuje české řazení v adminu a preference (zobrazuje se v seznamu +jako první) adminu k Semináři. +""" import locale from django.contrib import admin from django.contrib.admin import AdminSite diff --git a/mamweb/urls.py b/mamweb/urls.py index e91c0b17..3577c4f7 100644 --- a/mamweb/urls.py +++ b/mamweb/urls.py @@ -1,3 +1,20 @@ +""" +Soubor sloužící jako základní „router“, tj. zde se includují veškeré ostatní urls: + +- ``admin/`` :mod:`django.contrib.admin.site.urls` +- ``ckeditor/`` :mod:`ckeditor_uploader.urls` +- :mod:`seminar.urls` +- :mod:`odevzdavatko.urls` +- :mod:`korektury.urls` +- :mod:`prednasky.urls` +- :mod:`soustredeni.urls` +- :mod:`personalni.urls` +- :mod:`various.autentizace.urls` +- :mod:`api.urls` +- :mod:`treenode.urls` +- :mod:`aesop.urls` +- ``comments_dj/`` :mod:`django_comments.urls` +""" from django.urls import path, include from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.contrib import admin diff --git a/odevzdavatko/admin.py b/odevzdavatko/admin.py index 6048eb36..168beab1 100644 --- a/odevzdavatko/admin.py +++ b/odevzdavatko/admin.py @@ -1,3 +1,9 @@ +""" +Soubor sloužící k definici toho, co bude v adminu. Většinou pouhým zavoláním +funkce :func:`django.contrib.admin.site.register`, v případě, že chceme něco +upravit, tak jako třída rozšiřující :class:`django.contrib.admin.ModelAdmin` +s dekorátorem :func:`django.contrib.admin.register`. +""" from django.contrib import admin from django_reverse_admin import ReverseModelAdmin import seminar.models as m diff --git a/odevzdavatko/apps.py b/odevzdavatko/apps.py index 507c284f..95811247 100644 --- a/odevzdavatko/apps.py +++ b/odevzdavatko/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/odevzdavatko/urls.py b/odevzdavatko/urls.py index bb04f06a..e15b3807 100644 --- a/odevzdavatko/urls.py +++ b/odevzdavatko/urls.py @@ -1,3 +1,17 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``org/add_solution`` (seminar_vloz_reseni) :class:`~odevzdavatko.views.PosliReseniView` +- ``resitel/nahraj_reseni`` (seminar_nahraj_reseni) :class:`~odevzdavatko.views.NahrajReseniView` +- ``resitel/odevzdana_reseni/`` (seminar_resitel_odevzdana_reseni) :class:`~odevzdavatko.views.PrehledOdevzdanychReseni` +- ``org/reseni/`` (odevzdavatko_tabulka) :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``org/reseni/rocnik//`` (odevzdavatko_tabulka) :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``org/reseni///`` (odevzdavatko_reseni_resitele_k_problemu) :class:`~odevzdavatko.views.ReseniProblemuView` +- ``org/reseni//`` (odevzdavatko_detail_reseni) :func:`~seminar.utils.viewMethodSwitch` + :class:`~odevzdavatko.views.DetailReseniView` + :func:`~odevzdavatko.views.hodnoceniReseniView` +- ``org/reseni/all`` :class:`~odevzdavatko.views.SeznamReseniView` +- ``org/reseni/akt`` :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``resitel/reseni/`` (odevzdavatko_resitel_reseni) :class:`~odevzdavatko.views.ResitelReseniView` +""" from django.urls import path from seminar.utils import org_required, resitel_required, viewMethodSwitch, \ diff --git a/personalni/apps.py b/personalni/apps.py index 359f220c..47ba22cc 100644 --- a/personalni/apps.py +++ b/personalni/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/personalni/urls.py b/personalni/urls.py index 73a6f720..cbcdb035 100644 --- a/personalni/urls.py +++ b/personalni/urls.py @@ -1,3 +1,17 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``org/add_solution`` (seminar_vloz_reseni) :class:`~odevzdavatko.views.PosliReseniView` +- ``resitel/nahraj_reseni`` (seminar_nahraj_reseni) :class:`~odevzdavatko.views.NahrajReseniView` +- ``resitel/odevzdana_reseni/`` (seminar_resitel_odevzdana_reseni) :class:`~odevzdavatko.views.PrehledOdevzdanychReseni` +- ``org/reseni/`` (odevzdavatko_tabulka) :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``org/reseni/rocnik//`` (odevzdavatko_tabulka) :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``org/reseni///`` (odevzdavatko_reseni_resitele_k_problemu) :class:`~odevzdavatko.views.ReseniProblemuView` +- ``org/reseni//`` (odevzdavatko_detail_reseni) :func:`~seminar.utils.viewMethodSwitch` + :class:`~odevzdavatko.views.DetailReseniView` + :func:`~odevzdavatko.views.hodnoceniReseniView` +- ``org/reseni/all`` :class:`~odevzdavatko.views.SeznamReseniView` +- ``org/reseni/akt`` :class:`~odevzdavatko.views.TabulkaOdevzdanychReseniView` +- ``resitel/reseni/`` (odevzdavatko_resitel_reseni) :class:`~odevzdavatko.views.ResitelReseniView` +""" from django.urls import path from django.contrib.auth.decorators import login_required from . import views diff --git a/prednasky/urls.py b/prednasky/urls.py index b55de7c3..0a96aa59 100644 --- a/prednasky/urls.py +++ b/prednasky/urls.py @@ -1,3 +1,12 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``prednasky/`` :func:`~prednasky.views.newPrednaska` +- ``prednasky/hotovo`` :func:`~prednasky.views.Prednaska_hotovo` +- ``prednasky/metaseznam_prednasek`` (metaseznam-list) :class:`~prednasky.views.MetaSeznamListView` +- ``prednasky/seznam_prednasek//export`` (seznam-export) :func:`~prednasky.views.SeznamExportView` +- ``prednasky/seznam_prednasek//`` (seznam-list) :class:`~prednasky.views.SeznamListView` +""" from django.urls import path from seminar.utils import org_required, resitel_required from . import views diff --git a/seminar/__init__.py b/seminar/__init__.py index e69de29b..09ee5004 100644 --- a/seminar/__init__.py +++ b/seminar/__init__.py @@ -0,0 +1,6 @@ +""" +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 diff --git a/seminar/urls.py b/seminar/urls.py index 0e05f991..58fb0335 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -1,3 +1,35 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- Organizátoři + - ``o-nas/organizatori/`` (organizatori) :class:`~seminar.views.views_all.CojemamOrganizatoriView` + - ``o-nas/organizatori/organizovali/`` (stari_organizatori) :class:`~seminar.views.views_all.CojemamOrganizatoriStariView` +- Archiv + - ``archiv/rocniky/`` (seminar_archiv_rocniky) :class:`~seminar.views.views_all.ArchivView` + - ``archiv/temata/`` (seminar_archiv_temata) :class:`~seminar.views.views_all.ArchivTemataView` + - ``rocnik//`` (seminar_rocnik) :class:`~seminar.views.views_all.RocnikView` + - ``cislo/./`` (seminar_cislo) :class:`~seminar.views.views_all.CisloView` + - ``problem//`` (seminar_problem) :func:`~seminar.views.views_all.problemView` +- Zadání + - ``aktualni/zadani/`` (seminar_aktualni_zadani) :func:`~seminar.views.views_all.AktualniZadaniView` + - ``aktualni/vysledkova-listina/`` (seminar_aktualni_vysledky) :func:`~seminar.views.views_all.ZadaniAktualniVysledkovkaView` + - ``aktualni/rocnik/`` (seminar_aktualni_rocnik) :class:`~seminar.views.views_all.AktualniRocnikRedirectView` +- Články + - ``archiv/clanky/`` (clanky_resitel) :class:`~seminar.views.views_all.ClankyResitelView` +- Orgovské stránky + - ``rocnik//vysledkovka.tex`` (seminar_rocnik_vysledkovka) :class:`~seminar.views.views_all.RocnikVysledkovkaView` + - ``rocnik//resitele.csv`` (seminar_rocnik_resitele_csv) :func:`~seminar.views.views_all.resiteleRocnikuCsvExportView` + - ``cislo/./vysledkovka.tex`` (seminar_cislo_vysledkovka) :class:`~seminar.views.views_all.CisloVysledkovkaView` + - ``cislo/./obalky.pdf`` (seminar_cislo_obalky) :func:`~seminar.views.views_all.cisloObalkyView` + - ``cislo/./tituly.tex`` (seminar_cislo_titul) :func:`~seminar.views.views_all.TitulyView` + - ``stav`` (stav_databaze) :func:`~seminar.views.views_all.StavDatabazeView` + - ``cislo/./obalkovani`` (seminar_cislo_resitel_obalkovani) :class:`~seminar.views.views_all.ObalkovaniView` + - ``cislo/./odmeny/./`` (seminar_archiv_odmeny) :class:`~seminar.views.views_all.OdmenyView` +- Další + - `` `` (titulni_strana) :class:`~seminar.views.views_all.TitulniStranaView` + - ``jak-resit/`` (jak_resit) :class:`~seminar.views.views_all.JakResitView` + - ``stare-novinky/`` (stare_novinky) :class:`~seminar.views.views_all.StareNovinkyView` +""" from django.urls import path, include, re_path from . import views from .utils import org_required @@ -24,7 +56,6 @@ urlpatterns = [ #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('stare-novinky/', views.StareNovinkyView.as_view(), name='stare_novinky'), # Clanky path('archiv/clanky/', views.ClankyResitelView.as_view(), name='clanky_resitel'), @@ -73,4 +104,5 @@ urlpatterns = [ path('', views.TitulniStranaView.as_view(), name='titulni_strana'), path('jak-resit/', views.JakResitView.as_view(), name='jak_resit'), + path('stare-novinky/', views.StareNovinkyView.as_view(), name='stare_novinky'), ] diff --git a/soustredeni/apps.py b/soustredeni/apps.py index 5d282341..a0a8dae5 100644 --- a/soustredeni/apps.py +++ b/soustredeni/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/treenode/apps.py b/treenode/apps.py index 95139dc6..8e7df6fc 100644 --- a/treenode/apps.py +++ b/treenode/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/treenode/urls.py b/treenode/urls.py index 60dc88ad..1b6444bb 100644 --- a/treenode/urls.py +++ b/treenode/urls.py @@ -1,3 +1,8 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- Zatím tu nic moc není… +""" from django.urls import path, re_path from . import views diff --git a/various/apps.py b/various/apps.py index c24a4428..bf6023f0 100644 --- a/various/apps.py +++ b/various/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig diff --git a/various/autentizace/urls.py b/various/autentizace/urls.py index 83c8e50e..a89ff89e 100644 --- a/various/autentizace/urls.py +++ b/various/autentizace/urls.py @@ -1,3 +1,16 @@ +""" +Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují: + +- ``prihlasit/`` (login) :class:`~various.autentizace.views.LoginView` +- ``login/`` :class:`django.views.generic.base.RedirectView` předchozího +- ``odhlasit/`` (logout) :class:`~various.autentizace.views.LogoutView` +- ``logout/`` :class:`django.views.generic.base.RedirectView` předchozího +- ``reset-hesla/`` (reset_password) :class:`~various.autentizace.views.PasswordResetView` +- ``zmena-hesla/`` (change_password) :class:`~various.autentizace.views.PasswordChangeView` +- ``zmena-hesla/2/`` (reset_password_done) :class:`~various.autentizace.views.PasswordResetDoneView` +- ``reset-hesla/potvrzeni///`` (reset_password_confirm) :class:`~various.autentizace.views.PasswordResetConfirmView` +- ``reset-hesla/hotovo/`` (reset_password_complete) :class:`~various.autentizace.views.PasswordResetCompleteView` +""" from django.urls import path from . import views from django.views.generic.base import RedirectView diff --git a/vysledkovky/apps.py b/vysledkovky/apps.py index 7221864c..de1c2bde 100644 --- a/vysledkovky/apps.py +++ b/vysledkovky/apps.py @@ -1,3 +1,6 @@ +""" +Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace. +""" from django.apps import AppConfig