1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2025-06-21 07:18:25 +02:00

Send solutions

This commit is contained in:
Yohann D'ANELLO
2020-05-04 23:37:21 +02:00
parent 9499e10524
commit 26eacad2fd
9 changed files with 118 additions and 21 deletions

View File

@ -1,7 +1,7 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from member.models import TFJMUser
from member.models import TFJMUser, Solution, Synthesis
from tfjm.inputs import DatePickerInput, DateTimePickerInput, AmountInput
from tournament.models import Tournament, Team
@ -42,3 +42,20 @@ class JoinTeam(forms.Form):
label=_("Access code"),
max_length=6,
)
class SolutionForm(forms.ModelForm):
problem = forms.ChoiceField(
label=_("Problem"),
choices=[(str(i), _("Problem #{problem:d}").format(problem=i)) for i in range(1, 9)],
)
class Meta:
model = Solution
fields = ('file', 'problem',)
class SynthesisForm(forms.ModelForm):
class Meta:
model = Synthesis
fields = ('file', 'dest',)

View File

@ -2,6 +2,7 @@ import django_tables2 as tables
from django.utils.translation import gettext as _
from django_tables2 import A
from member.models import Solution
from .models import Tournament, Team
@ -41,6 +42,39 @@ class TeamTable(tables.Table):
class SolutionTable(tables.Table):
team = tables.LinkColumn(
"tournament:team_detail",
args=[A("team.pk")],
)
tournament = tables.LinkColumn(
"tournament:detail",
args=[A("team.tournament.pk")],
accessor=A("team.tournament"),
)
file = tables.LinkColumn(
"document",
args=[A("file")],
attrs={
"a": {
"data-turbolinks": "false",
}
}
)
def render_file(self):
return _("Download")
class Meta:
model = Solution
fields = ("team", "tournament", "problem", "uploaded_at", "file", )
attrs = {
'class': 'table table-condensed table-striped table-hover'
}
class SynthesisTable(tables.Table):
file = tables.LinkColumn(
"document",
args=[A("file")],
@ -56,7 +90,7 @@ class SolutionTable(tables.Table):
class Meta:
model = Team
fields = ("team", "team.tournament", "problem", "uploaded_at", "file", )
fields = ("team", "team.tournament", "round", "dest", "uploaded_at", "file", )
attrs = {
'class': 'table table-condensed table-striped table-hover'
}

View File

@ -1,3 +1,4 @@
import random
import zipfile
from io import BytesIO
@ -9,10 +10,11 @@ from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, CreateView, UpdateView
from django.views.generic.edit import FormMixin, BaseFormView
from django_tables2.views import SingleTableView
from member.models import TFJMUser, Solution
from .forms import TournamentForm, OrganizerForm, TeamForm
from .forms import TournamentForm, OrganizerForm, TeamForm, SolutionForm
from .models import Tournament, Team
from .tables import TournamentTable, TeamTable, SolutionTable
@ -96,7 +98,8 @@ class TeamDetailView(LoginRequiredMixin, DetailView):
model = Team
def dispatch(self, request, *args, **kwargs):
if not request.user.admin and self.request.user not in self.get_object().tournament.organizers:
if not request.user.admin and self.request.user not in self.get_object().tournament.organizers.all()\
and self.get_object() != request.user.team:
raise PermissionDenied
return super().dispatch(request, *args, **kwargs)
@ -151,9 +154,10 @@ class AddOrganizerView(AdminMixin, CreateView):
template_name = "tournament/add_organizer.html"
class SolutionsView(TeamMixin, SingleTableView):
class SolutionsView(TeamMixin, BaseFormView, SingleTableView):
model = Solution
table_class = SolutionTable
form_class = SolutionForm
template_name = "tournament/solutions_list.html"
extra_context = dict(title=_("Solutions"))
@ -175,7 +179,7 @@ class SolutionsView(TeamMixin, SingleTableView):
.format(team=str(request.user.team)).replace(" ", "%20"))
return resp
return self.get(request, *args, **kwargs)
return super().post(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@ -188,9 +192,33 @@ class SolutionsView(TeamMixin, SingleTableView):
def get_queryset(self):
qs = super().get_queryset()
if not self.request.user.admin:
qs = qs.filter(team__tournament__organizers=self.request.user)
qs = qs.filter(team=self.request.user.team)
return qs.order_by('team__tournament__date_start', 'team__tournament__name', 'team__trigram', 'problem',)
def form_valid(self, form):
solution = form.instance
solution.team = self.request.user.team
solution.final = solution.team.selected_for_final
prev_sol = Solution.objects.filter(problem=solution.problem, team=solution.team, final=solution.final)
for sol in prev_sol.all():
sol.delete()
alphabet = "0123456789abcdefghijklmnopqrstuvwxyz0123456789"
id = ""
for _ in range(64):
id += random.choice(alphabet)
solution.file.name = id
solution.save()
return super().form_valid(form)
def form_invalid(self, form):
print(form.errors)
return super().form_invalid(form)
def get_success_url(self):
return reverse_lazy("tournament:solutions")
class SolutionsOrgaListView(AdminMixin, SingleTableView):
model = Solution
@ -202,7 +230,7 @@ class SolutionsOrgaListView(AdminMixin, SingleTableView):
if "tournament_zip" in request.POST:
tournament = Tournament.objects.get(pk=request.POST["tournament_zip"][0])
solutions = tournament.solutions
if not request.user.admin and request.user not in tournament.organizers:
if not request.user.admin and request.user not in tournament.organizers.all():
raise PermissionDenied
out = BytesIO()