# HG changeset patch # User Thierry Florac # Date 1605268862 -3600 # Node ID 31c1bc24a3084beae72cc8ed843a09d6c5b67160 # Parent d3713e98bba0b1be6a960c8bbc85ea303e8622f9 Allow inheritance of themes diff -r d3713e98bba0 -r 31c1bc24a308 src/pyams_content/component/theme/__init__.py --- a/src/pyams_content/component/theme/__init__.py Tue Sep 08 12:23:21 2020 +0200 +++ b/src/pyams_content/component/theme/__init__.py Fri Nov 13 13:01:02 2020 +0100 @@ -11,7 +11,10 @@ # from persistent import Persistent +from pyramid.events import subscriber from zope.container.contained import Contained +from zope.interface import alsoProvides +from zope.lifecycleevent import IObjectAddedEvent from zope.schema.fieldproperty import FieldProperty from pyams_content.component.theme.interfaces import COLLECTIONS_INFO_KEY, \ @@ -21,8 +24,10 @@ THEMES_INFO_KEY, THEMES_MANAGER_KEY from pyams_content.features.checker import BaseContentChecker from pyams_content.features.checker.interfaces import ERROR_VALUE, IContentChecker +from pyams_content.shared.site.interfaces import ISiteFolder from pyams_utils.adapter import adapter_config, get_annotation_adapter from pyams_utils.factory import factory_config +from pyams_utils.inherit import BaseInheritInfo, InheritedFieldProperty __docformat__ = 'restructuredtext' @@ -104,10 +109,14 @@ @factory_config(IThemesInfo) -class ThemesInfo(Persistent, Contained): +class ThemesInfo(BaseInheritInfo, Persistent, Contained): """Themes info persistent class""" - themes = FieldProperty(IThemesInfo['themes']) + adapted_interface = IThemesInfo + target_interface = IThemesTarget + + _themes = FieldProperty(IThemesInfo['themes']) + themes = InheritedFieldProperty(IThemesInfo['themes']) @adapter_config(context=IThemesTarget, provides=IThemesInfo) @@ -135,6 +144,12 @@ return output +@subscriber(IObjectAddedEvent, context_selector=ISiteFolder, parent_selector=IThemesTarget) +def handle_added_site_folder(event): + """Handle site folder when added to a themes target""" + alsoProvides(event.object, IThemesTarget) + + # # Collections management # diff -r d3713e98bba0 -r 31c1bc24a308 src/pyams_content/component/theme/interfaces.py --- a/src/pyams_content/component/theme/interfaces.py Tue Sep 08 12:23:21 2020 +0200 +++ b/src/pyams_content/component/theme/interfaces.py Fri Nov 13 13:01:02 2020 +0100 @@ -10,15 +10,18 @@ # FOR A PARTICULAR PURPOSE. # -__docformat__ = 'restructuredtext' - from zope.interface import Interface, Invalid, invariant from zope.schema import Bool, Choice -from pyams_content import _ from pyams_thesaurus.interfaces.thesaurus import IThesaurusContextManager, \ IThesaurusContextManagerTarget from pyams_thesaurus.schema import ThesaurusTermsListField +from pyams_utils.interfaces.inherit import IInheritInfo + + +__docformat__ = 'restructuredtext' + +from pyams_content import _ # @@ -92,7 +95,7 @@ """Marker interface for tools managing themes""" -class IThemesInfo(Interface): +class IThemesInfo(IInheritInfo): """Themes information interface""" themes = ThesaurusTermsListField(title=_("Themes"), diff -r d3713e98bba0 -r 31c1bc24a308 src/pyams_content/component/theme/zmi/__init__.py --- a/src/pyams_content/component/theme/zmi/__init__.py Tue Sep 08 12:23:21 2020 +0200 +++ b/src/pyams_content/component/theme/zmi/__init__.py Fri Nov 13 13:01:02 2020 +0100 @@ -11,14 +11,16 @@ # from z3c.form import field +from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget from zope.interface import implementer from pyams_content.component.theme import ICollectionsInfo, ICollectionsManager, \ - ICollectionsManagerTarget, ICollectionsTarget, ITagsInfo, ITagsManager, ITagsTarget, \ + ICollectionsTarget, ITagsInfo, ITagsManager, ITagsTarget, \ IThemesInfo, IThemesManager, IThemesManagerTarget, IThemesTarget from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION from pyams_content.shared.common.zmi import WfSharedContentHeaderAdapter from pyams_form.form import AJAXEditForm, EditForm, ajax_config +from pyams_form.group import NamedWidgetsGroup from pyams_form.interfaces.form import IWidgetForm from pyams_pagelet.pagelet import pagelet_config from pyams_skin.interfaces import IDialog, IInnerPage, IPageHeader @@ -90,7 +92,7 @@ # @viewlet_config(name='themes.menu', context=IThemesTarget, layer=IAdminLayer, - manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=352) + manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=360) class ThemesMenu(MenuItem): """Themes menu""" @@ -107,11 +109,33 @@ label_css_class = 'control-label hidden' input_css_class = 'col-md-12' - fields = field.Fields(IThemesInfo) - fields['themes'].widgetFactory = ThesaurusTermsTreeFieldWidget + @property + def fields(self): + if IThemesInfo(self.context).can_inherit: + fields = field.Fields(IThemesInfo).select('no_inherit', 'themes') + fields['no_inherit'].widgetFactory = SingleCheckBoxFieldWidget + else: + fields = field.Fields(IThemesInfo).select('themes') + fields['themes'].widgetFactory = ThesaurusTermsTreeFieldWidget + return fields edit_permission = MANAGE_CONTENT_PERMISSION + def updateGroups(self): + if IThemesInfo(self.context).can_inherit: + group = NamedWidgetsGroup(self, 'themes', self.widgets, + ('no_inherit', 'themes'), + legend=_("Don't inherit parent themes"), + css_class='inner', + switch=True, + checkbox_switch=True, + checkbox_mode='disable', + checkbox_field=IThemesInfo['no_inherit']) + else: + group = NamedWidgetsGroup(self, 'themes', self.widgets, (), css_class='inner') + self.add_group(group) + super(BaseThemesEditForm, self).updateGroups() + def updateWidgets(self, prefix=None): super(BaseThemesEditForm, self).updateWidgets(prefix) if 'themes' in self.widgets: @@ -129,15 +153,19 @@ icon_class = 'fa fa-fw fa-tags' -@pagelet_config(name='themes.html', context=IThemesTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) -@ajax_config(name='themes.json', context=IThemesTarget, layer=IPyAMSLayer, base=AJAXEditForm) +@pagelet_config(name='themes.html', context=IThemesTarget, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +@ajax_config(name='themes.json', context=IThemesTarget, layer=IPyAMSLayer, + base=AJAXEditForm) @implementer(IWidgetForm, IInnerPage) class ThemesEditForm(BaseThemesEditForm, AdminEditForm): """Themes edit form""" -@pagelet_config(name='themes-dialog.html', context=IThemesTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) -@ajax_config(name='themes-dialog.json', context=IThemesTarget, layer=IPyAMSLayer, base=AJAXEditForm) +@pagelet_config(name='themes-dialog.html', context=IThemesTarget, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +@ajax_config(name='themes-dialog.json', context=IThemesTarget, layer=IPyAMSLayer, + base=AJAXEditForm) @implementer(IDialog) class DialogThemesEditForm(BaseThemesEditForm, AdminDialogEditForm): """Dialog themes edit form""" @@ -150,7 +178,7 @@ # @viewlet_config(name='collections.menu', context=ICollectionsTarget, layer=IAdminLayer, - manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=354) + manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=370) class CollectionsMenu(MenuItem): """Collections menu""" diff -r d3713e98bba0 -r 31c1bc24a308 src/pyams_content/component/theme/zmi/manager.py --- a/src/pyams_content/component/theme/zmi/manager.py Tue Sep 08 12:23:21 2020 +0200 +++ b/src/pyams_content/component/theme/zmi/manager.py Fri Nov 13 13:01:02 2020 +0100 @@ -40,17 +40,17 @@ # @viewlet_config(name='tags-manager.menu', context=ITagsManagerTarget, layer=IAdminLayer, - manager=IPropertiesMenu, permission=MANAGE_SITE_ROOT_PERMISSION, weight=40) + manager=IPropertiesMenu, permission=MANAGE_SITE_ROOT_PERMISSION, weight=730) class TagsManagerMenu(MenuItem): """Tags menu""" label = _("Tags settings...") icon_class = 'fa-tag' - url = 'tags.html' + url = 'tags-manager.html' modal_target = True -@pagelet_config(name='tags.html', context=ITagsManagerTarget, layer=IPyAMSLayer, +@pagelet_config(name='tags-manager.html', context=ITagsManagerTarget, layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION) @ajax_config(name='tags.json', context=ITagsManagerTarget, layer=IPyAMSLayer) class TagsManagerEditForm(AdminDialogEditForm): @@ -104,17 +104,17 @@ # @viewlet_config(name='themes-manager.menu', context=IThemesManagerTarget, layer=IAdminLayer, - manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=41) + manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=740) class ThemesManagerMenu(MenuItem): """Themes menu""" label = _("Themes settings...") icon_class = 'fa-tags' - url = 'themes.html' + url = 'themes-manager.html' modal_target = True -@pagelet_config(name='themes.html', context=IThemesManagerTarget, layer=IPyAMSLayer, +@pagelet_config(name='themes-manager.html', context=IThemesManagerTarget, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION) @ajax_config(name='themes.json', context=IThemesManagerTarget, layer=IPyAMSLayer) class ThemesManagerEditForm(AdminDialogEditForm): @@ -156,17 +156,17 @@ @viewlet_config(name='collections-manager.menu', context=ICollectionsManagerTarget, layer=IAdminLayer, manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, - weight=42) + weight=750) class CollectionsManagerMenu(MenuItem): """Collections menu""" label = _("Collections settings...") icon_class = 'fa-book' - url = 'collections.html' + url = 'collections-manager.html' modal_target = True -@pagelet_config(name='collections.html', context=ICollectionsManagerTarget, layer=IPyAMSLayer, +@pagelet_config(name='collections-manager.html', context=ICollectionsManagerTarget, layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION) @ajax_config(name='collections.json', context=ICollectionsManagerTarget, layer=IPyAMSLayer) class CollectionsManagerEditForm(AdminDialogEditForm):