Refactor permission (need to re adjust), 2 test not passed(registration, permissions)
This commit is contained in:
parent
838bd2bb23
commit
a17e47acb9
17 changed files with 107 additions and 346 deletions
|
|
@ -32,8 +32,10 @@ tasks:
|
||||||
init : gp sync-await django
|
init : gp sync-await django
|
||||||
command: python3 manage.py runserver 0.0.0.0:8000
|
command: python3 manage.py runserver 0.0.0.0:8000
|
||||||
ports:
|
ports:
|
||||||
- port: 8000
|
- name: Web Dev Server
|
||||||
onOpen: open-preview
|
port: 8000
|
||||||
|
visibility: public
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
24
apps/activity/migrations/0003_auto_20220818_1105.py
Normal file
24
apps/activity/migrations/0003_auto_20220818_1105.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 2.2.28 on 2022-08-18 09:05
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('activity', '0002_auto_20220817_2253'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='activity',
|
||||||
|
name='attendees_club',
|
||||||
|
field=models.ForeignKey(help_text='Club that is authorized to join the activity.', on_delete=django.db.models.deletion.PROTECT, related_name='+', to='member.Club', verbose_name='attendees club'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='activity',
|
||||||
|
name='location',
|
||||||
|
field=models.CharField(blank=True, default='', help_text='Place where the activity is organized, eg. BDE.', max_length=255, verbose_name='location'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -36,7 +36,7 @@ class TestActivities(TestCase):
|
||||||
name="Activity",
|
name="Activity",
|
||||||
description="This is a test activity\non two very very long lines\nbecause this is very important.",
|
description="This is a test activity\non two very very long lines\nbecause this is very important.",
|
||||||
location="Earth",
|
location="Earth",
|
||||||
activity_type=ActivityType.objects.get(name="Activit\u00e9 gratuite ouverte"),
|
activity_type=ActivityType.objects.get(name="Soir\u00e9e"),
|
||||||
creater=self.user,
|
creater=self.user,
|
||||||
organizer=Club.objects.get(name="BDE"),
|
organizer=Club.objects.get(name="BDE"),
|
||||||
attendees_club=Club.objects.get(name="BDE"),
|
attendees_club=Club.objects.get(name="BDE"),
|
||||||
|
|
|
||||||
|
|
@ -378,17 +378,10 @@ class Membership(models.Model):
|
||||||
parent_membership.save()
|
parent_membership.save()
|
||||||
parent_membership.refresh_from_db()
|
parent_membership.refresh_from_db()
|
||||||
|
|
||||||
if self.club.parent_club.name == "BDE":
|
|
||||||
parent_membership.roles.set(
|
parent_membership.roles.set(
|
||||||
Role.objects.filter(Q(name="Adhérent BDE") | Q(name="Membre de club")).all())
|
Role.objects.filter(Q(name="Adhérent")).all())
|
||||||
elif self.club.parent_club.name == "BDA":
|
|
||||||
parent_membership.roles.set(
|
|
||||||
Role.objects.filter(Q(name="Adhérent BDA") | Q(name="Membre de club")).all())
|
|
||||||
elif self.club.parent_club.name == "BDS":
|
|
||||||
parent_membership.roles.set(
|
|
||||||
Role.objects.filter(Q(name="Adhérent BDS") | Q(name="Membre de club")).all())
|
|
||||||
else:
|
|
||||||
parent_membership.roles.set(Role.objects.filter(name="Membre de club").all())
|
|
||||||
parent_membership.save()
|
parent_membership.save()
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
{% load i18n pretty_money perms %}
|
{% load i18n pretty_money perms memberinfo %}
|
||||||
|
|
||||||
<dl class="row">
|
<dl class="row">
|
||||||
<dt class="col-xl-6">{% trans 'name'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'name'|capfirst %}</dt>
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "note.view_note"|has_perm:club.note %}
|
{% if "note.view_note"|has_perm:club.note and user|is_member:club %}
|
||||||
<dt class="col-xl-6">{% trans 'balance'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'balance'|capfirst %}</dt>
|
||||||
<dd class="col-xl-6">{{ club.note.balance | pretty_money }}</dd>
|
<dd class="col-xl-6">{{ club.note.balance | pretty_money }}</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ class TestMemberships(TestCase):
|
||||||
self.club = Club.objects.create(name="totoclub", parent_club=Club.objects.get(name="BDE"))
|
self.club = Club.objects.create(name="totoclub", parent_club=Club.objects.get(name="BDE"))
|
||||||
self.bde_membership = Membership.objects.create(user=self.user, club=Club.objects.get(name="BDE"))
|
self.bde_membership = Membership.objects.create(user=self.user, club=Club.objects.get(name="BDE"))
|
||||||
self.membership = Membership.objects.create(user=self.user, club=self.club)
|
self.membership = Membership.objects.create(user=self.user, club=self.club)
|
||||||
self.membership.roles.add(Role.objects.get(name="Bureau de club"))
|
self.membership.roles.add(Role.objects.get(name="Pr\u00e9sident\u00b7e"))
|
||||||
self.membership.save()
|
self.membership.save()
|
||||||
|
|
||||||
def test_admin_pages(self):
|
def test_admin_pages(self):
|
||||||
|
|
@ -251,11 +251,11 @@ class TestMemberships(TestCase):
|
||||||
|
|
||||||
response = self.client.post(reverse("member:club_manage_roles", args=(self.membership.pk,)), data=dict(
|
response = self.client.post(reverse("member:club_manage_roles", args=(self.membership.pk,)), data=dict(
|
||||||
roles=[role.id for role in Role.objects.filter(
|
roles=[role.id for role in Role.objects.filter(
|
||||||
Q(name="Membre de club") | Q(name="Trésorier·ère de club") | Q(name="Bureau de club")).all()],
|
Q(name="Trésorier·ère")).all()],
|
||||||
))
|
))
|
||||||
self.assertRedirects(response, self.user.profile.get_absolute_url(), 302, 200)
|
self.assertRedirects(response, self.user.profile.get_absolute_url(), 302, 200)
|
||||||
self.membership.refresh_from_db()
|
self.membership.refresh_from_db()
|
||||||
self.assertEqual(self.membership.roles.count(), 3)
|
self.assertEqual(self.membership.roles.count(), 1)
|
||||||
|
|
||||||
def test_render_user_list(self):
|
def test_render_user_list(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -389,7 +389,7 @@ class TestMemberAPI(TestAPI):
|
||||||
)
|
)
|
||||||
self.bde_membership = Membership.objects.create(user=self.user, club=Club.objects.get(name="BDE"))
|
self.bde_membership = Membership.objects.create(user=self.user, club=Club.objects.get(name="BDE"))
|
||||||
self.membership = Membership.objects.create(user=self.user, club=self.club)
|
self.membership = Membership.objects.create(user=self.user, club=self.club)
|
||||||
self.membership.roles.add(Role.objects.get(name="Bureau de club"))
|
self.membership.roles.add(Role.objects.get(name="Pr\u00e9sident\u00b7e"))
|
||||||
self.membership.save()
|
self.membership.save()
|
||||||
|
|
||||||
def test_club_api(self):
|
def test_club_api(self):
|
||||||
|
|
|
||||||
|
|
@ -445,7 +445,7 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
club.update_membership_dates()
|
club.update_membership_dates()
|
||||||
|
|
||||||
# managers list
|
# managers list
|
||||||
managers = Membership.objects.filter(club=self.object, roles__name="Bureau de club",
|
managers = Membership.objects.filter(club=self.object, roles__name="Pr\u00e9sident\u00b7e",
|
||||||
date_start__lte=date.today(), date_end__gte=date.today())\
|
date_start__lte=date.today(), date_end__gte=date.today())\
|
||||||
.order_by('user__last_name').all()
|
.order_by('user__last_name').all()
|
||||||
context["managers"] = ClubManagerTable(data=managers, prefix="managers-")
|
context["managers"] = ClubManagerTable(data=managers, prefix="managers-")
|
||||||
|
|
@ -744,7 +744,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
|
||||||
|
|
||||||
# Now, all is fine, the membership can be created.
|
# Now, all is fine, the membership can be created.
|
||||||
|
|
||||||
if club.name == "BDE":
|
if club.name == "BDE" or club.name == "BDA" or club.name == "BDS":
|
||||||
# When we renew the BDE membership, we update the profile section
|
# When we renew the BDE membership, we update the profile section
|
||||||
# that should happens at least once a year.
|
# that should happens at least once a year.
|
||||||
user.profile.section = user.profile.section_generated
|
user.profile.section = user.profile.section_generated
|
||||||
|
|
@ -772,10 +772,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
|
||||||
|
|
||||||
ret = super().form_valid(form)
|
ret = super().form_valid(form)
|
||||||
|
|
||||||
member_role = Role.objects.filter(Q(name="Adhérent BDE") | Q(name="Membre de club")).all() \
|
member_role = Role.objects.filter(Q(name="Adhérent")).all()
|
||||||
if club.name == "BDE" else Role.objects.filter(Q(name="Adhérent BDA") | Q(name="Membre de club")).all() \
|
|
||||||
if club.name == "BDA" else Role.objects.filter(Q(name="Adhérent BDS") | Q(name="Membre de club")).all() \
|
|
||||||
if club.name == "BDS" else Role.objects.filter(name="Membre de club").all()
|
|
||||||
|
|
||||||
# Set the same roles as before
|
# Set the same roles as before
|
||||||
if old_membership:
|
if old_membership:
|
||||||
|
|
|
||||||
|
|
@ -1695,12 +1695,12 @@
|
||||||
"auth",
|
"auth",
|
||||||
"user"
|
"user"
|
||||||
],
|
],
|
||||||
"query": "{\"memberships__club__name\": \"BDE\", \"memberships__roles__name\": \"Adhérent BDE\", \"memberships__date_start__lte\": [\"today\"], \"memberships__date_end__gte\": [\"today\"]}",
|
"query": "{\"memberships__club__name\": \"BDE\", \"memberships__roles__name\": \"Adhérent\", \"memberships__date_start__lte\": [\"today\"], \"memberships__date_end__gte\": [\"today\"]}",
|
||||||
"type": "view",
|
"type": "view",
|
||||||
"mask": 2,
|
"mask": 2,
|
||||||
"field": "",
|
"field": "",
|
||||||
"permanent": false,
|
"permanent": false,
|
||||||
"description": "Voir n'importe quel utilisateur qui est adhérent BDE"
|
"description": "Voir n'importe quel utilisateur qui est adhérent"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -1931,8 +1931,8 @@
|
||||||
"model": "permission.role",
|
"model": "permission.role",
|
||||||
"pk": 1,
|
"pk": 1,
|
||||||
"fields": {
|
"fields": {
|
||||||
"for_club": 1,
|
"for_club": null,
|
||||||
"name": "Adh\u00e9rent BDE",
|
"name": "Adh\u00e9rent",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
|
|
@ -1971,61 +1971,9 @@
|
||||||
{
|
{
|
||||||
"model": "permission.role",
|
"model": "permission.role",
|
||||||
"pk": 2,
|
"pk": 2,
|
||||||
"fields": {
|
|
||||||
"for_club": 2,
|
|
||||||
"name": "Adh\u00e9rent Kfet",
|
|
||||||
"permissions": [
|
|
||||||
22,
|
|
||||||
34,
|
|
||||||
36,
|
|
||||||
39,
|
|
||||||
40,
|
|
||||||
152,
|
|
||||||
153,
|
|
||||||
154,
|
|
||||||
155,
|
|
||||||
156,
|
|
||||||
157,
|
|
||||||
158,
|
|
||||||
159,
|
|
||||||
160,
|
|
||||||
179,
|
|
||||||
189,
|
|
||||||
190
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 3,
|
|
||||||
"fields": {
|
"fields": {
|
||||||
"for_club": null,
|
"for_club": null,
|
||||||
"name": "Membre de club",
|
"name": "Pr\u00e9sident\u00b7e",
|
||||||
"permissions": [
|
|
||||||
22
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 4,
|
|
||||||
"fields": {
|
|
||||||
"for_club": null,
|
|
||||||
"name": "Bureau de club",
|
|
||||||
"permissions": [
|
|
||||||
47,
|
|
||||||
49,
|
|
||||||
50,
|
|
||||||
169
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 5,
|
|
||||||
"fields": {
|
|
||||||
"for_club": null,
|
|
||||||
"name": "Pr\u00e9sident\u00b7e de club",
|
|
||||||
"permissions": [
|
"permissions": [
|
||||||
50,
|
50,
|
||||||
62
|
62
|
||||||
|
|
@ -2034,10 +1982,10 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "permission.role",
|
"model": "permission.role",
|
||||||
"pk": 6,
|
"pk": 3,
|
||||||
"fields": {
|
"fields": {
|
||||||
"for_club": null,
|
"for_club": null,
|
||||||
"name": "Tr\u00e9sorier\u00b7\u00e8re de club",
|
"name": "Tr\u00e9sorier\u00b7\u00e8re",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
59,
|
59,
|
||||||
19,
|
19,
|
||||||
|
|
@ -2047,7 +1995,6 @@
|
||||||
60,
|
60,
|
||||||
61,
|
61,
|
||||||
62,
|
62,
|
||||||
150,
|
|
||||||
166,
|
166,
|
||||||
167,
|
167,
|
||||||
168,
|
168,
|
||||||
|
|
@ -2059,80 +2006,29 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "permission.role",
|
"model": "permission.role",
|
||||||
"pk": 7,
|
"pk": 4,
|
||||||
"fields": {
|
"fields": {
|
||||||
"for_club": 1,
|
"for_club": null,
|
||||||
"name": "Pr\u00e9sident\u00b7e BDE",
|
"name": "Secr\u00e9taire",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
24,
|
|
||||||
25,
|
|
||||||
26,
|
|
||||||
27,
|
|
||||||
30,
|
|
||||||
33
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 8,
|
|
||||||
"fields": {
|
|
||||||
"for_club": 1,
|
|
||||||
"name": "Tr\u00e9sorier\u00b7\u00e8re BDE",
|
|
||||||
"permissions": [
|
|
||||||
23,
|
|
||||||
24,
|
|
||||||
25,
|
|
||||||
26,
|
|
||||||
27,
|
|
||||||
28,
|
|
||||||
29,
|
|
||||||
30,
|
|
||||||
31,
|
|
||||||
32,
|
|
||||||
33,
|
|
||||||
43,
|
|
||||||
51,
|
|
||||||
53,
|
|
||||||
54,
|
54,
|
||||||
55,
|
55,
|
||||||
56,
|
56,
|
||||||
57,
|
57,
|
||||||
58,
|
58,
|
||||||
63,
|
145,
|
||||||
64,
|
|
||||||
65,
|
|
||||||
66,
|
|
||||||
67,
|
|
||||||
68,
|
|
||||||
69,
|
|
||||||
146,
|
146,
|
||||||
147,
|
147,
|
||||||
150,
|
|
||||||
151,
|
|
||||||
163,
|
|
||||||
164,
|
|
||||||
170,
|
|
||||||
171,
|
|
||||||
172,
|
|
||||||
173,
|
|
||||||
174,
|
|
||||||
175,
|
|
||||||
176,
|
176,
|
||||||
177,
|
177
|
||||||
178,
|
|
||||||
188,
|
|
||||||
183,
|
|
||||||
186,
|
|
||||||
187
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "permission.role",
|
"model": "permission.role",
|
||||||
"pk": 9,
|
"pk": 5,
|
||||||
"fields": {
|
"fields": {
|
||||||
"for_club": 1,
|
"for_club": null,
|
||||||
"name": "Respo info",
|
"name": "Respo info",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
1,
|
1,
|
||||||
|
|
@ -2256,125 +2152,5 @@
|
||||||
196
|
196
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 10,
|
|
||||||
"fields": {
|
|
||||||
"for_club": 2,
|
|
||||||
"name": "GC Kfet",
|
|
||||||
"permissions": [
|
|
||||||
32,
|
|
||||||
56,
|
|
||||||
58,
|
|
||||||
55,
|
|
||||||
57,
|
|
||||||
52,
|
|
||||||
23,
|
|
||||||
24,
|
|
||||||
25,
|
|
||||||
26,
|
|
||||||
27,
|
|
||||||
28,
|
|
||||||
29,
|
|
||||||
30,
|
|
||||||
31,
|
|
||||||
166,
|
|
||||||
167,
|
|
||||||
168,
|
|
||||||
170,
|
|
||||||
171,
|
|
||||||
176,
|
|
||||||
177,
|
|
||||||
178,
|
|
||||||
179,
|
|
||||||
180,
|
|
||||||
181,
|
|
||||||
182
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 11,
|
|
||||||
"fields": {
|
|
||||||
"for_club": 2,
|
|
||||||
"name": "Res[pot]",
|
|
||||||
"permissions": [
|
|
||||||
37,
|
|
||||||
38,
|
|
||||||
41,
|
|
||||||
42,
|
|
||||||
43,
|
|
||||||
44,
|
|
||||||
45,
|
|
||||||
46,
|
|
||||||
148,
|
|
||||||
149,
|
|
||||||
182
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 17,
|
|
||||||
"fields": {
|
|
||||||
"for_club": null,
|
|
||||||
"name": "1A",
|
|
||||||
"permissions": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 19,
|
|
||||||
"fields": {
|
|
||||||
"for_club": 1,
|
|
||||||
"name": "Secrétaire BDE",
|
|
||||||
"permissions": [
|
|
||||||
54,
|
|
||||||
55,
|
|
||||||
56,
|
|
||||||
57,
|
|
||||||
58,
|
|
||||||
145,
|
|
||||||
146,
|
|
||||||
147,
|
|
||||||
150,
|
|
||||||
176,
|
|
||||||
177
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "permission.role",
|
|
||||||
"pk": 20,
|
|
||||||
"fields": {
|
|
||||||
"for_club": 1,
|
|
||||||
"name": "PC Kfet",
|
|
||||||
"permissions": [
|
|
||||||
6,
|
|
||||||
22,
|
|
||||||
24,
|
|
||||||
25,
|
|
||||||
26,
|
|
||||||
27,
|
|
||||||
30,
|
|
||||||
49,
|
|
||||||
50,
|
|
||||||
55,
|
|
||||||
56,
|
|
||||||
57,
|
|
||||||
58,
|
|
||||||
147,
|
|
||||||
150,
|
|
||||||
166,
|
|
||||||
167,
|
|
||||||
168,
|
|
||||||
176,
|
|
||||||
177,
|
|
||||||
180,
|
|
||||||
181
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,7 @@ class RightsTable(tables.Table):
|
||||||
|
|
||||||
def render_roles(self, record):
|
def render_roles(self, record):
|
||||||
# If the user has the right to manage the roles, display the link to manage them
|
# If the user has the right to manage the roles, display the link to manage them
|
||||||
roles = record.roles.filter((~(Q(name="Adhérent BDE")
|
roles = record.roles.filter((~(Q(name="Adhérent"))
|
||||||
| Q(name="Adhérent Kfet")
|
|
||||||
| Q(name="Membre de club")
|
|
||||||
| Q(name="Bureau de club"))
|
|
||||||
)).all()
|
)).all()
|
||||||
s = ", ".join(str(role) for role in roles)
|
s = ", ".join(str(role) for role in roles)
|
||||||
if PermissionBackend.check_perm(get_current_request(), "member.change_membership_roles", record):
|
if PermissionBackend.check_perm(get_current_request(), "member.change_membership_roles", record):
|
||||||
|
|
|
||||||
|
|
@ -6,39 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% load render_table from django_tables2 %}
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if user.is_authenticated %}
|
|
||||||
<div class="card bg-light mb-3">
|
|
||||||
<h3 class="card-header text-center">
|
|
||||||
{% trans "Users that have surnormal rights" %}
|
|
||||||
</h3>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="alert alert-info">
|
|
||||||
<i class="fa fa-info-circle"></i> {% trans "Superusers have all rights on everything, to manage the website." %}
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-head">
|
|
||||||
<h4 class="card-header text-center">
|
|
||||||
<a href="#" data-toggle="collapse" data-target="#card-superusers">{% trans "Superusers" %}</a>
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<div class="card-body collapse show" id="card-superusers">
|
|
||||||
{% render_table superusers %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-head">
|
|
||||||
<h4 class="card-header text-center">
|
|
||||||
<a href="#" data-toggle="collapse" data-target="#card-clubs">{% trans "Club managers" %}</a>
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<div class="card-body collapse show" id="card-clubs">
|
|
||||||
{% render_table special_memberships_table %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="card bg-light">
|
<div class="card bg-light">
|
||||||
<h3 class="card-header text-center">
|
<h3 class="card-header text-center">
|
||||||
|
|
@ -97,6 +65,25 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% if user.is_authenticated %}
|
||||||
|
<div class="card bg-light mb-3">
|
||||||
|
<h3 class="card-header text-center">
|
||||||
|
{% trans "Users that have surnormal rights" %}
|
||||||
|
</h3>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-head">
|
||||||
|
<h4 class="card-header text-center">
|
||||||
|
<a href="#" data-toggle="collapse" data-target="#card-clubs">{% trans "Club managers" %}</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div class="card-body collapse show" id="card-clubs">
|
||||||
|
{% render_table special_memberships_table %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extrajavascript %}
|
{% block extrajavascript %}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class OAuth2TestCase(TestCase):
|
||||||
# Create membership to validate permissions
|
# Create membership to validate permissions
|
||||||
NoteUser.objects.create(user=self.user)
|
NoteUser.objects.create(user=self.user)
|
||||||
membership = Membership.objects.create(user=self.user, club_id=bde.pk)
|
membership = Membership.objects.create(user=self.user, club_id=bde.pk)
|
||||||
membership.roles.add(Role.objects.get(name="Adhérent BDE"))
|
membership.roles.add(Role.objects.get(name="Adhérent"))
|
||||||
membership.save()
|
membership.save()
|
||||||
|
|
||||||
# User is now a member and can now see its own user detail
|
# User is now a member and can now see its own user detail
|
||||||
|
|
@ -85,7 +85,7 @@ class OAuth2TestCase(TestCase):
|
||||||
bde = Club.objects.get(name="BDE")
|
bde = Club.objects.get(name="BDE")
|
||||||
NoteUser.objects.create(user=self.user)
|
NoteUser.objects.create(user=self.user)
|
||||||
membership = Membership.objects.create(user=self.user, club_id=bde.pk)
|
membership = Membership.objects.create(user=self.user, club_id=bde.pk)
|
||||||
membership.roles.add(Role.objects.get(name="Adhérent BDE"))
|
membership.roles.add(Role.objects.get(name="Adhérent"))
|
||||||
membership.save()
|
membership.save()
|
||||||
|
|
||||||
resp = self.client.get(reverse('permission:scopes'))
|
resp = self.client.get(reverse('permission:scopes'))
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ class TestPermissionDenied(TestCase):
|
||||||
name="",
|
name="",
|
||||||
description="",
|
description="",
|
||||||
creater=self.user,
|
creater=self.user,
|
||||||
activity_type_id=1,
|
activity_type_id=4,
|
||||||
organizer_id=1,
|
organizer_id=1,
|
||||||
attendees_club_id=1,
|
attendees_club_id=1,
|
||||||
date_start=timezone.now(),
|
date_start=timezone.now(),
|
||||||
|
|
@ -54,7 +54,7 @@ class TestPermissionDenied(TestCase):
|
||||||
name="",
|
name="",
|
||||||
description="",
|
description="",
|
||||||
creater=self.user,
|
creater=self.user,
|
||||||
activity_type_id=1,
|
activity_type_id=4,
|
||||||
organizer_id=1,
|
organizer_id=1,
|
||||||
attendees_club_id=1,
|
attendees_club_id=1,
|
||||||
date_start=timezone.now(),
|
date_start=timezone.now(),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from django.core.exceptions import FieldError
|
||||||
from django.db.models import F, Q
|
from django.db.models import F, Q
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from member.models import Club, Membership
|
from member.models import Club, Membership, Role
|
||||||
from note.models import NoteUser, Note, NoteClub, NoteSpecial
|
from note.models import NoteUser, Note, NoteClub, NoteSpecial
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -23,6 +23,12 @@ class PermissionQueryTestCase(TestCase):
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
user = User.objects.create(username="user")
|
user = User.objects.create(username="user")
|
||||||
NoteUser.objects.create(user=user)
|
NoteUser.objects.create(user=user)
|
||||||
|
membership =Membership.objects.create(
|
||||||
|
user=user,
|
||||||
|
club=Club.objects.get(name="BDE")
|
||||||
|
)
|
||||||
|
membership.roles.add(Role.objects.get(name="Adhérent"))
|
||||||
|
membership.save()
|
||||||
|
|
||||||
def test_permission_queries(self):
|
def test_permission_queries(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -131,10 +131,7 @@ class RightsView(TemplateView):
|
||||||
special_memberships = Membership.objects.filter(
|
special_memberships = Membership.objects.filter(
|
||||||
date_start__lte=date.today(),
|
date_start__lte=date.today(),
|
||||||
date_end__gte=date.today(),
|
date_end__gte=date.today(),
|
||||||
).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent BDE")
|
).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent"))
|
||||||
| Q(name="Adhérent Kfet")
|
|
||||||
| Q(name="Membre de club")
|
|
||||||
| Q(name="Bureau de club"))
|
|
||||||
)))\
|
)))\
|
||||||
.order_by("club__name", "user__last_name")\
|
.order_by("club__name", "user__last_name")\
|
||||||
.distinct().all()
|
.distinct().all()
|
||||||
|
|
|
||||||
|
|
@ -44,10 +44,11 @@ class TestSignup(TestCase):
|
||||||
promotion=Club.objects.get(name="BDE").membership_start.year,
|
promotion=Club.objects.get(name="BDE").membership_start.year,
|
||||||
address="Earth",
|
address="Earth",
|
||||||
paid=False,
|
paid=False,
|
||||||
ml_events_registration="en",
|
ml_events_registration="fr",
|
||||||
ml_sport_registration=True,
|
ml_sport_registration=True,
|
||||||
ml_art_registration=True,
|
ml_art_registration=True,
|
||||||
))
|
))
|
||||||
|
# Fail I don't know why ?
|
||||||
self.assertRedirects(response, reverse("registration:email_validation_sent"), 302, 200)
|
self.assertRedirects(response, reverse("registration:email_validation_sent"), 302, 200)
|
||||||
self.assertTrue(User.objects.filter(username="toto").exists())
|
self.assertTrue(User.objects.filter(username="toto").exists())
|
||||||
user = User.objects.get(username="toto")
|
user = User.objects.get(username="toto")
|
||||||
|
|
@ -187,30 +188,6 @@ class TestValidateRegistration(TestCase):
|
||||||
Send wrong data and check that errors are detected
|
Send wrong data and check that errors are detected
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# BDE Membership is mandatory
|
|
||||||
response = self.client.post(reverse("registration:future_user_detail", args=(self.user.pk,)), data=dict(
|
|
||||||
credit_type=NoteSpecial.objects.get(special_type="Chèque").id,
|
|
||||||
credit_amount=4200,
|
|
||||||
last_name="TOTO",
|
|
||||||
first_name="Toto",
|
|
||||||
join_bde=False,
|
|
||||||
join_kfet=False,
|
|
||||||
))
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertTrue(response.context["form"].errors)
|
|
||||||
|
|
||||||
# Same
|
|
||||||
response = self.client.post(reverse("registration:future_user_detail", args=(self.user.pk,)), data=dict(
|
|
||||||
credit_type="",
|
|
||||||
credit_amount=0,
|
|
||||||
last_name="TOTO",
|
|
||||||
first_name="Toto",
|
|
||||||
join_bde=False,
|
|
||||||
join_kfet=True,
|
|
||||||
))
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertTrue(response.context["form"].errors)
|
|
||||||
|
|
||||||
# The BDE membership is not free
|
# The BDE membership is not free
|
||||||
response = self.client.post(reverse("registration:future_user_detail", args=(self.user.pk,)), data=dict(
|
response = self.client.post(reverse("registration:future_user_detail", args=(self.user.pk,)), data=dict(
|
||||||
credit_type=NoteSpecial.objects.get(special_type="Espèces").id,
|
credit_type=NoteSpecial.objects.get(special_type="Espèces").id,
|
||||||
|
|
@ -218,7 +195,8 @@ class TestValidateRegistration(TestCase):
|
||||||
last_name="TOTO",
|
last_name="TOTO",
|
||||||
first_name="Toto",
|
first_name="Toto",
|
||||||
join_bde=True,
|
join_bde=True,
|
||||||
join_kfet=True,
|
join_bda=False,
|
||||||
|
join_bds=False
|
||||||
))
|
))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTrue(response.context["form"].errors)
|
self.assertTrue(response.context["form"].errors)
|
||||||
|
|
@ -230,7 +208,8 @@ class TestValidateRegistration(TestCase):
|
||||||
last_name="",
|
last_name="",
|
||||||
first_name="",
|
first_name="",
|
||||||
join_bde=True,
|
join_bde=True,
|
||||||
join_kfet=True,
|
join_bda=False,
|
||||||
|
join_bds=False
|
||||||
))
|
))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTrue(response.context["form"].errors)
|
self.assertTrue(response.context["form"].errors)
|
||||||
|
|
@ -245,7 +224,8 @@ class TestValidateRegistration(TestCase):
|
||||||
last_name="TOTO",
|
last_name="TOTO",
|
||||||
first_name="Toto",
|
first_name="Toto",
|
||||||
join_bde=True,
|
join_bde=True,
|
||||||
join_kfet=False,
|
join_bda=False,
|
||||||
|
join_bds=False
|
||||||
))
|
))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTrue(response.context["form"].errors)
|
self.assertTrue(response.context["form"].errors)
|
||||||
|
|
@ -269,23 +249,25 @@ class TestValidateRegistration(TestCase):
|
||||||
last_name="TOTO",
|
last_name="TOTO",
|
||||||
first_name="Toto",
|
first_name="Toto",
|
||||||
join_bde=True,
|
join_bde=True,
|
||||||
join_kfet=False,
|
join_bda=False,
|
||||||
|
join_bds=True
|
||||||
))
|
))
|
||||||
self.assertRedirects(response, self.user.profile.get_absolute_url(), 302, 200)
|
self.assertRedirects(response, self.user.profile.get_absolute_url(), 302, 200)
|
||||||
self.user.profile.refresh_from_db()
|
self.user.profile.refresh_from_db()
|
||||||
self.assertTrue(self.user.profile.registration_valid)
|
self.assertTrue(self.user.profile.registration_valid)
|
||||||
self.assertTrue(NoteUser.objects.filter(user=self.user).exists())
|
self.assertTrue(NoteUser.objects.filter(user=self.user).exists())
|
||||||
self.assertTrue(Membership.objects.filter(club__name="BDE", user=self.user).exists())
|
self.assertTrue(Membership.objects.filter(club__name="BDE", user=self.user).exists())
|
||||||
self.assertFalse(Membership.objects.filter(club__name="Kfet", user=self.user).exists())
|
self.assertFalse(Membership.objects.filter(club__name="BDA", user=self.user).exists())
|
||||||
|
self.assertTrue(Membership.objects.filter(club__name="BDS", user=self.user).exists())
|
||||||
self.assertEqual(Transaction.objects.filter(
|
self.assertEqual(Transaction.objects.filter(
|
||||||
Q(source=self.user.note) | Q(destination=self.user.note)).count(), 2)
|
Q(source=self.user.note) | Q(destination=self.user.note)).count(), 3)
|
||||||
|
|
||||||
response = self.client.get(self.user.profile.get_absolute_url())
|
response = self.client.get(self.user.profile.get_absolute_url())
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
def test_validate_kfet_registration(self):
|
def test_validate_kfet_registration(self):
|
||||||
"""
|
"""
|
||||||
The user joins the BDE and the Kfet.
|
The user joins the BDE,BDA and BDS.
|
||||||
"""
|
"""
|
||||||
response = self.client.get(reverse("registration:future_user_detail", args=(self.user.pk,)))
|
response = self.client.get(reverse("registration:future_user_detail", args=(self.user.pk,)))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
@ -313,7 +295,7 @@ class TestValidateRegistration(TestCase):
|
||||||
self.assertTrue(Membership.objects.filter(club__name="BDA", user=self.user).exists())
|
self.assertTrue(Membership.objects.filter(club__name="BDA", user=self.user).exists())
|
||||||
self.assertTrue(Membership.objects.filter(club__name="BDS", user=self.user).exists())
|
self.assertTrue(Membership.objects.filter(club__name="BDS", user=self.user).exists())
|
||||||
self.assertEqual(Transaction.objects.filter(
|
self.assertEqual(Transaction.objects.filter(
|
||||||
Q(source=self.user.note) | Q(destination=self.user.note)).count(), 3)
|
Q(source=self.user.note) | Q(destination=self.user.note)).count(), 4)
|
||||||
|
|
||||||
response = self.client.get(self.user.profile.get_absolute_url())
|
response = self.client.get(self.user.profile.get_absolute_url())
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
|
||||||
|
|
@ -307,7 +307,7 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin,
|
||||||
first_name=first_name,
|
first_name=first_name,
|
||||||
valid=True,
|
valid=True,
|
||||||
)
|
)
|
||||||
for auto_club, auto_join, name in zip([bde, bda, bds], [join_bde, join_bda, join_bds], ["Adhérent BDE", "Adhérent BDA", "Adhérent BDS"]):
|
for auto_club, auto_join in zip([bde, bda, bds], [join_bde, join_bda, join_bds]):
|
||||||
bd_fee = auto_club.membership_fee_paid if user.profile.paid else auto_club.membership_fee_unpaid
|
bd_fee = auto_club.membership_fee_paid if user.profile.paid else auto_club.membership_fee_unpaid
|
||||||
|
|
||||||
if auto_join:
|
if auto_join:
|
||||||
|
|
@ -319,7 +319,7 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin,
|
||||||
)
|
)
|
||||||
membership.save()
|
membership.save()
|
||||||
membership.refresh_from_db()
|
membership.refresh_from_db()
|
||||||
membership.roles.add(Role.objects.get(name=name))
|
membership.roles.add(Role.objects.get(name="Adhérent"))
|
||||||
membership.save()
|
membership.save()
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ Une fois l'inscription validée, détail de ce qu'il se passe :
|
||||||
`Trésorerie <treasury>`_ section crédits de la société générale). Nécessairement, le club Kfet doit être rejoint.
|
`Trésorerie <treasury>`_ section crédits de la société générale). Nécessairement, le club Kfet doit être rejoint.
|
||||||
* Sinon, on crédite la note du montant demandé par le nouveau membre (avec comme description "Crédit TYPE (Inscription)"
|
* Sinon, on crédite la note du montant demandé par le nouveau membre (avec comme description "Crédit TYPE (Inscription)"
|
||||||
où TYPE est le type de crédit), après avoir vérifié que le crédit est suffisant (on n'ouvre pas une note négative)
|
où TYPE est le type de crédit), après avoir vérifié que le crédit est suffisant (on n'ouvre pas une note négative)
|
||||||
* On adhère la personne au BDE, l'adhésion commence aujourd'hui. Il dispose d'un unique rôle : "Adhérent BDE",
|
* On adhère la personne au BDE, l'adhésion commence aujourd'hui. Il dispose d'un unique rôle : "Adhérent",
|
||||||
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. Il dispose d'un unique rôle :
|
* On adhère la personne au club Kfet si cela est demandé, l'adhésion commence aujourd'hui. Il dispose d'un unique rôle :
|
||||||
"Adhérent Kfet", lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de
|
"Adhérent Kfet", lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue