From 7b51236f062e688352eed77b6a1717a48c1d76b1 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Mon, 1 Apr 2024 11:51:00 +0200 Subject: [PATCH] Ajout de groupes et raffinement des permissions --- .../locale/fr/LC_MESSAGES/django.po | 2 +- ...alter_batchimportation_options_and_more.py | 29 ++++++++++ .../migrations/0038_auto_20240331_1815.py | 45 +++++++++++++++ src/agenda_culturel/models.py | 12 ++++ .../templates/agenda_culturel/duplicates.html | 2 + .../templates/agenda_culturel/page.html | 8 ++- .../templates/agenda_culturel/side-nav.html | 17 ++++++ .../single-event/event-in-flat-list-inc.html | 2 +- .../event-in-list-by-day-inc.html | 2 +- .../single-event/event-in-list-inc.html | 2 +- .../single-event/event-single-inc.html | 2 +- src/agenda_culturel/views.py | 56 +++++++++++++++---- 12 files changed, 161 insertions(+), 18 deletions(-) create mode 100644 src/agenda_culturel/migrations/0037_alter_batchimportation_options_and_more.py create mode 100644 src/agenda_culturel/migrations/0038_auto_20240331_1815.py diff --git a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po index a2fd020..35bdb59 100644 --- a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po +++ b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po @@ -516,7 +516,7 @@ msgstr "" #: agenda_culturel/views.py:350 msgid "Your message has been sent successfully." -msgstr "L'événement a été supprimé avec succès" +msgstr "Votre message a été envoyé avec succès." #: agenda_culturel/views.py:358 msgid "The contact message properties has been successfully modified." diff --git a/src/agenda_culturel/migrations/0037_alter_batchimportation_options_and_more.py b/src/agenda_culturel/migrations/0037_alter_batchimportation_options_and_more.py new file mode 100644 index 0000000..1880469 --- /dev/null +++ b/src/agenda_culturel/migrations/0037_alter_batchimportation_options_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.7 on 2024-03-31 16:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0036_auto_20240331_1421'), + ] + + operations = [ + migrations.AlterModelOptions( + name='batchimportation', + options={'permissions': [('run_batchimportation', 'Can run a batch importation')]}, + ), + migrations.AlterModelOptions( + name='categorisationrule', + options={'permissions': [('apply_categorisationrules', 'Apply a categorisation rule')]}, + ), + migrations.AlterModelOptions( + name='event', + options={'permissions': [('set_duplicated_event', 'Can set an event as duplicated')], 'verbose_name': 'Event', 'verbose_name_plural': 'Events'}, + ), + migrations.AlterModelOptions( + name='recurrentimport', + options={'permissions': [('run_recurrentimport', 'Can run a recurrent import')]}, + ), + ] diff --git a/src/agenda_culturel/migrations/0038_auto_20240331_1815.py b/src/agenda_culturel/migrations/0038_auto_20240331_1815.py new file mode 100644 index 0000000..bab4d22 --- /dev/null +++ b/src/agenda_culturel/migrations/0038_auto_20240331_1815.py @@ -0,0 +1,45 @@ +# Generated by Django 4.2.7 on 2024-03-31 16:15 + +from django.db import migrations + + +from django.contrib.auth.management import create_permissions +from django.contrib.auth.models import Group, Permission + + +def update_groups_permissions(apps, schema_editor): + # first add a missing role + user_roles = ["Moderator"] + + for name in user_roles: + Group.objects.create(name=name) + + all_perms = Permission.objects.all() + + # set permissions for moderators + moderator_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['event', 'duplicatedevents']] + Group.objects.get(name="Moderator").permissions.add(*moderator_perms) + + read_mod_perms = [i for i in moderator_perms if i.codename.startswith('view_')] + + # set permissions for automation managers + automanager_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['batchimportation', 'recurrentimport', 'categorisationrule']] + Group.objects.get(name="Automation Manager").permissions.add(*automanager_perms) + Group.objects.get(name="Automation Manager").permissions.add(*read_mod_perms) + + # set permissions for receptionists + receptionist_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['contactmessage']] + Group.objects.get(name="Receptionist").permissions.add(*receptionist_perms) + Group.objects.get(name="Receptionist").permissions.add(*read_mod_perms) + + + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0037_alter_batchimportation_options_and_more'), + ] + + operations = [ + migrations.RunPython(update_groups_permissions), + ] diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index d8245b9..33632ed 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -237,6 +237,7 @@ class Event(models.Model): class Meta: verbose_name = _('Event') verbose_name_plural = _('Events') + permissions = [("set_duplicated_event", "Can set an event as duplicated")] def get_all_tags(): try: @@ -737,6 +738,10 @@ class ContactMessage(models.Model): class RecurrentImport(models.Model): + + class Meta: + permissions = [("run_recurrentimport", "Can run a recurrent import")] + class PROCESSOR(models.TextChoices): ICAL = "ical", _("ical") ICALNOBUSY = "icalnobusy", _("ical no busy") @@ -781,6 +786,9 @@ class BatchImportation(models.Model): SUCCESS = "success", _("Success") FAILED = "failed", _("Failed") + class Meta: + permissions = [("run_batchimportation", "Can run a batch importation")] + created_date = models.DateTimeField(auto_now_add=True) @@ -810,6 +818,10 @@ class CategorisationRule(models.Model): title_contains = models.CharField(verbose_name=_('Contained in the title'), help_text=_('Text contained in the event title'), max_length=512, blank=True, null=True) title_exact = models.BooleanField(verbose_name=_('Exact title extract'), help_text=_("If checked, the extract will be searched for in the title using the exact form (capitals, accents)."), default=False) + class Meta: + permissions = [("apply_categorisationrules", "Apply a categorisation rule")] + + # on applique toutes les règles, de la première à la dernière def apply_rules(event): rules = CategorisationRule.objects.all().order_by("weight", "pk") diff --git a/src/agenda_culturel/templates/agenda_culturel/duplicates.html b/src/agenda_culturel/templates/agenda_culturel/duplicates.html index 7582450..0b2f16c 100644 --- a/src/agenda_culturel/templates/agenda_culturel/duplicates.html +++ b/src/agenda_culturel/templates/agenda_culturel/duplicates.html @@ -27,12 +27,14 @@
  • {{ e.start_day }}{% if e.start_time %} à {{ e.start_time }}{% endif %} : {{ e.title }} créé le {{ e.created_date }}
  • {% endfor %} + {% if perms.agenda_culturel.change_duplicatedevents %} + {% endif %} {% endwith %} {% endfor %} diff --git a/src/agenda_culturel/templates/agenda_culturel/page.html b/src/agenda_culturel/templates/agenda_culturel/page.html index 7b2b9f2..5e7dfce 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page.html +++ b/src/agenda_culturel/templates/agenda_culturel/page.html @@ -46,10 +46,16 @@
  • - {% if user.is_authenticated %} + {% if perms.agenda_culturel.change_event %} {% show_badges_events "bottom" %} + {% endif %} + {% if perms.agenda_culturel.change_duplicatedevents %} {% show_badge_duplicated "bottom" %} + {% endif %} + {% if perms.agenda_culturel.view_contactmessage %} {% show_badge_contactmessages "bottom" %} + {% endif %} + {% if user.is_authenticated %} {{ user.username }} @ {% endif %} Pommes de lune diff --git a/src/agenda_culturel/templates/agenda_culturel/side-nav.html b/src/agenda_culturel/templates/agenda_culturel/side-nav.html index feec84c..741b53c 100644 --- a/src/agenda_culturel/templates/agenda_culturel/side-nav.html +++ b/src/agenda_culturel/templates/agenda_culturel/side-nav.html @@ -9,31 +9,48 @@

    Événements

    + + {% if perms.agenda_culturel.view_batchimportation or perms.agenda_culturel.view_recurrentimport or perms.agenda_culturel.view_categorisationrule%}

    Traitements automatiques

    + {% endif %} + {% if perms.agenda_culturel.view_contactmessage %}

    Messages

    + {% endif %} + {% if user.is_staff %}

    Configuration interne

    + {% endif %}

    Vous êtes connecté(e) en tant que {{ user }}.

    diff --git a/src/agenda_culturel/templates/agenda_culturel/single-event/event-in-flat-list-inc.html b/src/agenda_culturel/templates/agenda_culturel/single-event/event-in-flat-list-inc.html index f389626..d653809 100644 --- a/src/agenda_culturel/templates/agenda_culturel/single-event/event-in-flat-list-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/single-event/event-in-flat-list-inc.html @@ -37,7 +37,7 @@ {% if event.description_hl %}{{ event.description_hl | safe }} [...]{% else %}{% if event.description %}{{ event.description |truncatewords:60 }}{% else %}pas de description{% endif %}{% endif %} - {% if user.is_authenticated %} + {% if perms.agenda_culturel.change_event %}