Commit f4ecaa7d authored by 's avatar

- resynced Products.Five.browser.adding with zope.app.container.browser.adding

parent 9a74bdae
...@@ -8,6 +8,9 @@ Zope Changes ...@@ -8,6 +8,9 @@ Zope Changes
Bugs Fixed Bugs Fixed
- Products.Five: Resynced browser.adding with zope.app.container.
This fixes some minor bugs and removes deprecated code.
- Launchpad #173658: Removed dead code in OFS.Traversable's - Launchpad #173658: Removed dead code in OFS.Traversable's
'unrestrictedTraverse' (apparent NameError). 'unrestrictedTraverse' (apparent NameError).
......
...@@ -16,23 +16,29 @@ ...@@ -16,23 +16,29 @@
The Adding View is used to add new objects to a container. It is sort of a The Adding View is used to add new objects to a container. It is sort of a
factory screen. factory screen.
(original: zope.app.container.browser.adding)
$Id$ $Id$
""" """
__docformat__ = 'restructuredtext'
from warnings import warn __docformat__ = 'restructuredtext'
import zope.component from zope.component import getMultiAdapter
from zope.interface import implements from zope.component import getUtility
from zope.publisher.interfaces import IPublishTraverse from zope.component import queryMultiAdapter
from zope.component import queryUtility
from zope.component.interfaces import IFactory from zope.component.interfaces import IFactory
from zope.event import notify from zope.event import notify
from zope.exceptions import UserError from zope.interface import implements
from zope.publisher.interfaces import IPublishTraverse
from zope.traversing.browser.absoluteurl import absoluteURL
from zope.exceptions.interfaces import UserError
from zope.lifecycleevent import ObjectCreatedEvent from zope.lifecycleevent import ObjectCreatedEvent
from zope.app.container.constraints import checkFactory, checkObject
from zope.app.container.i18n import ZopeMessageFactory as _
from zope.app.container.interfaces import IAdding, INameChooser from zope.app.container.interfaces import IAdding, INameChooser
from zope.app.container.interfaces import IContainerNamesContainer from zope.app.container.interfaces import IContainerNamesContainer
from zope.app.container.constraints import checkFactory, checkObject
from zope.app.publisher.browser.menu import getMenu from zope.app.publisher.browser.menu import getMenu
from Acquisition import Implicit from Acquisition import Implicit
...@@ -40,10 +46,10 @@ from zExceptions import BadRequest ...@@ -40,10 +46,10 @@ from zExceptions import BadRequest
from OFS.SimpleItem import SimpleItem from OFS.SimpleItem import SimpleItem
from Products.Five import BrowserView from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
class BasicAdding(Implicit, BrowserView): class Adding(Implicit, BrowserView):
implements(IAdding, IPublishTraverse) implements(IAdding, IPublishTraverse)
def add(self, content): def add(self, content):
...@@ -57,7 +63,7 @@ class BasicAdding(Implicit, BrowserView): ...@@ -57,7 +63,7 @@ class BasicAdding(Implicit, BrowserView):
checkObject(container, name, content) checkObject(container, name, content)
if IContainerNamesContainer.providedBy(container): if IContainerNamesContainer.providedBy(container):
# The container picks it's own names. # The container picks its own names.
# We need to ask it to pick one. # We need to ask it to pick one.
name = chooser.chooseName(self.contentName or '', content) name = chooser.chooseName(self.contentName or '', content)
else: else:
...@@ -72,7 +78,7 @@ class BasicAdding(Implicit, BrowserView): ...@@ -72,7 +78,7 @@ class BasicAdding(Implicit, BrowserView):
# Invoke the name chooser even when we have a # Invoke the name chooser even when we have a
# name. It'll do useful things with it like converting # name. It'll do useful things with it like converting
# the incoming unicode to an ASCII string. # the incoming unicode to an ASCII string.
name = chooser.chooseName(name, container) name = chooser.chooseName(name, content)
content.id = name content.id = name
container._setObject(name, content) container._setObject(name, content)
...@@ -86,85 +92,73 @@ class BasicAdding(Implicit, BrowserView): ...@@ -86,85 +92,73 @@ class BasicAdding(Implicit, BrowserView):
# XXX this is definitely not right for all or even most uses # XXX this is definitely not right for all or even most uses
# of Five, but can be overridden by an AddView subclass, using # of Five, but can be overridden by an AddView subclass, using
# the class attribute of a zcml:addform directive # the class attribute of a zcml:addform directive
return str(zope.component.getMultiAdapter( return absoluteURL(self.context, self.request) + '/manage_main'
(self.context, self.request), name=u"absolute_url")) + '/manage_main'
# set in BrowserView.__init__ # set in BrowserView.__init__
request = None request = None
context = None context = None
def renderAddButton(self):
warn("The renderAddButton method is deprecated, use nameAllowed",
DeprecationWarning, 2)
def publishTraverse(self, request, name): def publishTraverse(self, request, name):
"""See zope.app.container.interfaces.IAdding""" """See zope.publisher.interfaces.IPublishTraverse"""
if '=' in name: if '=' in name:
view_name, content_name = name.split("=", 1) view_name, content_name = name.split("=", 1)
self.contentName = content_name self.contentName = content_name
if view_name.startswith('@@'): if view_name.startswith('@@'):
view_name = view_name[2:] view_name = view_name[2:]
return zope.component.getMultiAdapter((self, request), name=view_name) return getMultiAdapter((self, request), name=view_name)
if name.startswith('@@'): if name.startswith('@@'):
view_name = name[2:] view_name = name[2:]
else: else:
view_name = name view_name = name
view = zope.component.queryMultiAdapter((self, request), name=view_name) view = queryMultiAdapter((self, request), name=view_name)
if view is not None: if view is not None:
return view return view
factory = zope.component.queryUtility(IFactory, name) factory = queryUtility(IFactory, name)
if factory is None: if factory is None:
return super(BasicAdding, self).publishTraverse(request, name) return super(Adding, self).publishTraverse(request, name)
return factory return factory
def action(self, type_name='', id=''): def action(self, type_name='', id=''):
if not type_name: if not type_name:
raise UserError("You must select the type of object to add.") raise UserError(_(u"You must select the type of object to add."))
if type_name.startswith('@@'): if type_name.startswith('@@'):
type_name = type_name[2:] type_name = type_name[2:]
if '/' in type_name: if '/' in type_name:
view_name = type_name.split('/', 1)[0] view_name = type_name.split('/', 1)[0]
else: else:
view_name = type_name view_name = type_name
if (zope.component.queryMultiAdapter((self, self.request), name=view_name) if queryMultiAdapter((self, self.request),
is not None): name=view_name) is not None:
url = "%s/%s=%s" % ( url = "%s/%s=%s" % (
zope.component.getMultiAdapter((self, self.request), name=u"absolute_url"), absoluteURL(self, self.request), type_name, id)
type_name, id)
self.request.response.redirect(url) self.request.response.redirect(url)
return return
if not self.contentName: if not self.contentName:
self.contentName = id self.contentName = id
factory = zope.component.getUtility(IFactory, type_name) factory = getUtility(IFactory, type_name)
content = factory() content = factory()
notify(ObjectCreatedEvent(content)) notify(ObjectCreatedEvent(content))
self.add(content) self.add(content)
self.request.response.redirect(self.nextURL()) self.request.response.redirect(self.nextURL())
def namesAccepted(self):
return not IContainerNamesContainer.providedBy(self.context)
def nameAllowed(self): def nameAllowed(self):
"""Return whether names can be input by the user.""" """Return whether names can be input by the user."""
return not IContainerNamesContainer.providedBy(self.context) return not IContainerNamesContainer.providedBy(self.context)
class Adding(BasicAdding):
menu_id = None menu_id = None
index = ZopeTwoPageTemplateFile("adding.pt") index = ViewPageTemplateFile("adding.pt")
def addingInfo(self): def addingInfo(self):
"""Return menu data. """Return menu data.
...@@ -181,7 +175,7 @@ class Adding(BasicAdding): ...@@ -181,7 +175,7 @@ class Adding(BasicAdding):
if extra: if extra:
factory = extra.get('factory') factory = extra.get('factory')
if factory: if factory:
factory = zope.component.getUtility(IFactory, factory) factory = getUtility(IFactory, factory)
if not checkFactory(container, None, factory): if not checkFactory(container, None, factory):
continue continue
elif item['extra']['factory'] != item['action']: elif item['extra']['factory'] != item['action']:
...@@ -203,10 +197,12 @@ class Adding(BasicAdding): ...@@ -203,10 +197,12 @@ class Adding(BasicAdding):
return True return True
return False return False
class ContentAdding(Adding, SimpleItem): class ContentAdding(Adding, SimpleItem):
menu_id = "add_content" menu_id = "add_content"
class ObjectManagerNameChooser: class ObjectManagerNameChooser:
"""A name chooser for a Zope object manager. """A name chooser for a Zope object manager.
""" """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment