From ca20da9a21a98e6bd16e328dbefa4f6dd1f0e063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 12 Mar 2016 11:42:39 +0100 Subject: [PATCH] backoffice: reset advisory locks after actions (#10277) --- tests/test_backoffice_pages.py | 13 +++++++++++++ wcs/forms/common.py | 5 +++-- wcs/sessions.py | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 76d1157..2f99437 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -1796,6 +1796,19 @@ def test_backoffice_advisory_lock(pub): assert not '(unlock actions)' in resp.body assert len(resp.forms) == 1 + # submit action form + resp.form['comment'] = 'HELLO' + resp = resp.form.submit('button_commentable') + # locks are reset after an action + assert not 'advisory-lock' in app2.get('/backoffice/management/form-title/') + assert not 'advisory-lock' in app.get('/backoffice/management/form-title/') + # but as the current user is redirected to the form, a lock will be + # acquired (unless the user didn't have actions anymore, but it's not the + # case here) + resp = resp.follow() + assert not 'advisory-lock' in app2.get('/backoffice/management/form-title/') + assert 'advisory-lock' in app.get('/backoffice/management/form-title/') + def test_backoffice_resubmit(pub): user = create_user(pub) create_environment(pub) diff --git a/wcs/forms/common.py b/wcs/forms/common.py index f166e80..4195307 100644 --- a/wcs/forms/common.py +++ b/wcs/forms/common.py @@ -466,10 +466,11 @@ class FormStatusPage(Directory): def status(self): + object_key = 'formdata-%s-%s' % (self.formdef.url_name, self.filled.id) + if get_request().get_query() == 'unlock': # mark user as active visitor of the object, then redirect to self, # the unlocked form will appear. - object_key = 'formdata-%s-%s' % (self.formdef.url_name, self.filled.id) get_session().mark_visited_object(object_key) return redirect('./#lock-notice') @@ -486,6 +487,7 @@ class FormStatusPage(Directory): if form and form.is_submitted() and not form.has_errors(): url = self.submit(form) + get_session().unmark_visited_object(object_key) if url is None: url = get_request().get_frontoffice_url() response = get_response() @@ -515,7 +517,6 @@ class FormStatusPage(Directory): r += self.history() if form: - object_key = 'formdata-%s-%s' % (self.formdef.url_name, self.filled.id) all_visitors = get_publisher().get_object_visitors(object_key) visitors = [x for x in all_visitors if x[0] != get_session().user] me_in_visitors = bool(get_session().user in [x[0] for x in all_visitors]) diff --git a/wcs/sessions.py b/wcs/sessions.py index 68efa26..ff5215f 100644 --- a/wcs/sessions.py +++ b/wcs/sessions.py @@ -108,5 +108,20 @@ class BasicSession(Session): visitors[session.user] = max(object_timestamp, visitors.get(session.user, 0)) return visitors.items() + def unmark_visited_object(self, object_key): + # remove from current session + if object_key in getattr(self, 'visiting_objects', {}): + del self.visiting_objects[object_key] + # and from others + for session in self.__class__.select(): + if session.id == self.id: + continue + visiting_objects = getattr(session, 'visiting_objects', None) + if not visiting_objects: + continue + if object_key in visiting_objects: + del session.visiting_objects[object_key] + session.store() + qommon.sessions.BasicSession = BasicSession StorageSessionManager = qommon.sessions.StorageSessionManager -- 2.7.0