104 lines
2.9 KiB
Python
104 lines
2.9 KiB
Python
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)
|