7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
|
12 from pyams_sequence.interfaces import ISequentialIdInfo |
12 |
13 |
13 __docformat__ = 'restructuredtext' |
14 __docformat__ = 'restructuredtext' |
14 |
15 |
15 |
16 |
16 # import standard library |
17 # import standard library |
17 from persistent import Persistent |
18 from persistent import Persistent |
18 |
19 |
19 # import interfaces |
20 # import interfaces |
20 from hypatia.interfaces import ICatalog |
21 from hypatia.interfaces import ICatalog |
21 from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewInternalReferencesSettings, \ |
22 from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewInternalReferencesSettings, \ |
22 IViewQueryFilterExtension, VIEW_REFERENCES_SETTINGS_KEY, ALWAYS_REFERENCE_MODE |
23 IViewQueryParamsExtension, IViewQueryFilterExtension, VIEW_REFERENCES_SETTINGS_KEY, ALWAYS_REFERENCE_MODE |
23 |
24 |
24 # import packages |
25 # import packages |
25 from hypatia.catalog import CatalogQuery |
26 from hypatia.catalog import CatalogQuery |
26 from hypatia.query import Any |
27 from hypatia.query import Any, Not, NotEq |
27 from pyams_catalog.query import CatalogResultSet |
28 from pyams_catalog.query import CatalogResultSet, and_ |
28 from pyams_content.workflow import VISIBLE_STATES |
29 from pyams_content.workflow import VISIBLE_STATES |
29 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter |
30 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter |
30 from pyams_utils.registry import get_utility |
31 from pyams_utils.registry import get_utility |
31 from zope.container.contained import Contained |
32 from zope.container.contained import Contained |
32 from zope.interface import implementer |
33 from zope.interface import implementer |
37 class ViewInternalReferencesSettings(Persistent, Contained): |
38 class ViewInternalReferencesSettings(Persistent, Contained): |
38 """View internal references settings""" |
39 """View internal references settings""" |
39 |
40 |
40 references = FieldProperty(IViewInternalReferencesSettings['references']) |
41 references = FieldProperty(IViewInternalReferencesSettings['references']) |
41 references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode']) |
42 references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode']) |
|
43 exclude_context = FieldProperty(IViewInternalReferencesSettings['exclude_context']) |
42 |
44 |
43 @property |
45 @property |
44 def is_using_context(self): |
46 def is_using_context(self): |
45 return False |
47 return False |
46 |
48 |
51 """View internal references settings factory""" |
53 """View internal references settings factory""" |
52 return get_annotation_adapter(view, VIEW_REFERENCES_SETTINGS_KEY, ViewInternalReferencesSettings, |
54 return get_annotation_adapter(view, VIEW_REFERENCES_SETTINGS_KEY, ViewInternalReferencesSettings, |
53 name='++view:references++') |
55 name='++view:references++') |
54 |
56 |
55 |
57 |
|
58 @adapter_config(name='references', context=IWfView, provides=IViewQueryParamsExtension) |
|
59 class ViewThemesQueryParamsExtension(ContextAdapter): |
|
60 """View internal references query params extension""" |
|
61 |
|
62 weight = 50 |
|
63 |
|
64 def get_params(self, context): |
|
65 catalog = get_utility(ICatalog) |
|
66 settings = IViewInternalReferencesSettings(self.context) |
|
67 params = None |
|
68 # check themes |
|
69 if settings.exclude_context: |
|
70 oid = ISequentialIdInfo(context).hex_oid |
|
71 params = and_(params, NotEq(catalog['oid'], oid)) |
|
72 return params |
|
73 |
|
74 |
56 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension) |
75 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension) |
57 class ViewInternalReferencesQueryFilterExtension(ContextAdapter): |
76 class ViewInternalReferencesQueryFilterExtension(ContextAdapter): |
58 """View internal references filter extension""" |
77 """View internal references filter extension""" |
59 |
78 |
60 weight = 999 |
79 weight = 999 |
63 settings = IViewInternalReferencesSettings(self.context) |
82 settings = IViewInternalReferencesSettings(self.context) |
64 if not settings.references: |
83 if not settings.references: |
65 return items |
84 return items |
66 if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE): |
85 if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE): |
67 catalog = get_utility(ICatalog) |
86 catalog = get_utility(ICatalog) |
68 params = Any(catalog['oid'], settings.references) & Any(catalog['workflow_state'], VISIBLE_STATES) |
87 params = Any(catalog['oid'], settings.references) & \ |
|
88 Any(catalog['workflow_state'], VISIBLE_STATES) |
69 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params))) |
89 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params))) |
70 return items |
90 return items |