diff --git a/browser/common.py b/browser/common.py index 9ac9bf4..6fd3e15 100644 --- a/browser/common.py +++ b/browser/common.py @@ -54,6 +54,7 @@ from zope.traversing.api import getName, getParent from cybertools.ajax.dojo import dojoMacroTemplate from cybertools.browser.view import GenericView from cybertools.meta.interfaces import IOptions +from cybertools.meta.element import Element from cybertools.relation.interfaces import IRelationRegistry from cybertools.stateful.interfaces import IStateful from cybertools.text import mimetypes @@ -132,7 +133,6 @@ class BaseView(GenericView, I18NView): actions = {} portlet_actions = [] parts = () - filter_input = () icon = None modeName = 'view' isToplevel = False @@ -186,6 +186,15 @@ class BaseView(GenericView, I18NView): return '%s/.%s-%s' % (baseUrl, targetId, normalizeForUrl(title)) return '%s/.%s' % (baseUrl, targetId) + def filterInput(self): + result = [] + for name in self.getOptions('filter_input'): + view = component.queryMultiAdapter( + (self.context, self.request), name='filter_input.' + name) + if view is not None: + result.append(view) + return result + @Lazy def principalId(self): principal = self.request.principal @@ -574,11 +583,18 @@ class BaseView(GenericView, I18NView): def globalOptions(self): return IOptions(self.loopsRoot) - def getOptions(self, key): + def getOptions(self, keys): for opt in (self.options, self.typeOptions, self.globalOptions): - value = opt[key] - if not isinstance(value, DummyOptions): - return value + if isinstance(opt, DummyOptions): + continue + #import pdb; pdb.set_trace() + v = opt + for key in keys.split('.'): + if isinstance(v, list): + break + v = getattr(v, key) + if not isinstance(v, DummyOptions): + return v def getPredicateOptions(self, relation): return IOptions(adapted(relation.predicate), None) or DummyOptions() diff --git a/browser/concept.py b/browser/concept.py index 45bfdc3..8ed97a7 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -361,7 +361,7 @@ class ConceptView(BaseView): options = IOptions(adapted(r.predicate), None) if options is not None and options('hide_children'): continue - filterOptions = self.getOptions('filter') + filterOptions = self.getOptions('filter.states') if not fv.check(r.context, filterOptions): continue yield r diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index e7cfad4..78ca2b3 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -10,7 +10,6 @@
- @@ -31,12 +30,14 @@ -
+
@@ -61,6 +62,7 @@ string:$resourceBase/cybertools.icons/table.png" /> +

diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index e863d65..17e5443 100644 Binary files a/locales/de/LC_MESSAGES/loops.mo and b/locales/de/LC_MESSAGES/loops.mo differ diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 6eec2d7..9fd4fb7 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: $Id$\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n" -"PO-Revision-Date: 2012-11-22 12:00 CET\n" +"PO-Revision-Date: 2012-11-24 12:00 CET\n" "Last-Translator: Helmut Merz \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -882,6 +882,9 @@ msgstr "nach" # state definitions +msgid "Show all" +msgstr "Alle anzeigen" + msgid "Restrict to objects with certain states" msgstr "Auf Objekte mit bestimmtem Status beschränken" diff --git a/organize/personal/browser/filter.py b/organize/personal/browser/filter.py index 06c787b..cedf846 100644 --- a/organize/personal/browser/filter.py +++ b/organize/personal/browser/filter.py @@ -108,17 +108,30 @@ class FilterView(NodeView): result.setdefault(obj.getType(), set([])).add(obj) return result + def checkOptions(self, obj, options): + if isinstance(options, list): + return True + form = self.request.form + if form.get('filter.states') == 'all': + return True + filterStates = options + for std in filterStates.keys(): + formStates = form.get('filter.states.' + std) + if formStates == 'all': + continue + stf = component.getAdapter(obj, IStateful, name=std) + if formStates: + if stf.state not in formStates.split(','): + return False + else: + if stf.state not in getattr(filterStates, std): + return False + return True + 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 + if options is not None: + if not self.checkOptions(obj, options): + return False fs = self.filterStructure if not fs: return True diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index da9a340..7f24d2b 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -35,6 +35,8 @@ from loops.security.common import checkPermission from loops.util import _ +template = ViewPageTemplateFile('view_macros.pt') + statefulActions = ('classification_quality', 'simple_publishing', 'task_states',) @@ -78,7 +80,7 @@ for std in statefulActions: #class StateQuery(ConceptView): class StateQuery(BaseView): - template = ViewPageTemplateFile('view_macros.pt') + template = template form_action = 'execute_search_action' @@ -145,3 +147,15 @@ class StateQuery(BaseView): uids = q.apply() return self.viewIterator(getObjects(uids, self.loopsRoot)) return [] + + +class FilterAllStates(BaseView): + + @Lazy + def macros(self): + return template.macros + + @Lazy + def macro(self): + return self.macros['filter_allstates'] + diff --git a/organize/stateful/configure.zcml b/organize/stateful/configure.zcml index e5cd542..0514400 100644 --- a/organize/stateful/configure.zcml +++ b/organize/stateful/configure.zcml @@ -71,6 +71,12 @@ class="loops.organize.stateful.browser.StateQuery" permission="zope.View" /> + + diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index 913fd36..6dfad17 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -2,8 +2,12 @@ - + +