import os.path
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from oioioi.base.utils.deps import check_django_app_dependencies
from oioioi.contests.date_registration import date_registry
from oioioi.contests.models import Contest, ProblemInstance, Submission
from oioioi.filetracker.fields import FileField
check_django_app_dependencies(__name__, ['oioioi.contests', 'oioioi.programs'])
[docs]def make_submission_filename(instance, filename):
if not instance.id:
instance.save()
return 'mailsubmissions/%s/%d%s' % (
instance.problem_instance.contest.id,
instance.id,
os.path.splitext(filename)[1],
)
[docs]class MailSubmission(models.Model):
[docs] problem_instance = models.ForeignKey(
ProblemInstance, verbose_name=_("problem"), on_delete=models.CASCADE
)
[docs] user = models.ForeignKey(
User, blank=True, null=True, verbose_name=_("user"), on_delete=models.CASCADE
)
[docs] date = models.DateTimeField(
default=timezone.now, blank=True, verbose_name=_("date"), db_index=True
)
[docs] source_file = FileField(upload_to=make_submission_filename)
[docs] submission = models.ForeignKey(
Submission,
blank=True,
null=True,
verbose_name=_("related submission"),
on_delete=models.CASCADE,
)
[docs] accepted_by = models.ForeignKey(
User,
blank=True,
null=True,
verbose_name=_("accepted by"),
related_name='+',
on_delete=models.SET_NULL,
)
@date_registry.register(
'start_date', name_generator=(lambda obj: _("Mail submissions start")), order=0
)
@date_registry.register(
'end_date', name_generator=(lambda obj: _("Mail submissions end")), order=0
)
[docs]class MailSubmissionConfig(models.Model):
[docs] contest = models.OneToOneField(
Contest, related_name='mail_submission_config', on_delete=models.CASCADE
)
[docs] enabled = models.BooleanField(verbose_name=_("enabled"), default=False)
[docs] start_date = models.DateTimeField(verbose_name=_("start date"))
[docs] end_date = models.DateTimeField(blank=True, null=True, verbose_name=_("end date"))
[docs] printout_text = models.TextField(
verbose_name=_("printout text"),
help_text=_(
"LaTeX-formatted text to show on the printed document "
"sent by regular post; usually contains the instruction on "
"how, where and when to send it."
),
default=_(
"This document confirms that you have uploaded a file "
"for postal submission on our server. To have this file "
"judged, send this document by mail to us."
),
)