From b21fcb3562bc8e968c8252232fdffdee07aad3c6 Mon Sep 17 00:00:00 2001 From: LEdoian Date: Mon, 10 Jun 2019 22:41:02 +0200 Subject: [PATCH 1/8] =?UTF-8?q?U=C5=BEite=C4=8Dn=C4=9Bj=C5=A1=C3=AD=20chyb?= =?UTF-8?q?ov=C3=A9=20v=C3=BDpisy=20a=20navr=C3=A1cen=C3=AD=20erroru=20tam?= =?UTF-8?q?,=20kam=20pat=C5=99=C3=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/migrations/0058_problem_to_uloha_tema_clanek.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/seminar/migrations/0058_problem_to_uloha_tema_clanek.py b/seminar/migrations/0058_problem_to_uloha_tema_clanek.py index 7b43cdc6..333f5453 100644 --- a/seminar/migrations/0058_problem_to_uloha_tema_clanek.py +++ b/seminar/migrations/0058_problem_to_uloha_tema_clanek.py @@ -91,8 +91,7 @@ def clanek_to_Clanek(apps,schema_editor): elif cl.cislo_reseni_old == cl.cislo_zadani_old: cislo = cl.cislo_zadani_old else: - cislo = cl.cislo_zadani_old - #raise ValueError("Různá čísla zadání a řešení u článku!") + raise ValueError("Různá čísla zadání a řešení u článku! (Článek: {})".format(cl.nazev)) clnew = Clanek.objects.create( problem_ptr = cl, @@ -132,7 +131,7 @@ def tema_to_Tema(apps, schema_editor): elif t.cislo_reseni_old.rocnik == t.cislo_zadani_old.rocnik: rocnik = t.cislo_zadani_old.rocnik else: - raise ValueError("Nelze mít téma přes více ročníků!") + raise ValueError("Nelze mít téma přes více ročníků! (Téma: {}".format(t.nazev)) tnew = Tema.objects.create( problem_ptr = t, From 4f2e56ce06c07feb1cd1a6613d00759f4ea212c2 Mon Sep 17 00:00:00 2001 From: Anet Date: Mon, 10 Jun 2019 22:51:37 +0200 Subject: [PATCH 2/8] =?UTF-8?q?models.py:=20OneToOneFieldy=20do=20koment?= =?UTF-8?q?=C3=A1=C5=99=C5=AF,=20zal=C3=A1m=C3=A1n=C3=AD=20textu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/seminar/models.py b/seminar/models.py index d94d1e3d..760c5c57 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -115,6 +115,11 @@ class Osoba(SeminarModelBase): ], options={'quality': 95}) + # má OneToOneField nejvýše s: + # Resitel + # Prijemce + # Organizator + def plne_jmeno(self): return '{} {}'.format(self.jmeno, self.prijmeni) @@ -314,7 +319,11 @@ class Rocnik(SeminarModelBase): rocnik = models.IntegerField('číslo ročníku', db_index=True, unique=True) exportovat = models.BooleanField('export do AESOPa', db_column='exportovat', default=False, - help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti), a to jen čísla s veřejnou výsledkovkou') + help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti),' + ' a to jen čísla s veřejnou výsledkovkou') + + # má OneToOneField s: + # RocnikNode def __str__(self): return '{} ({}/{})'.format(self.rocnik, self.prvni_rok, self.prvni_rok+1) @@ -409,6 +418,8 @@ class Cislo(SeminarModelBase): pdf = models.FileField('pdf', upload_to=cislo_pdf_filename, null=True, blank=True, help_text='Pdf čísla, které si mohou řešitelé stáhnout') + # má OneToOneField s: + # CisloNode def kod(self): return '%s.%s' % (self.rocnik.rocnik, self.cislo) @@ -560,7 +571,10 @@ class Problem(SeminarModelBase): class Meta: # Není abstraktní, protože se na něj jinak nedají dělat ForeignKeys. - # TODO: Udělat to polymorfní (pomocí django-polymorphic), abychom dostali po těch vazbách přímo tu úlohu/témátko vč. fieldů, které nejsou součástí modelu Problem? + # TODO: Udělat to polymorfní (pomocí django-polymorphic), abychom dostali + # po těch vazbách přímo tu úlohu/témátko vč. fieldů, které nejsou součástí + # modelu Problem? + #abstract = True db_table = 'seminar_problemy' verbose_name = 'Problém' @@ -678,6 +692,10 @@ class Clanek(Problem): verbose_name_plural = 'Články' cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True) + + # má OneToOneField s: + # ClanekNode + def kod_v_rocniku(self): if self.stav == 'zadany': # Nemělo by být potřeba @@ -698,8 +716,12 @@ class Text(SeminarModelBase): do_cisla = models.TextField('text do čísla', blank=True, help_text='Text ke zveřejnění v čísle') + # má OneToOneField s: + # Reseni (je u něj jako reseni_cele) + # obrázky mají návaznost opačným směrem (vazba z druhé strany) + class Uloha(Problem): class Meta: @@ -720,6 +742,10 @@ class Uloha(Problem): max_body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name='maximum bodů', blank=True, null=True) + # má OneToOneField s: + # UlohaZadaniNode + # UlohaVzorakNode + def kod_v_rocniku(self): if self.stav == 'zadany': name="{}.u{}".format(self.cislo_zadani.cislo,self.kod) @@ -729,7 +755,6 @@ class Uloha(Problem): return '' - @reversion.register(ignore_duplicates=True) class Reseni(SeminarModelBase): @@ -776,6 +801,9 @@ class Reseni(SeminarModelBase): zverejneno = models.BooleanField('řešení zveřejněno', default=False, help_text='Udává, zda je řešení zveřejněno') + # má OneToOneField s: + # Konfera + def __str__(self): return "{}: {}".format(self.resitel.osoba.plne_jmeno(), self.problem.nazev) # NOTE: Potenciální DB HOG (bez select_related) @@ -897,6 +925,9 @@ class Pohadka(SeminarModelBase): editable=False ) + # má OneToOneField s: + # PohadkaNode + def __str__(self): uryvek = self.text if len(self.text) < 50 else self.text[:(50-3)]+"..." return uryvek @@ -1001,6 +1032,9 @@ class Konfera(models.Model): help_text = 'Další materiály ke konfeře zabalené do jednoho souboru', upload_to = generate_filename_konfera, blank=True) + # má OneToOneField s: + # KonferaNode + def __str__(self): return "{}: ({})".format(self.nazev, self.soustredeni) From ecfc5e6905f9bf3fa3e85feae9dd559e10516837 Mon Sep 17 00:00:00 2001 From: Anet Date: Mon, 10 Jun 2019 23:40:31 +0200 Subject: [PATCH 3/8] =?UTF-8?q?views,=20old=5Fviews:=20p=C5=99esunut=C3=AD?= =?UTF-8?q?=20n=C4=9Bkter=C3=BDch=20nepou=C5=BE=C3=ADvan=C3=BDch=20views?= =?UTF-8?q?=20do=20separ=C3=A1tn=C3=ADho=20souboru,=20aby=20nep=C5=99ek?= =?UTF-8?q?=C3=A1=C5=BEely?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/old_views.py | 71 ++++++++++++++++++++++++++++++++++++++++++++ seminar/views.py | 66 ---------------------------------------- 2 files changed, 71 insertions(+), 66 deletions(-) create mode 100644 seminar/old_views.py diff --git a/seminar/old_views.py b/seminar/old_views.py new file mode 100644 index 00000000..f904d137 --- /dev/null +++ b/seminar/old_views.py @@ -0,0 +1,71 @@ +# Tento soubor slouží k odkládání aktuálně nepotřebného kódu, který by +# se však v budoucnu mohl opět hodit. + +################################################################### + +## Prispevek byl zrusen, mozna ale bude podobny nahled na neco jineho. +#class PrispevekView(generic.DetailView): +# model = Prispevek +# template_name = 'seminar/archiv/prispevek.html' +# +# # Vlastni ziskavani objektu z databaze podle prispevku +# # pokud je prispevek neverejny zobrazi se jenom orgum +# def get_object(self, queryset=None): +# if queryset is None: +# queryset = self.get_queryset() +# problem_arg = self.kwargs.get('pk') +# prispevek_arg = self.kwargs.get('prispevek') +# queryset = queryset.filter(pk=prispevek_arg) +# +# try: +# obj = queryset.get() +# except queryset.model.DoesNotExist: +# raise Http404(_("No %(verbose_name)s found matching the query") % +# {'verbose_name': queryset.model._meta.verbose_name}) +# +# if self.request.user.is_staff or obj.zverejnit: +# return obj +# else: +# raise Http404() +# +# def get_context_data(self, **kwargs): +# context = super(PrispevekView, self).get_context_data(**kwargs) +# # snaho o ziskani titulu +# titul = '' +# try: +# resitel = context['prispevek'].reseni.resitel +# cislo = context['prispevek'].reseni.cislo_body +# body = VysledkyKCisluOdjakziva.objects.get(resitel=resitel, +# cislo=cislo).body +# titul = resitel.get_titul(body) +# except: +# pass +# context['titul'] = titul +# return context + +#################################################################### + +## Stvrzenky aktuálně nevydáváme, ale možná časem zase budeme. +#def soustredeniStvrzenkyExportView(request,soustredeni,first_num): +# first_num = int(first_num) +# soustredeni = get_object_or_404(Soustredeni,id = soustredeni) +# ucastnici = Resitel.objects.filter(soustredeni=soustredeni) +# for (idx,u) in enumerate(ucastnici): +# u.cislo_stvrzenky = first_num+idx; +# tex = render(request,'seminar/soustredeni/ucastnici.tex', {'ucastnici': ucastnici, 'datum':soustredeni.datum_zacatku }).content +# +# tempdir = tempfile.mkdtemp() +# with open(tempdir+"/ucastnici.tex","w") as texfile: +# # Pokud TeX chce ISO Latin, tak se da encode nastavit +# texfile.write(tex.decode("utf-8").encode("utf-8")) +# shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenka.sty'),tempdir) +# shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenky.tex'),tempdir) +# subprocess.call(["cslatex","stvrzenky.tex"],cwd = tempdir) +# subprocess.call(["dvipdf","stvrzenky.dvi"],cwd = tempdir) +# +# with open(tempdir+"/stvrzenky.pdf","rb") as pdffile: +# response = HttpResponse(pdffile.read(),content_type='application/pdf') +# shutil.rmtree(tempdir) +# return response + + diff --git a/seminar/views.py b/seminar/views.py index 3f01376f..aba2b55e 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -377,47 +377,6 @@ class ProblemView(generic.DetailView): context['reseni'] = Reseni.objects.filter(problem=context['problem']).select_related('resitel').order_by('resitel__prijmeni') return context -## Prispevek byl zrusen, mozna ale bude podobny nahled na neco jineho. -#class PrispevekView(generic.DetailView): -# model = Prispevek -# template_name = 'seminar/archiv/prispevek.html' -# -# # Vlastni ziskavani objektu z databaze podle prispevku -# # pokud je prispevek neverejny zobrazi se jenom orgum -# def get_object(self, queryset=None): -# if queryset is None: -# queryset = self.get_queryset() -# problem_arg = self.kwargs.get('pk') -# prispevek_arg = self.kwargs.get('prispevek') -# queryset = queryset.filter(pk=prispevek_arg) -# -# try: -# obj = queryset.get() -# except queryset.model.DoesNotExist: -# raise Http404(_("No %(verbose_name)s found matching the query") % -# {'verbose_name': queryset.model._meta.verbose_name}) -# -# if self.request.user.is_staff or obj.zverejnit: -# return obj -# else: -# raise Http404() -# -# def get_context_data(self, **kwargs): -# context = super(PrispevekView, self).get_context_data(**kwargs) -# # snaho o ziskani titulu -# titul = '' -# try: -# resitel = context['prispevek'].reseni.resitel -# cislo = context['prispevek'].reseni.cislo_body -# body = VysledkyKCisluOdjakziva.objects.get(resitel=resitel, -# cislo=cislo).body -# titul = resitel.get_titul(body) -# except: -# pass -# context['titul'] = titul -# return context - - class RadekVysledkovky(object): pass @@ -465,7 +424,6 @@ class RadekVysledkovky(object): # #setridi problemy podle typu a poradi zadani # problem_index = {} # for i in range(len(problemy)): -# problem_index[problemy[i].id] = i # #umoznuje zjistit index podle id problemu # # vysledky_resitele = {} @@ -665,30 +623,6 @@ class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): model = Soustredeni_Ucastnici template_name = 'seminar/soustredeni/seznam_ucastniku.html' - -def soustredeniStvrzenkyExportView(request,soustredeni,first_num): - first_num = int(first_num) - soustredeni = get_object_or_404(Soustredeni,id = soustredeni) - ucastnici = Resitel.objects.filter(soustredeni=soustredeni) - for (idx,u) in enumerate(ucastnici): - u.cislo_stvrzenky = first_num+idx; - tex = render(request,'seminar/soustredeni/ucastnici.tex', {'ucastnici': ucastnici, 'datum':soustredeni.datum_zacatku }).content - - tempdir = tempfile.mkdtemp() - with open(tempdir+"/ucastnici.tex","w") as texfile: - # Pokud TeX chce ISO Latin, tak se da encode nastavit - texfile.write(tex.decode("utf-8").encode("utf-8")) - shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenka.sty'),tempdir) - shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenky.tex'),tempdir) - subprocess.call(["cslatex","stvrzenky.tex"],cwd = tempdir) - subprocess.call(["dvipdf","stvrzenky.dvi"],cwd = tempdir) - - with open(tempdir+"/stvrzenky.pdf","rb") as pdffile: - response = HttpResponse(pdffile.read(),content_type='application/pdf') - shutil.rmtree(tempdir) - return response - - def soustredeniUcastniciExportView(request,soustredeni): soustredeni = get_object_or_404(Soustredeni,id = soustredeni) ucastnici = Resitel.objects.filter(soustredeni=soustredeni) From 2e539e4cf241606d4f4df66919acfe884d85791a Mon Sep 17 00:00:00 2001 From: LEdoian Date: Mon, 10 Jun 2019 23:59:06 +0200 Subject: [PATCH 4/8] =?UTF-8?q?Stvrzenkt=3Dy=20u=C5=BE=20ani=20nepot=C5=99?= =?UTF-8?q?ebuj=C3=AD=20m=C3=ADt=20url,=20kdy=C5=BE=20neexistuj=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/urls.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/seminar/urls.py b/seminar/urls.py index aa41c386..962db176 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -45,11 +45,6 @@ urlpatterns = [ staff_member_required(views.SoustredeniMailyUcastnikuView.as_view()), name='maily_ucastniku' ), - url( - r'^soustredeni/(?P\d+)/stvrzenky/(?P\d+)$', - staff_member_required(views.soustredeniStvrzenkyExportView), - name='soustredeni_stvrzenky' - ), url( r'^soustredeni/(?P\d+)/export_ucastniku$', staff_member_required(views.soustredeniUcastniciExportView), From 9b382df8467aab4f7bc4a49aafa57943b8c7377a Mon Sep 17 00:00:00 2001 From: LEdoian Date: Tue, 11 Jun 2019 00:19:47 +0200 Subject: [PATCH 5/8] =?UTF-8?q?Seminar/Admin:=20zru=C5=A1ena=20u-=C4=8Dka?= =?UTF-8?q?=20u=20string=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/admin.py | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 59eab849..28f25314 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -18,13 +18,13 @@ from autocomplete_light import shortcuts as autocomplete_light class UserModelChoiceField(forms.ModelChoiceField): - u"""Vlastní ModelChoiceField pro uživatele. Zobrazí kromě loginu i jméno. + """Vlastní ModelChoiceField pro uživatele. Zobrazí kromě loginu i jméno. """ def label_from_instance(self, obj): - return u"{} ({})".format(obj.get_full_name(), obj.username) + return "{} ({})".format(obj.get_full_name(), obj.username) def get_form_predvypln_autora(self, request, obj=None, *args, **kwargs): - u"""get_form fce pro Adminy. Předvyplňí přihlášeného uživatele jako autora. + """get_form fce pro Adminy. Předvyplňí přihlášeného uživatele jako autora. """ form = super(self.__class__, self).get_form(request, *args, **kwargs) form.base_fields['autor'].initial = request.user.id @@ -32,7 +32,7 @@ def get_form_predvypln_autora(self, request, obj=None, *args, **kwargs): def make_set_action(atribut, hodnota, nazev): - u""" + """ Pomocnik pro rychle vytvareni hromadnych admin akci ktere jen nastavuji atribut (dany jako string) na danou hodnotu. nazev je krátký popis akce pro admin rozhraní.""" @@ -214,10 +214,10 @@ class ResitelAdmin(VersionAdmin): fk_name = 'osoba' fieldsets = [ (None, {'fields': ['jmeno', 'prijmeni', 'user']}), - (u'Škola', {'fields': ['skola', 'rok_maturity']}), - (u'Seminář', {'fields': ['datum_souhlasu_udaje', 'datum_souhlasu_zasilani', 'datum_prihlaseni', 'zasilat']}), - (u'Osobní údaje', {'fields': ['pohlavi_muz', 'datum_narozeni', 'email', 'telefon']}), - (u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), + ('Škola', {'fields': ['skola', 'rok_maturity']}), + ('Seminář', {'fields': ['datum_souhlasu_udaje', 'datum_souhlasu_zasilani', 'datum_prihlaseni', 'zasilat']}), + ('Osobní údaje', {'fields': ['pohlavi_muz', 'datum_narozeni', 'email', 'telefon']}), + ('Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), ] list_display = ['osoba__jmeno', 'osoba__prijmeni', 'osoba__user', 'osoba__pohlavi_muz', 'skola', 'rok_maturity', 'pocet_reseni'] list_filter = ['osoba__pohlavi_muz', 'rok_maturity', 'zasilat'] @@ -262,8 +262,8 @@ admin.site.register(Resitel, ResitelAdmin) class SkolaAdmin(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']}), + ('Interní ID', {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), + ('Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}), (None, {'fields': ['poznamka']}), ] list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss'] @@ -328,8 +328,8 @@ class RocnikAdmin(VersionAdmin): inlines = [CisloInline] view_on_site = Rocnik.verejne_url actions = [ - make_set_action('exportovat', True, u'Nastavit pro AESOP export'), - make_set_action('exportovat', False, u'Skrýt pro AESOP export'), + make_set_action('exportovat', True, 'Nastavit pro AESOP export'), + make_set_action('exportovat', False, 'Skrýt pro AESOP export'), ] admin.site.register(Rocnik, RocnikAdmin) @@ -341,7 +341,7 @@ admin.site.register(Rocnik, RocnikAdmin) # readonly_fields = ['timestamp', 'reseni'] # fieldsets = [ # (None, {'fields': ['reseni', 'soubor', 'timestamp']}), -# (u'Poznámky', {'fields': ['poznamka']}), +# ('Poznámky', {'fields': ['poznamka']}), # ] # list_display = ['reseni', 'soubor', 'timestamp'] # list_filter = ['reseni', 'timestamp'] @@ -356,7 +356,7 @@ class ReseniAdmin(VersionAdmin): #form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitele'], fields=['problem', 'resitele']) fieldsets = [ (None, {'fields': ['problem__set', 'resitele__set', 'forma', 'cas_doruceni']}), - (u'Poznámky', {'fields': ['poznamka']}), + ('Poznámky', {'fields': ['poznamka']}), ] readonly_fields = ['cas_doruceni'] list_display = [ResitelInline, 'forma', 'cas_doruceni'] @@ -400,11 +400,11 @@ class PohadkaAdmin(VersionAdmin): def get_kod_ulohy(self, obj): return obj.uloha.kod_v_rocniku() - get_kod_ulohy.short_description = u'Kód úlohy' + get_kod_ulohy.short_description = 'Kód úlohy' def get_rocnik(self, obj): return obj.uloha.cislo_zadani.rocnik.rocnik - get_rocnik.short_description = u'Ročník' + get_rocnik.short_description = 'Ročník' list_display = [ '__str__', @@ -477,7 +477,7 @@ class ProblemAdmin(VersionAdmin): form = ProblemAdminForm fieldsets = [ (None, {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp', 'import_dakos_id']}), - (u'Vydání', {'fields': ['kod', 'cislo_reseni', 'opravovatel',]}), + ('Vydání', {'fields': ['kod', 'cislo_reseni', 'opravovatel',]}), (None, {'fields': ['text_zadani', 'text_reseni', 'text_org',]}), ] list_select_related = True @@ -506,7 +506,7 @@ class ProblemNavrhAdmin(ProblemAdmin): #FIXME -#create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name=u'Problém (návrh)', verbose_name_plural=u'Problémy (návrhy)') +#create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name='Problém (návrh)', verbose_name_plural='Problémy (návrhy)') class ProblemZadanyAdmin(ProblemAdmin): @@ -531,7 +531,7 @@ class ProblemZadanyAdmin(ProblemAdmin): reverse("admin:seminar_cislo_change", args=(obj.cislo_zadani.pk,)), obj.cislo_zadani )) - cislo_zadani_link.short_description = u'Číslo zadání' + cislo_zadani_link.short_description = 'Číslo zadání' # TODO pokud se budou odkazy v adminu více používat, možná by se hodilo je # nějak zjednodušit, např. tímto? @@ -543,7 +543,7 @@ class ProblemZadanyAdmin(ProblemAdmin): reverse("admin:seminar_cislo_change", args=(obj.cislo_reseni.pk,)), obj.cislo_reseni )) - cislo_reseni_link.short_description = u'Číslo řešení' + cislo_reseni_link.short_description = 'Číslo řešení' def get_inline_instances(self, request, obj=None): if obj and obj.typ == Problem.TYP_ULOHA: @@ -560,7 +560,7 @@ class ProblemZadanyAdmin(ProblemAdmin): get_form = get_form_predvypln_autora #FIXME -#create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name=u'Problém (zadaný)', verbose_name_plural=u'Problémy (zadané)') +#create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name='Problém (zadaný)', verbose_name_plural='Problémy (zadané)') #admin.site.register(Problem, ProblemAdmin) @@ -601,10 +601,10 @@ class SoustredeniAdmin(VersionAdmin): list_filter = ['typ', 'rocnik'] view_on_site = Soustredeni.verejne_url actions = [ - make_set_action('verejne_db', True, u'Zveřejnit soustředění'), - make_set_action('verejne_db', False, u'Skrýt (zneveřejnit) soustředění'), - make_set_action('exportovat', True, u'Nastavit pro AESOP export'), - make_set_action('exportovat', False, u'Skrýt pro AESOP export'), + make_set_action('verejne_db', True, 'Zveřejnit soustředění'), + make_set_action('verejne_db', False, 'Skrýt (zneveřejnit) soustředění'), + make_set_action('exportovat', True, 'Nastavit pro AESOP export'), + make_set_action('exportovat', False, 'Skrýt pro AESOP export'), ] admin.site.register(Soustredeni, SoustredeniAdmin) From c79cf3fe4da3dd535ccfa134a4cc7d370943ce42 Mon Sep 17 00:00:00 2001 From: "Martin Z. (Zimamazim)" Date: Tue, 11 Jun 2019 00:25:22 +0200 Subject: [PATCH 6/8] Upravil jsem funkci gen_soustredeni. --- seminar/testutils.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index edd836fa..6c80e80d 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -59,6 +59,7 @@ def gen_osoby(rnd, size): datum_registrace = datetime.date(rnd.randint(2019, 2029), rnd.randint(1, 12), rnd.randint(1, 28)))) #TODO pridat foto male a velke. Jak? + # Pavel tvrdí, že to necháme a přidáme až do adminu return osoby @@ -206,18 +207,21 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): return def gen_soustredeni(): - # TODO: vice soustredeni a k nim nahodne podmnoziny organizatoru a ucastniku - # TODO: pozor, organizatori a ucastnici jsou ManyToManyField, musí se přiřadit - # mimo create() a pak dát save() - sous = Soustredeni.objects.create(rocnik=Rocnik.objects.first(), - verejne_db=True, - misto=u'Někde', - datum_zacatku=datetime.date(2000, 11, 23), - datum_konce=datetime.date(2000, 11, 27) - ) - for res in rnd.sample(resitele, min(len(resitele), 20)): - Soustredeni_Ucastnici.objects.create(resitel=res, soustredeni=sous) - sous.save() + sousy = [] + for sousi in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) + datum_zacatku=datetime.date(randint(2000, 2020), randint(1, 12), radint(1, 28)) + working_sous = Soustredeni.objects.create(rocnik=Rocnik.objects.order_by('?').first(), + verejne_db=rnd.choice([True, False]), + misto=rnd.choice(['Kremrolovice', 'Indiánov', 'U zmzliny', 'Vafláreň', 'Větrník', 'Horní Rakvička', 'Dolní cheesecake']), + datum_zacatku=datum_zacatku, + datum_konce=datum_zacatku + datetime.timedelta(weeks=1)) + for res in rnd.sample(resitele, min(len(resitele), 20)): + Soustredeni_Ucastnici.objects.create(resitel=res, soutredeni=working_sous) + for org in rnd.sample(organizatori, min(len(organizatori), 20)): + Soustredeni_Organizatori.objects.create(organizator=org, soutredeni=working_sous) + working_sous.save() + sousy.append(working_sous) + return sousy @transaction.atomic From 42a977b5165b4ae66d96e103f30136e74f8250eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Domes?= Date: Tue, 11 Jun 2019 00:25:25 +0200 Subject: [PATCH 7/8] =?UTF-8?q?testutils.py:=20n=C3=A1hodn=C3=A9=20=C3=BAp?= =?UTF-8?q?ravy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 244 +++++++++++++++++++++++++------------------ 1 file changed, 142 insertions(+), 102 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index edd836fa..eb993c7f 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -219,58 +219,22 @@ def gen_soustredeni(): Soustredeni_Ucastnici.objects.create(resitel=res, soustredeni=sous) sous.save() - -@transaction.atomic -def create_test_data(size = 6, rnd = None): - assert size >= 1 - # pevna pseudo-nahodnost - rnd = rnd or random.Random(x=42) - - # static URL stranky - # FIXME: nakopirovat sem vsechny z produkcni databaze - s = Site.objects.filter(name="example.com") - f = FlatPage.objects.create(url="/", title="Seminář M&M", - content = "

Vítejte na stránce semináře MaM!

") - f.sites.add(s[0]) - f.save() - - # users - admin = User.objects.create_superuser(username='admin', email='', password='admin') - - usernames = ['anet', 'bara', 'cyril', 'david', 'eva', 'filip'] - users = [] - for usr in usernames[:size]: - u = User.objects.create(username=usr, password=usr) - u.first_name = usr.capitalize() - u.save() - users.append(u) - print(users) - - # skoly - skoly = gen_skoly() - - # osoby - osoby = gen_osoby(rnd, size) - - # resitele a organizatori - last_rocnik = 25 - resitele = gen_resitele(rnd, osoby, skoly) - organizatori = gen_organizatori(rnd, osoby, last_rocnik, users) - - # prijemci - prijemci = gen_prijemci(rnd, osoby) - - global zlinska - zlinska.kontaktni_osoba=rnd.choice(osoby) - zlinska.save() - - # rocniky +def gen_rocniky(last_rocnik, size): + rocniky = [] + node = None for ri in range(min(last_rocnik - size, 1), last_rocnik + 1): - r = Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) + rocnik = Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) + node2 = RocnikNode.objects.create(rocnik = rocnik, succ = node) + node = node2 + rocniky.append(rocnik) + return rocniky - # cisla - cisel = rnd.randint(4, 8) +def gen_cisla(rocniky): + slovnik_rocnik_cisla = {} + for rocnik in rocniky: slovnik_cisel = {} + cisel = rnd.randint(4, 8) + node = None for ci in range(1, cisel + 1): # první číslo vydáváme typicky okolo prázdnin # (ci - 1)*2 zaručuje první číslo v červnu a všechna @@ -289,20 +253,25 @@ def create_test_data(size = 6, rnd = None): deadline = None cislo = Cislo.objects.create( - rocnik = r, + rocnik = rocnik, cislo = str(ci), datum_vydani=vydano, datum_deadline=deadline, verejne_db=True ) + node2 = CisloNode.objects.create(cislo = cislo, succ = node) + node = node2 + slovnik_cisel[ci] = cislo + slovnik_rocnik_cisla[rocnik] = slovnik_cisel + return slovnik_rocnik_cisla - # generovani uloh - gen_ulohy_do_cisla(rnd, ci, organizatori, resitele, slovnik_cisel, size) - - # generování témat, zatím v prvních třech číslech po jednom - # FIXME: více témat - if ci <= 3: +def gen_temata(rocniky, slovnik_rocnik_cisla): + slovnik_rocnik_temata = {} + for rocnik in rocniky: + temata = {} + for cislo in slovnik_r[rocnik] + if cislo <= 3: jake = ["Hravé", "Fyzikální", "Nejlepší", "Totálně masakrální", "Šokující", "Magnetické", "Modré", "Překvapivé", "Plasmatické", "Novoroční"] @@ -319,56 +288,127 @@ def create_test_data(size = 6, rnd = None): garant=rnd.choice(organizatori), # FIXME: téma má kód podle čísla, až jich bude # více, tak udělat kód podle pořadí vygenerování - kod=str(ci), - # atributy třídy Téma + kod=str(cislo), + # atributy třídy Téma tema_typ=rnd.choice(Tema.TEMA_CHOICES), - rocnik=r) + rocnik=rocnik) t.opravovatele=rnd.sample(organizatori, poc_op) t.save() - - # FIXME: nefunguje, protože další čísla v tuhle chvíli ještě - # nejsou nagenerovaná - # nagenerovat k tématu úlohy a Nody pro vsechna cisla - for i in range(ci, cisel-2): - # vytvoř úlohu pro každé ze zbývajících čísel - poc_op = rnd.randint(1, 4) - poc_oboru = rnd.randint(1, 2) - p = Uloha.objects.create( - nazev=": ".join([t.nazev, - "úloha {}.".format(i-ci+1)]), - nadproblem=t, - stav=Problem.STAV_ZADANY, - zamereni=t.zamereni, - autor=t.autor, - garant=t.garant, - opravovatele=rnd.sample(organizatori, poc_op), - kod=str(i), - cislo_zadani=slovnik_cisel[ci], - cislo_reseni=slovnik_cisel[ci+2], - cislo_deadline=slovnik_cisel[ci+2], - max_body = rnd.randint(1, 8)) - p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho), - rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)]) - - #Tomův pokus o opravu bugu: - text_vzoraku = Text.objects.create( - na_web = rnd.choice(reseni), - do_cisla = rnd.choice(reseni) - ) - vzorak = TextNode.objects.create(text = text_vzoraku) - uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) - p.UlohaVzorakNode = uloha_vzorak - - #p.vzorak = " - ".join([p.zadani, rnd.choice(reseni)]) - p.save() - - - # vytvor text - # vytvor TemaVCisleNode - if (rnd.randint(1, 3) % 3 == 0): - # vytvor mezicislo Node - pass + temata[cislo] = t + slovnik_rocnik_temata[tema] = temata + +def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): + for rocnik in rocniky: + slovnik_cisel = slovnik_rocnik_cisla[rocnik] + cisel = len(slovnik_cisel) + slovnik_temat = slovnik_rocnik_temata[rocnik] + for tema in slovnik_temat: + for i in range(tema. + if #TODO + poc_op = rnd.randint(1, 4) + poc_oboru = rnd.randint(1, 2) + p = Uloha.objects.create( + nazev=": ".join([tema.nazev, + "úloha {}.".format(i-ci+1)]), + nadproblem=tema, + stav=Problem.STAV_ZADANY, + zamereni=t.zamereni, + autor=t.autor, + garant=t.garant, + opravovatele=rnd.sample(organizatori, poc_op), + kod=str(i), + cislo_zadani=slovnik_cisel[ci], + cislo_reseni=slovnik_cisel[ci+2], + cislo_deadline=slovnik_cisel[ci+2], + max_body = rnd.randint(1, 8)) + p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho), + rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)]) + + #Tomův pokus o opravu bugu: + text_vzoraku = Text.objects.create( + na_web = rnd.choice(reseni), + do_cisla = rnd.choice(reseni) + ) + vzorak = TextNode.objects.create(text = text_vzoraku) + uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) + p.UlohaVzorakNode = uloha_vzorak + + #p.vzorak = " - ".join([p.zadani, rnd.choice(reseni)]) + p.save() + + + # vytvor text + # vytvor TemaVCisleNode + if (rnd.randint(1, 3) % 3 == 0): + # vytvor mezicislo Node + pass + +@transaction.atomic +def create_test_data(size = 6, rnd = None): + assert size >= 1 + # pevna pseudo-nahodnost + rnd = rnd or random.Random(x=42) + + # static URL stranky + # FIXME: nakopirovat sem vsechny z produkcni databaze + s = Site.objects.filter(name="example.com") + f = FlatPage.objects.create(url="/", title="Seminář M&M", + content = "

Vítejte na stránce semináře MaM!

") + f.sites.add(s[0]) + f.save() + + # users + admin = User.objects.create_superuser(username='admin', email='', password='admin') + + usernames = ['anet', 'bara', 'cyril', 'david', 'eva', 'filip'] + users = [] + for usr in usernames[:size]: + u = User.objects.create(username=usr, password=usr) + u.first_name = usr.capitalize() + u.save() + users.append(u) + print(users) + + # skoly + skoly = gen_skoly() + + # osoby + osoby = gen_osoby(rnd, size) + + # resitele a organizatori + last_rocnik = 25 + resitele = gen_resitele(rnd, osoby, skoly) + organizatori = gen_organizatori(rnd, osoby, last_rocnik, users) + + # prijemci + prijemci = gen_prijemci(rnd, osoby) + + global zlinska + zlinska.kontaktni_osoba=rnd.choice(osoby) + zlinska.save() + + # rocniky + rocniky = gen_rocniky(last_rocnik, size) + + # cisla + slovnik_rocnik_cisla = gen_cisla(rocniky) + + # generování obyčejných úloh do čísel + for rocnik in rocniky: + slovnik_cisel = slovnik_rocnik_cisla[rocnik] + for cislo in slovnik_cisel: + gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size) + + # generování témat, zatím v prvních třech číslech po jednom + # FIXME: více témat + slovnik_rocnik_temata = gen_temata(rocniky, slovnik_rocnik_cisla) + + # generování úloh k tématům ve všech číslech + gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata) + + # nagenerovat k tématu úlohy a Nody pro vsechna cisla + From 5f6c0e668329e72dc09eb1d871192085146b2e97 Mon Sep 17 00:00:00 2001 From: LEdoian Date: Tue, 11 Jun 2019 01:18:09 +0200 Subject: [PATCH 8/8] =?UTF-8?q?N=C3=A1hodn=C3=A9=20Martinovo=20pozorov?= =?UTF-8?q?=C3=A1n=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/seminar/models.py b/seminar/models.py index 760c5c57..ca630c70 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -1003,6 +1003,7 @@ class Konfera(models.Model): organizator = models.ForeignKey(Organizator, verbose_name='organizátor', related_name='konfery', on_delete = models.SET_NULL, null=True) + # FIXME: Umíme omezit jen na účastníky daného soustřeďka? ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci konfery', help_text='Seznam účastníků konfery', through='Konfery_Ucastnici')