mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 02:12:05 +01:00 
			
		
		
		
	Display tournament list
This commit is contained in:
		@@ -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],
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
@@ -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"),
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								apps/tournament/tables.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								apps/tournament/tables.py
									
									
									
									
									
										Normal file
									
								
							@@ -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'
 | 
			
		||||
        }
 | 
			
		||||
							
								
								
									
										9
									
								
								apps/tournament/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								apps/tournament/urls.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
from django.urls import path
 | 
			
		||||
 | 
			
		||||
from .views import TournamentListView
 | 
			
		||||
 | 
			
		||||
app_name = "tournament"
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    path('list/', TournamentListView.as_view(), name="list"),
 | 
			
		||||
]
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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 <yohann.danello@animath.fr>\n"
 | 
			
		||||
"Language-Team: fr <LL@li.org>\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 <a href=\"%(login_url)s\">log in</a>."
 | 
			
		||||
msgstr "Vous pouvez désormais <a href=\"%(login_url)s\">vous connecter</a>"
 | 
			
		||||
 | 
			
		||||
#: 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"
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,7 @@
 | 
			
		||||
                    <a href="/" class="nav-link"><i class="fas fa-home"></i> Accueil</a>
 | 
			
		||||
                </li>
 | 
			
		||||
                <li class="nav-item active">
 | 
			
		||||
                    <a class="nav-link" href="/tournois"><i class="fas fa-calendar"></i> Liste des tournois</a>
 | 
			
		||||
                    <a class="nav-link" href="{% url "tournament:list" %}"><i class="fas fa-calendar"></i> Liste des tournois</a>
 | 
			
		||||
                    {% if user.organizes %}
 | 
			
		||||
                        <ul class="deroule">
 | 
			
		||||
                            {% if user.admin %}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								templates/tournament/tournament_list.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								templates/tournament/tournament_list.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load django_tables2 getconfig i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {% if user.is_authenticated and user.admin %}
 | 
			
		||||
        <div class="alert alert-info">
 | 
			
		||||
            <a href="mailto:contact@tfm.org?subject=TFJM²%20{{ "TFJM_YEAR"|get_env }}&bcc={{ team_users_emails|join:"," }}">{% trans "Send a mail to all people that are in a team" %}</a><br>
 | 
			
		||||
            <a href="mailto:contact@tfm.org?subject=TFJM²%20{{ "TFJM_YEAR"|get_env }}&bcc={{ valid_team_users_emails|join:"," }}">{% trans "Send a mail to all people that are in a valid team" %}</a>
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% render_table table %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -69,6 +69,8 @@ MIDDLEWARE = [
 | 
			
		||||
 | 
			
		||||
ROOT_URLCONF = 'tfjm.urls'
 | 
			
		||||
 | 
			
		||||
LOGIN_REDIRECT_URL = "index"
 | 
			
		||||
 | 
			
		||||
TEMPLATES = [
 | 
			
		||||
    {
 | 
			
		||||
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user