misc: use an afterjob for site import (#29945) #994

Merged
fpeters merged 1 commits from wip/29945-import-site-afterjob into main 2024-01-12 15:07:25 +01:00
4 changed files with 64 additions and 33 deletions

View File

@ -231,12 +231,14 @@ def test_settings_export_import(pub):
resp = app.get('/backoffice/settings/import')
resp.form['file'] = Upload('export.wcs', b'invalid content')
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert 'Error: Not a valid export file' in resp.text
resp = app.get('/backoffice/settings/import')
resp.form['file'] = Upload('export.wcs', zip_content.getvalue())
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert resp.pyquery('.afterjob').text() == 'completed'
resp = resp.click('Import report')
assert 'Imported successfully' in resp.text
assert '1 form</li>' in resp.text
assert '1 card</li>' in resp.text
@ -357,7 +359,7 @@ def test_settings_export_import(pub):
pub.role_class.wipe()
resp = app.get('/backoffice/settings/import')
resp.form['file'] = Upload('export.wcs', zip_content.getvalue())
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert 'Unknown referenced objects [Unknown roles: qux]' in resp
# unknown field block
@ -373,7 +375,7 @@ def test_settings_export_import(pub):
resp = app.get('/backoffice/settings/import')
resp.form['file'] = Upload('export.wcs', zip_content.getvalue())
resp.form['confirm'].checked = True
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert 'Unknown referenced objects [Unknown fields blocks: unknown]' in resp
# Unknown reference in blockdef
@ -392,7 +394,7 @@ def test_settings_export_import(pub):
zip_content = io.BytesIO(resp.body)
resp = app.get('/backoffice/settings/import')
resp.form['file'] = Upload('export.wcs', zip_content.getvalue())
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert 'Unknown referenced objects [Unknown datasources: foobar]' in resp
# check a backup of settings has been created

View File

@ -467,6 +467,7 @@ class SettingsDirectory(AccessControlled, Directory):
'debug_options',
'language',
('import', 'p_import'),
('import-report', 'import_report'),
'export',
'identification',
'sitename',
@ -882,28 +883,22 @@ class SettingsDirectory(AccessControlled, Directory):
r += htmltext('</div>')
return r.getvalue()
else:
reason = None
try:
results = self.import_submit(form)
results['mail_templates'] = results['mail-templates']
results['comment_templates'] = results['comment-templates']
except zipfile.BadZipfile:
results = None
reason = _('Not a valid export file')
except (BlockdefImportError, FormdefImportError, WorkflowImportError) as e:
results = None
msg = _(e.msg) % e.msg_args
if e.details:
msg += ' [%s]' % e.details
reason = _('Failed to import a workflow (%s); site import did not complete.') % (msg)
get_response().set_title(_('Import'))
return template.QommonTemplateResponse(
templates=['wcs/backoffice/settings/import.html'],
context={'results': results, 'error': reason},
)
job = SiteImportAfterJob(form.get_widget('file').parse().fp)
job = get_response().add_after_job(job)
job.store()
return redirect(job.get_processing_url())
def import_submit(self, form):
return get_publisher().import_zip(form.get_widget('file').parse().fp)
def import_report(self):
get_response().set_title(_('Import report'))
get_response().breadcrumb.append(('import-report', _('Import report')))
try:
job = AfterJob.get(get_request().form.get('job'))
except KeyError:
raise errors.TraversalError()
return template.QommonTemplateResponse(
templates=['wcs/backoffice/settings/import.html'],
context={'results': job.results},
)
def sitename(self):
form = Form(enctype='multipart/form-data')
@ -1479,3 +1474,40 @@ class SiteExporter:
job.file_content = self.get_export_file()
job.total_count = job.current_count
job.store()
class SiteImportAfterJob(AfterJob):
label = _('Importing site elements')
def __init__(self, fp, **kwargs):
super().__init__(site_import_zip_content=fp.read())
def execute(self):
error = None
try:
results = get_publisher().import_zip(io.BytesIO(self.kwargs['site_import_zip_content']))
results['mail_templates'] = results['mail-templates']
results['comment_templates'] = results['comment-templates']
except zipfile.BadZipfile:
results = None
error = _('Not a valid export file')
except (BlockdefImportError, FormdefImportError, WorkflowImportError) as e:
results = None
msg = _(e.msg) % e.msg_args
if e.details:
msg += ' [%s]' % e.details
error = _('Failed to import a workflow (%s); site import did not complete.') % msg
self.results = results
if error:
self.status = 'failed'
self.failure_label = str(_('Error: %s') % error)
def done_action_url(self):
return '/backoffice/settings/import-report?job=%s' % self.id
def done_action_label(self):
return _('Import report')
def done_button_attributes(self):
return {'data-redirect-auto': 'true'}

View File

@ -7,7 +7,7 @@
<div class="section">
<dl class="job-status">
<dt>{{ job.label }}</dt>
<dd><span class="afterjob" id="{{ job.id }}">{% trans job.status %}</span></dd>
<dd><span class="afterjob" id="{{ job.id }}">{% if job.failure_label %}{{ job.failure_label }}{% else %}{% trans job.status %}{% endif %}</span></dd>
</dl>
</div>

View File

@ -1,12 +1,10 @@
{% extends "wcs/backoffice/base.html" %}
{% load i18n %}
{% block appbar-title %}{% trans "Import" %}{% endblock %}
{% block appbar-title %}{% trans "Import report" %}{% endblock %}
{% block content %}
{% if error %}
<p>{% trans "Error:" %} {{ error }}</p>
{% else %}
<div class="bo-block">
<p>{% trans "Imported successfully:" %}</p>
<ul>
{% if results.formdefs %}
@ -64,7 +62,6 @@
<li>{% trans "Settings" %}</li>
{% endif %}
</ul>
{% endif %}
</div>
<p><a href=".">{% trans "Back" %}</a></p>
{% endblock %}