Merge branch 'migration-django-4-2' into 'main'

Migration django 4 2

See merge request bde/nk20!265
This commit is contained in:
korenstin 2024-08-29 10:49:44 +02:00
commit a5df98224f
14 changed files with 49 additions and 42 deletions

View File

@ -42,12 +42,12 @@ class UserTable(tables.Table):
""" """
alias = tables.Column() alias = tables.Column()
section = tables.Column(accessor='profile__section') section = tables.Column(accessor='profile__section', orderable=False)
# Override the column to let replace the URL # Override the column to let replace the URL
email = tables.EmailColumn(linkify=lambda record: "mailto:{}".format(record.email)) email = tables.EmailColumn(linkify=lambda record: "mailto:{}".format(record.email))
balance = tables.Column(accessor='note__balance', verbose_name=_("Balance")) balance = tables.Column(accessor='note__balance', verbose_name=_("Balance"), orderable=False)
def render_email(self, record, value): def render_email(self, record, value):
# Replace the email by a dash if the user can't see the profile detail # Replace the email by a dash if the user can't see the profile detail

View File

@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{{ title }} {{ title }}
</h3> </h3>
<div class="card-body"> <div class="card-body">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note"> <input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note...">
<div class="form-check"> <div class="form-check">
<label class="form-check-label" for="only_active"> <label class="form-check-label" for="only_active">
<input type="checkbox" class="checkboxinput form-check-input" id="only_active" <input type="checkbox" class="checkboxinput form-check-input" id="only_active"
@ -66,4 +66,4 @@ SPDX-License-Identifier: GPL-3.0-or-later
roles_obj.change(reloadTable); roles_obj.change(reloadTable);
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -260,11 +260,13 @@ class ButtonTable(tables.Table):
text=_('edit'), text=_('edit'),
accessor='pk', accessor='pk',
verbose_name=_("Edit"), verbose_name=_("Edit"),
orderable=False,
) )
hideshow = tables.Column( hideshow = tables.Column(
verbose_name=_("Hide/Show"), verbose_name=_("Hide/Show"),
accessor="pk", accessor="pk",
orderable=False,
attrs={ attrs={
'td': { 'td': {
'class': 'col-sm-1', 'class': 'col-sm-1',
@ -276,7 +278,8 @@ class ButtonTable(tables.Table):
delete_col = tables.TemplateColumn(template_code=DELETE_TEMPLATE, delete_col = tables.TemplateColumn(template_code=DELETE_TEMPLATE,
extra_context={"delete_trans": _('delete')}, extra_context={"delete_trans": _('delete')},
attrs={'td': {'class': 'col-sm-1'}}, attrs={'td': {'class': 'col-sm-1'}},
verbose_name=_("Delete"), ) verbose_name=_("Delete"),
orderable=False, )
def render_amount(self, value): def render_amount(self, value):
return pretty_money(value) return pretty_money(value)

View File

@ -135,18 +135,18 @@ class Permission(models.Model):
# A json encoded Q object with the following grammar # A json encoded Q object with the following grammar
# query -> [] | {} (the empty query representing all objects) # query -> [] | {} (the empty query representing all objects)
# query -> ["AND", query, …] AND multiple queries # query -> ["AND", query, ...] AND multiple queries
# | ["OR", query, …] OR multiple queries # | ["OR", query, ...] OR multiple queries
# | ["NOT", query] Opposite of query # | ["NOT", query] Opposite of query
# query -> {key: value, …} A list of fields and values of a Q object # query -> {key: value, ...} A list of fields and values of a Q object
# key -> string A field name # key -> string A field name
# value -> int | string | bool | null Literal values # value -> int | string | bool | null Literal values
# | [parameter, …] A parameter. See compute_param for more details. # | [parameter, ...] A parameter. See compute_param for more details.
# | {"F": oper} An F object # | {"F": oper} An F object
# oper -> [string, …] A parameter. See compute_param for more details. # oper -> [string, ...] A parameter. See compute_param for more details.
# | ["ADD", oper, …] Sum multiple F objects or literal # | ["ADD", oper, ...] Sum multiple F objects or literal
# | ["SUB", oper, oper] Substract two F objects or literal # | ["SUB", oper, oper] Substract two F objects or literal
# | ["MUL", oper, …] Multiply F objects or literals # | ["MUL", oper, ...] Multiply F objects or literals
# | int | string | bool | null Literal values # | int | string | bool | null Literal values
# | ["F", string] A field # | ["F", string] A field
# #

View File

@ -37,6 +37,7 @@ class InvoiceTable(tables.Table):
args=[A('id')], args=[A('id')],
verbose_name=_("delete"), verbose_name=_("delete"),
text=_("Delete"), text=_("Delete"),
orderable=False,
attrs={ attrs={
'th': { 'th': {
'id': 'delete-membership-header' 'id': 'delete-membership-header'
@ -70,6 +71,7 @@ class RemittanceTable(tables.Table):
verbose_name=_("View"), verbose_name=_("View"),
args=[A("pk")], args=[A("pk")],
text=_("View"), text=_("View"),
orderable=False,
attrs={ attrs={
'a': {'class': 'btn btn-primary'} 'a': {'class': 'btn btn-primary'}
}, ) }, )
@ -97,6 +99,7 @@ class SpecialTransactionTable(tables.Table):
verbose_name=_("Remittance"), verbose_name=_("Remittance"),
args=[A("specialtransactionproxy__pk")], args=[A("specialtransactionproxy__pk")],
text=_("Add"), text=_("Add"),
orderable=False,
attrs={ attrs={
'a': {'class': 'btn btn-primary'} 'a': {'class': 'btn btn-primary'}
}, ) }, )
@ -105,6 +108,7 @@ class SpecialTransactionTable(tables.Table):
verbose_name=_("Remittance"), verbose_name=_("Remittance"),
args=[A("specialtransactionproxy__pk")], args=[A("specialtransactionproxy__pk")],
text=_("Remove"), text=_("Remove"),
orderable=False,
attrs={ attrs={
'a': {'class': 'btn btn-primary btn-danger'} 'a': {'class': 'btn btn-primary btn-danger'}
}, ) }, )
@ -130,10 +134,12 @@ class SogeCreditTable(tables.Table):
amount = tables.Column( amount = tables.Column(
verbose_name=_("Amount"), verbose_name=_("Amount"),
orderable=False,
) )
valid = tables.Column( valid = tables.Column(
verbose_name=_("Valid"), verbose_name=_("Valid"),
orderable=False,
) )
def render_amount(self, value): def render_amount(self, value):

View File

@ -82,7 +82,7 @@ WORDS = {
5: "La quoi ?" 5: "La quoi ?"
}], }],
"kokarde": ["Qu'est-ce que le mot Kokarde t'évoque ?", { "kokarde": ["Qu'est-ce que le mot Kokarde t'évoque ?", {
1: "Vraiment pas mon truc les soirées", 1: "Vraiment pas mon truc les soirées...",
2: "Bof, je viens pour manger et je repars aussitôt", 2: "Bof, je viens pour manger et je repars aussitôt",
3: "Je kiffe, good vibes", 3: "Je kiffe, good vibes",
4: "Perso, je ne m'arrêterai pas de danser sur la piste !", 4: "Perso, je ne m'arrêterai pas de danser sur la piste !",
@ -117,15 +117,15 @@ WORDS = {
5: "Je pourrais en faire à n'importe qui. Pourquoi ne pas créer le club Câl[ENS] ?" 5: "Je pourrais en faire à n'importe qui. Pourquoi ne pas créer le club Câl[ENS] ?"
}], }],
"vomi": ["Quel est ton rapport au vomi ?", { "vomi": ["Quel est ton rapport au vomi ?", {
1: "C'est compliqué", 1: "C'est compliqué...",
2: "Jamais je ne vomis mais je nettoie quand mes potes vomissent", 2: "Jamais je ne vomis mais je nettoie quand mes potes vomissent",
3: "Jamais je ne vomis et jamais je ne nettoie celui de quelqu'un d'autre", 3: "Jamais je ne vomis et jamais je ne nettoie celui de quelqu'un d'autre",
4: "Je vomis quelquefois, ça arrive, faites pas cette tête, mais je fins toujours par nettoyer !", 4: "Je vomis quelquefois, ça arrive, faites pas cette tête, mais je fins toujours par nettoyer !",
5: "Je vomis à chaque soirée et ce n'est jamais moi qui nettoie" 5: "Je vomis à chaque soirée et ce n'est jamais moi qui nettoie"
}], }],
"kfet": ["Qu'est ce que la Kfet t'évoque ?", { "kfet": ["Qu'est ce que la Kfet t'évoque ?", {
1: "La Kfet, quel lieu de dépravé⋅es sérieux", 1: "La Kfet, quel lieu de dépravé⋅es sérieux...",
2: "C'est un endroit à l'hygiène plus que douteuse", 2: "C'est un endroit à l'hygiène plus que douteuse...",
3: "Téma les prix des boissons et des snacks, c'est aberrant !", 3: "Téma les prix des boissons et des snacks, c'est aberrant !",
4: "En vrai, c'est cool, petit billard, petit canapé, chill !", 4: "En vrai, c'est cool, petit billard, petit canapé, chill !",
5: "Banger, j'y reste jusqu'à la fin de mes jours" 5: "Banger, j'y reste jusqu'à la fin de mes jours"
@ -147,7 +147,7 @@ WORDS = {
"scolarite": ["Comment tu vois ton cursus à l'ENS ?", { "scolarite": ["Comment tu vois ton cursus à l'ENS ?", {
1: "La tranquillité et le travail", 1: "La tranquillité et le travail",
2: "On va s'amuser tout en bossant", 2: "On va s'amuser tout en bossant",
3: "Ça va profiter et réviser au dernier moment pour les exams", 3: "Ça va profiter et réviser au dernier moment pour les exams...",
4: "Nous festoierons sans songer aux conséquences", 4: "Nous festoierons sans songer aux conséquences",
5: "Je ne vois qu'une seule issue : la débauche" 5: "Je ne vois qu'une seule issue : la débauche"
}] }]

View File

@ -32,7 +32,7 @@ Applications indispensables
* `Note <note>`_ : * `Note <note>`_ :
Les notes associées à des utilisateur⋅rices ou des clubs. Les notes associées à des utilisateur⋅rices ou des clubs.
* `Activity <activity>`_ : * `Activity <activity>`_ :
La gestion des activités (créations, gestion, entrées,) La gestion des activités (créations, gestion, entrées, ...)
* `Permission <permission>`_ : * `Permission <permission>`_ :
Backend de droits, limites les pouvoirs des utilisateur⋅rices Backend de droits, limites les pouvoirs des utilisateur⋅rices
* `API <../api>`_ : * `API <../api>`_ :
@ -64,9 +64,9 @@ Applications facultatives
* ``cas-server`` * ``cas-server``
Serveur central d'authentification, permet d'utiliser son compte de la NoteKfet2020 pour se connecter à d'autre application ayant intégrer un client. Serveur central d'authentification, permet d'utiliser son compte de la NoteKfet2020 pour se connecter à d'autre application ayant intégrer un client.
* `Scripts <https://gitlab.crans.org/bde/nk20-scripts>`_ * `Scripts <https://gitlab.crans.org/bde/nk20-scripts>`_
Ensemble de commande `./manage.py` pour la gestion de la note: import de données, verification d'intégrité, etc Ensemble de commande `./manage.py` pour la gestion de la note: import de données, verification d'intégrité, etc...
* `Treasury <treasury>`_ : * `Treasury <treasury>`_ :
Interface de gestion pour les trésorièr⋅es, émission de factures, remises de chèque, statistiques ... Interface de gestion pour les trésorièr⋅es, émission de factures, remises de chèque, statistiques...
* `WEI <wei>`_ : * `WEI <wei>`_ :
Interface de gestion du WEI. Interface de gestion du WEI.

View File

@ -43,7 +43,7 @@ l'utilisateur⋅rice, utiles pour l'adhésion au BDE :
* ``address`` : ``CharField``, adresse physique de l'utilisateur⋅rice * ``address`` : ``CharField``, adresse physique de l'utilisateur⋅rice
* ``paid`` : ``BooleanField``, indique si l'utilisateur⋅rice normalien⋅ne est rémunéré⋅e ou non (utile pour différencier les montants d'adhésion aux clubs) * ``paid`` : ``BooleanField``, indique si l'utilisateur⋅rice normalien⋅ne est rémunéré⋅e ou non (utile pour différencier les montants d'adhésion aux clubs)
* ``phone_number`` : ``CharField``, numéro de téléphone de l'utilisateur⋅rice * ``phone_number`` : ``CharField``, numéro de téléphone de l'utilisateur⋅rice
* ``section`` : ``CharField``, section de l'ENS à laquelle appartient l'utilisateur⋅rice (exemple : 1A0,) * ``section`` : ``CharField``, section de l'ENS à laquelle appartient l'utilisateur⋅rice (exemple : 1A0, ...)
Clubs Clubs
~~~~~ ~~~~~
@ -101,7 +101,7 @@ Adhésions
La Note Kfet offre la possibilité aux clubs de gérer l'adhésion de leurs membres. En plus de réguler les cotisations La Note Kfet offre la possibilité aux clubs de gérer l'adhésion de leurs membres. En plus de réguler les cotisations
des adhérent⋅es, des permissions sont octroyées sur la note en fonction des rôles au sein des clubs. Un rôle est une des adhérent⋅es, des permissions sont octroyées sur la note en fonction des rôles au sein des clubs. Un rôle est une
fonction occupée au sein d'un club (Trésorièr⋅e de club, président⋅e de club, GC Kfet, Res[pot], respo info,). fonction occupée au sein d'un club (Trésorièr⋅e de club, président⋅e de club, GC Kfet, Res[pot], respo info, ...).
Une adhésion attribue à un⋅e adhérent⋅e ses rôles. Les rôles fournissent les permissions. Par exemple, læ trésorièr⋅e d'un Une adhésion attribue à un⋅e adhérent⋅e ses rôles. Les rôles fournissent les permissions. Par exemple, læ trésorièr⋅e d'un
club a le droit de faire des transferts de et vers la note du club, tant que la source reste au-dessus de -50 €. club a le droit de faire des transferts de et vers la note du club, tant que la source reste au-dessus de -50 €.
Une adhésion est considérée comme valide si la date du jour est comprise (au sens large) entre les dates de début et Une adhésion est considérée comme valide si la date du jour est comprise (au sens large) entre les dates de début et

View File

@ -49,7 +49,7 @@ Une fois l'inscription validée, détail de ce qu'il se passe :
lui octroyant un faible nombre de permissions de base, telles que la visualisation de son compte. lui octroyant un faible nombre de permissions de base, telles que la visualisation de son compte.
* On adhère la personne au club Kfet si cela est demandé, l'adhésion commence aujourd'hui. Iel dispose d'un unique rôle : * On adhère la personne au club Kfet si cela est demandé, l'adhésion commence aujourd'hui. Iel dispose d'un unique rôle :
« Adhérent⋅e Kfet » , lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de « Adhérent⋅e Kfet » , lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de
faire des transactions, d'accéder aux activités, au WEI, faire des transactions, d'accéder aux activités, au WEI, ...
* Si læ nouvelleau membre a indiqué avoir ouvert un compte à la société générale, alors les transactions sont invalidées, * Si læ nouvelleau membre a indiqué avoir ouvert un compte à la société générale, alors les transactions sont invalidées,
la note n'est pas débitée (commence alors à 0 €). la note n'est pas débitée (commence alors à 0 €).

View File

@ -3744,8 +3744,8 @@ msgid "FAQ (FR)"
msgstr "FAQ (FR)" msgstr "FAQ (FR)"
#: note_kfet/templates/base_search.html:15 #: note_kfet/templates/base_search.html:15
msgid "Search by attribute such as name" msgid "Search by attribute such as name..."
msgstr "Suche nach Attributen wie Name" msgstr "Suche nach Attributen wie Name..."
#: note_kfet/templates/base_search.html:23 #: note_kfet/templates/base_search.html:23
msgid "There is no results." msgid "There is no results."

View File

@ -3694,8 +3694,8 @@ msgid "FAQ (FR)"
msgstr "FAQ (FR)" msgstr "FAQ (FR)"
#: note_kfet/templates/base_search.html:15 #: note_kfet/templates/base_search.html:15
msgid "Search by attribute such as name" msgid "Search by attribute such as name..."
msgstr "Buscar con atributo, como el nombre" msgstr "Buscar con atributo, como el nombre..."
#: note_kfet/templates/base_search.html:23 #: note_kfet/templates/base_search.html:23
msgid "There is no results." msgid "There is no results."

View File

@ -1930,8 +1930,8 @@ msgstr "Consommer"
#: apps/note/templates/note/conso_form.html:43 #: apps/note/templates/note/conso_form.html:43
#: apps/note/templates/note/transaction_form.html:69 #: apps/note/templates/note/transaction_form.html:69
#: apps/note/templates/note/transaction_form.html:96 #: apps/note/templates/note/transaction_form.html:96
msgid "Name or alias" msgid "Name or alias..."
msgstr "Pseudo ou alias" msgstr "Pseudo ou alias..."
#: apps/note/templates/note/conso_form.html:53 #: apps/note/templates/note/conso_form.html:53
msgid "Select consumptions" msgid "Select consumptions"
@ -2031,8 +2031,8 @@ msgid "Current price"
msgstr "Prix actuel" msgstr "Prix actuel"
#: apps/note/templates/note/transactiontemplate_list.html:13 #: apps/note/templates/note/transactiontemplate_list.html:13
msgid "Name of the button" msgid "Name of the button..."
msgstr "Nom du bouton" msgstr "Nom du bouton..."
#: apps/note/templates/note/transactiontemplate_list.html:15 #: apps/note/templates/note/transactiontemplate_list.html:15
msgid "New button" msgid "New button"
@ -3385,8 +3385,8 @@ msgstr ""
"coût d'adhésion." "coût d'adhésion."
#: apps/wei/templates/wei/weimembership_list.html:27 #: apps/wei/templates/wei/weimembership_list.html:27
msgid "View unvalidated registrations" msgid "View unvalidated registrations..."
msgstr "Voir les inscriptions non validées" msgstr "Voir les inscriptions non validées..."
#: apps/wei/templates/wei/weiregistration_confirm_delete.html:16 #: apps/wei/templates/wei/weiregistration_confirm_delete.html:16
msgid "This registration is already validated and can't be deleted." msgid "This registration is already validated and can't be deleted."
@ -3406,8 +3406,8 @@ msgid "There is no pre-registration found with this pattern."
msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée." msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée."
#: apps/wei/templates/wei/weiregistration_list.html:27 #: apps/wei/templates/wei/weiregistration_list.html:27
msgid "View validated memberships…" msgid "View validated membershipis..."
msgstr "Voir les adhésions validées" msgstr "Voir les adhésions validées..."
#: apps/wei/views.py:58 #: apps/wei/views.py:58
msgid "Search WEI" msgid "Search WEI"
@ -3672,8 +3672,8 @@ msgid "FAQ (FR)"
msgstr "FAQ (FR)" msgstr "FAQ (FR)"
#: note_kfet/templates/base_search.html:15 #: note_kfet/templates/base_search.html:15
msgid "Search by attribute such as name" msgid "Search by attribute such as name..."
msgstr "Chercher par un attribut tel que le nom" msgstr "Chercher par un attribut tel que le nom..."
#: note_kfet/templates/base_search.html:23 #: note_kfet/templates/base_search.html:23
msgid "There is no results." msgid "There is no results."

View File

@ -265,11 +265,9 @@ OAUTH2_PROVIDER = {
'SCOPES_BACKEND_CLASS': 'permission.scopes.PermissionScopes', 'SCOPES_BACKEND_CLASS': 'permission.scopes.PermissionScopes',
'OAUTH2_VALIDATOR_CLASS': "permission.scopes.PermissionOAuth2Validator", 'OAUTH2_VALIDATOR_CLASS': "permission.scopes.PermissionOAuth2Validator",
'REFRESH_TOKEN_EXPIRE_SECONDS': timedelta(days=14), 'REFRESH_TOKEN_EXPIRE_SECONDS': timedelta(days=14),
'PKCE_REQUIRED': False, # PKCE (fix a breaking change of django-oauth-toolkit 2.0.0)
} }
# PKCE (fix a breaking change of django-oauth-toolkit 2.0.0)
PKCE_REQUIRED = False
# Take control on how widget templates are sourced # Take control on how widget templates are sourced
# See https://docs.djangoproject.com/en/2.2/ref/forms/renderers/#templatessetting # See https://docs.djangoproject.com/en/2.2/ref/forms/renderers/#templatessetting
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

View File

@ -12,7 +12,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</h3> </h3>
<div class="card-body"> <div class="card-body">
<input id="searchbar" type="text" class="form-control" <input id="searchbar" type="text" class="form-control"
placeholder="{% trans "Search by attribute such as name" %}"> placeholder="{% trans "Search by attribute such as name..." %}">
</div> </div>
<div id="dynamic-table"> <div id="dynamic-table">
{% if table.data %} {% if table.data %}
@ -75,4 +75,4 @@ SPDX-License-Identifier: GPL-3.0-or-later
init_table(); init_table();
}); });
</script> </script>
{% endblock %} {% endblock %}