From f01537719b906d8d53c57b7236ca194f24cfeb7d Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Tue, 12 May 2020 18:36:36 +0200 Subject: [PATCH] Limit upload file size --- apps/tournament/forms.py | 31 +++++++++++++- locale/fr/LC_MESSAGES/django.po | 74 +++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 32 deletions(-) diff --git a/apps/tournament/forms.py b/apps/tournament/forms.py index 4c4353d..901b97a 100644 --- a/apps/tournament/forms.py +++ b/apps/tournament/forms.py @@ -3,6 +3,7 @@ import re from django import forms from django.db.models import Q +from django.template.defaultfilters import filesizeformat from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -139,9 +140,23 @@ class SolutionForm(forms.ModelForm): problem = forms.ChoiceField( label=_("Problem"), - choices=[(str(i), _("Problem #{problem:d}").format(problem=i)) for i in range(1, 9)], + choices=[(str(i), _("Problem #%(problem)d") % {"problem": i}) for i in range(1, 9)], ) + def clean_file(self): + content = self.cleaned_data['file'] + content_type = content.content_type + if content_type in ["application/pdf"]: + if content.size > 5 * 2 ** 20: + raise forms.ValidationError( + _('Please keep filesize under %(max_size)s. Current filesize %(current_size)s') % { + "max_size": filesizeformat(2 * 2 ** 20), + "current_size": filesizeformat(content.size) + }) + else: + raise forms.ValidationError(_('The file should be a PDF file.')) + return content + class Meta: model = Solution fields = ('file', 'problem',) @@ -152,6 +167,20 @@ class SynthesisForm(forms.ModelForm): Form to upload a synthesis. """ + def clean_file(self): + content = self.cleaned_data['file'] + content_type = content.content_type + if content_type in ["application/pdf"]: + if content.size > 5 * 2 ** 20: + raise forms.ValidationError( + _('Please keep filesize under %(max_size)s. Current filesize %(current_size)s') % { + "max_size": filesizeformat(2 * 2 ** 20), + "current_size": filesizeformat(content.size) + }) + else: + raise forms.ValidationError(_('The file should be a PDF file.')) + return content + class Meta: model = Synthesis fields = ('file', 'source', 'round',) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index fd9a628..ccc1229 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TFJM2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 14:17+0200\n" +"POT-Creation-Date: 2020-05-12 18:25+0200\n" "PO-Revision-Date: 2020-04-29 02:30+0000\n" "Last-Translator: Yohann D'ANELLO \n" "Language-Team: fr \n" @@ -233,7 +233,8 @@ msgstr "solutions" #: apps/member/models.py:291 #, python-brace-format msgid "Solution of team {trigram} for problem {problem} for final" -msgstr "Solution de l'équipe {trigram} pour le problème {problem} pour la finale" +msgstr "" +"Solution de l'équipe {trigram} pour le problème {problem} pour la finale" #: apps/member/models.py:294 #, python-brace-format @@ -330,7 +331,7 @@ msgstr "Tous les profils" msgid "Orphaned profiles" msgstr "Profils orphelins" -#: apps/member/views.py:244 apps/tournament/forms.py:22 templates/base.html:83 +#: apps/member/views.py:244 apps/tournament/forms.py:23 templates/base.html:83 msgid "Organizers" msgstr "Organisateurs" @@ -341,85 +342,96 @@ msgstr "Organisateurs" msgid "tournament" msgstr "tournoi" -#: apps/tournament/forms.py:30 +#: apps/tournament/forms.py:31 msgid "This tournament already exists." msgstr "Ce tournoi existe déjà." -#: apps/tournament/forms.py:32 +#: apps/tournament/forms.py:33 msgid "The final tournament was already defined." msgstr "Le tournoi de la finale est déjà défini." -#: apps/tournament/forms.py:64 +#: apps/tournament/forms.py:65 msgid "This organizer already exist." msgstr "Cet organisateur existe déjà." -#: apps/tournament/forms.py:93 +#: apps/tournament/forms.py:94 msgid "The trigram must be composed of three upcase letters." msgstr "Le trigramme doit être composé de trois lettres en majuscules." -#: apps/tournament/forms.py:97 +#: apps/tournament/forms.py:98 msgid "This trigram is already used." msgstr "Ce trigramme est déjà utilisé." -#: apps/tournament/forms.py:100 +#: apps/tournament/forms.py:101 msgid "This name is already used." msgstr "Ce nom est déjà utilisé." -#: apps/tournament/forms.py:103 +#: apps/tournament/forms.py:104 msgid "This tournament is already closed." msgstr "Ce tournoi est déjà fermé." -#: apps/tournament/forms.py:114 +#: apps/tournament/forms.py:115 msgid "Access code" msgstr "Code d'accès" -#: apps/tournament/forms.py:122 +#: apps/tournament/forms.py:123 msgid "The access code must be composed of 6 alphanumeric characters." msgstr "Le code d'accès doit être composé de 6 caractères alphanumériques." -#: apps/tournament/forms.py:126 +#: apps/tournament/forms.py:127 msgid "This access code is invalid." msgstr "Ce code d'accès est invalide." -#: apps/tournament/forms.py:129 +#: apps/tournament/forms.py:130 msgid "The team is already validated." msgstr "L'équipe est déjà validée." -#: apps/tournament/forms.py:141 +#: apps/tournament/forms.py:142 msgid "Problem" msgstr "Problème" -#: apps/tournament/forms.py:142 -#, python-brace-format -msgid "Problem #{problem:d}" -msgstr "Problème n°{problem:d}" +#: apps/tournament/forms.py:143 +#, python-format +msgid "Problem #%(problem)d" +msgstr "Problème n°%(problem)d" -#: apps/tournament/forms.py:168 apps/tournament/forms.py:181 -#: apps/tournament/forms.py:194 +#: apps/tournament/forms.py:152 apps/tournament/forms.py:176 +#, python-format +msgid "" +"Please keep filesize under %(max_size)s. Current filesize %(current_size)s" +msgstr "" +"Merci de ne pas dépasser les %(max_size)s. Le fichier envoyé pèse %(current_size)s." + +#: apps/tournament/forms.py:157 apps/tournament/forms.py:181 +msgid "The file should be a PDF file." +msgstr "Ce fichier doit être au format PDF." + +#: apps/tournament/forms.py:197 apps/tournament/forms.py:210 +#: apps/tournament/forms.py:223 msgid "Choose a team..." msgstr "Choisir une équipe ..." -#: apps/tournament/forms.py:169 +#: apps/tournament/forms.py:198 msgid "Team 1" msgstr "Équipe 1" -#: apps/tournament/forms.py:176 +#: apps/tournament/forms.py:205 msgid "Problem defended by team 1" msgstr "Problème défendu par l'équipe 1" -#: apps/tournament/forms.py:182 +#: apps/tournament/forms.py:211 msgid "Team 2" msgstr "Équipe 2" -#: apps/tournament/forms.py:189 +#: apps/tournament/forms.py:218 msgid "Problem defended by team 2" msgstr "Problème défendu par l'équipe 2" -#: apps/tournament/forms.py:195 +#: apps/tournament/forms.py:224 msgid "Team 3" msgstr "Équipe 3" -#: apps/tournament/forms.py:202 +#: apps/tournament/forms.py:231 msgid "Problem defended by team 3" msgstr "Problème défendu par l'équipe 3" @@ -437,8 +449,8 @@ msgid "" "List of all organizers that can see and manipulate data of the tournament " "and the teams." msgstr "" -"Liste des organisateurs qui peuvent manipuler les données du tournoi et " -"des équipes." +"Liste des organisateurs qui peuvent manipuler les données du tournoi et des " +"équipes." #: apps/tournament/models.py:29 templates/tournament/tournament_detail.html:15 msgid "size" @@ -509,8 +521,8 @@ msgid "" "The trigram should be composed of 3 capitalize letters, that is a funny " "acronym for the team." msgstr "" -"Le trigramme doit être composé de trois lettres en majuscule, qui doit " -"être un acronyme amusant représentant l'équipe." +"Le trigramme doit être composé de trois lettres en majuscule, qui doit être " +"un acronyme amusant représentant l'équipe." #: apps/tournament/models.py:183 msgid "The tournament where the team is registered."