import reversion from django.db import models from django.utils import timezone from django.contrib.sites.shortcuts import get_current_site from django.urls import reverse_lazy from django.db.models import Sum from mamweb.models.base import SeminarModelBase from personalni.models.resitel import Resitel from tvorba.models.problem import Problem from tvorba.models.deadline import Deadline @reversion.register(ignore_duplicates=True) class Reseni(SeminarModelBase): class Meta: db_table = 'seminar_reseni' verbose_name = 'Řešení' verbose_name_plural = 'Řešení' # ordering = ['-problem', 'resitele'] # FIXME: Takhle to chceme, ale nefunguje to. ordering = ['-cas_doruceni'] # Interní ID id = models.AutoField(primary_key=True) # Ke každé dvojici řešní a problém existuje nanejvýš jedno hodnocení, doplnění vazby. problem = models.ManyToManyField( Problem, verbose_name='problém', help_text='Problém', through='Hodnoceni', ) resitele = models.ManyToManyField( Resitel, verbose_name='autoři řešení', help_text='Seznam autorů řešení', through='Reseni_Resitele', ) cas_doruceni = models.DateTimeField( 'čas_doručení', default=timezone.now, blank=True, ) FORMA_PAPIR = 'papir' FORMA_EMAIL = 'email' FORMA_UPLOAD = 'upload' FORMA_CHOICES = [ (FORMA_PAPIR, 'Papírové řešení'), (FORMA_EMAIL, 'Emailem'), (FORMA_UPLOAD, 'Upload přes web'), ] forma = models.CharField( 'forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, default=FORMA_EMAIL, ) text_cely = models.OneToOneField( 'ReseniNode', verbose_name='Plná verze textu řešení', blank=True, null=True, related_name="reseni_cely_set", on_delete=models.PROTECT, ) poznamka = models.TextField( 'neveřejná poznámka', blank=True, help_text='Neveřejná poznámka k řešení (plain text)', ) zverejneno = models.BooleanField( 'řešení zveřejněno', default=False, help_text='Udává, zda je řešení zveřejněno', ) def verejne_url(self): return str(reverse_lazy('odevzdavatko_detail_reseni', args=[self.id])) def absolute_url(self): return "https://" + str(get_current_site(None)) + self.verejne_url() # má OneToOneField s: # Konfera # má ForeignKey s: # Hodnoceni def sum_body(self): return self.hodnoceni_set.all().aggregate(Sum('body'))["body__sum"] def __str__(self): return "{}({}): {}({})".format( self.resitele.first(), len(self.resitele.all()), self.problem.first(), len(self.problem.all()) ) # NOTE: Potenciální DB HOG (bez select_related) def deadline_reseni(self): return Deadline.objects.filter(deadline__gte=self.cas_doruceni).order_by("deadline").first() ## Pravdepodobne uz nebude potreba: # def save(self, *args, **kwargs): # if ((self.cislo_body is None) and (self.problem.cislo_reseni) and # (self.problem.typ == Problem.TYP_ULOHA)): # self.cislo_body = self.problem.cislo_reseni # super(Reseni, self).save(*args, **kwargs)