Skip to content

Commit

Permalink
Use z3c.form for portlet forms.
Browse files Browse the repository at this point in the history
  • Loading branch information
Bo Simonsen authored and davisagli committed Mar 9, 2014
1 parent e2fa11d commit fc15814
Show file tree
Hide file tree
Showing 21 changed files with 369 additions and 654 deletions.
10 changes: 7 additions & 3 deletions CHANGES.rst
@@ -1,10 +1,14 @@
Changelog
=========

2.5.1 (unreleased)
------------------
3.0 (unreleased)
----------------

- Nothing changed yet.
- Use z3c.form for portlet forms.
[bosim, davisagli]

- Store navigation portlet root setting as a UID rather than a path.
[davisagli]


2.5.0 (2014-03-02)
Expand Down
8 changes: 0 additions & 8 deletions plone/app/portlets/browser/configure.zcml
Expand Up @@ -213,14 +213,6 @@

</configure>

<!-- Default page layout for portlet add/edit forms -->
<adapter
for=".interfaces.IPortletForm"
factory=".formhelper.portlets_named_template_adapter"
name="default"
provides="zope.formlib.namedtemplate.INamedTemplate"
/>

<!-- Resources -->
<browser:resource
name="manage-portlets.js"
Expand Down
154 changes: 96 additions & 58 deletions plone/app/portlets/browser/formhelper.py
@@ -1,31 +1,26 @@
from five.formlib import formbase
from zope.interface import implements
from z3c.form import button
from z3c.form import form
from zope.component import getMultiAdapter
from zope.formlib import form

from zope.interface import implements
import zope.event
import zope.lifecycleevent

from Acquisition import aq_parent, aq_inner
from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile

from plone.app.form import named_template_adapter
from plone.app.form.interfaces import IPlonePageForm
from plone.app.form.validators import null_validator
from Acquisition import aq_parent, aq_inner, aq_base
from Acquisition.interfaces import IAcquirer

from plone.app.portlets import PloneMessageFactory as _
from plone.app.portlets.interfaces import IPortletPermissionChecker
from plone.app.portlets.browser.interfaces import IPortletAddForm
from plone.app.portlets.browser.interfaces import IPortletEditForm
from plone.app.portlets.interfaces import IPortletPermissionChecker
from plone.autoform.form import AutoExtensibleForm

# Add a named template form, which allows us to carry some extra information
# about the referer
_template = ViewPageTemplateFile('templates/portlets-pageform.pt')
portlets_named_template_adapter = named_template_adapter(_template)
from Products.statusmessages.interfaces import IStatusMessage


class AddForm(formbase.AddFormBase):
class AddForm(AutoExtensibleForm, form.AddForm):
"""A base add form for portlets.
Use this for portlet assignments that require configuration before being
Expand All @@ -45,38 +40,70 @@ def create(self):
return MyAssignment()
"""

implements(IPortletAddForm, IPlonePageForm)
implements(IPortletAddForm)

template = ViewPageTemplateFile('templates/z3cform-portlets-pageform.pt')

label = _(u"Configure portlet")

form_name = _(u"Configure portlet")
def add(self, object):
ob = self.context.add(object)
self._finishedAdd = True
return ob

def __call__(self):
self.request.set('disable_border', 1)
self.request.set('disable_plone.leftcolumn', 1)
self.request.set('disable_plone.rightcolumn', 1)
IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
return super(AddForm, self).__call__()

def createAndAdd(self, data):
obj = self.create(data)

# Acquisition wrap temporarily to satisfy things like vocabularies
# depending on tools
container = aq_inner(self.context)

if IAcquirer.providedBy(obj):
obj = obj.__of__(container)
form.applyChanges(self, obj, data)
obj = aq_base(obj)

zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(obj))
self.add(obj)
return obj

@property
def referer(self):
return self.request.get('referer', '')

def nextURL(self):
referer = self.request.form.get('referer')
if referer:
return referer
else:
addview = aq_parent(aq_inner(self.context))
context = aq_parent(aq_inner(addview))
url = str(getMultiAdapter((context, self.request), name=u"absolute_url"))
return url + '/@@manage-portlets'

@form.action(_(u"label_save", default=u"Save"), name=u'save')
def handle_save_action(self, action, data):
self.createAndAdd(data)

@form.action(_(u"label_cancel", default=u"Cancel"),
validator=null_validator,
name=u'cancel')
def handle_cancel_action(self, action, data):
if self.referer:
return self.referer
addview = aq_parent(aq_inner(self.context))
context = aq_parent(aq_inner(addview))
url = str(getMultiAdapter((context, self.request),
name=u"absolute_url"))
return url + '/@@manage-portlets'

@button.buttonAndHandler(_(u"label_save", default=u"Save"), name='add')
def handleAdd(self, action):
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
obj = self.createAndAdd(data)
if obj is not None:
# mark only as finished if we get the new object
self._finishedAdd = True

@button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
name='cancel_add')
def handleCancel(self, action):
nextURL = self.nextURL()
if nextURL:
self.request.response.redirect(self.nextURL())
self.request.response.redirect(nextURL)
return ''


Expand Down Expand Up @@ -106,58 +133,69 @@ def nextURL(self):
else:
addview = aq_parent(aq_inner(self.context))
context = aq_parent(aq_inner(addview))
url = str(getMultiAdapter((context, self.request), name=u"absolute_url"))
url = str(getMultiAdapter((context, self.request),
name=u"absolute_url"))
return url + '/@@manage-portlets'

def create(self):
raise NotImplementedError("concrete classes must implement create()")


class EditForm(formbase.EditFormBase):
class EditForm(AutoExtensibleForm, form.EditForm):
"""An edit form for portlets.
"""

implements(IPortletEditForm, IPlonePageForm)
implements(IPortletEditForm)

template = ViewPageTemplateFile('templates/z3cform-portlets-pageform.pt')

form_name = _(u"Modify portlet")
label = _(u"Modify portlet")

def __call__(self):
self.request.set('disable_border', 1)
self.request.set('disable_plone.leftcolumn', 1)
self.request.set('disable_plone.rightcolumn', 1)
IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
return super(EditForm, self).__call__()

@property
def referer(self):
return self.request.get('referer', '')

def nextURL(self):
referer = self.request.form.get('referer')
if referer:
return referer
else:
portlet = aq_inner(self.context)
context = aq_parent(portlet)
url = str(getMultiAdapter((context, self.request), name=u"absolute_url"))
return url + '/@@manage-portlets'

@form.action(_(u"label_save", default=u"Save"),
condition=form.haveInputWidgets,
name=u'save')
def handle_save_action(self, action, data):
if form.applyChanges(self.context, self.form_fields, data, self.adapters):
zope.event.notify(zope.lifecycleevent.ObjectModifiedEvent(self.context))
if self.referer:
return self.referer
editview = aq_parent(aq_inner(self.context))
context = aq_parent(aq_inner(editview))
url = str(getMultiAdapter((context, self.request),
name=u"absolute_url"))
return url + '/@@manage-portlets'

@button.buttonAndHandler(_(u"label_save", default=u"Save"), name='apply')
def handleSave(self, action):
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
changes = self.applyChanges(data)
if changes:
self.status = "Changes saved"
IStatusMessage(self.request).addStatusMessage(_(u"Changes saved"),
"info")
else:
self.status = "No changes"
IStatusMessage(self.request).addStatusMessage(_(u"No changes"),
"info")

nextURL = self.nextURL()
if nextURL:
self.request.response.redirect(self.nextURL())
return ''

@form.action(_(u"label_cancel", default=u"Cancel"),
validator=null_validator,
name=u'cancel')
def handle_cancel_action(self, action, data):
@button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
name='cancel_add')
def handleCancel(self, action):
nextURL = self.nextURL()
if nextURL:
self.request.response.redirect(self.nextURL())
self.request.response.redirect(nextURL)
return ''

0 comments on commit fc15814

Please sign in to comment.