From eb4aaccccb0e4e49a699dee0423d902403df2538 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 11 May 2015 12:56:39 +0200 Subject: [PATCH] Modely: spolecny zaklad, url resolve, model Soustredeni --- seminar/migrations/0003_auto_20150511_0947.py | 71 +++++++++++ seminar/migrations/0004_auto_20150511_1215.py | 38 ++++++ seminar/models.py | 115 ++++++++++++++---- 3 files changed, 203 insertions(+), 21 deletions(-) create mode 100644 seminar/migrations/0003_auto_20150511_0947.py create mode 100644 seminar/migrations/0004_auto_20150511_1215.py diff --git a/seminar/migrations/0003_auto_20150511_0947.py b/seminar/migrations/0003_auto_20150511_0947.py new file mode 100644 index 00000000..0c0a1aec --- /dev/null +++ b/seminar/migrations/0003_auto_20150511_0947.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0002_add_body_views'), + ] + + operations = [ + migrations.CreateModel( + name='VysledkyKCislu', + fields=[ + ('dummy_id', models.CharField(max_length=32, serialize=False, verbose_name='dummy ID pro view', primary_key=True, db_column=b'id')), + ('body', models.IntegerField(verbose_name='body za \u010d\xedslo', db_column=b'body')), + ('body_celkem', models.IntegerField(verbose_name='body celkem do \u010d\xedsla', db_column=b'body_celkem')), + ], + options={ + 'abstract': False, + 'db_table': 'seminar_body_k_cislu', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='VysledkyZaCislo', + fields=[ + ('dummy_id', models.CharField(max_length=32, serialize=False, verbose_name='dummy ID pro view', primary_key=True, db_column=b'id')), + ('body', models.IntegerField(verbose_name='body za \u010d\xedslo', db_column=b'body')), + ], + options={ + 'abstract': False, + 'db_table': 'seminar_body_za_cislo', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Soustredeni', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True)), + ('datum_zacatku', models.DateField(help_text='Prvn\xed den soust\u0159ed\u011bn\xed', null=True, verbose_name='datum za\u010d\xe1tku', blank=True)), + ('datum_konce', models.DateField(help_text='Posledn\xed den soust\u0159ed\u011bn\xed', null=True, verbose_name='datum konce', blank=True)), + ('misto', models.CharField(default=b'', help_text='M\xedsto (n\xe1zev obce, voliteln\u011b t\xe9\u017e objektu', max_length=256, verbose_name='m\xedsto soust\u0159ed\u011bn\xed', blank=True)), + ('rocnik', models.ForeignKey(related_name='soustredeni', verbose_name='ro\u010dn\xedk', to='seminar.Rocnik')), + ('ucastnici', models.ManyToManyField(help_text='Seznam \xfa\u010dastn\xedk\u016f soust\u0159ed\u011bn\xed', to='seminar.Resitel', db_table=b'seminar_soustredeni_ucastnici', verbose_name='\xfa\u010dastn\xedci soust\u0159ed\u011bn\xed')), + ], + options={ + 'ordering': ['rocnik__rocnik', 'datum_zacatku'], + 'db_table': 'seminar_soustredeni', + 'verbose_name': 'Soust\u0159ed\u011bn\xed', + 'verbose_name_plural': 'Soust\u0159ed\u011bn\xed', + }, + bases=(models.Model,), + ), + migrations.AlterField( + model_name='cislo', + name='cislo', + field=models.CharField(help_text='V\u011bt\u0161inou jen "1", vyj\xedme\u010dn\u011b "7-8", lexikograficky ur\u010dije po\u0159ad\xed v ro\u010dn\xedku!', max_length=32, verbose_name='n\xe1zev \u010d\xedsla'), + preserve_default=True, + ), + migrations.AlterField( + model_name='cislo', + name='rocnik', + field=models.ForeignKey(related_name='cisla', verbose_name='ro\u010dn\xedk', to='seminar.Rocnik'), + preserve_default=True, + ), + ] diff --git a/seminar/migrations/0004_auto_20150511_1215.py b/seminar/migrations/0004_auto_20150511_1215.py new file mode 100644 index 00000000..36ebd9e9 --- /dev/null +++ b/seminar/migrations/0004_auto_20150511_1215.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0003_auto_20150511_0947'), + ] + + operations = [ + migrations.AddField( + model_name='cislo', + name='verejne_db', + field=models.BooleanField(default=False, verbose_name='\u010d\xedslo zve\u0159ejn\u011bno', db_column=b'verejne'), + preserve_default=True, + ), + migrations.AddField( + model_name='reseni', + name='poznamka', + 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.AddField( + model_name='resitel', + name='poznamka', + field=models.TextField(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.AddField( + model_name='soustredeni', + name='verejne_db', + field=models.BooleanField(default=False, verbose_name='soust\u0159ed\u011bn\xed zve\u0159ejn\u011bno', db_column=b'verejne'), + preserve_default=True, + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 5bc6933e..54ff0b22 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -9,17 +9,35 @@ from django.utils import timezone from django.conf import settings 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_countries.fields import CountryField from solo.models import SingletonModel -class SeminarModel(models.Model): +from seminar.utils import roman + +# TODO společná báze (admin url, url, veřejné, ...) +class SeminarModelBase(models.Model): class Meta: abstract = True + def verejne(self): + return False + + def public_url(self): + if self.Meta.url_name: + return reverse(self.Meta.url_name, + kwargs={'id': self.id, 'pk': self.id}) + return None + def admin_url(self): + model_name = self.__class__.__name__.lower() + return reverse('admin:seminar_%s_change'%(model_name, ), args=(self.id, )) + + def verejne_url(self): + return None # # Mělo by být částečně vytaženo z Aesopa @@ -27,7 +45,7 @@ class SeminarModel(models.Model): # @python_2_unicode_compatible -class Skola(models.Model): +class Skola(SeminarModelBase): class Meta: db_table = 'seminar_skoly' @@ -72,7 +90,7 @@ class Skola(models.Model): @python_2_unicode_compatible -class Resitel(models.Model): +class Resitel(SeminarModelBase): class Meta: db_table = 'seminar_resitele' @@ -137,6 +155,9 @@ class Resitel(models.Model): 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, + help_text=u'Neveřejná poznámka k řešiteli (plain text)') + def plne_jmeno(self): return force_unicode(u'%s %s' % (self.jmeno, self.prijmeni)) @@ -145,7 +166,7 @@ class Resitel(models.Model): @python_2_unicode_compatible -class Rocnik(models.Model): +class Rocnik(SeminarModelBase): class Meta: db_table = 'seminar_rocniky' @@ -169,6 +190,9 @@ class Rocnik(models.Model): else: return force_unicode(self.rocnik) + def verejne(self): + return len(self.verejne_cisla()) > 0 + def verejna_cisla(self): vc = [c for c in self.cisla.all() if c.verejne()] vc.sort(key=lambda c: c.cislo) @@ -181,8 +205,12 @@ class Rocnik(models.Model): def druhy_rok(self): return self.prvni_rok + 1 + def verejne_url(self): + return reverse('seminar_rocnik', kwargs={'pk': self.id}) + + @python_2_unicode_compatible -class Cislo(models.Model): +class Cislo(SeminarModelBase): class Meta: db_table = 'seminar_cisla' @@ -204,6 +232,8 @@ class Cislo(models.Model): datum_deadline = models.DateField(u'datum deadline', blank=True, null=True, help_text=u'Datum pro příjem řešení úloh zadaných v tomto čísle') + verejne_db = models.BooleanField(u'číslo zveřejněno', db_column='verejne', default=False) + def kod(self): return u'%s.%s' % (self.rocnik.rocnik, self.cislo) kod.short_description = u'Kód čísla' @@ -212,14 +242,14 @@ class Cislo(models.Model): return force_unicode(u'%s' % (self.kod(),)) def verejne(self): - return (self.datum_vydani and self.datum_vydani <= datetime.date.today()) + return self.verejne_db - def get_absolute_url(self): - return reverse('seminar.cislo', args=[str(self.id)]) + def verejne_url(self): + return reverse('seminar_cislo', kwargs={'pk': self.id}) @python_2_unicode_compatible -class Problem(models.Model): +class Problem(SeminarModelBase): class Meta: db_table = 'seminar_problemy' @@ -285,9 +315,15 @@ class Problem(models.Model): return force_unicode(u"t%s" % (self.kod,)) return '' + def verejne(self): + return (self.cislo_zadani and self.cislo_zadani.verejne()) + + def verejne_url(self): + return reverse('seminar_problem', kwargs={'pk': self.id}) + @python_2_unicode_compatible -class Reseni(models.Model): +class Reseni(SeminarModelBase): class Meta: db_table = 'seminar_reseni' @@ -308,6 +344,9 @@ class Reseni(models.Model): timestamp = models.DateTimeField(u'vytvořeno', auto_now=True) + 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): return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) @@ -321,8 +360,9 @@ def generate_filename(self, filename): clean) return os.path.join(settings.SEMINAR_RESENI_DIRNAME, datedir, fname) + @python_2_unicode_compatible -class PrilohaReseni(models.Model): +class PrilohaReseni(SeminarModelBase): class Meta: db_table = 'seminar_priloha_reseni' @@ -343,7 +383,44 @@ class PrilohaReseni(models.Model): return force_unicode(self.soubor) -class VysledkyBase(models.Model): +@python_2_unicode_compatible +class Soustredeni(SeminarModelBase): + + class Meta: + db_table = 'seminar_soustredeni' + verbose_name = u'Soustředění' + verbose_name_plural = u'Soustředění' + ordering = ['rocnik__rocnik', 'datum_zacatku'] + + # Interní ID + id = models.AutoField(primary_key = True) + + rocnik = models.ForeignKey(Rocnik, verbose_name=u'ročník', related_name='soustredeni') + + datum_zacatku = models.DateField(u'datum začátku', blank=True, null=True, + help_text=u'První den soustředění') + + datum_konce = models.DateField(u'datum konce', blank=True, null=True, + help_text=u'Poslední den soustředění') + + verejne_db = models.BooleanField(u'soustředění zveřejněno', db_column='verejne', default=False) + + misto = models.CharField(u'místo soustředění', max_length=256, blank=True, default='', + 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') + + def __str__(self): + return force_unicode(u'%s (%s)' % (self.misto, self.datum_zacatek)) + + def verejne(self): + return self.verejne_db + + def verejne_url(self): + return reverse('seminar_soustredeni', kwargs={'pk': self.id}) + +class VysledkyBase(SeminarModelBase): class Meta: verbose_name = u'Řádek výsledkovky' @@ -400,12 +477,8 @@ class Nastaveni(SingletonModel): def __str__(self): return u'Nastavení semináře' - -def roman(num): - ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) - nums = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I') - res = "" - for i, n in zip(ints, nums): - res += n * (num // i) - num %= i - return res + def admin_url(self): + return reverse('admin:seminar_nastaveni_change', args=(self.id, )) + + def verejne(self): + return False