diff --git a/browser/concept.py b/browser/concept.py index d47b143..0a74c3e 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -101,8 +101,8 @@ class ConceptEditForm(EditForm, I18NView): desc.height = 2 -class ConceptRelationView(BaseView): - """ For displaying children and resources lists, used by ConceptView. +class BaseRelationView(BaseView): + """ For displaying children and resources lists. """ def __init__(self, relation, request, contextIsSecond=False): @@ -123,6 +123,9 @@ class ConceptRelationView(BaseView): @Lazy def data(self): + return self.getData() + + def getData(self): return self.instance.applyTemplate() @Lazy @@ -176,19 +179,13 @@ class ConceptRelationView(BaseView): def order(self): return self.relation.order - def getActions(self, category='object', page=None, target=None): - t = IType(self.context) - actInfo = t.optionsDict.get('action.' + category, '') - actNames = [n.strip() for n in actInfo.split(',')] - if actNames: - return actions.get(category, actNames, view=self, page=page, target=target) - return [] - class ConceptView(BaseView): template = concept_macros - childViewFactory = ConceptRelationView + + def childViewFactory(self, *args, **kw): + return ConceptRelationView(*args, **kw) @Lazy def macro(self): @@ -354,12 +351,32 @@ class ConceptView(BaseView): yield NodeView(node, self.request) def getActions(self, category='object', page=None, target=None): + acts = [] t = IType(self.context) actInfo = t.optionsDict.get('action.' + category, '') actNames = [n.strip() for n in actInfo.split(',')] if actNames: - return actions.get(category, actNames, view=self, page=page, target=target) - return [] + acts = list(actions.get(category, actNames, + view=self, page=page, target=target)) + if category in self.actions: + acts.extend(self.actions[category](self, page, target)) + return acts + + def getObjectActions(self, page=None, target=None): + acts = ['info'] + acts.extend('state.' + st.statesDefinition for st in self.states) + if self.globalOptions('organize.allowSendEmail'): + acts.append('send_email') + return actions.get('object', acts, view=self, page=page, target=target) + + actions = dict(object=getObjectActions) + + +class ConceptRelationView(ConceptView, BaseRelationView): + + __init__ = BaseRelationView.__init__ + + getData = BaseRelationView.getData class ConceptConfigureView(ConceptView): diff --git a/browser/info.pt b/browser/info.pt index 3f473ce..3a9e85e 100644 --- a/browser/info.pt +++ b/browser/info.pt @@ -3,7 +3,7 @@ - +
@@ -23,9 +23,10 @@ - + - + diff --git a/browser/node.py b/browser/node.py index 794f646..aa8a19e 100644 --- a/browser/node.py +++ b/browser/node.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2009 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -38,7 +38,6 @@ from zope.event import notify from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent 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, checkPermission from zope.security.proxy import removeSecurityProxy @@ -50,7 +49,7 @@ 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 +from loops.browser.action import actions, DialogAction from loops.common import adapted, AdapterBase from loops.i18n.browser import i18n_macros from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode @@ -438,6 +437,12 @@ class NodeView(BaseView): page=self, target=target)) return actions + def xx_getObjectActions(self, target=None): + acts = [] + if self.globalOptions('organize.allowSendEmail'): + acts.append('send_email') + return actions.get('object', acts, view=self, page=self, target=target) + actions = dict(portlet=getPortletActions) @Lazy @@ -704,7 +709,9 @@ class ConfigureView(NodeView): class NodeAdding(Adding): - def addingInfo(self): + pass + + def xx_addingInfo(self): info = super(NodeAdding, self).addingInfo() #info.append({'title': 'Document', # 'action': 'AddLoopsNodeDocument.html', diff --git a/browser/resource.py b/browser/resource.py index 8ed2ff8..aec6830 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -44,7 +44,8 @@ from cybertools.typology.interfaces import IType from cybertools.xedit.browser import ExternalEditorView, fromUnicode from loops.browser.action import DialogAction, TargetAction from loops.browser.common import EditForm, BaseView -from loops.browser.concept import ConceptRelationView, ConceptConfigureView +from loops.browser.concept import BaseRelationView, ConceptRelationView +from loops.browser.concept import ConceptConfigureView from loops.browser.node import NodeView, node_macros from loops.common import adapted, NameChooser from loops.interfaces import IBaseResource, IDocument, IMediaAsset, ITextDocument @@ -190,8 +191,9 @@ class ResourceView(BaseView): def getObjectActions(self, page=None, target=None): acts = ['info'] - #acts.extend('state.' + st for st in statefulActions) acts.extend('state.' + st.statesDefinition for st in self.states) + if self.globalOptions('organize.allowSendEmail'): + acts.append('send_email') if self.xeditable: acts.append('external_edit') return actions.get('object', acts, view=self, page=page, target=target) @@ -214,10 +216,9 @@ class ResourceView(BaseView): yield NodeView(node, self.request) -class ResourceRelationView(ResourceView, ConceptRelationView): +class ResourceRelationView(ResourceView, BaseRelationView): - def __init__(self, relation, request, contextIsSecond=False): - ConceptRelationView.__init__(self, relation, request, contextIsSecond) + __init__ = BaseRelationView.__init__ getActions = ResourceView.getActions diff --git a/organize/README.txt b/organize/README.txt index 31b3955..a92e36a 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -132,6 +132,7 @@ concept assigned we should get an error: >>> johnC.conceptType = person >>> john = IPerson(johnC) >>> john.userId = 'users.john' + >>> john.email = 'john@loopz.org' >>> marthaC = concepts['martha'] = Concept(u'Martha') >>> marthaC.conceptType = person @@ -377,6 +378,20 @@ Allocation of persons to tasks ... conceptType=predicate, predicateInterface=IAllocated) +Send Email to Members +===================== + + >>> menu.target = event01 + + >>> from loops.organize.browser.party import SendEmailForm + >>> form = SendEmailForm(menu, TestRequest()) + >>> form.members + [{'email': 'john@loopz.org', 'title': u'John'}] + >>> form.subject + u"loops Notification from '$site'" + >>> form.mailBody + u'\n\nEvent #1\nhttp://127.0.0.1/loops/views/menu/.target95\n\n' + Fin de partie ============= diff --git a/organize/browser/configure.zcml b/organize/browser/configure.zcml index 90ad3c2..c602c89 100644 --- a/organize/browser/configure.zcml +++ b/organize/browser/configure.zcml @@ -11,8 +11,7 @@ zope.publisher.interfaces.browser.IBrowserRequest" provides="zope.interface.Interface" factory="loops.organize.browser.member.PersonalInfo" - permission="zope.View" - /> + permission="zope.View" /> + permission="zope.Public" /> + permission="zope.Public" /> + permission="zope.Public" /> + permission="zope.View" /> + permission="zope.View" /> + permission="zope.View" /> + + diff --git a/organize/browser/party.py b/organize/browser/party.py index 6de3662..b16886d 100644 --- a/organize/browser/party.py +++ b/organize/browser/party.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2009 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -24,12 +24,19 @@ $Id$ """ from zope import interface, component +from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy +from zope.dublincore.interfaces import IZopeDublinCore +from cybertools.ajax import innerHtml from cybertools.browser.action import actions from loops.browser.action import DialogAction +from loops.browser.node import NodeView +from loops.common import adapted from loops.util import _ +organize_macros = ViewPageTemplateFile('view_macros.pt') + actions.register('createPerson', 'portlet', DialogAction, title=_(u'Create Person...'), @@ -66,3 +73,53 @@ actions.register('editAddress', 'portlet', DialogAction, viewName='edit_concept.html', dialogName='editAddress', ) + +actions.register('send_email', 'object', DialogAction, + description=_(u'Send a link to this object by email.'), + viewName='object_send_email.html', + dialogName='', + icon='cybertools.icons/email.png', + cssClass='icon-action', + prerequisites=['registerDojoTextWidget', 'registerDojoTextarea'], + addParams=dict(version='this'), +) + + +class SendEmailForm(NodeView): + + __call__ = innerHtml + + @property + def macro(self): + return organize_macros.macros['send_email'] + + @Lazy + def dialog_name(self): + return self.request.get('dialog', 'object_send_email') + + @Lazy + def title(self): + return self.target.title + + @Lazy + def targetUrl(self): + return self.getUrlForTarget(self.virtualTargetObject) + + @Lazy + def members(self): + persons = self.conceptManager['person'].getChildren([self.typePredicate]) + persons = [adapted(p) for p in persons] + return [dict(title=p.title, email=p.email) for p in persons if p.email] + + @Lazy + def mailBody(self): + return '\n\n%s\n%s\n\n' % (self.title, self.targetUrl) + + @Lazy + def subject(self): + menu = self.context.getMenu() + zdc = IZopeDublinCore(menu) + zdc.languageInfo = self.languageInfo + site = zdc.title or menu.title + return _(u"loops Notification from '$site'", + mapping=dict(site=site)) diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt index b4d6382..86470c6 100644 --- a/organize/browser/view_macros.pt +++ b/organize/browser/view_macros.pt @@ -43,3 +43,50 @@ + + + +
+ +
+ Send Link by Email - +
+
+ +
+
+
+
+ +
+
+
+
+ +
+ + Johnny + (Johnny) +
+
+ +
+
+
+
+ +
+ +

Object Information


Type:
Size:
modified: