0001-misc-remove-anonymise-forms-action-from-admin-sideba.patch
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 |
- |