From 8bb857e6c8d97d94fb6d1ef3e33e2b030386755d Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 15 Apr 2026 14:50:02 +0200 Subject: [PATCH] Display category infos on categorized item --- CHANGES.rst | 3 +- .../behaviors/iconifiedcategorization.py | 1 + .../iconifiedcategory/browser/configure.zcml | 10 ++ .../browser/static/iconifiedcategory.css | 52 ++++----- .../templates/categorized-childs-infos.pt | 41 +------ .../templates/categorized-element-icons.pt | 43 ++++++++ .../categorized-item-info-viewlet.pt | 9 ++ .../iconifiedcategory/browser/viewlets.py | 15 +++ .../iconifiedcategory/browser/views.py | 104 ++++++++++-------- 9 files changed, 164 insertions(+), 114 deletions(-) create mode 100644 src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt create mode 100644 src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt diff --git a/CHANGES.rst b/CHANGES.rst index 1cb0a5a..1f58fdc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,8 @@ Changelog 0.74 (unreleased) ----------------- -- Nothing changed yet. +- Display category infos on categorized item. + [chris-adam] 0.73 (2026-04-01) diff --git a/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py b/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py index 86c1eec..042f8b6 100644 --- a/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py +++ b/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py @@ -140,6 +140,7 @@ def signed(self): def to_approve(self): return getattr(aq_base(self.context), 'to_approve', False) + @property def approved(self): return getattr(aq_base(self.context), 'approved', False) diff --git a/src/collective/iconifiedcategory/browser/configure.zcml b/src/collective/iconifiedcategory/browser/configure.zcml index 178f5ee..5857b81 100644 --- a/src/collective/iconifiedcategory/browser/configure.zcml +++ b/src/collective/iconifiedcategory/browser/configure.zcml @@ -59,6 +59,16 @@ permission="zope2.View" /> + +
- - - - - - - - - - - - - - - - - - - - + diff --git a/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt b/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt new file mode 100644 index 0000000..51f5501 --- /dev/null +++ b/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt b/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt new file mode 100644 index 0000000..37f915a --- /dev/null +++ b/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt @@ -0,0 +1,9 @@ + + +
+ +
+ diff --git a/src/collective/iconifiedcategory/browser/viewlets.py b/src/collective/iconifiedcategory/browser/viewlets.py index d50f3d6..202aa63 100644 --- a/src/collective/iconifiedcategory/browser/viewlets.py +++ b/src/collective/iconifiedcategory/browser/viewlets.py @@ -7,8 +7,23 @@ :license: GPL, see LICENCE.txt for more details. """ +from collective.iconifiedcategory.browser.views import CategorizedElementsMixin from plone.app.layout.viewlets import common as base class CategorizedChildViewlet(base.ViewletBase): """ """ + + +class CategorizedItemInfoViewlet(CategorizedElementsMixin, base.ViewletBase): + """Viewlet showing the category status icons on a categorized item's view page.""" + + def __init__(self, context, request, view, manager=None): + super(CategorizedItemInfoViewlet, self).__init__(context, request, view, manager) + self.element = self.context.aq_parent.categorized_elements[self.context.UID()] + + def show(self, element, attr_prefix): + return element['{0}_activated'.format(attr_prefix)] + + def show_download(self, element): + return False diff --git a/src/collective/iconifiedcategory/browser/views.py b/src/collective/iconifiedcategory/browser/views.py index dfcf8dd..a7aa1e8 100644 --- a/src/collective/iconifiedcategory/browser/views.py +++ b/src/collective/iconifiedcategory/browser/views.py @@ -22,12 +22,68 @@ from Products.CMFCore.permissions import View from Products.CMFCore.utils import _checkPermission from Products.Five import BrowserView +from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from zope.component import getMultiAdapter from zope.component.interfaces import ComponentLookupError import json +class CategorizedElementsMixin(object): + """Mixin providing shared icon rendering for categorized elements.""" + + _element_icons = ViewPageTemplateFile('templates/categorized-element-icons.pt') + + def element_icons_html(self, element): + """Render the status icon spans for the given element.""" + return self._element_icons(element=element) + + def get_css_classses_for(self, functionnality, element): + """ """ + css_classes = [] + if functionnality == "to_print": + css_classes.append("iconified-print") + if element['to_print'] is None: + css_classes.append('deactivated') + elif element['to_print'] is True: + css_classes.append('active') + elif functionnality == "signed": + css_classes.append("iconified-signed") + if element['to_sign'] is False: + css_classes.append('deactivated') + elif element['signed'] is True: + css_classes.append('active') + elif functionnality == "approved": + css_classes.append("iconified-approved") + if element['to_approve'] is False: + css_classes.append('deactivated') + elif element['approved'] is True: + css_classes.append('active') + else: + # default behavior + css_classes.append("iconified-{0}".format(functionnality)) + if element[functionnality] is True: + css_classes.append('active') + return " ".join(css_classes) + + def get_tag_title_for(self, functionnality, element): + """ """ + msg = '' + if functionnality == "to_print": + msg = print_message(to_print_value=element['to_print']) + elif functionnality == "signed": + msg = signed_message(to_sign_value=element['to_sign'], + signed_value=element['signed']) + elif functionnality == "approved": + msg = approved_message(to_approve_value=element['to_approve'], + approved_value=element['approved']) + else: + # default behavior, a boolean message + msg = boolean_message(attr_name=functionnality, + value=element[functionnality]) + return msg + + class CategorizedChildView(BrowserView): """ """ @@ -82,7 +138,7 @@ def get_management_url(self): return "{0}/@@iconifiedcategory".format(self.context.absolute_url()) -class CategorizedChildInfosView(BrowserView): +class CategorizedChildInfosView(CategorizedElementsMixin, BrowserView): """ """ def __init__(self, context, request): """ """ @@ -171,52 +227,6 @@ def _show_detail(self, detail_type): """Made to be overrided.""" return True - def get_css_classses_for(self, functionnality, element): - """ """ - css_classes = [] - if functionnality == "to_print": - css_classes.append("iconified-print") - if element['to_print'] is None: - css_classes.append('deactivated') - elif element['to_print'] is True: - css_classes.append('active') - elif functionnality == "signed": - css_classes.append("iconified-signed") - if element['to_sign'] is False: - css_classes.append('deactivated') - elif element['signed'] is True: - css_classes.append('active') - elif functionnality == "approved": - css_classes.append("iconified-approved") - if element['to_approve'] is False: - css_classes.append('deactivated') - elif element['approved'] is True: - css_classes.append('active') - else: - # default behavior - css_classes.append("iconified-{0}".format(functionnality)) - if element[functionnality] is True: - css_classes.append('active') - return " ".join(css_classes) - - def get_tag_title_for(self, functionnality, element): - """ """ - msg = '' - if functionnality == "to_print": - msg = print_message(to_print_value=element['to_print']) - elif functionnality == "signed": - msg = signed_message(to_sign_value=element['to_sign'], - signed_value=element['signed']) - elif functionnality == "approved": - msg = approved_message(to_approve_value=element['to_approve'], - approved_value=element['approved']) - else: - # default behavior, a boolean message - msg = boolean_message(attr_name=functionnality, - value=element[functionnality]) - return msg - - def check_can_view(obj, request): """ """ try: