diff --git a/README.md b/README.md index 7297a1b6..4ba19356 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,13 @@ Bien que cela permette de créer une instance sur toutes les distributions, (env)$ ./manage.py createsuperuser # Création d'un⋅e utilisateur⋅rice initial ``` -6. Enjoy : +6. (Optionnel) **Création d'une clé privée OpenID Connect** + +Pour activer le support d'OpenID Connect, il faut générer une clé privée, par +exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et renseigner son +emplacement dans `OIDC_RSA_PRIVATE_KEY` (par défaut `/var/secrets/oidc.key`). + +7. Enjoy : ```bash (env)$ ./manage.py runserver 0.0.0.0:8000 @@ -228,7 +234,13 @@ Sinon vous pouvez suivre les étapes décrites ci-dessous. (env)$ ./manage.py check # pas de bêtise qui traine (env)$ ./manage.py migrate -7. *Enjoy \o/* +7. **Création d'une clé privée OpenID Connect** + +Pour activer le support d'OpenID Connect, il faut générer une clé privée, par +exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et renseigner son +emplacement dans `OIDC_RSA_PRIVATE_KEY` (par défaut `/var/secrets/oidc.key`). + +8. *Enjoy \o/* ### Installation avec Docker diff --git a/apps/activity/__init__.py b/apps/activity/__init__.py index 713ba510..ac885e3a 100644 --- a/apps/activity/__init__.py +++ b/apps/activity/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later default_app_config = 'activity.apps.ActivityConfig' diff --git a/apps/activity/admin.py b/apps/activity/admin.py index 3355d1aa..f605f73c 100644 --- a/apps/activity/admin.py +++ b/apps/activity/admin.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib import admin @@ -35,7 +35,7 @@ class GuestAdmin(admin.ModelAdmin): """ Admin customisation for Guest """ - list_display = ('last_name', 'first_name', 'activity', 'inviter') + list_display = ('last_name', 'first_name', 'school', 'activity', 'inviter') form = GuestForm diff --git a/apps/activity/api/serializers.py b/apps/activity/api/serializers.py index 31c23cb8..c2e7ada8 100644 --- a/apps/activity/api/serializers.py +++ b/apps/activity/api/serializers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.utils.translation import gettext_lazy as _ diff --git a/apps/activity/api/urls.py b/apps/activity/api/urls.py index 4ff977fe..5da3e208 100644 --- a/apps/activity/api/urls.py +++ b/apps/activity/api/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from .views import ActivityTypeViewSet, ActivityViewSet, EntryViewSet, GuestViewSet, OpenerViewSet diff --git a/apps/activity/api/views.py b/apps/activity/api/views.py index afa41ea7..2a769112 100644 --- a/apps/activity/api/views.py +++ b/apps/activity/api/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from api.filters import RegexSafeSearchFilter @@ -51,9 +51,9 @@ class GuestViewSet(ReadProtectedModelViewSet): queryset = Guest.objects.order_by('id') serializer_class = GuestSerializer filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter] - filterset_fields = ['activity', 'activity__name', 'last_name', 'first_name', 'inviter', 'inviter__alias__name', + filterset_fields = ['activity', 'activity__name', 'last_name', 'first_name', 'school', 'inviter', 'inviter__alias__name', 'inviter__alias__normalized_name', ] - search_fields = ['$activity__name', '$last_name', '$first_name', '$inviter__user__email', '$inviter__alias__name', + search_fields = ['$activity__name', '$last_name', '$first_name', '$school', '$inviter__user__email', '$inviter__alias__name', '$inviter__alias__normalized_name', ] diff --git a/apps/activity/apps.py b/apps/activity/apps.py index f3ee3936..394c715e 100644 --- a/apps/activity/apps.py +++ b/apps/activity/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.apps import AppConfig diff --git a/apps/activity/forms.py b/apps/activity/forms.py index 1070f19d..305c4f03 100644 --- a/apps/activity/forms.py +++ b/apps/activity/forms.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from datetime import timedelta @@ -107,7 +107,7 @@ class GuestForm(forms.ModelForm): class Meta: model = Guest - fields = ('last_name', 'first_name', 'inviter', ) + fields = ('last_name', 'first_name', 'school', 'inviter', ) widgets = { "inviter": Autocomplete( NoteUser, diff --git a/apps/activity/migrations/0006_guest_school.py b/apps/activity/migrations/0006_guest_school.py new file mode 100644 index 00000000..bce6862b --- /dev/null +++ b/apps/activity/migrations/0006_guest_school.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.20 on 2025-03-25 09:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("activity", "0005_alter_opener_options_alter_opener_opener"), + ] + + operations = [ + migrations.AddField( + model_name="guest", + name="school", + field=models.CharField(default="", max_length=255, verbose_name="school"), + preserve_default=False, + ), + ] diff --git a/apps/activity/models.py b/apps/activity/models.py index c9f5842e..c7c92e8d 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import os @@ -201,7 +201,8 @@ class Entry(models.Model): def save(self, *args, **kwargs): qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest) if qs.exists(): - raise ValidationError(_("Already entered on ") + _("{:%Y-%m-%d %H:%M:%S}").format(qs.get().time, )) + raise ValidationError(_("Already entered on ") + + _("{:%Y-%m-%d %H:%M:%S}").format(timezone.localtime(qs.get().time), )) if self.guest: self.note = self.guest.inviter @@ -247,6 +248,11 @@ class Guest(models.Model): verbose_name=_("first name"), ) + school = models.CharField( + max_length=255, + verbose_name=_("school"), + ) + inviter = models.ForeignKey( NoteUser, on_delete=models.PROTECT, diff --git a/apps/activity/tables.py b/apps/activity/tables.py index 3128aaec..8fa342f7 100644 --- a/apps/activity/tables.py +++ b/apps/activity/tables.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import datetime @@ -53,11 +53,11 @@ class GuestTable(tables.Table): } model = Guest template_name = 'django_tables2/bootstrap4.html' - fields = ("last_name", "first_name", "inviter", ) + fields = ("last_name", "first_name", "inviter", "school") def render_entry(self, record): if record.has_entry: - return str(_("Entered on ") + str(_("{:%Y-%m-%d %H:%M:%S}").format(record.entry.time, ))) + return str(_("Entered on ") + str(_("{:%Y-%m-%d %H:%M:%S}").format(timezone.localtime(record.entry.time)))) return mark_safe(''.format(id=record.id, delete_trans=_("remove").capitalize())) diff --git a/apps/activity/tests/test_activities.py b/apps/activity/tests/test_activities.py index 379f5d1b..3657ff98 100644 --- a/apps/activity/tests/test_activities.py +++ b/apps/activity/tests/test_activities.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from datetime import timedelta @@ -50,6 +50,7 @@ class TestActivities(TestCase): inviter=self.user.note, last_name="GUEST", first_name="Guest", + school="School", ) def test_activity_list(self): @@ -156,6 +157,7 @@ class TestActivities(TestCase): inviter=self.user.note.id, last_name="GUEST2", first_name="Guest", + school="School", )) self.assertEqual(response.status_code, 200) @@ -167,6 +169,7 @@ class TestActivities(TestCase): inviter=self.user.note.id, last_name="GUEST2", first_name="Guest", + school="School", )) self.assertRedirects(response, reverse("activity:activity_detail", args=(self.activity.pk,)), 302, 200) @@ -200,6 +203,7 @@ class TestActivityAPI(TestAPI): inviter=self.user.note, last_name="GUEST", first_name="Guest", + school="School", ) self.entry = Entry.objects.create( diff --git a/apps/activity/urls.py b/apps/activity/urls.py index 3578c340..962be72a 100644 --- a/apps/activity/urls.py +++ b/apps/activity/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.urls import path diff --git a/apps/activity/views.py b/apps/activity/views.py index 873c3015..d80ab927 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from hashlib import md5 @@ -168,6 +168,7 @@ class ActivityInviteView(ProtectQuerysetMixin, ProtectedCreateView): activity=activity, first_name="", last_name="", + school="", inviter=self.request.user.note, ) @@ -265,7 +266,6 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): # Keep only users that have a note note_qs = note_qs.filter(note__noteuser__isnull=False).exclude(note__inactivity_reason='forced') - if activity.activity_type.name != "Pot Vieux": # Keep only members note_qs = note_qs.filter( @@ -339,7 +339,7 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): context["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk context["notespecial_ctype"] = ContentType.objects.get_for_model(NoteSpecial).pk - activities_open = Activity.objects.filter(open=True).filter( + activities_open = Activity.objects.filter(open=True, activity_type__manage_entries=True).filter( PermissionBackend.filter_queryset(self.request, Activity, "view")).distinct().all() context["activities_open"] = [a for a in activities_open if PermissionBackend.check_perm(self.request, diff --git a/apps/api/__init__.py b/apps/api/__init__.py index 2e6addb0..70529f08 100644 --- a/apps/api/__init__.py +++ b/apps/api/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later default_app_config = 'api.apps.APIConfig' diff --git a/apps/api/apps.py b/apps/api/apps.py index 46fa6979..c778bac6 100644 --- a/apps/api/apps.py +++ b/apps/api/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.apps import AppConfig diff --git a/apps/api/serializers.py b/apps/api/serializers.py index 74a95775..7891bfc6 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/apps/api/tests.py b/apps/api/tests.py index 6be818bf..912044df 100644 --- a/apps/api/tests.py +++ b/apps/api/tests.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import json diff --git a/apps/api/urls.py b/apps/api/urls.py index ef631004..c9e0dfa4 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.conf import settings @@ -47,6 +47,10 @@ if "wei" in settings.INSTALLED_APPS: from wei.api.urls import register_wei_urls register_wei_urls(router, 'wei') +if "wrapped" in settings.INSTALLED_APPS: + from wrapped.api.urls import register_wrapped_urls + register_wrapped_urls(router, 'wrapped') + app_name = 'api' # Wire up our API using automatic URL routing. diff --git a/apps/api/views.py b/apps/api/views.py index 43ef3f78..a6667042 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib.auth.models import User diff --git a/apps/api/viewsets.py b/apps/api/viewsets.py index b1d42c50..5c17eab4 100644 --- a/apps/api/viewsets.py +++ b/apps/api/viewsets.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import re diff --git a/apps/food/admin.py b/apps/food/admin.py index fa32755a..89f042e1 100644 --- a/apps/food/admin.py +++ b/apps/food/admin.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib import admin diff --git a/apps/food/api/serializers.py b/apps/food/api/serializers.py index 9c42013f..acac2ba9 100644 --- a/apps/food/api/serializers.py +++ b/apps/food/api/serializers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from rest_framework import serializers diff --git a/apps/food/api/urls.py b/apps/food/api/urls.py index acfb635d..23c67bdd 100644 --- a/apps/food/api/urls.py +++ b/apps/food/api/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from .views import AllergenViewSet, BasicFoodViewSet, QRCodeViewSet, TransformedFoodViewSet diff --git a/apps/food/api/views.py b/apps/food/api/views.py index 824ff809..af616074 100644 --- a/apps/food/api/views.py +++ b/apps/food/api/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from api.viewsets import ReadProtectedModelViewSet diff --git a/apps/food/apps.py b/apps/food/apps.py index 62ede85f..094d9e27 100644 --- a/apps/food/apps.py +++ b/apps/food/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/apps/food/forms.py b/apps/food/forms.py index 4f567e59..af468c7f 100644 --- a/apps/food/forms.py +++ b/apps/food/forms.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from random import shuffle diff --git a/apps/food/models.py b/apps/food/models.py index 97e00ff9..199dcdd7 100644 --- a/apps/food/models.py +++ b/apps/food/models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from datetime import timedelta diff --git a/apps/food/tables.py b/apps/food/tables.py index 4a180c76..4ab15879 100644 --- a/apps/food/tables.py +++ b/apps/food/tables.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import django_tables2 as tables diff --git a/apps/food/urls.py b/apps/food/urls.py index 09bb8ebe..59063cfe 100644 --- a/apps/food/urls.py +++ b/apps/food/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.urls import path diff --git a/apps/food/views.py b/apps/food/views.py index 88964a5f..8c63530c 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.db import transaction diff --git a/apps/logs/__init__.py b/apps/logs/__init__.py index 5271d575..fb9151c9 100644 --- a/apps/logs/__init__.py +++ b/apps/logs/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later default_app_config = 'logs.apps.LogsConfig' diff --git a/apps/logs/api/serializers.py b/apps/logs/api/serializers.py index cca94155..313db8e6 100644 --- a/apps/logs/api/serializers.py +++ b/apps/logs/api/serializers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from rest_framework import serializers diff --git a/apps/logs/api/urls.py b/apps/logs/api/urls.py index 9f255dd5..2c9462c2 100644 --- a/apps/logs/api/urls.py +++ b/apps/logs/api/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from .views import ChangelogViewSet diff --git a/apps/logs/api/views.py b/apps/logs/api/views.py index 655a473a..6bd4da70 100644 --- a/apps/logs/api/views.py +++ b/apps/logs/api/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django_filters.rest_framework import DjangoFilterBackend diff --git a/apps/logs/apps.py b/apps/logs/apps.py index 366981ec..2e3dd6f9 100644 --- a/apps/logs/apps.py +++ b/apps/logs/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.apps import AppConfig diff --git a/apps/logs/models.py b/apps/logs/models.py index 8f2c2eda..79fb8524 100644 --- a/apps/logs/models.py +++ b/apps/logs/models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.conf import settings diff --git a/apps/logs/signals.py b/apps/logs/signals.py index c4fc08f3..98d0270a 100644 --- a/apps/logs/signals.py +++ b/apps/logs/signals.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib.contenttypes.models import ContentType diff --git a/apps/member/__init__.py b/apps/member/__init__.py index d0ab8586..6fce9278 100644 --- a/apps/member/__init__.py +++ b/apps/member/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later default_app_config = 'member.apps.MemberConfig' diff --git a/apps/member/admin.py b/apps/member/admin.py index 3adc54ed..f2683619 100644 --- a/apps/member/admin.py +++ b/apps/member/admin.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib import admin diff --git a/apps/member/api/serializers.py b/apps/member/api/serializers.py index 31bb1655..a39aa6e3 100644 --- a/apps/member/api/serializers.py +++ b/apps/member/api/serializers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from rest_framework import serializers diff --git a/apps/member/api/urls.py b/apps/member/api/urls.py index 6f323186..3f5c7d64 100644 --- a/apps/member/api/urls.py +++ b/apps/member/api/urls.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from .views import ProfileViewSet, ClubViewSet, MembershipViewSet diff --git a/apps/member/api/views.py b/apps/member/api/views.py index a24a12d6..6d035016 100644 --- a/apps/member/api/views.py +++ b/apps/member/api/views.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django_filters.rest_framework import DjangoFilterBackend diff --git a/apps/member/apps.py b/apps/member/apps.py index 840c8783..d5b1f630 100644 --- a/apps/member/apps.py +++ b/apps/member/apps.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.apps import AppConfig diff --git a/apps/member/auth.py b/apps/member/auth.py index 06e48afa..67b2c966 100644 --- a/apps/member/auth.py +++ b/apps/member/auth.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from cas_server.auth import DjangoAuthUser # pragma: no cover diff --git a/apps/member/forms.py b/apps/member/forms.py index a74ddb90..c4940bf6 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import io @@ -23,7 +23,7 @@ from .models import Profile, Club, Membership class CustomAuthenticationForm(AuthenticationForm): permission_mask = forms.ModelChoiceField( label=_("Permission mask"), - queryset=PermissionMask.objects.order_by("rank"), + queryset=PermissionMask.objects.order_by("-rank"), empty_label=None, ) @@ -44,6 +44,7 @@ class ProfileForm(forms.ModelForm): """ A form for the extras field provided by the :model:`member.Profile` model. """ + # Remove widget=forms.HiddenInput() if you want to use report frequency. report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) @@ -76,7 +77,8 @@ class ProfileForm(forms.ModelForm): class Meta: model = Profile fields = '__all__' - exclude = ('user', 'email_confirmed', 'registration_valid', ) + # Remove ml_[asso]_registration from exclude if the concerned association uses nk20 to manage its mailing list. + exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', ) class ImageForm(forms.Form): diff --git a/apps/member/hashers.py b/apps/member/hashers.py index 659aab39..797ec485 100644 --- a/apps/member/hashers.py +++ b/apps/member/hashers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import hashlib diff --git a/apps/member/models.py b/apps/member/models.py index 78d59667..54637847 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later import datetime diff --git a/apps/member/signals.py b/apps/member/signals.py index 94dd4021..869f9117 100644 --- a/apps/member/signals.py +++ b/apps/member/signals.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/apps/member/tables.py b/apps/member/tables.py index 836b3555..475c6eb2 100644 --- a/apps/member/tables.py +++ b/apps/member/tables.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from datetime import date diff --git a/apps/member/templates/member/picture_update.html b/apps/member/templates/member/picture_update.html index 60707dcb..dc21cad5 100644 --- a/apps/member/templates/member/picture_update.html +++ b/apps/member/templates/member/picture_update.html @@ -20,12 +20,14 @@ SPDX-License-Identifier: GPL-3.0-or-later -