Source code for oioioi.teams.models

from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator
from django.db import models
from django.utils.translation import gettext_lazy as _

from oioioi.base.fields import EnumField, EnumRegistry
from oioioi.base.utils import generate_key
from oioioi.contests.models import Contest


[docs]class Team(models.Model):
[docs] name = models.CharField(max_length=50, verbose_name=_("team name"))
[docs] login = models.CharField(max_length=50, verbose_name=_("login"))
[docs] user = models.OneToOneField( User, primary_key=True, verbose_name=_("user"), on_delete=models.CASCADE )
[docs] contest = models.ForeignKey(Contest, on_delete=models.CASCADE)
[docs] join_key = models.CharField(max_length=40)
[docs] def save(self, *args, **kwargs): if not hasattr(self, 'user'): self.user = User.objects.create_user(self.login, 'team user', '') self.user.first_name = self.name self.user.save() else: self.user.username = self.login self.user.first_name = self.name self.user.save() if not self.join_key: self.join_key = generate_key() super(Team, self).save(*args, **kwargs)
[docs]class TeamMembership(models.Model): """Represents a realation between an user and a team."""
[docs] user = models.ForeignKey(User, on_delete=models.CASCADE)
[docs] team = models.ForeignKey(Team, related_name='members', on_delete=models.CASCADE)
[docs] class Meta(object):
[docs] unique_together = ("user", "team")
[docs] def validate_unique(self, *args, **kwargs): super(TeamMembership, self).validate_unique(*args, **kwargs) query = TeamMembership.objects.filter( user=self.user, team__contest=self.team.contest ) # Excluding unsaved object excludes everything see: # https://code.djangoproject.com/ticket/25467 if self.team.pk is not None: query = query.exclude(team=self.team) if query.exists(): raise ValidationError({'user': {"The user is already in another team"}})
[docs]teams_list_visibility_options = EnumRegistry()
teams_list_visibility_options.register('PUBLIC', _("Visible for all")) teams_list_visibility_options.register('YES', _("Visible only for registered users")) teams_list_visibility_options.register('NO', _("Not visible"))
[docs]class TeamsConfig(models.Model):
[docs] contest = models.OneToOneField(Contest, on_delete=models.CASCADE)
[docs] enabled = models.BooleanField(default=False)
[docs] max_team_size = models.IntegerField(default=3, validators=[MinValueValidator(1)])
[docs] modify_begin_date = models.DateTimeField( verbose_name=_("team modification begin date"), blank=True, null=True )
[docs] modify_end_date = models.DateTimeField( verbose_name=_("team modification end date"), blank=True, null=True )
[docs] teams_list_visible = EnumField( teams_list_visibility_options, default='NO', verbose_name=_("teams list visibility"), )
[docs] class Meta(object):
[docs] verbose_name = _("teams configuration")
[docs] verbose_name_plural = _("teams configurations")