Projet

Général

Profil

0002_remove_archive_feature.patch

mise à jour en suivant le master - Jérôme Schneider, 14 janvier 2014 12:38

Télécharger (6,39 ko)

Voir les différences:


  

wcs/admin/forms.py
206 206

  
207 207
class FormDefPage(Directory):
208 208
    _q_exports = ['', 'fields', 'delete', 'duplicate', 'export',
209
                  'archive', 'invite', 'enable', 'workflow', 'category',
209
                  'invite', 'enable', 'workflow', 'category',
210 210
                  'role', ('workflow-options', 'workflow_options'),
211 211
                  ('workflow-status-remapping', 'workflow_status_remapping'),
212 212
                  'roles', 'title', 'options', ('acl-read', 'acl_read')]
......
381 381
        r += htmltext('<li><a href="duplicate">%s</a></li>') % _('Duplicate')
382 382
        if ET:
383 383
            r += htmltext('<li><a href="export">%s</a></li>') % _('Export')
384
        if not (get_publisher().has_site_option('postgresql') and get_cfg('postgresql', {})):
385
            r += htmltext('<li><a href="archive">%s</a></li>') % _('Archive')
386 384
        if self.formdef.roles:
387 385
            r += htmltext('<li><a href="invite">%s</a></li>') % _('Invites')
388 386
        r += htmltext('</ul>')
......
713 711
                'attachment; filename=%s.wcs' % self.formdef.url_name)
714 712
        return '<?xml version="1.0" encoding="iso-8859-15"?>\n' + ET.tostring(x)
715 713

  
716
    def archive(self):
717
        if get_publisher().has_site_option('postgresql') and get_cfg('postgresql', {}):
718
            raise TraversalError()
719

  
720
        if get_request().form.get('job'):
721
            return self.archive_processing()
722
        if get_request().form.get('download'):
723
            return self.archive_download()
724

  
725
        form = Form(enctype='multipart/form-data')
726

  
727
        form.add(DateWidget, 'date', title = _('Archive forms handled before'))
728
        form.add(CheckboxWidget, 'not-done', title = _('Include forms that have not been handled'),
729
                value = False)
730
        form.add(CheckboxWidget, 'keep', title = _('Do not remove forms'),
731
                value = False)
732
        form.add_submit('submit', _('Submit'))
733
        form.add_submit('cancel', _('Cancel'))
734

  
735
        if form.get_widget('cancel').parse():
736
            return redirect('.')
737

  
738
        if not form.is_submitted() or form.has_errors():
739
            get_response().breadcrumb.append(('archive', _('Archive')))
740
            html_top('forms', title = _('Archive Forms'))
741
            r = TemplateIO(html=True)
742
            r += htmltext('<h2>%s</h2>') % _('Archive Forms')
743
            r += form.render()
744
            return r.getvalue()
745
        else:
746
            return self.archive_submit(form)
747

  
748
    def archive_submit(self, form):
749

  
750
        class Archiver:
751
            def __init__(self, formdef):
752
                self.formdef = formdef
753

  
754
            def archive(self, job=None):
755
                all_forms = self.formdef.data_class().select()
756

  
757
                if form.get_widget('not-done').parse() is False:
758
                    not_endpoint_status = self.formdef.workflow.get_not_endpoint_status()
759
                    not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
760
                    all_forms = [x for x in all_forms if x.status not in not_endpoint_status_ids]
761

  
762
                if form.get_widget('date').parse():
763
                    date = form.get_widget('date').parse()
764
                    date = time.strptime(date, misc.date_format())
765
                    all_forms = [x for x in all_forms if (
766
                        x.evolution and x.evolution[-1].time < date) or (
767
                        x.receipt_time < date)]
768

  
769
                self.fd = StringIO()
770
                t = tarfile.open('wcs.tar.gz', 'w:gz', fileobj=self.fd)
771
                t.add(self.formdef.get_object_filename(), 'formdef')
772
                for formdata in all_forms:
773
                    t.add(formdata.get_object_filename(), '%s/%s' % (self.formdef.url_name, str(formdata.id)))
774
                t.close()
775

  
776
                if form.get_widget('keep').parse() is False:
777
                    for f in all_forms:
778
                        f.remove_self()
779

  
780
                if job:
781
                    job.file_content = self.fd.getvalue()
782
                    job.store()
783

  
784
        count = self.formdef.data_class().count()
785
        archiver = Archiver(self.formdef)
786
        if count > 100: # Arbitrary threshold
787
            job = get_response().add_after_job(
788
                str(N_('Archiving forms')),
789
                archiver.archive)
790
            return redirect('archive?job=%s' % job.id)
791
        else:
792
            archiver.archive()
793

  
794
            response = get_response()
795
            response.set_content_type('application/x-wcs-archive')
796
            response.set_header('content-disposition',
797
                'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
798
            return archiver.fd.getvalue()
799

  
800
    def archive_processing(self):
801
        try:
802
            job = AfterJob.get(get_request().form.get('job'))
803
        except KeyError:
804
            return redirect('.')
805

  
806
        html_top('forms', title=_('Archiving'))
807
        r = TemplateIO(html=True)
808
        r += get_session().display_message()
809
        get_response().add_javascript(['jquery.js', 'afterjob.js'])
810
        r += htmltext('<dl class="job-status">')
811
        r += htmltext('<dt>')
812
        r += _(job.label)
813
        r += htmltext('</dt>')
814
        r += htmltext('<dd>')
815
        r += htmltext('<span class="afterjob" id="%s">') % job.id
816
        r += _(job.status)
817
        r += htmltext('</span>')
818
        r += htmltext('</dd>')
819
        r += htmltext('</dl>')
820

  
821
        r += htmltext('<div class="done">')
822
        r += htmltext('<a href="archive?download=%s">%s</a>') % (job.id, _('Download Archive'))
823
        r += htmltext('</div>')
824
        return r.getvalue()
825

  
826
    def archive_download(self):
827
        try:
828
            job = AfterJob.get(get_request().form.get('download'))
829
        except KeyError:
830
            return redirect('.')
831

  
832
        if not job.status == 'completed':
833
            raise TraversalError()
834
        response = get_response()
835
        response.set_content_type('application/x-wcs-archive')
836
        response.set_header('content-disposition',
837
            'attachment; filename=%s-archive.wcs' % self.formdef.url_name)
838
        return job.file_content
839

  
840 714
    def invite(self):
841 715
        if not self.formdef.roles:
842 716
            return template.error_page(