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) |