Projet

Général

Profil

0001-misc-remove-anonymise-forms-action-from-admin-sideba.patch

Frédéric Péters, 05 juillet 2021 11:44

Télécharger (7,29 ko)

Voir les différences:

Subject: [PATCH] misc: remove "anonymise forms" action from admin sidebar
 (#55231)

 tests/admin_pages/test_form.py | 68 -----------------------------
 wcs/admin/forms.py             | 78 ----------------------------------
 2 files changed, 146 deletions(-)
tests/admin_pages/test_form.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
import datetime
4 3
import io
5 4
import os
6 5
import re
......
2324 2323
    assert resp.forms[0]['role_id'].value == role.id
2325 2324

  
2326 2325

  
2327
def test_form_anonymise(pub):
2328
    create_superuser(pub)
2329
    create_role(pub)
2330

  
2331
    FormDef.wipe()
2332
    formdef = FormDef()
2333
    formdef.name = 'form title'
2334
    formdef.fields = []
2335
    formdef.store()
2336

  
2337
    data_class = formdef.data_class()
2338
    data_class.wipe()
2339
    for i in range(10):
2340
        formdata = data_class()
2341
        formdata.just_created()
2342
        if i < 3:
2343
            formdata.status = 'wf-new'
2344
        else:
2345
            formdata.status = 'wf-rejected'
2346
        formdata.store()
2347

  
2348
    app = login(get_app(pub))
2349
    resp = app.get('/backoffice/forms/1/')
2350
    resp = resp.click(href='anonymise')
2351
    resp = resp.form.submit('cancel')
2352
    assert len([x for x in formdef.data_class().select() if x.anonymised]) == 0
2353
    assert resp.location == 'http://example.net/backoffice/forms/1/'
2354

  
2355
    resp = app.get('/backoffice/forms/1/')
2356
    resp = resp.click(href='anonymise')
2357
    resp = resp.form.submit('submit')
2358
    assert resp.location == 'http://example.net/backoffice/forms/1/'
2359
    assert len([x for x in formdef.data_class().select() if x.anonymised]) == 0
2360

  
2361
    resp = app.get('/backoffice/forms/1/')
2362
    resp = resp.click(href='anonymise')
2363
    resp.form['before_request_date'].value = (
2364
        datetime.datetime.today() + datetime.timedelta(days=1)
2365
    ).strftime('%Y-%m-%d')
2366
    resp = resp.form.submit('submit')
2367
    assert resp.location == 'http://example.net/backoffice/forms/1/'
2368
    assert len([x for x in formdef.data_class().select() if x.anonymised]) == 7
2369

  
2370
    data_class.wipe()
2371
    for i in range(110):
2372
        formdata = data_class()
2373
        formdata.just_created()
2374
        if i < 3:
2375
            formdata.status = 'wf-rejected'
2376
        else:
2377
            formdata.status = 'wf-finished'
2378
        formdata.store()
2379

  
2380
    resp = app.get('/backoffice/forms/1/')
2381
    resp = resp.click(href='anonymise')
2382
    resp.form['before_request_date'].value = (
2383
        datetime.datetime.today() + datetime.timedelta(days=1)
2384
    ).strftime('%Y-%m-%d')
2385
    resp.form['endpoints$elementfinished'].checked = False
2386
    resp = resp.form.submit('submit')
2387
    assert '?job=' in resp.location
2388
    resp = resp.follow()
2389
    assert 'job-status' in resp.text
2390
    assert 'completed' in resp.text
2391
    assert len([x for x in formdef.data_class().select() if x.anonymised]) == 3
2392

  
2393

  
2394 2326
def test_form_public_url(pub):
2395 2327
    create_superuser(pub)
2396 2328
    create_role(pub)
wcs/admin/forms.py
16 16
# You should have received a copy of the GNU General Public License
17 17
# along with this program; if not, see <http://www.gnu.org/licenses/>.
18 18

  
19
import datetime
20 19
import difflib
21 20
import io
22 21
import tarfile
......
866 865
        if get_publisher().snapshot_class:
867 866
            r += htmltext('<li><a rel="popup" href="history/save">%s</a></li>') % _('Save snapshot')
868 867
            r += htmltext('<li><a href="history/">%s</a></li>') % _('History')
869
        r += htmltext('<li><a href="anonymise">%s</a></li>') % _('Anonymise forms')
870 868
        if not get_publisher().is_using_postgresql():
871 869
            r += htmltext('<li><a href="archive">%s</a></li>') % _('Archive')
872 870
        r += htmltext('</ul>')
......
1575 1573
        )
1576 1574
        return job.file_content
1577 1575

  
1578
    def anonymise(self):
1579
        endpoints = []
1580
        for status in self.formdef.workflow.get_endpoint_status():
1581
            endpoints.append((str(status.id), status.name, str(status.id)))
1582

  
1583
        form = Form(enctype='multipart/form-data')
1584
        form.add(
1585
            DateWidget,
1586
            'before_request_date',
1587
            title=_('Forms ended before'),
1588
            value=datetime.date.today() - datetime.timedelta(30),
1589
            required=True,
1590
        )
1591
        form.add(
1592
            CheckboxesWidget,
1593
            'endpoints',
1594
            title=_('Status of the forms to anonymise'),
1595
            value=[endpoint[0] for endpoint in endpoints],
1596
            options=endpoints,
1597
            inline=False,
1598
            required=True,
1599
        )
1600
        form.add_submit('submit', _('Submit'))
1601
        form.add_submit('cancel', _('Cancel'))
1602

  
1603
        if form.get_widget('cancel').parse():
1604
            return redirect('.')
1605
        if not form.is_submitted() or form.has_errors():
1606
            get_response().breadcrumb.append(('anonymise', _('Anonymise')))
1607
            html_top('forms', title=_('Anonymise Forms'))
1608
            r = TemplateIO(html=True)
1609
            r += htmltext('<h2>%s</h2>') % _('Anonymise Forms')
1610
            r += htmltext('<p>%s</p>' % _("You are about to irrevocably anonymise forms."))
1611
            r += form.render()
1612
            return r.getvalue()
1613
        else:
1614
            return self.anonymise_submit(form)
1615

  
1616
    def anonymise_submit(self, form):
1617
        class Anonymiser:
1618
            def __init__(self, formdef, status_ids, before_date):
1619
                self.formdef = formdef
1620
                self.status_ids = ["wf-%s" % id for id in status_ids]
1621
                self.before_date = before_date
1622

  
1623
            def anonymise(self, job=None):
1624
                for formdata in self.formdef.data_class().select():
1625
                    if formdata.anonymised:
1626
                        continue
1627
                    if formdata.status not in self.status_ids:
1628
                        continue
1629
                    if (formdata.evolution and formdata.evolution[-1].time >= self.before_date) or (
1630
                        formdata.receipt_time >= self.before_date
1631
                    ):
1632
                        continue
1633
                    formdata.anonymise()
1634

  
1635
        before_date = form.get_widget('before_request_date').parse()
1636
        before_date = time.strptime(before_date, misc.date_format())
1637
        status_ids = form.get_widget('endpoints').parse()
1638
        count = self.formdef.data_class().count()
1639
        anonymiser = Anonymiser(self.formdef, status_ids, before_date)
1640
        if count > 100:  # Arbitrary threshold
1641
            job = get_response().add_after_job(
1642
                _('Anonymising forms'),
1643
                anonymiser.anonymise,
1644
                done_action_url=self.formdef.get_admin_url(),
1645
                done_action_label=_('Back'),
1646
            )
1647
            job.store()
1648
            return redirect(job.get_processing_url())
1649
        else:
1650
            anonymiser.anonymise()
1651

  
1652
        return redirect('.')
1653

  
1654 1576
    def enable(self):
1655 1577
        self.formdef.disabled = False
1656 1578
        self.formdef.store(comment=_('Enable'))
1657
-