Projet

Général

Profil

0001-wf-add-user-unlinking-option-to-anonymise-action-717.patch

Paul Marillonnet, 05 décembre 2022 16:16

Télécharger (5,8 ko)

Voir les différences:

Subject: [PATCH] wf: add user unlinking option to anonymise action (#71777)

 tests/workflow/test_carddata.py | 37 +++++++++++++++++++++++++++++++++
 tests/workflow/test_formdata.py | 37 +++++++++++++++++++++++++++++++++
 wcs/formdata.py                 |  5 +++++
 wcs/wf/anonymise.py             | 34 +++++++++++++++++++++++++++++-
 4 files changed, 112 insertions(+), 1 deletion(-)
tests/workflow/test_carddata.py
1618 1618
    formdata.just_created()
1619 1619
    formdata.perform_workflow()
1620 1620
    assert carddef.data_class().count() == 0
1621

  
1622

  
1623
def test_anonymise_action_unlink_user(pub):
1624
    CardDef.wipe()
1625
    FormDef.wipe()
1626
    pub.user_class.wipe()
1627

  
1628
    user = pub.user_class()
1629
    user.email = 'test@example.net'
1630
    user.name_identifiers = ['xyz']
1631
    user.store()
1632

  
1633
    wf = Workflow(name='test-unlink-user')
1634
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
1635
    anonymise = wf.possible_status[1].add_action('anonymise', id='_anonymise', prepend=True)
1636
    anonymise.label = 'Unlink User'
1637
    anonymise.varname = 'mycard'
1638
    anonymise.unlink_user = True
1639
    wf.store()
1640

  
1641
    carddef = CardDef()
1642
    carddef.name = 'Person'
1643
    carddef.workflow_id = wf.id
1644
    carddef.store()
1645
    carddef.data_class().wipe()
1646

  
1647
    carddata = carddef.data_class()()
1648
    carddata.data = {'0': 'Foo', '1': 'Bar'}
1649
    carddata.user_id = user.id
1650
    carddata.just_created()
1651
    carddata.store()
1652

  
1653
    assert carddef.data_class().select()[0].user.id == user.id
1654

  
1655
    carddata.perform_workflow()
1656

  
1657
    assert carddef.data_class().select()[0].user is None
tests/workflow/test_formdata.py
398 398
    formdata.perform_workflow()
399 399
    assert target_formdef.data_class().count() == 2
400 400
    assert formdata.submission_context == {'a': 'b'}
401

  
402

  
403
def test_anonymise_action_unlink_user(pub):
404
    CardDef.wipe()
405
    FormDef.wipe()
406
    pub.user_class.wipe()
407

  
408
    user = pub.user_class()
409
    user.email = 'test@example.net'
410
    user.name_identifiers = ['xyz']
411
    user.store()
412

  
413
    wf = Workflow(name='test-unlink-user')
414
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
415
    anonymise = wf.possible_status[1].add_action('anonymise', id='_anonymise', prepend=True)
416
    anonymise.label = 'Unlink User'
417
    anonymise.varname = 'mycard'
418
    anonymise.unlink_user = True
419
    wf.store()
420

  
421
    formdef = FormDef()
422
    formdef.name = 'Person'
423
    formdef.workflow_id = wf.id
424
    formdef.store()
425
    formdef.data_class().wipe()
426

  
427
    formdata = formdef.data_class()()
428
    formdata.data = {'0': 'Foo', '1': 'Bar'}
429
    formdata.user_id = user.id
430
    formdata.just_created()
431
    formdata.store()
432

  
433
    assert formdef.data_class().select()[0].user.id == user.id
434

  
435
    formdata.perform_workflow()
436

  
437
    assert formdef.data_class().select()[0].user is None
wcs/formdata.py
1266 1266
        self._store_all_evolution = True
1267 1267
        self.store()
1268 1268

  
1269
    def unlink_user(self):
1270
        get_session().mark_anonymous_formdata(self)
1271
        self.user_id = None
1272
        self.store()
1273

  
1269 1274
    def get_display_name(self):
1270 1275
        return _('%(name)s #%(id)s') % {'name': self.formdef.name, 'id': self.get_display_id()}
1271 1276

  
wcs/wf/anonymise.py
14 14
# You should have received a copy of the GNU General Public License
15 15
# along with this program; if not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from quixote import get_publisher
18

  
19
from wcs.carddef import CardDef
17 20
from wcs.qommon import _
21
from wcs.qommon.form import CheckboxWidget
18 22
from wcs.workflows import WorkflowStatusItem, register_item_class
19 23

  
20 24

  
......
22 26
    description = _('Anonymisation')
23 27
    key = 'anonymise'
24 28
    category = 'formdata-action'
29
    unlink_user = False
25 30

  
26 31
    def perform(self, formdata):
27
        formdata.anonymise()
32
        if self.unlink_user is True:
33
            if not formdata.user_id:
34
                error = _('No user linked to form.')
35
                if isinstance(formdata.formdef, CardDef):
36
                    error = _('No user linked to card.')
37
                get_publisher().record_error(
38
                    error,
39
                    formdata=formdata,
40
                    status_item=self,
41
                )
42
                return
43
            formdata.unlink_user()
44
        else:
45
            formdata.anonymise()
46

  
47
    def get_parameters(self):
48
        return ('unlink_user',)
49

  
50
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
51
        super().add_parameters_widgets(form, parameters, prefix, formdef, **kwargs)
52
        if ('unlink_user') in parameters:
53
            form.add(
54
                CheckboxWidget,
55
                '%sunlink_user' % prefix,
56
                title=_('Only perform form/card user unlinking'),
57
                hint=_('If checked, this action will only unlink user from the form/card.'),
58
                value=self.unlink_user,
59
            )
28 60

  
29 61

  
30 62
register_item_class(AnonymiseWorkflowStatusItem)
31
-