From e865910ee30b7c1d752c9c8ae18d24622240dba1 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Wed, 29 Apr 2020 16:26:52 +0200 Subject: [PATCH] Display tournament list --- .../management/commands/import_olddb.py | 30 ++++++++++++++++-- apps/member/models.py | 14 ++++----- apps/tournament/models.py | 12 +++---- apps/tournament/tables.py | 20 ++++++++++++ apps/tournament/urls.py | 9 ++++++ apps/tournament/views.py | 25 +++++++++++++-- locale/fr/LC_MESSAGES/django.po | 31 ++++++++++++++++--- templates/base.html | 2 +- templates/tournament/tournament_list.html | 13 ++++++++ tfjm/settings.py | 2 ++ 10 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 apps/tournament/tables.py create mode 100644 apps/tournament/urls.py create mode 100644 templates/tournament/tournament_list.html diff --git a/apps/member/management/commands/import_olddb.py b/apps/member/management/commands/import_olddb.py index f007215..d0b1318 100644 --- a/apps/member/management/commands/import_olddb.py +++ b/apps/member/management/commands/import_olddb.py @@ -1,4 +1,4 @@ -from django.core.management import BaseCommand +from django.core.management import BaseCommand, CommandError from django.db import transaction from member.models import TFJMUser, Document, Solution, Synthesis, Authorization, MotivationLetter @@ -61,6 +61,17 @@ class Command(BaseCommand): Tournament.objects.create(**obj_dict) print(self.style.SUCCESS("Tournaments imported")) + @staticmethod + def validation_status(status): + if status == "NOT_READY": + return "0invalid" + elif status == "WAITING": + return "1waiting" + elif status == "VALIDATED": + return "2valid" + else: + raise CommandError("Unknown status: {}".format(status)) + @transaction.atomic def import_teams(self): self.stdout.write("Importing teams...") @@ -84,7 +95,7 @@ class Command(BaseCommand): "trigram": args[2], "tournament": Tournament.objects.get(pk=args[3]), "inscription_date": args[13], - "validation_status": args[14].lower(), + "validation_status": Command.validation_status(args[14]), "selected_for_final": args[15], "access_code": args[16], "year": args[17], @@ -93,6 +104,19 @@ class Command(BaseCommand): Team.objects.create(**obj_dict) print(self.style.SUCCESS("Teams imported")) + @staticmethod + def role(role): + if role == "ADMIN": + return "0admin" + elif role == "ORGANIZER": + return "1volunteer" + elif role == "ENCADRANT": + return "2coach" + elif role == "PARTICIPANT": + return "3participant" + else: + raise CommandError("Unknown role: {}".format(role)) + @transaction.atomic def import_users(self): self.stdout.write("Importing users...") @@ -130,7 +154,7 @@ class Command(BaseCommand): "responsible_phone": args[15], "responsible_email": args[16], "description": args[17].replace("\\n", "\n") if args[17] else None, - "role": args[18].lower(), + "role": Command.role(args[18]), "team": Team.objects.get(pk=args[19]) if args[19] else None, "year": args[20], "date_joined": args[23], diff --git a/apps/member/models.py b/apps/member/models.py index 03e4003..cb83b8a 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -127,10 +127,10 @@ class TFJMUser(AbstractUser): role = models.CharField( max_length=16, choices=[ - ("admin", _("admin")), - ("organizer", _("organizer")), - ("encadrant", _("encadrant")), - ("participant", _("participant")), + ("0admin", _("admin")), + ("1volunteer", _("organizer")), + ("2coach", _("coach")), + ("3participant", _("participant")), ] ) @@ -141,15 +141,15 @@ class TFJMUser(AbstractUser): @property def participates(self): - return self.role == "participant" or self.role == "encadrant" + return self.role == "3participant" or self.role == "2encadrant" @property def organizes(self): - return self.role == "organizer" or self.role == "admin" + return self.role == "1volunteer" or self.role == "0admin" @property def admin(self): - return self.role == "admin" + return self.role == "0admin" class Meta: verbose_name = _("user") diff --git a/apps/tournament/models.py b/apps/tournament/models.py index 36bf5f5..702c7da 100644 --- a/apps/tournament/models.py +++ b/apps/tournament/models.py @@ -100,9 +100,9 @@ class Team(models.Model): validation_status = models.CharField( max_length=8, choices=[ - ("invalid", _("Registration not validated")), - ("waiting", _("Waiting for validation")), - ("valid", _("Registration validated")), + ("0invalid", _("Registration not validated")), + ("1waiting", _("Waiting for validation")), + ("1valid", _("Registration validated")), ], verbose_name=_("validation status"), ) @@ -184,9 +184,9 @@ class Payment(models.Model): validation_status = models.CharField( max_length=8, choices=[ - ("invalid", _("Registration not validated")), - ("waiting", _("Waiting for validation")), - ("valid", _("Registration validated")), + ("0invalid", _("Registration not validated")), + ("1waiting", _("Waiting for validation")), + ("2valid", _("Registration validated")), ], verbose_name=_("validation status"), ) diff --git a/apps/tournament/tables.py b/apps/tournament/tables.py new file mode 100644 index 0000000..99e2c80 --- /dev/null +++ b/apps/tournament/tables.py @@ -0,0 +1,20 @@ +import django_tables2 as tables +from django.utils.translation import gettext as _ + +from .models import Tournament + + +class TournamentTable(tables.Table): + date_start = tables.Column( + verbose_name=_("dates").capitalize(), + ) + + def render_date_start(self, record): + return _("From {start:%b %d %Y} to {end:%b %d %Y}").format(start=record.date_start, end=record.date_end) + + class Meta: + model = Tournament + fields = ("name", "date_start", "date_inscription", "date_solutions", "size", ) + attrs = { + 'class': 'table table-condensed table-striped table-hover' + } diff --git a/apps/tournament/urls.py b/apps/tournament/urls.py new file mode 100644 index 0000000..6c2fc3f --- /dev/null +++ b/apps/tournament/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from .views import TournamentListView + +app_name = "tournament" + +urlpatterns = [ + path('list/', TournamentListView.as_view(), name="list"), +] diff --git a/apps/tournament/views.py b/apps/tournament/views.py index 91ea44a..8ddc81c 100644 --- a/apps/tournament/views.py +++ b/apps/tournament/views.py @@ -1,3 +1,24 @@ -from django.shortcuts import render +from django.db.models import Q +from django.utils.translation import gettext_lazy as _ +from django_tables2.views import SingleTableView -# Create your views here. +from member.models import TFJMUser +from .models import Tournament +from .tables import TournamentTable + + +class TournamentListView(SingleTableView): + model = Tournament + table_class = TournamentTable + extra_context = dict(title=_("Tournaments list"),) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + team_users = TFJMUser.objects.filter(Q(team__isnull=False) | Q(role="admin") | Q(role="organizer")) + valid_team_users = team_users.filter(Q(team__validation_status="valid") | Q(role="admin") | Q(role="organizer")) + + context["team_users_emails"] = [user.email for user in team_users] + context["valid_team_users_emails"] = [user.email for user in valid_team_users] + + return context diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 77477e2..1c7b219 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-04-29 06:24+0000\n" +"POT-Creation-Date: 2020-04-29 14:09+0000\n" "PO-Revision-Date: 2020-04-29 02:30+0000\n" "Last-Translator: Yohann D'ANELLO \n" "Language-Team: fr \n" @@ -125,8 +125,8 @@ msgid "organizer" msgstr "oragnisateur" #: apps/member/models.py:132 -msgid "encadrant" -msgstr "encadrant" +msgid "coach" +msgstr "" #: apps/member/models.py:133 msgid "participant" @@ -190,6 +190,8 @@ msgstr "autorisation" msgid "authorizations" msgstr "autorisations" +#: apps/member/models.py:206 +#, python-brace-format msgid "{authorization} for user {user}" msgstr "{authorization} pour l'utilisateur {user}" @@ -390,6 +392,18 @@ msgstr "paiements" msgid "Payment of {user}" msgstr "Paiement de {user}" +#: apps/tournament/tables.py:9 +msgid "dates" +msgstr "dates" + +#: apps/tournament/tables.py:13 +msgid "From {start:%b %d %Y} to {end:%b %d %Y}" +msgstr "Du {start: %d %b %Y} au {end:%d %b %Y}" + +#: apps/tournament/views.py:13 +msgid "Tournaments list" +msgstr "Liste des tournois" + #: templates/base.html:11 msgid "The inscription site of the TFJM²." msgstr "Le site d'inscription au TFJM²." @@ -403,6 +417,11 @@ msgstr "Votre adresse e-mail a bien été validée." msgid "You can now log in." msgstr "Vous pouvez désormais vous connecter" +#: templates/registration/email_validation_complete.html:10 +msgid "" +"You must pay now your membership in the Kfet to complete your registration." +msgstr "" + #: templates/registration/email_validation_complete.html:13 msgid "" "The link was invalid. The token may have expired. Please send us an email to " @@ -432,7 +451,8 @@ msgid "" "page. Would you like to login to a different account?" msgstr "" "Vous êtes déjà connecté sous le nom %(user)s, mais vous n'êtes pas autorisés " -"à accéder à cette page. Souhaitez-vous vous connecter sous un compte différent ?" +"à accéder à cette page. Souhaitez-vous vous connecter sous un compte " +"différent ?" #: templates/registration/login.html:23 msgid "Forgotten your password or username?" @@ -533,3 +553,6 @@ msgstr "Anglais" #: tfjm/settings.py:136 msgid "French" msgstr "Français" + +#~ msgid "encadrant" +#~ msgstr "encadrant" diff --git a/templates/base.html b/templates/base.html index 20b7c79..1d33818 100644 --- a/templates/base.html +++ b/templates/base.html @@ -73,7 +73,7 @@ Accueil