1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2025-08-03 14:16:54 +02:00

Compare commits

..

29 Commits

Author SHA1 Message Date
thomasl
26b351a51c Add another permission for model guest in activity 2025-02-14 18:14:35 +01:00
thomasl
1836677c47 Update file initial.json 2025-02-13 22:30:36 +01:00
thomasl
e7a98c86f0 Tried something with permissions 2025-02-13 21:51:26 +01:00
thomasl
eb5044490b Delete a useless permission 2025-02-13 21:37:58 +01:00
thomasl
983d7ec052 linters 2025-02-13 21:35:29 +01:00
thomasl
dc56deaf85 Final modifications 2025-02-13 21:17:57 +01:00
quark
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
quark
0d0fdef363 fix issue with activity entry view 2025-02-09 17:58:38 +01:00
thomasl
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
thomasl
a209e0d366 Update file forms.py 2025-02-02 14:30:53 +01:00
thomasl
ef485e0628 Update file forms.py 2025-02-02 14:06:22 +01:00
thomasl
1481aa0635 Update file forms.py 2025-02-02 14:05:05 +01:00
thomasl
867bf9fd25 Update file forms.py 2025-02-02 13:33:41 +01:00
thomasl
47fda0ea36 Update file forms.py 2025-02-02 13:17:19 +01:00
thomasl
623290827a Update file forms.py 2025-01-27 16:34:45 +01:00
thomasl
a87ce625f3 Update file note.cron 2025-01-25 13:55:21 +01:00
thomasl
3559787fa7 Merge branch 'New_permission' into 'main'
New permission

See merge request bde/nk20!278
2025-01-18 15:41:15 +01:00
thomasl
bd6ed27ae5 Update 2 files
- /apps/permission/fixtures/initial.json
- /apps/permission/admin.py
2025-01-18 15:11:57 +01:00
thomasl
43dc676747 Update file initial.json 2025-01-18 12:57:42 +01:00
thomasl
caaeab6b0b Update file initial.json 2025-01-17 19:39:26 +01:00
thomasl
54ba786884 Update file initial.json 2025-01-17 19:03:59 +01:00
thomasl
80e109114f Update file initial.json 2025-01-17 18:23:28 +01:00
mcngnt
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
mcngnt
414e103686 finitio le message sda 2025-01-05 23:17:01 +01:00
thomasl
942d887c2e Update file initial.json 2024-12-23 18:31:11 +01:00
thomasl
a63c34fe37 Update file initial.json 2024-12-22 21:38:17 +01:00
thomasl
2be6133458 Update file initial.json 2024-12-22 20:42:20 +01:00
quark
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
quark
476fbceeea Donation goal la note kfet x les SdA 2024-10-10 01:48:23 +02:00
11 changed files with 152 additions and 79 deletions

View File

@@ -1,8 +1,6 @@
# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
import datetime
from django.utils import timezone
from django.utils.html import escape
from django.utils.safestring import mark_safe
@@ -79,9 +77,6 @@ def get_row_class(record):
c += " table-info"
elif record.note.balance < 0:
c += " table-danger"
# MODE VIEUXCON=ON
if (datetime.datetime.utcnow().timestamp() - record.note.created_at.timestamp()) > 3600 * 24 * 365 * 2.5:
c += " font-weight-bold underline"
return c

View File

@@ -263,23 +263,13 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView):
balance=F("note__balance"))
# 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(
note__noteuser__user__memberships__club=activity.attendees_club,
note__noteuser__user__memberships__date_start__lte=timezone.now(),
note__noteuser__user__memberships__date_end__gte=timezone.now(),
)
note_qs = note_qs.filter(note__noteuser__isnull=False)
# Keep only valid members
# note_qs = note_qs.filter(
# note__noteuser__user__memberships__club=activity.attendees_club,
# note__noteuser__user__memberships__date_start__lte=timezone.now(),
# note__noteuser__user__memberships__date_end__gte=timezone.now(),
# )
note_qs = note_qs.filter(
note__noteuser__user__memberships__club=activity.attendees_club,
note__noteuser__user__memberships__date_start__lte=timezone.now(),
note__noteuser__user__memberships__date_end__gte=timezone.now()).exclude(note__inactivity_reason='forced')
# Filter with permission backend
note_qs = note_qs.filter(PermissionBackend.filter_queryset(self.request, Alias, "view"))
@@ -339,7 +329,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,

View File

@@ -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):

View File

@@ -26,6 +26,7 @@ from note_kfet.middlewares import _set_current_request
from permission.backends import PermissionBackend
from permission.models import Role
from permission.views import ProtectQuerysetMixin, ProtectedCreateView
from django import forms
from .forms import UserForm, ProfileForm, ImageForm, ClubForm, MembershipForm, \
CustomAuthenticationForm, MembershipRolesForm
@@ -72,11 +73,24 @@ class UserUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
form.fields['email'].required = True
form.fields['email'].help_text = _("This address must be valid.")
if PermissionBackend.check_perm(self.request, "member.change_profile", 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)
if not self.object.profile.report_frequency:
del context['profile_form'].fields["last_report"]
profile_form = self.profile_form(instance=context['user_object'].profile,
data=self.request.POST if self.request.POST else None)
if not self.object.profile.report_frequency:
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

View File

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

View File

@@ -127,7 +127,7 @@
"auth",
"user"
],
"query": "{\"pk\": [\"user\", \"pk\"]}",
"query": "[\"AND\", {\"pk\": [\"user\", \"pk\"]}, {\"memberships__club__parent_club__isnull\": true}]",
"type": "change",
"mask": 1,
"field": "last_login",
@@ -3833,20 +3833,68 @@
}
},
{
"model": "permission.permission",
"pk": 244,
"fields": {
"model": [
"member",
"membership"
],
"query": "{\"club\": 2}",
"type": "view",
"mask": 1,
"field": "",
"permanent": false,
"description": "Voir les adhérent·e·s Kfet"
}
"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.role",
@@ -4386,10 +4434,8 @@
168,
176,
177,
178,
197,
211,
244
211
]
}
},

View File

@@ -795,11 +795,11 @@ msgstr "Masque de permissions"
#: apps/member/forms.py:46
msgid "Report frequency"
msgstr "Fréquence des rapports (en jours)"
msgstr "Fréquence des relevés (en jours)"
#: apps/member/forms.py:48
msgid "Last report date"
msgstr "Date de dernier rapport"
msgstr "Date de dernier relevé"
#: apps/member/forms.py:52
msgid ""
@@ -1045,11 +1045,11 @@ msgstr ""
#: apps/member/models.py:117
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
msgid "last report date"
msgstr "date de dernier rapport"
msgstr "date de dernier relevé"
#: apps/member/models.py:127
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
# Vider les tokens Oauth2
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

74
note_kfet/static/css/custom.css Normal file → Executable file
View File

@@ -65,7 +65,10 @@ mark {
/* Last BDE colors */
.bg-primary {
background-color: rgb(102, 83, 105) !important;
/* background-color: rgb(18, 67, 4) !important; */
/* MODE VIEUXCON=ON */
/* background-color: rgb(166, 0, 2) !important; */
background-color: rgb(100, 30, 100) !important;
}
html {
@@ -80,54 +83,81 @@ body {
.btn-outline-primary:hover,
.btn-outline-primary:not(:disabled):not(.disabled).active,
.btn-outline-primary:not(:disabled):not(.disabled):active {
color: #fff;
background-color: rgb(102, 83, 105);
border-color: rgb(102, 83, 105);
color: rgb(240, 200, 240);
background-color: rgb(30, 120, 150);
border-color: rgb(190, 150, 190);
}
.btn-outline-primary {
color: rgb(102, 83, 105);
background-color: rgba(248, 249, 250, 0.9);
border-color: rgb(102, 83, 105);
color: #a2a;
background-color: #6bc;
border-color: #719;
}
.turbolinks-progress-bar {
background-color: #12432E;
background-color: #12342E;
}
.btn-primary:hover,
.btn-primary:not(:disabled):not(.disabled).active,
.btn-primary:not(:disabled):not(.disabled):active {
color: #fff;
background-color: rgb(102, 83, 105);
border-color: rgb(102, 83, 105);
color: rgb(150, 200, 240);
background-color: rgb(50, 100, 140);
border-color: rgb(0, 0, 0);
}
.btn-primary {
color: rgba(248, 249, 250, 0.9);
background-color: rgb(102, 83, 105);
border-color: rgb(102, 83, 105);
color: #eae;
background-color: #616;
border-color: #000000;
}
.border-primary {
border-color: rgb(115, 15, 115) !important;
border-color: rgb(222, 180, 222) !important;
}
.btn-secondary {
color: #eae;
background-color: #616;
border-color: #000000;
}
.btn-secondary:hover,
.btn-secondary:not(:disabled):not(.disabled).active,
.btn-secondary:not(:disabled):not(.disabled):active {
color: rgb(150, 200, 240);
background-color: rgb(50, 100, 140);
border-color: rgb(0, 0, 0);
}
.btn-outline-dark {
color: #000000;
border-color: #000000;
}
.btn-outline-dark:hover,
.btn-outline-dark:not(:disabled):not(.disabled).active,
.btn-outline-dark:not(:disabled):not(.disabled):active {
color: rgb(50, 100, 160);
background-color: rgb(240, 150, 240);
border-color: rgb(50, 100, 160);
}
a {
color: rgb(102, 83, 105);
color: rgb(0, 150, 150);
}
a:hover {
color: rgb(200, 30, 200);
color: rgb(200, 0, 200);
}
.form-control:focus {
box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.25);
border-color: rgb(200, 30, 200);
box-shadow: 0 0 0 0.25rem rgb(0 150 150 / 50%);
border-color: rgb(0, 200, 200);
}
.btn-outline-primary.focus {
box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.5);
box-shadow: 0 0 0 0.25rem rgb(0 150 150 / 22%);
}

View File

@@ -96,13 +96,11 @@ function displayStyle (note) {
if (!note) { return '' }
const balance = note.balance
var css = ''
var ms_per_year = 31536000000 // 365 * 24 * 3600 * 1000
if (balance < -2000) { css += ' text-danger bg-dark' }
else if (balance < -1000) { css += ' text-danger' }
else if (balance < 0) { css += ' text-warning' }
if (!note.email_confirmed) { css += ' bg-primary' }
else if (!note.is_active || (note.membership && note.membership.date_end < new Date().toISOString())) { css += ' bg-info' }
if (((Date.now() - Date.parse(note.created_at))/ms_per_year) > 2.5) { css += ' font-weight-bold underline' }
return css
}

View File

@@ -158,12 +158,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</div>
</nav>
<div class="{% block containertype %}container{% endblock %} my-3">
<div id="messages">
{% if user.is_authenticated %}
<div class="alert alert-info">
Les fossiles sont à l'honneur cette semaine, la Note change d'habit rien pour elleux !
</div>
{% endif %}
<div id="messages">
{% if user.is_authenticated %}
{% if not user|is_member:"BDE" %}
<div class="alert alert-danger">