admin: archive formdata in an afterjob if there are too many of them

This commit is contained in:
Frédéric Péters 2012-10-02 10:53:56 +02:00
parent 69a9045b75
commit 71ecb4b2cc
1 changed files with 85 additions and 22 deletions

View File

@ -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: