From 1777656d27db2b06e48cfe7e440381128921ded8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 10:48:06 +0200 Subject: [PATCH 1/3] Organizator | model --- seminar/models.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/seminar/models.py b/seminar/models.py index 04890ef9..c731fa4c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -12,6 +12,10 @@ from django.utils.text import slugify from django.core.urlresolvers import reverse from django.core.cache import cache +from PIL import Image +import os +from cStringIO import StringIO +from django.core.files.base import ContentFile from django_countries.fields import CountryField from solo.models import SingletonModel @@ -637,3 +641,68 @@ class Novinky(models.Model): verbose_name = 'Novinka' verbose_name_plural = 'Novinky' + +@python_2_unicode_compatible +class Organizator(models.Model): + user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name='Osoba', + help_text = 'Vyber účet spřažený s organizátorem.') + prezdivka = models.CharField('Přezdívka', max_length = 32, + null = True, blank = True) + organizuje_od_roku = models.IntegerField('Organizuje od roku', + null = True, blank = True) + organizuje_do_roku = models.IntegerField('Organizuje do roku', + null = True, blank = True) + studuje = models.CharField('Studuje', max_length = 256, + null = True, blank = True) + strucny_popis_organizatora = models.TextField('Stručný popis organizátora', + null = True, blank = True) + foto = models.ImageField('Fotografie organizátora', + upload_to='image_organizatori/%Y/', null = True, blank = True, + help_text = 'Vlož fotografii organizátora o libovoné velikosti') + foto_male = models.ImageField(upload_to='image_organizatori/male/%Y/', + null = True, blank = True, editable = False) + + def __str__(self): + return str(self.user) + + class Meta: + verbose_name = 'Organizátor' + verbose_name_plural = 'Organizátoři' + + def save(self): + original = Image.open(self.foto) + jmeno = os.path.basename(self.foto.file.name) + Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) + Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) + super(Organizator, self).save() + + @staticmethod + def _vyrobMiniaturu(original, jmeno, maximum, field): + zmensenina = Organizator._zmensiObrazek(original, maximum) + f = StringIO() + try: + zmensenina.save(f, format=original.format) + data = ContentFile(f.getvalue()) + finally: + f.close() + field.save(jmeno, data, save = False) + + @staticmethod + def _zmensiObrazek(original, maximum): + """Preskaluje obrazek tak, aby byl zachovan pomer stran + a zadny rozmer nepresahoval maxRozmer. Pokud zadny rozmer + nepresahuje maxRozmer, tak vrati puvodni obrazek + (tj. nedojde ke zvetseni obrazku).""" + novaVelikost = Organizator._zmensiVelikost(original.size, maximum) + return original.resize(novaVelikost, Image.ANTIALIAS) + + @staticmethod + def _zmensiVelikost(velikost, maximum): + maximum = float(maximum) + w, h = velikost + soucasneMaximum = max(w, h) + if soucasneMaximum <= maximum: + return velikost + pomer = maximum/soucasneMaximum + return (int(w * pomer), int(h * pomer)) + From e6b0efe1a73dd555fc6f4f019979e5f262538510 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 11:01:39 +0200 Subject: [PATCH 2/3] Organizatori | admin + odstraneni chyby, kdyz chybi obrazek organizatora --- seminar/admin.py | 10 ++++++++-- seminar/models.py | 9 +++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index dcb7797d..6ca5d238 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -8,7 +8,7 @@ from ckeditor.widgets import CKEditorWidget from django.db.models import Count from django.db import models -from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Novinky +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Novinky, Organizator import autocomplete_light @@ -329,5 +329,11 @@ class NovinkyAdminForm(forms.ModelForm): class NovinkyAdmin(admin.ModelAdmin): form = NovinkyAdminForm - admin.site.register(Novinky, NovinkyAdmin) + +### Organizator + +@admin.register(Organizator) +class OrganizatorAdmin(admin.ModelAdmin): + list_filter = ['organizuje_do_roku'] + diff --git a/seminar/models.py b/seminar/models.py index c731fa4c..23578780 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -670,10 +670,11 @@ class Organizator(models.Model): verbose_name_plural = 'Organizátoři' def save(self): - original = Image.open(self.foto) - jmeno = os.path.basename(self.foto.file.name) - Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) - Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) + if self.foto: + original = Image.open(self.foto) + jmeno = os.path.basename(self.foto.file.name) + Organizator._vyrobMiniaturu(original, jmeno, 500, self.foto) + Organizator._vyrobMiniaturu(original, jmeno, 200, self.foto_male) super(Organizator, self).save() @staticmethod From fa6975d2efe2a8514e2e5feb7fb3656458dd57d8 Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Thu, 25 Jun 2015 11:03:03 +0200 Subject: [PATCH 3/3] Organizatori | migrace --- seminar/migrations/0024_add_organizator.py | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 seminar/migrations/0024_add_organizator.py diff --git a/seminar/migrations/0024_add_organizator.py b/seminar/migrations/0024_add_organizator.py new file mode 100644 index 00000000..f9bf2cb8 --- /dev/null +++ b/seminar/migrations/0024_add_organizator.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('seminar', '0023_add_novinky'), + ] + + operations = [ + migrations.CreateModel( + name='Organizator', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('prezdivka', models.CharField(max_length=32, null=True, verbose_name=b'P\xc5\x99ezd\xc3\xadvka', blank=True)), + ('organizuje_od_roku', models.IntegerField(null=True, verbose_name=b'Organizuje od roku', blank=True)), + ('organizuje_do_roku', models.IntegerField(null=True, verbose_name=b'Organizuje do roku', blank=True)), + ('studuje', models.CharField(max_length=256, null=True, verbose_name=b'Studuje', blank=True)), + ('strucny_popis_organizatora', models.TextField(null=True, verbose_name=b'Stru\xc4\x8dn\xc3\xbd popis organiz\xc3\xa1tora', blank=True)), + ('foto', models.ImageField(help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovon\xc3\xa9 velikosti', upload_to=b'image_organizatori/%Y/', null=True, verbose_name=b'Fotografie organiz\xc3\xa1tora', blank=True)), + ('foto_male', models.ImageField(upload_to=b'image_organizatori/male/%Y/', null=True, editable=False, blank=True)), + ('user', models.OneToOneField(verbose_name=b'Osoba', to=settings.AUTH_USER_MODEL, help_text=b'Vyber \xc3\xba\xc4\x8det sp\xc5\x99a\xc5\xbeen\xc3\xbd s organiz\xc3\xa1torem.')), + ], + options={ + 'verbose_name': 'Organiz\xe1tor', + 'verbose_name_plural': 'Organiz\xe1to\u0159i', + }, + bases=(models.Model,), + ), + ]