Projet

Général

Profil

0001-admin-don-t-allow-removal-of-form-if-there-are-open-.patch

Frédéric Péters, 24 juillet 2020 08:14

Télécharger (4,74 ko)

Voir les différences:

Subject: [PATCH] admin: don't allow removal of form if there are open demands
 (#207)

 tests/test_admin_pages.py | 52 +++++++++++++++++++++++++++++++++++++++
 wcs/admin/forms.py        | 20 +++++++++++++--
 wcs/backoffice/cards.py   |  1 +
 3 files changed, 71 insertions(+), 2 deletions(-)
tests/test_admin_pages.py
992 992
    assert FormDef.count() == 0
993 993

  
994 994

  
995
def test_form_delete_with_data(pub):
996
    create_superuser(pub)
997
    create_role()
998

  
999
    FormDef.wipe()
1000
    formdef = FormDef()
1001
    formdef.name = 'form title'
1002
    formdef.fields = []
1003
    formdef.store()
1004

  
1005
    formdata = formdef.data_class()()
1006
    formdata.just_created()
1007
    formdata.store()
1008

  
1009
    app = login(get_app(pub))
1010

  
1011
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
1012
    resp = resp.click(href='delete')
1013
    if pub.is_using_postgresql():
1014
        assert 'Deletion is not possible' in resp
1015

  
1016
    formdata.status = 'draft'
1017
    formdata.store()
1018
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
1019
    resp = resp.click(href='delete')
1020
    assert 'Deletion is not possible' not in resp
1021

  
1022
    formdata.status = 'wf-rejected'
1023
    formdata.store()
1024
    resp = app.get('/backoffice/forms/%s/' % formdef.id)
1025
    resp = resp.click(href='delete')
1026
    assert 'Deletion is not possible' not in resp
1027

  
1028

  
995 1029
def test_form_duplicate(pub):
996 1030
    create_superuser(pub)
997 1031
    create_role()
......
5955 5989
    assert CardDef.get(1).disabled is False
5956 5990

  
5957 5991

  
5992
def test_cards_delete(pub, studio):
5993
    test_cards_new(pub, studio)
5994
    app = login(get_app(pub))
5995

  
5996
    carddef = CardDef.select()[0]
5997
    carddata = carddef.data_class()()
5998
    carddata.just_created()
5999
    carddata.data = {}
6000
    carddata.store()
6001

  
6002
    resp = app.get('http://example.net/backoffice/cards/1/')
6003
    resp = resp.click('Delete')
6004
    resp = resp.form.submit('submit')
6005
    assert CardDef.count() == 0
6006

  
6007
    carddata.remove_self()  # don't keep leftovers
6008

  
6009

  
5958 6010
def test_cards_duplicate(pub, studio):
5959 6011
    test_cards_new(pub, studio)
5960 6012
    app = login(get_app(pub))
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_
......
368 369
    formdef_ui_class = FormDefUI
369 370
    formdef_default_workflow = '_default'
370 371

  
372
    check_open_forms_at_deletion = True
371 373
    delete_message = N_('You are about to irrevocably delete this form.')
372 374
    delete_title = N_('Deleting Form:')
373 375
    overwrite_message = N_(
......
919 921

  
920 922
    def delete(self):
921 923
        form = Form(enctype='multipart/form-data')
922
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
923
        form.add_submit('delete', _('Delete'))
924
        count = None
925
        if self.check_open_forms_at_deletion and get_publisher().is_using_postgresql():
926
            from wcs import sql
927
            criterias = [
928
                Equal('formdef_id', self.formdefui.formdef.id),
929
                NotEqual('status', 'draft'),
930
                Equal('is_at_endpoint', False),
931
                Null('anonymised'),
932
            ]
933
            count = sql.AnyFormData.count(criterias)
934
        if count and count > 0:
935
            form.widgets.append(HtmlWidget('<p>%s</p>' % _(
936
                'Deletion is not possible as there are open forms.')))
937
        else:
938
            form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
939
            form.add_submit('delete', _('Delete'))
924 940
        form.add_submit('cancel', _('Cancel'))
925 941
        if form.get_widget('cancel').parse():
926 942
            return redirect('..')
wcs/backoffice/cards.py
46 46
    formdef_ui_class = CardDefUI
47 47
    formdef_default_workflow = '_carddef_default'
48 48

  
49
    check_open_forms_at_deletion = False
49 50
    delete_message = N_('You are about to irrevocably delete this card model.')
50 51
    delete_title = N_('Deleting Card Model:')
51 52
    overwrite_message = N_(
52
-