Merge branch 'Galerie'
This commit is contained in:
		
						commit
						ef5470bcb6
					
				
					 23 changed files with 807 additions and 6 deletions
				
			
		
							
								
								
									
										24
									
								
								galerie/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								galerie/TODO
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | ======== | ||||||
|  | | TODO | | ||||||
|  | |======| | ||||||
|  | 
 | ||||||
|  | Aktualni | ||||||
|  | * 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 | ||||||
|  | * hromadne PRIDANI fotek do jiz existujici galerie | ||||||
|  | 
 | ||||||
|  | Fylozoficke | ||||||
|  | * zvolit velikosti velke a male fotky | ||||||
|  | * 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? | ||||||
|  | 
 | ||||||
							
								
								
									
										0
									
								
								galerie/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								galerie/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										43
									
								
								galerie/admin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								galerie/admin.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | ||||||
|  | #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 | ||||||
|  | 
 | ||||||
|  | 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', '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) | ||||||
							
								
								
									
										11
									
								
								galerie/forms.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								galerie/forms.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +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): | ||||||
|  |     nazev = forms.CharField(label = "Název galerie", max_length = 100) | ||||||
|  |     popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea) | ||||||
							
								
								
									
										59
									
								
								galerie/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								galerie/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -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, | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										27
									
								
								galerie/migrations/0002_auto_20151013_1145.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								galerie/migrations/0002_auto_20151013_1145.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -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, | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										39
									
								
								galerie/migrations/0003_add_galerie_poradi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								galerie/migrations/0003_add_galerie_poradi.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -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, | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										0
									
								
								galerie/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								galerie/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										178
									
								
								galerie/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								galerie/models.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,178 @@ | ||||||
|  | # coding: utf-8 | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  | 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 | ||||||
|  | 
 | ||||||
|  | VZDY=0 | ||||||
|  | ORG=1 | ||||||
|  | NIKDY=2 | ||||||
|  | VIDITELNOST = ( | ||||||
|  |     (VZDY, 'Vždy'), | ||||||
|  |     (ORG, 'Organizátorům'), | ||||||
|  |     (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") | ||||||
|  | 
 | ||||||
|  | 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(force_unicode(gal.nazev), cesta) | ||||||
|  |         gal = gal.galerie_up | ||||||
|  |     return os.path.join('Galerie', force_unicode(gal.soustredeni), cesta, typ, force_unicode(self.nazev)) | ||||||
|  | 
 | ||||||
|  | class Obrazek(models.Model): | ||||||
|  |   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) | ||||||
|  |   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) | ||||||
|  |   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): | ||||||
|  |     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) | ||||||
|  |     # 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) | ||||||
|  |     if not self.obrazek_maly: | ||||||
|  |       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 = 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) | ||||||
|  |   poradi = models.IntegerField('Pořadí', 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 '<a href="/fotogalerie/galerie/%s/">Preview</a>' % 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() | ||||||
							
								
								
									
										2
									
								
								galerie/static/galerie/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								galerie/static/galerie/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | images | ||||||
|  | lightbox | ||||||
							
								
								
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/dalsi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/dalsi.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/predchozi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								galerie/static/galerie/prvky/predchozi.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										6
									
								
								galerie/templates/galerie/Base.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								galerie/templates/galerie/Base.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 %} | ||||||
							
								
								
									
										62
									
								
								galerie/templates/galerie/Galerie.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								galerie/templates/galerie/Galerie.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | ||||||
|  | {% extends "galerie/Base.html" %} | ||||||
|  | 
 | ||||||
|  | {% block title %}{% block nadpis1a %} | ||||||
|  | {{galerie.nazev}} | Galerie | ||||||
|  | {% endblock %}{% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  |   <h1><a title="Zpět na náhled fotek" href="../#obsah">{{galerie.nazev}}</a></h1> | ||||||
|  |   <div class="galerie_top" id="obsah"> | ||||||
|  |     {% for obrazek in obrazky_predchozi %} | ||||||
|  |     <a href="../{{obrazek.pk}}#obsah"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||||
|  |     {% endfor %} | ||||||
|  |   </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   {# TODO šipky na přecházeni dodelat ve stylech #} | ||||||
|  |   <div class="galerie"> | ||||||
|  |     {% if obrazky_predchozi %} | ||||||
|  |       {% with obrazky_predchozi|last as predchozi_obrazek %} | ||||||
|  |         <div> | ||||||
|  |           <a title="Předchozí" class="predchozi_obrazek" href="../{{predchozi_obrazek.pk}}#obsah"></a> | ||||||
|  |         </div> | ||||||
|  |       {% endwith %} | ||||||
|  |     {% endif%} | ||||||
|  |     <img src={{obrazek.obrazek_stredni.url}} | ||||||
|  |          height="{{vyska}}" | ||||||
|  |          width="{{sirka}}" | ||||||
|  |          alt="{{obrazek.popis}}" | ||||||
|  |          class="obrazek"> | ||||||
|  |     {% if obrazky_dalsi %} | ||||||
|  |       {% with obrazky_dalsi|first as dalsi_obrazek %} | ||||||
|  |         <div> | ||||||
|  |           <a title="Další" class="dalsi_obrazek" href="../{{dalsi_obrazek.pk}}#obsah"></a> | ||||||
|  |         </div> | ||||||
|  |       {% endwith %} | ||||||
|  |     {% endif%} | ||||||
|  |   </div> | ||||||
|  | 
 | ||||||
|  |   {# Popisek fotky #} | ||||||
|  |   <div class="popis"> | ||||||
|  |     {% if preview %} | ||||||
|  |     <form action=".#obsah" method="post"> | ||||||
|  |       {% csrf_token %} | ||||||
|  |       <table> | ||||||
|  |         <tr><td><label>Aktuální komentář:</label></td><td>{{obrazek.popis}}</td> | ||||||
|  |         {{form.as_table}} | ||||||
|  |         <tr><td></td><td><input name="odeslat" type="submit" value="Změň komentář"></td></tr> | ||||||
|  |       </table> | ||||||
|  |     </form> | ||||||
|  |     {% else %} | ||||||
|  |       {% if obrazek.popis %} | ||||||
|  |         {{obrazek.popis}} | ||||||
|  |       {% endif %} | ||||||
|  |     {% endif %} | ||||||
|  |   </div> | ||||||
|  | 
 | ||||||
|  |   <div class="galerie_bot"> | ||||||
|  |     {% for obrazek in obrazky_dalsi %} | ||||||
|  |     <a href="../{{obrazek.pk}}#obsah"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a> | ||||||
|  |     {% endfor %} | ||||||
|  |   </div> | ||||||
|  | {% endblock %} | ||||||
							
								
								
									
										77
									
								
								galerie/templates/galerie/GalerieNahled.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								galerie/templates/galerie/GalerieNahled.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,77 @@ | ||||||
|  | {% extends "galerie/Base.html" %} | ||||||
|  | 
 | ||||||
|  | {% block title %}{% block nadpis1a %} | ||||||
|  | {{galerie.nazev}} | Galerie TODO title | ||||||
|  | {% endblock %}{% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  |   <h2>{{galerie.nazev}}</h2> | ||||||
|  | 
 | ||||||
|  |   {# podgalerie #} | ||||||
|  |   {% if podgalerie or galerie.galerie_up %} | ||||||
|  |     <h3> PODGALERIE </h3> | ||||||
|  |     <ul> | ||||||
|  |     {% if galerie.galerie_up %} | ||||||
|  |       <li><a href="../{{galerie.galerie_up.pk}}">..</a> | ||||||
|  |     {% endif %} | ||||||
|  |     {% for galerie in podgalerie %} | ||||||
|  |       {% if galerie.zobrazit < 1 or user.is_staff %} | ||||||
|  |       <li><a href="../{{galerie.pk}}">{{galerie}}</a> | ||||||
|  |         {% if user.is_staff and galerie.zobrazit > 0 %} | ||||||
|  |           ({{galerie.poradi}}) | ||||||
|  |           <span class="plus"><a href="plus/{{galerie.pk}}/">+</a></span> | ||||||
|  |           <span class="minus"><a href="minus/{{galerie.pk}}/">-</a></span> | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |     {% endfor %} | ||||||
|  |   </ul> | ||||||
|  |   {% endif %} | ||||||
|  |   {% if user.is_staff and galerie.zobrazit > 0 %} | ||||||
|  |   <ul> | ||||||
|  |     <li><a href="./new">VYTVOŘIT NOVOU PODGALERII </a> | ||||||
|  |   </ul> | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  |   {# obrazky v galerii #} | ||||||
|  |   {% if obrazky %} | ||||||
|  |   <table class="galerie_nahled"> | ||||||
|  |     {% for obrazek in obrazky %} | ||||||
|  |       {% if forloop.counter|add:-1|divisibleby:3 %} | ||||||
|  |         <tr> | ||||||
|  |       {% endif %} | ||||||
|  |         <td class="vystredeno"> | ||||||
|  |           <a title="Zobrazit tuto fotografii" href="./{{obrazek.pk}}#obsah" | ||||||
|  |             class="jednoducha-galerie"> | ||||||
|  |           <img | ||||||
|  |             src="{{obrazek.obrazek_maly.url}}" | ||||||
|  |             width={% widthratio obrazek.obrazek_maly.width 200 167 %} | ||||||
|  |             height={% widthratio obrazek.obrazek_maly.height 200 167 %} /> | ||||||
|  |           </a> | ||||||
|  |           <!--<a href="{{obrazek.obrazek_velky.url}}" | ||||||
|  |             class="javascript-galerie" data-lightbox="galerie" data-title="{{obrazek.popis}}" | ||||||
|  |             style="display: none;"> | ||||||
|  |           <img | ||||||
|  |             src="{{obrazek.obrazek_maly.url}}" | ||||||
|  |             width={% widthratio obrazek.obrazek_maly.width 200 167 %} | ||||||
|  |             height={% widthratio obrazek.obrazek_maly.height 200 167 %} /> | ||||||
|  |           </a>--> | ||||||
|  | 	</td> | ||||||
|  |       {% if forloop.last %} | ||||||
|  |         {% if not forloop.counter|divisibleby:3 %} | ||||||
|  |           <td></td> | ||||||
|  |         {% endif %} | ||||||
|  |         {% if not forloop.counter|divisibleby:2 %} | ||||||
|  |           <td></td> | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |       {% if forloop.counter|divisibleby:3 or forloop.last %} | ||||||
|  |         </tr> | ||||||
|  |       {% endif %} | ||||||
|  |     {% endfor %} | ||||||
|  |   </table> | ||||||
|  |   {% else %} | ||||||
|  |     <div class="zadne-vysledky"> | ||||||
|  |       V galerii nejsou žádné fotky. | ||||||
|  |     </div> | ||||||
|  |   {% endif %} | ||||||
|  | {% endblock content %} | ||||||
							
								
								
									
										22
									
								
								galerie/templates/galerie/GalerieNew.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								galerie/templates/galerie/GalerieNew.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | {% extends "galerie/Base.html" %} | ||||||
|  | 
 | ||||||
|  | {% block title %}{% block nadpis1a %} | ||||||
|  | Vytvářím novou galerii | ||||||
|  | {% endblock %}{% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  | 
 | ||||||
|  | <h2> Vytváření nové galerie </h2> | ||||||
|  | 
 | ||||||
|  | <h3> Vytvářím galerii k soustředění {{soustredeni}} jako {{galerie_text}}</h3> | ||||||
|  | 
 | ||||||
|  | <form enctype="multipart/form-data" action="." method="post"> | ||||||
|  |   {% csrf_token %} | ||||||
|  |   <table>{{form.as_table}} | ||||||
|  |     <tr><td><label>Obrázky:</label></td><td><input name="obr" type="file" multiple></td></tr> | ||||||
|  |     <tr><td> </td></tr> | ||||||
|  |     <tr><td></td><td><input name="odeslat" type="submit" value="Vytvoř galerii"></td></tr> | ||||||
|  |   </table> | ||||||
|  | </form> | ||||||
|  | 
 | ||||||
|  | {% endblock %} | ||||||
							
								
								
									
										12
									
								
								galerie/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								galerie/urls.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | # coding: utf-8 | ||||||
|  | 
 | ||||||
|  | from django.conf.urls import patterns, include, url | ||||||
|  | 
 | ||||||
|  | urlpatterns = patterns('', | ||||||
|  |    (r'^(?P<pk>\d+)/$', 'galerie.views.nahled'), | ||||||
|  |    (r'^(?P<pk>\d+)/(?P<fotka>\d+)/$', 'galerie.views.detail'), | ||||||
|  |    (r'^(?P<galerie>\d+)/new/$', 'galerie.views.new_galerie'), | ||||||
|  |    (r'^(?P<galerie>\d+)/plus/(?P<subgalerie>\d+)/$', 'galerie.views.plus_galerie'), | ||||||
|  |    (r'^(?P<galerie>\d+)/minus/(?P<subgalerie>\d+)/$', 'galerie.views.minus_galerie'), | ||||||
|  | ) | ||||||
|  | 
 | ||||||
							
								
								
									
										168
									
								
								galerie/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								galerie/views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,168 @@ | ||||||
|  | # 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 datetime import datetime | ||||||
|  | 
 | ||||||
|  | from galerie.models import Obrazek, Galerie | ||||||
|  | from seminar.models import Soustredeni | ||||||
|  | from galerie.forms import KomentarForm, NewGalerieForm | ||||||
|  | 
 | ||||||
|  | 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) | ||||||
|  |   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, | ||||||
|  |       }) | ||||||
|  | 
 | ||||||
|  | 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 = 1 | ||||||
|  | 
 | ||||||
|  |   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().order_by('datum') | ||||||
|  | 
 | ||||||
|  |   # 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: | ||||||
|  |       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, | ||||||
|  |        'form' : form, | ||||||
|  |       }) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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_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(): | ||||||
|  |             # 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.poradi = int(len(gal.galerie_up.galerie_set.all())) + 1  | ||||||
|  |             gal.save() | ||||||
|  | 
 | ||||||
|  |             # zpracovani obrazku v galerii | ||||||
|  |             for obr in request.FILES.getlist('obr'): | ||||||
|  |                 o = Obrazek() | ||||||
|  |                 o.obrazek_velky = obr | ||||||
|  |                 o.nazev = str(obr) | ||||||
|  |                 o.galerie = gal | ||||||
|  |                 o.save() | ||||||
|  | 
 | ||||||
|  |             # presmerovani na prave vzniklou galerii | ||||||
|  |             return HttpResponseRedirect('../../' + str(gal.pk)) | ||||||
|  | 
 | ||||||
|  |     else: | ||||||
|  |         form = NewGalerieForm() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     return render(request, 'galerie/GalerieNew.html', | ||||||
|  |             { | ||||||
|  |                 'form' : form, | ||||||
|  |                 '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('../../') | ||||||
|  | 
 | ||||||
|  | @ -113,6 +113,7 @@ INSTALLED_APPS = ( | ||||||
|     # MaMweb |     # MaMweb | ||||||
|     'mamweb', |     'mamweb', | ||||||
|     'seminar', |     'seminar', | ||||||
|  |     'galerie', | ||||||
| 
 | 
 | ||||||
|     # Admin upravy: |     # Admin upravy: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -408,3 +408,57 @@ div.zadani_azad_termin { | ||||||
| 		float: none; | 		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%; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ traitlets==4.0.0 | ||||||
| 
 | 
 | ||||||
| # Django and modules | # 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-bootstrap-sass==0.0.6a0 | ||||||
| django-mptt==0.7.3 | django-mptt==0.7.3 | ||||||
| django-reversion==1.9.3 | django-reversion==1.9.3 | ||||||
|  |  | ||||||
|  | @ -17,8 +17,6 @@ | ||||||
| <em> | <em> | ||||||
|   Na galeriích ze soustředění a dalších informacích ještě pracujeme. |   Na galeriích ze soustředění a dalších informacích ještě pracujeme. | ||||||
| </em><br><br> | </em><br><br> | ||||||
| {#% if user.is_authenticated %#}{# PRACUJE SE STRANKA #} |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|   {# Projdi vsechna soustredeni #} |   {# Projdi vsechna soustredeni #} | ||||||
|   {% for soustredeni in object_list %} |   {% for soustredeni in object_list %} | ||||||
|  | @ -40,7 +38,25 @@ | ||||||
| 	<li> | 	<li> | ||||||
| 		{{soustredeni.datum_zacatku}} – {{soustredeni.datum_konce}} | 		{{soustredeni.datum_zacatku}} – {{soustredeni.datum_konce}} | ||||||
| 	</li> | 	</li> | ||||||
|  |   {# Zobrazeni odkazu na galerie #} | ||||||
|  |   {% if soustredeni.galerie_set.all %} | ||||||
|  |     {% for galerie in soustredeni.galerie_set.all %} | ||||||
|  |       {% if galerie.zobrazit == 0 or user.is_staff %} | ||||||
|  |         <li> | ||||||
|  |           <a href="../{{soustredeni.pk}}/fotogalerie/{{galerie.pk}}">FOTOGALERIE: {{galerie}}</a> | ||||||
|  |           {# TODO kdyz je titulni obrazek, tak asi i titulni obrazek #} | ||||||
|  |         </li> | ||||||
|  |       {% endif %} | ||||||
|  |     {% endfor %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if user.is_staff %} | ||||||
|  |     <li> | ||||||
|  |       <a href="../{{soustredeni.pk}}/fotogalerie/0/new/"> VYTVOŘIT NOVOU FOTOGALERII </a> | ||||||
|  |     </li> | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
| 	</ul> | 	</ul> | ||||||
|  | 
 | ||||||
|       {% if user.is_authenticated %} |       {% if user.is_authenticated %} | ||||||
|         {# popis soustredeni #} |         {# popis soustredeni #} | ||||||
|         {% if soustredeni.text %} |         {% if soustredeni.text %} | ||||||
|  | @ -61,7 +77,5 @@ | ||||||
|     Žádná soustředění zatím neproběhla! |     Žádná soustředění zatím neproběhla! | ||||||
|   {% endfor %} |   {% endfor %} | ||||||
| 
 | 
 | ||||||
| {#% else %}{% include 'seminar/pracuje_se.html' %}{% endif %#} |  | ||||||
| 
 |  | ||||||
| {% endblock %} | {% endblock %} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | from django.conf.urls import *  # NOQA | ||||||
| from django.conf.urls import patterns, url | from django.conf.urls import patterns, url | ||||||
| from . import views, export | from . import views, export | ||||||
| 
 | 
 | ||||||
|  | @ -15,7 +16,8 @@ urlpatterns = patterns('', | ||||||
| 
 | 
 | ||||||
|     url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(), |     url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(), | ||||||
|         name = 'seminar_seznam_soustredeni'), |         name = 'seminar_seznam_soustredeni'), | ||||||
|     url(r'^soustredeni/(?P<pk>\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), |     url(r'^soustredeni/probehlo/(?P<soustredeni>\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'), | ||||||
|  |     url(r'^soustredeni/(?P<soustredeni>\d+)/fotogalerie/', include('galerie.urls')), | ||||||
| 
 | 
 | ||||||
|     url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), |     url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), | ||||||
|     url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'), |     url(r'^zadani/temata/$', views.ZadaniTemataView, name='seminar_temata'), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bc. Petr Pecha
						Bc. Petr Pecha