From 741040fc9cf11b417751f130054d48129ee59132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Koci=C3=A1n?= Date: Thu, 8 Oct 2015 14:04:29 +0200 Subject: [PATCH 01/34] =?UTF-8?q?Fix:=20funguje=20vytvo=C5=99en=C3=AD=20or?= =?UTF-8?q?ga=20i=20s=20fotkou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/seminar/models.py b/seminar/models.py index cc06cf36..ae59659d 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -795,10 +795,17 @@ class Organizator(models.Model): verbose_name_plural = 'Organizátoři' def save(self): + # v databázi uložený záznam o organizátorovi + puvodni = None + + # pokud už organizátor v databázi existuje, nastav puvodni if self.id is not None: puvodni = Organizator.objects.get(id=self.id) + # pokud nahráváme fotku if self.foto: + # a je jiná než ta stará if not puvodni or puvodni.foto != self.foto: + # uložíme ji original = Image.open(self.foto) jmeno = os.path.basename(self.foto.file.name) Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) From 275630daee7dea2b4b5505241f480327b23205db Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 11 Oct 2015 17:31:30 +0200 Subject: [PATCH 02/34] Galerie | clone + uprava modelu galerie pecemesrdcem Model upraven pro potreby M&M-miho webu --- galerie/TODO | 7 ++ galerie/__init__.py | 0 galerie/models.py | 114 +++++++++++++++++++++ galerie/static/galerie/prvky/dalsi.png | Bin 0 -> 1180 bytes galerie/static/galerie/prvky/predchozi.png | Bin 0 -> 1256 bytes 5 files changed, 121 insertions(+) create mode 100644 galerie/TODO create mode 100644 galerie/__init__.py create mode 100644 galerie/models.py create mode 100644 galerie/static/galerie/prvky/dalsi.png create mode 100644 galerie/static/galerie/prvky/predchozi.png diff --git a/galerie/TODO b/galerie/TODO new file mode 100644 index 00000000..26918708 --- /dev/null +++ b/galerie/TODO @@ -0,0 +1,7 @@ +======== +| TODO | +|======| + +* zvolit velikosti velke a male fotky +* vycteni EXIFu +* razeni podle casu diff --git a/galerie/__init__.py b/galerie/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/galerie/models.py b/galerie/models.py new file mode 100644 index 00000000..b368415a --- /dev/null +++ b/galerie/models.py @@ -0,0 +1,114 @@ +# coding: utf-8 + +from django.db import models +import seminar.models +from django.db.models import Q +from django.utils import timezone + +from PIL import Image +import os +from cStringIO import StringIO +from django.core.files.base import ContentFile + +from seminar.models import Soustredeni + +VZDY=0 +ORG=1 +NIKDY=2 +VIDITELNOST = ( + (VZDY, 'Vždy'), + (ORG, 'Organizátorům'), + (NIKDY, 'Nikdy'), +) + +class Obrazek(models.Model): + # TODO vkladat do slozek podle soustredeni + obrazek_velky = models.ImageField(upload_to='Galerie/%Y/%m/%d', + help_text = "Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.") + obrazek_stredni = models.ImageField(upload_to='Galerie/%Y/%m/%d/stredni', null = True, editable = False) + obrazek_maly = models.ImageField(upload_to='Galerie/%Y/%m/%d/male', null = True, editable = False) + nazev = models.CharField('Název', max_length=50, blank = True, null = True) + popis = models.TextField('Popis', blank = True, null = True) + datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add = True) + datum = models.DateTimeField('Datum pořízení fotografie', blank = False) # TODO zjistit z EXIFU + galerie = models.ForeignKey('Galerie') + poradi = models.IntegerField('Pořadí', blank = True, null = True) + def __unicode__(self): + return self.nazev + " -- " + unicode(self.obrazek_velky.name) + " (" + str(self.datum) + ")" + class Meta: + verbose_name = 'Obrázek' + verbose_name_plural = 'Obrázky' + def save(self): + original = Image.open(self.obrazek_velky) + jmeno = os.path.basename(self.obrazek_velky.file.name) + Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) + Obrazek._vyrobMiniaturu(original, jmeno, 200, self.obrazek_maly) + super(Obrazek, self).save() + + @staticmethod + def _vyrobMiniaturu(original, jmeno, maximum, field): + zmensenina = Obrazek._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 = Obrazek._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)) + + +class Galerie(models.Model): + nazev = models.CharField('Název', max_length=100) + datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) + datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) + popis = models.TextField('Popis', blank = True, null = True) + titulni_obrazek = models.ForeignKey(Obrazek, blank = False, null = True, related_name = "+", on_delete = models.SET_NULL) + zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) + galerie_up = models.ForeignKey('Galerie', blank = True, null = True) + soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True) + + def __unicode__(self): + return self.nazev + class Meta: + verbose_name = 'Galerie' + verbose_name_plural = 'Galerie' + + #def link_na_preview(self): + #"""Odkaz na galerii, používá se v admin rozhranní. """ + #return 'Preview' % self.id + #link_na_preview.allow_tags = True + #link_na_preview.short_description = 'Zobrazit galerii' +# + #def je_publikovano(self): + #"""Vraci True, pokud je tato galerie publikovana. """ + #if self.zobrazit == VZDY: + #return True + #if self.zobrazit == PODLE_CLANKU: + #for clanek in self.clanek_set.all(): + #if clanek.je_publikovano(): + #return True + #return False +# + #@staticmethod + #def publikovane_galerie(): + #"""Vraci galerie, ktere uz maji byt publikovane.""" + #clanky = Blog.models.Clanek.publikovane_clanky() + #return Galerie.objects.filter(Q(zobrazit=VZDY) | (Q(clanek__in=clanky) & Q(zobrazit=PODLE_CLANKU))).distinct() diff --git a/galerie/static/galerie/prvky/dalsi.png b/galerie/static/galerie/prvky/dalsi.png new file mode 100644 index 0000000000000000000000000000000000000000..37064569ebd92225468203c597325ed203f259ca GIT binary patch literal 1180 zcmV;N1Y`S&P)fDwzX}5Z?k=m|Z*CyY*dCm9MChZF!o;+*XEFJ*p zy^SD%>i}-TozfWraChbg)M`6;ig?oiVy@SQGY6o*8X_wuFD6S27mma+eDa)22H?TO zIL49*=xg~{(dgDj`+1GS*2VjGhEJZug(Gp}VbyB$mcGE9O2o~^>oPSrmI8iV`hn@p zoD0|}-o0l}aA)ix5;N~yz^zU=7(&~wD1Is{c$`cKn?%b1gR&n(JqO{F7-qjLVD#m4 zArUR@z?N_X-MjZ9x0c8B!WIwDyDYxSU$5y=2I>p`a?GRnm^>p>?Xl6|Fb z^k6-B<%pxN`28x3G=cT@U^$|3#&Q{_xJx4Gk4i=lZgmVq9+SwZ7mS3q!_R!sws0u( zoJ7(D8a=pGJf4$Cp1?+Wkmn?l|FGU@5AvEsX2+t9_8^Z*Bu`+oJ;+-UZAoCWJ;+lM zZMnE890;Mi$sXh-iMAvV0Ct$rgB7QJ^PiySa)|dH!ui9;#Z91@Jy<$gK8LAH3iqEs zCA*->w(A2!a=?=J^>{quAHu4xA@yw$lGls1^>x$US7ts8cJ^SX=OE&}gW>`%s|w!E ze>4>@;FB@X(T&STY5x-2atJSH70iCgI3CY7z$IlBt0sH~{EOFa51uW6rTu3b-m(Aa zRL-pa;{neeKok1U&wO0q*#g*X|M{5@hdO$=z#|82w*Pp;BL`eo6}(F~)_*+W(F0}` zd|1o~gGUb7NdNJSM+#{4AM;AW;E@6v{g+=~69$hKFsop8aX~0NQoto;6)T!56doC1 zz5VAjJTky~KL5!QLw|eBQFwHK#r`XxP!(^WqZ?O_pLX28IgkL>>OUvrkpR}}Kd0l7 z09NZi5%6dLH|Rf6@JIm5`%ff1%K^*#Pc%Hs0ZaRjNs@4QmIMA$70i52!{Y(^+PZ|p zvlOsUC?J`dfvRihYT1LU@w39=Sqhl`{ta*EKVq9dfJ;Lsgv0|Zyf&sY+KOvuF5>&j zG7iV~L)5YK;-b!ID>|dC5P97D2bu-=U}D_WD4Tjry!dmgUyLOaE@BzpSTbQe9I3XS udmH4P)DcBl@J0|l|U##iYSUuL>s56s6B}tnv$rbp}vegHjC7aW8&+~ zoHH}{TTjl69-Z^enMpD(8YFs+05A)D*66tZVdjA^*5}B&>K*YMFAju-U6#F~05NZa z17?A+&*SBT$tga0=RHB!W$j#Fyv_H&Eum_~Ffi+>ci`!(ECPJ=>RVmBs!W6RU>Tv7gDbN8{S=Ws0GLVShKzq`SgKYnW}q9Xz0X@zf= zf96>}$N0!aLNA{&?OcunjHeZDEd9X7&Ncy`pUKfEE?3>{uI@MrFrHTU`j?+r+uER9 zhUmEvCjxz@p3^aa6};6{lA@;Jal07{U1YEe*gVyEs#XM`Skf3hGfcqeH}%}M2RsfB zV89>XWM9AO=eIRrJv@|1!f{g*|;Q_+>4{Qq92oJ>dAJ`DE86Jr1Kd>2K zD|jON4{QV&Pb=KKvp_tp)Wrj_{RcJytl-^CCCC>G4UZMse_#W^cJM%K|AEB;+rU3#P=Ua1gyr(6;xegdE9QsN5uCZ zNCGqx59IY9NC1qd6>k1&93IH)KM)M~0xxA89?0uIfJT2{X=rY(++jI!pSzn0RGl}B z>d5Rr5CpiiewVKnZlRSlv{K2?v1Rrj2wuYFa@mw|GiuJ1aa)NHz^UjMpH5%pQg9T% zx5v=2{oWpy9<1_s?}?$~wi;nG@coH5`1s9txjb@#-X5P}f0D2XQCph2c^FcGzw8x4@w6FV-RKaptKIGjowa_)q|FpftBc; zi86Z7Qh=ZjQAQ714iF9zFNfND?DI+JLCbVtZDPU0f0VzMO0?98s)Qc2EFg4-Sn0vD zCtou2(q6>UfY3f-r3WKJL9;InumK>nhgj*s=584J0jv}t6lVsKW zvB!z*L0bVrYltFy&~|`ui0E=1JoaU35JmQ&EdilsCe|Q|>_OWCLSsZ_XPce3wOKxukI-u662N@-GsvAs0b+HR@cJBCAjZK*r@J|tc_6kvNA_P8z^i9r SFuunC0000 Date: Sun, 11 Oct 2015 17:33:05 +0200 Subject: [PATCH 03/34] Galerie | pridani mezi aplikace webu --- galerie/TODO | 1 + mamweb/settings_common.py | 1 + requirements.txt | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/galerie/TODO b/galerie/TODO index 26918708..0d3f5494 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -5,3 +5,4 @@ * zvolit velikosti velke a male fotky * vycteni EXIFu * razeni podle casu +* uprava templatu diff --git a/mamweb/settings_common.py b/mamweb/settings_common.py index 71f16b9f..5833d80b 100644 --- a/mamweb/settings_common.py +++ b/mamweb/settings_common.py @@ -113,6 +113,7 @@ INSTALLED_APPS = ( # MaMweb 'mamweb', 'seminar', + 'galerie', # Admin upravy: diff --git a/requirements.txt b/requirements.txt index b75f4810..ea1261ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ traitlets==4.0.0 # Django and modules -Django==1.7.10 # Updatable to 1.8 (possibly incompatible) +Django==1.7.10 # Updatable to 1.9 (possibly incompatible) django-bootstrap-sass==0.0.6a0 django-mptt==0.7.3 django-reversion==1.9.3 From ef132147184f2a903e180c295afbf56c0002af70 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 11 Oct 2015 18:01:38 +0200 Subject: [PATCH 04/34] Galerie | clone + uprava urls --- galerie/urls.py | 9 +++++++++ seminar/urls.py | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 galerie/urls.py diff --git a/galerie/urls.py b/galerie/urls.py new file mode 100644 index 00000000..66991dd4 --- /dev/null +++ b/galerie/urls.py @@ -0,0 +1,9 @@ +# coding: utf-8 + +from django.conf.urls import patterns, include, url + +urlpatterns = patterns('', + (r'^(?P\d+)/$', 'galerie.views.nahled'), + (r'^(?P\d+)/(?P\d+)/$', 'galerie.views.detail'), +) + diff --git a/seminar/urls.py b/seminar/urls.py index be4947c6..116646f3 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -1,3 +1,4 @@ +from django.conf.urls import * # NOQA from django.conf.urls import patterns, url from . import views, export @@ -15,7 +16,8 @@ urlpatterns = patterns('', url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(), name = 'seminar_seznam_soustredeni'), - url(r'^soustredeni/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), + url(r'^soustredeni/probehlo/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), + url(r'^soustredeni/probehlo/(?P\d+)/fotogalerie/', include('galerie.urls')), url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'), From cadc71b1a4c5c9d26e71544942d22b309b2bad20 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 11 Oct 2015 22:13:12 +0200 Subject: [PATCH 05/34] galerie | clone + uprava admina Admin se v konecne fazi na toto pouzivat nebude, proto je jen docasny a je velmi ale velmi nepohodlny na tu spoustu a spoustu fotek. --- galerie/admin.py | 18 ++++++++++++++++++ galerie/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 galerie/admin.py diff --git a/galerie/admin.py b/galerie/admin.py new file mode 100644 index 00000000..fc58f14c --- /dev/null +++ b/galerie/admin.py @@ -0,0 +1,18 @@ +from galerie.models import Obrazek, Galerie +from django.contrib import admin +from django.http import HttpResponseRedirect + +class GalerieInline(admin.TabularInline): + model = Obrazek + +class ObrazekAdmin(admin.ModelAdmin): + list_display = ('obrazek_velky', 'nazev', 'popis') + +class GalerieAdmin(admin.ModelAdmin): + model = Galerie + fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni') + list_display = ('nazev', 'datum_zmeny') + inlines = [GalerieInline] + +admin.site.register(Obrazek, ObrazekAdmin) +admin.site.register(Galerie, GalerieAdmin) diff --git a/galerie/models.py b/galerie/models.py index b368415a..e13d50b3 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -80,7 +80,7 @@ class Galerie(models.Model): datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) popis = models.TextField('Popis', blank = True, null = True) - titulni_obrazek = models.ForeignKey(Obrazek, blank = False, null = True, related_name = "+", on_delete = models.SET_NULL) + titulni_obrazek = models.ForeignKey(Obrazek, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL) zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) galerie_up = models.ForeignKey('Galerie', blank = True, null = True) soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True) From e62590ee532f59049d43c94db9900cb3debb9854 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 11 Oct 2015 22:33:45 +0200 Subject: [PATCH 06/34] galerie | upraven seznam soustredeni, aby mel odkaz na galerie V seznamu soustredeni je verejny! odkaz na galerie --- .../seminar/soustredeni/seznam_soustredeni.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index bd10f8fe..75a2249f 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -17,8 +17,6 @@ Na galeriích ze soustředění a dalších informacích ještě pracujeme.

-{#% if user.is_authenticated %#}{# PRACUJE SE STRANKA #} - {# Projdi vsechna soustredeni #} {% for soustredeni in object_list %} @@ -40,7 +38,18 @@
  • {{soustredeni.datum_zacatku}} – {{soustredeni.datum_konce}}
  • + {# Zobrazeni odkazu na galerie #} + {% if soustredeni.galerie_set.all %} + {% for galerie in soustredeni.galerie_set.all %} +
  • + FOTOGALERIE: {{galerie}} + {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #} +
  • + {% endfor %} + {% endif %} + + {% if user.is_authenticated %} {# popis soustredeni #} {% if soustredeni.text %} @@ -61,7 +70,5 @@ Žádná soustředění zatím neproběhla! {% endfor %} -{#% else %}{% include 'seminar/pracuje_se.html' %}{% endif %#} - {% endblock %} From ae93b7074dee03e85cae4278166e0302b6ceb3dc Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Sun, 11 Oct 2015 22:59:26 +0200 Subject: [PATCH 07/34] galerie | seznam soustredeni | zobrazovani odkazu Odkaz se zobrazuje jen pokud je galerie viditelna vzdy nebo pokud je uzivatel prihlaseny a ma prava do admina --- galerie/admin.py | 2 +- .../seminar/soustredeni/seznam_soustredeni.html | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/galerie/admin.py b/galerie/admin.py index fc58f14c..25bb7bc9 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -11,7 +11,7 @@ class ObrazekAdmin(admin.ModelAdmin): class GalerieAdmin(admin.ModelAdmin): model = Galerie fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni') - list_display = ('nazev', 'datum_zmeny') + list_display = ('nazev', 'datum_zmeny', 'zobrazit') inlines = [GalerieInline] admin.site.register(Obrazek, ObrazekAdmin) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index 75a2249f..b850ccc2 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -40,12 +40,14 @@ {# Zobrazeni odkazu na galerie #} {% if soustredeni.galerie_set.all %} - {% for galerie in soustredeni.galerie_set.all %} -
  • - FOTOGALERIE: {{galerie}} - {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #} -
  • - {% endfor %} + {% for galerie in soustredeni.galerie_set.all %} + {% if galerie.zobrazit == 0 or user.is_staff %} +
  • + FOTOGALERIE: {{galerie}} + {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #} +
  • + {% endif %} + {% endfor %} {% endif %} From 626e4f21a5522dd9409ecd44c3a87c7e49d189df Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 11:43:44 +0200 Subject: [PATCH 08/34] galerie | clone view, template + uprava pro M&M --- galerie/TODO | 5 +- galerie/models.py | 2 +- galerie/static/galerie/.gitignore | 2 + galerie/templates/galerie/GalerieNahled.html | 72 ++++++++++++++ galerie/views.py | 98 ++++++++++++++++++++ 5 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 galerie/static/galerie/.gitignore create mode 100644 galerie/templates/galerie/GalerieNahled.html create mode 100644 galerie/views.py diff --git a/galerie/TODO b/galerie/TODO index 0d3f5494..8a8b232f 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -5,4 +5,7 @@ * zvolit velikosti velke a male fotky * vycteni EXIFu * razeni podle casu -* uprava templatu +* uprava templatu (detail) +* hromadne nahravani fotek +* psani komentaru +* do CSS diff --git a/galerie/models.py b/galerie/models.py index e13d50b3..42dbaa50 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -30,7 +30,7 @@ class Obrazek(models.Model): nazev = models.CharField('Název', max_length=50, blank = True, null = True) popis = models.TextField('Popis', blank = True, null = True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add = True) - datum = models.DateTimeField('Datum pořízení fotografie', blank = False) # TODO zjistit z EXIFU + datum = models.DateTimeField('Datum pořízení fotografie', blank = True, null = True) # TODO zjistit z EXIFU galerie = models.ForeignKey('Galerie') poradi = models.IntegerField('Pořadí', blank = True, null = True) def __unicode__(self): diff --git a/galerie/static/galerie/.gitignore b/galerie/static/galerie/.gitignore new file mode 100644 index 00000000..386e17f3 --- /dev/null +++ b/galerie/static/galerie/.gitignore @@ -0,0 +1,2 @@ +images +lightbox diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html new file mode 100644 index 00000000..8a719c44 --- /dev/null +++ b/galerie/templates/galerie/GalerieNahled.html @@ -0,0 +1,72 @@ +{% extends "base.html" %} + +{% block title %}{% block nadpis1a %} +{{galerie.nazev}} | Galerie TODO title +{% endblock %}{% endblock %} + +{# TODO predelat pres context processor #} +{% block header %}soustredeni{% endblock %} +{% block menu_soustredeni %}selected{% endblock %} +{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %} + +{% block content %} +

    {{galerie.nazev}}

    + + {# podgalerie #} + {% if galerie.galerie_set.all or galerie.galerie_up %} +

    PODGALERIE

    +
      + {% if galerie.galerie_up %} +
    • .. + {% endif %} + {% for galerie in galerie.galerie_set.all %} + {% if galerie.zobrazit < 1 or user.is_staff %} +
    • {{galerie}} + {% endif %} + {% endfor %} +
    + {% endif %} + + {# obrazky v galerii #} + {% if galerie.obrazek_set.all %} + + {% for obrazek in galerie.obrazek_set.all %} + {% if forloop.counter|add:-1|divisibleby:3 %} + + {% endif %} + + {% if forloop.last %} + {% if not forloop.counter|divisibleby:3 %} + + {% endif %} + {% if not forloop.counter|divisibleby:2 %} + + {% endif %} + {% endif %} + {% if forloop.counter|divisibleby:3 or forloop.last %} + + {% endif %} + {% endfor %} +
    + + + + +
    + {% else %} +
    + V galerii nejsou žádné fotky. +
    + {% endif %} +{% endblock content %} diff --git a/galerie/views.py b/galerie/views.py new file mode 100644 index 00000000..6ee5792f --- /dev/null +++ b/galerie/views.py @@ -0,0 +1,98 @@ +# coding: utf-8 + +import random + +from django.http import HttpResponse, Http404 +from django.shortcuts import render, HttpResponseRedirect, get_object_or_404 +from django.template import RequestContext +from galerie.models import Obrazek, Galerie +from seminar.models import Soustredeni + + +#def index(request, stitek=None): + #if stitek == None: + #return HttpResponseRedirect('./0/') +# + #galerie = Galerie.publikovane_galerie() + #if int(stitek) != 0: + #galerie = galerie.filter(stitek = stitek) + #if not galerie: + #raise Http404 + #galerie = galerie.order_by("-datum_zmeny") +# + #return render(request, 'Galerie/GalerieIndex.html', + #{'galerie' : galerie, + #'stitky' : Stitek.stitky_u_galerii(), + #'umisteni_stitek' : stitek, + #'umisteni_Fotogalerie' : True, + #}) + +def nahled(request, pk, soustredeni): + """Zobrazeni nahledu vsech fotek ve skupine.""" + galerie = get_object_or_404(Galerie, pk=pk) + preview = False + if galerie.zobrazit >= 1: + if request.user.is_staff: + preview = True; + else: + raise Http404 + return render(request, 'galerie/GalerieNahled.html', + {'galerie' : galerie, + 'preview' : preview, + }) + +def detail(request, pk, fotka): + """Zobrazeni nahledu fotky s id 'fotka'.""" + MAX_VYSKA = 600 + MAX_SIRKA = 600 + MAX_VYSKA_MALA = 100 + MAX_SIRKA_MALA = 200 + NAHLEDU = 3 + + galerie = get_object_or_404(Galerie, pk=pk) + preview = False + if not galerie.je_publikovano(): + if request.user.is_authenticated(): + preview = True; + else: + raise Http404 + obrazek = get_object_or_404(Obrazek, pk=fotka) + obrazky = galerie.obrazky.all() + + # Poradi aktualniho obrazku v galerii/stitku. + for i in range(len(obrazky)): + if obrazky[i] == obrazek: + znacka = i + break + else: + # Obrazek neni v galerii/stitku. + raise Http404 + + # Nacteni okolnich obrazku. + obrazky_dalsi = obrazky[znacka+1:znacka+NAHLEDU+1] + if znacka > NAHLEDU: + obrazky_predchozi = obrazky[znacka-NAHLEDU:znacka] + else: + obrazky_predchozi = obrazky[0:znacka] + + # Preskalovani obrazku do vybraneho prostoru. + vyska = obrazek.obrazek_stredni.height + sirka = obrazek.obrazek_stredni.width + if vyska > MAX_VYSKA: + sirka = sirka * MAX_VYSKA / vyska + vyska = MAX_VYSKA + if sirka > MAX_SIRKA: + vyska = vyska * MAX_SIRKA / sirka + sirka = MAX_SIRKA + + return render(request, 'Galerie/Galerie.html', + {'galerie' : galerie, + 'obrazek' : obrazek, + 'vyska' : vyska, + 'sirka' : sirka, + 'obrazky_predchozi' : obrazky_predchozi, + 'obrazky_dalsi' : obrazky_dalsi, + 'preview' : preview, + 'umisteni_Fotogalerie' : True, + }) + From 44903958dc8d1d772e3467b81b1cb56374277160 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 15:14:17 +0200 Subject: [PATCH 09/34] galerie | clone detail fotky + uprava pro M&M --- galerie/templates/galerie/Galerie.html | 47 ++++++++++++++++++++++++++ galerie/views.py | 33 +++++++++--------- 2 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 galerie/templates/galerie/Galerie.html diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html new file mode 100644 index 00000000..6b2d1c46 --- /dev/null +++ b/galerie/templates/galerie/Galerie.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} + +{% block title %}{% block nadpis1a %} +{{galerie.nazev}} | Galerie +{% endblock %}{% endblock %} + +{% block content %} +

    {{galerie.nazev}}

    +
    + {% for obrazek in obrazky_predchozi %} + + {% endfor %} +
    + + + {# TODO šipky na přecházeni dodelat ve stylech #} +
    + {% if obrazky_predchozi %} + {% with obrazky_predchozi|last as predchozi_obrazek %} +
    + +
    + {% endwith %} + {% endif%} + {{obrazek.popis}} + {% if obrazky_dalsi %} + {% with obrazky_dalsi|first as dalsi_obrazek %} +
    + +
    + {% endwith %} + {% endif%} +
    +
    + {{obrazek.popis}} +
    + +
    + {% for obrazek in obrazky_dalsi %} + + {% endfor %} +
    +{% endblock %} diff --git a/galerie/views.py b/galerie/views.py index 6ee5792f..799311c4 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -27,37 +27,37 @@ from seminar.models import Soustredeni #'umisteni_Fotogalerie' : True, #}) +def zobrazit(galerie, request): + preview = False + if galerie.zobrazit >= 1: + if request.user.is_staff: + preview = True; + else: + raise Http404 + return preview + + def nahled(request, pk, soustredeni): """Zobrazeni nahledu vsech fotek ve skupine.""" galerie = get_object_or_404(Galerie, pk=pk) - preview = False - if galerie.zobrazit >= 1: - if request.user.is_staff: - preview = True; - else: - raise Http404 + preview = zobrazit(galerie, request) return render(request, 'galerie/GalerieNahled.html', {'galerie' : galerie, 'preview' : preview, }) -def detail(request, pk, fotka): +def detail(request, pk, fotka, soustredeni): """Zobrazeni nahledu fotky s id 'fotka'.""" MAX_VYSKA = 600 MAX_SIRKA = 600 MAX_VYSKA_MALA = 100 MAX_SIRKA_MALA = 200 - NAHLEDU = 3 + NAHLEDU = 1 galerie = get_object_or_404(Galerie, pk=pk) - preview = False - if not galerie.je_publikovano(): - if request.user.is_authenticated(): - preview = True; - else: - raise Http404 + preview = zobrazit(galerie, request) obrazek = get_object_or_404(Obrazek, pk=fotka) - obrazky = galerie.obrazky.all() + obrazky = galerie.obrazek_set.all() # Poradi aktualniho obrazku v galerii/stitku. for i in range(len(obrazky)): @@ -85,7 +85,7 @@ def detail(request, pk, fotka): vyska = vyska * MAX_SIRKA / sirka sirka = MAX_SIRKA - return render(request, 'Galerie/Galerie.html', + return render(request, 'galerie/Galerie.html', {'galerie' : galerie, 'obrazek' : obrazek, 'vyska' : vyska, @@ -93,6 +93,5 @@ def detail(request, pk, fotka): 'obrazky_predchozi' : obrazky_predchozi, 'obrazky_dalsi' : obrazky_dalsi, 'preview' : preview, - 'umisteni_Fotogalerie' : True, }) From 51a4e9016252b0f223be21ef338df16f9aaa01d5 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 19:05:12 +0200 Subject: [PATCH 10/34] galerie | Pripisovani komentaru Pokud je galerie neverejna, pak organizatori mohou pripisovat komentare --- galerie/TODO | 1 + galerie/forms.py | 6 ++++++ galerie/templates/galerie/Galerie.html | 12 +++++++++++- galerie/views.py | 12 ++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 galerie/forms.py diff --git a/galerie/TODO b/galerie/TODO index 8a8b232f..685fe836 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -9,3 +9,4 @@ * hromadne nahravani fotek * psani komentaru * do CSS +* znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt diff --git a/galerie/forms.py b/galerie/forms.py new file mode 100644 index 00000000..5075fa73 --- /dev/null +++ b/galerie/forms.py @@ -0,0 +1,6 @@ +#coding: utf-8 + +from django import forms + +class KomentarForm(forms.Form): + komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index 6b2d1c46..fb7d7232 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -35,8 +35,18 @@ {% endwith %} {% endif%} + + {# Popisek fotky #}
    - {{obrazek.popis}} + {% if preview %} +
    + {% csrf_token %} + {{form}} + +
    + {% else %} + {{obrazek.popis}} + {% endif %}
    diff --git a/galerie/views.py b/galerie/views.py index 799311c4..2be5f9b3 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -8,6 +8,8 @@ from django.template import RequestContext from galerie.models import Obrazek, Galerie from seminar.models import Soustredeni +from galerie.forms import KomentarForm + #def index(request, stitek=None): #if stitek == None: @@ -59,6 +61,15 @@ def detail(request, pk, fotka, soustredeni): obrazek = get_object_or_404(Obrazek, pk=fotka) obrazky = galerie.obrazek_set.all() + # vytvoreni a obslouzeni formulare + if request.method == 'POST': + form = KomentarForm(request.POST) + if form.is_valid(): + obrazek.popis = form.cleaned_data['komentar'] + obrazek.save() + else: + form = KomentarForm({'komentar': obrazek.popis}) + # Poradi aktualniho obrazku v galerii/stitku. for i in range(len(obrazky)): if obrazky[i] == obrazek: @@ -93,5 +104,6 @@ def detail(request, pk, fotka, soustredeni): 'obrazky_predchozi' : obrazky_predchozi, 'obrazky_dalsi' : obrazky_dalsi, 'preview' : preview, + 'form' : form, }) From 9180dc32caeaf999d27649144b71f4d778a673ad Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 19:59:31 +0200 Subject: [PATCH 11/34] galerie | detail fotky | pridano menu --- galerie/templates/galerie/Galerie.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index fb7d7232..dd7efaf7 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -4,6 +4,11 @@ {{galerie.nazev}} | Galerie {% endblock %}{% endblock %} +{# TODO predelat pres context processor #} +{% block header %}soustredeni{% endblock %} +{% block menu_soustredeni %}selected{% endblock %} +{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %} + {% block content %}

    {{galerie.nazev}}

    From 5e9c6bfe58fab91a9699345845ca4f0b61800bd4 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 21:13:39 +0200 Subject: [PATCH 12/34] galerie | navrh formulare pro vytvareni nove galerie --- galerie/TODO | 2 -- galerie/forms.py | 5 +++++ galerie/templates/galerie/GalerieNew.html | 18 ++++++++++++++++++ galerie/urls.py | 1 + galerie/views.py | 10 +++++++++- 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 galerie/templates/galerie/GalerieNew.html diff --git a/galerie/TODO b/galerie/TODO index 685fe836..66d2ad9c 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -5,8 +5,6 @@ * zvolit velikosti velke a male fotky * vycteni EXIFu * razeni podle casu -* uprava templatu (detail) * hromadne nahravani fotek -* psani komentaru * do CSS * znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt diff --git a/galerie/forms.py b/galerie/forms.py index 5075fa73..72cd091f 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -1,6 +1,11 @@ #coding: utf-8 from django import forms +from seminar.models import Soustredeni class KomentarForm(forms.Form): komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) + +class NewGalerieForm(forms.Form): + soustredeni = forms.ModelChoiceField(queryset = Soustredeni.objects, label = "Soustředění") + nazev = forms.CharField(label = "Název galerie", max_length = 100) diff --git a/galerie/templates/galerie/GalerieNew.html b/galerie/templates/galerie/GalerieNew.html new file mode 100644 index 00000000..b9140ad1 --- /dev/null +++ b/galerie/templates/galerie/GalerieNew.html @@ -0,0 +1,18 @@ +{% extends "galerie/Base.html" %} + +{% block title %}{% block nadpis1a %} +Vytvářím novou galerii +{% endblock %}{% endblock %} + +{% block content %} + +
    + {% csrf_token %} + {{form.as_table}} + + + +
     
    +
    + +{% endblock %} diff --git a/galerie/urls.py b/galerie/urls.py index 66991dd4..71dfb3ea 100644 --- a/galerie/urls.py +++ b/galerie/urls.py @@ -5,5 +5,6 @@ from django.conf.urls import patterns, include, url urlpatterns = patterns('', (r'^(?P\d+)/$', 'galerie.views.nahled'), (r'^(?P\d+)/(?P\d+)/$', 'galerie.views.detail'), + (r'^(?P\d+)/new/$', 'galerie.views.new_galerie'), ) diff --git a/galerie/views.py b/galerie/views.py index 2be5f9b3..782eba84 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -8,7 +8,7 @@ from django.template import RequestContext from galerie.models import Obrazek, Galerie from seminar.models import Soustredeni -from galerie.forms import KomentarForm +from galerie.forms import KomentarForm, NewGalerieForm #def index(request, stitek=None): @@ -107,3 +107,11 @@ def detail(request, pk, fotka, soustredeni): 'form' : form, }) + +def new_galerie(request, galerie, soustredeni): + form = NewGalerieForm() + + return render(request, 'galerie/GalerieNew.html', + { + 'form' : form, + }) From cc59e42e120d2d0c52a0f00b63bb31cee8002f3c Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 21:14:57 +0200 Subject: [PATCH 13/34] galerie | zlepseni template --- galerie/templates/galerie/Base.html | 6 ++++++ galerie/templates/galerie/Galerie.html | 7 +------ galerie/templates/galerie/GalerieNahled.html | 7 +------ 3 files changed, 8 insertions(+), 12 deletions(-) create mode 100644 galerie/templates/galerie/Base.html diff --git a/galerie/templates/galerie/Base.html b/galerie/templates/galerie/Base.html new file mode 100644 index 00000000..61f96eb4 --- /dev/null +++ b/galerie/templates/galerie/Base.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{# TODO predelat pres context processor #} +{% block header %}soustredeni{% endblock %} +{% block menu_soustredeni %}selected{% endblock %} +{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %} diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index dd7efaf7..e2bc030a 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -1,14 +1,9 @@ -{% extends "base.html" %} +{% extends "galerie/Base.html" %} {% block title %}{% block nadpis1a %} {{galerie.nazev}} | Galerie {% endblock %}{% endblock %} -{# TODO predelat pres context processor #} -{% block header %}soustredeni{% endblock %} -{% block menu_soustredeni %}selected{% endblock %} -{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %} - {% block content %}

    {{galerie.nazev}}

    diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 8a719c44..6de66365 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -1,14 +1,9 @@ -{% extends "base.html" %} +{% extends "galerie/Base.html" %} {% block title %}{% block nadpis1a %} {{galerie.nazev}} | Galerie TODO title {% endblock %}{% endblock %} -{# TODO predelat pres context processor #} -{% block header %}soustredeni{% endblock %} -{% block menu_soustredeni %}selected{% endblock %} -{% block submenu %}{% include 'seminar/soustredeni/submenu.html' %}{% endblock %} - {% block content %}

    {{galerie.nazev}}

    From 429b976c2b27dc0b810e575ce5b035547d7cca1d Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 21:38:31 +0200 Subject: [PATCH 14/34] galerie | vytvareni nove | hruba kostra obsluhu formu --- galerie/forms.py | 2 +- galerie/templates/galerie/GalerieNew.html | 2 ++ galerie/views.py | 11 ++++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/galerie/forms.py b/galerie/forms.py index 72cd091f..be746732 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -7,5 +7,5 @@ class KomentarForm(forms.Form): komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) class NewGalerieForm(forms.Form): - soustredeni = forms.ModelChoiceField(queryset = Soustredeni.objects, label = "Soustředění") + soustredeni = forms.ModelChoiceField(queryset = Soustredeni.objects, label = "Soustředění") # TODO zrusit a vybrat z URL nazev = forms.CharField(label = "Název galerie", max_length = 100) diff --git a/galerie/templates/galerie/GalerieNew.html b/galerie/templates/galerie/GalerieNew.html index b9140ad1..c3b5d0a2 100644 --- a/galerie/templates/galerie/GalerieNew.html +++ b/galerie/templates/galerie/GalerieNew.html @@ -6,6 +6,8 @@ Vytvářím novou galerii {% block content %} +

    Vytváření nové galerie

    +
    {% csrf_token %} {{form.as_table}} diff --git a/galerie/views.py b/galerie/views.py index 782eba84..339ab125 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -109,7 +109,16 @@ def detail(request, pk, fotka, soustredeni): def new_galerie(request, galerie, soustredeni): - form = NewGalerieForm() + if request.method == 'POST': + form = NewGalerieForm(request.POST, request.FILES) + if form.is_valid(): + # TODO dopsat vytvoreni fotogalerie + for obr in request.FILES.getlist('obr'): + pass # TODO dopsat ulozeni obrazku + # TODO presmerovani na nove vytvořenou galerii + + else: + form = NewGalerieForm() return render(request, 'galerie/GalerieNew.html', { From 9c59e6dec319e73711019d47039e0b09c4f17393 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 22:39:17 +0200 Subject: [PATCH 15/34] galerie | vytvoreni odkazu na vytvareni novych (pod)galerii --- galerie/forms.py | 1 - galerie/templates/galerie/GalerieNahled.html | 3 +++ galerie/templates/galerie/GalerieNew.html | 2 ++ galerie/views.py | 11 +++++++++++ .../seminar/soustredeni/seznam_soustredeni.html | 5 +++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/galerie/forms.py b/galerie/forms.py index be746732..c4cbb459 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -7,5 +7,4 @@ class KomentarForm(forms.Form): komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) class NewGalerieForm(forms.Form): - soustredeni = forms.ModelChoiceField(queryset = Soustredeni.objects, label = "Soustředění") # TODO zrusit a vybrat z URL nazev = forms.CharField(label = "Název galerie", max_length = 100) diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 6de66365..79ac0bfd 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -19,6 +19,9 @@
  • {{galerie}} {% endif %} {% endfor %} + {% if user.is_staff %} +
  • VYTVOŘIT NOVOU PODGALERII + {% endif %} {% endif %} diff --git a/galerie/templates/galerie/GalerieNew.html b/galerie/templates/galerie/GalerieNew.html index c3b5d0a2..38237d86 100644 --- a/galerie/templates/galerie/GalerieNew.html +++ b/galerie/templates/galerie/GalerieNew.html @@ -8,6 +8,8 @@ Vytvářím novou galerii

    Vytváření nové galerie

    +

    Vytvářím galerii k soustředění {{soustredeni}} jako {{galerie_text}}

    + {% csrf_token %}
  • {{form.as_table}} diff --git a/galerie/views.py b/galerie/views.py index 339ab125..3edbdebc 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -109,6 +109,14 @@ def detail(request, pk, fotka, soustredeni): def new_galerie(request, galerie, soustredeni): + + soustredeni = get_object_or_404(Soustredeni, pk = soustredeni) + if int(galerie) == 0: + galerie_text = "Hlavní fotogalerie soustředění" + else: + galerie = get_object_or_404(Galerie, pk = int(galerie)) + galerie_text = "podgalerii ke galerii " + str(galerie) + if request.method == 'POST': form = NewGalerieForm(request.POST, request.FILES) if form.is_valid(): @@ -120,7 +128,10 @@ def new_galerie(request, galerie, soustredeni): else: form = NewGalerieForm() + return render(request, 'galerie/GalerieNew.html', { 'form' : form, + 'soustredeni' : soustredeni, + 'galerie_text' : galerie_text, }) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index b850ccc2..cf858dca 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -49,6 +49,11 @@ {% endif %} {% endfor %} {% endif %} + {% if user.is_staff %} +
  • + VYTVOŘIT NOVOU FOTOGALERII +
  • + {% endif %} From 54c7afab71f469ca2a21a08692111f7ef2ea67da Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 12 Oct 2015 23:13:28 +0200 Subject: [PATCH 16/34] galerie | hromadne nahrani fotek --- galerie/TODO | 5 ++- galerie/admin.py | 2 +- galerie/forms.py | 1 + galerie/templates/galerie/GalerieNahled.html | 10 +++-- galerie/views.py | 40 +++++++++++++++++--- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index 66d2ad9c..2c39633f 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -5,6 +5,9 @@ * zvolit velikosti velke a male fotky * vycteni EXIFu * razeni podle casu -* hromadne nahravani fotek +* hromadne pridani fotek * do CSS * znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt +* přidávání nových galerií jen když je galerie neveřejna +* zverejneni cele galerie k soustredeni i jejich podgalerii +* třízení podgalerií diff --git a/galerie/admin.py b/galerie/admin.py index 25bb7bc9..f4c7f062 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -11,7 +11,7 @@ class ObrazekAdmin(admin.ModelAdmin): class GalerieAdmin(admin.ModelAdmin): model = Galerie fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni') - list_display = ('nazev', 'datum_zmeny', 'zobrazit') + list_display = ('nazev', 'pk', 'datum_zmeny', 'zobrazit') inlines = [GalerieInline] admin.site.register(Obrazek, ObrazekAdmin) diff --git a/galerie/forms.py b/galerie/forms.py index c4cbb459..3e09fe15 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -8,3 +8,4 @@ class KomentarForm(forms.Form): class NewGalerieForm(forms.Form): nazev = forms.CharField(label = "Název galerie", max_length = 100) + popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea) diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 79ac0bfd..cba8709b 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -19,10 +19,12 @@
  • {{galerie}} {% endif %} {% endfor %} - {% if user.is_staff %} -
  • VYTVOŘIT NOVOU PODGALERII - {% endif %} - + + {% endif %} + {% if user.is_staff %} + {% endif %} {# obrazky v galerii #} diff --git a/galerie/views.py b/galerie/views.py index 3edbdebc..f8b1d0f5 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -5,9 +5,10 @@ import random from django.http import HttpResponse, Http404 from django.shortcuts import render, HttpResponseRedirect, get_object_or_404 from django.template import RequestContext +from datetime import datetime + from galerie.models import Obrazek, Galerie from seminar.models import Soustredeni - from galerie.forms import KomentarForm, NewGalerieForm @@ -110,20 +111,47 @@ def detail(request, pk, fotka, soustredeni): def new_galerie(request, galerie, soustredeni): + # zjistime k jakemu soustredeni se vaze nove vytvarena galerie soustredeni = get_object_or_404(Soustredeni, pk = soustredeni) + # pokud je parametr galerie 0, pak jde o hlavni galerii + # kdyz je nejaky jiny, pak je pk galerie pod kterou tu dalsi vytvarim if int(galerie) == 0: + galerie_up = False galerie_text = "Hlavní fotogalerie soustředění" else: - galerie = get_object_or_404(Galerie, pk = int(galerie)) - galerie_text = "podgalerii ke galerii " + str(galerie) + galerie_up = get_object_or_404(Galerie, pk = int(galerie)) + galerie_text = "podgalerii ke galerii " + str(galerie_up) + # obsluha formulare umoznujiciho multiple nahravani fotek if request.method == 'POST': form = NewGalerieForm(request.POST, request.FILES) if form.is_valid(): - # TODO dopsat vytvoreni fotogalerie + # vytvoreni nove galerie + gal = Galerie() + gal.nazev = form.cleaned_data['nazev'] + gal.popis = form.cleaned_data['popis'] + gal.zobrazit = 1 # galerie je v procesu vytvareni + ''' pokud je to podgalerie pridej nadrazenou galerii + a nadrazene soustredeni nechej volne, + pokud je to hlavni galerie, tak nadrazena galerie neexistuje, + ale v takovem pripade musi byt nadrazene soustredeni a ne jinak ''' + if galerie_up: + gal.galerie_up = galerie_up + else: + gal.soustredeni = soustredeni + gal.save() + + # zpracovani obrazku v galerii for obr in request.FILES.getlist('obr'): - pass # TODO dopsat ulozeni obrazku - # TODO presmerovani na nove vytvořenou galerii + o = Obrazek() + o.obrazek_velky = obr + o.nazev = str(gal) + "/" + str(obr) + o.datum = datetime.now() #TODO vycist z EXIFU + o.galerie = gal + o.save() + + # presmerovani na prave vzniklou galerii + return HttpResponseRedirect('../../' + str(gal.pk)) else: form = NewGalerieForm() From 2f1e535a88e0f17643785d004fbea2873e032e48 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 11:43:57 +0200 Subject: [PATCH 17/34] galerie | TODO --- galerie/TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/galerie/TODO b/galerie/TODO index 2c39633f..58923575 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -11,3 +11,4 @@ * přidávání nových galerií jen když je galerie neveřejna * zverejneni cele galerie k soustredeni i jejich podgalerii * třízení podgalerií +* spravne otoceni fyzicky neotocenych fotek From c05db5084ade59505c113955854bd38298052c3d Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 11:47:00 +0200 Subject: [PATCH 18/34] galerie | migrace --- galerie/migrations/0001_initial.py | 59 +++++++++++++++++++ galerie/migrations/0002_auto_20151013_1145.py | 27 +++++++++ galerie/migrations/__init__.py | 0 3 files changed, 86 insertions(+) create mode 100644 galerie/migrations/0001_initial.py create mode 100644 galerie/migrations/0002_auto_20151013_1145.py create mode 100644 galerie/migrations/__init__.py diff --git a/galerie/migrations/0001_initial.py b/galerie/migrations/0001_initial.py new file mode 100644 index 00000000..b7406da6 --- /dev/null +++ b/galerie/migrations/0001_initial.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0033_organizator_studuje_popisek'), + ] + + operations = [ + migrations.CreateModel( + name='Galerie', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('nazev', models.CharField(max_length=100, verbose_name=b'N\xc3\xa1zev')), + ('datum_vytvoreni', models.DateTimeField(auto_now_add=True, verbose_name=b'Datum vytvo\xc5\x99en\xc3\xad')), + ('datum_zmeny', models.DateTimeField(auto_now=True, verbose_name=b'Datum posledn\xc3\xad zm\xc4\x9bny')), + ('popis', models.TextField(null=True, verbose_name=b'Popis', blank=True)), + ('zobrazit', models.IntegerField(default=1, verbose_name=b'Zobrazit?', choices=[(0, b'V\xc5\xbedy'), (1, b'Organiz\xc3\xa1tor\xc5\xafm'), (2, b'Nikdy')])), + ('galerie_up', models.ForeignKey(blank=True, to='galerie.Galerie', null=True)), + ('soustredeni', models.ForeignKey(blank=True, to='seminar.Soustredeni', null=True)), + ], + options={ + 'verbose_name': 'Galerie', + 'verbose_name_plural': 'Galerie', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Obrazek', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('obrazek_velky', models.ImageField(help_text=b'Lze vlo\xc5\xbeit libovoln\xc4\x9b velk\xc3\xbd obr\xc3\xa1zek. Ide\xc3\xa1ln\xc3\xad je, aby alespo\xc5\x88 jeden rozm\xc4\x9br m\xc4\x9bl alespo\xc5\x88 500px.', upload_to=b'Galerie/%Y/%m/%d')), + ('obrazek_stredni', models.ImageField(upload_to=b'Galerie/%Y/%m/%d/stredni', null=True, editable=False)), + ('obrazek_maly', models.ImageField(upload_to=b'Galerie/%Y/%m/%d/male', null=True, editable=False)), + ('nazev', models.CharField(max_length=50, null=True, verbose_name=b'N\xc3\xa1zev', blank=True)), + ('popis', models.TextField(null=True, verbose_name=b'Popis', blank=True)), + ('datum_vlozeni', models.DateTimeField(auto_now_add=True, verbose_name=b'Datum vlo\xc5\xbeen\xc3\xad')), + ('datum', models.DateTimeField(verbose_name=b'Datum po\xc5\x99\xc3\xadzen\xc3\xad fotografie')), + ('poradi', models.IntegerField(null=True, verbose_name=b'Po\xc5\x99ad\xc3\xad', blank=True)), + ('galerie', models.ForeignKey(to='galerie.Galerie')), + ], + options={ + 'verbose_name': 'Obr\xe1zek', + 'verbose_name_plural': 'Obr\xe1zky', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='galerie', + name='titulni_obrazek', + field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, to='galerie.Obrazek', null=True), + preserve_default=True, + ), + ] diff --git a/galerie/migrations/0002_auto_20151013_1145.py b/galerie/migrations/0002_auto_20151013_1145.py new file mode 100644 index 00000000..ea241267 --- /dev/null +++ b/galerie/migrations/0002_auto_20151013_1145.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='galerie', + name='titulni_obrazek', + field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='galerie.Obrazek', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='obrazek', + name='datum', + field=models.DateTimeField(null=True, verbose_name=b'Datum po\xc5\x99\xc3\xadzen\xc3\xad fotografie', blank=True), + preserve_default=True, + ), + ] diff --git a/galerie/migrations/__init__.py b/galerie/migrations/__init__.py new file mode 100644 index 00000000..e69de29b From 89e609f5e47000ea4c7692f5e1911440404290c8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 12:08:28 +0200 Subject: [PATCH 19/34] galerie | prepinani mezi verejnym a tvurcim neverejnym rezimem --- galerie/TODO | 6 ++--- galerie/admin.py | 27 +++++++++++++++++++- galerie/templates/galerie/GalerieNahled.html | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index 58923575..a47da77c 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -7,8 +7,8 @@ * razeni podle casu * hromadne pridani fotek * do CSS -* znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt -* přidávání nových galerií jen když je galerie neveřejna -* zverejneni cele galerie k soustredeni i jejich podgalerii +* znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt? + * ověřit chování * třízení podgalerií * spravne otoceni fyzicky neotocenych fotek +* jak rozdispriubovat prava zobrazit galerii? diff --git a/galerie/admin.py b/galerie/admin.py index f4c7f062..60af9e3d 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -1,7 +1,31 @@ +#coding: utf-8 + from galerie.models import Obrazek, Galerie from django.contrib import admin from django.http import HttpResponseRedirect +# akction + +def zverejnit_fotogalerii(modeladmin, request, queryset): + '''zverejni vybranou fotogalerii i jeji vsechny podgalerie''' + for galerie in queryset: + galerie.zobrazit = 0 + galerie.save() + zverejnit_fotogalerii(modeladmin, request, + Galerie.objects.filter(galerie_up = galerie)) + zverejnit_fotogalerii.short_description = 'Zveřejnit fotogalerie' + + +def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset): + '''zneverjni vybranou fotogalerii i jeji vsechny podgalerie''' + for galerie in queryset: + galerie.zobrazit = 1 + galerie.save() + prepnout_fotogalerii_do_org_rezimu(modeladmin, request, + Galerie.objects.filter(galerie_up = galerie)) + prepnout_fotogalerii_do_org_rezimu.short_description = \ + 'Přepnout do režimu úprav (zneveřejní galerii)' + class GalerieInline(admin.TabularInline): model = Obrazek @@ -11,8 +35,9 @@ class ObrazekAdmin(admin.ModelAdmin): class GalerieAdmin(admin.ModelAdmin): model = Galerie fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni') - list_display = ('nazev', 'pk', 'datum_zmeny', 'zobrazit') + list_display = ('nazev', 'pk', 'datum_zmeny', 'zobrazit', 'soustredeni') inlines = [GalerieInline] + actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu] admin.site.register(Obrazek, ObrazekAdmin) admin.site.register(Galerie, GalerieAdmin) diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index cba8709b..77fe4481 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -21,7 +21,7 @@ {% endfor %} {% endif %} - {% if user.is_staff %} + {% if user.is_staff and galerie.zobrazit > 0 %} From b1cf79271f328f50e07b53b92a9afa9fb0288bda Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 12:49:00 +0200 Subject: [PATCH 20/34] galerie | ukladani fotek podle soustredeni --- galerie/models.py | 24 +++++++++++++++++++++--- galerie/views.py | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/galerie/models.py b/galerie/models.py index 42dbaa50..3d8bddd4 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -4,6 +4,7 @@ from django.db import models import seminar.models from django.db.models import Q from django.utils import timezone +from django.utils.encoding import force_unicode from PIL import Image import os @@ -21,12 +22,29 @@ VIDITELNOST = ( (NIKDY, 'Nikdy'), ) +def obrazek_filename(self, filename): + return obrazek_filename_obecny(self, filename, "velky") + +def obrazek_filename_stredni(self, filename): + return obrazek_filename_obecny(self, filename, "stredni") + +def obrazek_filename_maly(self, filename): + return obrazek_filename_obecny(self, filename, "maly") + +def obrazek_filename_obecny(self, filename, typ): + gal = self.galerie + cesta = "" + while(not gal.soustredeni): + cesta = os.path.join(cesta, force_unicode(gal.nazev)) + gal = gal.galerie_up + return os.path.join('Galerie', force_unicode(gal.soustredeni), cesta, typ, force_unicode(self.nazev)) + class Obrazek(models.Model): # TODO vkladat do slozek podle soustredeni - obrazek_velky = models.ImageField(upload_to='Galerie/%Y/%m/%d', + obrazek_velky = models.ImageField(upload_to=obrazek_filename, help_text = "Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.") - obrazek_stredni = models.ImageField(upload_to='Galerie/%Y/%m/%d/stredni', null = True, editable = False) - obrazek_maly = models.ImageField(upload_to='Galerie/%Y/%m/%d/male', null = True, editable = False) + obrazek_stredni = models.ImageField(upload_to=obrazek_filename_stredni, null = True, editable = False) + obrazek_maly = models.ImageField(upload_to=obrazek_filename_maly, null = True, editable = False) nazev = models.CharField('Název', max_length=50, blank = True, null = True) popis = models.TextField('Popis', blank = True, null = True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add = True) diff --git a/galerie/views.py b/galerie/views.py index f8b1d0f5..3af7066e 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -145,7 +145,7 @@ def new_galerie(request, galerie, soustredeni): for obr in request.FILES.getlist('obr'): o = Obrazek() o.obrazek_velky = obr - o.nazev = str(gal) + "/" + str(obr) + o.nazev = str(obr) o.datum = datetime.now() #TODO vycist z EXIFU o.galerie = gal o.save() From 50dfb8484f501a60c029f2f2ea1104f835536c10 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 13:05:32 +0200 Subject: [PATCH 21/34] galerie | neznovuukladani fotek ukladani fotek podle cesty, ktera by se mela tvorit uz ve spravnem poradi nezobrazovani komentare None --- galerie/models.py | 8 +++++--- galerie/templates/galerie/Galerie.html | 11 ++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/galerie/models.py b/galerie/models.py index 3d8bddd4..8b7c2d8f 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -35,7 +35,7 @@ def obrazek_filename_obecny(self, filename, typ): gal = self.galerie cesta = "" while(not gal.soustredeni): - cesta = os.path.join(cesta, force_unicode(gal.nazev)) + cesta = os.path.join(force_unicode(gal.nazev), cesta) gal = gal.galerie_up return os.path.join('Galerie', force_unicode(gal.soustredeni), cesta, typ, force_unicode(self.nazev)) @@ -59,8 +59,10 @@ class Obrazek(models.Model): def save(self): original = Image.open(self.obrazek_velky) jmeno = os.path.basename(self.obrazek_velky.file.name) - Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) - Obrazek._vyrobMiniaturu(original, jmeno, 200, self.obrazek_maly) + if not self.obrazek_stredni: + Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) + if not self.obrazek_maly: + Obrazek._vyrobMiniaturu(original, jmeno, 200, self.obrazek_maly) super(Obrazek, self).save() @staticmethod diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index e2bc030a..4c212566 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -41,11 +41,16 @@ {% if preview %} {% csrf_token %} - {{form}} - +
  • + + {{form.as_table}} + +
    {{obrazek.popis}}
    {% else %} - {{obrazek.popis}} + {% if obrazek.popis %} + {{obrazek.popis}} + {% endif %} {% endif %}
    From 531506b798c4d612f30318eefeeeed1fd3e6b7b8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 13:41:24 +0200 Subject: [PATCH 22/34] galerie | utrizeni TODO a rozvrzeni praci --- galerie/TODO | 19 ++++++++++++------- galerie/models.py | 3 +-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index a47da77c..940edc9d 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -2,13 +2,18 @@ | TODO | |======| -* zvolit velikosti velke a male fotky -* vycteni EXIFu +Aktualni +* vycteni EXIFu (datum) * razeni podle casu -* hromadne pridani fotek -* do CSS -* znovuukladani malych a strednich fotek -- spravit, aby se tak nedělo furt? - * ověřit chování * třízení podgalerií +* predelat URL na cistsi (odstranit probehlo) +* do CSS + +Dlouhodobe +* sipky na prechazeni mezi fotkami +* hromadne PRIDANI fotek do jiz existujici galerie + +Fylozoficke +* zvolit velikosti velke a male fotky * spravne otoceni fyzicky neotocenych fotek -* jak rozdispriubovat prava zobrazit galerii? + diff --git a/galerie/models.py b/galerie/models.py index 8b7c2d8f..abbcd4fe 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -40,7 +40,6 @@ def obrazek_filename_obecny(self, filename, typ): return os.path.join('Galerie', force_unicode(gal.soustredeni), cesta, typ, force_unicode(self.nazev)) class Obrazek(models.Model): - # TODO vkladat do slozek podle soustredeni obrazek_velky = models.ImageField(upload_to=obrazek_filename, help_text = "Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.") obrazek_stredni = models.ImageField(upload_to=obrazek_filename_stredni, null = True, editable = False) @@ -48,7 +47,7 @@ class Obrazek(models.Model): nazev = models.CharField('Název', max_length=50, blank = True, null = True) popis = models.TextField('Popis', blank = True, null = True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add = True) - datum = models.DateTimeField('Datum pořízení fotografie', blank = True, null = True) # TODO zjistit z EXIFU + datum = models.DateTimeField('Datum pořízení fotografie', blank = True, null = True) galerie = models.ForeignKey('Galerie') poradi = models.IntegerField('Pořadí', blank = True, null = True) def __unicode__(self): From fd8aff5aff52e35eea42c1100f30d00c05783f3b Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 15:55:47 +0200 Subject: [PATCH 23/34] galerie | vycteni EXIFu + razeni fotek podle casu vycteni EXIFu -- otoceni fotky podle udaje z EXIFu -- prirazeni datumu podle udaje z EXIFu razeni fotek podle datumu --- galerie/TODO | 6 +-- galerie/models.py | 44 ++++++++++++++++++++ galerie/templates/galerie/GalerieNahled.html | 4 +- galerie/views.py | 25 ++--------- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index 940edc9d..1b497ed2 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -3,8 +3,6 @@ |======| Aktualni -* vycteni EXIFu (datum) -* razeni podle casu * třízení podgalerií * predelat URL na cistsi (odstranit probehlo) * do CSS @@ -15,5 +13,7 @@ Dlouhodobe Fylozoficke * zvolit velikosti velke a male fotky -* spravne otoceni fyzicky neotocenych fotek +* je potreba i jine razeni nez automaticky podle casu nebo staci podgalerie? + * napr. dve hry na dvou ruznych mistech ve stejny cas + * fotky od ucastniku ze hry (skupinky se pohybuji ve stejny cas, ale maji sled fotek) -- nestaci to pripadne vrazit do podgalerii? diff --git a/galerie/models.py b/galerie/models.py index abbcd4fe..02781a96 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -7,9 +7,11 @@ from django.utils import timezone from django.utils.encoding import force_unicode from PIL import Image +from PIL.ExifTags import TAGS import os from cStringIO import StringIO from django.core.files.base import ContentFile +from datetime import datetime from seminar.models import Soustredeni @@ -22,6 +24,33 @@ VIDITELNOST = ( (NIKDY, 'Nikdy'), ) +def get_exif(fn): + ret = {} + info = fn._getexif() + for tag, value in info.items(): + decoded = TAGS.get(tag, tag) + ret[decoded] = value + return ret + +def flip_horizontal(im): return im.transpose(Image.FLIP_LEFT_RIGHT) +def flip_vertical(im): return im.transpose(Image.FLIP_TOP_BOTTOM) +def rotate_180(im): return im.transpose(Image.ROTATE_180) +def rotate_90(im): return im.transpose(Image.ROTATE_90) +def rotate_270(im): return im.transpose(Image.ROTATE_270) +def transpose(im): return rotate_90(flip_horizontal(im)) +def transverse(im): return rotate_90(flip_vertical(im)) +orientation_funcs = [None, + lambda x: x, + flip_horizontal, + rotate_180, + flip_vertical, + transpose, + rotate_270, + transverse, + rotate_90 + ] + + def obrazek_filename(self, filename): return obrazek_filename_obecny(self, filename, "velky") @@ -57,6 +86,21 @@ class Obrazek(models.Model): verbose_name_plural = 'Obrázky' def save(self): original = Image.open(self.obrazek_velky) + # vycteni EXIFu + exif = get_exif(original) + if exif['Orientation']: + f = orientation_funcs[exif['Orientation']] + original_otoceny = f(original) + original_otoceny.format = original.format + original = original_otoceny + # datum podle EXIfu + if exif['DateTimeOriginal']: + datum_string = ":".join(exif['DateTimeOriginal'].split(' ')).split(":") + datum_int = [] + for retezec in datum_string: + datum_int.append(int(retezec)) + self.datum = datetime(datum_int[0], datum_int[1], datum_int[2], + datum_int[3], datum_int[4], datum_int[5]) jmeno = os.path.basename(self.obrazek_velky.file.name) if not self.obrazek_stredni: Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 77fe4481..135ef153 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -28,9 +28,9 @@ {% endif %} {# obrazky v galerii #} - {% if galerie.obrazek_set.all %} + {% if obrazky %} - {% for obrazek in galerie.obrazek_set.all %} + {% for obrazek in obrazky %} {% if forloop.counter|add:-1|divisibleby:3 %} {% endif %} diff --git a/galerie/views.py b/galerie/views.py index 3af7066e..92a61193 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -11,25 +11,6 @@ from galerie.models import Obrazek, Galerie from seminar.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm - -#def index(request, stitek=None): - #if stitek == None: - #return HttpResponseRedirect('./0/') -# - #galerie = Galerie.publikovane_galerie() - #if int(stitek) != 0: - #galerie = galerie.filter(stitek = stitek) - #if not galerie: - #raise Http404 - #galerie = galerie.order_by("-datum_zmeny") -# - #return render(request, 'Galerie/GalerieIndex.html', - #{'galerie' : galerie, - #'stitky' : Stitek.stitky_u_galerii(), - #'umisteni_stitek' : stitek, - #'umisteni_Fotogalerie' : True, - #}) - def zobrazit(galerie, request): preview = False if galerie.zobrazit >= 1: @@ -39,13 +20,14 @@ def zobrazit(galerie, request): raise Http404 return preview - def nahled(request, pk, soustredeni): """Zobrazeni nahledu vsech fotek ve skupine.""" galerie = get_object_or_404(Galerie, pk=pk) + obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum') preview = zobrazit(galerie, request) return render(request, 'galerie/GalerieNahled.html', {'galerie' : galerie, + 'obrazky' : obrazky, 'preview' : preview, }) @@ -60,7 +42,7 @@ def detail(request, pk, fotka, soustredeni): galerie = get_object_or_404(Galerie, pk=pk) preview = zobrazit(galerie, request) obrazek = get_object_or_404(Obrazek, pk=fotka) - obrazky = galerie.obrazek_set.all() + obrazky = galerie.obrazek_set.all().order_by('datum') # vytvoreni a obslouzeni formulare if request.method == 'POST': @@ -146,7 +128,6 @@ def new_galerie(request, galerie, soustredeni): o = Obrazek() o.obrazek_velky = obr o.nazev = str(obr) - o.datum = datetime.now() #TODO vycist z EXIFU o.galerie = gal o.save() From 7d1bda5fcef39a6236cdfb184e4decc0d808ff27 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 16:00:17 +0200 Subject: [PATCH 24/34] galerie | lepsi URL z URL odstraneno "navic" probehlo --- galerie/TODO | 1 - seminar/templates/seminar/soustredeni/seznam_soustredeni.html | 4 ++-- seminar/urls.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index 1b497ed2..b4512244 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -4,7 +4,6 @@ Aktualni * třízení podgalerií -* predelat URL na cistsi (odstranit probehlo) * do CSS Dlouhodobe diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index cf858dca..be33ed52 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -43,7 +43,7 @@ {% for galerie in soustredeni.galerie_set.all %} {% if galerie.zobrazit == 0 or user.is_staff %}
  • - FOTOGALERIE: {{galerie}} + FOTOGALERIE: {{galerie}} {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #}
  • {% endif %} @@ -51,7 +51,7 @@ {% endif %} {% if user.is_staff %}
  • - VYTVOŘIT NOVOU FOTOGALERII + VYTVOŘIT NOVOU FOTOGALERII
  • {% endif %} diff --git a/seminar/urls.py b/seminar/urls.py index 116646f3..6beec024 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -17,7 +17,7 @@ urlpatterns = patterns('', url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(), name = 'seminar_seznam_soustredeni'), url(r'^soustredeni/probehlo/(?P\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), - url(r'^soustredeni/probehlo/(?P\d+)/fotogalerie/', include('galerie.urls')), + url(r'^soustredeni/(?P\d+)/fotogalerie/', include('galerie.urls')), url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'), From 1a8cfec157428dc46a8f1c6a0e4f426429937dac Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 16:35:45 +0200 Subject: [PATCH 25/34] galerie | moznost radit podgalerie podle cisla poradi --- galerie/migrations/0003_add_galerie_poradi.py | 39 +++++++++++++++++++ galerie/models.py | 1 + galerie/templates/galerie/GalerieNahled.html | 9 ++++- galerie/urls.py | 2 + galerie/views.py | 22 +++++++++++ 5 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 galerie/migrations/0003_add_galerie_poradi.py diff --git a/galerie/migrations/0003_add_galerie_poradi.py b/galerie/migrations/0003_add_galerie_poradi.py new file mode 100644 index 00000000..d9b32f48 --- /dev/null +++ b/galerie/migrations/0003_add_galerie_poradi.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import galerie.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0002_auto_20151013_1145'), + ] + + operations = [ + migrations.AddField( + model_name='galerie', + name='poradi', + field=models.IntegerField(null=True, verbose_name=b'Po\xc5\x99ad\xc3\xad', blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='obrazek', + name='obrazek_maly', + field=models.ImageField(upload_to=galerie.models.obrazek_filename_maly, null=True, editable=False), + preserve_default=True, + ), + migrations.AlterField( + model_name='obrazek', + name='obrazek_stredni', + field=models.ImageField(upload_to=galerie.models.obrazek_filename_stredni, null=True, editable=False), + preserve_default=True, + ), + migrations.AlterField( + model_name='obrazek', + name='obrazek_velky', + field=models.ImageField(help_text=b'Lze vlo\xc5\xbeit libovoln\xc4\x9b velk\xc3\xbd obr\xc3\xa1zek. Ide\xc3\xa1ln\xc3\xad je, aby alespo\xc5\x88 jeden rozm\xc4\x9br m\xc4\x9bl alespo\xc5\x88 500px.', upload_to=galerie.models.obrazek_filename), + preserve_default=True, + ), + ] diff --git a/galerie/models.py b/galerie/models.py index 02781a96..e3f15f06 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -147,6 +147,7 @@ class Galerie(models.Model): zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) galerie_up = models.ForeignKey('Galerie', blank = True, null = True) soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True) + poradi = models.IntegerField('Pořadí', blank = True, null = True) def __unicode__(self): return self.nazev diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 135ef153..28358c82 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -8,15 +8,20 @@

    {{galerie.nazev}}

    {# podgalerie #} - {% if galerie.galerie_set.all or galerie.galerie_up %} + {% if podgalerie or galerie.galerie_up %}

    PODGALERIE

      {% if galerie.galerie_up %}
    • .. {% endif %} - {% for galerie in galerie.galerie_set.all %} + {% for galerie in podgalerie %} {% if galerie.zobrazit < 1 or user.is_staff %}
    • {{galerie}} + {% if user.is_staff and galerie.zobrazit > 0 %} + ({{galerie.poradi}}) + + + - + {% endif %} {% endif %} {% endfor %}
    diff --git a/galerie/urls.py b/galerie/urls.py index 71dfb3ea..b2980b52 100644 --- a/galerie/urls.py +++ b/galerie/urls.py @@ -6,5 +6,7 @@ urlpatterns = patterns('', (r'^(?P\d+)/$', 'galerie.views.nahled'), (r'^(?P\d+)/(?P\d+)/$', 'galerie.views.detail'), (r'^(?P\d+)/new/$', 'galerie.views.new_galerie'), + (r'^(?P\d+)/plus/(?P\d+)/$', 'galerie.views.plus_galerie'), + (r'^(?P\d+)/minus/(?P\d+)/$', 'galerie.views.minus_galerie'), ) diff --git a/galerie/views.py b/galerie/views.py index 92a61193..0926c5a3 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -23,10 +23,12 @@ def zobrazit(galerie, request): def nahled(request, pk, soustredeni): """Zobrazeni nahledu vsech fotek ve skupine.""" galerie = get_object_or_404(Galerie, pk=pk) + podgalerie = Galerie.objects.filter(galerie_up = galerie).order_by('poradi') obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum') preview = zobrazit(galerie, request) return render(request, 'galerie/GalerieNahled.html', {'galerie' : galerie, + 'podgalerie' : podgalerie, 'obrazky' : obrazky, 'preview' : preview, }) @@ -121,6 +123,7 @@ def new_galerie(request, galerie, soustredeni): gal.galerie_up = galerie_up else: gal.soustredeni = soustredeni + gal.poradi = int(len(gal.galerie_up.galerie_set.all())) + 1 gal.save() # zpracovani obrazku v galerii @@ -144,3 +147,22 @@ def new_galerie(request, galerie, soustredeni): 'soustredeni' : soustredeni, 'galerie_text' : galerie_text, }) + +def plus_galerie(request, galerie, soustredeni, subgalerie): + galerie = get_object_or_404(Galerie, pk=subgalerie) + if galerie.poradi: + galerie.poradi += 1 + else: + galerie.poradi = int(len(galerie.galerie_up.galerie_set.all())) + galerie.save() + return HttpResponseRedirect('../../') + +def minus_galerie(request, galerie, soustredeni, subgalerie): + galerie = get_object_or_404(Galerie, pk=subgalerie) + if galerie.poradi: + galerie.poradi -= 1 + else: + galerie.poradi = 1 + galerie.save() + return HttpResponseRedirect('../../') + From a38798009fc5e8e5db692cd5fc769eda1d1a39cc Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 16:45:53 +0200 Subject: [PATCH 26/34] galerie | prechodove sipky --- galerie/TODO | 8 +++++- mamweb/static/css/mamweb.css | 54 ++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/galerie/TODO b/galerie/TODO index b4512244..ccfd1200 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -3,8 +3,14 @@ |======| Aktualni -* třízení podgalerií * do CSS + * nahledy + * nastylovat tabulku s nahledy + * komentare uz na nahledy? + * detail + * nahledy pred a po + * opravit prechodove sipky + * vyrobit prechodove sipky ve M&M-stylu Dlouhodobe * sipky na prechazeni mezi fotkami diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 2d0a283f..12036fc5 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -408,3 +408,57 @@ div.zadani_azad_termin { float: none; } } + + +/* galerie */ + +.predchozi_obrazek{ + position: absolute; + z-index: 1; + width: 33%; + height: 100%; + left: 0; + top: 0; +} +.predchozi_obrazek:hover{ + background-image: url("/static/galerie/prvky/predchozi.png"); + background-position: left center; + background-repeat: no-repeat; +} +.dalsi_obrazek{ + position: absolute; + z-index: 1; + width: 33%; + height: 100%; + left: 67%; + top: 0; +} +.dalsi_obrazek:hover{ + background-image: url("/static/galerie/prvky/dalsi.png"); + background-position: right center; + background-repeat: no-repeat; +} + +.galerie{ + position: relative; +} +.galerie_top{ + margin: 1em 0; + text-align: right; +} +.galerie_bot{ + margin: 1em 0; +} +.galerie_index{ + width: 100%; +} +.galerie_index td{ + width: 50%; +} +.galerie_nahled{ + width: 100%; +} +.galerie_nahled td{ + width: 33%; +} + From bd01182b2e76dee5ff592c15b592fe31fc4bb500 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 16:51:45 +0200 Subject: [PATCH 27/34] galerie | Korenova galerie nema poradi --- galerie/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/galerie/views.py b/galerie/views.py index 0926c5a3..f33c2ff6 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -123,7 +123,8 @@ def new_galerie(request, galerie, soustredeni): gal.galerie_up = galerie_up else: gal.soustredeni = soustredeni - gal.poradi = int(len(gal.galerie_up.galerie_set.all())) + 1 + if gal.galerie_up: + gal.poradi = int(len(gal.galerie_up.galerie_set.all())) + 1 gal.save() # zpracovani obrazku v galerii From f3bf6d53007c1108ffdc0184cac75bc9c7c9a1bc Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 19:00:37 +0200 Subject: [PATCH 28/34] galerie | zmena cest na ukladani souboru rozumneji --- galerie/TODO | 1 + galerie/models.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index ccfd1200..c8afd3c4 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -3,6 +3,7 @@ |======| Aktualni +* co s titulni fotkou * do CSS * nahledy * nastylovat tabulku s nahledy diff --git a/galerie/models.py b/galerie/models.py index e3f15f06..62ce26a2 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -62,11 +62,11 @@ def obrazek_filename_maly(self, filename): def obrazek_filename_obecny(self, filename, typ): gal = self.galerie + cislo_gal = force_unicode(gal.pk) cesta = "" while(not gal.soustredeni): - cesta = os.path.join(force_unicode(gal.nazev), cesta) gal = gal.galerie_up - return os.path.join('Galerie', force_unicode(gal.soustredeni), cesta, typ, force_unicode(self.nazev)) + return os.path.join('Galerie', "soustredeni_" + force_unicode(gal.soustredeni.pk), "galerie_" + cislo_gal, typ, force_unicode(self.nazev)) class Obrazek(models.Model): obrazek_velky = models.ImageField(upload_to=obrazek_filename, From a565739ba662165a9d0d8d12158693506621c779 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 15 Oct 2015 19:37:20 +0200 Subject: [PATCH 29/34] flat titulni strana Pokus o vylepseni titulni stranky tak, ze pokud mame mensi sirku, tak se novinky preskupi nad graf a daji na celou sirku, jen nevim, jak udelat, aby se pro ruzne sirky aplikovali ruzne styly. --- mamweb/static/css/mamweb.css | 23 +++++++ seminar/templates/seminar/titulnistrana.html | 71 +++++++++----------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 12036fc5..ace67ef6 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -299,6 +299,11 @@ div.zadani_azad_termin { padding: 20px 0px 20px 0px; float: none; } + + div.novinky{ + max-width: 42%; + } + } @media (max-width: 767px) { @@ -407,6 +412,10 @@ div.zadani_azad_termin { padding: 30px 0px 20px 0px; float: none; } + + div.novinky{ + max-width: 100%; + } } @@ -462,3 +471,17 @@ div.zadani_azad_termin { width: 33%; } +/* titulni stranka */ + +.zjistit_vic{ + text-align: center; +} + +.graf{ + float: left; +} + +.novinky{ + float: right; + /*max-width: 42%;*/ +} diff --git a/seminar/templates/seminar/titulnistrana.html b/seminar/templates/seminar/titulnistrana.html index 66a29393..a28ffa15 100644 --- a/seminar/templates/seminar/titulnistrana.html +++ b/seminar/templates/seminar/titulnistrana.html @@ -17,42 +17,7 @@ M&M je korespondeční seminář. Několikrát do roka zdarma vydáváme ča M&M je taky soutěž. Můžeš vyhrát knížky, deskovky nebo dokonce dort. Můžeš se dostat na matfyz bez přijímaček. A především s námi můžeš jet na skvělé soustředění.

    -
    - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -

    Zjistit víc!

    -

    -
    +
    {% if dead %}

    Do konce odeslání řešení zbývá:
    @@ -79,10 +44,38 @@ M&M je korespondeční seminář. Několikrát do roka zdarma vydáváme ča {% include 'seminar/novinky.html' %} Archiv novinek -

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Zjistit víc!

    +
    +
    From 23456d9f28c299e894f60325ed68bfc2e24aae73 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 15 Oct 2015 20:06:04 +0200 Subject: [PATCH 30/34] dodelani titulni stranky Uz to funguje podle predstav, mozna bude potreba trochu poupravit konstanty --- mamweb/static/css/mamweb.css | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index ace67ef6..2fa2644d 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -301,7 +301,17 @@ div.zadani_azad_termin { } div.novinky{ - max-width: 42%; + max-width: 70%; + margin-left: auto; + margin-right: auto; + float: none; + } + + div.graf{ + float: none; + margin-left: auto; + margin-right: auto; + width: 70%; } } @@ -415,6 +425,15 @@ div.zadani_azad_termin { div.novinky{ max-width: 100%; + float: none; + } + + div.graf{ + float: none; + width: 70%; + margin-left: auto; + margin-right: auto + } } @@ -483,5 +502,5 @@ div.zadani_azad_termin { .novinky{ float: right; - /*max-width: 42%;*/ + max-width: 42%; } From ae302bbc411ecd5b57de1036eb67abf919857e47 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Mon, 19 Oct 2015 10:08:56 +0200 Subject: [PATCH 31/34] Zobrazovani dat ve vypisu nezadanych Problemu --- seminar/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/admin.py b/seminar/admin.py index 28698611..299e6c75 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -319,7 +319,7 @@ class ProblemAdmin(reversion.VersionAdmin): return obj.pocet_reseni class ProblemNavrhAdmin(ProblemAdmin): - list_display = ['nazev', 'typ', 'zamereni', 'stav', 'autor', 'timestamp'] + list_display = ['nazev', 'typ', 'stav', 'autor', 'timestamp'] list_filter = ['typ', 'zamereni', 'timestamp', 'stav'] def get_queryset(self, request): From 05285beea90adf26deff5ac03e78d2a3f589b322 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 20 Oct 2015 19:30:51 +0200 Subject: [PATCH 32/34] soustredeni | zverejneni textu o soustredeni v seznamu soustredeni --- seminar/templates/seminar/soustredeni/seznam_soustredeni.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html index be33ed52..74bbee3b 100644 --- a/seminar/templates/seminar/soustredeni/seznam_soustredeni.html +++ b/seminar/templates/seminar/soustredeni/seznam_soustredeni.html @@ -57,11 +57,11 @@ - {% if user.is_authenticated %} {# popis soustredeni #} {% if soustredeni.text %} {% autoescape off %}{{soustredeni.text}}{% endautoescape %} {% endif %} + {% if user.is_authenticated %} {# Účastníci #}

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