Ignore:
Timestamp:
21 Sep 2012, 11:21:05 (12 years ago)
Author:
uli
Message:

Merge changes from uli-async-update back into trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py

    r9172 r9217  
    1818""" Viewing components for Kofa objects.
    1919"""
    20 import copy
    2120import csv
    2221import grok
     
    2423import re
    2524import sys
    26 import time
    27 import re
    2825from urllib import urlencode
    2926from zope import schema
     
    3532    getUtilitiesFor,
    3633    )
    37 #from zope.component.interfaces import Invalid
    3834from zope.event import notify
    39 from zope.securitypolicy.interfaces import (
    40     IPrincipalRoleManager, IPrincipalRoleMap)
     35from zope.securitypolicy.interfaces import IPrincipalRoleManager
    4136from zope.session.interfaces import ISession
    4237from zope.password.interfaces import IPasswordManager
    43 from waeup.kofa.browser import (
     38from waeup.kofa.browser.layout import (
    4439    KofaPage, KofaForm, KofaEditFormPage, KofaAddFormPage,
    4540    KofaDisplayFormPage, NullValidator)
     
    4843    IDepartment, IDepartmentAdd, ICourse, ICourseAdd, ICertificate,
    4944    ICertificateAdd, ICertificateCourse, ICertificateCourseAdd,
    50     ICaptchaManager)
     45    ICaptchaManager, IChangePassword)
    5146from waeup.kofa.browser.layout import jsaction, action, UtilityView
    52 from waeup.kofa.browser.resources import warning, datepicker, tabs, datatable
     47from waeup.kofa.browser.resources import (
     48    warning, tabs, datatable)
    5349from waeup.kofa.interfaces import MessageFactory as _
    5450from waeup.kofa.interfaces import(
     
    5652    IKofaXMLImporter, IKofaXMLExporter, IBatchProcessor,
    5753    ILocalRolesAssignable, DuplicationError, IConfigurationContainer,
    58     ISessionConfiguration, ISessionConfigurationAdd,
    59     IPasswordValidator, IContactForm, IKofaUtils, ICSVExporter,
    60     IChangePassword)
     54    ISessionConfiguration, ISessionConfigurationAdd, IJobManager,
     55    IPasswordValidator, IContactForm, IKofaUtils, ICSVExporter,)
    6156from waeup.kofa.permissions import (
    6257    get_users_with_local_roles, get_all_roles, get_all_users)
     58
    6359from waeup.kofa.students.catalog import search as searchstudents
    6460from waeup.kofa.university.catalog import search
    6561from waeup.kofa.university.vocabularies import course_levels
    6662from waeup.kofa.authentication import LocalRoleSetEvent
    67 #from waeup.kofa.widgets.restwidget import ReSTDisplayWidget
    6863from waeup.kofa.widgets.htmlwidget import HTMLDisplayWidget
    69 from waeup.kofa.authentication import get_principal_role_manager
    7064from waeup.kofa.utils.helpers import get_user_account
    7165from waeup.kofa.mandates.mandate import PasswordMandate
     
    797791    def delFiles(self, **data):
    798792        form = self.request.form
    799         logger = self.context.logger
    800793        if form.has_key('val_id'):
    801794            child_id = form['val_id']
     
    11961189        return False
    11971190
    1198     @property
    1199     def nextstep(self):
    1200         return self.url(self.context, '@@import4')
    1201 
    12021191    def update(self, headerfield=None, back2=None, cancel=None, proceed=None):
    12031192        datatable.need()
     
    13901379    label = _('Download portal data as CSV file')
    13911380    pnav = 0
    1392     export_button = _(u'Download')
     1381    export_button = _(u'Create CSV file')
     1382    _running_exports = None
    13931383
    13941384    def getExporters(self):
     
    13981388        return sorted(title_name_tuples)
    13991389
    1400     def update(self, export=None, exporter=None):
    1401         if None in (export, exporter):
    1402             return
    1403         self.redirect(
    1404             self.url(self.context, 'export.csv') + '?exporter=%s' % exporter)
     1390    def job_finished(self, status):
     1391        return status == 'completed'
     1392
     1393    def getRunningExports(self):
     1394        """Returns running exports as list of tuples.
     1395
     1396        Only exports triggered by the current user (identified by
     1397        principal.id) are returned.
     1398
     1399        Each tuple has the form (<STATUS>, <STATUS_TITLE>, <EXPORTER_NAME>).
     1400
     1401        ``STATUS``:
     1402           the status as machine readable string (something like
     1403           ``'completed'``)
     1404
     1405        ``STATUS_TITLE``:
     1406           status of export as translated string.
     1407
     1408        ``EXPORTER_NAME``:
     1409           string representing the exporter title used when triggering
     1410           the export job.
     1411        """
     1412        if self._running_exports is None:
     1413            self._running_exports = self._getRunningExports()
     1414        return self._running_exports
     1415
     1416    def _getRunningExports(self):
     1417        result = self.context.get_export_jobs_status(self.user_id)
     1418        return result
     1419
     1420    def update(self, export=None, start_export=None, exporter=None,
     1421               discard=None, download=None):
     1422        self.user_id = self.request.principal.id
     1423        if discard:
     1424            myjobs = self.context.get_running_export_jobs(self.user_id)
     1425            for entry in myjobs:
     1426                self.context.delete_export_entry(entry)
     1427                self.flash(_('Discarded export result'))
     1428            return
     1429        if download:
     1430            myjobs = self.context.get_running_export_jobs(self.user_id)
     1431            if not len(myjobs):
     1432                self.flash(_('This export was already discarded.'))
     1433                return
     1434            job_id = myjobs[0][0]
     1435            self.redirect(
     1436                self.url(self.context, 'export.csv') + '?job_id=%s' % job_id)
     1437            return
     1438        if None in (start_export, exporter):
     1439            return
     1440        job_id = self.context.start_export_job(
     1441            exporter, self.request.principal.id)
     1442        self.redirect(self.url(self.context, 'export'))
    14051443        return
    14061444
     
    14101448    grok.require('waeup.manageDataCenter')
    14111449
    1412     def render(self, exporter=None):
    1413         if exporter is None:
    1414             return
    1415         ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
    1416         self.context.logger.info(
    1417             '%s - exported: %s' % (ob_class, exporter))
    1418         exporter = getUtility(ICSVExporter, name=exporter)
    1419         csv_data = exporter.export_all(grok.getSite())
    1420         #csv_data.seek(0)
     1450    def render(self, exporter=None, job_id=None):
     1451
     1452        manager = getUtility(IJobManager)
     1453        job = manager.get(job_id)
     1454        if job is None:
     1455            return
     1456        if hasattr(job.result, 'traceback'):
     1457            # XXX: Some error happened. Do something more approriate here...
     1458            return
     1459        path = job.result
     1460        if not os.path.exists(path):
     1461            # XXX: Do something more appropriate here...
     1462            return
     1463        result = open(path, 'rb').read()
     1464        acronym = grok.getSite()['configuration'].acronym.replace(' ','')
     1465        filename = "%s_%s" % (acronym, os.path.basename(path))
    14211466        self.response.setHeader(
    14221467            'Content-Type', 'text/csv; charset=UTF-8')
    1423         acronym = grok.getSite()['configuration'].acronym.replace(' ','')
    1424         filename = "%s%s.csv" % (acronym, exporter.title.title().replace(' ',''))
    14251468        self.response.setHeader(
    1426             'Content-Disposition:', 'attachment; filename="%s' % filename)
    1427         return csv_data
     1469            'Content-Disposition', 'attachment; filename="%s' % filename)
     1470        # remove job and running_exports entry from context
     1471        self.context.delete_export_entry(
     1472            self.context.entry_from_job_id(job_id))
     1473        return result
    14281474
    14291475class ExportXMLPage(grok.View):
Note: See TracChangeset for help on using the changeset viewer.