Opravy poli podle noveho modelu.
This commit is contained in:
		
							parent
							
								
									1b8d98af5b
								
							
						
					
					
						commit
						90dc3a04f5
					
				
					 4 changed files with 178 additions and 172 deletions
				
			
		|  | @ -13,7 +13,7 @@ from django.core.urlresolvers import reverse | ||||||
| 
 | 
 | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
| 
 | 
 | ||||||
| from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Novinky, Organizator, Prispevek, Pohadka, Konfera | from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Novinky, Organizator, Pohadka, Konfera, Uloha | ||||||
| from autocomplete_light import shortcuts as autocomplete_light | from autocomplete_light import shortcuts as autocomplete_light | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -124,9 +124,9 @@ class ProblemInline(admin.TabularInline): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ReseniKProblemuInline(admin.TabularInline): | class ReseniKProblemuInline(admin.TabularInline): | ||||||
|     form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitel'], fields=['resitel']) |     form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitele'], fields=['resitele']) | ||||||
|     model = Reseni |     model = Reseni | ||||||
|     fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] |     fields = ['resitele', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] | ||||||
|     readonly_fields = ['timestamp'] |     readonly_fields = ['timestamp'] | ||||||
|     extra = 0 |     extra = 0 | ||||||
|     formfield_overrides = { |     formfield_overrides = { | ||||||
|  | @ -136,7 +136,7 @@ class ReseniKProblemuInline(admin.TabularInline): | ||||||
| 
 | 
 | ||||||
|     def get_queryset(self, request): |     def get_queryset(self, request): | ||||||
|         qs = super(ReseniKProblemuInline, self).get_queryset(request) |         qs = super(ReseniKProblemuInline, self).get_queryset(request) | ||||||
|         return qs.select_related('problem', 'cislo_body', 'resitel') |         return qs.select_related('problem', 'cislo_body', 'resitele') | ||||||
| 
 | 
 | ||||||
|     # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) |     # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) | ||||||
|     def formfield_for_dbfield(self, db_field, **kwargs): |     def formfield_for_dbfield(self, db_field, **kwargs): | ||||||
|  | @ -323,13 +323,13 @@ admin.site.register(Rocnik, RocnikAdmin) | ||||||
| ### Reseni | ### Reseni | ||||||
| 
 | 
 | ||||||
| class ReseniAdmin(VersionAdmin): | class ReseniAdmin(VersionAdmin): | ||||||
|     form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitel'], fields=['problem', 'resitel']) |     #form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitele'], fields=['problem', 'resitele']) | ||||||
|     fieldsets = [ |     fieldsets = [ | ||||||
|         (None,              {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}), |         (None,              {'fields': ['problem', 'resitele', 'forma', 'body', 'cislo_body', 'timestamp']}), | ||||||
|         (u'Poznámky',       {'fields': ['poznamka']}), |         (u'Poznámky',       {'fields': ['poznamka']}), | ||||||
|         ] |         ] | ||||||
|     readonly_fields = ['timestamp'] |     readonly_fields = ['timestamp'] | ||||||
|     list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp', 'cislo_body'] |     list_display = ['problem', 'resitele', 'forma', 'body', 'timestamp', 'cislo_body'] | ||||||
|     list_filter = ['body', 'timestamp', 'forma'] |     list_filter = ['body', 'timestamp', 'forma'] | ||||||
|     search_fields = [] |     search_fields = [] | ||||||
|     inlines = [PrilohaReseniInline] |     inlines = [PrilohaReseniInline] | ||||||
|  | @ -337,7 +337,7 @@ class ReseniAdmin(VersionAdmin): | ||||||
| 
 | 
 | ||||||
|     def get_queryset(self, request): |     def get_queryset(self, request): | ||||||
|         qs = super(ReseniAdmin, self).get_queryset(request) |         qs = super(ReseniAdmin, self).get_queryset(request) | ||||||
|         return qs.select_related('resitel', 'problem', 'cislo_body') |         return qs.select_related('resitele', 'problem', 'cislo_body') | ||||||
| 
 | 
 | ||||||
| admin.site.register(Reseni, ReseniAdmin) | admin.site.register(Reseni, ReseniAdmin) | ||||||
| 
 | 
 | ||||||
|  | @ -350,7 +350,7 @@ class PohadkaAdminForm(forms.ModelForm): | ||||||
|         exclude = [] |         exclude = [] | ||||||
|     autor = UserModelChoiceField(User.objects.filter(is_staff=True)) |     autor = UserModelChoiceField(User.objects.filter(is_staff=True)) | ||||||
|     uloha = forms.ModelChoiceField( |     uloha = forms.ModelChoiceField( | ||||||
|         Problem.objects.filter(typ=Problem.TYP_ULOHA) |         Uloha.objects.all() | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, **kwargs): | ||||||
|  | @ -402,15 +402,15 @@ from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ProblemAdminForm(forms.ModelForm): | class ProblemAdminForm(forms.ModelForm): | ||||||
|     text_zadani = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_zadani')) |     #text_zadani = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_zadani')) | ||||||
|     text_reseni = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_reseni')) |     #text_reseni = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_reseni')) | ||||||
|     text_org = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_org')) |     #text_org = forms.CharField(widget=CKEditorUploadingWidget(), required=False, **field_labels(Problem, 'text_org')) | ||||||
|     zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete'), required=False) |     zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete'), required=False) | ||||||
|     autor = UserModelChoiceField(User.objects.filter(is_staff=True)) |     autor = UserModelChoiceField(User.objects.filter(is_staff=True)) | ||||||
|     opravovatel = UserModelChoiceField(User.objects.filter(is_staff=True), required=False) |     opravovatel = UserModelChoiceField(User.objects.filter(is_staff=True), required=False) | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = Problem |         model = Problem | ||||||
|         exclude = [] |         exclude = ['nadproblem'] | ||||||
| 
 | 
 | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, **kwargs): | ||||||
|         super(ProblemAdminForm, self).__init__(*args, **kwargs) |         super(ProblemAdminForm, self).__init__(*args, **kwargs) | ||||||
|  | @ -476,7 +476,8 @@ class ProblemNavrhAdmin(ProblemAdmin): | ||||||
|     get_form = get_form_predvypln_autora |     get_form = get_form_predvypln_autora | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name=u'Problém (návrh)', verbose_name_plural=u'Problémy (návrhy)') | #FIXME | ||||||
|  | #create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name=u'Problém (návrh)', verbose_name_plural=u'Problémy (návrhy)') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ProblemZadanyAdmin(ProblemAdmin): | class ProblemZadanyAdmin(ProblemAdmin): | ||||||
|  | @ -529,27 +530,28 @@ class ProblemZadanyAdmin(ProblemAdmin): | ||||||
| 
 | 
 | ||||||
|     get_form = get_form_predvypln_autora |     get_form = get_form_predvypln_autora | ||||||
| 
 | 
 | ||||||
| create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name=u'Problém (zadaný)', verbose_name_plural=u'Problémy (zadané)') | #FIXME | ||||||
|  | #create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name=u'Problém (zadaný)', verbose_name_plural=u'Problémy (zadané)') | ||||||
| 
 | 
 | ||||||
| #admin.site.register(Problem, ProblemAdmin) | #admin.site.register(Problem, ProblemAdmin) | ||||||
| 
 | 
 | ||||||
| ### Prispevek (k tematkum) | ### Prispevek (k tematkum) | ||||||
| 
 | 
 | ||||||
| class PrispevekAdminForm(forms.ModelForm): | #class PrispevekAdminForm(forms.ModelForm): | ||||||
|     text_org = forms.CharField(widget=CKEditorUploadingWidget(), required=False, | #    text_org = forms.CharField(widget=CKEditorUploadingWidget(), required=False, | ||||||
|             **field_labels(Prispevek, 'text_org')) | #            **field_labels(Prispevek, 'text_org')) | ||||||
|     text_resitel = forms.CharField(widget=CKEditorUploadingWidget(), required=False, | #    text_resitel = forms.CharField(widget=CKEditorUploadingWidget(), required=False, | ||||||
|             **field_labels(Prispevek, 'text_resitel')) | #            **field_labels(Prispevek, 'text_resitel')) | ||||||
| 
 | # | ||||||
|     class Meta: | #    class Meta: | ||||||
|         model = Prispevek | #        model = Prispevek | ||||||
|         exclude = [] | #        exclude = [] | ||||||
| 
 | # | ||||||
| class PrispevekAdmin(VersionAdmin): | #class PrispevekAdmin(VersionAdmin): | ||||||
|     form = PrispevekAdminForm | #    form = PrispevekAdminForm | ||||||
|     list_display = ['nazev', 'problem', 'reseni', 'zverejnit'] | #    list_display = ['nazev', 'problem', 'reseni', 'zverejnit'] | ||||||
| 
 | # | ||||||
| admin.site.register(Prispevek, PrispevekAdmin) | #admin.site.register(Prispevek, PrispevekAdmin) | ||||||
| 
 | 
 | ||||||
| ### Soustredeni | ### Soustredeni | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -117,7 +117,7 @@ class ProblemAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||||
|                 popisek = "CHYBA" |                 popisek = "CHYBA" | ||||||
|             return popisek |             return popisek | ||||||
|         else: |         else: | ||||||
|             return u"%s (%s, %s)" % (p.nazev, p.typ, p.stav) |             return u"%s (%s)" % (p.nazev, p.stav) | ||||||
| 
 | 
 | ||||||
|     attrs={ |     attrs={ | ||||||
|         # This will set the input placeholder attribute: |         # This will set the input placeholder attribute: | ||||||
|  | @ -133,6 +133,8 @@ class ProblemAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||||
|         'class': 'modern-style', |         'class': 'modern-style', | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| autocomplete_light.register(ProblemAutocomplete) | #FIXME Nefunguje, nevime proc | ||||||
|  | #autocomplete_light.register(ProblemAutocomplete) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,67 +45,6 @@ class SeminarModelBase(models.Model): | ||||||
| 	def verejne_url(self): | 	def verejne_url(self): | ||||||
| 		return None | 		return None | ||||||
| 
 | 
 | ||||||
| # |  | ||||||
| # Mělo by být částečně vytaženo z Aesopa |  | ||||||
| # viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| @reversion.register(ignore_duplicates=True) |  | ||||||
| @python_2_unicode_compatible |  | ||||||
| class Skola(SeminarModelBase): |  | ||||||
| 
 |  | ||||||
| 	class Meta: |  | ||||||
| 		db_table = 'seminar_skoly' |  | ||||||
| 		verbose_name = u'Škola' |  | ||||||
| 		verbose_name_plural = u'Školy' |  | ||||||
| 		ordering = ['mesto', 'nazev'] |  | ||||||
| 
 |  | ||||||
| 	# Interní ID |  | ||||||
| 	id = models.AutoField(primary_key = True) |  | ||||||
| 
 |  | ||||||
| 	# Aesopi ID "izo:..." nebo "aesop:..." |  | ||||||
| 	# NULL znamená v exportu do aesopa "ufo" |  | ||||||
| 	aesop_id = models.CharField(u'Aesop ID', max_length=32, blank=True, default='', |  | ||||||
| 		help_text=u'Aesopi ID typu "izo:..." nebo "aesop:..."') |  | ||||||
| 
 |  | ||||||
| 	# IZO školy (jen české školy) |  | ||||||
| 	izo = models.CharField(u'IZO', max_length=32, blank=True, |  | ||||||
| 		help_text=u'IZO školy (jen české školy)') |  | ||||||
| 
 |  | ||||||
| 	# Celý název školy |  | ||||||
| 	nazev = models.CharField(u'název', max_length=256, |  | ||||||
| 		help_text=u'Celý název školy') |  | ||||||
| 
 |  | ||||||
| 	# Zkraceny nazev pro zobrazení ve výsledkovce, volitelné. |  | ||||||
| 	# Není v Aesopovi, musíme vytvářet sami. |  | ||||||
| 	kratky_nazev = models.CharField(u'zkrácený název', max_length=256, blank=True, |  | ||||||
| 		help_text="Zkrácený název pro zobrazení ve výsledkovce") |  | ||||||
| 
 |  | ||||||
| 	# Ulice může být jen číslo |  | ||||||
| 	ulice = models.CharField(u'ulice', max_length=256) |  | ||||||
| 
 |  | ||||||
| 	mesto = models.CharField(u'město', max_length=256) |  | ||||||
| 
 |  | ||||||
| 	psc = models.CharField(u'PSČ', max_length=32) |  | ||||||
| 
 |  | ||||||
| 	# ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) |  | ||||||
| 	# Ekvivalentní s CharField(max_length=2, default='CZ', ...) |  | ||||||
| 	stat = CountryField(u'stát', default='CZ', |  | ||||||
| 		help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') |  | ||||||
| 
 |  | ||||||
| 	# Jaké vzdělání škpla poskytuje? |  | ||||||
| 	je_zs = models.BooleanField(u'základní stupeň', default=True) |  | ||||||
| 	je_ss = models.BooleanField(u'střední stupeň', default=True) |  | ||||||
| 
 |  | ||||||
| 	poznamka = models.TextField(u'neveřejná poznámka', blank=True, |  | ||||||
| 		help_text=u'Neveřejná poznámka ke škole (plain text)') |  | ||||||
| 	 |  | ||||||
| 	kontaktni_osoba = models.ForeignKey(Osoba, verbose_name=u'Kontaktní osoba',  |  | ||||||
| 			blank=True, null=True) |  | ||||||
| 
 |  | ||||||
| 	def __str__(self): |  | ||||||
| 		return force_unicode(u'%s, %s, %s' % (self.nazev, self.ulice, self.mesto)) |  | ||||||
| 
 |  | ||||||
| @reversion.register(ignore_duplicates=True) | @reversion.register(ignore_duplicates=True) | ||||||
| @python_2_unicode_compatible | @python_2_unicode_compatible | ||||||
| class Osoba(SeminarModelBase): | class Osoba(SeminarModelBase): | ||||||
|  | @ -185,6 +124,68 @@ class Osoba(SeminarModelBase): | ||||||
| 	def __str__(self): | 	def __str__(self): | ||||||
| 		return force_unicode("Osoba({})".format(self.plne_jmeno())) | 		return force_unicode("Osoba({})".format(self.plne_jmeno())) | ||||||
| 
 | 
 | ||||||
|  | # | ||||||
|  | # Mělo by být částečně vytaženo z Aesopa | ||||||
|  | # viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | @reversion.register(ignore_duplicates=True) | ||||||
|  | @python_2_unicode_compatible | ||||||
|  | class Skola(SeminarModelBase): | ||||||
|  | 
 | ||||||
|  | 	class Meta: | ||||||
|  | 		db_table = 'seminar_skoly' | ||||||
|  | 		verbose_name = u'Škola' | ||||||
|  | 		verbose_name_plural = u'Školy' | ||||||
|  | 		ordering = ['mesto', 'nazev'] | ||||||
|  | 
 | ||||||
|  | 	# Interní ID | ||||||
|  | 	id = models.AutoField(primary_key = True) | ||||||
|  | 
 | ||||||
|  | 	# Aesopi ID "izo:..." nebo "aesop:..." | ||||||
|  | 	# NULL znamená v exportu do aesopa "ufo" | ||||||
|  | 	aesop_id = models.CharField(u'Aesop ID', max_length=32, blank=True, default='', | ||||||
|  | 		help_text=u'Aesopi ID typu "izo:..." nebo "aesop:..."') | ||||||
|  | 
 | ||||||
|  | 	# IZO školy (jen české školy) | ||||||
|  | 	izo = models.CharField(u'IZO', max_length=32, blank=True, | ||||||
|  | 		help_text=u'IZO školy (jen české školy)') | ||||||
|  | 
 | ||||||
|  | 	# Celý název školy | ||||||
|  | 	nazev = models.CharField(u'název', max_length=256, | ||||||
|  | 		help_text=u'Celý název školy') | ||||||
|  | 
 | ||||||
|  | 	# Zkraceny nazev pro zobrazení ve výsledkovce, volitelné. | ||||||
|  | 	# Není v Aesopovi, musíme vytvářet sami. | ||||||
|  | 	kratky_nazev = models.CharField(u'zkrácený název', max_length=256, blank=True, | ||||||
|  | 		help_text="Zkrácený název pro zobrazení ve výsledkovce") | ||||||
|  | 
 | ||||||
|  | 	# Ulice může být jen číslo | ||||||
|  | 	ulice = models.CharField(u'ulice', max_length=256) | ||||||
|  | 
 | ||||||
|  | 	mesto = models.CharField(u'město', max_length=256) | ||||||
|  | 
 | ||||||
|  | 	psc = models.CharField(u'PSČ', max_length=32) | ||||||
|  | 
 | ||||||
|  | 	# ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) | ||||||
|  | 	# Ekvivalentní s CharField(max_length=2, default='CZ', ...) | ||||||
|  | 	stat = CountryField(u'stát', default='CZ', | ||||||
|  | 		help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') | ||||||
|  | 
 | ||||||
|  | 	# Jaké vzdělání škpla poskytuje? | ||||||
|  | 	je_zs = models.BooleanField(u'základní stupeň', default=True) | ||||||
|  | 	je_ss = models.BooleanField(u'střední stupeň', default=True) | ||||||
|  | 
 | ||||||
|  | 	poznamka = models.TextField(u'neveřejná poznámka', blank=True, | ||||||
|  | 		help_text=u'Neveřejná poznámka ke škole (plain text)') | ||||||
|  | 	 | ||||||
|  | 	kontaktni_osoba = models.ForeignKey(Osoba, verbose_name=u'Kontaktní osoba',  | ||||||
|  | 			blank=True, null=True) | ||||||
|  | 
 | ||||||
|  | 	def __str__(self): | ||||||
|  | 		return force_unicode(u'%s, %s, %s' % (self.nazev, self.ulice, self.mesto)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class Prijemce(SeminarModelBase): | class Prijemce(SeminarModelBase): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_prijemce' | 		db_table = 'seminar_prijemce' | ||||||
|  | @ -289,6 +290,8 @@ class Resitel(SeminarModelBase): | ||||||
| 			return 'Prof.' | 			return 'Prof.' | ||||||
| 		else: | 		else: | ||||||
| 			return 'Akad.' | 			return 'Akad.' | ||||||
|  | 	def __str__(): | ||||||
|  | 		return(force_unicode(u"Řešitel ({})".format(self.osoba.plne_jmeno()))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -448,6 +451,63 @@ class Cislo(SeminarModelBase): | ||||||
| 			return None | 			return None | ||||||
| 		return c | 		return c | ||||||
| 
 | 
 | ||||||
|  | @reversion.register(ignore_duplicates=True) | ||||||
|  | @python_2_unicode_compatible | ||||||
|  | class Organizator(SeminarModelBase): | ||||||
|  | # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu | ||||||
|  | 
 | ||||||
|  | 	osoba = models.ForeignKey(Osoba, verbose_name=u'osoba', related_name='org', | ||||||
|  | 		help_text=u'osobní údaje organizátora', null=False, blank=False) | ||||||
|  | 
 | ||||||
|  | 	vytvoreno = models.DateTimeField( | ||||||
|  | 		u'Vytvořeno', | ||||||
|  | 		default=timezone.now, | ||||||
|  | 		blank=True, | ||||||
|  | 		editable=False | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	organizuje_od = models.DateTimeField('Organizuje od', blank=False, null=False) | ||||||
|  | 	 | ||||||
|  | 	organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True) | ||||||
|  | 
 | ||||||
|  | 	studuje = models.CharField('Studium aj.', max_length = 256, | ||||||
|  | 			null = True, blank = True, | ||||||
|  | 			help_text=u"Např. 'Studuje Obecnou fyziku (Bc.), 3. ročník', " | ||||||
|  | 			u"'Vystudovala Diskrétní modely a algoritmy (Mgr.)' nebo " | ||||||
|  | 			u"'Přednáší na MFF'") | ||||||
|  | 
 | ||||||
|  | 	strucny_popis_organizatora = models.TextField(u'Stručný popis organizátora', | ||||||
|  | 			null = True, blank = True) | ||||||
|  | 
 | ||||||
|  | 	skola = models.CharField(u'Škola, kterou studuje', max_length = 256, null=True, blank=True, | ||||||
|  | 		help_text=u"Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuje" | ||||||
|  | 		u"školu, ale jen obor, možnost zobrazit zvlášť") | ||||||
|  | 
 | ||||||
|  | 	def __str__(self): | ||||||
|  | 		if self.osoba.prezdivka: | ||||||
|  | 			return u"%s '%s' %s".format(self.osoba.jmeno, | ||||||
|  | 				self.osoba.prezdivka, | ||||||
|  | 				self.osoba.prijmeni) | ||||||
|  | 		else: | ||||||
|  | 			return u"%s %s".format(self.osoba.jmeno, self.osoba.prijmeni) | ||||||
|  | 
 | ||||||
|  | 	class Meta: | ||||||
|  | 		verbose_name = 'Organizátor' | ||||||
|  | 		verbose_name_plural = 'Organizátoři' | ||||||
|  | 
 | ||||||
|  | class Text(SeminarModelBase): | ||||||
|  | 	class Meta: | ||||||
|  | 		db_table = 'seminar_texty' | ||||||
|  | 		verbose_name = u'text' | ||||||
|  | 		verbose_name_plural = u'texty' | ||||||
|  | 
 | ||||||
|  | 	na_web = models.TextField(u'text na web', blank=True, | ||||||
|  | 		help_text=u'Text ke zveřejnění na webu') | ||||||
|  | 
 | ||||||
|  | 	do_cisla = models.TextField(u'text do čísla', blank=True, | ||||||
|  | 		help_text=u'Text ke zveřejnění v čísle') | ||||||
|  | 	 | ||||||
|  | 	# obrázky mají návaznost opačným směrem (vazba z druhé strany) | ||||||
| 
 | 
 | ||||||
| @reversion.register(ignore_duplicates=True) | @reversion.register(ignore_duplicates=True) | ||||||
| @python_2_unicode_compatible | @python_2_unicode_compatible | ||||||
|  | @ -466,7 +526,7 @@ class Problem(SeminarModelBase): | ||||||
| 	nazev = models.CharField(u'název', max_length=256) | 	nazev = models.CharField(u'název', max_length=256) | ||||||
| 
 | 
 | ||||||
| 	# Problém má podproblémy | 	# Problém má podproblémy | ||||||
| 	nadproblem = models.ForeignKey(Problem, verbose_name=u'nadřazený problém', | 	nadproblem = models.ForeignKey('self', verbose_name=u'nadřazený problém', | ||||||
| 		related_name='nadproblem', null=True, blank=True) | 		related_name='nadproblem', null=True, blank=True) | ||||||
| 
 | 
 | ||||||
| 	STAV_NAVRH = 'navrh' | 	STAV_NAVRH = 'navrh' | ||||||
|  | @ -621,7 +681,7 @@ class Reseni(SeminarModelBase): | ||||||
| 	# Interní ID | 	# Interní ID | ||||||
| 	id = models.AutoField(primary_key = True) | 	id = models.AutoField(primary_key = True) | ||||||
| 
 | 
 | ||||||
| 	# Ke každé dvojici řešní a problém existuje nanejvýš jedno hodnocení, doplnění vazby. | 	# Ke každé dvojici řešení a problém existuje nanejvýš jedno hodnocení, doplnění vazby. | ||||||
| 	problem = models.ManyToManyField(Problem, verbose_name=u'problém', help_text=u'Problém', | 	problem = models.ManyToManyField(Problem, verbose_name=u'problém', help_text=u'Problém', | ||||||
| 		through='Hodnoceni') | 		through='Hodnoceni') | ||||||
| 
 | 
 | ||||||
|  | @ -670,7 +730,7 @@ class Hodnoceni(SeminarModelBase): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_hodnoceni' | 		db_table = 'seminar_hodnoceni' | ||||||
| 		verbose_name = u'Hodnocení' | 		verbose_name = u'Hodnocení' | ||||||
| 		verbose_name_plular = u'Hodnocení' | 		verbose_name_plural = u'Hodnocení' | ||||||
| 	 | 	 | ||||||
| 	# Interní ID | 	# Interní ID | ||||||
| 	id = models.AutoField(primary_key = True) | 	id = models.AutoField(primary_key = True) | ||||||
|  | @ -705,21 +765,17 @@ class Hodnoceni(SeminarModelBase): | ||||||
| # neprojdou pak migrace.  Takže rozlišení funkcí generujících názvy souboru | # neprojdou pak migrace.  Takže rozlišení funkcí generujících názvy souboru | ||||||
| # podle adresáře řešíme takto. | # podle adresáře řešíme takto. | ||||||
| 
 | 
 | ||||||
| ## | def generate_filename_konfera(self, filename): | ||||||
| ## FIXME: Budeme řešit později, pokud to bude potřeba. | 	return os.path.join( | ||||||
| #def generate_filename_konfera(self, filename): | 		settings.SEMINAR_KONFERY_DIR, | ||||||
| #	return os.path.join( | 		aux_generate_filename(self, filename) | ||||||
| #		settings.SEMINAR_KONFERY_DIR, | 	) | ||||||
| #		aux_generate_filename(self, filename) |  | ||||||
| #	) |  | ||||||
| 
 | 
 | ||||||
| ## | def generate_filename(self, filename): | ||||||
| ## FIXME: Budeme řešit později, pokud to bude potřeba. | 	return os.path.join( | ||||||
| #def generate_filename(self, filename): | 		settings.SEMINAR_RESENI_DIR, | ||||||
| #	return os.path.join( | 		aux_generate_filename(self, filename) | ||||||
| #		settings.SEMINAR_RESENI_DIR, | 	) | ||||||
| #		aux_generate_filename(self, filename) |  | ||||||
| #	) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @reversion.register(ignore_duplicates=True) | @reversion.register(ignore_duplicates=True) | ||||||
|  | @ -793,49 +849,6 @@ class Pohadka(SeminarModelBase): | ||||||
| 		return force_unicode(uryvek) | 		return force_unicode(uryvek) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @reversion.register(ignore_duplicates=True) |  | ||||||
| @python_2_unicode_compatible |  | ||||||
| class Organizator(SeminarModelBase): |  | ||||||
| # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu |  | ||||||
| 
 |  | ||||||
| 	osoba = models.ForeignKey(Osoba, verbose_name=u'osoba', related_name='org' |  | ||||||
| 		help_text=u'osobní údaje organizátora', null=False, blank=False) |  | ||||||
| 
 |  | ||||||
| 	vytvoreno = models.DateTimeField( |  | ||||||
| 		u'Vytvořeno', |  | ||||||
| 		default=timezone.now, |  | ||||||
| 		blank=True, |  | ||||||
| 		editable=False |  | ||||||
| 	) |  | ||||||
| 
 |  | ||||||
| 	organizuje_od = models.DateTimeField('Organizuje od', blank=False, null=False) |  | ||||||
| 	 |  | ||||||
| 	organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True) |  | ||||||
| 
 |  | ||||||
| 	studuje = models.CharField('Studium aj.', max_length = 256, |  | ||||||
| 			null = True, blank = True, |  | ||||||
| 			help_text=u"Např. 'Studuje Obecnou fyziku (Bc.), 3. ročník', " |  | ||||||
| 			"'Vystudovala Diskrétní modely a algoritmy (Mgr.)' nebo " |  | ||||||
| 			"'Přednáší na MFF'") |  | ||||||
| 
 |  | ||||||
| 	strucny_popis_organizatora = models.TextField(u'Stručný popis organizátora', |  | ||||||
| 			null = True, blank = True) |  | ||||||
| 
 |  | ||||||
| 	skola = models.CharField(u'Škola, kterou studuje', max_length = 256, null=True, blank=True, |  | ||||||
| 		help_text=u"Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuje" |  | ||||||
| 		"školu, ale jen obor, možnost zobrazit zvlášť") |  | ||||||
| 
 |  | ||||||
| 	def __str__(self): |  | ||||||
| 		if self.osoba.prezdivka: |  | ||||||
| 			return u"%s '%s' %s".format(self.osoba.jmeno, |  | ||||||
| 				self.osoba.prezdivka, |  | ||||||
| 				self.osoba.prijmeni) |  | ||||||
| 		else: |  | ||||||
| 			return u"%s %s".format(self.osoba.jmeno, self.osoba.prijmeni) |  | ||||||
| 
 |  | ||||||
| 	class Meta: |  | ||||||
| 		verbose_name = 'Organizátor' |  | ||||||
| 		verbose_name_plural = 'Organizátoři' |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @reversion.register(ignore_duplicates=True) | @reversion.register(ignore_duplicates=True) | ||||||
|  | @ -1042,8 +1055,9 @@ class Obrazek(SeminarModelBase): | ||||||
| 	na_web = models.ImageField(u'obrázek na web', upload_to='obrazky/%Y/%m/%d/', | 	na_web = models.ImageField(u'obrázek na web', upload_to='obrazky/%Y/%m/%d/', | ||||||
| 			null=True, blank=True) | 			null=True, blank=True) | ||||||
| 
 | 
 | ||||||
| 	text = models.ForeignKey(Text, verbose_name='text', help_text=u'text, ve kterém | 	text = models.ForeignKey(Text, verbose_name='text', | ||||||
| 		se obrázek vyskytuje', null=False, blank=False)  | 			help_text=u'text, ve kterém se obrázek vyskytuje',  | ||||||
|  | 			null=False, blank=False)  | ||||||
| 
 | 
 | ||||||
| 	do_cisla_barevny = models.FileField(u'barevný obrázek do čísla',  | 	do_cisla_barevny = models.FileField(u'barevný obrázek do čísla',  | ||||||
| 			help_text = u'Barevná verze obrázku do čísla',  | 			help_text = u'Barevná verze obrázku do čísla',  | ||||||
|  | @ -1053,19 +1067,6 @@ class Obrazek(SeminarModelBase): | ||||||
| 			help_text = u'Černobílá verze obrázku do čísla',  | 			help_text = u'Černobílá verze obrázku do čísla',  | ||||||
| 			upload_to = 'obrazky/%Y/%m/%d/', blank=True, null=True) | 			upload_to = 'obrazky/%Y/%m/%d/', blank=True, null=True) | ||||||
| 
 | 
 | ||||||
| class Text(SeminarModelBase): |  | ||||||
| 	class Meta: |  | ||||||
| 		db_table = 'seminar_texty' |  | ||||||
| 		verbose_name = u'text' |  | ||||||
| 		verbose_name_plular = u'texty' |  | ||||||
| 
 |  | ||||||
| 	na_web = models.TextField(u'text na web', blank=True, |  | ||||||
| 		help_text=u'Text ke zveřejnění na webu') |  | ||||||
| 
 |  | ||||||
| 	do_cisla = models.TextField(u'text do čísla', blank=True, |  | ||||||
| 		help_text=u'Text ke zveřejnění v čísle') |  | ||||||
| 	 |  | ||||||
| 	# obrázky mají návaznost opačným směrem (vazba z druhé strany) |  | ||||||
| class TreeNode(models.Model): | class TreeNode(models.Model): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		abstract = True | 		abstract = True | ||||||
|  | @ -1073,6 +1074,7 @@ class TreeNode(models.Model): | ||||||
| 		null = True, | 		null = True, | ||||||
| 		blank = False, | 		blank = False, | ||||||
| 		on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku  | 		on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku  | ||||||
|  | 		verbose_name="kořen stromu") | ||||||
| 	first_child = models.ForeignKey('self', | 	first_child = models.ForeignKey('self', | ||||||
| 		null = True, | 		null = True, | ||||||
| 		blank = True, | 		blank = True, | ||||||
|  |  | ||||||
|  | @ -11,8 +11,8 @@ from django.db.models import Q | ||||||
| from django.views.decorators.csrf import ensure_csrf_cookie | from django.views.decorators.csrf import ensure_csrf_cookie | ||||||
| from django.contrib.auth import authenticate, login | from django.contrib.auth import authenticate, login | ||||||
| 
 | 
 | ||||||
| from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Prispevek | from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka | ||||||
| from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from . import utils | from . import utils | ||||||
| from .unicodecsv import UnicodeWriter | from .unicodecsv import UnicodeWriter | ||||||
| from .forms import NameForm | from .forms import NameForm | ||||||
|  | @ -145,8 +145,8 @@ class StareNovinkyView(generic.ListView): | ||||||
| # Organizatori | # Organizatori | ||||||
| def aktivniOrganizatori(rok=date.today().year): | def aktivniOrganizatori(rok=date.today().year): | ||||||
|     return Organizator.objects.exclude( |     return Organizator.objects.exclude( | ||||||
|         organizuje_do_roku__isnull=False, |         organizuje_do__isnull=False, | ||||||
|         organizuje_do_roku__lt=rok |         organizuje_do__lt=rok | ||||||
|     ).order_by('user__first_name') |     ).order_by('user__first_name') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue