diff --git a/browser/common.py b/browser/common.py index 078e471..9ac9bf4 100644 --- a/browser/common.py +++ b/browser/common.py @@ -132,6 +132,7 @@ class BaseView(GenericView, I18NView): actions = {} portlet_actions = [] parts = () + filter_input = () icon = None modeName = 'view' isToplevel = False @@ -563,16 +564,22 @@ class BaseView(GenericView, I18NView): return DummyOptions() return component.queryAdapter(self.adapted, IOptions) or DummyOptions() - @Lazy - def globalOptions(self): - return IOptions(self.loopsRoot) - @Lazy def typeOptions(self): if self.typeProvider is None: return DummyOptions() return IOptions(adapted(self.typeProvider)) + @Lazy + def globalOptions(self): + return IOptions(self.loopsRoot) + + def getOptions(self, key): + for opt in (self.options, self.typeOptions, self.globalOptions): + value = opt[key] + if not isinstance(value, DummyOptions): + return value + def getPredicateOptions(self, relation): return IOptions(adapted(relation.predicate), None) or DummyOptions() diff --git a/browser/concept.py b/browser/concept.py index 10ea867..45bfdc3 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -361,7 +361,8 @@ class ConceptView(BaseView): options = IOptions(adapted(r.predicate), None) if options is not None and options('hide_children'): continue - if not fv.check(r.context): + filterOptions = self.getOptions('filter') + if not fv.check(r.context, filterOptions): continue yield r diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index e3c11e0..e7cfad4 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -1,15 +1,16 @@ - - - + + +
+ @@ -29,6 +30,18 @@ + +
+
+ + + +
+
+
+ + diff --git a/organize/personal/browser/filter.py b/organize/personal/browser/filter.py index 38d21d9..06c787b 100644 --- a/organize/personal/browser/filter.py +++ b/organize/personal/browser/filter.py @@ -27,6 +27,7 @@ from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy from cybertools.browser.configurator import ViewConfigurator, MacroViewProperty +from cybertools.stateful.interfaces import IStateful from loops.browser.node import NodeView from loops.concept import Concept from loops.organize.party import getPersonForUser @@ -107,7 +108,17 @@ class FilterView(NodeView): result.setdefault(obj.getType(), set([])).add(obj) return result - def check(self, obj): + def check(self, obj, options=None): + if options: + for std in options.states.keys(): + stf = component.getAdapter(obj, IStateful, name=std) + formStates = self.request.form.get('states.' + std) + if formStates: + if stf.state not in formStates.split(','): + return False + else: + if stf.state not in getattr(options.states, std): + return False fs = self.filterStructure if not fs: return True diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index 0d7c742..913fd36 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -1,3 +1,10 @@ + + + + + + @@ -55,3 +62,6 @@
+ + +