diff --git a/browser/common.py b/browser/common.py index 7e9e2fb..5077232 100644 --- a/browser/common.py +++ b/browser/common.py @@ -49,13 +49,14 @@ 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.relation.interfaces import IRelationRegistry from cybertools.stateful.interfaces import IStateful from cybertools.text import mimetypes from cybertools.typology.interfaces import IType, ITypeManager from loops.common import adapted from loops.i18n.browser import I18NView -from loops.interfaces import IView, INode +from loops.interfaces import IResource, IView, INode from loops.resource import Resource from loops.security.common import canAccessObject, canListObject, canWriteObject from loops.type import ITypeConcept @@ -320,6 +321,16 @@ class BaseView(GenericView, I18NView): return util.KeywordVocabulary(general + self.listTypesForSearch(('resource',), ('system', 'hidden'),)) + # options/settings + + @Lazy + def options(self): + return IOptions(self.context) + + @Lazy + def globalOptions(self): + return IOptions(self.loopsRoot) + # versioning @Lazy @@ -379,10 +390,13 @@ class BaseView(GenericView, I18NView): if not checkPermission('loops.ManageSite', self.context): # TODO: replace by more sensible permission return result - target = self.virtualTargetObject - for std in ['loops.classification_quality', - 'loops.simple_publishing']: - stf = component.getAdapter(target, IStateful, name=std) + #statesDefs = ['loops.classification_quality', 'loops.simple_publishing'] + if IResource.providedBy(self.target): + statesDefs = self.globalOptions('organize.stateful.resource', ()) + else: + statesDefs = () + for std in statesDefs: + stf = component.getAdapter(self.target, IStateful, name=std) result.append(stf) return result diff --git a/browser/node.py b/browser/node.py index fc5cdb5..630cb52 100644 --- a/browser/node.py +++ b/browser/node.py @@ -40,13 +40,14 @@ from zope.lifecycleevent import Attributes from zope.formlib.form import Form, FormFields from zope.formlib.namedtemplate import NamedTemplate from zope.proxy import removeAllProxies -from zope.security import canAccess, canWrite +from zope.security import canAccess, canWrite, checkPermission from zope.security.proxy import removeSecurityProxy from cybertools.ajax import innerHtml from cybertools.browser import configurator from cybertools.browser.action import Action from cybertools.browser.view import GenericView +from cybertools.stateful.interfaces import IStateful from cybertools.typology.interfaces import IType, ITypeManager from cybertools.xedit.browser import ExternalEditorView from loops.browser.action import DialogAction @@ -296,6 +297,8 @@ class NodeView(BaseView): target = getVersion(target, self.request) return target + target = virtualTargetObject + @Lazy def targetUid(self): if self.virtualTargetObject: @@ -372,6 +375,25 @@ class NodeView(BaseView): if target is not None: return BaseView(target, self.request).url + # states information + + @Lazy + def xxx_states(self): + result = [] + if not checkPermission('loops.ManageSite', self.context): + # TODO: replace by more sensible permission + return result + target = self.virtualTargetObject + #statesDefs = ['loops.classification_quality', 'loops.simple_publishing'] + if IResource.providedBy(target): + statesDefs = self.globalOptions('organize.stateful.resource', ()) + else: + statesDefs = () + for std in statesDefs: + stf = component.getAdapter(target, IStateful, name=std) + result.append(stf) + return result + # target viewing and editing support def getUrlForTarget(self, target): diff --git a/browser/resource.py b/browser/resource.py index b2ed02a..075a069 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -185,7 +185,8 @@ class ResourceView(BaseView): def getObjectActions(self, page=None, target=None): acts = ['info'] - acts.extend('state.' + st for st in statefulActions) + #acts.extend('state.' + st for st in statefulActions) + acts.extend('state.' + st.statesDefinition for st in self.states) if self.xeditable: acts.append('external_edit') return actions.get('object', acts, view=self, page=page, target=target) diff --git a/organize/stateful/README.txt b/organize/stateful/README.txt index b75a879..2af7cd3 100644 --- a/organize/stateful/README.txt +++ b/organize/stateful/README.txt @@ -137,6 +137,9 @@ We first need a node that provides us access to the resource as its target The form view gives us access to the states of the object. + >>> loopsRoot.options = ['organize.stateful.resource:' + ... 'loops.classification_quality,loops.simple_publishing'] + >>> form = EditObjectForm(node, TestRequest()) >>> for st in form.states: ... sto = st.getStateObject() diff --git a/organize/stateful/base.py b/organize/stateful/base.py index 9a8f77a..a81284c 100644 --- a/organize/stateful/base.py +++ b/organize/stateful/base.py @@ -41,9 +41,6 @@ class StatefulLoopsObject(Stateful, StatefulAdapter): adapts(ILoopsObject) - def getAvailableTransitionsForUser(self): - return self.getAvailableTransitions() - class SimplePublishable(StatefulLoopsObject): diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index a4b1093..8a9bcb9 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -30,7 +30,8 @@ from cybertools.stateful.interfaces import IStateful from loops.util import _ -statefulActions = ('loops.classification_quality',) +statefulActions = ('loops.classification_quality', + 'loops.simple_publishing',) class StateAction(Action): @@ -54,7 +55,8 @@ class StateAction(Action): @Lazy def icon(self): - return 'cybertools.icons/led%s.png' % self.stateObject.color + icon = self.stateObject.icon or 'led%s.png' % self.stateObject.color + return 'cybertools.icons/' + icon for std in statefulActions: