mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-02-14 00:21:23 +00:00
Compare commits
5 Commits
8515153be7
...
e4fa6c0321
Author | SHA1 | Date | |
---|---|---|---|
|
e4fa6c0321 | ||
|
4821b090ae | ||
|
0522db0f63 | ||
|
3e0e6ae7b4 | ||
|
d5e7295981 |
@ -3,6 +3,7 @@
|
||||
|
||||
import re
|
||||
|
||||
from PyPDF3 import PdfFileReader
|
||||
from bootstrap_datepicker_plus import DatePickerInput, DateTimePickerInput
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
@ -108,6 +109,7 @@ class TournamentForm(forms.ModelForm):
|
||||
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
||||
self.fields["syntheses_second_phase_limit"].widget = DateTimePickerInput(
|
||||
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
||||
self.fields["organizers"].widget = forms.CheckboxSelectMultiple()
|
||||
|
||||
class Meta:
|
||||
model = Tournament
|
||||
@ -115,6 +117,19 @@ class TournamentForm(forms.ModelForm):
|
||||
|
||||
|
||||
class SolutionForm(forms.ModelForm):
|
||||
def clean_file(self):
|
||||
if "file" in self.files:
|
||||
file = self.files["file"]
|
||||
if file.size > 5e6:
|
||||
raise ValidationError(_("The uploaded file size must be under 5 Mo."))
|
||||
if file.content_type != "application/pdf":
|
||||
raise ValidationError(_("The uploaded file must be a PDF file."))
|
||||
pdf_reader = PdfFileReader(file)
|
||||
pages = len(pdf_reader.pages)
|
||||
if pages > 30:
|
||||
raise ValidationError(_("The PDF file must not have more than 30 pages."))
|
||||
return self.cleaned_data["photo_authorization"]
|
||||
|
||||
def save(self, commit=True):
|
||||
"""
|
||||
Don't save a solution with this way. Use a view instead
|
||||
@ -165,6 +180,15 @@ class PassageForm(forms.ModelForm):
|
||||
|
||||
|
||||
class SynthesisForm(forms.ModelForm):
|
||||
def clean_file(self):
|
||||
if "file" in self.files:
|
||||
file = self.files["file"]
|
||||
if file.size > 2e6:
|
||||
raise ValidationError(_("The uploaded file size must be under 2 Mo."))
|
||||
if file.content_type != "application/pdf":
|
||||
raise ValidationError(_("The uploaded file must be a PDF file."))
|
||||
return self.cleaned_data["photo_authorization"]
|
||||
|
||||
def save(self, commit=True):
|
||||
"""
|
||||
Don't save a synthesis with this way. Use a view instead
|
||||
|
@ -47,7 +47,7 @@
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
{% if user.registration.isadmin or user.registration in tournament.organizers.all %}
|
||||
{% if user.registration.is_admin or user.registration in tournament.organizers.all %}
|
||||
<div class="card-footer text-center">
|
||||
<a href="{% url "participation:tournament_update" pk=tournament.pk %}"><button class="btn btn-secondary">{% trans "Edit tournament" %}</button></a>
|
||||
</div>
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TFJM\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-01-18 23:37+0100\n"
|
||||
"POT-Creation-Date: 2021-01-19 00:29+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -104,27 +104,39 @@ msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
|
||||
msgid "valid"
|
||||
msgstr "valide"
|
||||
|
||||
#: apps/participation/forms.py:22 apps/participation/models.py:37
|
||||
#: apps/participation/forms.py:23 apps/participation/models.py:37
|
||||
msgid "The trigram must be composed of three uppercase letters."
|
||||
msgstr "Le trigramme doit être composé de trois lettres majuscules."
|
||||
|
||||
#: apps/participation/forms.py:37
|
||||
#: apps/participation/forms.py:38
|
||||
msgid "No team was found with this access code."
|
||||
msgstr "Aucune équipe n'a été trouvée avec ce code d'accès."
|
||||
|
||||
#: apps/participation/forms.py:71
|
||||
#: apps/participation/forms.py:72
|
||||
msgid "I engage myself to participate to the whole TFJM²."
|
||||
msgstr "Je m'engage à participer à l'intégralité du TFJM²."
|
||||
|
||||
#: apps/participation/forms.py:86
|
||||
#: apps/participation/forms.py:87
|
||||
msgid "Message to address to the team:"
|
||||
msgstr "Message à adresser à l'équipe :"
|
||||
|
||||
#: apps/participation/forms.py:155
|
||||
#: apps/participation/forms.py:123
|
||||
msgid "The uploaded file size must be under 5 Mo."
|
||||
msgstr "Le fichier envoyé doit peser moins de 5 Mo."
|
||||
|
||||
#: apps/participation/forms.py:125
|
||||
msgid "The uploaded file must be a PDF file."
|
||||
msgstr "Le fichier envoyé doit être au format PDF."
|
||||
|
||||
#: apps/participation/forms.py:129
|
||||
msgid "The PDF file must not have more than 30 pages."
|
||||
msgstr "Le fichier PDF ne doit pas avoir plus de 30 pages."
|
||||
|
||||
#: apps/participation/forms.py:169
|
||||
msgid "The defender, the opponent and the reporter must be different."
|
||||
msgstr "Le défenseur, l'opposant et le rapporteur doivent être différents."
|
||||
|
||||
#: apps/participation/forms.py:159
|
||||
#: apps/participation/forms.py:173
|
||||
msgid "This defender did not work on this problem."
|
||||
msgstr "Ce défenseur ne travaille pas sur ce problème."
|
||||
|
||||
@ -784,7 +796,7 @@ msgid "Update team"
|
||||
msgstr "Modifier l'équipe"
|
||||
|
||||
#: apps/participation/templates/participation/team_detail.html:152
|
||||
#: apps/participation/views.py:359
|
||||
#: apps/participation/views.py:360
|
||||
msgid "Leave team"
|
||||
msgstr "Quitter l'équipe"
|
||||
|
||||
@ -872,49 +884,49 @@ msgstr "Tous les tournois"
|
||||
msgid "Add tournament"
|
||||
msgstr "Ajouter un tournoi"
|
||||
|
||||
#: apps/participation/views.py:39 tfjm/templates/base.html:74
|
||||
#: apps/participation/views.py:40 tfjm/templates/base.html:74
|
||||
#: tfjm/templates/base.html:233
|
||||
msgid "Create team"
|
||||
msgstr "Créer une équipe"
|
||||
|
||||
#: apps/participation/views.py:48 apps/participation/views.py:93
|
||||
#: apps/participation/views.py:49 apps/participation/views.py:94
|
||||
msgid "You don't participate, so you can't create a team."
|
||||
msgstr "Vous ne participez pas, vous ne pouvez pas créer d'équipe."
|
||||
|
||||
#: apps/participation/views.py:50 apps/participation/views.py:95
|
||||
#: apps/participation/views.py:51 apps/participation/views.py:96
|
||||
msgid "You are already in a team."
|
||||
msgstr "Vous êtes déjà dans une équipe."
|
||||
|
||||
#: apps/participation/views.py:84 tfjm/templates/base.html:79
|
||||
#: apps/participation/views.py:85 tfjm/templates/base.html:79
|
||||
#: tfjm/templates/base.html:228
|
||||
msgid "Join team"
|
||||
msgstr "Rejoindre une équipe"
|
||||
|
||||
#: apps/participation/views.py:146 apps/participation/views.py:365
|
||||
#: apps/participation/views.py:398
|
||||
#: apps/participation/views.py:147 apps/participation/views.py:366
|
||||
#: apps/participation/views.py:399
|
||||
msgid "You are not in a team."
|
||||
msgstr "Vous n'êtes pas dans une équipe."
|
||||
|
||||
#: apps/participation/views.py:147 apps/participation/views.py:399
|
||||
#: apps/participation/views.py:148 apps/participation/views.py:400
|
||||
msgid "You don't participate, so you don't have any team."
|
||||
msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe."
|
||||
|
||||
#: apps/participation/views.py:171
|
||||
#: apps/participation/views.py:172
|
||||
#, python-brace-format
|
||||
msgid "Detail of team {trigram}"
|
||||
msgstr "Détails de l'équipe {trigram}"
|
||||
|
||||
#: apps/participation/views.py:204
|
||||
#: apps/participation/views.py:205
|
||||
msgid "You don't participate, so you can't request the validation of the team."
|
||||
msgstr ""
|
||||
"Vous ne participez pas, vous ne pouvez pas demander la validation de "
|
||||
"l'équipe."
|
||||
|
||||
#: apps/participation/views.py:207
|
||||
#: apps/participation/views.py:208
|
||||
msgid "The validation of the team is already done or pending."
|
||||
msgstr "La validation de l'équipe est déjà faite ou en cours."
|
||||
|
||||
#: apps/participation/views.py:210
|
||||
#: apps/participation/views.py:211
|
||||
msgid ""
|
||||
"The team can't be validated: missing email address confirmations, "
|
||||
"authorizations, people or the chosen problem is not set."
|
||||
@ -923,56 +935,64 @@ msgstr ""
|
||||
"d'adresse e-mail, soit une autorisation, soit des personnes soit le problème "
|
||||
"n'a pas été choisi."
|
||||
|
||||
#: apps/participation/views.py:229
|
||||
#: apps/participation/views.py:230
|
||||
msgid "You are not an administrator."
|
||||
msgstr "Vous n'êtes pas administrateur."
|
||||
|
||||
#: apps/participation/views.py:232
|
||||
#: apps/participation/views.py:233
|
||||
msgid "This team has no pending validation."
|
||||
msgstr "L'équipe n'a pas de validation en attente."
|
||||
|
||||
#: apps/participation/views.py:262
|
||||
#: apps/participation/views.py:263
|
||||
msgid "You must specify if you validate the registration or not."
|
||||
msgstr "Vous devez spécifier si vous validez l'inscription ou non."
|
||||
|
||||
#: apps/participation/views.py:293
|
||||
#: apps/participation/views.py:294
|
||||
#, python-brace-format
|
||||
msgid "Update team {trigram}"
|
||||
msgstr "Mise à jour de l'équipe {trigram}"
|
||||
|
||||
#: apps/participation/views.py:332
|
||||
#: apps/participation/views.py:333
|
||||
#, python-brace-format
|
||||
msgid "Photo authorization of {participant}.{ext}"
|
||||
msgstr "Autorisation de droit à l'image de {participant}.{ext}"
|
||||
|
||||
#: apps/participation/views.py:338
|
||||
#: apps/participation/views.py:339
|
||||
#, python-brace-format
|
||||
msgid "Parental authorization of {participant}.{ext}"
|
||||
msgstr "Autorisation parentale de {participant}.{ext}"
|
||||
|
||||
#: apps/participation/views.py:345
|
||||
#: apps/participation/views.py:346
|
||||
#, python-brace-format
|
||||
msgid "Health sheet of {participant}.{ext}"
|
||||
msgstr "Fiche sanitaire de {participant}.{ext}"
|
||||
|
||||
#: apps/participation/views.py:349
|
||||
#: apps/participation/views.py:350
|
||||
#, python-brace-format
|
||||
msgid "Photo authorizations of team {trigram}.zip"
|
||||
msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip"
|
||||
|
||||
#: apps/participation/views.py:367
|
||||
#: apps/participation/views.py:368
|
||||
msgid "The team is already validated or the validation is pending."
|
||||
msgstr "La validation de l'équipe est déjà faite ou en cours."
|
||||
|
||||
#: apps/participation/views.py:413
|
||||
#: apps/participation/views.py:414
|
||||
msgid "The team is not validated yet."
|
||||
msgstr "L'équipe n'est pas encore validée."
|
||||
|
||||
#: apps/participation/views.py:425
|
||||
#: apps/participation/views.py:426
|
||||
#, python-brace-format
|
||||
msgid "Participation of team {trigram}"
|
||||
msgstr "Participation de l'équipe {trigram}"
|
||||
|
||||
#: apps/participation/views.py:515
|
||||
msgid "You can't upload a solution after the deadline."
|
||||
msgstr "Vous ne pouvez pas envoyer de solution après la date limite."
|
||||
|
||||
#: apps/participation/views.py:695
|
||||
msgid "You can't upload a synthesis after the deadline."
|
||||
msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite."
|
||||
|
||||
#: apps/registration/forms.py:21 apps/registration/forms.py:53
|
||||
msgid "role"
|
||||
msgstr "rôle"
|
||||
@ -1185,7 +1205,7 @@ msgstr "nom de famille"
|
||||
#: apps/registration/templates/registration/add_organizer.html:12
|
||||
#: apps/registration/templates/registration/add_organizer.html:19
|
||||
#: apps/registration/templates/registration/user_list.html:8
|
||||
#: apps/registration/views.py:85
|
||||
#: apps/registration/views.py:86
|
||||
msgid "Add organizer"
|
||||
msgstr "Ajouter un organisateur"
|
||||
|
||||
@ -1389,7 +1409,7 @@ msgstr ""
|
||||
#: apps/registration/templates/registration/signup.html:5
|
||||
#: apps/registration/templates/registration/signup.html:12
|
||||
#: apps/registration/templates/registration/signup.html:19
|
||||
#: apps/registration/views.py:41
|
||||
#: apps/registration/views.py:42
|
||||
msgid "Sign up"
|
||||
msgstr "Inscription"
|
||||
|
||||
@ -1502,13 +1522,13 @@ msgid "Responsible email address:"
|
||||
msgstr "Adresse e-mail du responsable légal :"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:102
|
||||
msgid "Profesional activity:"
|
||||
msgstr "Activité professionnelle :"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:105
|
||||
msgid "Role:"
|
||||
msgstr "Rôle :"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:105
|
||||
msgid "Profesional activity:"
|
||||
msgstr "Activité professionnelle :"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:109
|
||||
msgid "Grant Animath to contact me in the future about other actions:"
|
||||
msgstr "Autorise Animath à recontacter à propos d'autres actions :"
|
||||
@ -1544,71 +1564,71 @@ msgid "Update user"
|
||||
msgstr "Modifier l'utilisateur"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:161
|
||||
#: apps/registration/views.py:312
|
||||
#: apps/registration/views.py:313
|
||||
msgid "Upload photo authorization"
|
||||
msgstr "Téléverser l'autorisation de droit à l'image"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:166
|
||||
#: apps/registration/views.py:338
|
||||
#: apps/registration/views.py:339
|
||||
msgid "Upload health sheet"
|
||||
msgstr "Téléverser la fiche sanitaire"
|
||||
|
||||
#: apps/registration/templates/registration/user_detail.html:171
|
||||
#: apps/registration/templates/registration/user_detail.html:176
|
||||
#: apps/registration/views.py:364
|
||||
#: apps/registration/views.py:365
|
||||
msgid "Upload parental authorization"
|
||||
msgstr "Téléverser l'autorisation parentale"
|
||||
|
||||
#: apps/registration/views.py:124
|
||||
#: apps/registration/views.py:125
|
||||
msgid "New TFJM² organizer account"
|
||||
msgstr "Nouveau compte organisateur pour le TFJM²"
|
||||
|
||||
#: apps/registration/views.py:146
|
||||
#: apps/registration/views.py:147
|
||||
msgid "Email validation"
|
||||
msgstr "Validation de l'adresse mail"
|
||||
|
||||
#: apps/registration/views.py:148
|
||||
#: apps/registration/views.py:149
|
||||
msgid "Validate email"
|
||||
msgstr "Valider l'adresse mail"
|
||||
|
||||
#: apps/registration/views.py:187
|
||||
#: apps/registration/views.py:188
|
||||
msgid "Email validation unsuccessful"
|
||||
msgstr "Échec de la validation de l'adresse mail"
|
||||
|
||||
#: apps/registration/views.py:198
|
||||
#: apps/registration/views.py:199
|
||||
msgid "Email validation email sent"
|
||||
msgstr "Mail de confirmation de l'adresse mail envoyé"
|
||||
|
||||
#: apps/registration/views.py:206
|
||||
#: apps/registration/views.py:207
|
||||
msgid "Resend email validation link"
|
||||
msgstr "Renvoyé le lien de validation de l'adresse mail"
|
||||
|
||||
#: apps/registration/views.py:246
|
||||
#: apps/registration/views.py:247
|
||||
#, python-brace-format
|
||||
msgid "Detail of user {user}"
|
||||
msgstr "Détails de l'utilisateur {user}"
|
||||
|
||||
#: apps/registration/views.py:276
|
||||
#: apps/registration/views.py:277
|
||||
#, python-brace-format
|
||||
msgid "Update user {user}"
|
||||
msgstr "Mise à jour de l'utilisateur {user}"
|
||||
|
||||
#: apps/registration/views.py:427
|
||||
#: apps/registration/views.py:428
|
||||
#, python-brace-format
|
||||
msgid "Photo authorization of {student}.{ext}"
|
||||
msgstr "Autorisation de droit à l'image de {student}.{ext}"
|
||||
|
||||
#: apps/registration/views.py:450
|
||||
#: apps/registration/views.py:451
|
||||
#, python-brace-format
|
||||
msgid "Health sheet of {student}.{ext}"
|
||||
msgstr "Fiche sanitaire de {student}.{ext}"
|
||||
|
||||
#: apps/registration/views.py:473
|
||||
#: apps/registration/views.py:474
|
||||
#, python-brace-format
|
||||
msgid "Parental authorization of {student}.{ext}"
|
||||
msgstr "Autorisation parentale de {student}.{ext}"
|
||||
|
||||
#: apps/registration/views.py:495
|
||||
#: apps/registration/views.py:496
|
||||
#, python-brace-format
|
||||
msgid "Scholarship attestation of {user}.{ext}"
|
||||
msgstr "Notification de bourse de {user}.{ext}"
|
||||
|
@ -17,6 +17,7 @@ gunicorn~=20.0
|
||||
matrix-nio~=0.15
|
||||
phonenumbers~=8.9.10
|
||||
psycopg2-binary~=2.8
|
||||
PyPDF3~=1.0.2
|
||||
ipython~=7.19.0
|
||||
python-magic==0.4.18
|
||||
requests~=2.25.0
|
||||
|
@ -5,6 +5,7 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="text-justify">
|
||||
<p>
|
||||
La plateforme d'inscription du TFJM² a été développée entre 2019 et 2021
|
||||
par Yohann D'ANELLO, bénévole pour l'association Animath. Elle est vouée à être utilisée par les participants
|
||||
@ -37,4 +38,5 @@
|
||||
contact@tfjm.org
|
||||
</a>.
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -6,15 +6,14 @@
|
||||
<div class="jumbotron bg-white">
|
||||
<div class="row">
|
||||
<h1 class="display-3">
|
||||
Bienvenue sur le site d'inscription au <a href="https://tfjm.org/" target="_blank">
|
||||
TFJM²</a> !
|
||||
Bienvenue sur le site d'inscription au <a href="https://tfjm.org/" target="_blank">𝕋𝔽𝕁𝕄²</a> !
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row jumbotron bg-white">
|
||||
<div class="col-sm">
|
||||
<h3>
|
||||
Tu souhaites participer au TFJM² ?
|
||||
Tu souhaites participer au 𝕋𝔽𝕁𝕄² ?
|
||||
<br/>
|
||||
Ton équipe est déjà formée ?
|
||||
</h3>
|
||||
@ -27,15 +26,18 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-danger">
|
||||
Avertissement : certains rencontrent des difficultés à recevoir les mails automatiques. Merci de vérifier
|
||||
régulièrement votre boîte spam, et à nous contacter en cas de problème.
|
||||
</div>
|
||||
<div class="alert alert-success">
|
||||
<h4><strong><i class="fas fa-newspaper"></i> Grande nouveauté :</strong></h4>
|
||||
Cette année, après avoir appris de l'édition complètement à distance de 2020, la communication se simplifie :
|
||||
retrouvez-nous sur Element, disponible sur tous vos appareils, ou sur votre navigateur à l'adresse
|
||||
<a class="alert-link" href="https://element.tfjm.org">element.tfjm.org</a>
|
||||
(connectez-vous avec les identifiants de cette plateforme une fois inscrits)
|
||||
</div>
|
||||
|
||||
<div class="jumbotron">
|
||||
<h5 class="display-4">Comment ça marche ?</h5>
|
||||
<p>
|
||||
Pour participer au TFJM², il suffit de créer un compte sur la rubrique <strong><a href="{% url "registration:signup" %}">Inscription</a></strong>.
|
||||
Pour participer au 𝕋𝔽𝕁𝕄², il suffit de créer un compte sur la rubrique <strong><a href="{% url "registration:signup" %}">Inscription</a></strong>.
|
||||
Vous devrez ensuite confirmer votre adresse e-mail.
|
||||
</p>
|
||||
|
||||
@ -43,7 +45,7 @@
|
||||
Vous pouvez accéder à votre compte via la rubrique <strong><a href="{% url "login" %}">Connexion</a></strong>.
|
||||
Une fois connecté, vous pourrez créer une équipe ou en rejoindre une déjà créée par l'un de vos camarades
|
||||
via un code d'accès qui vous aura été transmis. Vous serez ensuite invité à soumettre une autorisation de droit à l'image,
|
||||
indispensable au bon déroulement du TFJM². Une fois que votre équipe comporte au moins 3 participants (maximum 5)
|
||||
indispensable au bon déroulement du 𝕋𝔽𝕁𝕄². Une fois que votre équipe comporte au moins 3 participants (maximum 5)
|
||||
et un encadrant, vous pourrez demander à valider votre équipe pour être apte à travailler sur le problème de votre choix.
|
||||
</p>
|
||||
|
||||
@ -51,10 +53,10 @@
|
||||
|
||||
<p class="text-justify">
|
||||
En ayant créé un compte sur cette plateforme, vous créez également un compte sur la plateforme de chat dédiée
|
||||
au TFJM², basée sur le protocole <a href="https://matrix.org/">Matrix</a> et le client
|
||||
au 𝕋𝔽𝕁𝕄², basée sur le protocole <a href="https://matrix.org/">Matrix</a> et le client
|
||||
<a href="https://element.io">Element</a>. Cette interface de chat vous permet de communiquer avec les membres
|
||||
de votre équipe, mais surtout de pouvoir échanger durant la troisième phase du TFJM², et
|
||||
également de poser vos questions en cas de besoin.
|
||||
de votre équipe, mais surtout de pouvoir participer au tirage au sort et discuter avec les autres équipes et
|
||||
les organisateurs.
|
||||
</p>
|
||||
|
||||
<p class="text-justify">
|
||||
@ -72,7 +74,7 @@
|
||||
|
||||
<div class="alert alert-warning">
|
||||
<strong>Attention aux dates !</strong> Si vous ne finalisez pas votre inscription dans le délai indiqué, vous
|
||||
ne pourrez malheureusement pas participer au TFJM².
|
||||
ne pourrez malheureusement pas participer au 𝕋𝔽𝕁𝕄².
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user