From 03696d79ab090e51b77e54a7abe685c2f61b544e Mon Sep 17 00:00:00 2001 From: "Tomas \"Jethro\" Pokorny" Date: Wed, 8 Apr 2020 23:09:25 +0200 Subject: [PATCH] Seminar | models | Pridan nahled titulky cisla. --- seminar/migrations/0080_auto_20200408_2221.py | 24 ++++++++++ seminar/models.py | 45 ++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 seminar/migrations/0080_auto_20200408_2221.py diff --git a/seminar/migrations/0080_auto_20200408_2221.py b/seminar/migrations/0080_auto_20200408_2221.py new file mode 100644 index 00000000..f095ee06 --- /dev/null +++ b/seminar/migrations/0080_auto_20200408_2221.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.9 on 2020-04-08 20:21 + +from django.db import migrations, models +import seminar.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0079_clanek_resitelsky'), + ] + + operations = [ + migrations.AddField( + model_name='cislo', + name='titulka_nahled', + field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to='', verbose_name='Obrázek titulní strany'), + ), + migrations.AlterField( + model_name='cislo', + name='pdf', + field=models.FileField(blank=True, help_text='PDF čísla, které si mohou řešitelé stáhnout', null=True, upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + ), + ] diff --git a/seminar/models.py b/seminar/models.py index 2a1c60d6..6419e73d 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- import os import random +import subprocess +import pathlib +import tempfile from django.db import models from django.contrib import auth @@ -27,6 +30,7 @@ from unidecode import unidecode # Používám pro získání ID odkazu (ještě from polymorphic.models import PolymorphicModel + class SeminarModelBase(models.Model): class Meta: @@ -407,7 +411,11 @@ class Rocnik(SeminarModelBase): def cislo_pdf_filename(self, filename): rocnik = str(self.rocnik.rocnik) - return os.path.join('cislo', 'pdf', rocnik, '{}-{}.pdf'.format(rocnik, self.poradi)) + return pathlib.Path('cislo', 'pdf', rocnik, '{}-{}.pdf'.format(rocnik, self.poradi)) + +def cislo_png_filename(self, filename): + rocnik = str(self.rocnik.rocnik) + return pathlib.Path('cislo', 'png', rocnik, '{}-{}.png'.format(rocnik, self.poradi)) @reversion.register(ignore_duplicates=True) class Cislo(SeminarModelBase): @@ -451,7 +459,10 @@ class Cislo(SeminarModelBase): help_text='Neveřejná poznámka k číslu (plain text)') pdf = models.FileField('pdf', upload_to=cislo_pdf_filename, null=True, blank=True, - help_text='Pdf čísla, které si mohou řešitelé stáhnout') + help_text='PDF čísla, které si mohou řešitelé stáhnout') + + titulka_nahled = models.ImageField('Obrázek titulní strany', upload_to=cislo_png_filename, null=True, blank=True, + help_text='Obrázek titulní strany, generuje se automaticky') # má OneToOneField s: # CisloNode @@ -488,6 +499,35 @@ class Cislo(SeminarModelBase): return None return cs[i] + def vygeneruj_nahled(self): + VYSKA = 594 + sirka = int(VYSKA*210/297) + if not self.pdf: + return + + + # Pokud obrázek neexistuje nebo není aktuální, vytvoř jej + if not self.titulka_nahled or os.path.getmtime(self.titulka_nahled.path) < os.path.getmtime(self.pdf.path): + png_filename = pathlib.Path(tempfile.mkdtemp(), 'nahled.png') + + subprocess.call([ + "convert", + "-density", "300x300", + "-geometry", "{}x{}".format(VYSKA, sirka), + "-background", "white", + "-flatten", + "{}[0]".format(self.pdf.path), # titulní strana + png_filename + ]) + + with open(png_filename,'rb') as f: + self.titulka_nahled.save('',f,True) + + png_filename.unlink() + png_filename.parent.rmdir() + + + @classmethod def get(cls, rocnik, cislo): try: @@ -499,6 +539,7 @@ class Cislo(SeminarModelBase): def save(self, *args, **kwargs): super().save(*args, **kwargs) + self.vygeneruj_nahled() # *Node.save() aktualizuje název *Nodu. try: self.cislonode.save()