45 |
45 |
46 def get_references(self, context): |
46 def get_references(self, context): |
47 refs = [] |
47 refs = [] |
48 if self.select_context_references: |
48 if self.select_context_references: |
49 references = IInternalReferencesList(context, None) |
49 references = IInternalReferencesList(context, None) |
50 if references is not None: |
50 if (references is not None) and references.references: |
51 refs.extend(references.references) |
51 refs.extend(references.references) |
52 if self.references: |
52 if self.references: |
53 refs.extend(self.references) |
53 refs.extend(self.references) |
54 return refs |
54 return refs |
55 |
55 |
68 |
68 |
69 weight = 10 |
69 weight = 10 |
70 |
70 |
71 def get_params(self, context, request=None): |
71 def get_params(self, context, request=None): |
72 settings = IViewInternalReferencesSettings(self.context) |
72 settings = IViewInternalReferencesSettings(self.context) |
73 catalog = get_utility(ICatalog) |
|
74 # check view settings |
|
75 if settings.exclude_context: |
|
76 sequence = ISequentialIdInfo(context, None) |
|
77 if sequence is not None: |
|
78 oid = sequence.hex_oid |
|
79 yield NotEq(catalog['oid'], oid) |
|
80 # check view references mode |
73 # check view references mode |
81 if settings.references_mode == ONLY_REFERENCE_MODE: |
74 if settings.references_mode == ONLY_REFERENCE_MODE: |
82 yield Any(catalog['oid'], settings.references), False |
75 # references are retrieved by query filter extension, so no params are required! |
|
76 yield None |
|
77 else: |
|
78 # check view settings |
|
79 if settings.exclude_context: |
|
80 sequence = ISequentialIdInfo(context, None) |
|
81 if sequence is not None: |
|
82 oid = sequence.hex_oid |
|
83 catalog = get_utility(ICatalog) |
|
84 yield NotEq(catalog['oid'], oid) |
83 |
85 |
84 |
86 |
85 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension) |
87 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension) |
86 class ViewInternalReferencesQueryFilterExtension(ContextAdapter): |
88 class ViewInternalReferencesQueryFilterExtension(ContextAdapter): |
87 """View internal references filter extension""" |
89 """View internal references filter extension |
|
90 |
|
91 If internal references are selected, these references are forced. |
|
92 """ |
88 |
93 |
89 weight = 999 |
94 weight = 999 |
90 |
95 |
91 def filter(self, context, items, request=None): |
96 def filter(self, context, items, request=None): |
92 settings = IViewInternalReferencesSettings(self.context) |
97 settings = IViewInternalReferencesSettings(self.context) |
93 if not settings.references: |
98 references = settings.get_references(context) |
|
99 if not references: |
94 return items |
100 return items |
95 if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE): |
101 excluded_oid = None |
|
102 if settings.exclude_context: |
|
103 sequence = ISequentialIdInfo(context, None) |
|
104 if sequence is not None: |
|
105 excluded_oid = sequence.hex_oid |
|
106 if (not items) or (settings.references_mode in (ALWAYS_REFERENCE_MODE, ONLY_REFERENCE_MODE)): |
96 catalog = get_utility(ICatalog) |
107 catalog = get_utility(ICatalog) |
97 for reference in settings.references: |
108 for reference in reversed(references): |
|
109 if reference == excluded_oid: |
|
110 continue |
98 params = Eq(catalog['oid'], reference) & \ |
111 params = Eq(catalog['oid'], reference) & \ |
99 Any(catalog['workflow_state'], VISIBLE_STATES) |
112 Any(catalog['workflow_state'], VISIBLE_STATES) |
100 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params))) |
113 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params))) |
101 return items |
114 return items |