15 |
15 |
16 # import standard library |
16 # import standard library |
17 from persistent import Persistent |
17 from persistent import Persistent |
18 |
18 |
19 # import interfaces |
19 # import interfaces |
|
20 from hypatia.interfaces import ICatalog |
20 from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IWfView, VIEW_REFERENCES_SETTINGS_KEY, \ |
21 from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IWfView, VIEW_REFERENCES_SETTINGS_KEY, \ |
21 IViewExtension |
22 IViewQueryFilterExtension, ALWAYS_REFERENCE_MODE |
22 from zope.annotation.interfaces import IAnnotations |
23 from zope.annotation.interfaces import IAnnotations |
23 |
24 |
24 # import packages |
25 # import packages |
|
26 from hypatia.catalog import CatalogQuery |
|
27 from hypatia.query import Any |
|
28 from pyams_catalog.query import CatalogResultSet |
|
29 from pyams_content.workflow import VISIBLE_STATES |
25 from pyams_utils.adapter import adapter_config, ContextAdapter |
30 from pyams_utils.adapter import adapter_config, ContextAdapter |
|
31 from pyams_utils.registry import get_utility |
26 from pyramid.threadlocal import get_current_registry |
32 from pyramid.threadlocal import get_current_registry |
27 from zope.container.contained import Contained |
33 from zope.container.contained import Contained |
28 from zope.interface import implementer |
34 from zope.interface import implementer |
29 from zope.lifecycleevent import ObjectCreatedEvent |
35 from zope.lifecycleevent import ObjectCreatedEvent |
30 from zope.location import locate |
36 from zope.location import locate |
34 @implementer(IViewInternalReferencesSettings) |
40 @implementer(IViewInternalReferencesSettings) |
35 class ViewInternalReferencesSettings(Persistent, Contained): |
41 class ViewInternalReferencesSettings(Persistent, Contained): |
36 """View internal references settings""" |
42 """View internal references settings""" |
37 |
43 |
38 references = FieldProperty(IViewInternalReferencesSettings['references']) |
44 references = FieldProperty(IViewInternalReferencesSettings['references']) |
|
45 references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode']) |
39 |
46 |
40 |
47 |
41 @adapter_config(context=IWfView, provides=IViewInternalReferencesSettings) |
48 @adapter_config(context=IWfView, provides=IViewInternalReferencesSettings) |
42 def ViewInternalReferencesSettingsFactory(view): |
49 def ViewInternalReferencesSettingsFactory(view): |
43 """View internal references settings factory""" |
50 """View internal references settings factory""" |
48 get_current_registry().notify(ObjectCreatedEvent(settings)) |
55 get_current_registry().notify(ObjectCreatedEvent(settings)) |
49 locate(settings, view, '++view:references++') |
56 locate(settings, view, '++view:references++') |
50 return settings |
57 return settings |
51 |
58 |
52 |
59 |
53 @adapter_config(name='references', context=IWfView, provides=IViewExtension) |
60 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension) |
54 class ViewInternalReferencesExtension(ContextAdapter): |
61 class ViewInternalReferencesQueryFilterExtension(ContextAdapter): |
55 """View internal references extension""" |
62 """View internal references filter extension""" |
56 |
|
57 def get_param(self, context): |
|
58 pass |
|
59 |
63 |
60 weight = 999 |
64 weight = 999 |
61 |
65 |
62 def filter(self, context, items): |
66 def filter(self, context, items): |
|
67 settings = IViewInternalReferencesSettings(self.context) |
|
68 if not settings.references: |
|
69 return items |
|
70 if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE): |
|
71 catalog = get_utility(ICatalog) |
|
72 params = Any(catalog['oid'], settings.references) & Any(catalog['workflow_state'], VISIBLE_STATES) |
|
73 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params))) |
63 return items |
74 return items |