diff --git a/apps/wrapped/templates/wrapped/1/wrapped_view_club.html b/apps/wrapped/templates/wrapped/1/wrapped_view_club.html index f9c2d178..6d295e9e 100644 --- a/apps/wrapped/templates/wrapped/1/wrapped_view_club.html +++ b/apps/wrapped/templates/wrapped/1/wrapped_view_club.html @@ -23,9 +23,9 @@ SPDX-License-Identifier: GPL-3.0-or-later let d1 = document.getElementById("consumer"); let d2 = document.getElementById("creditor"); if (con) { d1.textContent = {{ big_consumer | safe }}[0] + " " + gettext("with") + " " + {{ big_consumer | safe}}[1] + "€";} - else { d1.textContent = gettext("Infortunately, you doesn't have consumer this year");}; + else { d1.textContent = gettext({% trans "Infortunately, you doesn't have consumer this year" %});}; if (cre) { d2.textContent = {{ big_creancier | safe}}[0] + " " + gettext("with") + " " + {{ big_creancier | safe}}[1] + "€";} - else { d2.textContent = gettext("Congratulations you are a real rat !"); }; + else { d2.textContent = gettext({% trans "Congratulations you are a real rat !" %}); }; </script> {% endblock %} diff --git a/apps/wrapped/templates/wrapped/wrapped_list.html b/apps/wrapped/templates/wrapped/wrapped_list.html index 28892de5..c15d4ada 100644 --- a/apps/wrapped/templates/wrapped/wrapped_list.html +++ b/apps/wrapped/templates/wrapped/wrapped_list.html @@ -6,17 +6,24 @@ SPDX-License-Identifier: GPL-3.0-or-later {% load i18n %} {% block content %} -<div class="row justify-content-center"> - <div class="col-md-10"> - <div class="card card-border shadow"> - <div class="card-header text-center"> - <h5> {{ title }}</h5> - </div> - <div class="card-body px-0 py-0" id="wrapped_table"> - {% render_table table %} - </div> - </div> - </div> +<div id="wrapped_tables"> +{% if tables|length > 0 %} +<div class="card bg-light mb-3"> + <h3 class="card-header text-center"> + {% trans "My wrapped" %} + </h3> + {% render_table tables.1 %} +</div> +{% endif %} + +{% if tables|length > 0 %} +<div class="card bg-light mb-3"> + <h3 class="card-header text-center"> + {% trans "Public wrapped" %} + </h3> + {% render_table tables.0 %} +</div> +{% endif %} </div> {% endblock %} @@ -25,7 +32,7 @@ SPDX-License-Identifier: GPL-3.0-or-later let club_not_public = {{ club_not_public }}; if (club_not_public) { (addMsg("{% trans "Do not forget to ask permission to people who are in your wrapped before to make them public" %}", 'warning'));} function refreshTable() { - $("#wrapped_table").load(location.pathname + " #wrapped_table"); + $("#wrapped_tables").load(location.pathname + " #wrapped_tables"); } function copylink(id) { diff --git a/apps/wrapped/views.py b/apps/wrapped/views.py index 8c7f834d..1300e1bc 100644 --- a/apps/wrapped/views.py +++ b/apps/wrapped/views.py @@ -6,7 +6,8 @@ import json from django.contrib.auth.mixins import LoginRequiredMixin from django.utils.translation import gettext_lazy as _ from django.views.generic import DetailView -from django_tables2.views import SingleTableView +from django.views.generic.list import ListView +from django_tables2.views import MultiTableMixin from permission.backends import PermissionBackend from permission.views import ProtectQuerysetMixin @@ -14,21 +15,29 @@ from .models import Wrapped from .tables import WrappedTable -class WrappedListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView): +class WrappedListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, ListView): """ Display all Wrapped, and classify by year """ model = Wrapped - table_class = WrappedTable + tables = [ + lambda data: WrappedTable(data, prefix="public-"), + lambda data: WrappedTable(data, prefix="personnal-"), + ] template_name = 'wrapped/wrapped_list.html' extra_context = {'title': _("List of wrapped")} def get_queryset(self, **kwargs): return super().get_queryset(**kwargs).distinct() - def get_table_data(self): - return Wrapped.objects.filter(PermissionBackend.filter_queryset( - self.request, Wrapped, "change", field='public')).distinct().order_by("-bde__date_start") + def get_tables_data(self): + return [ + Wrapped.objects.filter(public=True), + Wrapped.objects + .filter(PermissionBackend.filter_queryset(self.request, Wrapped, "change", field='public')) + .distinct() + .order_by("-bde__date_start") + ] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) diff --git a/docs/_static/img/graphs/wrapped.svg b/docs/_static/img/graphs/wrapped.svg new file mode 100644 index 00000000..e76497dc --- /dev/null +++ b/docs/_static/img/graphs/wrapped.svg @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.43.0 (0) + --> +<!-- Title: model_graph Pages: 1 --> +<svg width="319pt" height="245pt" + viewBox="0.00 0.00 319.00 245.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 241)"> +<title>model_graph</title> +<polygon fill="white" stroke="transparent" points="-4,4 -4,-241 315,-241 315,4 -4,4"/> +<!-- wrapped_models_Bde --> +<g id="node1" class="node"> +<title>wrapped_models_Bde</title> +<polygon fill="white" stroke="transparent" points="8,-4 8,-79 158,-79 158,-4 8,-4"/> +<polygon fill="#1b563f" stroke="transparent" points="9,-56.5 9,-77.5 157,-77.5 157,-56.5 9,-56.5"/> +<text text-anchor="start" x="52" y="-65.5" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="62" y="-65.5" font-family="Roboto" font-weight="bold" font-size="10.00" fill="white">    Bde    </text> +<text text-anchor="start" x="11" y="-49.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="21" y="-49.1" font-family="Roboto" font-weight="bold" font-size="8.00">id</text> +<text text-anchor="start" x="31" y="-49.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="77" y="-49.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="87" y="-49.1" font-family="Roboto" font-weight="bold" font-size="8.00">AutoField</text> +<text text-anchor="start" x="131" y="-49.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="11" y="-36.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="21" y="-36.1" font-family="Roboto" font-size="8.00">date_end</text> +<text text-anchor="start" x="60" y="-36.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="77" y="-36.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="87" y="-36.1" font-family="Roboto" font-size="8.00">DateTimeField</text> +<text text-anchor="start" x="145" y="-36.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="11" y="-23.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="21" y="-23.1" font-family="Roboto" font-size="8.00">date_start</text> +<text text-anchor="start" x="63" y="-23.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="77" y="-23.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="87" y="-23.1" font-family="Roboto" font-size="8.00">DateTimeField</text> +<text text-anchor="start" x="145" y="-23.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="11" y="-10.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="21" y="-10.1" font-family="Roboto" font-size="8.00">name</text> +<text text-anchor="start" x="45" y="-10.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="77" y="-10.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="87" y="-10.1" font-family="Roboto" font-size="8.00">CharField</text> +<text text-anchor="start" x="125" y="-10.1" font-family="Roboto" font-size="8.00">    </text> +<polygon fill="none" stroke="black" points="8,-4 8,-79 158,-79 158,-4 8,-4"/> +</g> +<!-- wrapped_models_Wrapped --> +<g id="node2" class="node"> +<title>wrapped_models_Wrapped</title> +<polygon fill="white" stroke="transparent" points="67,-132 67,-233 231,-233 231,-132 67,-132"/> +<polygon fill="#1b563f" stroke="transparent" points="68,-210.5 68,-231.5 230,-231.5 230,-210.5 68,-210.5"/> +<text text-anchor="start" x="103" y="-219.5" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="113" y="-219.5" font-family="Roboto" font-weight="bold" font-size="10.00" fill="white">    Wrapped    </text> +<text text-anchor="start" x="70" y="-203.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-203.1" font-family="Roboto" font-weight="bold" font-size="8.00">id</text> +<text text-anchor="start" x="90" y="-203.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-203.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-203.1" font-family="Roboto" font-weight="bold" font-size="8.00">AutoField</text> +<text text-anchor="start" x="191" y="-203.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="70" y="-190.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-190.1" font-family="Roboto" font-weight="bold" font-size="8.00">bde</text> +<text text-anchor="start" x="98" y="-190.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-190.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-190.1" font-family="Roboto" font-weight="bold" font-size="8.00">ForeignKey (id)</text> +<text text-anchor="start" x="218" y="-190.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="70" y="-177.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-177.1" font-family="Roboto" font-weight="bold" font-size="8.00">note</text> +<text text-anchor="start" x="101" y="-177.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-177.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-177.1" font-family="Roboto" font-weight="bold" font-size="8.00">ForeignKey (id)</text> +<text text-anchor="start" x="218" y="-177.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="70" y="-164.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-164.1" font-family="Roboto" font-size="8.00">data_json</text> +<text text-anchor="start" x="120" y="-164.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-164.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-164.1" font-family="Roboto" font-size="8.00">TextField</text> +<text text-anchor="start" x="182" y="-164.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="70" y="-151.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-151.1" font-family="Roboto" font-size="8.00">generated</text> +<text text-anchor="start" x="123" y="-151.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-151.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-151.1" font-family="Roboto" font-size="8.00">BooleanField</text> +<text text-anchor="start" x="200" y="-151.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="70" y="-138.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="80" y="-138.1" font-family="Roboto" font-size="8.00">public</text> +<text text-anchor="start" x="105" y="-138.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="137" y="-138.1" font-family="Roboto" font-size="8.00">    </text> +<text text-anchor="start" x="147" y="-138.1" font-family="Roboto" font-size="8.00">BooleanField</text> +<text text-anchor="start" x="200" y="-138.1" font-family="Roboto" font-size="8.00">    </text> +<polygon fill="none" stroke="black" points="67,-132 67,-233 231,-233 231,-132 67,-132"/> +</g> +<!-- wrapped_models_Wrapped->wrapped_models_Bde --> +<g id="edge1" class="edge"> +<title>wrapped_models_Wrapped->wrapped_models_Bde</title> +<path fill="none" stroke="black" d="M119.99,-120.4C114,-107.79 107.84,-94.82 102.31,-83.16"/> +<ellipse fill="black" stroke="black" cx="121.77" cy="-124.15" rx="4" ry="4"/> +<text text-anchor="middle" x="132" y="-103.6" font-family="Roboto" font-size="8.00"> bde (+)</text> +</g> +<!-- note_models_notes_Note --> +<g id="node3" class="node"> +<title>note_models_notes_Note</title> +<polygon fill="white" stroke="transparent" points="192,-31 192,-52 240,-52 240,-31 192,-31"/> +<polygon fill="#1b563f" stroke="transparent" points="192,-30.5 192,-51.5 240,-51.5 240,-30.5 192,-30.5"/> +<text text-anchor="start" x="196.5" y="-38.9" font-family="Roboto" font-size="8.00">  </text> +<text text-anchor="start" x="201.5" y="-38.9" font-family="Roboto" font-size="12.00" fill="white">Note</text> +<text text-anchor="start" x="230.5" y="-38.9" font-family="Roboto" font-size="8.00">  </text> +</g> +<!-- wrapped_models_Wrapped->note_models_notes_Note --> +<g id="edge2" class="edge"> +<title>wrapped_models_Wrapped->note_models_notes_Note</title> +<path fill="none" stroke="black" d="M178.48,-120.33C189.12,-98.27 200.3,-75.07 207.66,-59.8"/> +<ellipse fill="black" stroke="black" cx="176.64" cy="-124.16" rx="4" ry="4"/> +<text text-anchor="middle" x="204.5" y="-103.6" font-family="Roboto" font-size="8.00"> note (+)</text> +</g> +<!-- \n\n\n --> +<g id="node4" class="node"> +<title>\n\n\n</title> +</g> +</g> +</svg> diff --git a/docs/apps/index.rst b/docs/apps/index.rst index e16f5196..95315eb8 100644 --- a/docs/apps/index.rst +++ b/docs/apps/index.rst @@ -14,6 +14,7 @@ Applications de la Note Kfet 2020 logs treasury wei + wrapped La Note Kfet 2020 est un projet Django, décomposé en applications. Certaines applications sont développées uniquement pour ce projet, et sont indispensables, @@ -69,4 +70,6 @@ Applications facultatives Interface de gestion pour les trésorièr⋅es, émission de factures, remises de chèque, statistiques... * `WEI <wei>`_ : Interface de gestion du WEI. +* `Wrapped <wrapped>`_ : + Récapitulatif personnalisé annuel de statitiques globales et personnelles. diff --git a/docs/apps/wrapped.rst b/docs/apps/wrapped.rst new file mode 100644 index 00000000..199572dc --- /dev/null +++ b/docs/apps/wrapped.rst @@ -0,0 +1,108 @@ +Wrapped +======= + +Cette application montre les statistiques annuelles des utilisateur·ice·s et/ou des clubs. + +Modèles +------- + +Bde +~~~ + +Le modèle ``Bde`` contient des informations relatifs à un BDE : + +* ``name`` : ``CharField``, nom du BDE. +* ``date_start`` : ``DateField``, date de prise de fonction du bureau BDE considéré. +* ``date_end`` : ``DateField``, date de démission du bureau BDE considéré. + +Wrapped +~~~~~~~ + +Contient les informations sur un wrapped : + +* ``generated`` : ``BooleanField``, indique si le wrapped a été généré ou non. +* ``public`` : ``BooleanField``, indique si le wrapped est visible de tous les utilisateur·ice·s ou non. +* ``bde`` : ``ForeignKey(Bde)``, BDE auquel le wrapped correspond. +* ``note`` : ``ForeignKey(Note)``, note à laquelle le wrapped correspond. +* ``data_json`` : ``TextField``, diverses statistique concernant les notes durant le mandat BDE + considéré ou sur la NoteKfet dans sa globalité. + +Graphe des modèles +~~~~~~~~~~~~~~~~~~ + +.. image:: ../_static/img/graphs/wrapped.svg + :width: 960 + :alt: Graphe des modèles de l'application Wrapped + +Fonctionnement +-------------- + +Création d'un BDE +~~~~~~~~~~~~~~~~~ + +Seul un⋅e respo info peut créer un BDE. Pour cela, se rendre dans l'onglet « Admin »., puis « BDE » et +enfin « + Ajouter BDE ». Iel doit renseigner, les dates de début et de fin du bureau BDE ainsi que le +nom de la liste. + +Génération des wrappeds +~~~~~~~~~~~~~~~~~~~~~~~ + +Seul un·e respo info peut générer des wrappeds. Pour une utilisation annuelle classique, iel exécute la +commande : + +``./manage.py generate_wrapped -b "bde_name" -u adh -c active`` + +Pour une utilisation plus technique de cette commande se référer à sa documentation + +``./manage.py help generate_wrapped`` + +Le script prend une dizaine de minutes pour générer tous les wrappeds. + +Créer ses propres wrappeds +-------------------------- + +Cette section est plus technique et s'addresse plutôt à des respos infos en cours de mandat qui voudrai +faire les wrappeds de leur propre BDE. + +Contenu +~~~~~~~ + +Il est fortement conseillé de bien réfléchir à ce que l'on souhaite mettre sur un wrapped, plusieurs +critères sont à prendre compte : + +* compréhension, est-ce que la donnée fait sens auprès des utilisateur·ice·s. +* pertinence, est-ce que la donnée fonctionne pour un grand nombre d'utilisateur. +* faisabilité, est-ce que le temps de calcul est suffisament rapide. +* complexité, est-ce que c'est trop compliqué à coder. + +Script +~~~~~~ + +Le script *generate_wrapped* fonctionne de la manière suivante : + +* ``convert_to_note`` : en fonction des arguments d'entrée, il récupére toutes les notes dont le·s + wrapped·s va/vont être généré·s + ou regénéré·s. +* ``global_data`` : le script génére ensuite des statistiques globales qui concernent pas qu'une seule + note (nombre de soirée, classement, etc). +* ``unique_data`` : le script génére les statitiques uniques à chaque note, et rajoute des données + globales si nécessaire, pour chaque note on souhaite avoir un json avec toutes les données qui + seront dans le wrapped. +* ``make_wrapped`` : enfin, le cas échéant, pour chaque bde, et pour chaque note, le wrapped est crée + ou modifié, et enregistré, s'il est crée il est par défault non public. + +Seules les fonctions ``global_data`` et ``unique_data`` sont à modifier, pour implementer un nouveau +BDE. + +Template +~~~~~~~~ + +Il y a au moins deux templates a écrire pour chaque bde : + +* ``templates/wrapped/{bde_id}/wrapped_view_club.html``: le template pour les wrappeds des clubs +* ``templates/wrapped/{bde_id}/wrapped_view_user.html``: le template pour les wrappeds des + utilisateur·ice·s + +Il est conseillé de suivre la même arborescence pour les fichiers statics (fonts personnalisées, +images, css, etc). De même, il est conseillé de créé un fichier +``templates/wrapped/{bde_id}/wrapped_base.html`` et d'étendre cette template. diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 79814474..3f4c22d7 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-25 13:47+0100\n" +"POT-Creation-Date: 2025-03-13 21:08+0100\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi <bleizi@crans.org>\n" "Language-Team: French <http://translate.ynerant.fr/projects/nk20/nk20/fr/>\n" @@ -865,7 +865,7 @@ msgstr "Taille maximale : 2 Mo" msgid "This image cannot be loaded." msgstr "Cette image ne peut pas être chargée." -#: apps/member/forms.py:154 apps/member/views.py:103 +#: apps/member/forms.py:154 apps/member/views.py:117 #: apps/registration/forms.py:33 apps/registration/views.py:282 msgid "An alias with a similar name already exists." msgstr "Un alias avec un nom similaire existe déjà." @@ -1194,11 +1194,11 @@ msgstr "Adhésion de {user} pour le club {club}" msgid "The role {role} does not apply to the club {club}." msgstr "Le rôle {role} ne s'applique pas au club {club}." -#: apps/member/models.py:388 apps/member/views.py:745 +#: apps/member/models.py:388 apps/member/views.py:759 msgid "User is already a member of the club" msgstr "L'utilisateur·rice est déjà membre du club" -#: apps/member/models.py:400 apps/member/views.py:754 +#: apps/member/models.py:400 apps/member/views.py:768 msgid "User is not a member of the parent club" msgstr "L'utilisateur·rice n'est pas membre du club parent" @@ -1251,7 +1251,7 @@ msgid "Account #" msgstr "Compte n°" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:60 +#: apps/member/templates/member/base.html:62 apps/member/views.py:61 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -1312,8 +1312,8 @@ msgstr "" "seront à nouveau possible." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:304 -#: apps/member/views.py:545 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:318 +#: apps/member/views.py:559 msgid "Note aliases" msgstr "Alias de la note" @@ -1505,51 +1505,51 @@ msgstr "Sauvegarder les changements" msgid "Registrations" msgstr "Inscriptions" -#: apps/member/views.py:73 apps/registration/forms.py:23 +#: apps/member/views.py:74 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Cette adresse doit être valide." -#: apps/member/views.py:140 +#: apps/member/views.py:154 msgid "Profile detail" msgstr "Détails de l'utilisateur⋅rice" -#: apps/member/views.py:206 +#: apps/member/views.py:220 msgid "Search user" msgstr "Chercher un·e utilisateur·rice" -#: apps/member/views.py:258 +#: apps/member/views.py:272 msgid "Note friendships" msgstr "Amitiés note" -#: apps/member/views.py:328 +#: apps/member/views.py:342 msgid "Update note picture" msgstr "Modifier la photo de la note" -#: apps/member/views.py:377 +#: apps/member/views.py:391 msgid "Manage auth token" msgstr "Gérer les jetons d'authentification" -#: apps/member/views.py:404 +#: apps/member/views.py:418 msgid "Create new club" msgstr "Créer un nouveau club" -#: apps/member/views.py:423 +#: apps/member/views.py:437 msgid "Search club" msgstr "Chercher un club" -#: apps/member/views.py:461 +#: apps/member/views.py:475 msgid "Club detail" msgstr "Détails du club" -#: apps/member/views.py:573 +#: apps/member/views.py:587 msgid "Update club" msgstr "Modifier le club" -#: apps/member/views.py:607 +#: apps/member/views.py:621 msgid "Add new member to the club" msgstr "Ajouter un·e nouvelleau membre au club" -#: apps/member/views.py:736 apps/wei/views.py:991 +#: apps/member/views.py:750 apps/wei/views.py:991 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1557,19 +1557,19 @@ msgstr "" "Cet⋅te utilisateur⋅rice n'a pas assez d'argent pour rejoindre ce club et ne " "peut pas avoir un solde négatif." -#: apps/member/views.py:758 +#: apps/member/views.py:772 msgid "The membership must start after {:%m-%d-%Y}." msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}." -#: apps/member/views.py:763 +#: apps/member/views.py:777 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}." -#: apps/member/views.py:913 +#: apps/member/views.py:927 msgid "Manage roles of an user in the club" msgstr "Gérer les rôles d'un⋅e utilisateur⋅rice dans le club" -#: apps/member/views.py:938 +#: apps/member/views.py:952 msgid "Members of the club" msgstr "Membres du club" @@ -2084,7 +2084,7 @@ msgid "Button displayed" msgstr "Bouton affiché" #: apps/note/templates/note/transactiontemplate_list.html:100 -#: apps/wrapped/templates/wrapped/wrapped_list.html:63 +#: apps/wrapped/templates/wrapped/wrapped_list.html:70 msgid "An error occured" msgstr "Une erreur s'est produite" @@ -3662,6 +3662,14 @@ msgstr "soirée·s organisée·s" msgid "distinct members" msgstr "Membres distinct·e·s" +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:26 +msgid "Infortunately, you doesn't have consumer this year" +msgstr "Malheureusement, tu n'as pas de consommateur cette année" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:28 +msgid "Congratulations you are a real rat !" +msgstr "Félicitations, tu es un vrai rat !" + #: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 msgid "You participate to the wei: " msgstr "Tu as participé au wei : " @@ -3699,7 +3707,15 @@ msgstr "avec" msgid "Your expenses to BDE: " msgstr "Tes dépenses au BDE : " -#: apps/wrapped/templates/wrapped/wrapped_list.html:26 +#: apps/wrapped/templates/wrapped/wrapped_list.html:13 +msgid "My wrapped" +msgstr "Mes wrapped" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:22 +msgid "Public wrapped" +msgstr "Wrapped public" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:33 msgid "" "Do not forget to ask permission to people who are in your wrapped before to " "make them public" @@ -3707,19 +3723,19 @@ msgstr "" "N'oublies pas de demander la permission des personnes apparaissant dans un " "wrapped avant de le rendre public" -#: apps/wrapped/templates/wrapped/wrapped_list.html:33 +#: apps/wrapped/templates/wrapped/wrapped_list.html:40 msgid "Link copied" msgstr "Lien copié" -#: apps/wrapped/templates/wrapped/wrapped_list.html:58 +#: apps/wrapped/templates/wrapped/wrapped_list.html:65 msgid "Wrapped is private" msgstr "Le wrapped est privé" -#: apps/wrapped/templates/wrapped/wrapped_list.html:59 +#: apps/wrapped/templates/wrapped/wrapped_list.html:66 msgid "Wrapped is public" msgstr "Le wrapped est public" -#: apps/wrapped/views.py:24 +#: apps/wrapped/views.py:28 msgid "List of wrapped" msgstr "Liste des wrapped"