add 'delete' action to comments

This commit is contained in:
Helmut Merz 2014-04-27 22:38:51 +02:00
parent 8ab637c402
commit 21ac74f764
4 changed files with 47 additions and 5 deletions

View file

@ -561,6 +561,14 @@
factory="loops.browser.concept.TabbedPage" factory="loops.browser.concept.TabbedPage"
permission="zope.View" /> permission="zope.View" />
<!-- delete object action -->
<page
name="delete_object"
for="loops.interfaces.INode"
class="loops.browser.form.DeleteObject"
permission="zope.ManageContent" />
<!-- dialogs/forms (end-user views) --> <!-- dialogs/forms (end-user views) -->
<page <page

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # Copyright (c) 2014 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -20,12 +20,13 @@
Classes for form presentation and processing. Classes for form presentation and processing.
""" """
from urllib import urlencode
from zope.app.container.contained import ObjectRemovedEvent
from zope import component, interface, schema from zope import component, interface, schema
from zope.component import adapts from zope.component import adapts
from zope.event import notify from zope.event import notify
from zope.interface import Interface from zope.interface import Interface
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
from zope.app.container.interfaces import INameChooser from zope.app.container.interfaces import INameChooser
from zope.app.container.contained import ObjectAddedEvent from zope.app.container.contained import ObjectAddedEvent
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
@ -35,7 +36,7 @@ from zope.publisher.browser import FileUpload
from zope.publisher.interfaces import BadRequest from zope.publisher.interfaces import BadRequest
from zope.security.interfaces import ForbiddenAttribute, Unauthorized from zope.security.interfaces import ForbiddenAttribute, Unauthorized
from zope.security.proxy import isinstance, removeSecurityProxy from zope.security.proxy import isinstance, removeSecurityProxy
from zope.traversing.api import getName from zope.traversing.api import getName, getParent
from cybertools.ajax import innerHtml from cybertools.ajax import innerHtml
from cybertools.browser.form import FormController from cybertools.browser.form import FormController
@ -68,6 +69,25 @@ from loops.util import _
from loops.versioning.interfaces import IVersionable from loops.versioning.interfaces import IVersionable
# delete object
class DeleteObject(NodeView):
isTopLevel = True
def __call__(self):
# todo: check permission; check security code
form = self.request.form
obj = util.getObjectForUid(form['uid'])
container = getParent(obj)
notify(ObjectRemovedEvent(obj))
del container[getName(obj)]
message = 'The object requested has been deleted.'
params = [('loops.message', message.encode('UTF-8'))]
nextUrl = '%s?%s' % (self.request.URL[-1], urlencode(params))
return self.request.response.redirect(nextUrl)
# forms # forms
class ObjectForm(NodeView): class ObjectForm(NodeView):

View file

@ -27,7 +27,7 @@ from zope.security import checkPermission
from cybertools.browser.action import actions from cybertools.browser.action import actions
from cybertools.tracking.btree import TrackingStorage from cybertools.tracking.btree import TrackingStorage
from loops.browser.action import DialogAction from loops.browser.action import Action, DialogAction
from loops.browser.common import BaseView from loops.browser.common import BaseView
from loops.browser.form import ObjectForm, EditObject from loops.browser.form import ObjectForm, EditObject
from loops.browser.node import NodeView from loops.browser.node import NodeView
@ -101,7 +101,20 @@ class CommentsView(NodeView):
stateful=comment.track, stateful=comment.track,
url=url, url=url,
onClick=onClick) onClick=onClick)
return [stateAct] actions = [stateAct]
if not checkPermission('loops.EditRestricted', self.context):
return actions
baseUrl = self.page.virtualTargetUrl
url = '%s/delete_object?uid=%s' % (baseUrl, trackUid)
onClick = _("return confirm('Do you really want to delete this object?')")
delAct = Action(self,
url=url,
description=_('Delete Comment'),
icon='cybertools.icons/delete.png',
cssClass='icon-action',
onClick=onClick)
actions.append(delAct)
return actions
class CommentDetails(TrackDetails): class CommentDetails(TrackDetails):

View file

@ -62,6 +62,7 @@ class StateAction(Action):
url = None url = None
definition = None definition = None
cssClass = 'icon-action'
@Lazy @Lazy
def stateful(self): def stateful(self):