# -*- coding: utf-8 -*- import os from django.db import models from django.utils import timezone from django.conf import settings from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import force_unicode from django.core.exceptions import ObjectDoesNotExist from django.utils.text import get_valid_filename from seminar.models import Organizator import subprocess from reversion import revisions as reversion from unidecode import unidecode def generate_filename(self, filename): clean = get_valid_filename( unidecode( filename.replace('/', '-').replace('\0', '').replace(":", "_") ) ) fname = "%s_%s" % ( timezone.now().strftime('%Y-%m-%d-%H_%M'), clean) return os.path.join(settings.KOREKTURY_PDF_DIR, fname) #@reversion.register(ignore_duplicate_revision=True) #@python_2_unicode_compatible class KorekturovanePDF(models.Model): class Meta: ordering = ['-cas'] db_table = 'korekturovane_cislo' verbose_name = u'PDF k opravám' verbose_name_plural = u'PDF k opravám' #Interní ID id = models.AutoField(primary_key = True) cas = models.DateTimeField(u'čas vložení PDF',default=timezone.now,help_text = 'Čas vložení PDF') nazev = models.CharField(u'název PDF',blank = True,max_length=50, help_text='Název (např. 22.1 verze 4) korekturovaného PDF') komentar = models.TextField(u'komentář k PDF',blank = True, help_text='Komentář ke korekturovanému PDF (např. na co se zaměřit)') pdf = models.FileField(u'PDF', upload_to = generate_filename) org = models.ForeignKey(Organizator, blank=True, help_text='Zodpovědný organizátor za obsah', null=True, default=None) stran = models.IntegerField(u'počet stran', help_text='Počet stran PDF', default=0) STATUS_PRIDAVANI = 'pridavani' STATUS_ZANASENI = 'zanaseni' STATUS_ZASTARALE = 'zastarale' STATUS_CHOICES = ( (STATUS_PRIDAVANI, u'Přidávání korektur'), (STATUS_ZANASENI, u'Korektury jsou zanášeny'), (STATUS_ZASTARALE, u'Stará verze, nekorigovat'), ) status = models.CharField(u'stav PDF',max_length=16, choices=STATUS_CHOICES, blank=False, default = STATUS_PRIDAVANI) #TODO Nepovinný foreign key k číslu def get_prefix(self): """Vrať řetězec, ke kterému se připojí číslo a .png""" # vrátíme jméno souboru bez cesty return os.path.basename(self.pdf.file.name) def convert(self): """Vytvoří jedno png za každou stranu pdf a uloží se""" dirname = os.path.join(settings.MEDIA_ROOT, settings.KOREKTURY_IMG_DIR) if not os.path.exists(dirname): os.mkdir(dirname) self.stran = 0 while True: res = subprocess.call([ "convert", "-density", "180x180", "-geometry", " 1024x1448", "%s[%d]" % (self.pdf.path, self.stran), os.path.join( dirname, "%s-%d.png" % (self.get_prefix(), self.stran) ) ]) if res == 1: break self.stran += 1 # Změnil se počet stran, ukládáme super(KorekturovanePDF, self).save() def save(self): # Pokud se nezmenilo PDF, tak nepregenerovavej nahledy try: original = KorekturovanePDF.objects.get(pk=self.pk) if original.pdf == self.pdf: super(KorekturovanePDF, self).save() return except ObjectDoesNotExist: pass # uložíme nahrávané pdf super(KorekturovanePDF, self).save() # uložíme png a změněný počet stran self.convert() @reversion.register(ignore_duplicate_revision=True) @python_2_unicode_compatible class Oprava(models.Model): class Meta: db_table = 'opravy' verbose_name = u'Oprava' verbose_name_plural = u'Opravy' ordering = ['y','x'] #Interní ID id = models.AutoField(primary_key = True) pdf = models.ForeignKey(KorekturovanePDF, default=-1) strana = models.IntegerField(u'strana s opravou', help_text='Strana s opravou (od 0)') x = models.IntegerField(u'x-ová souřadnice bugu') y = models.IntegerField(u'y-ová souřadnice bugu') STATUS_K_OPRAVE = 'k_oprave' STATUS_OPRAVENO = 'opraveno' STATUS_NENI_CHYBA = 'neni_chyba' STATUS_K_ZANESENI = 'k_zaneseni' STATUS_CHOICES = ( (STATUS_K_OPRAVE, u'K opravě'), (STATUS_OPRAVENO, u'Opraveno'), (STATUS_NENI_CHYBA, u'Není chyba'), (STATUS_K_ZANESENI, u'K zanesení do TeXu'), ) status = models.CharField(u'stav opravy',max_length=16, choices=STATUS_CHOICES, blank=False, default = STATUS_K_OPRAVE) autor = models.ForeignKey(Organizator, blank = True, help_text='Autor opravy', null = True) text = models.TextField(u'text opravy',blank = True, help_text='Text opravy') # def __init__(self,dictionary): # for k,v in dictionary.items(): # setattr(self,k,v) def __str__(self): return force_unicode(u'%s od %s: %s'%(self.status,self.autor,self.text)) @reversion.register(ignore_duplicate_revision=True) @python_2_unicode_compatible class Komentar(models.Model): class Meta: db_table = 'komentare' verbose_name = u'Komentář k opravě' verbose_name_plural = u'Komentáře k opravě' ordering = ['cas'] #Interní ID id = models.AutoField(primary_key = True) cas = models.DateTimeField(u'čas komentáře',default=timezone.now,help_text = 'Čas zadání komentáře') oprava = models.ForeignKey(Oprava) autor = models.ForeignKey(Organizator, blank = True, help_text = u'Autor komentáře', null = True) text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře') def __str__(self): return force_unicode(u'%s od %s: %s'%(self.cas,self.autor,self.text))