diff --git a/README.md b/README.md index 5f6510d2..87f51b71 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,9 @@ Make commands enhanced compared to `./manage.py runserver`. Open [127.0.0.1:8000](127.0.0.1:8000). +* `./manage.py testdata` - create pseudo-random seminar data and admin/admin + user. + * `./manage.py test` - run the tests. diff --git a/seminar/admin.py b/seminar/admin.py index 7b7afdb0..87488893 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -15,7 +15,7 @@ class SkolaAdmin(admin.ModelAdmin): (u'Interní ID', {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), (u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), ] - list_display = ['nazev', 'aesop_id', 'mesto'] + list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat'] search_fields = ['nazev', 'mesto', 'ulice'] admin.site.register(Skola, SkolaAdmin) @@ -93,7 +93,7 @@ class ReseniAdmin(admin.ModelAdmin): (None, {'fields': ['problem', 'resitel', 'body', 'cislo_body', 'timestamp']}), ] list_display = ['problem', 'resitel', 'body', 'timestamp'] - list_filter = ['problem', 'resitel', 'body', 'timestamp'] + list_filter = ['body', 'timestamp'] search_fields = [] inlines = [PrilohaReseniInline] diff --git a/seminar/management/__init__.py b/seminar/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/seminar/management/commands/.testdata.py.swp b/seminar/management/commands/.testdata.py.swp new file mode 100644 index 00000000..b6a2d787 Binary files /dev/null and b/seminar/management/commands/.testdata.py.swp differ diff --git a/seminar/management/commands/__init__.py b/seminar/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/seminar/management/commands/testdata.py b/seminar/management/commands/testdata.py new file mode 100644 index 00000000..dfba605f --- /dev/null +++ b/seminar/management/commands/testdata.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- + +import datetime +import os +import random + +from django.core.management.base import NoArgsCommand +from django.core.management import call_command +from django.conf import settings + +class Command(NoArgsCommand): + help = "Clear database and load testing data." + + def handle_noargs(self, **options): + assert settings.DEBUG == True + dbfile = settings.DATABASES['default']['NAME'] + if os.path.exists(dbfile): + os.rename(dbfile, dbfile + '.old') + self.stderr.write('Stara databaze prejmenovana na "%s"' % (dbfile + '.old')) + call_command('migrate', noinput=True) + self.load_testing_data() + + def load_testing_data(self): + from seminar import models as sm + import django.contrib.auth + User = django.contrib.auth.get_user_model() + + self.stderr.write('Vytvarim uzivatele "admin" (heslo "admin")') + + # pevna pseudo-nahodnost + rnd = random.Random(x=42) + + # users + admin = User.objects.create_superuser(username='admin', email='', password='admin') + + self.stderr.write('Vytvarim pseudo-nahodna data') + + orgs = [] + for org in ['anet', 'bara', 'cyril', 'david', 'eva', 'filip']: + o = User.objects.create_user(username=org, password=org) + o.first_name = org.capitalize() + o.save() + orgs.append(o) + + # skoly + sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='101 00', ulice=u'Krátká 5', nazev=u'První SŠ') + sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='102 00', ulice=u'Dlouhá 5', nazev=u'Druhá SŠ') + sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='103 00', ulice=u'Široká 3', nazev=u'Třetí SŠ') + sm.Skola.objects.create(mesto = u'Ostrava', stat='CZ', psc='700 00', ulice=u'Hluboká 42', nazev=u'Hutní gympl') + sm.Skola.objects.create(mesto = u'Humenné', stat='SK', psc='012 34', ulice=u'Pltká 1', nazev=u'Sredná škuola') + + # resitele + for i in range(20): + skola = rnd.choice(sm.Skola.objects.all()) + pohlavi = rnd.randint(0,1) + sm.Resitel.objects.create(skola = skola, datum_prihlaseni = datetime.date(rnd.randint(2002, 2014), rnd.randint(1,12), 1), + jmeno = u'Řešitel' if pohlavi else u'Řešitelka', prijmeni = 'Číslo-%s' % (i), rok_maturity = rnd.randint(2015, 2019), + stat = skola.stat, zasilat = sm.Resitel.ZASILAT_NIKAM, pohlavi_muz = pohlavi) + + # rocniky + for ri in range(17, 22): + r = sm.Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) + + # cisla + cisel = rnd.randint(4, 6) + cs = {} + for ci in range(1, cisel + 1): + vydano = datetime.date(r.prvni_rok, ci + 6, 1) + deadline = datetime.date(r.prvni_rok, ci + 8, 1) if ci + 2 < cisel else None + c = sm.Cislo.objects.create(rocnik = r, cislo = str(ci), datum_vydani=vydano, datum_deadline=deadline) + cs[ci] = c + + # problemy resene v ci + seq='#ABCDEFGHIJKLMNOPQRSTUVWXYZ' + if ci >= 3: + for pi in range(1, 4): + p = sm.Problem.objects.create(autor = rnd.choice(orgs), cislo_zadani=cs[ci-2], cislo_reseni=cs[ci], + opravovatel = rnd.choice(orgs), kod = str(pi), nazev = u'Dummy úloha %s-%s' % (seq[ci], seq[pi]), + stav = sm.Problem.STAV_ZADANY, typ = sm.Problem.TYP_ULOHA, body = rnd.randint(1, 5)) + + for resi in range(rnd.randint(0, 7)): + res = sm.Reseni.objects.create(problem = p, resitel = rnd.choice(sm.Resitel.objects.all()), + body = rnd.randint(0, p.body), cislo_body = cs[ci]) + + nastaveni = sm.Nastaveni.objects.create(aktualni_rocnik = sm.Rocnik.objects.last(), + aktualni_cislo = sm.Cislo.objects.last()) + + self.stderr.write('Vytvoreno %d uzivatelu, %d skol, %d resitelu, %d rocniku, %d cisel, %d problemu, %d reseni.' % + (User.objects.count(), sm.Skola.objects.count(), sm.Resitel.objects.count(), sm.Rocnik.objects.count(), + sm.Cislo.objects.count(), sm.Problem.objects.count(), sm.Reseni.objects.count())) + + + + + + + + + diff --git a/seminar/models.py b/seminar/models.py index b1a4da36..dbfa5f22 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -56,7 +56,7 @@ class Skola(models.Model): # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) # Ekvivalentní s CharField(max_length=2, default='CZ', ...) - stat = CountryField(u'kód státu', default='CZ', + stat = CountryField(u'stát', default='CZ', help_text=u'ISO 3166-1 kód zeme velkými písmeny (CZ, SK, ...)') def __str__(self): @@ -85,7 +85,7 @@ class Resitel(models.Model): # Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování) pohlavi_muz = models.BooleanField(u'pohlaví (muž)', default=False) - skola = models.OneToOneField(Skola, blank=True, null=True, verbose_name=u'škola') + skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name=u'škola') # Očekávaný rok maturity a vyřazení z aktivních řešitelů rok_maturity = models.IntegerField(u'rok maturity') @@ -126,7 +126,7 @@ class Resitel(models.Model): # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) # Ekvivalentní s CharField(max_length=2, default='CZ', ...) - stat = CountryField(u'kód státu', default='CZ', + stat = CountryField(u'stát', default='CZ', help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') def plne_jmeno(self): @@ -242,6 +242,8 @@ class Problem(models.Model): cislo_reseni = models.ForeignKey(Cislo, verbose_name=u'číslo řešení', blank=True, null=True, related_name=u'resene_problemy', help_text=u'Číslo s řešením úlohy, jen pro úlohy') + body = models.IntegerField(u'maximum bodů', blank=True, null=True) + def __str__(self): return force_unicode(u'%s (%s)' % (self.nazev, self.stav))