diff --git a/apps/participation/forms.py b/apps/participation/forms.py
index 8f7f649..0a7b4cc 100644
--- a/apps/participation/forms.py
+++ b/apps/participation/forms.py
@@ -9,7 +9,7 @@ from django.core.exceptions import ValidationError
from django.utils import formats
from django.utils.translation import gettext_lazy as _
-from .models import Participation, Team, Tournament, Solution
+from .models import Participation, Team, Tournament, Solution, Pool
class TeamForm(forms.ModelForm):
@@ -123,3 +123,9 @@ class SolutionForm(forms.ModelForm):
class Meta:
model = Solution
fields = ('problem', 'file',)
+
+
+class PoolForm(forms.ModelForm):
+ class Meta:
+ model = Pool
+ fields = ('tournament', 'round', 'juries',)
diff --git a/apps/participation/migrations/0008_auto_20210113_1700.py b/apps/participation/migrations/0008_auto_20210113_1700.py
new file mode 100644
index 0000000..9beea1c
--- /dev/null
+++ b/apps/participation/migrations/0008_auto_20210113_1700.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.11 on 2021-01-13 16:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('participation', '0007_auto_20210112_1801'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pool',
+ name='round',
+ field=models.PositiveSmallIntegerField(choices=[(1, 'Round 1'), (2, 'Round 2')], verbose_name='round'),
+ ),
+ ]
diff --git a/apps/participation/models.py b/apps/participation/models.py
index af6d366..79303b2 100644
--- a/apps/participation/models.py
+++ b/apps/participation/models.py
@@ -288,6 +288,10 @@ class Pool(models.Model):
round = models.PositiveSmallIntegerField(
verbose_name=_("round"),
+ choices=[
+ (1, format_lazy(_("Round {round}"), round=1)),
+ (2, format_lazy(_("Round {round}"), round=2)),
+ ]
)
participations = models.ManyToManyField(
@@ -306,6 +310,9 @@ class Pool(models.Model):
def solutions(self):
return Solution.objects.filter(participation__in=self.participations, final_solution=self.tournament.final)
+ def get_absolute_url(self):
+ return reverse_lazy("participation:pool_detail", args=(self.pk,))
+
def __str__(self):
return _("Pool {round} for tournament {tournament} with teams {teams}")\
.format(round=self.round,
diff --git a/apps/participation/tables.py b/apps/participation/tables.py
index 8f4821e..8cbb34d 100644
--- a/apps/participation/tables.py
+++ b/apps/participation/tables.py
@@ -81,12 +81,13 @@ class PoolTable(tables.Table):
teams = tables.LinkColumn(
'participation:pool_detail',
args=[tables.A('id')],
- verbose_name=_("teams"),
- accessor=None,
+ verbose_name=_("teams").capitalize,
+ empty_values=(),
)
def render_teams(self, record):
- return ", ".join(participation.team.trigram for participation in record.participations.all())
+ return ", ".join(participation.team.trigram for participation in record.participations.all()) \
+ or _("No defined team")
class Meta:
attrs = {
diff --git a/apps/participation/templates/participation/participation_detail.html b/apps/participation/templates/participation/participation_detail.html
index 1f63fa4..aa57347 100644
--- a/apps/participation/templates/participation/participation_detail.html
+++ b/apps/participation/templates/participation/participation_detail.html
@@ -50,7 +50,6 @@
{% endblock %}
diff --git a/apps/participation/urls.py b/apps/participation/urls.py
index f67deec..e04784e 100644
--- a/apps/participation/urls.py
+++ b/apps/participation/urls.py
@@ -5,9 +5,9 @@ from django.urls import path
from django.views.generic import TemplateView
from .views import CreateTeamView, JoinTeamView, \
- MyParticipationDetailView, MyTeamDetailView, ParticipationDetailView, TeamAuthorizationsView, \
- TeamDetailView, TeamLeaveView, TeamListView, TeamUpdateView, TournamentCreateView, TournamentDetailView, \
- TournamentListView, TournamentUpdateView, SolutionUploadView
+ MyParticipationDetailView, MyTeamDetailView, ParticipationDetailView, PoolCreateView, PoolDetailView, \
+ PoolUpdateView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, TeamUpdateView, \
+ TournamentCreateView, TournamentDetailView, TournamentListView, TournamentUpdateView, SolutionUploadView
app_name = "participation"
@@ -28,5 +28,8 @@ urlpatterns = [
path("tournament/create/", TournamentCreateView.as_view(), name="tournament_create"),
path("tournament//", TournamentDetailView.as_view(), name="tournament_detail"),
path("tournament//update/", TournamentUpdateView.as_view(), name="tournament_update"),
+ path("pools/create/", PoolCreateView.as_view(), name="pool_create"),
+ path("pools//", PoolDetailView.as_view(), name="pool_detail"),
+ path("pools//update/", PoolUpdateView.as_view(), name="pool_update"),
path("chat/", TemplateView.as_view(template_name="participation/chat.html"), name="chat")
]
diff --git a/apps/participation/views.py b/apps/participation/views.py
index af06527..f5731b6 100644
--- a/apps/participation/views.py
+++ b/apps/participation/views.py
@@ -23,9 +23,9 @@ from tfjm.lists import get_sympa_client
from tfjm.matrix import Matrix
from tfjm.views import AdminMixin
-from .forms import JoinTeamForm, ParticipationForm, RequestValidationForm, SolutionForm, TeamForm, TournamentForm, \
- ValidateParticipationForm
-from .models import Participation, Team, Tournament, Solution
+from .forms import JoinTeamForm, ParticipationForm, PoolForm, RequestValidationForm, SolutionForm, TeamForm,\
+ TournamentForm, ValidateParticipationForm
+from .models import Participation, Team, Tournament, Solution, Pool
from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable
@@ -468,3 +468,17 @@ class SolutionUploadView(LoginRequiredMixin, FormView):
def get_success_url(self):
return reverse_lazy("participation:participation_detail", args=(self.participation.pk,))
+
+
+class PoolCreateView(AdminMixin, CreateView):
+ model = Pool
+ form_class = PoolForm
+
+
+class PoolDetailView(AdminMixin, DetailView):
+ model = Pool
+
+
+class PoolUpdateView(AdminMixin, UpdateView):
+ model = Pool
+ form_class = PoolForm