Skip to content

Commit 704fea9

Browse files
committed
Fix missing 'transition' attribute in deserialized Response objects
1 parent f90bc99 commit 704fea9

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

changes/TI-3124.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix generating task listing pdf for resolved dossiers in nightly jobs. [elioschmutz]

opengever/base/response.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,20 @@ def __init__(self, response_type='default'):
184184
self.modified = None
185185
self.modifier = None
186186

187+
def __setstate__(self, state):
188+
# Ensure backward compatibility with older serialized Response objects.
189+
# Older pickled states may lack the 'transition' attribute, which leads to
190+
# AttributeError when accessing the transition attribute.
191+
#
192+
# We do not define the transition-property in the IResponse-interface
193+
# nor in the __init__ method, as it is only relevant for rare edge
194+
# cases were we're working with old Response.
195+
#
196+
# Fixes: https://4teamwork.atlassian.net/browse/TI-3124
197+
state['transition'] = state.get('transition', u'')
198+
199+
super(Response, self).__setstate__(state)
200+
187201
def add_change(self, field_id, before, after, field_title=''):
188202
self.changes.append(PersistentDict(
189203
field_id=field_id,

opengever/task/tests/test_response.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from ftw.testbrowser import browsing
22
from ftw.testbrowser.pages.statusmessages import info_messages
3+
from opengever.base.response import COMMENT_REMOVED_RESPONSE_TYPE
34
from opengever.base.response import IResponseContainer
5+
from opengever.base.response import Response
46
from opengever.testing import IntegrationTestCase
57
from persistent import Persistent
68
from persistent.list import PersistentList
79
from persistent.mapping import PersistentMapping
810
from plone import api
11+
import pickle
912

1013

1114
class TestTaskResponses(IntegrationTestCase):
@@ -26,6 +29,22 @@ def test_response_and_response_changes_are_persistent(self, browser):
2629
self.assertIsInstance(response.changes, PersistentList)
2730
self.assertIsInstance(response.changes[0], PersistentMapping)
2831

32+
def test_old_responses_in_task_history_provides_the_transition_property(self):
33+
"""Tasks should only have TaskResponse objects in the response history.
34+
But we've never migrated old response objects.
35+
36+
Because it'd be too much work to migrate all old Response objects to
37+
TaskResponse objects, we ensure here that old Response objects at least
38+
provide the 'transition' property after unpickling.
39+
"""
40+
response = Response(response_type=COMMENT_REMOVED_RESPONSE_TYPE)
41+
42+
self.assertFalse(hasattr(response, 'transition'))
43+
44+
unpickled_response = pickle.loads(pickle.dumps(response))
45+
self.assertTrue(hasattr(unpickled_response, 'transition'))
46+
self.assertEqual(unpickled_response.transition, u'')
47+
2948

3049
class TestTaskResponseForm(IntegrationTestCase):
3150

0 commit comments

Comments
 (0)