Galerie | clone + uprava modelu galerie pecemesrdcem
Model upraven pro potreby M&M-miho webu
This commit is contained in:
parent
741040fc9c
commit
275630daee
5 changed files with 121 additions and 0 deletions
7
galerie/TODO
Normal file
7
galerie/TODO
Normal file
|
@ -0,0 +1,7 @@
|
|||
========
|
||||
| TODO |
|
||||
|======|
|
||||
|
||||
* zvolit velikosti velke a male fotky
|
||||
* vycteni EXIFu
|
||||
* razeni podle casu
|
0
galerie/__init__.py
Normal file
0
galerie/__init__.py
Normal file
114
galerie/models.py
Normal file
114
galerie/models.py
Normal file
|
@ -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 '<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()
|
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 |
Loading…
Reference in a new issue