Skip to content

Commit de6a228

Browse files
authored
Merge pull request #67 from eea/develop
Develop
2 parents e1d41d1 + 7bbb3ef commit de6a228

File tree

3 files changed

+59
-14
lines changed

3 files changed

+59
-14
lines changed

Products/Reportek/Feedback.py

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@
3838
import StringIO
3939
from AccessControl import ClassSecurityInfo
4040
from blob import add_OfsBlobFile
41+
from BTrees.OOBTree import BTree
4142
from Comment import CommentsManager
4243
from DateTime import DateTime
4344
from Globals import InitializeClass
4445
from OFS.ObjectManager import ObjectManager
4546
from OFS.PropertyManager import PropertyManager
4647
from OFS.SimpleItem import SimpleItem
48+
from zope.annotation.interfaces import IAnnotations
4749
from zope.event import notify
4850
from zope.interface import alsoProvides, implements
4951
from zope.lifecycleevent import ObjectModifiedEvent
@@ -52,10 +54,11 @@
5254
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
5355
from Products.Reportek import constants
5456
from Products.Reportek.CatalogAware import CatalogAware
55-
from Products.Reportek.interfaces import IFeedback
57+
from Products.Reportek.interfaces import IFeedback, IFeedbackHistory
5658
from Products.Reportek.RepUtils import DFlowCatalogAware, parse_uri
5759

5860
__version__ = "$Rev$"[6:-2]
61+
ANNOTATION_KEY = "feedback.history"
5962
logger = logging.getLogger("Reportek")
6063

6164
manage_addFeedbackForm = PageTemplateFile("zpt/feedback/add", globals())
@@ -247,7 +250,7 @@ class ReportFeedback(
247250
# Create a SecurityInfo for this class. We will use this
248251
# in the rest of our class definition to make security
249252
# assertions.
250-
implements(IFeedback)
253+
implements(IFeedback, IFeedbackHistory)
251254
security = ClassSecurityInfo()
252255

253256
def __init__(
@@ -275,6 +278,7 @@ def __init__(
275278
self.postingdate = DateTime()
276279
self.message = message
277280
self.feedback_status = feedback_status
281+
self.__history = None
278282

279283
def update_item(self, postingdate=None):
280284
"""If the parameter is provided, updates the postingdate to it
@@ -409,34 +413,38 @@ def deserialize_html_feedback(self, value):
409413
value = value.get("data", "")
410414
return value, kwargs
411415

412-
security.declareProtected("Change Feedback", "manage_editFeedback")
416+
security.declareProtected("Change Feedback", "edit")
413417

414418
def edit(self):
415419
"""Edits the properties of the feedback.
416420
To be used by the FME"""
417-
VALID_ATTRS = [
418-
"title",
419-
"feedback-data",
420-
"content_type",
421-
"document_id",
422-
"feedback_status",
423-
"message",
424-
]
421+
VALID_ATTRS_MAP = {
422+
"title": "title",
423+
"feedback-data": "feedbacktext",
424+
"content_type": "content_type",
425+
"document_id": "document_id",
426+
"feedback_status": "feedback_status",
427+
"message": "message",
428+
}
429+
history = {}
425430
accept = self.REQUEST.environ.get("HTTP_ACCEPT")
426431
if accept == "application/json":
427432
if "IDisableCSRFProtection" in dir(plone.protect.interfaces):
428433
alsoProvides(
429434
self.REQUEST,
430435
plone.protect.interfaces.IDisableCSRFProtection,
431436
)
432-
self.REQUEST.RESPONSE.setHeader("Content-Type", "application/json")
437+
self.REQUEST.RESPONSE.setHeader("Content-Type",
438+
"application/json")
433439
res = {}
434440
data = json.loads(self.REQUEST.get("BODY") or "{}")
435441
if not isinstance(data, dict):
436442
res["result"] = "Fail"
437443
res["message"] = "Malformed body"
438444

439-
for attr in VALID_ATTRS:
445+
for attr in VALID_ATTRS_MAP.keys():
446+
history[VALID_ATTRS_MAP[attr]] = getattr(
447+
self, VALID_ATTRS_MAP[attr])
440448
if attr in data:
441449
try:
442450
if attr == "feedback-data":
@@ -453,8 +461,10 @@ def edit(self):
453461
res["result"] = "Fail"
454462
res["message"] = err_msg
455463
return json.dumps(res)
464+
history['author'] = self.author
465+
self.author = self.REQUEST.AUTHENTICATED_USER.getUserName()
456466
notify(ObjectModifiedEvent(self))
457-
467+
self.add_to_history(history)
458468
res["result"] = "Success"
459469
res["message"] = "Feedback updated"
460470
return json.dumps(res, indent=4)
@@ -463,6 +473,34 @@ def edit(self):
463473
"%s/manage_editFeedbackForm" % self.absolute_url()
464474
)
465475

476+
def _history(self, create=True):
477+
if getattr(self, '__history', None) is not None:
478+
return self.__history
479+
480+
annotations = IAnnotations(self)
481+
history = annotations.get(ANNOTATION_KEY, None)
482+
if history is None and create:
483+
history = annotations.setdefault(ANNOTATION_KEY, BTree())
484+
if history is not None:
485+
self.__history = history
486+
return self.__history
487+
488+
def get_history(self):
489+
history = self._history(create=False)
490+
return history
491+
492+
def add_to_history(self, history):
493+
annotations = self._history()
494+
annotations.insert(DateTime().HTML4(), history)
495+
496+
@property
497+
def author(self):
498+
return getattr(self, '_author', 'Original author')
499+
500+
@author.setter
501+
def author(self, value):
502+
self._author = value
503+
466504
security.declareProtected("Change Feedback", "manage_uploadFeedback")
467505

468506
def manage_uploadFeedback(self, file="", REQUEST=None, filename=None):

Products/Reportek/interfaces.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ class IWkMetadata(IAttributeAnnotatable):
8686
""" Marker interface for metadata wk """
8787

8888

89+
class IFeedbackHistory(IAttributeAnnotatable):
90+
""" Marker interface for feedback history """
91+
92+
8993
class IEnvelopeEvent(IObjectEvent):
9094
""" All Envelope events should inherit from this """
9195

docs/HISTORY.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
Changelog
22
=========
33

4+
5.3-dev0 - (unreleased)
5+
---------------------------
6+
47
5.3 - (2024-05-02)
58
---------------------------
69
* Change: Develop [olimpiurob]

0 commit comments

Comments
 (0)