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

Compare commits

..

50 Commits

Author SHA1 Message Date
f83f02b64e Merge branch 'nix-shell' into 'main'
Nix shell

See merge request bde/nk20!201
2025-02-21 05:33:01 +01:00
9f888a5281 Merge branch 'patch_openers_(forgot_something)' into 'main'
Patch openers (forgot something)

See merge request bde/nk20!286
2025-02-18 21:44:21 +01:00
88b1a25ca0 Update file initial.json 2025-02-18 21:26:55 +01:00
8cb50f58f2 Merge branch 'Respo_jam_permission' into 'main'
Respo jam permission

See merge request bde/nk20!285
2025-02-17 14:48:21 +01:00
041a8f20a9 A permission was missing 2025-02-17 14:28:00 +01:00
b1ffb28532 Update file initial.json 2025-02-17 14:19:00 +01:00
6225fb51f1 Add some permissions 2025-02-17 14:10:21 +01:00
1dd74e8024 Merge branch 'openers' into 'main'
Patch Openers

See merge request bde/nk20!284
2025-02-17 02:13:47 +01:00
1af9f5f23c some updates 2025-02-17 02:12:44 +01:00
83d5a7ceff Update file initial.json 2025-02-17 01:58:13 +01:00
a7cba0a4a3 Update file initial.json 2025-02-16 23:33:18 +01:00
ccd9a66ab9 Update file initial.json 2025-02-16 23:24:39 +01:00
c7a92fa4b2 Update file initial.json 2025-02-16 20:49:11 +01:00
0a5368d23f Merge branch 'respo_comm_permissionsV2' into 'main'
Respo comm permissions v2

See merge request bde/nk20!283
2025-02-14 18:38:39 +01:00
26b351a51c Add another permission for model guest in activity 2025-02-14 18:14:35 +01:00
1836677c47 Update file initial.json 2025-02-13 22:30:36 +01:00
e7a98c86f0 Tried something with permissions 2025-02-13 21:51:26 +01:00
eb5044490b Delete a useless permission 2025-02-13 21:37:58 +01:00
983d7ec052 linters 2025-02-13 21:35:29 +01:00
dc56deaf85 Final modifications 2025-02-13 21:17:57 +01:00
694f54e1c4 Merge branch 'fix_activity_view' into 'main'
fix issue with activity entry view

See merge request bde/nk20!282
2025-02-12 10:18:33 +01:00
0d0fdef363 fix issue with activity entry view 2025-02-09 17:58:38 +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
09fb1d227e Correction translation of sport events ml 2024-09-18 08:54:04 +02:00
2e27d4f05c Merge branch 'non-BDE-members-permission-fix' into 'main'
Added some necessary rights

See merge request bde/nk20!275
2024-09-17 17:24:30 +02:00
3c34033bf5 fix linters for WEI 2024 survey 2024-09-12 13:41:04 +02:00
dde1baa25c typo 2022-08-21 19:50:53 +02:00
7a7ee47e0b Add two shell.nix to enable easier development on nixos. 2022-08-21 19:46:11 +02:00
12 changed files with 304 additions and 20 deletions

1
.gitignore vendored
View File

@ -48,7 +48,6 @@ backups/
env/ env/
venv/ venv/
db.sqlite3 db.sqlite3
shell.nix
# ansibles customs host # ansibles customs host
ansible/host_vars/*.yaml ansible/host_vars/*.yaml

View File

@ -329,7 +329,7 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView):
context["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk context["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk
context["notespecial_ctype"] = ContentType.objects.get_for_model(NoteSpecial).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() PermissionBackend.filter_queryset(self.request, Activity, "view")).distinct().all()
context["activities_open"] = [a for a in activities_open context["activities_open"] = [a for a in activities_open
if PermissionBackend.check_perm(self.request, if PermissionBackend.check_perm(self.request,

View File

@ -44,6 +44,7 @@ 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.
""" """
# Remove widget=forms.HiddenInput() if you want to use report frequency.
report_frequency = forms.IntegerField(required=False, initial=0, label=_("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")) last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date"))
@ -76,7 +77,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

@ -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,24 @@ 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 context['profile_form'].fields["last_report"] del profile_form.fields["last_report"]
fields_to_check = list(profile_form.fields.keys())
fields_modifiable = False
# 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()
else:
fields_modifiable = True
if fields_modifiable:
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

@ -127,7 +127,7 @@
"auth", "auth",
"user" "user"
], ],
"query": "{\"pk\": [\"user\", \"pk\"]}", "query": "[\"AND\", {\"pk\": [\"user\", \"pk\"]}, {\"memberships__club__parent_club__isnull\": true}]",
"type": "change", "type": "change",
"mask": 1, "mask": 1,
"field": "last_login", "field": "last_login",
@ -3800,6 +3800,214 @@
"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": [
"activity",
"guest"
],
"query": "{\"activity__organizer\": [\"club\"]}",
"type": "view",
"mask": 2,
"field": "",
"permanent": false,
"description": "Voir les personnes invitées aux événements organisés par son club"
}
},
{
"model": "permission.permission",
"pk": 248,
"fields": {
"model": [
"auth",
"user"
],
"query": "[\"NOT\", {\"pk__isnull\": [\"user\", \"note\", \"activity_responsible\", [\"filter\", {\"activity__open\": true, \"activity__activity_type__manage_entries\":true}], [\"exists\"]]}]",
"type": "view",
"mask": 3,
"field": "",
"permanent": false,
"description": "Voir n'importe quel⋅le utilisateur⋅rice pour les ouvreur⋅ses"
}
},
{
"model": "permission.permission",
"pk": 249,
"fields": {
"model": [
"note",
"note"
],
"query": "[\"NOT\", {\"pk__isnull\": [\"user\", \"note\", \"activity_responsible\", [\"filter\", {\"activity__open\": true, \"activity__activity_type__manage_entries\":true}], [\"exists\"]]}]",
"type": "view",
"mask": 2,
"field": "",
"permanent": false,
"description": "Voir toutes les notes lorsque utilisateur⋅rice est ouvreur⋅ses"
}
},
{
"model": "permission.permission",
"pk": 250,
"fields": {
"model": [
"activity",
"guest"
],
"query": "{\"activity__organizer\": [\"club\"]}",
"type": "delete",
"mask": 1,
"field": "",
"permanent": false,
"description": "Supprimer des personnes invitées aux événements organisés par son club"
}
},
{
"model": "permission.permission",
"pk": 251,
"fields": {
"model": [
"activity",
"opener"
],
"query": "{\"activity__organizer\": [\"club\"]}",
"type": "view",
"mask": 2,
"field": "",
"permanent": false,
"description": "Voir les ouvreur⋅ses des activités organisées par son club"
}
},
{
"model": "permission.permission",
"pk": 252,
"fields": {
"model": [
"activity",
"opener"
],
"query": "{\"activity__organizer\": [\"club\"]}",
"type": "add",
"mask": 2,
"field": "",
"permanent": false,
"description": "Ajouter des ouvreur⋅ses aux activités organisées par son club"
}
},
{
"model": "permission.permission",
"pk": 253,
"fields": {
"model": [
"activity",
"opener"
],
"query": "{\"activity__organizer\": [\"club\"]}",
"type": "delete",
"mask": 2,
"field": "",
"permanent": false,
"description": "Supprimer des ouvreur⋅ses aux activités organisées par son club"
}
},
{
"model": "permission.permission",
"pk": 254,
"fields": {
"model": [
"activity",
"activity"
],
"query": "{\"organizer\": [\"club\"]}",
"type": "change",
"mask": 2,
"field": "opener",
"permanent": false,
"description": "Voir le tableau des ouvreur⋅ses pour les activités organisées par son club"
}
},
{ {
"model": "permission.role", "model": "permission.role",
"pk": 1, "pk": 1,
@ -3849,7 +4057,9 @@
203, 203,
204, 204,
205, 205,
206 206,
248,
249
] ]
} }
}, },

View File

@ -279,7 +279,6 @@ class WEISurveyAlgorithm2024(WEISurveyAlgorithm):
# surveys = [s for s in surveys if s.bus_id != None] # surveys = [s for s in surveys if s.bus_id != None]
# surveys = [s for s in surveys if not hasattr(s.information, 'hardcoded') or not s.information.hardcoded] # surveys = [s for s in surveys if not hasattr(s.information, 'hardcoded') or not s.information.hardcoded]
# surveys = [s for s in surveys if s.registration.user_id in free_users] # surveys = [s for s in surveys if s.registration.user_id in free_users]
# hardcoded_first_year_mb = WEIMembership.objects.filter(bus != None,registration__first_year=True) # hardcoded_first_year_mb = WEIMembership.objects.filter(bus != None,registration__first_year=True)
@ -288,15 +287,13 @@ class WEISurveyAlgorithm2024(WEISurveyAlgorithm):
hardcoded_first_year_mb = WEIMembership.objects.filter(registration__first_year=True) hardcoded_first_year_mb = WEIMembership.objects.filter(registration__first_year=True)
hardcoded_first_year = {mb.user.id if mb.bus else None: mb.bus.id if mb.bus else None for mb in hardcoded_first_year_mb} hardcoded_first_year = {mb.user.id if mb.bus else None: mb.bus.id if mb.bus else None for mb in hardcoded_first_year_mb}
# Reset previous algorithm run # Reset previous algorithm run
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']
men = [s for s in surveys if s.registration.gender == 'male'] men = [s for s in surveys if s.registration.gender == 'male']

View File

@ -795,11 +795,11 @@ msgstr "Masque de permissions"
#: apps/member/forms.py:46 #: apps/member/forms.py:46
msgid "Report frequency" msgid "Report frequency"
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 report date"
msgstr "Date de dernier rapport" msgstr "Date de dernier relevé"
#: apps/member/forms.py:52 #: apps/member/forms.py:52
msgid "" msgid ""
@ -1032,6 +1032,7 @@ msgid ""
"Register on the mailing list to stay informed of the sport events of the " "Register on the mailing list to stay informed of the sport events of the "
"campus (1 mail/week)" "campus (1 mail/week)"
msgstr "" msgstr ""
"S'inscrire sur la liste de diffusion pour rester informé·e des actualités "
"sportives sur le campus (1 mail par semaine)" "sportives sur le campus (1 mail par semaine)"
#: apps/member/models.py:113 #: apps/member/models.py:113
@ -1044,11 +1045,11 @@ msgstr ""
#: apps/member/models.py:117 #: apps/member/models.py:117
msgid "report frequency (in days)" msgid "report 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 report 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,6 @@ 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 10 * * 0 root cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art

34
shell-static.nix Executable file
View File

@ -0,0 +1,34 @@
# This is a workaround meant for use with the nix package manager. If you don't know what it is or don't use it, please ignore this file.
#
# The nk20 javascript static location are hardcoded for imperative system.
# This make ./manage.py collectstatic hard to use with nixos.
#
# A workaround is to enter a FHSUserEnv with the static placed under /share/javascript/<static>.
# This emulate a debian like system and enable collecting static normally with ./manage.py collectstatics.
# The regular shell.nix should be enough for other configurations.
#
# Warning, you are still supposed to use pip package with a venv !
{ pkgs ? import <nixpkgs> {} }:
(pkgs.buildFHSUserEnv {
name = "pipzone";
targetPkgs = pkgs: (with pkgs;
let
fhs-static = stdenv.mkDerivation {
name = "fhs-static";
buildCommand = ''
mkdir -p $out/share/javascript/bootstrap4
mkdir -p $out/share/javascript/jquery
ln -s ${python39Packages.xstatic-bootstrap}/lib/python3.9/site-packages/xstatic/pkg/bootstrap/data/* $out/share/javascript/bootstrap4
ln -s ${python39Packages.xstatic-jquery}/lib/python3.9/site-packages/xstatic/pkg/jquery/data/* $out/share/javascript/jquery
'';
};
in [
fhs-static
python39
gettext
python39Packages.pip
python39Packages.virtualenv
python39Packages.setuptools
]);
runScript = "bash";
}).env

23
shell.nix Executable file
View File

@ -0,0 +1,23 @@
# This is meant for use with the nix package manager. If you don't know what it is or don't use it, please ignore this file.
#
# This shell.nix contains all dependencies require to create a venv and pip install -r requirements.txt.
#
# Please check shell-static.nix for running ./manage.py collectstatics.
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
python39
python39Packages.pip
python39Packages.setuptools
gettext
];
shellHook = ''
# Tells pip to put packages into $PIP_PREFIX instead of the usual locations.
# See https://pip.pypa.io/en/stable/user_guide/#environment-variables.
export PIP_PREFIX=$(pwd)/_build/pip_packages
export PYTHONPATH="$PIP_PREFIX/${pkgs.python39.sitePackages}:$PYTHONPATH"
export PATH="$PIP_PREFIX/bin:$PATH"
unset SOURCE_DATE_EPOCH
'';
}