Projet

Général

Profil

0001-admin-check-for-contents-before-removal-of-forms-car.patch

Frédéric Péters, 22 septembre 2020 14:50

Télécharger (5,64 ko)

Voir les différences:

Subject: [PATCH] admin: check for contents before removal of forms/cards
 (#207)

 tests/test_admin_pages.py       | 24 +++++++++++++++++++++++
 tests/test_forms_admin_pages.py | 34 +++++++++++++++++++++++++++++++++
 wcs/admin/forms.py              | 22 +++++++++++++++++++--
 wcs/backoffice/cards.py         | 11 +++++++++++
 4 files changed, 89 insertions(+), 2 deletions(-)
tests/test_admin_pages.py
1647 1647
    assert CardDef.get(1).disabled is False
1648 1648

  
1649 1649

  
1650
def test_cards_delete(pub, studio):
1651
    test_cards_new(pub, studio)
1652
    app = login(get_app(pub))
1653

  
1654
    carddef = CardDef.select()[0]
1655
    carddata = carddef.data_class()()
1656
    carddata.just_created()
1657
    carddata.data = {}
1658
    carddata.store()
1659

  
1660
    resp = app.get('http://example.net/backoffice/cards/1/')
1661
    resp = resp.click('Delete')
1662
    if pub.is_using_postgresql():
1663
        assert 'Deletion is not possible as there are cards.' in resp
1664
        carddef.data_class().wipe()
1665
        resp = app.get('http://example.net/backoffice/cards/1/')
1666
        resp = resp.click('Delete')
1667

  
1668
    resp = resp.form.submit('submit')
1669
    assert CardDef.count() == 0
1670

  
1671
    carddata.remove_self()  # don't keep leftovers
1672

  
1673

  
1650 1674
def test_cards_duplicate(pub, studio):
1651 1675
    test_cards_new(pub, studio)
1652 1676
    app = login(get_app(pub))
tests/test_forms_admin_pages.py
851 851
    assert FormDef.count() == 0
852 852

  
853 853

  
854
def test_form_delete_with_data(pub):
855
    create_superuser(pub)
856
    create_role()
857

  
858
    FormDef.wipe()
859
    formdef = FormDef()
860
    formdef.name = 'form title'
861
    formdef.fields = []
862
    formdef.store()
863

  
864
    formdata = formdef.data_class()()
865
    formdata.just_created()
866
    formdata.store()
867

  
868
    app = login(get_app(pub))
869

  
870
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
871
    resp = resp.click(href='delete')
872
    if pub.is_using_postgresql():
873
        assert 'Deletion is not possible' in resp
874

  
875
    formdata.status = 'draft'
876
    formdata.store()
877
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
878
    resp = resp.click(href='delete')
879
    assert 'Deletion is not possible' not in resp
880

  
881
    formdata.status = 'wf-rejected'
882
    formdata.store()
883
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
884
    resp = resp.click(href='delete')
885
    assert 'Deletion is not possible' not in resp
886

  
887

  
854 888
def test_form_duplicate(pub):
855 889
    create_superuser(pub)
856 890
    create_role()
wcs/admin/forms.py
32 32
from wcs.qommon import misc
33 33
from wcs.qommon.errors import *
34 34
from wcs.qommon.form import *
35
from wcs.qommon.storage import Equal, NotEqual, Null
35 36
from wcs.qommon.backoffice.menu import html_top
36 37
from wcs.qommon import get_logger
37 38
from wcs.qommon.misc import C_
......
944 945
        self.formdefui.formdef.store()
945 946
        return redirect('../%s/' % self.formdefui.formdef.id)
946 947

  
948
    def get_check_count_before_deletion_message(self):
949
        if not get_publisher().is_using_postgresql():
950
            return None
951
        from wcs import sql
952
        criterias = [
953
            Equal('formdef_id', self.formdefui.formdef.id),
954
            NotEqual('status', 'draft'),
955
            Equal('is_at_endpoint', False),
956
            Null('anonymised'),
957
        ]
958
        if sql.AnyFormData.count(criterias):
959
            return _('Deletion is not possible as there are open forms.')
960

  
947 961
    def delete(self):
948 962
        form = Form(enctype='multipart/form-data')
949
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
950
        form.add_submit('delete', _('Delete'))
963
        check_count_message = self.get_check_count_before_deletion_message()
964
        if check_count_message:
965
            form.widgets.append(HtmlWidget('<p>%s</p>' % check_count_message))
966
        else:
967
            form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
968
            form.add_submit('delete', _('Delete'))
951 969
        form.add_submit('cancel', _('Cancel'))
952 970
        if form.get_widget('cancel').parse():
953 971
            return redirect('..')
wcs/backoffice/cards.py
24 24

  
25 25
from ..qommon import _, N_, misc
26 26
from ..qommon.misc import C_
27
from ..qommon.storage import NotEqual, Null
27 28

  
28 29
from wcs.carddef import CardDef
29 30
from wcs.roles import Role
......
191 192
        r += LoggedErrorsDirectory.errors_block(formdef_id=self.formdef.id)
192 193
        return r.getvalue()
193 194

  
195
    def get_check_count_before_deletion_message(self):
196
        if not get_publisher().is_using_postgresql():
197
            return None
198
        criterias = [
199
            NotEqual('status', 'draft'),
200
            Null('anonymised'),
201
        ]
202
        if self.formdef.data_class().count(criterias):
203
            return _('Deletion is not possible as there are cards.')
204

  
194 205

  
195 206
class CardsDirectory(FormsDirectory):
196 207
    _q_exports = ['', 'new', ('import', 'p_import')]
197
-