From 57f674a51cd32f3b99b46f881b0ae8c15fdeb8c2 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 17:43:38 +0200 Subject: [PATCH 1/9] Uprava modelu: ucast na soustredeni, poznamky u modelu --- .../0012_remove_soustredeni_ucastnici.py | 18 ++++++ ...013_soustredeni_ucastnici_through_model.py | 36 ++++++++++++ seminar/migrations/0014_uprava_poznamek.py | 56 +++++++++++++++++++ seminar/models.py | 46 +++++++++++---- 4 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 seminar/migrations/0012_remove_soustredeni_ucastnici.py create mode 100644 seminar/migrations/0013_soustredeni_ucastnici_through_model.py create mode 100644 seminar/migrations/0014_uprava_poznamek.py diff --git a/seminar/migrations/0012_remove_soustredeni_ucastnici.py b/seminar/migrations/0012_remove_soustredeni_ucastnici.py new file mode 100644 index 00000000..ddb61304 --- /dev/null +++ b/seminar/migrations/0012_remove_soustredeni_ucastnici.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0011_alter_timestamp_def'), + ] + + operations = [ + migrations.RemoveField( + model_name='soustredeni', + name='ucastnici', + ), + ] diff --git a/seminar/migrations/0013_soustredeni_ucastnici_through_model.py b/seminar/migrations/0013_soustredeni_ucastnici_through_model.py new file mode 100644 index 00000000..37027c2d --- /dev/null +++ b/seminar/migrations/0013_soustredeni_ucastnici_through_model.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0012_remove_soustredeni_ucastnici'), + ] + + operations = [ + migrations.CreateModel( + name='Soustredeni_Ucastnici', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True)), + ('poznamka', models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \xfa\u010dasti (plain text)', max_length=64, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True)), + ('resitel', models.ForeignKey(verbose_name='\u0159e\u0161itel', to='seminar.Resitel')), + ('soustredeni', models.ForeignKey(verbose_name='soust\u0159ed\u011bn\xed', to='seminar.Soustredeni')), + ], + options={ + 'ordering': ['soustredeni', 'resitel'], + 'db_table': 'seminar_soustredeni_ucastnici', + 'verbose_name': '\xda\u010dast na soust\u0159ed\u011bn\xed', + 'verbose_name_plural': '\xda\u010dasti na soust\u0159ed\u011bn\xed', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='soustredeni', + name='ucastnici', + field=models.ManyToManyField(help_text='Seznam \xfa\u010dastn\xedk\u016f soust\u0159ed\u011bn\xed', to='seminar.Resitel', verbose_name='\xfa\u010dastn\xedci soust\u0159ed\u011bn\xed', through='seminar.Soustredeni_Ucastnici'), + preserve_default=True, + ), + ] diff --git a/seminar/migrations/0014_uprava_poznamek.py b/seminar/migrations/0014_uprava_poznamek.py new file mode 100644 index 00000000..a35a0dc1 --- /dev/null +++ b/seminar/migrations/0014_uprava_poznamek.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0013_soustredeni_ucastnici_through_model'), + ] + + operations = [ + migrations.AddField( + model_name='cislo', + name='poznamka', + field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u010d\xedslu (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='prilohareseni', + name='poznamka', + field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k p\u0159\xedloze \u0159e\u0161en\xed (plain text), nap\u0159. o p\u016fvodu', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='problem', + name='text_problemu_org', + field=models.TextField(verbose_name='neve\u0159ejn\xe9 zad\xe1n\xed a organiz\xe1torsk\xe9 a pozn\xe1mky', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='reseni', + name='poznamka', + field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u0159e\u0161en\xed (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='resitel', + name='poznamka', + field=models.TextField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u0159e\u0161iteli (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='skola', + name='poznamka', + field=models.TextField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka ke \u0161kole (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='soustredeni_ucastnici', + name='poznamka', + field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \xfa\u010dasti (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + preserve_default=True, + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 8356b698..d9997e03 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -96,7 +96,7 @@ class Skola(SeminarModelBase): je_zs = models.BooleanField(u'základní stupeň', default=True) je_ss = models.BooleanField(u'střední stupeň', default=True) - poznamka = models.TextField(u'neveřejná poznámka', blank=True, + poznamka = models.TextField(u'neveřejná poznámka', blank=True, default='', help_text=u'Neveřejná poznámka ke škole (plain text)') def __str__(self): @@ -170,7 +170,7 @@ class Resitel(SeminarModelBase): stat = CountryField(u'stát', default='CZ', help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') - poznamka = models.TextField(u'neveřejná poznámka', blank=True, + poznamka = models.TextField(u'neveřejná poznámka', blank=True, default='', help_text=u'Neveřejná poznámka k řešiteli (plain text)') # Staré (do 2015) MAMOPER.MM_RIESITELIA.ID z DAKOS -- jen u importovaných záznamů @@ -256,6 +256,9 @@ class Cislo(SeminarModelBase): verejne_db = models.BooleanField(u'číslo zveřejněno', db_column='verejne', default=False) + poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', + help_text=u'Neveřejná poznámka k číslu (plain text)') + def kod(self): return u'%s.%s' % (self.rocnik.rocnik, self.cislo) kod.short_description = u'Kód čísla' @@ -327,7 +330,7 @@ class Problem(SeminarModelBase): zamereni = TaggableManager(verbose_name=u'zaměření', help_text='Zaměření M/F/I/O problému, příp. další tagy', blank=True) - text_problemu_org = models.TextField(u'organizátorský (neveřejný) text', blank=True) + text_problemu_org = models.TextField(u'neveřejné zadání a organizátorské a poznámky', blank=True) text_problemu = models.TextField(u'veřejný text zadání a řešení', blank=True) @@ -354,7 +357,7 @@ class Problem(SeminarModelBase): u'"DOZ:xxx" (MAMOPER.MM_DOZ), "ZAD:rocnik.cislo.uloha.typ" (MAMOPER.MM_ZADANIA), "ULOHA:xxx" (MAMOPER.MM_ULOHY)')) def __str__(self): - return force_unicode(u'%s (%s)' % (self.nazev, self.stav)) + return force_unicode(u'%s' % (self.nazev, )) def kod_v_rocniku(self): if self.typ == self.TYP_ULOHA: @@ -404,8 +407,8 @@ class Reseni(SeminarModelBase): ] forma = models.CharField(u'forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, default=FORMA_PAPIR) - poznamka = models.TextField(u'neveřejná poznámka', blank=True, - help_text=u'Neveřejná poznámka k řešení (plain text, editace v detailu řešení)') + poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', + help_text=u'Neveřejná poznámka k řešení (plain text)') def __str__(self): return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) @@ -418,7 +421,7 @@ def generate_filename(self, filename): fname = "%s_%s" % ( timezone.now().strftime('%Y-%m-%d-%H:%M'), clean) - return os.path.join(settings.SEMINAR_RESENI_DIRNAME, datedir, fname) + return os.path.join(settings.SEMINAR_RESENI_DIR, datedir, fname) @reversion.register(ignore_duplicate_revisions=True) @@ -440,7 +443,7 @@ class PrilohaReseni(SeminarModelBase): soubor = models.FileField(u'soubor', upload_to = generate_filename) - poznamka = models.TextField(u'neveřejná poznámka', blank=True, + poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', help_text=u'Neveřejná poznámka k příloze řešení (plain text), např. o původu') def __str__(self): @@ -474,10 +477,10 @@ class Soustredeni(SeminarModelBase): help_text=u'Místo (název obce, volitelně též objektu') ucastnici = models.ManyToManyField(Resitel, verbose_name=u'účastníci soustředění', - help_text=u'Seznam účastníků soustředění', db_table='seminar_soustredeni_ucastnici') + help_text=u'Seznam účastníků soustředění', through='Soustredeni_Ucastnici') def __str__(self): - return force_unicode(u'%s (%s)' % (self.misto, self.datum_zacatek)) + return force_unicode(u'%s (%s)' % (self.misto, self.datum_zacatku)) def verejne(self): return self.verejne_db @@ -487,6 +490,29 @@ class Soustredeni(SeminarModelBase): return reverse('seminar_soustredeni', kwargs={'pk': self.id}) +@python_2_unicode_compatible +class Soustredeni_Ucastnici(models.Model): + + class Meta: + db_table = 'seminar_soustredeni_ucastnici' + verbose_name = u'Účast na soustředění' + verbose_name_plural = u'Účasti na soustředění' + ordering = ['soustredeni', 'resitel'] + + # Interní ID + id = models.AutoField(primary_key = True) + + resitel = models.ForeignKey(Resitel, verbose_name=u'řešitel') + + soustredeni = models.ForeignKey(Soustredeni, verbose_name=u'soustředění') + + poznamka = models.CharField(u'neveřejná poznámka', max_length=128, blank=True, default='', + help_text=u'Neveřejná poznámka k účasti (plain text)') + + def __str__(self): + return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, )) + + @python_2_unicode_compatible class VysledkyBase(SeminarModelBase): From 32cb4b14803a49db79d0f74a5afc5ded7f3ade3d Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 17:44:20 +0200 Subject: [PATCH 2/9] Zaklad routovani / view pro soustredeni --- seminar/urls.py | 2 ++ seminar/views.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/seminar/urls.py b/seminar/urls.py index 81473e40..0ef0aed9 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -5,6 +5,8 @@ urlpatterns = patterns('', url(r'^rocnik/(?P\d+)/$', views.RocnikView.as_view(), name='seminar_rocnik'), url(r'^cislo/(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), url(r'^problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'), + url(r'^soustredeni/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), + url(r'^zadani/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^aesop-export/mam-rocnik-(?P\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'), diff --git a/seminar/views.py b/seminar/views.py index 02b3cdab..39f60bd5 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -2,7 +2,7 @@ from django.shortcuts import get_object_or_404, render from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse from django.views import generic -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik +from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni def AktualniZadaniView(request): @@ -16,6 +16,10 @@ class RocnikView(generic.DetailView): model = Rocnik template_name = 'seminar/rocnik.html' +class SoustredeniView(generic.DetailView): + model = Soustredeni + template_name = 'seminar/soustredeni.html' + class ProblemView(generic.DetailView): model = Problem template_name = 'seminar/problem.html' From a0fb80130ff4f1fdd9e75c89e8b93b49d34ee797 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 17:44:51 +0200 Subject: [PATCH 3/9] Boost admin to the stars!!! --- seminar/admin.py | 135 ++++++++++++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 49 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 3a0b2e1f..a2a594f7 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -5,25 +5,61 @@ import reversion from solo.admin import SingletonModelAdmin from ckeditor.widgets import CKEditorWidget -from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici import autocomplete_light -### Nastaveni + + +### Globální nastavení admin.site.register(Nastaveni, SingletonModelAdmin) -### Skola -class SkolaAdmin(reversion.VersionAdmin): - fieldsets = [ - (None, {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}), - (u'Interní ID', {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), - (u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), - ] - list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss'] - list_filter = ['stat', 'je_zs', 'je_ss'] - search_fields = ['nazev', 'mesto', 'ulice'] +### INLINES + +class ResitelInline(admin.TabularInline): + model = Resitel + fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] + readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] + extra = 0 + def has_add_permission(self, req): return False + + +class CisloInline(admin.TabularInline): + model = Cislo + fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka'] + readonly_fields = ['cislo'] + extra = 0 + def has_add_permission(self, req): return False + + +class PrilohaReseniInline(admin.StackedInline): + model = PrilohaReseni + fields = ['timestamp', 'soubor', 'poznamka'] + readonly_fields = ['timestamp'] + extra = 0 + + +class ReseniKProblemuInline(admin.TabularInline): + form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitel'], fields=['resitel']) + model = Reseni + fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] + readonly_fields = ['timestamp'] + extra = 0 + + +class ReseniKResiteliInline(admin.TabularInline): + model = Reseni + fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] + readonly_fields = ['timestamp', 'problem'] + extra = 0 + def has_add_permission(self, req): return False -admin.site.register(Skola, SkolaAdmin) + +class Soustredeni_UcastniciInline(admin.TabularInline): + form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel']) + model = Soustredeni_Ucastnici + fields = ['resitel', 'poznamka', ] + extra = 0 ### Resitel @@ -40,15 +76,33 @@ class ResitelAdmin(reversion.VersionAdmin): list_display = ['jmeno', 'prijmeni', 'user', 'pohlavi_muz', 'skola', 'rok_maturity'] list_filter = ['pohlavi_muz', 'rok_maturity', 'zasilat'] search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email'] + inlines = [ReseniKResiteliInline] admin.site.register(Resitel, ResitelAdmin) +### Skola + +class SkolaAdmin(reversion.VersionAdmin): + fieldsets = [ + (None, {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}), + (u'Interní ID', {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), + (u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), + (None, {'fields': ['poznamka']}), + ] + list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss'] + list_filter = ['stat', 'je_zs', 'je_ss'] + search_fields = ['nazev', 'mesto', 'ulice'] + inlines = [ResitelInline] + +admin.site.register(Skola, SkolaAdmin) + + ### Cislo class CisloAdmin(reversion.VersionAdmin): fieldsets = [ - (None, {'fields': ['cislo', 'rocnik', 'verejne_db']}), + (None, {'fields': ['cislo', 'rocnik', 'verejne_db', 'poznamka']}), (u'Data', {'fields': ['datum_vydani', 'datum_deadline']}), ] list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne'] @@ -57,12 +111,6 @@ class CisloAdmin(reversion.VersionAdmin): admin.site.register(Cislo, CisloAdmin) -class CisloInline(admin.StackedInline): - model = Cislo - fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne'] - readonly_fields = ['cislo'] - extra = 0 - ### Rocnik @@ -78,30 +126,24 @@ admin.site.register(Rocnik, RocnikAdmin) ### PrilohaReseni - -class PrilohaReseniAdmin(reversion.VersionAdmin): - readonly_fields = ['timestamp', 'reseni'] - fieldsets = [ - (None, {'fields': ['reseni', 'soubor', 'timestamp']}), - (u'Poznámky', {'fields': ['poznamka']}), - ] - list_display = ['reseni', 'soubor', 'timestamp'] - list_filter = ['reseni', 'timestamp'] - search_fields = [] - -admin.site.register(PrilohaReseni, PrilohaReseniAdmin) - -class PrilohaReseniInline(admin.StackedInline): - model = PrilohaReseni - fields = ['timestamp', 'soubor', 'poznamka'] - readonly_fields = ['timestamp'] - extra = 1 +# NOTE: Nemá pravděpodobně smysl používat +# class PrilohaReseniAdmin(reversion.VersionAdmin): +# readonly_fields = ['timestamp', 'reseni'] +# fieldsets = [ +# (None, {'fields': ['reseni', 'soubor', 'timestamp']}), +# (u'Poznámky', {'fields': ['poznamka']}), +# ] +# list_display = ['reseni', 'soubor', 'timestamp'] +# list_filter = ['reseni', 'timestamp'] +# search_fields = [] +# +# admin.site.register(PrilohaReseni, PrilohaReseniAdmin) ### Reseni class ReseniAdmin(reversion.VersionAdmin): - form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem'], fields=['problem']) + form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitel'], fields=['problem', 'resitel']) fieldsets = [ (None, {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}), (u'Poznámky', {'fields': ['poznamka']}), @@ -114,12 +156,6 @@ class ReseniAdmin(reversion.VersionAdmin): admin.site.register(Reseni, ReseniAdmin) -class ReseniInline(admin.TabularInline): - model = Reseni - fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] - readonly_fields = ['poznamka', 'resitel', 'timestamp', 'cislo_body', 'resitel', 'forma'] - extra = 0 - ### Problem @@ -135,15 +171,15 @@ class ProblemAdmin(reversion.VersionAdmin): form = ProblemAdminForm fieldsets = [ (None, {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp']}), - (u'Vydání', {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel']}), - (u'Texty', {'fields': ['text_problemu', 'text_problemu_org']}), + (u'Vydání', {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel', 'text_problemu']}), + (None, {'fields': ['text_problemu_org']}), ] readonly_fields = ['timestamp'] list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani'] list_select_related = True list_filter = ['typ', 'stav', 'timestamp'] search_fields = ['nazev', 'kod', 'text_problemu_org', 'text_problemu'] - inlines = [ReseniInline] + inlines = [ReseniKProblemuInline] view_on_site = Problem.verejne_url admin.site.register(Problem, ProblemAdmin) @@ -157,8 +193,9 @@ class SoustredeniAdmin(reversion.VersionAdmin): (u'Data', {'fields': ['datum_zacatku', 'datum_konce']}), ] list_display = ['rocnik', 'misto', 'datum_zacatku', 'verejne'] + inlines = [Soustredeni_UcastniciInline] list_filter = ['rocnik'] view_on_site = Soustredeni.verejne_url - # TODO: UcastNaSoustredeni jako inline admin.site.register(Soustredeni, SoustredeniAdmin) + From 74bf1afafe0959e90752377bff6ad21f7b21bf6a Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 21:33:53 +0200 Subject: [PATCH 4/9] =?UTF-8?q?Favicon=20(ikona=20webu)=20ze=20star=C3=A9h?= =?UTF-8?q?o=20webu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/static/favicon.ico | Bin 0 -> 218 bytes mamweb/templates/admin/base_site.html | 1 + mamweb/templates/base.html | 1 + 3 files changed, 2 insertions(+) create mode 100644 mamweb/static/favicon.ico diff --git a/mamweb/static/favicon.ico b/mamweb/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..af06950a987307270e2ba4ed6fefbb3c05e36977 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b{r~@eOH<3AUw>GbSX9(h z9=6ngR4|qV`2{mLJiCzw;v{*yyD)UH%6b4foCO|{#S9F5he4R}c>anMpdfpRr>`sf zWj0|!2Cj_7FINJETs&PILn`J>?F|%dFyJ}T7tUzopr E0Kr{IB>(^b literal 0 HcmV?d00001 diff --git a/mamweb/templates/admin/base_site.html b/mamweb/templates/admin/base_site.html index 03e292f3..dfb47b16 100644 --- a/mamweb/templates/admin/base_site.html +++ b/mamweb/templates/admin/base_site.html @@ -2,6 +2,7 @@ {% load staticfiles %} {% block extrahead %} + {% include 'autocomplete_light/static.html' %} {% endblock %} diff --git a/mamweb/templates/base.html b/mamweb/templates/base.html index 7fd235e3..864387e6 100644 --- a/mamweb/templates/base.html +++ b/mamweb/templates/base.html @@ -4,6 +4,7 @@ {% block title %}Seminář M&M{% endblock title %} + {% render_block "css" %} From 8e1e30e672b27001d09841fb76494e860e4b90ce Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 22:17:46 +0200 Subject: [PATCH 5/9] Priprava autocomplete tagu a pod., vzhled adminu --- mamweb/settings_common.py | 25 ++++++++++++++++--------- requirements.txt | 3 ++- seminar/autocomplete_light_registry.py | 4 ++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/mamweb/settings_common.py b/mamweb/settings_common.py index c842bfc2..6214ce41 100644 --- a/mamweb/settings_common.py +++ b/mamweb/settings_common.py @@ -49,9 +49,11 @@ AUTHENTICATION_BACKENDS = ( ) TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - 'django.template.loaders.eggs.Loader' + ('django.template.loaders.cached.Loader', ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + 'django.template.loaders.eggs.Loader' + )), ) MIDDLEWARE_CLASSES = ( @@ -95,17 +97,22 @@ INSTALLED_APPS = ( 'solo', 'ckeditor', 'taggit', + 'autocomplete_light', # MaMweb 'mamweb', 'seminar', - # Prvni: - 'autocomplete_light', - 'admin_tools', - 'admin_tools.theming', - 'admin_tools.menu', - 'admin_tools.dashboard', + # Admin upravy: + +# 'material', +# 'material.admin', +# 'admin_tools', +# 'admin_tools.theming', +# 'admin_tools.menu', +# 'admin_tools.dashboard', + 'flat', + 'django.contrib.admin', ) diff --git a/requirements.txt b/requirements.txt index 5e7cba79..6e398b41 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,9 +17,10 @@ django-sekizai==0.8.1 django-countries==3.2 django-solo==1.1.0 django-ckeditor==4.4.7 -django-admin-tools==0.5.2 +django-flat-theme==0.9.3 django-taggit==0.14.0 django-autocomplete-light==2.1.1 +# django-admin-tools==0.5.2 # debug tools/extensions diff --git a/seminar/autocomplete_light_registry.py b/seminar/autocomplete_light_registry.py index c7de8983..0b40dbcf 100644 --- a/seminar/autocomplete_light_registry.py +++ b/seminar/autocomplete_light_registry.py @@ -3,6 +3,10 @@ import autocomplete_light from models import Skola, Resitel, Problem +from taggit.models import Tag + + +autocomplete_light.register(Tag) class SkolaAutocomplete(autocomplete_light.AutocompleteModelBase): From 692c73c7e2f5a8849cb8857eeb68243f3bd56030 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 22:18:44 +0200 Subject: [PATCH 6/9] Velke optimalizace SQL pouziti v adminu, select_related() --- seminar/admin.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++- seminar/models.py | 15 ++++++++++++--- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index a2a594f7..6b4df8b5 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -21,6 +21,7 @@ class ResitelInline(admin.TabularInline): fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] extra = 0 + def has_add_permission(self, req): return False @@ -29,6 +30,7 @@ class CisloInline(admin.TabularInline): fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka'] readonly_fields = ['cislo'] extra = 0 + def has_add_permission(self, req): return False @@ -36,6 +38,7 @@ class PrilohaReseniInline(admin.StackedInline): model = PrilohaReseni fields = ['timestamp', 'soubor', 'poznamka'] readonly_fields = ['timestamp'] + extra = 0 @@ -46,14 +49,39 @@ class ReseniKProblemuInline(admin.TabularInline): readonly_fields = ['timestamp'] extra = 0 + def get_queryset(self, request): + qs = super(ReseniKProblemuInline, self).get_queryset(request) + return qs.select_related('problem', 'cislo_body', 'resitel') + + # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) + def formfield_for_dbfield(self, db_field, **kwargs): + formfield = super(ReseniKProblemuInline, self).formfield_for_dbfield(db_field, **kwargs) + if db_field.name == 'cislo_body': + # dirty trick so queryset is evaluated and cached in .choices + formfield.choices = formfield.choices + return formfield + class ReseniKResiteliInline(admin.TabularInline): model = Reseni fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] readonly_fields = ['timestamp', 'problem'] extra = 0 + def has_add_permission(self, req): return False + def get_queryset(self, request): + qs = super(ReseniKResiteliInline, self).get_queryset(request) + return qs.select_related('problem', 'cislo_body', 'resitel') + + # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) + def formfield_for_dbfield(self, db_field, **kwargs): + formfield = super(ReseniKResiteliInline, self).formfield_for_dbfield(db_field, **kwargs) + if db_field.name == 'cislo_body': + # dirty trick so queryset is evaluated and cached in .choices + formfield.choices = formfield.choices + return formfield + class Soustredeni_UcastniciInline(admin.TabularInline): form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel']) @@ -78,6 +106,10 @@ class ResitelAdmin(reversion.VersionAdmin): search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email'] inlines = [ReseniKResiteliInline] + def get_queryset(self, request): + qs = super(ResitelAdmin, self).get_queryset(request) + return qs.select_related('skola', 'user') + admin.site.register(Resitel, ResitelAdmin) @@ -108,6 +140,9 @@ class CisloAdmin(reversion.VersionAdmin): list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne'] list_filter = ['rocnik'] view_on_site = Cislo.verejne_url + def get_queryset(self, request): + qs = super(CisloAdmin, self).get_queryset(request) + return qs.select_related('rocnik') admin.site.register(Cislo, CisloAdmin) @@ -149,20 +184,27 @@ class ReseniAdmin(reversion.VersionAdmin): (u'Poznámky', {'fields': ['poznamka']}), ] readonly_fields = ['timestamp'] - list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp'] + list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp', 'cislo_body'] list_filter = ['body', 'timestamp', 'forma'] search_fields = [] inlines = [PrilohaReseniInline] + def get_queryset(self, request): + qs = super(ReseniAdmin, self).get_queryset(request) + return qs.select_related('resitel', 'problem', 'cislo_body') + admin.site.register(Reseni, ReseniAdmin) ### Problem +from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget + #TODO: Autocomplete autor/opravovatel class ProblemAdminForm(forms.ModelForm): text_problemu = forms.CharField(widget=CKEditorWidget()) text_problemu_org = forms.CharField(widget=CKEditorWidget()) + zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete')) class Meta: model = Problem exclude = [] @@ -182,6 +224,11 @@ class ProblemAdmin(reversion.VersionAdmin): inlines = [ReseniKProblemuInline] view_on_site = Problem.verejne_url + def get_queryset(self, request): + qs = super(ProblemAdmin, self).get_queryset(request) + return qs.select_related('autor', 'opravovatel', 'cislo_zadani', 'cislo_reseni') + + admin.site.register(Problem, ProblemAdmin) diff --git a/seminar/models.py b/seminar/models.py index d9997e03..3f5f59fd 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -54,6 +54,7 @@ class Skola(SeminarModelBase): db_table = 'seminar_skoly' verbose_name = u'Škola' verbose_name_plural = u'Školy' + ordering = ['mesto', 'nazev'] # Interní ID id = models.AutoField(primary_key = True) @@ -238,7 +239,7 @@ class Cislo(SeminarModelBase): db_table = 'seminar_cisla' verbose_name = u'Číslo' verbose_name_plural = u'Čísla' - ordering = ['rocnik__rocnik', 'cislo'] + ordering = ['rocnik_id', 'cislo'] # Interní ID id = models.AutoField(primary_key = True) @@ -264,7 +265,9 @@ class Cislo(SeminarModelBase): kod.short_description = u'Kód čísla' def __str__(self): - return force_unicode(u'%s' % (self.kod(),)) + #TODO: DB HOG + #return force_unicode(u'%s' % (self.kod(),)) + return force_unicode(u'%s' % (self.cislo,)) def verejne(self): return self.verejne_db @@ -297,6 +300,7 @@ class Problem(SeminarModelBase): db_table = 'seminar_problemy' verbose_name = u'Problém' verbose_name_plural = u'Problémy' + ordering = ['nazev'] # Interní ID id = models.AutoField(primary_key = True) @@ -382,7 +386,7 @@ class Reseni(SeminarModelBase): db_table = 'seminar_reseni' verbose_name = u'Řešení' verbose_name_plural = u'Řešení' - ordering = ['problem', 'resitel'] + ordering = ['problem_id', 'resitel_id'] # Interní ID id = models.AutoField(primary_key = True) @@ -412,6 +416,7 @@ class Reseni(SeminarModelBase): def __str__(self): return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) + #TODO: DB HOG # PrilohaReseni method @@ -511,6 +516,7 @@ class Soustredeni_Ucastnici(models.Model): def __str__(self): return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, )) + #TODO: DB HOG @python_2_unicode_compatible @@ -533,6 +539,7 @@ class VysledkyBase(SeminarModelBase): def __str__(self): return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) + #NOTE: DB HOG (ale nepouzivany) @python_2_unicode_compatible class VysledkyZaCislo(VysledkyBase): @@ -543,6 +550,7 @@ class VysledkyZaCislo(VysledkyBase): managed = False def __str__(self): + #NOTE: DB HOG (ale nepouzivany) return force_unicode(u"%s: %sb (za %s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) @@ -557,6 +565,7 @@ class VysledkyKCislu(VysledkyBase): body_celkem = models.IntegerField(u'body celkem do čísla', db_column='body_celkem') def __str__(self): + #NOTE: DB HOG (ale nepouzivany) return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) From a1505485a1cb25646090c943d3879e1b6696b6fd Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 22:30:35 +0200 Subject: [PATCH 7/9] Pridano pocitani reseni problemu a resitelu --- seminar/admin.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 6b4df8b5..f57dbfbb 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -4,6 +4,7 @@ from django import forms import reversion from solo.admin import SingletonModelAdmin from ckeditor.widgets import CKEditorWidget +from django.db.models import Count from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici import autocomplete_light @@ -101,14 +102,18 @@ class ResitelAdmin(reversion.VersionAdmin): (u'Osobní údaje', {'fields': ['pohlavi_muz', 'datum_narozeni', 'email', 'telefon']}), (u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), ] - list_display = ['jmeno', 'prijmeni', 'user', 'pohlavi_muz', 'skola', 'rok_maturity'] + list_display = ['jmeno', 'prijmeni', 'user', 'pohlavi_muz', 'skola', 'rok_maturity', 'pocet_reseni'] list_filter = ['pohlavi_muz', 'rok_maturity', 'zasilat'] search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email'] inlines = [ReseniKResiteliInline] def get_queryset(self, request): qs = super(ResitelAdmin, self).get_queryset(request) - return qs.select_related('skola', 'user') + return qs.select_related('skola', 'user').annotate(pocet_reseni=Count('reseni')) + + def pocet_reseni(self, obj): + return obj.pocet_reseni + admin.site.register(Resitel, ResitelAdmin) @@ -217,7 +222,7 @@ class ProblemAdmin(reversion.VersionAdmin): (None, {'fields': ['text_problemu_org']}), ] readonly_fields = ['timestamp'] - list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani'] + list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani', 'pocet_reseni'] list_select_related = True list_filter = ['typ', 'stav', 'timestamp'] search_fields = ['nazev', 'kod', 'text_problemu_org', 'text_problemu'] @@ -226,8 +231,10 @@ class ProblemAdmin(reversion.VersionAdmin): def get_queryset(self, request): qs = super(ProblemAdmin, self).get_queryset(request) - return qs.select_related('autor', 'opravovatel', 'cislo_zadani', 'cislo_reseni') + return qs.select_related('autor', 'opravovatel', 'cislo_zadani', 'cislo_reseni').annotate(pocet_reseni=Count('reseni')) + def pocet_reseni(self, obj): + return obj.pocet_reseni admin.site.register(Problem, ProblemAdmin) From 93b66fe0ec32f88567d60ec2192b66b33d1f5164 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 21 May 2015 22:58:37 +0200 Subject: [PATCH 8/9] Cache a zrychleni na rocniky (hodne) a tez soustredeni_resitele --- seminar/admin.py | 3 +++ seminar/models.py | 31 +++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index f57dbfbb..38dd0676 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -90,6 +90,9 @@ class Soustredeni_UcastniciInline(admin.TabularInline): fields = ['resitel', 'poznamka', ] extra = 0 + def get_queryset(self, request): + qs = super(Soustredeni_UcastniciInline, self).get_queryset(request) + return qs.select_related('resitel', 'soustredeni') ### Resitel diff --git a/seminar/models.py b/seminar/models.py index 3f5f59fd..9d76092a 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -10,6 +10,8 @@ from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import force_unicode from django.utils.text import slugify from django.core.urlresolvers import reverse +from django.core.cache import cache + from django_countries.fields import CountryField from solo.models import SingletonModel @@ -19,7 +21,6 @@ import reversion from seminar.utils import roman -# TODO společná báze (admin url, url, veřejné, ...) class SeminarModelBase(models.Model): class Meta: @@ -230,6 +231,16 @@ class Rocnik(SeminarModelBase): def verejne_url(self): return reverse('seminar_rocnik', kwargs={'pk': self.id}) + @classmethod + def cached_rocnik(cls, r_id): + name = 'rocnik_%s' % (r_id, ) + c = cache.get(name) + if c is None: + c = cls.objects.get(id=r_id) + cache.set(name, c, 300) + return c + + @reversion.register(ignore_duplicate_revisions=True) @python_2_unicode_compatible @@ -239,7 +250,7 @@ class Cislo(SeminarModelBase): db_table = 'seminar_cisla' verbose_name = u'Číslo' verbose_name_plural = u'Čísla' - ordering = ['rocnik_id', 'cislo'] + ordering = ['rocnik__rocnik', 'cislo'] # Interní ID id = models.AutoField(primary_key = True) @@ -265,9 +276,9 @@ class Cislo(SeminarModelBase): kod.short_description = u'Kód čísla' def __str__(self): - #TODO: DB HOG - #return force_unicode(u'%s' % (self.kod(),)) - return force_unicode(u'%s' % (self.cislo,)) + # Potenciální DB HOG, pokud by se ročník neckešoval + r = Rocnik.cached_rocnik(self.rocnik_id) + return force_unicode(u'%s.%s' % (r.rocnik, self.cislo, )) def verejne(self): return self.verejne_db @@ -416,7 +427,7 @@ class Reseni(SeminarModelBase): def __str__(self): return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) - #TODO: DB HOG + # NOTE: Potenciální DB HOG (bez select_related) # PrilohaReseni method @@ -516,7 +527,7 @@ class Soustredeni_Ucastnici(models.Model): def __str__(self): return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, )) - #TODO: DB HOG + # NOTE: Poteciální DB HOG bez select_related @python_2_unicode_compatible @@ -539,7 +550,7 @@ class VysledkyBase(SeminarModelBase): def __str__(self): return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) - #NOTE: DB HOG (ale nepouzivany) + # NOTE: DB HOG (ale nepouzivany) @python_2_unicode_compatible class VysledkyZaCislo(VysledkyBase): @@ -550,7 +561,7 @@ class VysledkyZaCislo(VysledkyBase): managed = False def __str__(self): - #NOTE: DB HOG (ale nepouzivany) + # NOTE: DB HOG (ale nepouzivany) return force_unicode(u"%s: %sb (za %s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) @@ -565,7 +576,7 @@ class VysledkyKCislu(VysledkyBase): body_celkem = models.IntegerField(u'body celkem do čísla', db_column='body_celkem') def __str__(self): - #NOTE: DB HOG (ale nepouzivany) + # NOTE: DB HOG (ale nepouzivany) return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) From ff0aac3d572186f5ec7dc216f310ab004b44b407 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Fri, 22 May 2015 00:10:07 +0200 Subject: [PATCH 9/9] Uprava poznamek na neomez. vel., uprava inline adminu --- seminar/admin.py | 18 ++++++++++- seminar/migrations/0014_uprava_poznamek.py | 36 +++++++++------------- seminar/models.py | 12 ++++---- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 38dd0676..31e6027b 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- from django.contrib import admin from django import forms +from django.forms import widgets import reversion from solo.admin import SingletonModelAdmin from ckeditor.widgets import CKEditorWidget from django.db.models import Count +from django.db import models from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici import autocomplete_light @@ -31,6 +33,9 @@ class CisloInline(admin.TabularInline): fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka'] readonly_fields = ['cislo'] extra = 0 + formfield_overrides = { + models.TextField: {'widget': forms.TextInput}, + } def has_add_permission(self, req): return False @@ -39,16 +44,21 @@ class PrilohaReseniInline(admin.StackedInline): model = PrilohaReseni fields = ['timestamp', 'soubor', 'poznamka'] readonly_fields = ['timestamp'] + formfield_overrides = { + models.TextField: {'widget': forms.TextInput}, + } extra = 0 - class ReseniKProblemuInline(admin.TabularInline): form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitel'], fields=['resitel']) model = Reseni fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] readonly_fields = ['timestamp'] extra = 0 + formfield_overrides = { + models.TextField: {'widget': forms.TextInput}, + } def get_queryset(self, request): qs = super(ReseniKProblemuInline, self).get_queryset(request) @@ -68,6 +78,9 @@ class ReseniKResiteliInline(admin.TabularInline): fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] readonly_fields = ['timestamp', 'problem'] extra = 0 + formfield_overrides = { + models.TextField: {'widget': forms.TextInput}, + } def has_add_permission(self, req): return False @@ -89,6 +102,9 @@ class Soustredeni_UcastniciInline(admin.TabularInline): model = Soustredeni_Ucastnici fields = ['resitel', 'poznamka', ] extra = 0 + formfield_overrides = { + models.TextField: {'widget': forms.TextInput}, + } def get_queryset(self, request): qs = super(Soustredeni_UcastniciInline, self).get_queryset(request) diff --git a/seminar/migrations/0014_uprava_poznamek.py b/seminar/migrations/0014_uprava_poznamek.py index a35a0dc1..0eb34984 100644 --- a/seminar/migrations/0014_uprava_poznamek.py +++ b/seminar/migrations/0014_uprava_poznamek.py @@ -11,16 +11,22 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AlterModelOptions( + name='problem', + options={'ordering': ['nazev'], 'verbose_name': 'Probl\xe9m', 'verbose_name_plural': 'Probl\xe9my'}, + ), + migrations.AlterModelOptions( + name='reseni', + options={'ordering': ['problem_id', 'resitel_id'], 'verbose_name': '\u0158e\u0161en\xed', 'verbose_name_plural': '\u0158e\u0161en\xed'}, + ), + migrations.AlterModelOptions( + name='skola', + options={'ordering': ['mesto', 'nazev'], 'verbose_name': '\u0160kola', 'verbose_name_plural': '\u0160koly'}, + ), migrations.AddField( model_name='cislo', name='poznamka', - field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u010d\xedslu (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), - preserve_default=True, - ), - migrations.AlterField( - model_name='prilohareseni', - name='poznamka', - field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k p\u0159\xedloze \u0159e\u0161en\xed (plain text), nap\u0159. o p\u016fvodu', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + field=models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u010d\xedslu (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), preserve_default=True, ), migrations.AlterField( @@ -32,25 +38,13 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='reseni', name='poznamka', - field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u0159e\u0161en\xed (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), - preserve_default=True, - ), - migrations.AlterField( - model_name='resitel', - name='poznamka', - field=models.TextField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u0159e\u0161iteli (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), - preserve_default=True, - ), - migrations.AlterField( - model_name='skola', - name='poznamka', - field=models.TextField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka ke \u0161kole (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + field=models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \u0159e\u0161en\xed (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), preserve_default=True, ), migrations.AlterField( model_name='soustredeni_ucastnici', name='poznamka', - field=models.CharField(default=b'', help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \xfa\u010dasti (plain text)', max_length=128, verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), + field=models.TextField(help_text='Neve\u0159ejn\xe1 pozn\xe1mka k \xfa\u010dasti (plain text)', verbose_name='neve\u0159ejn\xe1 pozn\xe1mka', blank=True), preserve_default=True, ), ] diff --git a/seminar/models.py b/seminar/models.py index 9d76092a..e601b807 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -98,7 +98,7 @@ class Skola(SeminarModelBase): je_zs = models.BooleanField(u'základní stupeň', default=True) je_ss = models.BooleanField(u'střední stupeň', default=True) - poznamka = models.TextField(u'neveřejná poznámka', blank=True, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka ke škole (plain text)') def __str__(self): @@ -172,7 +172,7 @@ class Resitel(SeminarModelBase): stat = CountryField(u'stát', default='CZ', help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') - poznamka = models.TextField(u'neveřejná poznámka', blank=True, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k řešiteli (plain text)') # Staré (do 2015) MAMOPER.MM_RIESITELIA.ID z DAKOS -- jen u importovaných záznamů @@ -268,7 +268,7 @@ class Cislo(SeminarModelBase): verejne_db = models.BooleanField(u'číslo zveřejněno', db_column='verejne', default=False) - poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k číslu (plain text)') def kod(self): @@ -422,7 +422,7 @@ class Reseni(SeminarModelBase): ] forma = models.CharField(u'forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, default=FORMA_PAPIR) - poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k řešení (plain text)') def __str__(self): @@ -459,7 +459,7 @@ class PrilohaReseni(SeminarModelBase): soubor = models.FileField(u'soubor', upload_to = generate_filename) - poznamka = models.CharField(u'neveřejná poznámka', blank=True, max_length=128, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k příloze řešení (plain text), např. o původu') def __str__(self): @@ -522,7 +522,7 @@ class Soustredeni_Ucastnici(models.Model): soustredeni = models.ForeignKey(Soustredeni, verbose_name=u'soustředění') - poznamka = models.CharField(u'neveřejná poznámka', max_length=128, blank=True, default='', + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k účasti (plain text)') def __str__(self):