admin: check for contents before removal of forms/cards (#207)
This commit is contained in:
parent
f4886f5b0a
commit
fb1908b2ab
|
@ -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))
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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('..')
|
||||
|
||||
|
|
|
@ -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')]
|
||||
|
|
Loading…
Reference in New Issue