admin: archive formdata in an afterjob if there are too many of them
This commit is contained in:
parent
69a9045b75
commit
71ecb4b2cc
|
@ -671,6 +671,11 @@ class FormDefPage(Directory):
|
|||
return '<?xml version="1.0" encoding="iso-8859-15"?>\n' + ET.tostring(x)
|
||||
|
||||
def archive [html] (self):
|
||||
if get_request().form.get('job'):
|
||||
return self.archive_processing()
|
||||
if get_request().form.get('download'):
|
||||
return self.archive_download()
|
||||
|
||||
form = Form(enctype='multipart/form-data')
|
||||
|
||||
form.add(DateWidget, 'date', title = _('Archive forms handled before'))
|
||||
|
@ -693,36 +698,94 @@ class FormDefPage(Directory):
|
|||
return self.archive_submit(form)
|
||||
|
||||
def archive_submit(self, form):
|
||||
all_forms = self.formdef.data_class().select()
|
||||
|
||||
if form.get_widget('not-done').parse() is False:
|
||||
not_endpoint_status = self.formdef.workflow.get_not_endpoint_status()
|
||||
not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
|
||||
all_forms = [x for x in all_forms if x.status not in not_endpoint_status_ids]
|
||||
class Archiver:
|
||||
def __init__(self, formdef):
|
||||
self.formdef = formdef
|
||||
|
||||
if form.get_widget('date').parse():
|
||||
date = form.get_widget('date').parse()
|
||||
date = time.strptime(date, misc.date_format())
|
||||
all_forms = [x for x in all_forms if (
|
||||
x.evolution and x.evolution[-1].time < date) or (
|
||||
x.receipt_time < date)]
|
||||
def archive(self, job=None):
|
||||
all_forms = self.formdef.data_class().select()
|
||||
|
||||
fd = StringIO()
|
||||
t = tarfile.open('wcs.tar.gz', 'w:gz', fileobj = fd)
|
||||
t.add(self.formdef.get_object_filename(), 'formdef')
|
||||
for formdata in all_forms:
|
||||
t.add(formdata.get_object_filename(), '%s/%s' % (self.formdef.url_name, str(formdata.id)))
|
||||
t.close()
|
||||
if form.get_widget('not-done').parse() is False:
|
||||
not_endpoint_status = self.formdef.workflow.get_not_endpoint_status()
|
||||
not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
|
||||
all_forms = [x for x in all_forms if x.status not in not_endpoint_status_ids]
|
||||
|
||||
if form.get_widget('keep').parse() is False:
|
||||
for f in all_forms:
|
||||
f.remove_self()
|
||||
if form.get_widget('date').parse():
|
||||
date = form.get_widget('date').parse()
|
||||
date = time.strptime(date, misc.date_format())
|
||||
all_forms = [x for x in all_forms if (
|
||||
x.evolution and x.evolution[-1].time < date) or (
|
||||
x.receipt_time < date)]
|
||||
|
||||
self.fd = StringIO()
|
||||
t = tarfile.open('wcs.tar.gz', 'w:gz', fileobj=self.fd)
|
||||
t.add(self.formdef.get_object_filename(), 'formdef')
|
||||
for formdata in all_forms:
|
||||
t.add(formdata.get_object_filename(), '%s/%s' % (self.formdef.url_name, str(formdata.id)))
|
||||
t.close()
|
||||
|
||||
if form.get_widget('keep').parse() is False:
|
||||
for f in all_forms:
|
||||
f.remove_self()
|
||||
|
||||
if job:
|
||||
job.file_content = self.fd.getvalue()
|
||||
job.store()
|
||||
|
||||
count = self.formdef.data_class().count()
|
||||
archiver = Archiver(self.formdef)
|
||||
if count > 100: # Arbitrary threshold
|
||||
job = get_response().add_after_job(
|
||||
str(N_('Archiving forms')),
|
||||
archiver.archive)
|
||||
return redirect('archive?job=%s' % job.id)
|
||||
else:
|
||||
archiver.archive()
|
||||
|
||||
response = get_response()
|
||||
response.set_content_type('application/x-wcs-archive')
|
||||
response.set_header('content-disposition',
|
||||
'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
|
||||
return archiver.fd.getvalue()
|
||||
|
||||
def archive_processing [html] (self):
|
||||
try:
|
||||
job = AfterJob.get(get_request().form.get('job'))
|
||||
except KeyError:
|
||||
return redirect('.')
|
||||
|
||||
html_top('forms', title=_('Archiving'))
|
||||
get_session().display_message()
|
||||
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
||||
'<dl class="job-status">'
|
||||
'<dt>'
|
||||
_(job.label)
|
||||
'</dt>'
|
||||
'<dd>'
|
||||
'<span class="afterjob" id="%s">' % job.id
|
||||
_(job.status)
|
||||
'</span>'
|
||||
'</dd>'
|
||||
'</dl>'
|
||||
|
||||
'<div class="done">'
|
||||
'<a href="archive?download=%s">%s</a>' % (job.id, _('Download Archive'))
|
||||
'</div>'
|
||||
|
||||
def archive_download(self):
|
||||
try:
|
||||
job = AfterJob.get(get_request().form.get('download'))
|
||||
except KeyError:
|
||||
return redirect('.')
|
||||
|
||||
if not job.status == 'completed':
|
||||
raise TraversalError()
|
||||
response = get_response()
|
||||
response.set_content_type('application/x-wcs-archive')
|
||||
response.set_header('content-disposition',
|
||||
'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
|
||||
return fd.getvalue()
|
||||
'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
|
||||
return job.file_content
|
||||
|
||||
def invite [html] (self):
|
||||
if not self.formdef.roles:
|
||||
|
|
Loading…
Reference in New Issue