backoffice: add button to overwrite a block (#60722)

This commit is contained in:
Frédéric Péters 2024-03-02 09:39:46 +01:00
parent b3fb9a87cc
commit d2e44d9ecb
2 changed files with 94 additions and 1 deletions

View File

@ -257,6 +257,55 @@ def test_block_delete(pub):
assert 'This block is still used' in resp
def test_block_export_overwrite(pub):
create_superuser(pub)
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [fields.StringField(id='123', required=True, label='Test')]
block.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/blocks/%s/' % block.id)
resp = resp.click(href=re.compile('^export$'))
xml_export = resp.text
block.slug = 'new-slug'
block.name = 'New foobar'
block.fields = [fields.StringField(id='123', required=True, label='Test bebore overwrite')]
block.store()
resp = app.get('/backoffice/forms/blocks/%s/' % block.id)
resp = resp.click('Overwrite')
resp = resp.form.submit('cancel').follow()
resp = resp.click('Overwrite')
resp = resp.form.submit()
assert 'There were errors processing your form.' in resp
resp.form['file'] = Upload('block', xml_export.encode('utf-8'))
resp = resp.form.submit()
resp = resp.follow()
assert BlockDef.count() == 1
block.refresh_from_storage()
assert block.fields[0].label == 'Test'
assert block.name == 'foobar'
assert block.slug == 'new-slug' # not overwritten
# unknown reference
block.fields = [fields.StringField(id='1', data_source={'type': 'foobar'})]
block.store()
resp = app.get('/backoffice/forms/blocks/%s/' % block.id)
resp = resp.click(href=re.compile('^export$'))
xml_export = resp.text
resp = app.get('/backoffice/forms/blocks/%s/' % block.id)
resp = resp.click('Overwrite')
resp.form['file'] = Upload('block', xml_export.encode('utf-8'))
resp = resp.form.submit()
assert 'Invalid File (Unknown referenced objects)' in resp
assert '<ul><li>Unknown datasources: foobar</li></ul>' in resp
def test_block_edit_duplicate_delete_field(pub):
create_superuser(pub)
BlockDef.wipe()

View File

@ -54,6 +54,7 @@ class BlockDirectory(FieldsDirectory):
'inspect',
'duplicate',
('history', 'snapshots_dir'),
'overwrite',
]
field_def_page_class = BlockFieldDefPage
blacklisted_types = ['page', 'table', 'table-select', 'tablerows', 'ranked-items', 'blocks', 'computed']
@ -150,6 +151,9 @@ class BlockDirectory(FieldsDirectory):
r += htmltext('<li><a class="button button-paragraph" href="history/save">%s</a>') % _(
'Save snapshot'
)
r += htmltext('<li><a class="button button-paragraph" rel="popup" href="overwrite">%s</a>') % _(
'Overwrite'
)
r += htmltext('</ul>')
r += htmltext('<h3>%s</h3>') % _('Navigation')
r += htmltext('<ul class="sidebar--buttons">')
@ -222,6 +226,41 @@ class BlockDirectory(FieldsDirectory):
content_type='application/x-wcs-form',
)
def overwrite(self):
form = Form(enctype='multipart/form-data')
form.widgets.append(
HtmlWidget(
'<div class="warningnotice"><p>%s</p></div>'
% _('Field data will be lost if overwriting with an incompatible block.')
)
)
form.add(FileWidget, 'file', title=_('File'), required=True)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if form.is_submitted() and not form.has_errors():
try:
return self.overwrite_submit(form)
except ValueError:
pass
get_response().breadcrumb.append(('overwrite', _('Overwrite')))
get_response().set_title(title=_('Overwrite'))
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Overwrite')
r += form.render()
return r.getvalue()
def overwrite_submit(self, form):
blockdef = BlocksDirectory.import_blockdef(form)
self.objectdef.name = blockdef.name
self.objectdef.digest_template = blockdef.digest_template
self.objectdef.fields = blockdef.fields
self.objectdef.store(comment=_('Overwritten'))
return redirect('.')
def settings(self):
get_response().breadcrumb.append(('settings', _('Settings')))
form = Form()
@ -422,7 +461,8 @@ class BlocksDirectory(Directory):
r += form.render()
return r.getvalue()
def import_submit(self, form):
@classmethod
def import_blockdef(cls, form):
fp = form.get_widget('file').parse().fp
error, reason = False, None
@ -446,6 +486,10 @@ class BlocksDirectory(Directory):
form.set_error('file', msg)
raise ValueError()
return blockdef
def import_submit(self, form):
blockdef = self.import_blockdef(form)
initial_blockdef_name = blockdef.name
blockdef_names = [x.name for x in BlockDef.select()]
copy_no = 1