From ff532b2f590ec2f6bdb2c35f4e867b7fb9a120a5 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 21:59:38 +0200 Subject: [PATCH 01/37] Zmena jmena rocniku na integer --- seminar/migrations/0019_rocnik_ciselne.py | 32 +++++++++++++++++++++++ seminar/models.py | 7 ++--- 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 seminar/migrations/0019_rocnik_ciselne.py diff --git a/seminar/migrations/0019_rocnik_ciselne.py b/seminar/migrations/0019_rocnik_ciselne.py new file mode 100644 index 00000000..42308b2f --- /dev/null +++ b/seminar/migrations/0019_rocnik_ciselne.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0018_problemnavrh_problemzadany'), + ] + + operations = [ + migrations.AddField( + model_name='rocnik', + name='rocnik_n', + field=models.IntegerField(default=0, verbose_name='\u010d\xedslo ro\u010dn\xedku'), + preserve_default=False, + ), + migrations.RunSQL( + sql="update seminar_rocniky set rocnik_n = cast (rocnik as integer)" + ), + migrations.RemoveField( + model_name='rocnik', + name='rocnik', + ), + migrations.RenameField( + model_name='rocnik', + old_name='rocnik_n', + new_name='rocnik', + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 62529835..acd0a89b 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -204,16 +204,13 @@ class Rocnik(SeminarModelBase): prvni_rok = models.IntegerField(u'první rok') - rocnik = models.CharField(u'číslo ročníku', max_length=16) + rocnik = models.IntegerField(u'číslo ročníku') def __str__(self): return force_unicode(u'%s (%d/%d)' % (self.rocnik, self.prvni_rok, self.prvni_rok+1)) def roman(self): - if self.rocnik.isdigit(): - return force_unicode(roman(int(self.rocnik))) - else: - return force_unicode(self.rocnik) + return force_unicode(roman(int(self.rocnik))) def verejne(self): return len(self.verejna_cisla()) > 0 From e9a85083df47b72c9c3058524140fbc0d90e1918 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:00:54 +0200 Subject: [PATCH 02/37] Filtrace problemu podle cisel --- seminar/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/admin.py b/seminar/admin.py index dcd2ca5e..8ce41a30 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -284,7 +284,7 @@ create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name=u'Pro class ProblemZadanyAdmin(ProblemAdmin): list_display = ['nazev', 'typ', 'autor', 'opravovatel', 'kod', 'cislo_zadani', 'pocet_reseni', 'verejne'] - list_filter = ['typ', 'cislo_zadani__rocnik'] + list_filter = ['typ', 'cislo_zadani__cislo', 'cislo_zadani__rocnik'] inlines = [ReseniKProblemuInline] def get_queryset(self, request): From d755295b742ece6cbb3f9455cd9588f02c3982f5 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:03:02 +0200 Subject: [PATCH 03/37] Uprava razeni reseni --- seminar/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/models.py b/seminar/models.py index acd0a89b..484b7047 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -408,7 +408,7 @@ class Reseni(SeminarModelBase): db_table = 'seminar_reseni' verbose_name = u'Řešení' verbose_name_plural = u'Řešení' - ordering = ['problem_id', 'resitel_id'] + ordering = ['problem_id', 'resitel__prijmeni', 'resitel__jmeno',] # Interní ID id = models.AutoField(primary_key = True) From 4bf299bf2540f36d184e6af05718d311e1b38593 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:18:15 +0200 Subject: [PATCH 04/37] Automaticke doplnovani cisla reseni u uloh --- seminar/models.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/seminar/models.py b/seminar/models.py index 484b7047..7fc35b44 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -29,12 +29,6 @@ class SeminarModelBase(models.Model): 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 get_absolute_url(self): return self.verejne_url() # TODO "absolute" @@ -440,6 +434,12 @@ class Reseni(SeminarModelBase): return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) # NOTE: Potenciální DB HOG (bez select_related) + def save(self, *args, **kwargs): + if ((self.cislo_body is None) and (self.problem.cislo_reseni) and + (self.problem.typ == Problem.TYP_ULOHA)): + self.cislo_body = self.problem.cislo_reseni + super(Reseni, self).save(*args, **kwargs) + # PrilohaReseni method def generate_filename(self, filename): From 7fac56f29a26ebc8befaafd2dd66a4cdc7ef7a58 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:38:13 +0200 Subject: [PATCH 05/37] Popisnejsi url pro cislo a rocnik --- seminar/models.py | 4 ++-- seminar/urls.py | 7 ++++--- seminar/views.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/seminar/models.py b/seminar/models.py index 7fc35b44..58828e9c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -223,7 +223,7 @@ class Rocnik(SeminarModelBase): return self.prvni_rok + 1 def verejne_url(self): - return reverse('seminar_rocnik', kwargs={'pk': self.id}) + return reverse('seminar_rocnik', kwargs={'rocnik': self.rocnik}) @classmethod def cached_rocnik(cls, r_id): @@ -279,7 +279,7 @@ class Cislo(SeminarModelBase): verejne.boolean = True def verejne_url(self): - return reverse('seminar_cislo', kwargs={'pk': self.id}) + return reverse('seminar_cislo', kwargs={'rocnik': self.rocnik.rocnik, 'cislo': self.cislo}) def nasledujici(self): u"Vrací None, pokud je toto poslední" diff --git a/seminar/urls.py b/seminar/urls.py index 31ae2886..3ed44bd0 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -6,9 +6,10 @@ urlpatterns = patterns('', url(r'^co-je-MaM/organizatori/$', views.CojemamOrganizatoriView.as_view()), url(r'^archiv/cisla/$', views.CislaView.as_view()), - url(r'^archiv/cisla/rocnik/(?P\d+)/$', views.RocnikView.as_view(), name='seminar_rocnik'), - url(r'^archiv/cisla/cislo/(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), - url(r'^archiv/cisla/problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'), + + url(r'^rocnik/(?P\d+)/$', views.RocnikView.as_view(), name='seminar_rocnik'), + url(r'^cislo/(?P\d+).(?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'), diff --git a/seminar/views.py b/seminar/views.py index 96a89d5e..4c5063be 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -2,6 +2,9 @@ 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 django.utils.translation import ugettext as _ +from django.http import Http404 + from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni @@ -25,6 +28,20 @@ class RocnikView(generic.DetailView): model = Rocnik template_name = 'seminar/archiv/rocnik.html' + # Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) + def get_object(self, queryset=None): + if queryset is None: + queryset = self.get_queryset() + rocnik_arg = self.kwargs.get('rocnik') + queryset = queryset.filter(rocnik=rocnik_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}) + return obj + class SoustredeniView(generic.DetailView): model = Soustredeni template_name = 'seminar/archiv/soustredeni.html' @@ -39,6 +56,22 @@ class RadekVysledkovky(object): class CisloView(generic.DetailView): model = Cislo template_name = 'seminar/archiv/cislo.html' + + # Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) + def get_object(self, queryset=None): + if queryset is None: + queryset = self.get_queryset() + rocnik_arg = self.kwargs.get('rocnik') + cislo_arg = self.kwargs.get('cislo') + queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_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}) + return obj + def get_context_data(self, **kwargs): context = super(CisloView, self).get_context_data(**kwargs) From 79ea54158732833eec43a38a95976bf7461b3b79 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:42:52 +0200 Subject: [PATCH 06/37] Indexy a unikatnost pro rocnik a cislo --- seminar/migrations/0020_indexy_a_razeni.py | 44 ++++++++++++++++++++++ seminar/models.py | 8 ++-- 2 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 seminar/migrations/0020_indexy_a_razeni.py diff --git a/seminar/migrations/0020_indexy_a_razeni.py b/seminar/migrations/0020_indexy_a_razeni.py new file mode 100644 index 00000000..1e199f0e --- /dev/null +++ b/seminar/migrations/0020_indexy_a_razeni.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0019_rocnik_ciselne'), + ] + + operations = [ + migrations.AlterModelOptions( + name='cislo', + options={'ordering': ['-rocnik__rocnik', '-cislo'], 'verbose_name': '\u010c\xedslo', 'verbose_name_plural': '\u010c\xedsla'}, + ), + migrations.AlterModelOptions( + name='reseni', + options={'ordering': ['problem_id', 'resitel__prijmeni', 'resitel__jmeno'], 'verbose_name': '\u0158e\u0161en\xed', 'verbose_name_plural': '\u0158e\u0161en\xed'}, + ), + migrations.AlterModelOptions( + name='rocnik', + options={'ordering': ['-rocnik'], 'verbose_name': 'Ro\u010dn\xedk', 'verbose_name_plural': 'Ro\u010dn\xedky'}, + ), + 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', db_index=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='rocnik', + name='prvni_rok', + field=models.IntegerField(unique=True, verbose_name='prvn\xed rok', db_index=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='rocnik', + name='rocnik', + field=models.IntegerField(unique=True, verbose_name='\u010d\xedslo ro\u010dn\xedku', db_index=True), + preserve_default=True, + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 58828e9c..0aff6e0c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -196,9 +196,9 @@ class Rocnik(SeminarModelBase): # Interní ID id = models.AutoField(primary_key = True) - prvni_rok = models.IntegerField(u'první rok') + prvni_rok = models.IntegerField(u'první rok', db_index=True, unique=True) - rocnik = models.IntegerField(u'číslo ročníku') + rocnik = models.IntegerField(u'číslo ročníku', db_index=True, unique=True) def __str__(self): return force_unicode(u'%s (%d/%d)' % (self.rocnik, self.prvni_rok, self.prvni_rok+1)) @@ -249,9 +249,9 @@ class Cislo(SeminarModelBase): # Interní ID id = models.AutoField(primary_key = True) - rocnik = models.ForeignKey(Rocnik, verbose_name=u'ročník', related_name='cisla') + rocnik = models.ForeignKey(Rocnik, verbose_name=u'ročník', related_name='cisla', db_index=True) - cislo = models.CharField(u'název čísla', max_length=32, + cislo = models.CharField(u'název čísla', max_length=32, db_index=True, help_text=u'Většinou jen "1", vyjímečně "7-8", lexikograficky určije pořadí v ročníku!') datum_vydani = models.DateField(u'datum vydání', blank=True, null=True, From 2a89e03a9e0fcb1dbdef423e2718bbc97d22533b Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:44:17 +0200 Subject: [PATCH 07/37] Zbytky poznamek z importu diskuse --- dakosdump/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dakosdump/README.md b/dakosdump/README.md index 13d103d6..fbeef4c5 100644 --- a/dakosdump/README.md +++ b/dakosdump/README.md @@ -180,6 +180,18 @@ Témata: c = ThreadedComment.objects.create(**d) tab_ID_REAK_to_ThrComment_id[i.ID_REAK] = c.id + tab_ID_REAK_to_ThrComment_id = {u'344': 6884, u'345': 6885, u'346': 6886, u'347': 6887, u'340': 6880, u'341': 6881, u'342': 6882, u'343': 6883, u'810': 7402, u'811': 7403, u'812': 7404, u'813': 7405, u'348': 6888, u'349': 6889, u'816': 7408, u'817': 7409, u'595': 7162, u'719': 7300, u'718': 7299, u'717': 7298, u'716': 7297, u'715': 7296, u'714': 7295, u'713': 7294, u'712': 7293, u'711': 7292, u'710': 7291, u'915': 7517, u'914': 7516, u'606': 7175, u'917': 7519, u'594': 7161, u'736': 7319, u'916': 7518, u'911': 7513, u'619': 7189, u'910': 7512, u'913': 7515, u'298': 6832, u'299': 6833, u'296': 6830, u'297': 6831, u'294': 6828, u'295': 6829, u'292': 6826, u'293': 6827, u'290': 6824, u'291': 6825, u'591': 7158, u'590': 7157, u'593': 7160, u'592': 7159, u'199': 6722, u'198': 6721, u'597': 7164, u'596': 7163, u'195': 6718, u'194': 6717, u'197': 6720, u'196': 6719, u'191': 6714, u'190': 6713, u'193': 6716, u'192': 6715, u'270': 6802, u'271': 6803, u'272': 6804, u'273': 6805, u'274': 6806, u'275': 6807, u'276': 6808, u'277': 6809, u'278': 6810, u'279': 6811, u'738': 7321, u'524': 7084, u'525': 7085, u'526': 7086, u'527': 7087, u'520': 7080, u'521': 7081, u'522': 7082, u'523': 7083, u'599': 7166, u'528': 7088, u'529': 7089, u'449': 7000, u'448': 6999, u'443': 6994, u'442': 6993, u'441': 6992, u'440': 6991, u'447': 6998, u'446': 6997, u'445': 6996, u'444': 6995, u'108': 6622, u'109': 6623, u'102': 6616, u'103': 6617, u'100': 6614, u'101': 6615, u'106': 6620, u'107': 6621, u'104': 6618, u'105': 6619, u'902': 7503, u'903': 7504, u'39': 6934, u'38': 6923, u'906': 7507, u'907': 7508, u'904': 7505, u'905': 7506, u'33': 6868, u'32': 6857, u'31': 6846, u'30': 6835, u'37': 6912, u'36': 6901, u'35': 6890, u'34': 6879, u'641': 7214, u'640': 7213, u'643': 7216, u'642': 7215, u'645': 7218, u'644': 7217, u'438': 6988, u'439': 6989, u'436': 6986, u'437': 6987, u'434': 6984, u'435': 6985, u'432': 6982, u'433': 6983, u'430': 6980, u'431': 6981, u'339': 6878, u'338': 6877, u'335': 6874, u'334': 6873, u'337': 6876, u'336': 6875, u'331': 6870, u'330': 6869, u'333': 6872, u'332': 6871, u'89': 7488, u'744': 7328, u'745': 7329, u'854': 7450, u'818': 7410, u'856': 7451, u'857': 7452, u'850': 7446, u'851': 7447, u'852': 7448, u'819': 7411, u'858': 7453, u'859': 7454, u'748': 7332, u'6': 7167, u'900': 7501, u'848': 7443, u'99': 7589, u'98': 7588, u'844': 7439, u'91': 7511, u'90': 7500, u'93': 7533, u'92': 7522, u'95': 7555, u'94': 7544, u'97': 7577, u'96': 7566, u'814': 7406, u'815': 7407, u'740': 7324, u'741': 7325, u'742': 7326, u'743': 7327, u'559': 7122, u'558': 7121, u'746': 7330, u'747': 7331, u'555': 7118, u'554': 7117, u'557': 7120, u'556': 7119, u'551': 7114, u'550': 7113, u'553': 7116, u'552': 7115, u'238': 6766, u'239': 6767, u'234': 6762, u'235': 6763, u'236': 6764, u'237': 6765, u'230': 6758, u'231': 6759, u'232': 6760, u'233': 6761, u'1': 6612, u'614': 7184, u'146': 6664, u'147': 6665, u'144': 6662, u'145': 6663, u'142': 6660, u'143': 6661, u'140': 6658, u'141': 6659, u'612': 7182, u'613': 7183, u'610': 7180, u'611': 7181, u'616': 7186, u'617': 7187, u'148': 6666, u'149': 6667, u'912': 7514, u'951': 7557, u'948': 7553, u'949': 7554, u'946': 7551, u'947': 7552, u'944': 7549, u'945': 7550, u'942': 7547, u'943': 7548, u'940': 7545, u'941': 7546, u'768': 7354, u'689': 7266, u'688': 7265, u'685': 7262, u'684': 7261, u'687': 7264, u'686': 7263, u'681': 7258, u'680': 7257, u'683': 7260, u'682': 7259, u'623': 7194, u'622': 7193, u'133': 6650, u'132': 6649, u'131': 6648, u'130': 6647, u'137': 6654, u'136': 6653, u'135': 6652, u'134': 6651, u'494': 7050, u'495': 7051, u'139': 6656, u'138': 6655, u'490': 7046, u'491': 7047, u'492': 7048, u'493': 7049, u'24': 6768, u'25': 6779, u'26': 6790, u'27': 6801, u'20': 6724, u'21': 6735, u'22': 6746, u'23': 6757, u'927': 7530, u'28': 6812, u'29': 6823, u'407': 6954, u'406': 6953, u'405': 6952, u'404': 6951, u'403': 6950, u'402': 6949, u'401': 6948, u'400': 6947, u'933': 7537, u'932': 7536, u'931': 7535, u'930': 7534, u'937': 7541, u'629': 7200, u'409': 6956, u'408': 6955, u'628': 7199, u'758': 7343, u'379': 6922, u'378': 6921, u'829': 7422, u'828': 7421, u'371': 6914, u'370': 6913, u'373': 6916, u'372': 6915, u'375': 6918, u'374': 6917, u'377': 6920, u'376': 6919, u'708': 7288, u'709': 7289, u'704': 7284, u'705': 7285, u'706': 7286, u'707': 7287, u'700': 7280, u'618': 7188, u'702': 7282, u'703': 7283, u'393': 6938, u'392': 6937, u'391': 6936, u'390': 6935, u'397': 6942, u'396': 6941, u'395': 6940, u'394': 6939, u'82': 7412, u'83': 7423, u'399': 6944, u'398': 6943, u'86': 7455, u'87': 7466, u'84': 7434, u'85': 7445, u'797': 7386, u'796': 7385, u'795': 7384, u'794': 7383, u'793': 7382, u'792': 7381, u'791': 7380, u'790': 7379, u'799': 7388, u'798': 7387, u'7': 7278, u'601': 7170, u'607': 7176, u'586': 7152, u'587': 7153, u'584': 7150, u'585': 7151, u'582': 7148, u'583': 7149, u'580': 7146, u'581': 7147, u'588': 7154, u'589': 7155, u'245': 6774, u'244': 6773, u'247': 6776, u'246': 6775, u'241': 6770, u'240': 6769, u'243': 6772, u'242': 6771, u'615': 7185, u'249': 6778, u'248': 6777, u'924': 7527, u'970': 7578, u'925': 7528, u'519': 7078, u'518': 7077, u'926': 7529, u'511': 7070, u'510': 7069, u'513': 7072, u'512': 7071, u'515': 7074, u'514': 7073, u'517': 7076, u'516': 7075, u'458': 7010, u'459': 7011, u'621': 7192, u'620': 7191, u'627': 7198, u'626': 7197, u'625': 7196, u'624': 7195, u'450': 7002, u'451': 7003, u'452': 7004, u'453': 7005, u'454': 7006, u'455': 7007, u'456': 7008, u'457': 7009, u'179': 6700, u'178': 6699, u'177': 6698, u'176': 6697, u'175': 6696, u'174': 6695, u'173': 6694, u'172': 6693, u'171': 6692, u'170': 6691, u'977': 7585, u'656': 7230, u'975': 7583, u'974': 7582, u'973': 7581, u'972': 7580, u'971': 7579, u'657': 7231, u'654': 7228, u'979': 7587, u'978': 7586, u'182': 6704, u'183': 6705, u'180': 6702, u'181': 6703, u'186': 6708, u'187': 6709, u'184': 6706, u'185': 6707, u'886': 7484, u'652': 7226, u'188': 6710, u'189': 6711, u'658': 7232, u'653': 7227, u'650': 7224, u'651': 7225, u'764': 7350, u'11': 6624, u'10': 6613, u'13': 6646, u'12': 6635, u'15': 6668, u'14': 6657, u'17': 6690, u'16': 6679, u'19': 6712, u'18': 6701, u'863': 7459, u'862': 7458, u'865': 7461, u'864': 7460, u'867': 7463, u'866': 7462, u'884': 7482, u'938': 7542, u'659': 7233, u'883': 7481, u'753': 7338, u'881': 7479, u'880': 7478, u'887': 7485, u'831': 7425, u'885': 7483, u'752': 7337, u'928': 7531, u'62': 7190, u'888': 7486, u'950': 7556, u'756': 7341, u'929': 7532, u'63': 7201, u'809': 7400, u'322': 6860, u'323': 6861, u'320': 6858, u'321': 6859, u'326': 6864, u'327': 6865, u'324': 6862, u'325': 6863, u'328': 6866, u'329': 6867, u'759': 7344, u'201': 6726, u'200': 6725, u'203': 6728, u'202': 6727, u'205': 6730, u'204': 6729, u'207': 6732, u'206': 6731, u'209': 6734, u'208': 6733, u'779': 7366, u'778': 7365, u'889': 7487, u'77': 7356, u'76': 7345, u'75': 7334, u'74': 7323, u'73': 7312, u'72': 7301, u'71': 7290, u'70': 7279, u'655': 7229, u'79': 7378, u'78': 7367, u'2': 6723, u'805': 7396, u'804': 7395, u'669': 7244, u'668': 7243, u'667': 7242, u'666': 7241, u'665': 7240, u'664': 7239, u'663': 7238, u'662': 7237, u'661': 7236, u'660': 7235, u'769': 7355, u'692': 7270, u'693': 7271, u'690': 7268, u'691': 7269, u'696': 7274, u'697': 7275, u'694': 7272, u'695': 7273, u'698': 7276, u'699': 7277, u'542': 7104, u'543': 7105, u'540': 7102, u'541': 7103, u'546': 7108, u'547': 7109, u'544': 7106, u'545': 7107, u'8': 7389, u'548': 7110, u'549': 7111, u'68': 7256, u'598': 7165, u'869': 7465, u'868': 7464, u'120': 6636, u'121': 6637, u'122': 6638, u'123': 6639, u'124': 6640, u'125': 6641, u'126': 6642, u'127': 6643, u'128': 6644, u'129': 6645, u'765': 7351, u'69': 7267, u'414': 6962, u'415': 6963, u'416': 6964, u'417': 6965, u'410': 6958, u'411': 6959, u'412': 6960, u'413': 6961, u'920': 7523, u'498': 7054, u'922': 7525, u'923': 7526, u'418': 6966, u'419': 6967, u'776': 7363, u'499': 7055, u'319': 6856, u'318': 6855, u'313': 6850, u'312': 6849, u'311': 6848, u'310': 6847, u'317': 6854, u'316': 6853, u'315': 6852, u'314': 6851, u'861': 7457, u'921': 7524, u'496': 7052, u'832': 7426, u'833': 7427, u'830': 7424, u'497': 7053, u'836': 7430, u'837': 7431, u'834': 7428, u'835': 7429, u'838': 7432, u'839': 7433, u'808': 7399, u'3': 6834, u'368': 6910, u'369': 6911, u'366': 6908, u'367': 6909, u'364': 6906, u'365': 6907, u'362': 6904, u'363': 6905, u'360': 6902, u'361': 6903, u'959': 7565, u'952': 7558, u'882': 7480, u'380': 6924, u'381': 6925, u'382': 6926, u'383': 6927, u'384': 6928, u'385': 6929, u'386': 6930, u'387': 6931, u'388': 6932, u'389': 6933, u'784': 7372, u'785': 7373, u'786': 7374, u'787': 7375, u'780': 7368, u'781': 7369, u'782': 7370, u'783': 7371, u'788': 7376, u'789': 7377, u'860': 7456, u'605': 7174, u'579': 7144, u'578': 7143, u'604': 7173, u'573': 7138, u'572': 7137, u'571': 7136, u'570': 7135, u'577': 7142, u'576': 7141, u'575': 7140, u'574': 7139, u'60': 7168, u'61': 7179, u'258': 6788, u'259': 6789, u'64': 7212, u'65': 7223, u'66': 7234, u'67': 7245, u'252': 6782, u'253': 6783, u'250': 6780, u'251': 6781, u'256': 6786, u'257': 6787, u'254': 6784, u'255': 6785, u'603': 7172, u'602': 7171, u'939': 7543, u'731': 7314, u'730': 7313, u'733': 7316, u'732': 7315, u'735': 7318, u'734': 7317, u'508': 7066, u'509': 7067, u'506': 7064, u'507': 7065, u'504': 7062, u'505': 7063, u'502': 7060, u'503': 7061, u'500': 7058, u'501': 7059, u'630': 7202, u'631': 7203, u'632': 7204, u'633': 7205, u'469': 7022, u'468': 7021, u'636': 7208, u'637': 7209, u'465': 7018, u'464': 7017, u'467': 7020, u'466': 7019, u'461': 7014, u'460': 7013, u'463': 7016, u'462': 7015, u'901': 7502, u'168': 6688, u'169': 6689, u'164': 6684, u'165': 6685, u'166': 6686, u'167': 6687, u'160': 6680, u'161': 6681, u'162': 6682, u'163': 6683, u'964': 7571, u'965': 7572, u'966': 7573, u'967': 7574, u'960': 7567, u'961': 7568, u'962': 7569, u'963': 7570, u'968': 7575, u'969': 7576, u'936': 7540, u'935': 7539, u'934': 7538, u'908': 7509, u'909': 7510, u'600': 7169, u'878': 7475, u'879': 7476, u'876': 7473, u'877': 7474, u'874': 7471, u'875': 7472, u'872': 7469, u'873': 7470, u'870': 7467, u'871': 7468, u'9': 7499, u'890': 7489, u'891': 7490, u'892': 7491, u'893': 7492, u'894': 7493, u'647': 7220, u'896': 7495, u'897': 7496, u'898': 7497, u'899': 7498, u'646': 7219, u'649': 7222, u'648': 7221, u'357': 6898, u'356': 6897, u'355': 6896, u'354': 6895, u'353': 6894, u'352': 6893, u'351': 6892, u'350': 6891, u'803': 7394, u'802': 7393, u'801': 7392, u'800': 7391, u'807': 7398, u'806': 7397, u'359': 6900, u'358': 6899, u'216': 6742, u'217': 6743, u'214': 6740, u'215': 6741, u'212': 6738, u'213': 6739, u'210': 6736, u'211': 6737, u'762': 7348, u'763': 7349, u'760': 7346, u'761': 7347, u'766': 7352, u'767': 7353, u'218': 6744, u'219': 6745, u'957': 7563, u'956': 7562, u'289': 6822, u'288': 6821, u'4': 6945, u'281': 6814, u'280': 6813, u'283': 6816, u'282': 6815, u'285': 6818, u'284': 6817, u'287': 6820, u'286': 6819, u'678': 7254, u'679': 7255, u'674': 7250, u'675': 7251, u'676': 7252, u'677': 7253, u'670': 7246, u'671': 7247, u'672': 7248, u'673': 7249, u'263': 6794, u'262': 6793, u'261': 6792, u'260': 6791, u'267': 6798, u'266': 6797, u'265': 6796, u'264': 6795, u'269': 6800, u'268': 6799, u'701': 7281, u'59': 7156, u'58': 7145, u'55': 7112, u'54': 7101, u'57': 7134, u'56': 7123, u'51': 7068, u'50': 7057, u'53': 7090, u'52': 7079, u'537': 7098, u'536': 7097, u'535': 7096, u'534': 7095, u'533': 7094, u'532': 7093, u'531': 7092, u'530': 7091, u'539': 7100, u'538': 7099, u'775': 7362, u'774': 7361, u'777': 7364, u'115': 6630, u'114': 6629, u'117': 6632, u'116': 6631, u'111': 6626, u'110': 6625, u'113': 6628, u'112': 6627, u'771': 7358, u'119': 6634, u'118': 6633, u'770': 7357, u'773': 7360, u'772': 7359, u'953': 7559, u'429': 6978, u'428': 6977, u'919': 7521, u'918': 7520, u'421': 6970, u'420': 6969, u'423': 6972, u'422': 6971, u'425': 6974, u'424': 6973, u'427': 6976, u'426': 6975, u'308': 6844, u'309': 6845, u'300': 6836, u'301': 6837, u'302': 6838, u'303': 6839, u'304': 6840, u'305': 6841, u'306': 6842, u'307': 6843, u'895': 7494, u'825': 7418, u'824': 7417, u'827': 7420, u'847': 7442, u'846': 7441, u'845': 7440, u'826': 7419, u'843': 7438, u'842': 7437, u'841': 7436, u'840': 7435, u'821': 7414, u'853': 7449, u'849': 7444, u'820': 7413, u'823': 7416, u'822': 7415, u'954': 7560, u'568': 7132, u'569': 7133, u'751': 7336, u'750': 7335, u'757': 7342, u'737': 7320, u'755': 7340, u'754': 7339, u'560': 7124, u'561': 7125, u'562': 7126, u'563': 7127, u'564': 7128, u'565': 7129, u'566': 7130, u'567': 7131, u'739': 7322, u'229': 6756, u'228': 6755, u'227': 6754, u'226': 6753, u'225': 6752, u'224': 6751, u'223': 6750, u'222': 6749, u'221': 6748, u'220': 6747, u'88': 7477, u'726': 7308, u'727': 7309, u'724': 7306, u'725': 7307, u'722': 7304, u'723': 7305, u'720': 7302, u'721': 7303, u'728': 7310, u'729': 7311, u'151': 6670, u'150': 6669, u'153': 6672, u'152': 6671, u'155': 6674, u'154': 6673, u'157': 6676, u'156': 6675, u'159': 6678, u'158': 6677, u'609': 7178, u'608': 7177, u'976': 7584, u'634': 7206, u'80': 7390, u'635': 7207, u'749': 7333, u'958': 7564, u'81': 7401, u'48': 7034, u'49': 7045, u'46': 7012, u'47': 7023, u'44': 6990, u'45': 7001, u'42': 6968, u'43': 6979, u'40': 6946, u'41': 6957, u'638': 7210, u'5': 7056, u'639': 7211, u'489': 7044, u'488': 7043, u'487': 7042, u'486': 7041, u'485': 7040, u'484': 7039, u'483': 7038, u'482': 7037, u'481': 7036, u'480': 7035, u'955': 7561, u'472': 7026, u'473': 7027, u'470': 7024, u'471': 7025, u'476': 7030, u'477': 7031, u'474': 7028, u'475': 7029, u'478': 7032, u'479': 7033} + +#### Odstranění duplicit z Problem #### + +`AZAD:*` + + for i in Problem.objects.filter(import_dakos_id__contains='AZAD'): + p = Problem.objects.filter(kod=i.kod, cislo_zadani=i.cislo_zadani, typ=i.typ); + q = [j for j in p if j.import_dakos_id[:2] != 'AZ'] + if q: + print i.nazev==j.nazev, i.nazev, j.nazev + ### Konkrétní programy pro data (starší metoda) ### From 3838b207f94e1fcec0e7245896f30c8c480c5a5e Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 8 Jun 2015 22:51:36 +0200 Subject: [PATCH 08/37] Prodana volitelna verejnost vysledkove listiny --- seminar/admin.py | 3 ++- .../0021_cislo_verejna_vysledkovka.py | 20 +++++++++++++++++++ seminar/models.py | 3 +++ seminar/templates/seminar/archiv/cislo.html | 10 ++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 seminar/migrations/0021_cislo_verejna_vysledkovka.py diff --git a/seminar/admin.py b/seminar/admin.py index 8ce41a30..d8fdd2aa 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -177,10 +177,11 @@ admin.site.register(Skola, SkolaAdmin) class CisloAdmin(reversion.VersionAdmin): fieldsets = [ - (None, {'fields': ['cislo', 'rocnik', 'verejne_db', 'poznamka']}), + (None, {'fields': ['cislo', 'rocnik', 'verejne_db', 'verejna_vysledkovka', 'poznamka']}), (u'Data', {'fields': ['datum_vydani', 'datum_deadline']}), ] list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne'] + list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejna_vysledkovka'] list_filter = ['rocnik'] view_on_site = Cislo.verejne_url def get_queryset(self, request): diff --git a/seminar/migrations/0021_cislo_verejna_vysledkovka.py b/seminar/migrations/0021_cislo_verejna_vysledkovka.py new file mode 100644 index 00000000..d4d34c7f --- /dev/null +++ b/seminar/migrations/0021_cislo_verejna_vysledkovka.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0020_indexy_a_razeni'), + ] + + operations = [ + migrations.AddField( + model_name='cislo', + name='verejna_vysledkovka', + field=models.BooleanField(default=False, help_text='Je-li false u ve\u0159ejn\xe9ho \u010d\xedsla, nen\xed v\xfdsledkovka zat\xedm ve\u0159ejn\xe1.', verbose_name='zve\u0159ejn\u011bna v\xfdsledkovka'), + preserve_default=True, + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 0aff6e0c..d8967ba6 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -262,6 +262,9 @@ class Cislo(SeminarModelBase): verejne_db = models.BooleanField(u'číslo zveřejněno', db_column='verejne', default=False) + verejna_vysledkovka = models.BooleanField(u'zveřejněna výsledkovka', default=False, + help_text=u'Je-li false u veřejného čísla, není výsledkovka zatím veřejná.') + poznamka = models.TextField(u'neveřejná poznámka', blank=True, help_text=u'Neveřejná poznámka k číslu (plain text)') diff --git a/seminar/templates/seminar/archiv/cislo.html b/seminar/templates/seminar/archiv/cislo.html index 1148dd34..a7096fec 100644 --- a/seminar/templates/seminar/archiv/cislo.html +++ b/seminar/templates/seminar/archiv/cislo.html @@ -20,7 +20,12 @@ {% endfor %} + {% if cislo.verejna_vysledkovka %}

Výsledkovka

+ {% else %} +
+

Výsledkovka (neveřejná)

+ {% endif %} @@ -44,6 +49,11 @@ {% endfor %}
+ {% if cislo.verejna_vysledkovka %} + {% else %} +
+ {% endif %} + {% endblock content %} From 81cbf39df7d634eb173d6b081c72d90dd4bd313b Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Tue, 9 Jun 2015 22:00:21 +0200 Subject: [PATCH 09/37] Konverze bodu na decimal(8,1) --- seminar/migrations/0022_decimal_body.py | 30 +++++++++++++++++++++++++ seminar/models.py | 10 +++++---- seminar/tests.py | 4 ++-- 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 seminar/migrations/0022_decimal_body.py diff --git a/seminar/migrations/0022_decimal_body.py b/seminar/migrations/0022_decimal_body.py new file mode 100644 index 00000000..0fb0c427 --- /dev/null +++ b/seminar/migrations/0022_decimal_body.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import importlib + +from django.db import models, migrations + +migration_0022 = importlib.import_module('seminar.migrations.0002_add_body_views') +print dir(migration_0022) + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0021_cislo_verejna_vysledkovka'), + ] + operations = [ + migrations.RunSQL(migration_0022.DROP_VIEWS), + migrations.AlterField( + model_name='problem', + name='body', + field=models.DecimalField(null=True, verbose_name='maximum bod\u016f', max_digits=8, decimal_places=1, blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='reseni', + name='body', + field=models.DecimalField(null=True, verbose_name='body', max_digits=8, decimal_places=1, blank=True), + preserve_default=True, + ), + migrations.RunSQL(migration_0022.CREATE_VIEWS), + ] diff --git a/seminar/models.py b/seminar/models.py index 56b25627..6f43d225 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -364,7 +364,7 @@ class Problem(SeminarModelBase): 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) + body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name=u'maximum bodů', blank=True, null=True) timestamp = models.DateTimeField(u'vytvořeno', default=timezone.now, blank=True, editable=False) @@ -414,7 +414,7 @@ class Reseni(SeminarModelBase): resitel = models.ForeignKey(Resitel, verbose_name=u'řešitel', related_name='reseni') - body = models.IntegerField(u'body', blank=True, null=True) + body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name=u'body', blank=True, null=True) cislo_body = models.ForeignKey(Cislo, verbose_name=u'číslo pro body', related_name='bodovana_reseni', blank=True, null=True) @@ -562,7 +562,8 @@ class VysledkyBase(SeminarModelBase): resitel = models.ForeignKey(Resitel, verbose_name=u'řešitel', db_column='resitel_id', on_delete=models.DO_NOTHING) - body = models.IntegerField(u'body za číslo', db_column='body') + body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body', + verbose_name=u'body za číslo') def __str__(self): return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) @@ -589,7 +590,8 @@ class VysledkyKCislu(VysledkyBase): abstract = False managed = False - body_celkem = models.IntegerField(u'body celkem do čísla', db_column='body_celkem') + body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem', + verbose_name=u'body celkem do čísla') def __str__(self): # NOTE: DB HOG (ale nepouzivany) diff --git a/seminar/tests.py b/seminar/tests.py index 2a22d721..f8246294 100644 --- a/seminar/tests.py +++ b/seminar/tests.py @@ -29,7 +29,7 @@ class SeminarBasicTests(TestCase): def test_render_cislo_e2e(self): cs = Cislo.objects.all() for c in cs[:4]: - url = reverse('seminar_cislo', args=(c.id,)) + url = c.verejne_url() r = self.client.get(url) assert r.status_code == 200 assert len(r.content) >= 100 @@ -38,7 +38,7 @@ class SeminarBasicTests(TestCase): def test_render_problem_e2e(self): ps = Problem.objects.all() for p in ps[:4]: - url = reverse('seminar_problem', args=(p.id,)) + url = p.verejne_url() r = self.client.get(url) assert r.status_code == 200 assert len(r.content) >= 100 From fa0c4e0fa9ea3ade64deeff053a584fb4d119052 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 23 Jun 2015 10:50:58 +0200 Subject: [PATCH 10/37] Novinky | vytvoreni modelu --- seminar/models.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/seminar/models.py b/seminar/models.py index 6f43d225..6c2c99cb 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -618,3 +618,22 @@ class Nastaveni(SingletonModel): def verejne(self): return False + + +@python_2_unicode_compatible +class Novinky(models.Model): + datum = models.DateField(auto_now_add=True) + text = models.TextField('Text novinky', blank=True, null=True) + obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/', + null=True, blank=True) + autor = models.ForeignKey(settings.AUTH_USER_MODEL, + verbose_name='Autor novinky') + zverejneno = models.BooleanField('Zveřejněno', default="False") + + def __str__(self): + return '[' + self.datum + '] ' + self.text[0:20] + + class Meta: + verbose_name = 'Novinka' + verbose_name_plural = 'Novinky' + From 836905b3de723a0c585963fbb476887651d6a177 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 23 Jun 2015 11:30:08 +0200 Subject: [PATCH 11/37] Novinky | vytvoreni modelu --- seminar/migrations/0023_add_novinky.py | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 seminar/migrations/0023_add_novinky.py diff --git a/seminar/migrations/0023_add_novinky.py b/seminar/migrations/0023_add_novinky.py new file mode 100644 index 00000000..3babdc2d --- /dev/null +++ b/seminar/migrations/0023_add_novinky.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('seminar', '0022_decimal_body'), + ] + + operations = [ + migrations.CreateModel( + name='Novinky', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('datum', models.DateField(auto_now_add=True)), + ('text', models.TextField(null=True, verbose_name=b'Text novinky', blank=True)), + ('obrazek', models.ImageField(upload_to=b'image_novinky/%Y/%m/%d/', null=True, verbose_name=b'Obr\xc3\xa1zek', blank=True)), + ('zverejneno', models.BooleanField(default=b'False', verbose_name=b'Zve\xc5\x99ejn\xc4\x9bno')), + ('autor', models.ForeignKey(verbose_name=b'Autor novinky', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Novinka', + 'verbose_name_plural': 'Novinky', + }, + bases=(models.Model,), + ), + ] From 42df6f9265527e429a859a63536b05b4d2f11c84 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 23 Jun 2015 11:32:16 +0200 Subject: [PATCH 12/37] Novinky | admin --- seminar/admin.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/seminar/admin.py b/seminar/admin.py index d8fdd2aa..39ff2f05 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -8,7 +8,7 @@ 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 +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Novinky import autocomplete_light @@ -317,3 +317,9 @@ class SoustredeniAdmin(reversion.VersionAdmin): admin.site.register(Soustredeni, SoustredeniAdmin) +### Novinky + +class NovinkyAdmin(admin.ModelAdmin): + pass + +admin.site.register(Novinky, NovinkyAdmin) From 60a93713b3095b6b42fb04790304834960449e80 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 23 Jun 2015 11:36:42 +0200 Subject: [PATCH 13/37] Novinky | oprava chyby se zobrazovanym nazvem --- seminar/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/models.py b/seminar/models.py index 6c2c99cb..04890ef9 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -631,7 +631,7 @@ class Novinky(models.Model): zverejneno = models.BooleanField('Zveřejněno', default="False") def __str__(self): - return '[' + self.datum + '] ' + self.text[0:20] + return '[' + str(self.datum) + '] ' + self.text[0:50] class Meta: verbose_name = 'Novinka' From 3ed0e6d6d03d9fc8e9a7ae809acba7db5d4b746c Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 23 Jun 2015 11:46:45 +0200 Subject: [PATCH 14/37] Novinky | CKEditor --- seminar/admin.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/seminar/admin.py b/seminar/admin.py index 39ff2f05..dcb7797d 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -319,7 +319,15 @@ admin.site.register(Soustredeni, SoustredeniAdmin) ### Novinky +class NovinkyAdminForm(forms.ModelForm): + text = forms.CharField(widget=CKEditorWidget(), required=False, + **field_labels(Novinky, 'text')) + class Meta: + model = Novinky + exclude = [] + class NovinkyAdmin(admin.ModelAdmin): - pass + form = NovinkyAdminForm + admin.site.register(Novinky, NovinkyAdmin) From 1777656d27db2b06e48cfe7e440381128921ded8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 10:48:06 +0200 Subject: [PATCH 15/37] Organizator | model --- seminar/models.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/seminar/models.py b/seminar/models.py index 04890ef9..c731fa4c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -12,6 +12,10 @@ from django.utils.text import slugify from django.core.urlresolvers import reverse from django.core.cache import cache +from PIL import Image +import os +from cStringIO import StringIO +from django.core.files.base import ContentFile from django_countries.fields import CountryField from solo.models import SingletonModel @@ -637,3 +641,68 @@ class Novinky(models.Model): verbose_name = 'Novinka' verbose_name_plural = 'Novinky' + +@python_2_unicode_compatible +class Organizator(models.Model): + user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name='Osoba', + help_text = 'Vyber účet spřažený s organizátorem.') + prezdivka = models.CharField('Přezdívka', max_length = 32, + null = True, blank = True) + organizuje_od_roku = models.IntegerField('Organizuje od roku', + null = True, blank = True) + organizuje_do_roku = models.IntegerField('Organizuje do roku', + null = True, blank = True) + studuje = models.CharField('Studuje', max_length = 256, + null = True, blank = True) + strucny_popis_organizatora = models.TextField('Stručný popis organizátora', + null = True, blank = True) + foto = models.ImageField('Fotografie organizátora', + upload_to='image_organizatori/%Y/', null = True, blank = True, + help_text = 'Vlož fotografii organizátora o libovoné velikosti') + foto_male = models.ImageField(upload_to='image_organizatori/male/%Y/', + null = True, blank = True, editable = False) + + def __str__(self): + return str(self.user) + + class Meta: + verbose_name = 'Organizátor' + verbose_name_plural = 'Organizátoři' + + def save(self): + original = Image.open(self.foto) + jmeno = os.path.basename(self.foto.file.name) + Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) + Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) + super(Organizator, self).save() + + @staticmethod + def _vyrobMiniaturu(original, jmeno, maximum, field): + zmensenina = Organizator._zmensiObrazek(original, maximum) + f = StringIO() + try: + zmensenina.save(f, format=original.format) + data = ContentFile(f.getvalue()) + finally: + f.close() + field.save(jmeno, data, save = False) + + @staticmethod + def _zmensiObrazek(original, maximum): + """Preskaluje obrazek tak, aby byl zachovan pomer stran + a zadny rozmer nepresahoval maxRozmer. Pokud zadny rozmer + nepresahuje maxRozmer, tak vrati puvodni obrazek + (tj. nedojde ke zvetseni obrazku).""" + novaVelikost = Organizator._zmensiVelikost(original.size, maximum) + return original.resize(novaVelikost, Image.ANTIALIAS) + + @staticmethod + def _zmensiVelikost(velikost, maximum): + maximum = float(maximum) + w, h = velikost + soucasneMaximum = max(w, h) + if soucasneMaximum <= maximum: + return velikost + pomer = maximum/soucasneMaximum + return (int(w * pomer), int(h * pomer)) + From e6b0efe1a73dd555fc6f4f019979e5f262538510 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 11:01:39 +0200 Subject: [PATCH 16/37] Organizatori | admin + odstraneni chyby, kdyz chybi obrazek organizatora --- seminar/admin.py | 10 ++++++++-- seminar/models.py | 9 +++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index dcb7797d..6ca5d238 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -8,7 +8,7 @@ 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, Novinky +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Novinky, Organizator import autocomplete_light @@ -329,5 +329,11 @@ class NovinkyAdminForm(forms.ModelForm): class NovinkyAdmin(admin.ModelAdmin): form = NovinkyAdminForm - admin.site.register(Novinky, NovinkyAdmin) + +### Organizator + +@admin.register(Organizator) +class OrganizatorAdmin(admin.ModelAdmin): + list_filter = ['organizuje_do_roku'] + diff --git a/seminar/models.py b/seminar/models.py index c731fa4c..23578780 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -670,10 +670,11 @@ class Organizator(models.Model): verbose_name_plural = 'Organizátoři' def save(self): - original = Image.open(self.foto) - jmeno = os.path.basename(self.foto.file.name) - Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) - Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) + if self.foto: + original = Image.open(self.foto) + jmeno = os.path.basename(self.foto.file.name) + Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) + Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) super(Organizator, self).save() @staticmethod From fa6975d2efe2a8514e2e5feb7fb3656458dd57d8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 11:03:03 +0200 Subject: [PATCH 17/37] Organizatori | migrace --- seminar/migrations/0024_add_organizator.py | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 seminar/migrations/0024_add_organizator.py diff --git a/seminar/migrations/0024_add_organizator.py b/seminar/migrations/0024_add_organizator.py new file mode 100644 index 00000000..f9bf2cb8 --- /dev/null +++ b/seminar/migrations/0024_add_organizator.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('seminar', '0023_add_novinky'), + ] + + operations = [ + migrations.CreateModel( + name='Organizator', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('prezdivka', models.CharField(max_length=32, null=True, verbose_name=b'P\xc5\x99ezd\xc3\xadvka', blank=True)), + ('organizuje_od_roku', models.IntegerField(null=True, verbose_name=b'Organizuje od roku', blank=True)), + ('organizuje_do_roku', models.IntegerField(null=True, verbose_name=b'Organizuje do roku', blank=True)), + ('studuje', models.CharField(max_length=256, null=True, verbose_name=b'Studuje', blank=True)), + ('strucny_popis_organizatora', models.TextField(null=True, verbose_name=b'Stru\xc4\x8dn\xc3\xbd popis organiz\xc3\xa1tora', blank=True)), + ('foto', models.ImageField(help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovon\xc3\xa9 velikosti', upload_to=b'image_organizatori/%Y/', null=True, verbose_name=b'Fotografie organiz\xc3\xa1tora', blank=True)), + ('foto_male', models.ImageField(upload_to=b'image_organizatori/male/%Y/', null=True, editable=False, blank=True)), + ('user', models.OneToOneField(verbose_name=b'Osoba', to=settings.AUTH_USER_MODEL, help_text=b'Vyber \xc3\xba\xc4\x8det sp\xc5\x99a\xc5\xbeen\xc3\xbd s organiz\xc3\xa1torem.')), + ], + options={ + 'verbose_name': 'Organiz\xe1tor', + 'verbose_name_plural': 'Organiz\xe1to\u0159i', + }, + bases=(models.Model,), + ), + ] From 944afc597408a9ba857c6353cae9dbcebe9a3876 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 29 Jun 2015 00:27:02 +0200 Subject: [PATCH 18/37] Prepracovani exportu, doplneni exportu soustredek --- seminar/export.py | 148 ++++++++++---------- seminar/models.py | 24 ++++ seminar/ovvpfile.py | 15 +- seminar/templates/seminar/export_index.csv | 2 - seminar/templates/seminar/export_rocnik.csv | 11 -- seminar/urls.py | 1 + 6 files changed, 115 insertions(+), 86 deletions(-) delete mode 100644 seminar/templates/seminar/export_index.csv delete mode 100644 seminar/templates/seminar/export_rocnik.csv diff --git a/seminar/export.py b/seminar/export.py index ce52220a..2e7d6bd2 100644 --- a/seminar/export.py +++ b/seminar/export.py @@ -1,80 +1,92 @@ -import datetime +import datetime, django from django.shortcuts import get_object_or_404, render -from django.http import HttpResponseRedirect +from django.http import HttpResponse from django.core.urlresolvers import reverse from django.views import generic -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik - -class ExportIndexView(generic.base.TemplateView): - template_name = 'seminar/export_index.csv' - content_type = 'text/plain; charset=utf-8' - def get_context_data(self, **kwargs): - context = super(ExportIndexView, self).get_context_data(**kwargs) - context['exports'] = [] +from django.utils.encoding import force_text + +from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni +from .ovvpfile import OvvpFile + +class ExportIndexView(generic.View): + def get(self, request): + + ls = [] for r in Rocnik.objects.all(): if r.verejna_cisla(): url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) - context['exports'].append(url.split('/')[-1]) - return context + ls.append(url.split('/')[-1]) + for s in Soustredeni.objects.all(): + if s.ucastnici.count() >= 1: + url = reverse('seminar_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()}) + ls.append(url.split('/')[-1]) + return HttpResponse('\n'.join(ls) + '\n', content_type='text/plain; charset=utf-8') -class ExportRocnikView(generic.DetailView): - slug_field = 'prvni_rok' - slug_url_kwarg = 'prvni_rok' - model = Rocnik - template_name = 'seminar/export_rocnik.csv' - content_type = 'text/plain; charset=utf-8' - def get_context_data(self, **kwargs): - context = super(ExportRocnikView, self).get_context_data(**kwargs) - rocnik = context['rocnik'] - cislo = rocnik.posledni_verejne_cislo() - sloupce = ['id', 'name', 'surname', - 'gender', 'born', 'email', 'end-year', - 'street', 'town', 'postcode', 'country', - 'spam-flag', 'spam-date', 'school', 'school-name', - 'points', 'rank',] - radky = [] +def default_ovvpfile(event, rocnik): + of = OvvpFile() + of.headers['version'] = '1' + of.headers['event'] = event + of.headers['year'] = force_text(rocnik.prvni_rok) + of.headers['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + of.headers['id-scope'] = 'mam' + of.headers['id-generation'] = '1' + return of + + +class ExportSousView(generic.View): + + def get(self, request, datum_zacatku=None): + try: + dz = django.utils.dateparse.parse_date(datum_zacatku) + except: + dz = None + if dz is None: + raise django.http.Http404() + s = get_object_or_404(Soustredeni, datum_zacatku=dz) + + of = default_ovvpfile('MaM.sous', s.rocnik) + of.headers['x-event-begin'] = s.datum_zacatku.isoformat() + of.headers['x-event-end'] = s.datum_konce.isoformat() + of.headers['x-event-location'] = s.misto + of.headers['comment'] = u'MaM-Web export ucastniku soustredeni v {x-event-location} od {x-event-begin} do {x-event-end}'.format(**of.headers) + of.columns = ['id', 'name', 'surname', 'gender', 'email', 'end-year', 'school', 'school-name'] + + for u in s.ucastnici.all(): + of.rows.append(u.export_row()) + + return of.to_HttpResponse() + + +class ExportRocnikView(generic.View): + + def get(self, request, prvni_rok=None): + try: + pr = int(prvni_rok) + except: + pr = None + if pr is None: + raise django.http.Http404() + + rocnik = get_object_or_404(Rocnik, prvni_rok=pr) + cislo = rocnik.posledni_verejne_cislo() vysledky = VysledkyKCislu.objects.filter(cislo = cislo).select_related("resitel").order_by('-body_celkem').all() + of = default_ovvpfile('MaM.rocnik', rocnik) + of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format( + rocnik=rocnik, cislo=cislo) + of.columns = ['id', 'name', 'surname', 'gender', 'born', 'email', 'end-year', + 'street', 'town', 'postcode', 'country', 'spam-flag', 'spam-date', + 'school', 'school-name', 'points', 'rank',] + posledni_body = 100000 posledni_poradi = 0 for vi in range(len(vysledky)): + v = vysledky[vi] - rd = {} - - rd['name'] = v.resitel.jmeno - rd['surname'] = v.resitel.prijmeni - rd['id'] = v.resitel.id - - rd['gender'] = 'M' if v.resitel.pohlavi_muz else 'F' - if v.resitel.datum_narozeni: - rd['born'] = v.resitel.datum_narozeni.strftime("%Y-%m-%d") - else: - rd['born'] = '' - rd['email'] = v.resitel.email - rd['end-year'] = v.resitel.rok_maturity - - # TODO(gavento): Adresa skoly, kdyz preferuje zasilani tam? - rd['street'] = v.resitel.ulice - rd['town'] = v.resitel.mesto - rd['postcode'] = v.resitel.psc - rd['country'] = v.resitel.stat - - if v.resitel.datum_souhlasu_zasilani: - rd['spam-flag'] = 'Y' - rd['spam-date'] = v.resitel.datum_souhlasu_zasilani.strftime("%Y-%m-%d") - else: - rd['spam-flag'] = '' - rd['spam-date'] = '' - - if v.resitel.skola: - rd['school'] = v.resitel.skola.aesop_id - rd['school-name'] = str(v.resitel.skola) - else: - rd['school'] = '' - rd['school-name'] = 'Skola neni znama' + rd = v.resitel.export_row() if posledni_body > v.body_celkem: posledni_body = v.body_celkem @@ -82,16 +94,8 @@ class ExportRocnikView(generic.DetailView): rd['rank'] = posledni_poradi rd['points'] = v.body_celkem - r = [] - for c in sloupce: - r.append(rd.pop(c)) - assert len(rd) == 0 - radky.append(r) - - context['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - context['cislo'] = cislo - context['sloupce'] = sloupce - context['radky'] = radky - return context + of.rows.append(rd) + + return of.to_HttpResponse() diff --git a/seminar/models.py b/seminar/models.py index 23578780..bc7f6b43 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -186,6 +186,30 @@ class Resitel(SeminarModelBase): def __str__(self): return force_unicode(self.plne_jmeno()) + def export_row(self): + "Slovnik pro pouziti v OVVP exportu" + return { + 'id': self.id, + 'name': self.jmeno, + 'surname': self.prijmeni, + 'gender': 'M' if self.pohlavi_muz else 'F', + 'born': self.datum_narozeni.isoformat() if self.datum_narozeni else '', + 'email': self.email, + 'end-year': self.rok_maturity, + + # TODO(gavento): Adresa skoly, kdyz preferuje zasilani tam? + 'street': self.ulice, + 'town': self.mesto, + 'postcode': self.psc, + 'country': self.stat, + + 'spam-flag': 'Y' if self.datum_souhlasu_zasilani else '', + 'spam-date': self.datum_souhlasu_zasilani.isoformat() if self.datum_souhlasu_zasilani else '', + + 'school': self.skola.aesop_id if self.skola else '', + 'school-name': str(self.skola) if self.skola else 'Skola neni znama', + } + @reversion.register(ignore_duplicate_revisions=True) @python_2_unicode_compatible diff --git a/seminar/ovvpfile.py b/seminar/ovvpfile.py index 46d34df3..471c06c6 100644 --- a/seminar/ovvpfile.py +++ b/seminar/ovvpfile.py @@ -1,9 +1,19 @@ # -*- coding: utf-8 -*- +try: + from django.http import HttpResponse + from django.utils.encoding import force_text +except: + force_text = str + + class OvvpFile(object): def __init__(self): + # { header: value, ... } self.headers = {} + # [ 'column-name', ... ] self.columns = [] + # [ { column: value, ...}, ...] self.rows = [] def to_lines(self): @@ -15,11 +25,14 @@ class OvvpFile(object): yield '\t'.join([c for c in self.columns]) + '\n' # rows for r in self.rows: - yield '\t'.join([r[c] for c in self.columns]) + '\n' + yield '\t'.join([force_text(r[c]) for c in self.columns]) + '\n' def to_string(self): return ''.join(self.to_lines()) + def to_HttpResponse(self): + return HttpResponse(self.to_string(), content_type='text/plain; charset=utf-8') + def parse_from(self, source, with_headers=True): "Parse data from file, string or line iterator, overwriting self" if isinstance(source, str) or isinstance(source, unicode): diff --git a/seminar/templates/seminar/export_index.csv b/seminar/templates/seminar/export_index.csv deleted file mode 100644 index edb833cf..00000000 --- a/seminar/templates/seminar/export_index.csv +++ /dev/null @@ -1,2 +0,0 @@ -{% for e in exports %}{{ e }} -{% endfor %} diff --git a/seminar/templates/seminar/export_rocnik.csv b/seminar/templates/seminar/export_rocnik.csv deleted file mode 100644 index a8668e39..00000000 --- a/seminar/templates/seminar/export_rocnik.csv +++ /dev/null @@ -1,11 +0,0 @@ -version 1 -event MaM.rocnik -year {{ rocnik.prvni_rok }} -date {{ date }} -id-scope mam -id-generation 1 -comment MaM-Web export aktivnich resitelu rocniku {{ rocnik }} do cisla {{ cislo.kod }} - -{% for c in sloupce %}{{ c }} {% endfor %} -{% for r in radky %}{% for c in r %}{{ c }} {% endfor %} -{% endfor %} diff --git a/seminar/urls.py b/seminar/urls.py index 3ed44bd0..e3264601 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -16,5 +16,6 @@ urlpatterns = patterns('', url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^aesop-export/mam-rocnik-(?P\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'), + url(r'^aesop-export/mam-sous-(?P[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'), url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'), ) From efea781049d26146ea9d95e6919ac655c47a5f61 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 29 Jun 2015 00:39:11 +0200 Subject: [PATCH 19/37] Export jen verejnych soustredeni --- seminar/export.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/export.py b/seminar/export.py index 2e7d6bd2..3d422614 100644 --- a/seminar/export.py +++ b/seminar/export.py @@ -17,7 +17,7 @@ class ExportIndexView(generic.View): url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) ls.append(url.split('/')[-1]) for s in Soustredeni.objects.all(): - if s.ucastnici.count() >= 1: + if s.ucastnici.count() >= 1 and s.verejne: url = reverse('seminar_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()}) ls.append(url.split('/')[-1]) From 8241a253376cd669d0cf45c03cc709eeed7b77d1 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 29 Jun 2015 00:39:40 +0200 Subject: [PATCH 20/37] Soustredeni a ucasti v testdatech --- seminar/tests.py | 13 +++++++++++++ seminar/testutils.py | 10 ++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/seminar/tests.py b/seminar/tests.py index f8246294..80bbfaa3 100644 --- a/seminar/tests.py +++ b/seminar/tests.py @@ -44,6 +44,19 @@ class SeminarBasicTests(TestCase): assert len(r.content) >= 100 # TODO: Validate cntent as HTML + def test_export_e2e(self): + i_url = '/aesop-export/index.csv' + i_r = self.client.get(i_url) + assert i_r.status_code == 200 + ls = i_r.content.strip().split('\n') + + for u in [ls[0], ls[-1]]: + ex_r = self.client.get('/aesop-export/' + u) + assert ex_r.status_code == 200 + assert len(ex_r.content) >= 100 + o = ovvpfile.parse(ex_r.content) + assert o.headers['version'] == '1' + def test_admin_url(self): for m in [Skola, Resitel, Rocnik, Cislo, Problem, Reseni, Nastaveni]: o = m.objects.first() diff --git a/seminar/testutils.py b/seminar/testutils.py index 946efb28..d98b21b9 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -5,7 +5,7 @@ import random import django.contrib.auth from django.db import transaction -from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici from django.contrib.flatpages.models import FlatPage from django.contrib.sites.models import Site @@ -70,7 +70,7 @@ def create_test_data(size = 6, rnd = None): 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 = Cislo.objects.create(rocnik = r, cislo = str(ci), datum_vydani=vydano, datum_deadline=deadline) + c = Cislo.objects.create(rocnik = r, cislo = str(ci), datum_vydani=vydano, datum_deadline=deadline, verejne_db=True) cs[ci] = c # problemy resene v ci @@ -91,6 +91,12 @@ def create_test_data(size = 6, rnd = None): res = Reseni.objects.create(problem = p, resitel = resitel, body = rnd.randint(0, p.body), cislo_body = cs[ci]) + 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, 6): + Soustredeni_Ucastnici.objects.create(resitel=res, soustredeni=sous) + sous.save() + nastaveni = Nastaveni.objects.create(aktualni_rocnik = Rocnik.objects.last(), aktualni_cislo = Cislo.objects.all()[1]) From 3a8f2ec35e56b3b0e98d27d45ba568591c553569 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 28 Jun 2015 22:07:27 +0200 Subject: [PATCH 21/37] Organizatori | ListView + template Nutno pak dostylovat podle vzhledu. Zaklad zobrazovanych informaci. Nutno rozdelit na aktivni a neaktivni a to idealne tak, ze template bude jeden a list se zpravne zkompetuje ve view. --- .../0025_zmena_cesty_nahravani_obrazku.py | 20 +++++++++++++ seminar/models.py | 2 +- .../seminar/cojemam/organizatori.html | 29 +++++++++++++++++++ seminar/views.py | 5 ++-- 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 seminar/migrations/0025_zmena_cesty_nahravani_obrazku.py diff --git a/seminar/migrations/0025_zmena_cesty_nahravani_obrazku.py b/seminar/migrations/0025_zmena_cesty_nahravani_obrazku.py new file mode 100644 index 00000000..23e02c95 --- /dev/null +++ b/seminar/migrations/0025_zmena_cesty_nahravani_obrazku.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0024_add_organizator'), + ] + + operations = [ + migrations.AlterField( + model_name='organizator', + name='foto', + field=models.ImageField(help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovon\xc3\xa9 velikosti', upload_to=b'image_organizatori/velke/%Y/', null=True, verbose_name=b'Fotografie organiz\xc3\xa1tora', blank=True), + preserve_default=True, + ), + ] diff --git a/seminar/models.py b/seminar/models.py index bc7f6b43..66c65bb6 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -681,7 +681,7 @@ class Organizator(models.Model): strucny_popis_organizatora = models.TextField('Stručný popis organizátora', null = True, blank = True) foto = models.ImageField('Fotografie organizátora', - upload_to='image_organizatori/%Y/', null = True, blank = True, + upload_to='image_organizatori/velke/%Y/', null = True, blank = True, help_text = 'Vlož fotografii organizátora o libovoné velikosti') foto_male = models.ImageField(upload_to='image_organizatori/male/%Y/', null = True, blank = True, editable = False) diff --git a/seminar/templates/seminar/cojemam/organizatori.html b/seminar/templates/seminar/cojemam/organizatori.html index 5c644f47..2d1f6ec9 100644 --- a/seminar/templates/seminar/cojemam/organizatori.html +++ b/seminar/templates/seminar/cojemam/organizatori.html @@ -4,6 +4,35 @@

Organizátoři

+ {% for org in object_list %} + {{org.user.first_name}} + {% if org.prezdivka %} + "{{org.prezdivka}}" + {% endif %} + {{org.user.last_name}}
+
    + {% if org.organizuje_od_roku %} +
  • Organizuje od roku: {{org.organizuje_od_roku}} + {% endif %} + {% if org.organizuje_do_roku %} +
  • Organizuje do roku: {{org.organizuje_do_roku}} + {% endif %} + {% if org.studuje %} +
  • Studuje: {{org.studuje}} + {% endif %} + {% if org.user.email %} +
  • Pošta: {{org.user.email}} + {% endif %} +
+ {% if org.foto %} +
+ + + {% endif %} +
+ {% endfor %} +
{% endblock content %} diff --git a/seminar/views.py b/seminar/views.py index 4c5063be..c6cdc177 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -5,7 +5,7 @@ from django.views import generic from django.utils.translation import ugettext as _ from django.http import Http404 -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni +from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni, Organizator def AktualniZadaniView(request): @@ -17,7 +17,8 @@ def AktualniZadaniView(request): # Co je M&M -class CojemamOrganizatoriView(generic.TemplateView): +class CojemamOrganizatoriView(generic.ListView): + model = Organizator template_name='seminar/cojemam/organizatori.html' class CislaView(generic.ListView): From 2f8eb74b87b8d4afdf7a0bfce337bfd469dd1821 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 29 Jun 2015 08:52:44 +0200 Subject: [PATCH 22/37] =?UTF-8?q?Organiz=C3=A1to=C5=99i=20|=20zobrazen?= =?UTF-8?q?=C3=AD,=20zda-li=20je=20aktivni?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/templates/seminar/cojemam/organizatori.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/seminar/templates/seminar/cojemam/organizatori.html b/seminar/templates/seminar/cojemam/organizatori.html index 2d1f6ec9..5400ac1d 100644 --- a/seminar/templates/seminar/cojemam/organizatori.html +++ b/seminar/templates/seminar/cojemam/organizatori.html @@ -5,6 +5,11 @@

Organizátoři

{% for org in object_list %} + {% if org.user.is_active %} + Aktivní + {% else %} + Není aktivní + {% endif %} {{org.user.first_name}} {% if org.prezdivka %} "{{org.prezdivka}}" From f71ea2db1a32206277b6e1ab2b06f92c1754dc84 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 29 Jun 2015 17:51:18 +0200 Subject: [PATCH 23/37] Soustredeni | seznam soustredeni Casy se nezobrazuji cesky --- mamweb/templates/menu.html | 2 +- .../soustredeni/seznam_soustredeni.html | 41 +++++++++++++++++++ seminar/urls.py | 1 + seminar/views.py | 16 +++++--- 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 seminar/templates/seminar/soustredeni/seznam_soustredeni.html diff --git a/mamweb/templates/menu.html b/mamweb/templates/menu.html index 76958171..4642f282 100644 --- a/mamweb/templates/menu.html +++ b/mamweb/templates/menu.html @@ -5,7 +5,7 @@
  • Co je M&M -
  • Soustředění +
  • Soustředění
  • Zadání
  • Články
  • Archiv diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html new file mode 100644 index 00000000..4864290f --- /dev/null +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -0,0 +1,41 @@ +{% extends "seminar/soustredeni/base.html" %} + +{% block content %} + +

    Soustředění

    + + {# Projdi vsechna soustredeni #} + {% for soustredeni in object_list %} + {# Kdyz je verejne -> zobraz #} + {% if soustredeni.verejne_db %} + {# misto a cas soustredeni TODO upravit#} + {% if soustredeni.misto %} +

    + Soustředění v {{soustredeni.misto}} + od {{soustredeni.datum_zacatku}} do {{soustredeni.datum_konce}} + při {{soustredeni.rocnik.rocnik}}. ročníku M&M +

    + {% endif %} + {# popis soustredeni #} + {% if soustredeni.text %} + {% autoescape off %}{{soustredeni.text}}{% endautoescape %} + {% endif %} + {# Účastníci #} +

    Soustředění se zůčastnili tito účastníci:

    +
      + {% for i in soustredeni.soustredeni_ucastnici_set.all %} +
    • {{i.resitel}} + {% empty %} +
    • Nic! + {% endfor %} +
    + {# Kdyz neni verejne, tak TODO zobraz jen pro prihlasene orgy #} + {% else %} + {# TODO if org je prihlaseny, predelat na (verejne OR jsem_org) #} + {% endif %} + {% empty %} + Žádná soustředění zatím neproběhla! + {% endfor %} + +{% endblock %} + diff --git a/seminar/urls.py b/seminar/urls.py index e3264601..778c49f4 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -11,6 +11,7 @@ urlpatterns = patterns('', url(r'^cislo/(?P\d+).(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), url(r'^problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'), + url(r'^soustredeni/$', views.SoustredeniListView.as_view()), url(r'^soustredeni/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), diff --git a/seminar/views.py b/seminar/views.py index c6cdc177..46e1390a 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -15,12 +15,14 @@ def AktualniZadaniView(request): }, ) -# Co je M&M +### Co je M&M class CojemamOrganizatoriView(generic.ListView): model = Organizator template_name='seminar/cojemam/organizatori.html' +### Archiv + class CislaView(generic.ListView): model = Rocnik template_name='seminar/archiv/cisla.html' @@ -43,10 +45,6 @@ class RocnikView(generic.DetailView): {'verbose_name': queryset.model._meta.verbose_name}) return obj -class SoustredeniView(generic.DetailView): - model = Soustredeni - template_name = 'seminar/archiv/soustredeni.html' - class ProblemView(generic.DetailView): model = Problem template_name = 'seminar/archiv/problem.html' @@ -107,4 +105,12 @@ class CisloView(generic.DetailView): context['problemy'] = problemy return context +### Soustredeni +class SoustredeniListView(generic.ListView): + model = Soustredeni + template_name = 'seminar/soustredeni/seznam_soustredeni.html' + +class SoustredeniView(generic.DetailView): + model = Soustredeni + template_name = 'seminar/archiv/soustredeni.html' From 58301b8b44a212a26f14bbcd3e064918d09b1adc Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 30 Jun 2015 09:03:10 +0200 Subject: [PATCH 24/37] Odkaz v hlavnim menu na soustredeni poradne pres {% url %} --- mamweb/templates/menu.html | 2 +- seminar/urls.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mamweb/templates/menu.html b/mamweb/templates/menu.html index 4642f282..6b174589 100644 --- a/mamweb/templates/menu.html +++ b/mamweb/templates/menu.html @@ -5,7 +5,7 @@
    • Co je M&M -
    • Soustředění +
    • Soustředění
    • Zadání
    • Články
    • Archiv diff --git a/seminar/urls.py b/seminar/urls.py index 778c49f4..3be2970f 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -11,7 +11,8 @@ urlpatterns = patterns('', url(r'^cislo/(?P\d+).(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), url(r'^problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'), - url(r'^soustredeni/$', views.SoustredeniListView.as_view()), + url(r'^soustredeni/$', views.SoustredeniListView.as_view(), + name = 'seminar_seznam_soustredeni'), url(r'^soustredeni/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), From 93bc61607c7b0a592cdd603503dc72431dd75969 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Wed, 1 Jul 2015 11:05:11 +0200 Subject: [PATCH 25/37] I18N zapnuta --- mamweb/settings_common.py | 2 +- mamweb/urls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mamweb/settings_common.py b/mamweb/settings_common.py index b63e27a1..84abd9cd 100644 --- a/mamweb/settings_common.py +++ b/mamweb/settings_common.py @@ -25,7 +25,7 @@ APPEND_SLASH = False LANGUAGE_CODE = 'cs' TIME_ZONE = 'Europe/Prague' -USE_I18N = False +USE_I18N = True USE_L10N = True USE_TZ = True diff --git a/mamweb/urls.py b/mamweb/urls.py index c51c72a4..5e52b1d4 100644 --- a/mamweb/urls.py +++ b/mamweb/urls.py @@ -5,7 +5,7 @@ from django.contrib import admin from django.conf import settings from django.views.generic.base import TemplateView -urlpatterns = i18n_patterns('', +urlpatterns = patterns('', # Admin a nastroje url(r'^admin/', include(admin.site.urls)), # NOQA From 808351fad0a463e642a760290432a6dc249728a8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Fri, 3 Jul 2015 09:01:16 +0200 Subject: [PATCH 26/37] Zobrazovani e-mailu + chybejici zaviraci zavorka tagu --- seminar/templates/seminar/cojemam/organizatori.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/seminar/templates/seminar/cojemam/organizatori.html b/seminar/templates/seminar/cojemam/organizatori.html index 5400ac1d..4de380aa 100644 --- a/seminar/templates/seminar/cojemam/organizatori.html +++ b/seminar/templates/seminar/cojemam/organizatori.html @@ -26,13 +26,15 @@
    • Studuje: {{org.studuje}} {% endif %} {% if org.user.email %} -
    • Pošta: {{org.user.email}} +
    • Pošta: + {# zobrazeni e-mailu (na jednom radku, aby nevznikali mezery navic) #} + {% for znak in org.user.email %}{% if znak == '@' %} <zavináč> {% elif znak == '.' %} <tečka> {% else %}{{znak}}{% endif %}{% endfor %} {% endif %}
    {% if org.foto %}
    -
    {% endif %}
    From f2bdb970ab06e6f080856a910dbd1acec125a7f1 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Fri, 3 Jul 2015 10:54:13 +0200 Subject: [PATCH 27/37] soustredeni +action zverejnit soustredeni --- seminar/admin.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/seminar/admin.py b/seminar/admin.py index 6ca5d238..9036592f 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -298,6 +298,12 @@ create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name=u'P ### Soustredeni +def zverejnit_soustredeni(modeladmin, request, queryset): + for soustredeni in queryset: + soustredeni.verejne_db = True + soustredeni.save() +zverejnit_soustredeni.short_description = 'Zveřejnit soustředění' + class SoustredeniAdminForm(forms.ModelForm): text = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Soustredeni, 'text')) class Meta: @@ -314,6 +320,7 @@ class SoustredeniAdmin(reversion.VersionAdmin): inlines = [Soustredeni_UcastniciInline] list_filter = ['rocnik'] view_on_site = Soustredeni.verejne_url + actions = [zverejnit_soustredeni,] admin.site.register(Soustredeni, SoustredeniAdmin) From 82cf4c6a64712caa6843bb189d225a0ed8db6d3a Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Fri, 3 Jul 2015 11:13:46 +0200 Subject: [PATCH 28/37] soustredeni | Neverejna soustredeni viditelna pro prihlasene --- .../seminar/soustredeni/seznam_soustredeni.html | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index 4864290f..6485fc92 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -7,8 +7,15 @@ {# Projdi vsechna soustredeni #} {% for soustredeni in object_list %} {# Kdyz je verejne -> zobraz #} - {% if soustredeni.verejne_db %} - {# misto a cas soustredeni TODO upravit#} + {% if soustredeni.verejne_db or user.is_authenticated %} + {% if user.is_authenticated %} + Groups of user: {{user.groups.all}}
    + + Toto soustředění není veřejné, vidíte ho jen proto, + že jste přihlášení.
    + {% endif %} + {# misto soustredeni TODO upravit#} {% if soustredeni.misto %}

    Soustředění v {{soustredeni.misto}} @@ -29,9 +36,6 @@
  • Nic! {% endfor %}
- {# Kdyz neni verejne, tak TODO zobraz jen pro prihlasene orgy #} - {% else %} - {# TODO if org je prihlaseny, predelat na (verejne OR jsem_org) #} {% endif %} {% empty %} Žádná soustředění zatím neproběhla! From b5dda32fee7156fbc935b01a555af4babcdb6886 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Fri, 3 Jul 2015 11:18:32 +0200 Subject: [PATCH 29/37] soustredeni +action skryti soustredeni --- seminar/admin.py | 8 +++++++- .../templates/seminar/soustredeni/seznam_soustredeni.html | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 9036592f..29954951 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -304,6 +304,12 @@ def zverejnit_soustredeni(modeladmin, request, queryset): soustredeni.save() zverejnit_soustredeni.short_description = 'Zveřejnit soustředění' +def skryt_soustredeni(modeladmin, request, queryset): + for soustredeni in queryset: + soustredeni.verejne_db = False + soustredeni.save() +skryt_soustredeni.short_description = 'Skrýt soustředění (Zneveřjnit)' + class SoustredeniAdminForm(forms.ModelForm): text = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Soustredeni, 'text')) class Meta: @@ -320,7 +326,7 @@ class SoustredeniAdmin(reversion.VersionAdmin): inlines = [Soustredeni_UcastniciInline] list_filter = ['rocnik'] view_on_site = Soustredeni.verejne_url - actions = [zverejnit_soustredeni,] + actions = [zverejnit_soustredeni, skryt_soustredeni, ] admin.site.register(Soustredeni, SoustredeniAdmin) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index 6485fc92..1159f9e6 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -8,7 +8,7 @@ {% for soustredeni in object_list %} {# Kdyz je verejne -> zobraz #} {% if soustredeni.verejne_db or user.is_authenticated %} - {% if user.is_authenticated %} + {% if not soustredeni.verejne_db and user.is_authenticated %} Groups of user: {{user.groups.all}}
From 7542adb996f142b6a9eb8afd86a7641a0dbe4081 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Fri, 3 Jul 2015 17:50:35 +0200 Subject: [PATCH 30/37] Fix cislo URL --- Makefile | 2 +- mamweb/settings.py | 11 +++++++++-- seminar/urls.py | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 495e6bfc..972ab3f6 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ push_test: (chown -Rf :mam . || true ) && \ (chmod -Rf g+w . || true ) && \ echo 'Reloading apache ... (You may have to start it manually on error!)' && \ - ~/etc/apache2/apache2ctl -k reload && \ + ~/etc/apache2/apache2ctl -k restart && \ echo Done." @echo "Test pushed to ${TEST_SERVER}:${TEST_DIR} successfully." diff --git a/mamweb/settings.py b/mamweb/settings.py index e1b17817..6ea87900 100644 --- a/mamweb/settings.py +++ b/mamweb/settings.py @@ -23,8 +23,15 @@ ALLOWED_HOSTS = ['127.0.0.1'] DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db-local.sqlite3'), +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': os.path.join(BASE_DIR, 'db-local.sqlite3'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'mam-prod', + 'USER': 'mam', + 'TEST': { + 'NAME': 'mam-test', + } + } } diff --git a/seminar/urls.py b/seminar/urls.py index 3be2970f..fc401f2a 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -8,7 +8,7 @@ urlpatterns = patterns('', url(r'^archiv/cisla/$', views.CislaView.as_view()), url(r'^rocnik/(?P\d+)/$', views.RocnikView.as_view(), name='seminar_rocnik'), - url(r'^cislo/(?P\d+).(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), + url(r'^cislo/(?P\d+)\.(?P\d+)/$', views.CisloView.as_view(), name='seminar_cislo'), url(r'^problem/(?P\d+)/$', views.ProblemView.as_view(), name='seminar_problem'), url(r'^soustredeni/$', views.SoustredeniListView.as_view(), From c75fe27a60d9f5d0f4b4931f76cf5b7a6dc4d8b7 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Fri, 3 Jul 2015 17:55:39 +0200 Subject: [PATCH 31/37] Komentare k pocitani vysledkovky --- seminar/views.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/seminar/views.py b/seminar/views.py index 46e1390a..12fc1650 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -74,23 +74,31 @@ class CisloView(generic.DetailView): def get_context_data(self, **kwargs): context = super(CisloView, self).get_context_data(**kwargs) + # Vysledky k cislu: seznam objektu typu (cislo, resitel, body [v tom cisle], body_celkem [od zac. rocniku]) vysledky = VysledkyKCislu.objects.filter(cislo = context['cislo']).order_by('-body_celkem').select_related("resitel") + reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") + # seznam problemu s nejakymi body v tomto cisle problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod)) + # cislo sloupecku pro problem (inverzni funkce) problem_index = {} for i in range(len(problemy)): problem_index[problemy[i].id] = i + # pomocna mapa Resitel: RadekVysledkovky vysledky_resitele = {} + # radky vysledkovky, seznam objektu RadekVysledkovky vysledkovka = [] + # posledni pocet bodu, pro detekci stejnych mist posledni_body = 100000 + for vi in range(len(vysledky)): v = vysledky[vi] tv = RadekVysledkovky() tv.resitel = v.resitel tv.vysledek = v - tv.body = ['']*len(problemy) + tv.body = ['']*len(problemy) # misto pro body za jednotlive uloy tv.poradi = '' if posledni_body > v.body_celkem: posledni_body = v.body_celkem @@ -98,6 +106,7 @@ class CisloView(generic.DetailView): vysledky_resitele[v.resitel.id] = tv vysledkovka.append(tv) + # doplneni bodu za jednotliva reseni lidi do RadekVysledkovky.body for r in reseni: vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body From da64ec12a0a803b3698c10381196a6ef38135430 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Fri, 3 Jul 2015 17:50:35 +0200 Subject: [PATCH 32/37] Fix: vraceni nastaveni lokalni DB --- mamweb/settings.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/mamweb/settings.py b/mamweb/settings.py index 6ea87900..e1b17817 100644 --- a/mamweb/settings.py +++ b/mamweb/settings.py @@ -23,15 +23,8 @@ ALLOWED_HOSTS = ['127.0.0.1'] DATABASES = { 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'NAME': os.path.join(BASE_DIR, 'db-local.sqlite3'), - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'mam-prod', - 'USER': 'mam', - 'TEST': { - 'NAME': 'mam-test', - } - + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db-local.sqlite3'), } } From 09b8b7c0df4ed9b7fb5a83aaf2a15661bbf95aa9 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 5 Jul 2015 09:49:00 +0200 Subject: [PATCH 33/37] organizatori | admin | list_display --- seminar/admin.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/seminar/admin.py b/seminar/admin.py index 29954951..8e6d8a96 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -346,7 +346,18 @@ admin.site.register(Novinky, NovinkyAdmin) ### Organizator +def jmeno_organizatora(obj): + return ('%s \"%s\" %s' % + (obj.user.first_name, obj.prezdivka, obj.user.last_name)) +jmeno_organizatora.short_description = 'Jméno organizátora' + +def je_organizator_aktivni(obj): + return obj.user.is_active +je_organizator_aktivni.short_description = 'Aktivní' +je_organizator_aktivni.boolean = True + @admin.register(Organizator) class OrganizatorAdmin(admin.ModelAdmin): list_filter = ['organizuje_do_roku'] + list_display = [jmeno_organizatora, je_organizator_aktivni,] From b19cbe60325d254ff6307c8d0a4d15b6b216c4bd Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 5 Jul 2015 10:12:47 +0200 Subject: [PATCH 34/37] organizatori | admin | actions --- seminar/admin.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/seminar/admin.py b/seminar/admin.py index 8e6d8a96..6a491766 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -347,17 +347,35 @@ admin.site.register(Novinky, NovinkyAdmin) ### Organizator def jmeno_organizatora(obj): + ''' vraci jmeno organizatora ''' return ('%s \"%s\" %s' % (obj.user.first_name, obj.prezdivka, obj.user.last_name)) jmeno_organizatora.short_description = 'Jméno organizátora' def je_organizator_aktivni(obj): + ''' zjisti, zda-li je organizator aktivni ''' return obj.user.is_active je_organizator_aktivni.short_description = 'Aktivní' je_organizator_aktivni.boolean = True +def zaktivovat_organizatory(modeladmin, request, queryset): + ''' vybrane organizatory oznaci jako aktivni ''' + for org in queryset: + org.user.is_active = True + org.user.save() +zaktivovat_organizatory.short_description = 'Zaktivovat organizátory' + +def deaktivovat_organizatory(modeladmin, request, queryset): + ''' deaktivuje vybrane organizatory ''' + for org in queryset: + org.user.is_active = False + org.user.save() +deaktivovat_organizatory.short_description = 'Deaktivovat organizátory' + + @admin.register(Organizator) class OrganizatorAdmin(admin.ModelAdmin): list_filter = ['organizuje_do_roku'] list_display = [jmeno_organizatora, je_organizator_aktivni,] + actions = [zaktivovat_organizatory, deaktivovat_organizatory,] From e2edab52f873dc080f11d82f94059102d84914c6 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 5 Jul 2015 10:21:19 +0200 Subject: [PATCH 35/37] organizatori | admin | oprava zobrazovani "" navic --- seminar/admin.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 6a491766..738225a1 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -348,8 +348,11 @@ admin.site.register(Novinky, NovinkyAdmin) def jmeno_organizatora(obj): ''' vraci jmeno organizatora ''' - return ('%s \"%s\" %s' % - (obj.user.first_name, obj.prezdivka, obj.user.last_name)) + jmeno = obj.user.first_name + if obj.prezdivka: + jmeno = jmeno + ' "' + obj.prezdivka + '"' + jmeno = jmeno + ' ' + obj.user.last_name + return jmeno jmeno_organizatora.short_description = 'Jméno organizátora' def je_organizator_aktivni(obj): From bc3cbf1c410d53a75d97934edbb880f646929b93 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 5 Jul 2015 10:31:35 +0200 Subject: [PATCH 36/37] organizatori | admin | zobrazeni bezejmennych orgu --- seminar/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/seminar/admin.py b/seminar/admin.py index 738225a1..39e38a70 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -352,6 +352,9 @@ def jmeno_organizatora(obj): if obj.prezdivka: jmeno = jmeno + ' "' + obj.prezdivka + '"' jmeno = jmeno + ' ' + obj.user.last_name + print jmeno + if jmeno == ' ': # zobrazeni bezejmennych orgu + return 'org' return jmeno jmeno_organizatora.short_description = 'Jméno organizátora' From 1ab486d15ff1f5536d4d5af320f9a33915ae12e9 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 5 Jul 2015 10:34:49 +0200 Subject: [PATCH 37/37] organizatori | zapomenuty vypis --- seminar/admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/seminar/admin.py b/seminar/admin.py index 39e38a70..de4c800d 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -352,7 +352,6 @@ def jmeno_organizatora(obj): if obj.prezdivka: jmeno = jmeno + ' "' + obj.prezdivka + '"' jmeno = jmeno + ' ' + obj.user.last_name - print jmeno if jmeno == ' ': # zobrazeni bezejmennych orgu return 'org' return jmeno