misc: use an afterjob for site import (#29945) #994
|
@ -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
|
||||
|
|
|
@ -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'}
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
Loading…
Reference in New Issue