admin: check for contents before removal of forms/cards (#207)

This commit is contained in:
Frédéric Péters 2020-07-17 14:23:23 +02:00
parent f4886f5b0a
commit fb1908b2ab
4 changed files with 90 additions and 6 deletions

View File

@ -1647,6 +1647,30 @@ def test_cards_new(pub, studio):
assert CardDef.get(1).disabled is False
def test_cards_delete(pub, studio):
test_cards_new(pub, studio)
app = login(get_app(pub))
carddef = CardDef.select()[0]
carddata = carddef.data_class()()
carddata.just_created()
carddata.data = {}
carddata.store()
resp = app.get('http://example.net/backoffice/cards/1/')
resp = resp.click('Delete')
if pub.is_using_postgresql():
assert 'Deletion is not possible as there are cards.' in resp
carddef.data_class().wipe()
resp = app.get('http://example.net/backoffice/cards/1/')
resp = resp.click('Delete')
resp = resp.form.submit('submit')
assert CardDef.count() == 0
carddata.remove_self() # don't keep leftovers
def test_cards_duplicate(pub, studio):
test_cards_new(pub, studio)
app = login(get_app(pub))

View File

@ -851,6 +851,40 @@ def test_form_delete(pub):
assert FormDef.count() == 0
def test_form_delete_with_data(pub):
create_superuser(pub)
create_role()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = []
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/%s/' % formdef.id)
resp = resp.click(href='delete')
if pub.is_using_postgresql():
assert 'Deletion is not possible' in resp
formdata.status = 'draft'
formdata.store()
resp = app.get('/backoffice/forms/%s/' % formdef.id)
resp = resp.click(href='delete')
assert 'Deletion is not possible' not in resp
formdata.status = 'wf-rejected'
formdata.store()
resp = app.get('/backoffice/forms/%s/' % formdef.id)
resp = resp.click(href='delete')
assert 'Deletion is not possible' not in resp
def test_form_duplicate(pub):
create_superuser(pub)
create_role()

View File

@ -32,6 +32,7 @@ from wcs.qommon import _, N_, force_str
from wcs.qommon import misc
from wcs.qommon.errors import *
from wcs.qommon.form import *
from wcs.qommon.storage import Equal, NotEqual, Null
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon import get_logger
from wcs.qommon.misc import C_
@ -944,12 +945,29 @@ class FormDefPage(Directory):
self.formdefui.formdef.store()
return redirect('../%s/' % self.formdefui.formdef.id)
def get_check_count_before_deletion_message(self):
if not get_publisher().is_using_postgresql():
return None
from wcs import sql
criterias = [
Equal('formdef_id', self.formdefui.formdef.id),
NotEqual('status', 'draft'),
Equal('is_at_endpoint', False),
Null('anonymised'),
]
if sql.AnyFormData.count(criterias):
return _('Deletion is not possible as there are open forms.')
def delete(self):
form = Form(enctype='multipart/form-data')
form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
form.add_submit('delete', _('Delete'))
check_count_message = self.get_check_count_before_deletion_message()
if check_count_message:
form.widgets.append(HtmlWidget('<p>%s</p>' % check_count_message))
else:
form.widgets.append(HtmlWidget('<p>%s</p>' % _(self.delete_message)))
form.add_submit('delete', _('Delete'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
if form.get_widget('cancel').parse() or (form.is_submitted() and check_count_message):
return redirect('..')
if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete')))
@ -959,9 +977,6 @@ class FormDefPage(Directory):
r += form.render()
return r.getvalue()
else:
# XXX: remove form data
#for formdata in FormData.select(FormData.q.formdefID == self.formdef.id):
# formdata.destroySelf()
self.formdef.remove_self()
return redirect('..')

View File

@ -24,6 +24,7 @@ from quixote.html import TemplateIO, htmltext
from ..qommon import _, N_, misc
from ..qommon.misc import C_
from ..qommon.storage import NotEqual, Null
from wcs.carddef import CardDef
from wcs.roles import Role
@ -191,6 +192,16 @@ class CardDefPage(FormDefPage):
r += LoggedErrorsDirectory.errors_block(formdef_id=self.formdef.id)
return r.getvalue()
def get_check_count_before_deletion_message(self):
if not get_publisher().is_using_postgresql():
return None
criterias = [
NotEqual('status', 'draft'),
Null('anonymised'),
]
if self.formdef.data_class().count(criterias):
return _('Deletion is not possible as there are cards.')
class CardsDirectory(FormsDirectory):
_q_exports = ['', 'new', ('import', 'p_import')]