@ -1,6 +1,9 @@
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import os
import os
import random
import random
import subprocess
import pathlib
import tempfile
from django . db import models
from django . db import models
from django . contrib import auth
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
from polymorphic . models import PolymorphicModel
class SeminarModelBase ( models . Model ) :
class SeminarModelBase ( models . Model ) :
class Meta :
class Meta :
@ -407,7 +411,11 @@ class Rocnik(SeminarModelBase):
def cislo_pdf_filename ( self , filename ) :
def cislo_pdf_filename ( self , filename ) :
rocnik = str ( self . rocnik . rocnik )
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 )
@reversion . register ( ignore_duplicates = True )
class Cislo ( SeminarModelBase ) :
class Cislo ( SeminarModelBase ) :
@ -451,7 +459,10 @@ class Cislo(SeminarModelBase):
help_text = ' Neveřejná poznámka k číslu (plain text) ' )
help_text = ' Neveřejná poznámka k číslu (plain text) ' )
pdf = models . FileField ( ' pdf ' , upload_to = cislo_pdf_filename , null = True , blank = True ,
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:
# má OneToOneField s:
# CisloNode
# CisloNode
@ -488,6 +499,35 @@ class Cislo(SeminarModelBase):
return None
return None
return cs [ i ]
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
@classmethod
def get ( cls , rocnik , cislo ) :
def get ( cls , rocnik , cislo ) :
try :
try :
@ -499,6 +539,7 @@ class Cislo(SeminarModelBase):
def save ( self , * args , * * kwargs ) :
def save ( self , * args , * * kwargs ) :
super ( ) . save ( * args , * * kwargs )
super ( ) . save ( * args , * * kwargs )
self . vygeneruj_nahled ( )
# *Node.save() aktualizuje název *Nodu.
# *Node.save() aktualizuje název *Nodu.
try :
try :
self . cislonode . save ( )
self . cislonode . save ( )