wf: add user unlinking option to anonymise action (#71777) #27

Merged
fpeters merged 1 commits from wip/71777-anonymize-action-unlink-option into main 2023-02-10 09:15:48 +01:00
4 changed files with 140 additions and 2 deletions

View File

@ -1666,3 +1666,50 @@ def test_create_carddata_with_workflow_deleting_it(pub):
formdata.store()
formdata.perform_workflow()
assert carddef.data_class().count() == 0
@pytest.mark.parametrize('submitter_is_triggerer', [True, False])
def test_anonymise_action_unlink_user(pub, submitter_is_triggerer):
CardDef.wipe()
FormDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
if submitter_is_triggerer:
pub.get_request()._user = ()
pub.get_request().session = sessions.BasicSession(id=1)
pub.get_request().session.set_user(user.id)
wf = Workflow(name='test-unlink-user')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
anonymise = wf.possible_status[1].add_action('anonymise', id='_anonymise', prepend=True)
anonymise.label = 'Unlink User'
anonymise.varname = 'mycard'
anonymise.unlink_user = True
wf.store()
carddef = CardDef()
carddef.name = 'Person'
carddef.workflow_id = wf.id
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo', '1': 'Bar'}
carddata.user_id = user.id
carddata.just_created()
carddata.store()
assert carddef.data_class().select()[0].user.id == user.id
carddata.perform_workflow()
assert carddef.data_class().select()[0].user is None
assert (
pub.get_request().session.is_anonymous_submitter(carddef.data_class().select()[0])
is submitter_is_triggerer
)

View File

@ -1,5 +1,5 @@
import pytest
from quixote import cleanup, get_response
from quixote import cleanup, get_publisher, get_response
from wcs import sessions
from wcs.carddef import CardDef
@ -407,3 +407,56 @@ def test_create_formdata_does_not_overwrite_initial_submission_context(pub):
formdata.perform_workflow()
assert target_formdef.data_class().count() == 2
assert formdata.submission_context == {'a': 'b'}
@pytest.mark.parametrize('submitter_is_triggerer', [True, False])
def test_anonymise_action_unlink_user(pub, submitter_is_triggerer):
CardDef.wipe()
FormDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
if submitter_is_triggerer:
pub.get_request()._user = ()
pub.get_request().session = sessions.BasicSession(id=1)
pub.get_request().session.set_user(user.id)
wf = Workflow(name='test-unlink-user')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
anonymise = wf.possible_status[1].add_action('anonymise', id='_anonymise', prepend=True)
anonymise.label = 'Unlink User'
anonymise.varname = 'mycard'
anonymise.unlink_user = True
wf.store()
formdef = FormDef()
formdef.name = 'Person'
formdef.workflow_id = wf.id
formdef.enable_tracking_codes = True
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {'0': 'Foo', '1': 'Bar'}
formdata.user_id = user.id
formdata.just_created()
formdata.store()
code = get_publisher().tracking_code_class()
code.formdata = formdata
assert formdef.data_class().select()[0].user.id == user.id
assert formdef.data_class().select()[0].tracking_code
formdata.perform_workflow()
assert formdef.data_class().select()[0].user is None
assert formdef.data_class().select()[0].tracking_code is None
assert (
pub.get_request().session.is_anonymous_submitter(formdef.data_class().select()[0])
is submitter_is_triggerer
)

View File

@ -1285,6 +1285,17 @@ class FormData(StorableObject):
self._store_all_evolution = True
self.store()
def unlink_user(self):
if self.user_id:
self.user_id = None
self.store()
def remove_tracking_code(self):
if self.tracking_code is not None:
get_publisher().tracking_code_class.remove_object(self.tracking_code)
self.tracking_code = None
self.store()
def get_display_name(self):
return _('%(name)s #%(id)s') % {'name': self.formdef.name, 'id': self.get_display_id()}

View File

@ -14,7 +14,10 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
from quixote import get_request, get_session
from wcs.qommon import _
from wcs.qommon.form import CheckboxWidget
from wcs.workflows import WorkflowStatusItem, register_item_class
@ -22,9 +25,33 @@ class AnonymiseWorkflowStatusItem(WorkflowStatusItem):
description = _('Anonymisation')
key = 'anonymise'
category = 'formdata-action'
unlink_user = False
def perform(self, formdata):
formdata.anonymise()
if self.unlink_user is True:
if formdata.is_submitter(get_request().user):
get_session().mark_anonymous_formdata(formdata)
formdata.unlink_user()
formdata.remove_tracking_code()
else:
formdata.anonymise()
def get_parameters(self):
return ('unlink_user',)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix, formdef, **kwargs)
if 'unlink_user' in parameters:
form.add(
CheckboxWidget,
'%sunlink_user' % prefix,
title=_('Only perform form/card user unlinking'),
hint=_(
'If checked, this action will only unlink user from the form/card. '
'If existing, the tracking code will be deleted.'
),
value=self.unlink_user,
)
register_item_class(AnonymiseWorkflowStatusItem)