1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2025-06-21 18:08:21 +02:00

Compare commits

...

43 Commits

Author SHA1 Message Date
238ba78f4f Forgot to import PermissionBackend 2025-02-13 00:54:55 +01:00
0ec771b5ee Add some security 2025-02-13 00:39:05 +01:00
c841fb6068 Some corrections for report_frequency 2025-02-12 23:46:19 +01:00
f6649f155a linters 2025-02-09 16:51:31 +01:00
5707abf9e2 Update file views.py 2025-02-09 16:22:03 +01:00
056c4029f8 Update file views.py 2025-02-09 16:19:26 +01:00
bfd865b3e3 Update file views.py 2025-02-09 16:14:28 +01:00
6ceb43cb66 Update file views.py 2025-02-09 16:07:30 +01:00
9635004520 Update file views.py 2025-02-09 15:56:12 +01:00
05e21ed229 Update file views.py 2025-02-09 15:51:05 +01:00
b2ccc4aede Update file views.py 2025-02-09 15:50:13 +01:00
6229652dea Update file views.py 2025-02-09 15:47:32 +01:00
eee87dcf13 Update file views.py 2025-02-09 15:42:20 +01:00
bcf21507e5 Update file views.py 2025-02-09 15:39:08 +01:00
6127ced143 Update file views.py 2025-02-09 15:33:37 +01:00
f63e5dcb5a Update file views.py 2025-02-09 15:26:39 +01:00
73aa0098bf Update file views.py 2025-02-09 15:20:03 +01:00
694a5c7bd8 Update file initial.json 2025-02-09 13:05:10 +01:00
a4480258d7 Update file initial.json 2025-02-09 12:45:46 +01:00
821efbf78b Merge branch 'Automation_mailing_lists' into 'main'
Automation mailing lists

See merge request bde/nk20!280
2025-02-02 14:53:04 +01:00
a209e0d366 Update file forms.py 2025-02-02 14:30:53 +01:00
ef485e0628 Update file forms.py 2025-02-02 14:06:22 +01:00
1481aa0635 Update file forms.py 2025-02-02 14:05:05 +01:00
867bf9fd25 Update file forms.py 2025-02-02 13:33:41 +01:00
47fda0ea36 Update file forms.py 2025-02-02 13:17:19 +01:00
623290827a Update file forms.py 2025-01-27 16:34:45 +01:00
a87ce625f3 Update file note.cron 2025-01-25 13:55:21 +01:00
3559787fa7 Merge branch 'New_permission' into 'main'
New permission

See merge request bde/nk20!278
2025-01-18 15:41:15 +01:00
bd6ed27ae5 Update 2 files
- /apps/permission/fixtures/initial.json
- /apps/permission/admin.py
2025-01-18 15:11:57 +01:00
43dc676747 Update file initial.json 2025-01-18 12:57:42 +01:00
caaeab6b0b Update file initial.json 2025-01-17 19:39:26 +01:00
54ba786884 Update file initial.json 2025-01-17 19:03:59 +01:00
80e109114f Update file initial.json 2025-01-17 18:23:28 +01:00
787005e60d Merge branch 'finito_sda' into 'main'
finitio le message sda

See merge request bde/nk20!279
2025-01-06 00:11:01 +01:00
414e103686 finitio le message sda 2025-01-05 23:17:01 +01:00
942d887c2e Update file initial.json 2024-12-23 18:31:11 +01:00
a63c34fe37 Update file initial.json 2024-12-22 21:38:17 +01:00
2be6133458 Update file initial.json 2024-12-22 20:42:20 +01:00
7975fe47a6 Merge branch 'sda' into 'main'
Donation goal la note kfet x les SdA

See merge request bde/nk20!277
2024-10-10 23:44:22 +02:00
476fbceeea Donation goal la note kfet x les SdA 2024-10-10 01:48:23 +02:00
8fbaa0bdc8 Merge branch 'linters' into 'main'
fix linters for WEI 2024 survey

See merge request bde/nk20!274
2024-10-03 16:51:04 +02:00
a0de63effd Merge branch 'beta' into 'main'
Correction translation of sport events ml

See merge request bde/nk20!276
2024-09-18 13:52:33 +02:00
3c34033bf5 fix linters for WEI 2024 survey 2024-09-12 13:41:04 +02:00
9 changed files with 144 additions and 21 deletions

View File

@ -15,6 +15,7 @@ from django.utils.translation import gettext_lazy as _
from note.models import NoteSpecial, Alias from note.models import NoteSpecial, Alias
from note_kfet.inputs import Autocomplete, AmountInput from note_kfet.inputs import Autocomplete, AmountInput
from permission.models import PermissionMask, Role from permission.models import PermissionMask, Role
from permission.backends import PermissionBackend
from PIL import Image, ImageSequence from PIL import Image, ImageSequence
from .models import Profile, Club, Membership from .models import Profile, Club, Membership
@ -44,9 +45,10 @@ class ProfileForm(forms.ModelForm):
""" """
A form for the extras field provided by the :model:`member.Profile` model. A form for the extras field provided by the :model:`member.Profile` model.
""" """
report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"))
last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) report_frequency = forms.IntegerField(required=False, initial=0, label=_("Statement frequency (in days)"))
last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last statement date"))
VSS_charter_read = forms.BooleanField( VSS_charter_read = forms.BooleanField(
required=True, required=True,
@ -65,6 +67,14 @@ class ProfileForm(forms.ModelForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['address'].widget.attrs.update({"placeholder": "4 avenue des Sciences, 91190 GIF-SUR-YVETTE"}) self.fields['address'].widget.attrs.update({"placeholder": "4 avenue des Sciences, 91190 GIF-SUR-YVETTE"})
self.fields['promotion'].widget.attrs.update({"max": timezone.now().year}) self.fields['promotion'].widget.attrs.update({"max": timezone.now().year})
def clean(self):
"""Force the values of fields that the user does not have permission to modify.."""
cleaned_data = super().clean()
for field_name in self.fields.keys():
if not PermissionBackend.check_perm(self.request, f"member.change_profile_{field_name}", self.instance):
cleaned_data[field_name] = getattr(self.instance, field_name) # Force the old value
return cleaned_data
@transaction.atomic @transaction.atomic
def save(self, commit=True): def save(self, commit=True):
@ -76,7 +86,8 @@ class ProfileForm(forms.ModelForm):
class Meta: class Meta:
model = Profile model = Profile
fields = '__all__' 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): class ImageForm(forms.Form):

View File

@ -114,12 +114,12 @@ class Profile(models.Model):
) )
report_frequency = models.PositiveSmallIntegerField( report_frequency = models.PositiveSmallIntegerField(
verbose_name=_("report frequency (in days)"), verbose_name=_("Statement frequency (in days)"),
default=0, default=0,
) )
last_report = models.DateTimeField( last_report = models.DateTimeField(
verbose_name=_("last report date"), verbose_name=_("Last statement date"),
default=timezone.now, default=timezone.now,
) )

View File

@ -26,6 +26,7 @@ from note_kfet.middlewares import _set_current_request
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from permission.models import Role from permission.models import Role
from permission.views import ProtectQuerysetMixin, ProtectedCreateView from permission.views import ProtectQuerysetMixin, ProtectedCreateView
from django import forms
from .forms import UserForm, ProfileForm, ImageForm, ClubForm, MembershipForm, \ from .forms import UserForm, ProfileForm, ImageForm, ClubForm, MembershipForm, \
CustomAuthenticationForm, MembershipRolesForm CustomAuthenticationForm, MembershipRolesForm
@ -72,11 +73,19 @@ class UserUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
form.fields['email'].required = True form.fields['email'].required = True
form.fields['email'].help_text = _("This address must be valid.") form.fields['email'].help_text = _("This address must be valid.")
if PermissionBackend.check_perm(self.request, "member.change_profile", context['user_object'].profile): profile_form = self.profile_form(instance=context['user_object'].profile,
context['profile_form'] = self.profile_form(instance=context['user_object'].profile, data=self.request.POST if self.request.POST else None)
data=self.request.POST if self.request.POST else None) if not self.object.profile.report_frequency:
if not self.object.profile.report_frequency: del profile_form.fields["last_report"]
del context['profile_form'].fields["last_report"]
fields_to_check = list(profile_form.fields.keys())
# Delete the fields for which the user does not have the permission to modify
for field_name in fields_to_check:
if not PermissionBackend.check_perm(self.request, f"member.change_profile_{field_name}", context['user_object'].profile):
profile_form.fields[field_name].widget = forms.HiddenInput()
context['profile_form'] = profile_form
return context return context

View File

@ -31,3 +31,4 @@ class RoleAdmin(admin.ModelAdmin):
Admin customisation for Role Admin customisation for Role
""" """
list_display = ('name', ) list_display = ('name', )
filter_horizontal = ('permissions',)

View File

@ -3800,6 +3800,106 @@
"description": "Voir les utilisateurs adhérents au club parent" "description": "Voir les utilisateurs adhérents au club parent"
} }
}, },
{
"model": "permission.permission",
"pk": 242,
"fields": {
"model": [
"note",
"transaction"
],
"query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]",
"type": "add",
"mask": 2,
"field": "",
"permanent": false,
"description": "Créer une transaction vers la note d'un club"
}
},
{
"model": "permission.permission",
"pk": 243,
"fields": {
"model": [
"member",
"profile"
],
"query": "{\"user__memberships__club\": [\"club\"], \"user__memberships__date_start__lte\": [\"today\"],\"user__memberships__date_end__gte\": [\"today\"]}",
"type": "view",
"mask": 3,
"field": "",
"permanent": false,
"description": "Voir les profils des membres du club"
}
},
{
"model": "permission.permission",
"pk": 244,
"fields": {
"model": [
"member",
"profile"
],
"query": "{}",
"type": "change",
"mask": 3,
"field": "ml_events_registration",
"permanent": false,
"description": "Modifier l'abonnement à la Newsletter BDE pour n'importe quel profil"
}
},
{
"model": "permission.permission",
"pk": 245,
"fields": {
"model": [
"member",
"profile"
],
"query": "{}",
"type": "change",
"mask": 3,
"field": "ml_art_registration",
"permanent": false,
"description": "Modifier l'abonnement à la Newsletter Art pour n'importe quel profil"
}
},
{
"model": "permission.permission",
"pk": 246,
"fields": {
"model": [
"member",
"profile"
],
"query": "{}",
"type": "change",
"mask": 3,
"field": "ml_sport_registration",
"permanent": false,
"description": "Modifier l'abonnement à la Newsletter Sport pour n'importe quel profil"
}
},
{
"model": "permission.permission",
"pk": 247,
"fields": {
"model": [
"member",
"profile"
],
"query": "{}",
"type": "view",
"mask": 3,
"field": [
"ml_events_registration",
"ml_art_registration",
"ml_sport_registration"
],
"permanent": false,
"description": "Voir les abonnements aux Newsletters de n'importe quel profil"
}
},
{ {
"model": "permission.role", "model": "permission.role",
"pk": 1, "pk": 1,
@ -4377,7 +4477,7 @@
238 238
] ]
} }
}, },
{ {
"model": "wei.weirole", "model": "wei.weirole",
"pk": 12, "pk": 12,

View File

@ -291,7 +291,7 @@ class WEISurveyAlgorithm2024(WEISurveyAlgorithm):
for survey in surveys: for survey in surveys:
survey.free() survey.free()
if survey.registration.user_id in hardcoded_first_year.keys(): if survey.registration.user_id in hardcoded_first_year.keys():
survey.select_bus(hardcoded_first_year[s.registration.user_id]) survey.select_bus(hardcoded_first_year[survey.registration.user_id])
survey.save() survey.save()
non_men = [s for s in surveys if s.registration.gender != 'male'] non_men = [s for s in surveys if s.registration.gender != 'male']

View File

@ -794,12 +794,12 @@ msgid "Permission mask"
msgstr "Masque de permissions" msgstr "Masque de permissions"
#: apps/member/forms.py:46 #: apps/member/forms.py:46
msgid "Report frequency" msgid "Statement frequency (in days)"
msgstr "Fréquence des rapports (en jours)" msgstr "Fréquence des relevés (en jours)"
#: apps/member/forms.py:48 #: apps/member/forms.py:48
msgid "Last report date" msgid "Last statement date"
msgstr "Date de dernier rapport" msgstr "Date de dernier relevé"
#: apps/member/forms.py:52 #: apps/member/forms.py:52
msgid "" msgid ""
@ -1044,12 +1044,12 @@ msgstr ""
"artistiques sur le campus (1 mail par semaine)" "artistiques sur le campus (1 mail par semaine)"
#: apps/member/models.py:117 #: apps/member/models.py:117
msgid "report frequency (in days)" msgid "Statement frequency (in days)"
msgstr "fréquence des rapports (en jours)" msgstr "Fréquence des relevés (en jours)"
#: apps/member/models.py:122 #: apps/member/models.py:122
msgid "last report date" msgid "Last statement date"
msgstr "date de dernier rapport" msgstr "Date de dernier relevé"
#: apps/member/models.py:127 #: apps/member/models.py:127
msgid "email confirmed" msgid "email confirmed"

View File

@ -26,3 +26,5 @@ MAILTO=notekfet2020@lists.crans.org
00 9 * * * root cd /var/www/note_kfet && env/bin/python manage.py refresh_highlighted_buttons -v 0 00 9 * * * root cd /var/www/note_kfet && env/bin/python manage.py refresh_highlighted_buttons -v 0
# Vider les tokens Oauth2 # Vider les tokens Oauth2
00 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py cleartokens -v 0 00 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py cleartokens -v 0
# Envoyer la liste des abonnés à la NL BDA
00 8 * * 0 root cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art -v 0

View File

@ -158,7 +158,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</div> </div>
</nav> </nav>
<div class="{% block containertype %}container{% endblock %} my-3"> <div class="{% block containertype %}container{% endblock %} my-3">
<div id="messages"> <div id="messages">
{% if user.is_authenticated %} {% if user.is_authenticated %}
{% if not user|is_member:"BDE" %} {% if not user|is_member:"BDE" %}
<div class="alert alert-danger"> <div class="alert alert-danger">