mamweb/odevzdavatko/models/reseni.py

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)