Re: GSoC 2014 Collective Ploneboard : Attachment issue
Asko Soukka <[email protected]>
| Newsgroups | gmane.comp.web.zope.plone.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I looked into Aman's issue and fell deep into Rabbit hole.
At first, the comment extender implies that attachments would be stored
as an annotation into Comment. I didn't check that it really happens,
but I'd expect FormExtender framework to do the right thing.
https://github.com/collective/collective.ploneboard/blob/master/src/collective/ploneboard/browser/commentextender.py#L30
The good:
- We don't need to fix Comment's object security to enable access to
attachment field.
The bad:
- Annotations are stored as a separate object, which might be overkill
for comments.
- The default @@download cannot look into annotations.
This needs a comment from Timo, but if you continue with annotations, I
think, the extender should be acquisition aware and define object
security. I got the test working (later) with the following extender:
from Acquisition import Implicit
from AccessControl import ClassSecurityInfo
from AccessControl.class_init import InitializeClass
from Products.CMFCore import permissions
class CommentExtenderFields(Implicit, Persistent):
interface.implements(ICommentExtenderFields)
adapts(Comment)
security = ClassSecurityInfo()
security.declareProtected(permissions.View, 'attachment')
attachment = u""
InitializeClass(CommentExtenderFields)
Usually you don't need to call InitializeClass explicitly, but I don't
remember the magic that triggers it, so for some reason, it had to be
called manually.
Then the test part.
Calling restrictedTraverse requires acquisition context (meaning that
the object is wrapped in a way it knows its parent in the database). I
don't know why, but IConversation-adapter does not return the
conversation with "acquisition wrapper", therefore it must be acuired
manually (or that should be fixed in plone.app.discussion):
from plone.app.discussion.interfaces import IConversation
conversation = IConversation(self.portal.board.topic.conv)
conversation = conversation.__of__(self.portal.board.topic.conv) # !
comment = createObject('plone.Comment')
comment.text = u'Text goes here'
Attachment should not be set directly into the object, must be set
through it's form extending interface. That's how it would be set using
the magic configured in commentextender:
from zope.interface import alsoProvides
from zope.annotation import IAttributeAnnotatable
from collective.ploneboard.browser import commentextender
alsoProvides(comment, IAttributeAnnotatable) # !
commentextender.ICommentExtenderFields(comment).attachment = \
NamedBlobImage('image.png') # !
Because plone.app.discussion does not configure annotations for
comments, if annotations are used, they should be enabled manually
either per comment with alsoProvides(comment, IAttributeAnnotatable) or
in zcml for all comments with, (<class
class="plone.app.discussion.comment.Comment"><implements
interface="zope.annotation.interfaces.IAttributeAnnotatable" /></class>).
Yet, in test, also comment must be acquired properly from its
conversation:
comment_id = conversation.addComment(comment)
comment = conversation[comment_id]
Now we would be ready to call restrictedTraverse for comment, but
there's one more trick: @@download is implemented in a way, which does
not seem to be fully supported by restrictedTraverse and I needed
several calls:
download_view = comment.restrictedTraverse('@@download')
download_view.publishTraverse(self.layer['request'], 'attachment')
download_view.publishTraverse(self.layer['request'], 'image.png')
And comes the problem I mentioned in the begininning. Because @@download
does not know to look into annotations, calling download_view() would
result NotFound. If I fix the context, however, the download view
finally returns, not the url, but the requested attachment:
download_view.context = commentextender.ICommentExtenderFields(comment)
download_view.context = download_view.context.__of__(comment)
download_view()
self.assertEqual(self.layer['request'].response.headers, {
'content-length': '9',
'content-type': 'application/octet-stream',
'content-disposition': 'attachment; filename="image.png"'
})
But to make this work outside tests would need a such custom
@@download-view (inheriting the original from plone.namedfile.browser)
for Comment-objects, which would know to look through
ICommentExtenderFields for attachments.
And if you and Time decide to got without annotations (by removing the
CommentExtenderFields-adapter and letting z3c.form to store attachments
directly as comment's attributes), you need to figure out a way to fix
Comment's object security to allow access to the attachment. Setting
__allow_access_to_unprotected_subobjects__ = True for Comment in
plone.app.discussion would work, but even better might be to look into
plone.dexterity and follow how it defines that attribute as a computed
value.
Best Regard
Asko
Asko Soukka wrote:
> Hi Aman and Timo,
>
> if this issue is still current, could it be possible that Aman is doing
> everything right, but there's something broken in
> ++conversation++-traverser, which prevents comment inheriting
> permissions from its context (which should be properly acquisition
> wrapped for permission checks to work)?
>
> It would help, if Aman could create a failing integration test case for
> this into either PloneBoard or p.a.discussion (probably p.a.discussion
> is the right place, but if PloneBoard is ok, if it's easier to do that
> there at first).
>
> Regards,
> Asko
>
>
> Aman Arora wrote:
>> Hello
>>
>> I'm Aman Arora and am working under GSoC 2014 on
>> Collective.Ploneboard with Timo Stollenwerk.
>> https://github.com/collective/collective.ploneboard/tree/gsoc2014
>> I'm stuck with an issue and need advice.
>>
>> We want to add attachment to our comments. For comments we are using
>> plone.app.discussion (default framework). Using comment extender we
>> added an attachment field using NamedBlobFile from
>> plone.namedfile.field. The view comes fine. It is able to open the
>> browsing window to attach file.
>>
>> Problem arises when the download link of the file is clicked.
>> <a tal:condition="reply/attachment|nothing"
>> tal:content="reply/attachment/filename"
>> tal:attributes="href
>> string:${reply/absolute_url}/@@download/attachment/${reply/attachment/filename}">Attachment</a>
>>
>> http://pastie.org/9223627
>> Unauthorized: The container has no security assertions. Access to 'attachment' of (plone.app.discussion.comment.Comment object at 0x7f23d8a9f668) denied.
>> Problem is probably NamedBlobFile expecting a container-like object
>> whereas comments are stored as annotations.
>>
>> With this mail I've forwarded the pdb trace.
>>
>> Thanks
>> Aman
>>
>>
>> ---------- Forwarded message ----------
>> From: *Aman Arora* <[email protected] <mailto:[email protected]>>
>> Date: Wed, Jun 11, 2014 at 12:43 PM
>> Subject: Attachment pdb trace
>> To: Timo Stollenwerk <tisto-z4DKO/[email protected] <mailto:tisto-z4DKO/[email protected]>>
>>
>>
>> Hi,
>>
>> Here is the trace I got using pdb. I'm new to it, so am not getting much.
>> I added the pdb.set_trace() in commentextender.py
>> http://pastie.org/9279268
>> This is basically the traceback I get when I click on the download link.
>>
>> (Pdb) 2014-06-11 12:27:30 ERROR Zope.SiteErrorLog
>> 1402469850.220.167440919453
>> http://localhost:8080/Plone/forumboard/topic1/conv1/++conversation++default/1402464054437830/@@download/attachment/garga.txt
>> Traceback (innermost last):
>> Module ZPublisher.Publish, line 138, in publish
>> Module ZPublisher.mapply, line 77, in mapply
>> Module ZPublisher.Publish, line 48, in call_object
>> Module plone.namedfile.browser, line 43, in __call__
>> Module plone.namedfile.browser, line 62, in _getFile
>> Module AccessControl.ImplPython, line 716, in guarded_getattr
>> Module AccessControl.ImplPython, line 658, in aq_validate
>> Module AccessControl.ImplPython, line 552, in validate
>> Module AccessControl.ImplPython, line 322, in validate
>> Module AccessControl.ImplPython, line 797, in raiseVerbose
>> Unauthorized: The container has no security assertions. Access to
>> 'attachment' of (plone.app.discussion.comment.Comment object at
>> 0x7a5e848) denied.
>>
>> ---------------------------------------------------------------------------------------------------------------------
>>
>>
>> aman@aman-E530 ~/gsoc/collective.ploneboard $ bin/instance fg
>> 2014-06-11 12:24:08 INFO ZServer HTTP server started at Wed Jun 11
>> 12:24:08 2014
>> Hostname: 0.0.0.0
>> Port: 8080
>> 2014-06-11 12:24:15 INFO Zope Ready to handle requests
>> /home/aman/gsoc/collective.ploneboard/eggs/Products.CMFCore-2.2.7-py2.7.egg/Products/CMFCore/DirectoryView.py:493:
>> UserWarning: DirectoryView simpleattachment refers to a non-existing
>> path 'Products.SimpleAttachment:skins/simpleattachment'
>> (self.id <http://self.id>, reg_key), UserWarning)
>> /home/aman/gsoc/collective.ploneboard/eggs/Products.CMFCore-2.2.7-py2.7.egg/Products/CMFCore/DirectoryView.py:493:
>> UserWarning: DirectoryView attachment_widgets refers to a non-existing
>> path 'Products.SimpleAttachment:skins/attachment_widgets'
>> (self.id <http://self.id>, reg_key), UserWarning)
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(45)__init__()
>> -> self.context = context
>> (Pdb) n
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(46)__init__()
>> -> self.request = request
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(47)__init__()
>> -> self.form = form
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(47)__init__()->None
>> -> self.form = form
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(251)getAdapters()
>> -> if adapter is not None:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(252)getAdapters()
>> -> yield name, adapter
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(252)getAdapters()->(u'',
>> <collect...8c945710>)
>> -> yield name, adapter
>> (Pdb)
>> --Call--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(252)getAdapters()->(u'',
>> <collect...8c945710>)
>> -> yield name, adapter
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(249)getAdapters()->(u'',
>> <collect...8c945710>)
>> -> provided):
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(249)getAdapters()->None
>> -> provided):
>> (Pdb)
>> --Call--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(13)order_key()
>> -> def order_key(adapter_tuple):
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(14)order_key()
>> -> return adapter_tuple[1].order
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(14)order_key()->0
>> -> return adapter_tuple[1].order
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(64)updateFields()
>> -> extender.update()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(63)updateFields()
>> -> for name, extender in sorted(extenders, key=order_key):
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(63)updateFields()->None
>> -> for name, extender in sorted(extenders, key=order_key):
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.app.discussion-2.2.12-py2.7.egg/plone/app/discussion/browser/comments.py(87)updateFields()
>> -> SingleCheckBoxFieldWidget
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.app.discussion-2.2.12-py2.7.egg/plone/app/discussion/browser/comments.py(87)updateFields()->None
>> -> SingleCheckBoxFieldWidget
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(59)update()
>> -> super(ExtensibleForm, self).update()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.z3cform-0.8.0-py2.7.egg/plone/z3cform/fieldsets/extensible.py(59)update()->None
>> -> super(ExtensibleForm, self).update()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.app.discussion-2.2.12-py2.7.egg/plone/app/discussion/browser/comments.py(282)update()->None
>> -> self.form.update()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.viewlet-3.7.2-py2.7.egg/zope/viewlet/manager.py(116)_updateViewlets()
>> -> for viewlet in self.viewlets:
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.viewlet-3.7.2-py2.7.egg/zope/viewlet/manager.py(116)_updateViewlets()->None
>> -> for viewlet in self.viewlets:
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.viewlet-3.7.2-py2.7.egg/zope/viewlet/manager.py(112)update()->None
>> -> self._updateViewlets()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.contentprovider-3.7.2-py2.7.egg/zope/contentprovider/tales.py(80)__call__()
>> -> return provider.render()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.contentprovider-3.7.2-py2.7.egg/zope/contentprovider/tales.py(80)__call__()->u'\n\n\n...v>\n\n\n'
>> -> return provider.render()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tales-3.5.3-py2.7.egg/zope/tales/tales.py(696)evaluate()->u'\n\n\n...v>\n\n\n'
>> -> return expression(self)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/PageTemplates/Expressions.py(219)evaluateStructure()
>> -> return self._handleText(text, expr)
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/PageTemplates/Expressions.py(219)evaluateStructure()->u'\n\n\n...v>\n\n\n'
>> -> return self._handleText(text, expr)
>> (Pdb)
>>
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(743)do_insertStructure_tal()
>> -> if structure is None:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(745)do_insertStructure_tal()
>> -> if structure is self.Default:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(748)do_insertStructure_tal()
>> -> if isinstance(structure, I18nMessageTypes):
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(751)do_insertStructure_tal()
>> -> text = unicode(structure)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(752)do_insertStructure_tal()
>> -> if not (repldict or self.strictinsert):
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(754)do_insertStructure_tal()
>> -> self.stream_write(text)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(755)do_insertStructure_tal()
>> -> return
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(755)do_insertStructure_tal()->None
>> -> return
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()->None
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(852)do_condition()->None
>> -> self.interpret(block)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>>
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()->None
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(513)no_tag()->None
>> -> self.interpret(program)
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(518)do_optTag()->None
>> -> return self.no_tag(start, program)
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(533)do_optTag_tal()->None
>> -> self.do_optTag(stuff)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()->None
>> -> self.level = oldlevel
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(889)do_useMacro()
>> -> self.inUseDirective = wasInUse
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(891)do_useMacro()
>> -> if self.sourceFile != prev_source:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(892)do_useMacro()
>> -> self.engine.setSourceFile(prev_source)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(893)do_useMacro()
>> -> self.sourceFile = prev_source
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(894)do_useMacro()
>> -> self.popMacro()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(896)do_useMacro()
>> -> self.engine.setLocal('macroname', outer)
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(896)do_useMacro()->None
>> -> self.engine.setLocal('macroname', outer)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(343)interpret()
>> -> handlers[opcode](self, args)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(342)interpret()
>> -> for (opcode, args) in program:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()
>> -> self.level = oldlevel
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(345)interpret()->None
>> -> self.level = oldlevel
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(272)__call__()
>> -> assert self.level == 0
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(273)__call__()
>> -> assert self.scopeLevel == 0
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(274)__call__()
>> -> assert self.i18nContext.parent is None
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py(274)__call__()->None
>> -> assert self.i18nContext.parent is None
>> (Pdb)
>>
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.pagetemplate-3.6.3-py2.7.egg/zope/pagetemplate/pagetemplate.py(241)__call__()
>> -> return output.getvalue()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.pagetemplate-3.6.3-py2.7.egg/zope/pagetemplate/pagetemplate.py(241)__call__()->u'\n<!DO...l>\n\n\n'
>> -> return output.getvalue()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.pagetemplate-3.6.3-py2.7.egg/zope/pagetemplate/pagetemplate.py(132)pt_render()->u'\n<!DO...l>\n\n\n'
>> -> strictinsert=0, sourceAnnotations=sourceAnnotations
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py(61)__call__()
>> -> response = instance.request.response
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py(62)__call__()
>> -> if not response.getHeader("Content-Type"):
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py(64)__call__()
>> -> return s
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py(64)__call__()->u'\n<!DO...l>\n\n\n'
>> -> return s
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py(125)__call__()->u'\n<!DO...l>\n\n\n'
>> -> return self.im_func(im_self, *args, **kw)
>> (Pdb)
>> --Return--
>>
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.autoform-1.6-py2.7.egg/plone/autoform/view.py(40)render()->u'\n<!DO...l>\n\n\n'
>> -> return self.index()
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/plone.autoform-1.6-py2.7.egg/plone/autoform/view.py(49)__call__()->u'\n<!DO...l>\n\n\n'
>> -> return self.render()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(49)call_object()
>> -> return result
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(49)call_object()->u'\n<!DO...l>\n\n\n'
>> -> return result
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/mapply.py(77)mapply()->u'\n<!DO...l>\n\n\n'
>> -> if debug is not None: return debug(object,args,context)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(140)publish()
>> -> if result is not response:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(141)publish()
>> -> response.setBody(result)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(143)publish()
>> -> notify(PubBeforeCommit(request))
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(145)publish()
>> -> if transactions_manager:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(146)publish()
>> -> transactions_manager.commit()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(147)publish()
>> -> endInteraction()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(149)publish()
>> -> notify(PubSuccess(request))
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(151)publish()
>> -> return response
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(151)publish()->ZServerHTTPRe.../html>\n\n\n')
>> -> return response
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(264)publish_module_standard()
>> -> if response:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(265)publish_module_standard()
>> -> outputBody=getattr(response, 'outputBody', None)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(266)publish_module_standard()
>> -> if outputBody is not None:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(267)publish_module_standard()
>> -> outputBody()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(273)publish_module_standard()
>> -> if after_list[0] is not None: after_list[0]()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(276)publish_module_standard()
>> -> if request is not None: request.close()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(278)publish_module_standard()
>> -> if must_die:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(292)publish_module_standard()
>> -> return status
>> (Pdb)
>> --Return--
>>
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(292)publish_module_standard()->200
>> -> return status
>> (Pdb)
>> --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/Publish.py(455)publish_module()->200
>> -> environ, debug, request, response)
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(33)__init__()
>> -> b._finish()
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(34)__init__()
>> -> a=b=None
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(24)__init__()
>> -> try:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(25)__init__()
>> -> name, a, b=accept()
>> (Pdb)
>>
>>
>> l
>> l
>> n
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(26)__init__()
>> -> if name == "Zope2":
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(27)__init__()
>> -> try:
>> (Pdb)
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(28)__init__()
>> -> publish_module(
>> (Pdb) l
>> 23 while 1:
>> 24 try:
>> 25 name, a, b=accept()
>> 26 if name == "Zope2":
>> 27 try:
>> 28 -> publish_module(
>> 29 name,
>> 30 request=a,
>> 31 response=b)
>> 32 finally:
>> 33 b._finish()
>> (Pdb) l
>> 34 a=b=None
>> 35
>> 36 elif name == "Zope2WSGI":
>> 37 try:
>> 38 res = publish_wsgi(a, b)
>> 39 for r in res:
>> 40 a['wsgi.output'].write(r)
>> 41 finally:
>> 42 # TODO: Support keeping connections open.
>> 43 a['wsgi.output']._close = 1
>> 44 a['wsgi.output'].close()
>> (Pdb) n
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(29)__init__()
>> -> name,
>> (Pdb) 2014-06-11 12:27:30 ERROR Zope.SiteErrorLog
>> 1402469850.220.167440919453
>> http://localhost:8080/Plone/forumboard/topic1/conv1/++conversation++default/1402464054437830/@@download/attachment/garga.txt
>> Traceback (innermost last):
>> Module ZPublisher.Publish, line 138, in publish
>> Module ZPublisher.mapply, line 77, in mapply
>> Module ZPublisher.Publish, line 48, in call_object
>> Module plone.namedfile.browser, line 43, in __call__
>> Module plone.namedfile.browser, line 62, in _getFile
>> Module AccessControl.ImplPython, line 716, in guarded_getattr
>> Module AccessControl.ImplPython, line 658, in aq_validate
>> Module AccessControl.ImplPython, line 552, in validate
>> Module AccessControl.ImplPython, line 322, in validate
>> Module AccessControl.ImplPython, line 797, in raiseVerbose
>> Unauthorized: The container has no security assertions. Access to
>> 'attachment' of (plone.app.discussion.comment.Comment object at
>> 0x7a5e848) denied.
>> l
>> 24 try:
>> 25 name, a, b=accept()
>> 26 if name == "Zope2":
>> 27 try:
>> 28 publish_module(
>> 29 -> name,
>> 30 request=a,
>> 31 response=b)
>> 32 finally:
>> 33 b._finish()
>> 34 a=b=None
>> (Pdb) l
>> 35
>> 36 elif name == "Zope2WSGI":
>> 37 try:
>> 38 res = publish_wsgi(a, b)
>> 39 for r in res:
>> 40 a['wsgi.output'].write(r)
>> 41 finally:
>> 42 # TODO: Support keeping connections open.
>> 43 a['wsgi.output']._close = 1
>> 44 a['wsgi.output'].close()
>> 45 except:
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(45)__init__()
>> -> self.context = context
>> l
>> (Pdb) 46 LOG.error('exception caught', exc_info=True)
>> [EOF]
>> n
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(46)__init__()
>> -> self.request = request
>>
>> (Pdb) [EOF]
>>
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(47)__init__()
>> -> self.form = form
>>
>> [EOF]
>> (Pdb)
>> (Pdb) [EOF]
>>
>> (Pdb) --Return--
>> /home/aman/gsoc/collective.ploneboard/src/collective/ploneboard/browser/commentextender.py(47)__init__()->None
>> -> self.form = form
>>
>> (Pdb) [EOF]
>> n
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(251)getAdapters()
>> -> if adapter is not None:
>> n
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(30)__init__()
>> -> request=a,
>>
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(252)getAdapters()
>> -> yield name, adapter
>>
>> (Pdb) >
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(31)__init__()
>> -> response=b)
>>
>> (Pdb) --Return--
>> /home/aman/gsoc/collective.ploneboard/eggs/zope.component-3.9.5-py2.7.egg/zope/component/registry.py(252)getAdapters()->(u'',
>> <collect...843fe1d0>)
>> -> yield name, adapter
>>
>> (Pdb) 2014-06-11 12:29:38 ERROR Zope.SiteErrorLog
>> 1402469978.430.350819275202
>> http://localhost:8080/Plone/forumboard/topic1/conv1/++conversation++default/1402464054437830/@@download/attachment/garga.txt
>> Traceback (innermost last):
>> Module ZPublisher.Publish, line 138, in publish
>> Module ZPublisher.mapply, line 77, in mapply
>> Module ZPublisher.Publish, line 48, in call_object
>> Module plone.namedfile.browser, line 43, in __call__
>> Module plone.namedfile.browser, line 62, in _getFile
>> Module AccessControl.ImplPython, line 716, in guarded_getattr
>> Module AccessControl.ImplPython, line 658, in aq_validate
>> Module AccessControl.ImplPython, line 552, in validate
>> Module AccessControl.ImplPython, line 322, in validate
>> Module AccessControl.ImplPython, line 797, in raiseVerbose
>> Unauthorized: The container has no security assertions. Access to
>> 'attachment' of (plone.app.discussion.comment.Comment object at
>> 0x7fae842f2aa0) denied.
>> /home/aman/gsoc/collective.ploneboard/eggs/Zope2-2.13.22-py2.7.egg/ZServer/PubCore/ZServerPublisher.py(33)__init__()
>
>
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
> _______________________________________________
> Plone-developers mailing list
> Plone-developers-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/plone-developers
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft