src/pyams_content/component/paragraph/milestone.py
changeset 1094 465b273c312b
parent 936 2b31cde8c028
child 1157 ffb751b038cc
equal deleted inserted replaced
1093:f95d237cbd68 1094:465b273c312b
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
    14 
    14 
    15 
       
    16 # import standard library
       
    17 from persistent import Persistent
    15 from persistent import Persistent
    18 from pyramid.events import subscriber
    16 from pyramid.events import subscriber
    19 from zope.container.contained import Contained
    17 from zope.container.contained import Contained
    20 from zope.container.ordered import OrderedContainer
    18 from zope.container.ordered import OrderedContainer
    21 from zope.interface import implementer
    19 from zope.interface import implementer
    24 from zope.location import locate
    22 from zope.location import locate
    25 from zope.location.interfaces import ISublocations
    23 from zope.location.interfaces import ISublocations
    26 from zope.schema.fieldproperty import FieldProperty
    24 from zope.schema.fieldproperty import FieldProperty
    27 from zope.traversing.interfaces import ITraversable
    25 from zope.traversing.interfaces import ITraversable
    28 
    26 
    29 # import interfaces
       
    30 from pyams_catalog.utils import index_object
    27 from pyams_catalog.utils import index_object
    31 from pyams_content import _
    28 from pyams_content.component.paragraph import BaseParagraph, BaseParagraphContentChecker, BaseParagraphFactory
    32 from pyams_content.component.paragraph import BaseParagraph, BaseParagraphFactory, BaseParagraphContentChecker
    29 from pyams_content.component.paragraph.interfaces import IParagraphContainer, IParagraphContainerTarget, \
    33 # import packages
       
    34 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
       
    35     IParagraphFactory
    30     IParagraphFactory
    36 from pyams_content.component.paragraph.interfaces.milestone import IMilestone, IMilestoneContainer, \
    31 from pyams_content.component.paragraph.interfaces.milestone import IMilestone, IMilestoneContainer, \
    37     IMilestoneContainerTarget, MILESTONE_CONTAINER_KEY, IMilestoneParagraph, MILESTONE_PARAGRAPH_TYPE, \
    32     IMilestoneContainerTarget, IMilestoneParagraph, MILESTONE_CONTAINER_KEY, MILESTONE_PARAGRAPH_NAME, \
    38     MILESTONE_PARAGRAPH_RENDERERS, MILESTONE_PARAGRAPH_NAME
    33     MILESTONE_PARAGRAPH_RENDERERS, MILESTONE_PARAGRAPH_TYPE
    39 from pyams_content.features.checker import BaseContentChecker
    34 from pyams_content.features.checker import BaseContentChecker
    40 from pyams_content.features.checker.interfaces import IContentChecker, MISSING_VALUE, MISSING_LANG_VALUE, ERROR_VALUE
    35 from pyams_content.features.checker.interfaces import ERROR_VALUE, IContentChecker, MISSING_LANG_VALUE, MISSING_VALUE
    41 from pyams_content.features.renderer import RenderersVocabulary
    36 from pyams_content.features.renderer import RenderersVocabulary
    42 from pyams_form.interfaces.form import IFormContextPermissionChecker
    37 from pyams_form.interfaces.form import IFormContextPermissionChecker
    43 from pyams_i18n.interfaces import II18n, II18nManager, INegotiator
    38 from pyams_i18n.interfaces import II18n, II18nManager, INegotiator
    44 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter
    39 from pyams_utils.adapter import ContextAdapter, adapter_config, get_annotation_adapter
    45 from pyams_utils.factory import factory_config
    40 from pyams_utils.factory import factory_config
    46 from pyams_utils.registry import get_current_registry, get_utility, utility_config
    41 from pyams_utils.registry import get_current_registry, get_utility, utility_config
    47 from pyams_utils.request import check_request
    42 from pyams_utils.request import check_request
    48 from pyams_utils.traversing import get_parent
    43 from pyams_utils.traversing import get_parent
    49 from pyams_utils.vocabulary import vocabulary_config
    44 from pyams_utils.vocabulary import vocabulary_config
    50 
    45 
       
    46 from pyams_content import _
       
    47 
    51 
    48 
    52 #
    49 #
    53 # Milestone class and adapters
    50 # Milestone class and adapters
    54 #
    51 #
    55 
    52 
    59 
    56 
    60     visible = FieldProperty(IMilestone['visible'])
    57     visible = FieldProperty(IMilestone['visible'])
    61     title = FieldProperty(IMilestone['title'])
    58     title = FieldProperty(IMilestone['title'])
    62     label = FieldProperty(IMilestone['label'])
    59     label = FieldProperty(IMilestone['label'])
    63     anchor = FieldProperty(IMilestone['anchor'])
    60     anchor = FieldProperty(IMilestone['anchor'])
       
    61 
       
    62     @property
       
    63     def target(self):
       
    64         container = get_parent(self, IParagraphContainer)
       
    65         if container is not None:
       
    66             return container.get(self.anchor)
    64 
    67 
    65 
    68 
    66 @adapter_config(context=IMilestone, provides=IFormContextPermissionChecker)
    69 @adapter_config(context=IMilestone, provides=IFormContextPermissionChecker)
    67 class MilestonePermissionChecker(ContextAdapter):
    70 class MilestonePermissionChecker(ContextAdapter):
    68     """Milestone permission checker"""
    71     """Milestone permission checker"""
   112         manager = get_parent(self.context, II18nManager)
   115         manager = get_parent(self.context, II18nManager)
   113         if manager is not None:
   116         if manager is not None:
   114             langs = manager.get_languages()
   117             langs = manager.get_languages()
   115         else:
   118         else:
   116             negotiator = get_utility(INegotiator)
   119             negotiator = get_utility(INegotiator)
   117             langs = (negotiator.server_language, )
   120             langs = (negotiator.server_language,)
   118         i18n = II18n(self.context)
   121         i18n = II18n(self.context)
   119         for lang in langs:
   122         for lang in langs:
   120             for attr in ('title', 'label'):
   123             for attr in ('title', 'label'):
   121                 value = i18n.get_attribute(attr, lang, request)
   124                 value = i18n.get_attribute(attr, lang, request)
   122                 if not value:
   125                 if not value:
   202         output = []
   205         output = []
   203         registry = request.registry
   206         registry = request.registry
   204         for milestone in IMilestoneContainer(self.context).values():
   207         for milestone in IMilestoneContainer(self.context).values():
   205             if not milestone.visible:
   208             if not milestone.visible:
   206                 continue
   209                 continue
   207             for name, checker in sorted(registry.getAdapters((milestone, ), IContentChecker),
   210             for name, checker in sorted(registry.getAdapters((milestone,), IContentChecker),
   208                                         key=lambda x: x[1].weight):
   211                                         key=lambda x: x[1].weight):
   209                 output.append('- {0} :'.format(II18n(milestone).query_attribute('title', request=request)))
   212                 output.append('- {0} :'.format(II18n(milestone).query_attribute('title', request=request)))
   210                 output.append(checker.get_check_output(request))
   213                 output.append(checker.get_check_output(request))
   211         return output
   214         return output
   212 
   215 
   238     @property
   241     @property
   239     def label(self):
   242     def label(self):
   240         request = check_request()
   243         request = check_request()
   241         translate = request.localizer.translate
   244         translate = request.localizer.translate
   242         return II18n(self.context).query_attribute('title', request) or \
   245         return II18n(self.context).query_attribute('title', request) or \
   243             '({0})'.format(translate(self.context.icon_hint).lower())
   246                '({0})'.format(translate(self.context.icon_hint).lower())
   244 
   247 
   245     def inner_check(self, request):
   248     def inner_check(self, request):
   246         output = []
   249         output = []
   247         translate = request.localizer.translate
   250         translate = request.localizer.translate
   248         manager = get_parent(self.context, II18nManager)
   251         manager = get_parent(self.context, II18nManager)
   249         if manager is not None:
   252         if manager is not None:
   250             langs = manager.get_languages()
   253             langs = manager.get_languages()
   251         else:
   254         else:
   252             negotiator = get_utility(INegotiator)
   255             negotiator = get_utility(INegotiator)
   253             langs = (negotiator.server_language, )
   256             langs = (negotiator.server_language,)
   254         i18n = II18n(self.context)
   257         i18n = II18n(self.context)
   255         for lang in langs:
   258         for lang in langs:
   256             value = i18n.get_attribute('title', lang, request)
   259             value = i18n.get_attribute('title', lang, request)
   257             if not value:
   260             if not value:
   258                 field_title = translate(IMilestoneParagraph['title'].title)
   261                 field_title = translate(IMilestoneParagraph['title'].title)