From d3002ba82ee233a5c16ff8b717a9439838f63d17 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:30:19 -0500 Subject: [PATCH 1/7] fix(gh-931): cms migrate fails --- taccsite_cms/migrations/0001_add_groups.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/taccsite_cms/migrations/0001_add_groups.py b/taccsite_cms/migrations/0001_add_groups.py index 94ef39471..2c5b06c01 100644 --- a/taccsite_cms/migrations/0001_add_groups.py +++ b/taccsite_cms/migrations/0001_add_groups.py @@ -8,6 +8,12 @@ def add_groups(apps, schema_editor): from taccsite_cms.management.commands.group_perms.grid_editor_basic import set_group_perms as add_grid_editor_basic from taccsite_cms.management.commands.group_perms.grid_editor_advanced import set_group_perms as add_grid_editor_advanced + # Ensure permissions are created + from django.contrib.auth.management import create_permissions + from django.apps import apps as django_apps + for app_config in django_apps.get_app_configs(): + create_permissions(app_config, verbosity=0) + add_text_editor_basic() add_text_editor_advanced() add_media_editor_basic() @@ -37,6 +43,12 @@ def remove_groups(apps, schema_editor): Group.objects.filter(name__in=group_names).delete() class Migration(migrations.Migration): + dependencies = [ + ('auth', '0001_initial'), + ('contenttypes', '0001_initial'), + ('cms', '0001_initial'), + ] + operations = [ migrations.RunPython(add_groups, reverse_code=remove_groups), ] From 6f9becd829b5c5c99bf52d5a7ae0753abc80a4ab Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Thu, 10 Apr 2025 14:04:38 -0500 Subject: [PATCH 2/7] test(migrations): add explicit up-to-date dependencies Didn't work when I tested on fresh CMS. But seems simpler than before. Every time I tested previosu commit with AI debugging, we agreed "create_permissions" was a bad thing to do. It usurps Django's order of oeprations. --- taccsite_cms/migrations/0001_add_groups.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/taccsite_cms/migrations/0001_add_groups.py b/taccsite_cms/migrations/0001_add_groups.py index 2c5b06c01..dc34cad26 100644 --- a/taccsite_cms/migrations/0001_add_groups.py +++ b/taccsite_cms/migrations/0001_add_groups.py @@ -8,12 +8,6 @@ def add_groups(apps, schema_editor): from taccsite_cms.management.commands.group_perms.grid_editor_basic import set_group_perms as add_grid_editor_basic from taccsite_cms.management.commands.group_perms.grid_editor_advanced import set_group_perms as add_grid_editor_advanced - # Ensure permissions are created - from django.contrib.auth.management import create_permissions - from django.apps import apps as django_apps - for app_config in django_apps.get_app_configs(): - create_permissions(app_config, verbosity=0) - add_text_editor_basic() add_text_editor_advanced() add_media_editor_basic() @@ -44,9 +38,19 @@ def remove_groups(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('auth', '0001_initial'), - ('contenttypes', '0001_initial'), - ('cms', '0001_initial'), + ('auth', '0012_alter_user_first_name_max_length'), + ('contenttypes', '0002_remove_content_type_name'), + ('cms', '0022_auto_20180620_1551'), + ('djangocms_link', '0016_alter_link_cmsplugin_ptr'), + ('djangocms_text_ckeditor', '0005_alter_text_cmsplugin_ptr'), + ('bootstrap4_grid', '0004_remove_bootstrap4gridcolumn_column_size'), + ('bootstrap4_picture', '0004_auto_20190703_0831'), + ('djangocms_picture', '0011_auto_20190314_1536'), + ('djangocms_video', '0010_videoplayer_parameters'), + ('filer', '0015_alter_file_owner_alter_file_polymorphic_ctype_and_more'), + ('djangocms_file', '0011_auto_20181211_0357'), + ('bootstrap4_content', '0002_added_figure'), + ('taggit', '0001_initial'), ] operations = [ From 138d1ec01cc399229787534c72976551c01b213d Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:43:39 -0500 Subject: [PATCH 3/7] fix: should manage groups after migration --- taccsite_cms/__init__.py | 7 +-- taccsite_cms/apps.py | 43 ++++++++++++++++++ taccsite_cms/migrations/0001_add_groups.py | 51 +++------------------- taccsite_cms/models.py | 8 ++++ 4 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 taccsite_cms/apps.py create mode 100644 taccsite_cms/models.py diff --git a/taccsite_cms/__init__.py b/taccsite_cms/__init__.py index 4027ed4d2..3d498b5fa 100755 --- a/taccsite_cms/__init__.py +++ b/taccsite_cms/__init__.py @@ -1,6 +1,3 @@ -# from django.conf import settings -# -# if settings.CONSOLE_LOG_ENABLED: -# print("--> Parsing FILE: cms-template-setup01/taccsite_cms/__init__.py") +from .apps import TaccsiteCmsConfig -# print("--> Parsing FILE: cms-template-setup01/taccsite_cms/__init__.py") +default_app_config = f'{TaccsiteCmsConfig.name}.apps.TaccsiteCmsConfig' diff --git a/taccsite_cms/apps.py b/taccsite_cms/apps.py new file mode 100644 index 000000000..f3bdc022a --- /dev/null +++ b/taccsite_cms/apps.py @@ -0,0 +1,43 @@ +import logging +from django.apps import AppConfig +from django.db.models.signals import post_migrate + +logger = logging.getLogger(f"portal.{__name__}") + +class TaccsiteCmsConfig(AppConfig): + name = 'taccsite_cms' + verbose_name = 'TACC CMS' + + def ready(self): + post_migrate.connect(self.create_groups, sender=self) + + def create_groups(self, sender, **kwargs): + from django.contrib.auth.models import Group + + from .management.commands.group_perms.text_editor_basic import \ + set_group_perms as add_text_editor_basic, GROUP_NAME + from .management.commands.group_perms.text_editor_advanced import \ + set_group_perms as add_text_editor_advanced + from .management.commands.group_perms.media_editor_basic import \ + set_group_perms as add_media_editor_basic + from .management.commands.group_perms.media_editor_advanced import \ + set_group_perms as add_media_editor_advanced + from .management.commands.group_perms.grid_editor_basic import \ + set_group_perms as add_grid_editor_basic + from .management.commands.group_perms.grid_editor_advanced import \ + set_group_perms as add_grid_editor_advanced + + groups_exist = Group.objects.filter(name=GROUP_NAME).exists() + action = 'Updating' if groups_exist else 'Creating' + + logger.info(f'{action} CMS groups via post_migrate signal') + try: + add_text_editor_basic() + add_text_editor_advanced() + add_media_editor_basic() + add_media_editor_advanced() + add_grid_editor_basic() + add_grid_editor_advanced() + logger.info(f'Finished {action.lower()} CMS groups') + except Exception as e: + logger.error(f'Error creating CMS groups: {e}', exc_info=True) diff --git a/taccsite_cms/migrations/0001_add_groups.py b/taccsite_cms/migrations/0001_add_groups.py index 2c5b06c01..84159279b 100644 --- a/taccsite_cms/migrations/0001_add_groups.py +++ b/taccsite_cms/migrations/0001_add_groups.py @@ -1,54 +1,13 @@ from django.db import migrations -def add_groups(apps, schema_editor): - from taccsite_cms.management.commands.group_perms.text_editor_basic import set_group_perms as add_text_editor_basic - from taccsite_cms.management.commands.group_perms.text_editor_advanced import set_group_perms as add_text_editor_advanced - from taccsite_cms.management.commands.group_perms.media_editor_basic import set_group_perms as add_media_editor_basic - from taccsite_cms.management.commands.group_perms.media_editor_advanced import set_group_perms as add_media_editor_advanced - from taccsite_cms.management.commands.group_perms.grid_editor_basic import set_group_perms as add_grid_editor_basic - from taccsite_cms.management.commands.group_perms.grid_editor_advanced import set_group_perms as add_grid_editor_advanced +# No-op since group creation became handled by post_migrate signal (see apps.py) - # Ensure permissions are created - from django.contrib.auth.management import create_permissions - from django.apps import apps as django_apps - for app_config in django_apps.get_app_configs(): - create_permissions(app_config, verbosity=0) +# Retained for backwards-compatibility / migration history integrity - add_text_editor_basic() - add_text_editor_advanced() - add_media_editor_basic() - add_media_editor_advanced() - add_grid_editor_basic() - add_grid_editor_advanced() - -def remove_groups(apps, schema_editor): - from taccsite_cms.management.commands.group_perms.text_editor_basic import GROUP_NAME as text_editor_basic_name - from taccsite_cms.management.commands.group_perms.text_editor_advanced import GROUP_NAME as text_editor_advanced_name - from taccsite_cms.management.commands.group_perms.media_editor_basic import GROUP_NAME as media_editor_basic_name - from taccsite_cms.management.commands.group_perms.media_editor_advanced import GROUP_NAME as media_editor_advanced_name - from taccsite_cms.management.commands.group_perms.grid_editor_basic import GROUP_NAME as grid_editor_basic_name - from taccsite_cms.management.commands.group_perms.grid_editor_advanced import GROUP_NAME as grid_editor_advanced_name - - Group = apps.get_model('auth', 'Group') - - group_names = [ - text_editor_basic_name, - text_editor_advanced_name, - media_editor_basic_name, - media_editor_advanced_name, - grid_editor_basic_name, - grid_editor_advanced_name, - ] - - Group.objects.filter(name__in=group_names).delete() +def noop(apps, schema_editor): + pass class Migration(migrations.Migration): - dependencies = [ - ('auth', '0001_initial'), - ('contenttypes', '0001_initial'), - ('cms', '0001_initial'), - ] - operations = [ - migrations.RunPython(add_groups, reverse_code=remove_groups), + migrations.RunPython(noop), ] diff --git a/taccsite_cms/models.py b/taccsite_cms/models.py new file mode 100644 index 000000000..a4ab5bd27 --- /dev/null +++ b/taccsite_cms/models.py @@ -0,0 +1,8 @@ +from django.db import models + +class DummyModel(models.Model): + """ + Exists solely to trigger Django to send post_migrate signal (see apps.py) + """ + class Meta: + app_label = 'taccsite_cms' From f1435a1522e809b9603c949518944a004b99a632 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Mon, 21 Apr 2025 16:43:31 -0500 Subject: [PATCH 4/7] feat: style editor --- .../group_perms/style_editor_advanced.py | 23 +++++++++++++++++++ .../group_perms/style_editor_basic.py | 21 +++++++++++++++++ taccsite_cms/management/commands/util.py | 17 ++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 taccsite_cms/management/commands/group_perms/style_editor_advanced.py create mode 100644 taccsite_cms/management/commands/group_perms/style_editor_basic.py diff --git a/taccsite_cms/management/commands/group_perms/style_editor_advanced.py b/taccsite_cms/management/commands/group_perms/style_editor_advanced.py new file mode 100644 index 000000000..45a7d3298 --- /dev/null +++ b/taccsite_cms/management/commands/group_perms/style_editor_advanced.py @@ -0,0 +1,23 @@ +""" +To edit and move Style plugins +(not CSS, but "Style" block that lets editors add custom markup e.g. for Cards) +""" + +from django.contrib.auth.models import Group + +from ..util import ( + let_view_page_and_structure, + let_view_and_change_style_plugin, + let_add_and_delete_style_plugin +) + +GROUP_NAME = 'Style Editor (Basic)' + +def set_group_perms(): + group, was_created = Group.objects.get_or_create( + name=GROUP_NAME + ) + + let_view_page_and_structure(group) + let_view_and_change_style_plugin(group) + let_add_and_delete_style_plugin(group) diff --git a/taccsite_cms/management/commands/group_perms/style_editor_basic.py b/taccsite_cms/management/commands/group_perms/style_editor_basic.py new file mode 100644 index 000000000..61a2160bd --- /dev/null +++ b/taccsite_cms/management/commands/group_perms/style_editor_basic.py @@ -0,0 +1,21 @@ +""" +To edit and move Style plugins +(not CSS, but "Style" block that lets editors add custom markup e.g. for Cards) +""" + +from django.contrib.auth.models import Group + +from ..util import ( + let_view_page_and_structure, + let_view_and_change_style_plugin +) + +GROUP_NAME = 'Style Editor (Basic)' + +def set_group_perms(): + group, was_created = Group.objects.get_or_create( + name=GROUP_NAME + ) + + let_view_page_and_structure(group) + let_view_and_change_style_plugin(group) diff --git a/taccsite_cms/management/commands/util.py b/taccsite_cms/management/commands/util.py index 5540811ec..ac1128360 100644 --- a/taccsite_cms/management/commands/util.py +++ b/taccsite_cms/management/commands/util.py @@ -61,6 +61,23 @@ def let_view_and_change_plugin(group): +# Style +def let_view_and_change_style_plugin(group): + """ + Add permissions to view & change Style plugins + """ + add_perm(group, 'djangocms_style', 'style', 'Can view style') + add_perm(group, 'djangocms_style', 'style', 'Can change style') + +def let_add_and_delete_style_plugin(group): + """ + Add permissions to add & delete Style plugins + """ + add_perm(group, 'djangocms_style', 'style', 'Can add style') + add_perm(group, 'djangocms_style', 'style', 'Can delete style') + + + # Grid def let_view_and_change_grid(group): """ From a95a9e1d1d66bcfdbe6c55a3ac1dfea25dc0ade0 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Mon, 21 Apr 2025 16:52:39 -0500 Subject: [PATCH 5/7] feat: add style editor groups --- taccsite_cms/apps.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/taccsite_cms/apps.py b/taccsite_cms/apps.py index f3bdc022a..2bd1d54dc 100644 --- a/taccsite_cms/apps.py +++ b/taccsite_cms/apps.py @@ -26,6 +26,10 @@ def create_groups(self, sender, **kwargs): set_group_perms as add_grid_editor_basic from .management.commands.group_perms.grid_editor_advanced import \ set_group_perms as add_grid_editor_advanced + from .management.commands.group_perms.style_editor_basic import \ + set_group_perms as add_style_editor_basic + from .management.commands.group_perms.style_editor_advanced import \ + set_group_perms as add_style_editor_advanced groups_exist = Group.objects.filter(name=GROUP_NAME).exists() action = 'Updating' if groups_exist else 'Creating' @@ -38,6 +42,8 @@ def create_groups(self, sender, **kwargs): add_media_editor_advanced() add_grid_editor_basic() add_grid_editor_advanced() + add_style_editor_basic() + add_style_editor_advanced() logger.info(f'Finished {action.lower()} CMS groups') except Exception as e: logger.error(f'Error creating CMS groups: {e}', exc_info=True) From 878d14802af14f8c4de36efd8ffad1d92f293dfa Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:29:51 -0500 Subject: [PATCH 6/7] docs: fix incomplete desc --- .../management/commands/group_perms/style_editor_advanced.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taccsite_cms/management/commands/group_perms/style_editor_advanced.py b/taccsite_cms/management/commands/group_perms/style_editor_advanced.py index 45a7d3298..4554e3385 100644 --- a/taccsite_cms/management/commands/group_perms/style_editor_advanced.py +++ b/taccsite_cms/management/commands/group_perms/style_editor_advanced.py @@ -1,5 +1,5 @@ """ -To edit and move Style plugins +To edit, move, add and delete Style plugins (not CSS, but "Style" block that lets editors add custom markup e.g. for Cards) """ From 0c36068271b1d91aa8976d1ed67ede9f4331c2e2 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:35:43 -0500 Subject: [PATCH 7/7] feat(perms): snippet user --- taccsite_cms/apps.py | 3 +++ .../commands/group_perms/snippet_user.py | 23 +++++++++++++++++++ taccsite_cms/management/commands/util.py | 17 ++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 taccsite_cms/management/commands/group_perms/snippet_user.py diff --git a/taccsite_cms/apps.py b/taccsite_cms/apps.py index 2bd1d54dc..402d39fed 100644 --- a/taccsite_cms/apps.py +++ b/taccsite_cms/apps.py @@ -30,6 +30,8 @@ def create_groups(self, sender, **kwargs): set_group_perms as add_style_editor_basic from .management.commands.group_perms.style_editor_advanced import \ set_group_perms as add_style_editor_advanced + from .management.commands.group_perms.snippet_user import \ + set_group_perms as add_snippet_user groups_exist = Group.objects.filter(name=GROUP_NAME).exists() action = 'Updating' if groups_exist else 'Creating' @@ -44,6 +46,7 @@ def create_groups(self, sender, **kwargs): add_grid_editor_advanced() add_style_editor_basic() add_style_editor_advanced() + add_snippet_user() logger.info(f'Finished {action.lower()} CMS groups') except Exception as e: logger.error(f'Error creating CMS groups: {e}', exc_info=True) diff --git a/taccsite_cms/management/commands/group_perms/snippet_user.py b/taccsite_cms/management/commands/group_perms/snippet_user.py new file mode 100644 index 000000000..21a9c7ae4 --- /dev/null +++ b/taccsite_cms/management/commands/group_perms/snippet_user.py @@ -0,0 +1,23 @@ +""" +To edit, move, add and delete Snippet plugins +(not snippets themselves, but "Snippet" blocks which point to a snippet) +""" + +from django.contrib.auth.models import Group + +from ..util import ( + let_view_page_and_structure, + let_view_and_change_snippet_plugin, + let_add_and_delete_snippet_plugin, +) + +GROUP_NAME = 'Snippet User' + +def set_group_perms(): + group, was_created = Group.objects.get_or_create( + name=GROUP_NAME + ) + + let_view_page_and_structure(group) + let_view_and_change_snippet_plugin(group) + let_add_and_delete_snippet_plugin(group) diff --git a/taccsite_cms/management/commands/util.py b/taccsite_cms/management/commands/util.py index ac1128360..f0e8f74fe 100644 --- a/taccsite_cms/management/commands/util.py +++ b/taccsite_cms/management/commands/util.py @@ -78,6 +78,23 @@ def let_add_and_delete_style_plugin(group): +# Snippet +def let_view_and_change_snippet_plugin(group): + """ + Add permissions to view & change Snippet plugins (a.k.a "pointers" / "Ptr") + """ + add_perm(group, 'djangocms_snippet', 'Snippet Ptr', 'Can view Snippet Ptr') + add_perm(group, 'djangocms_snippet', 'Snippet Ptr', 'Can change Snippet Ptr') + +def let_add_and_delete_snippet_plugin(group): + """ + Add permissions to add & delete Snippet plugins (a.k.a "pointers" / "Ptr") + """ + add_perm(group, 'djangocms_snippet', 'Snippet Ptr', 'Can add Snippet Ptr') + add_perm(group, 'djangocms_snippet', 'Snippet Ptr', 'Can delete Snippet Ptr') + + + # Grid def let_view_and_change_grid(group): """