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

Merge changes from trunk, r8786-HEAD

Location:
main/waeup.kofa/branches/uli-async-update
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/branches/uli-async-update

  • main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/pages.py

    r9166 r9169  
    2626import time
    2727import re
     28from urllib import urlencode
    2829from zope import schema
    2930from zope.authentication.interfaces import (
     
    3940    IPrincipalRoleManager, IPrincipalRoleMap)
    4041from zope.session.interfaces import ISession
     42from zope.password.interfaces import IPasswordManager
    4143from waeup.kofa.browser.layout import (
    4244    KofaPage, KofaForm, KofaEditFormPage, KofaAddFormPage,
     
    6769from waeup.kofa.widgets.htmlwidget import HTMLDisplayWidget
    6870from waeup.kofa.authentication import get_principal_role_manager
    69 from waeup.kofa.utils.helpers import get_user_account, msave
     71from waeup.kofa.utils.helpers import get_user_account
     72from waeup.kofa.mandates.mandate import PasswordMandate
    7073
    7174grok.context(IKofaObject)
     
    156159    return
    157160
     161# Save function used for save methods in pages
     162def msave(view, **data):
     163    changed_fields = view.applyData(view.context, **data)
     164    # Turn list of lists into single list
     165    if changed_fields:
     166        changed_fields = reduce(lambda x,y: x+y, changed_fields.values())
     167    fields_string = ' + '.join(changed_fields)
     168    view.flash(_('Form has been saved.'))
     169    ob_class = view.__implemented__.__name__.replace('waeup.kofa.','')
     170    if fields_string:
     171        grok.getSite().logger.info('%s - %s - saved: %s' % (ob_class, view.context.__name__, fields_string))
     172    return
     173
    158174#
    159175# Login/logout and language switch pages...
     
    192208                self.redirect(self.camefrom)
    193209                return
    194             self.flash(_('You entered wrong credentials.'))
     210            # Display appropriate flash message if credentials are correct
     211            # but student has been deactivated.
     212            login = self.request.form['form.login']
     213            if len(login) == 8 and grok.getSite()['students'].has_key(login):
     214                student = grok.getSite()['students'][
     215                    self.request.form['form.login']]
     216                password = self.request.form['form.password']
     217                passwordmanager = getUtility(IPasswordManager, 'SSHA')
     218                if passwordmanager.checkPassword(student.password, password):
     219                    self.flash(_('Your account has been deactivated.'))
     220                    return
     221            self.flash(_('You entered invalid credentials.'))
    195222
    196223
     
    372399    def entries(self):
    373400        return ()
    374 
    375 class ReindexPage(UtilityView, grok.View):
    376     """ Reindex view.
    377 
    378     Reindexes a catalog. For managers only.
    379     """
    380     grok.context(IUniversity)
    381     grok.name('reindex')
    382     grok.require('waeup.managePortal')
    383 
    384     def update(self,ctlg=None):
    385         if ctlg is None:
    386             self.flash('No catalog name provided.')
    387             return
    388         cat = queryUtility(ICatalog, name='%s_catalog' % ctlg)
    389         if cat is None:
    390             self.flash('%s_catalog does not exist' % ctlg)
    391             return
    392         self.context.logger.info(
    393             'Catalog `%s_catalog` re-indexing started.' % ctlg)
    394         cat.updateIndexes()
    395         no_of_entries = cat.values()[0].documentCount()
    396         self.flash('%d %s re-indexed.' % (no_of_entries,ctlg))
    397         self.context.logger.info(
    398             'Re-indexing of %d objects finished.' % no_of_entries)
    399         return
    400 
    401     def render(self):
    402         self.redirect(self.url(self.context, '@@index'))
    403         return
    404401
    405402#
     
    826823        return
    827824
     825class DatacenterFinishedPage(KofaEditFormPage):
     826    grok.context(IDataCenter)
     827    grok.name('processed')
     828    grok.require('waeup.manageDataCenter')
     829    label = _(u'Processed Files')
     830    pnav = 0
     831
     832    def update(self):
     833        datatable.need()
     834        return super(DatacenterFinishedPage, self).update()
     835
    828836class DatacenterUploadPage(KofaPage):
    829837    grok.context(IDataCenter)
    830838    grok.name('upload')
    831839    grok.require('waeup.manageDataCenter')
    832     label = _(u'Upload file')
     840    label = _(u'Upload portal data as CSV file')
    833841    pnav = 0
    834842    upload_button =_(u'Upload')
     
    849857                self.flash(_("Only csv files are allowed."))
    850858                return
    851             target = os.path.join(self.context.storage,
    852                                   self.getNormalizedFileName(filename))
     859            normalized_filename = self.getNormalizedFileName(filename)
     860            finished_file = os.path.join(
     861                self.context.storage, 'finished', normalized_filename)
     862            unfinished_file = os.path.join(
     863                self.context.storage, 'unfinished', normalized_filename)
     864            if os.path.exists(finished_file) or os.path.exists(unfinished_file):
     865                self.flash(_("File with same name was uploaded earlier."))
     866                return
     867            target = os.path.join(self.context.storage, normalized_filename)
    853868            open(target, 'wb').write(uploadfile.read())
    854869            os.chmod(target, 0664)
     
    881896        return '%s_%s%s' % (base, filtered_username, ext.lower())
    882897
     898    def getImporters(self):
     899        importers = getAllUtilitiesRegisteredFor(IBatchProcessor)
     900        importer_props = []
     901        for x in importers:
     902            iface_fields = schema.getFields(x.iface)
     903            available_fields = []
     904            for key in iface_fields.keys():
     905                iface_fields[key] = (iface_fields[key].__class__.__name__,
     906                    iface_fields[key].required)
     907            for value in x.available_fields:
     908                available_fields.append(
     909                    dict(f_name=value,
     910                         f_type=iface_fields.get(value, (None, False))[0],
     911                         f_required=iface_fields.get(value, (None, False))[1]
     912                         )
     913                    )
     914            available_fields = sorted(available_fields, key=lambda k: k['f_name'])
     915            importer_props.append(
     916                dict(title=x.name, name=x.util_name, fields=available_fields))
     917        return sorted(importer_props, key=lambda k: k['title'])
     918
    883919class FileDownloadView(UtilityView, grok.View):
    884920    grok.context(IDataCenter)
     
    897933            'Content-Type', 'text/csv; charset=UTF-8')
    898934        self.response.setHeader(
    899             'Content-Disposition:', 'attachment; filename="%s.csv' %
    900             self.filename.replace('.csv',''))
     935            'Content-Disposition:', 'attachment; filename="%s' %
     936            self.filename.replace('finished/',''))
    901937        fullpath = os.path.join(self.context.storage, self.filename)
    902938        return open(fullpath, 'rb').read()
     939
     940class SkeletonDownloadView(UtilityView, grok.View):
     941    grok.context(IDataCenter)
     942    grok.name('skeleton')
     943    grok.require('waeup.manageDataCenter')
     944
     945    def update(self, processorname=None):
     946        self.processorname = self.request.form['name']
     947        self.filename = ('%s_000.csv' %
     948            self.processorname.replace('processor','import'))
     949        return
     950
     951    def render(self):
     952        #ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
     953        #self.context.logger.info(
     954        #    '%s - skeleton downloaded: %s' % (ob_class, self.filename))
     955        self.response.setHeader(
     956            'Content-Type', 'text/csv; charset=UTF-8')
     957        self.response.setHeader(
     958            'Content-Disposition:', 'attachment; filename="%s' % self.filename)
     959        processor = getUtility(IBatchProcessor, name=self.processorname)
     960        csv_data = processor.get_csv_skeleton()
     961        return csv_data
    903962
    904963class DatacenterImportStep1(KofaPage):
     
    914973
    915974    def getFiles(self):
    916         files = self.context.getFiles(sort='date')
     975        files = self.context.getPendingFiles(sort='date')
    917976        for file in files:
    918977            name = file.name
     
    14261485            return
    14271486        result = open(path, 'rb').read()
     1487        acronym = grok.getSite()['configuration'].acronym.replace(' ','')
     1488        filename = "%s%s.csv" % (
     1489            acronym, exporter.title.title().replace(' ',''))
     1490        self.response.setHeader(
     1491            'Content-Disposition:', 'attachment; filename="%s' % filename)
    14281492        self.response.setHeader(
    14291493            'Content-Type', 'text/csv; charset=UTF-8')
     
    19872051    grok.template('certificatemanagepage')
    19882052    taboneactions = [_('Save'),_('Cancel')]
    1989     tabtwoactions = [_('Add course referrer'),
    1990                      _('Remove selected course referrers'),_('Cancel')]
     2053    tabtwoactions = [_('Add certificate course'),
     2054                     _('Remove selected certificate courses'),_('Cancel')]
    19912055    tabthreeactions1 = [_('Remove selected local roles')]
    19922056    tabthreeactions2 = [_('Add local role')]
     
    20112075        return msave(self, **data)
    20122076
    2013     @jsaction(_('Remove selected course referrers'))
     2077    @jsaction(_('Remove selected certificate courses'))
    20142078    def delCertificateCourses(self, **data):
    20152079        delSubobjects(self, redirect='@@manage', tab='2')
    20162080        return
    20172081
    2018     @action(_('Add course referrer'), validator=NullValidator)
     2082    @action(_('Add certificate course'), validator=NullValidator)
    20192083    def addCertificateCourse(self, **data):
    20202084        self.redirect(self.url(self.context, 'addcertificatecourse'))
     
    20532117    form_fields = grok.AutoFields(ICertificateCourseAdd)
    20542118    pnav = 1
    2055     label = _('Add course referrer')
    2056 
    2057     @action(_('Add course referrer'))
     2119    label = _('Add certificate course')
     2120
     2121    @action(_('Add certificate course'))
    20582122    def addCertcourse(self, **data):
    20592123        try:
    2060             self.context.addCourseRef(**data)
     2124            self.context.addCertCourse(**data)
    20612125        except KeyError:
    2062             self.status = self.flash(_('The chosen course referrer is already '
     2126            self.status = self.flash(_('The chosen certificate course is already '
    20632127                                  'part of this certificate.'))
    20642128            return
    20652129        self.status = self.flash(
    2066             _("Course referrer ${a}_${b} added.",
     2130            _("certificate course ${a}_${b} added.",
    20672131            mapping = {'a': data['course'].code, 'b': data['level']}))
    20682132        code = "%s_%s" % (data['course'].code, data['level'])
     
    21052169    grok.require('waeup.manageAcademics')
    21062170    form_fields = grok.AutoFields(ICertificateCourse)
    2107     label = _('Edit course referrer')
     2171    label = _('Edit certificate course')
    21082172    pnav = 1
    21092173
     
    21182182            old_level = self.context.level
    21192183            data['course'] = self.context.course
    2120             parent.addCourseRef(**data)
    2121             parent.delCourseRef(data['course'].code, level=old_level)
     2184            parent.addCertCourse(**data)
     2185            parent.delCertCourse(data['course'].code, level=old_level)
    21222186            self.flash(_('Form has been saved.'))
    21232187            old_code = "%s_%s" % (data['course'].code, old_level)
     
    21932257        # Change password
    21942258        kofa_utils = getUtility(IKofaUtils)
    2195         pwd = kofa_utils.genPassword()
    2196         IUserAccount(user).setPassword(pwd)
    2197         # Send email with new redentials
    2198         msg = _('You have successfully changed your password for the')
    2199         login_url = self.url(grok.getSite(), 'login')
     2259        password = kofa_utils.genPassword()
     2260        mandate = PasswordMandate()
     2261        mandate.params['password'] = password
     2262        mandate.params['user'] = user
     2263        site = grok.getSite()
     2264        site['mandates'].addMandate(mandate)
     2265        # Send email with credentials
     2266        args = {'mandate_id':mandate.mandate_id}
     2267        mandate_url = self.url(site) + '/mandate?%s' % urlencode(args)
     2268        url_info = u'Confirmation link: %s' % mandate_url
     2269        msg = _('You have successfully requested a password for the')
    22002270        success = kofa_utils.sendCredentials(
    2201             IUserAccount(user),pwd,login_url,msg)
     2271            IUserAccount(user),password,url_info,msg)
    22022272        if success:
    22032273            self.flash(_('An email with your user name and password ' +
Note: See TracChangeset for help on using the changeset viewer.