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/students/browser.py

    r9166 r9169  
    4343from waeup.kofa.interfaces import (
    4444    IKofaObject, IUserAccount, IExtFileStore, IPasswordValidator, IContactForm,
    45     IKofaUtils, IUniversity)
     45    IKofaUtils, IUniversity, IObjectHistory)
    4646from waeup.kofa.interfaces import MessageFactory as _
    4747from waeup.kofa.widgets.datewidget import (
     
    5353    IUGStudentClearance,IPGStudentClearance,
    5454    IStudentPersonal, IStudentBase, IStudentStudyCourse,
     55    IStudentStudyCourseTransfer,
    5556    IStudentAccommodation, IStudentStudyLevel,
    5657    ICourseTicket, ICourseTicketAdd, IStudentPaymentsContainer,
    57     IStudentOnlinePayment, IBedTicket, IStudentsUtils, IStudentRequestPW
     58    IStudentOnlinePayment, IStudentPreviousPayment,
     59    IBedTicket, IStudentsUtils, IStudentRequestPW
    5860    )
    5961from waeup.kofa.students.catalog import search
    6062from waeup.kofa.students.workflow import (CREATED, ADMITTED, PAID,
    61     CLEARANCE, REQUESTED, RETURNING, CLEARED, REGISTERED, VALIDATED)
     63    CLEARANCE, REQUESTED, RETURNING, CLEARED, REGISTERED, VALIDATED,
     64    FORBIDDEN_POSTGRAD_TRANS)
    6265from waeup.kofa.students.studylevel import StudentStudyLevel, CourseTicket
    6366from waeup.kofa.students.vocabularies import StudyLevelSource
     
    6568from waeup.kofa.hostels.hostel import NOT_OCCUPIED
    6669from waeup.kofa.utils.helpers import get_current_principal, to_timezone
     70from waeup.kofa.mandates.mandate import PasswordMandate
    6771
    6872grok.context(IKofaObject) # Make IKofaObject the default context
     
    9195    return
    9296
     97def translated_values(view):
     98    lang = view.request.cookies.get('kofa.language')
     99    for value in view.context.values():
     100        value_dict = dict([i for i in value.__dict__.items()])
     101        value_dict['mandatory_bool'] = value.mandatory
     102        value_dict['mandatory'] = translate(str(value.mandatory), 'zope',
     103            target_language=lang)
     104        value_dict['carry_over'] = translate(str(value.carry_over), 'zope',
     105            target_language=lang)
     106        value_dict['automatic'] = translate(str(value.automatic), 'zope',
     107            target_language=lang)
     108        yield value_dict
     109
    93110class StudentsBreadcrumb(Breadcrumb):
    94111    """A breadcrumb for the students container.
     
    116133    """
    117134    grok.context(IStudentStudyCourse)
    118     title = _('Study Course')
     135
     136    def title(self):
     137        if self.context.is_current:
     138            return _('Study Course')
     139        else:
     140            return _('Previous Study Course')
    119141
    120142class PaymentsBreadcrumb(Breadcrumb):
     
    279301    grok.require('waeup.viewStudent')
    280302    grok.template('basepage')
    281     form_fields = grok.AutoFields(IStudentBase).omit('password')
     303    form_fields = grok.AutoFields(IStudentBase).omit('password', 'suspended')
    282304    pnav = 4
    283305
    284306    @property
    285307    def label(self):
    286         return _('${a}: Base Data',
     308        if self.context.suspended:
     309            return _('${a}: Base Data (account deactivated)',
     310                mapping = {'a':self.context.display_fullname})
     311        return  _('${a}: Base Data',
    287312            mapping = {'a':self.context.display_fullname})
    288313
     
    292317            return _('set')
    293318        return _('unset')
     319
     320class StudentBasePDFFormPage(KofaDisplayFormPage):
     321    """ Page to display student base data in pdf files.
     322    """
     323    form_fields = grok.AutoFields(IStudentBase).omit(
     324        'password', 'suspended', 'phone', 'adm_code', 'sex')
    294325
    295326class ContactStudentForm(ContactAdminForm):
     
    336367    grok.name('manage_base')
    337368    grok.require('waeup.manageStudent')
    338     form_fields = grok.AutoFields(IStudentBase).omit('student_id')
     369    form_fields = grok.AutoFields(IStudentBase).omit(
     370        'student_id', 'adm_code', 'suspended')
    339371    grok.template('basemanagepage')
    340372    label = _('Manage base data')
     
    362394        allowed_transitions = [t for t in self.wf_info.getManualTransitions()
    363395            if not t[0].startswith('pay')]
     396        if self.context.is_postgrad:
     397            allowed_transitions = [t for t in allowed_transitions
     398                if not t[0] in FORBIDDEN_POSTGRAD_TRANS]
    364399        return [dict(name='', title=_('No transition'))] +[
    365400            dict(name=x, title=y) for x, y in allowed_transitions]
     
    396431        return
    397432
     433class StudentActivatePage(UtilityView, grok.View):
     434    """ Activate student account
     435    """
     436    grok.context(IStudent)
     437    grok.name('activate')
     438    grok.require('waeup.manageStudent')
     439
     440    def update(self):
     441        self.context.suspended = False
     442        self.context.writeLogMessage(self, 'account activated')
     443        history = IObjectHistory(self.context)
     444        history.addMessage('Student account activated')
     445        self.flash(_('Student account has been activated.'))
     446        self.redirect(self.url(self.context))
     447        return
     448
     449    def render(self):
     450        return
     451
     452class StudentDeactivatePage(UtilityView, grok.View):
     453    """ Deactivate student account
     454    """
     455    grok.context(IStudent)
     456    grok.name('deactivate')
     457    grok.require('waeup.manageStudent')
     458
     459    def update(self):
     460        self.context.suspended = True
     461        self.context.writeLogMessage(self, 'account deactivated')
     462        history = IObjectHistory(self.context)
     463        history.addMessage('Student account deactivated')
     464        self.flash(_('Student account has been deactivated.'))
     465        self.redirect(self.url(self.context))
     466        return
     467
     468    def render(self):
     469        return
     470
    398471class StudentClearanceDisplayFormPage(KofaDisplayFormPage):
    399472    """ Page to display student clearance data
     
    411484    def form_fields(self):
    412485        if self.context.is_postgrad:
    413             form_fields = grok.AutoFields(IPGStudentClearance).omit('clearance_locked')
    414         else:
    415             form_fields = grok.AutoFields(IUGStudentClearance).omit('clearance_locked')
     486            form_fields = grok.AutoFields(
     487                IPGStudentClearance).omit('clearance_locked')
     488        else:
     489            form_fields = grok.AutoFields(
     490                IUGStudentClearance).omit('clearance_locked')
    416491        return form_fields
    417492
     
    432507    def form_fields(self):
    433508        if self.context.is_postgrad:
    434             form_fields = grok.AutoFields(IPGStudentClearance).omit('clearance_locked')
    435         else:
    436             form_fields = grok.AutoFields(IUGStudentClearance).omit('clearance_locked')
     509            form_fields = grok.AutoFields(
     510                IPGStudentClearance).omit('clearance_locked')
     511        else:
     512            form_fields = grok.AutoFields(
     513                IUGStudentClearance).omit('clearance_locked')
    437514        return form_fields
    438515
     
    446523    def label(self):
    447524        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
    448         return translate(_('Clearance Slip of '),
     525        return translate(_('Clearance Slip of'),
    449526            'waeup.kofa', target_language=portal_language) \
    450527            + ' %s' % self.context.display_fullname
    451528
     529    def _signatures(self):
     530        if self.context.state == CLEARED:
     531            return (_('Student Signature'), _('Clearance Officer Signature'))
     532        return
     533
    452534    def render(self):
    453         studentview = StudentBaseDisplayFormPage(self.context.student,
     535        studentview = StudentBasePDFFormPage(self.context.student,
    454536            self.request)
    455537        students_utils = getUtility(IStudentsUtils)
    456538        return students_utils.renderPDF(
    457539            self, 'clearance.pdf',
    458             self.context.student, studentview)
     540            self.context.student, studentview, signatures=self._signatures())
    459541
    460542class StudentClearanceManageFormPage(KofaEditFormPage):
     
    475557    def form_fields(self):
    476558        if self.context.is_postgrad:
    477             form_fields = grok.AutoFields(IPGStudentClearance)
    478         else:
    479             form_fields = grok.AutoFields(IUGStudentClearance)
     559            form_fields = grok.AutoFields(IPGStudentClearance).omit('clr_code')
     560        else:
     561            form_fields = grok.AutoFields(IUGStudentClearance).omit('clr_code')
    480562        return form_fields
    481563
     
    557639            mapping = {'a':self.context.display_fullname})
    558640
    559 class StudentPersonalEditFormPage(KofaEditFormPage):
    560     """ Page to edit personal data
     641class StudentPersonalManageFormPage(KofaEditFormPage):
     642    """ Page to manage personal data
    561643    """
    562644    grok.context(IStudent)
    563     grok.name('edit_personal')
    564     grok.require('waeup.handleStudent')
     645    grok.name('manage_personal')
     646    grok.require('waeup.manageStudent')
    565647    form_fields = grok.AutoFields(IStudentPersonal)
    566     label = _('Edit personal data')
     648    label = _('Manage personal data')
    567649    pnav = 4
    568650
     
    572654        return
    573655
     656class StudentPersonalEditFormPage(StudentPersonalManageFormPage):
     657    """ Page to edit personal data
     658    """
     659    grok.name('edit_personal')
     660    grok.require('waeup.handleStudent')
     661    label = _('Edit personal data')
     662    pnav = 4
     663
    574664class StudyCourseDisplayFormPage(KofaDisplayFormPage):
    575665    """ Page to display the student study course data
     
    578668    grok.name('index')
    579669    grok.require('waeup.viewStudent')
    580     form_fields = grok.AutoFields(IStudentStudyCourse)
    581670    grok.template('studycoursepage')
    582671    pnav = 4
    583672
    584673    @property
     674    def form_fields(self):
     675        if self.context.is_postgrad:
     676            form_fields = grok.AutoFields(IStudentStudyCourse).omit(
     677                'current_verdict', 'previous_verdict')
     678        else:
     679            form_fields = grok.AutoFields(IStudentStudyCourse)
     680        return form_fields
     681
     682    @property
    585683    def label(self):
    586         return _('${a}: Study Course',
    587             mapping = {'a':self.context.__parent__.display_fullname})
     684        if self.context.is_current:
     685            return _('${a}: Study Course',
     686                mapping = {'a':self.context.__parent__.display_fullname})
     687        else:
     688            return _('${a}: Previous Study Course',
     689                mapping = {'a':self.context.__parent__.display_fullname})
    588690
    589691    @property
     
    606708        return
    607709
     710    @property
     711    def prev_studycourses(self):
     712        if self.context.is_current:
     713            if self.context.__parent__.get('studycourse_2', None) is not None:
     714                return (
     715                        {'href':self.url(self.context.student) + '/studycourse_1',
     716                        'title':_('First Study Course, ')},
     717                        {'href':self.url(self.context.student) + '/studycourse_2',
     718                        'title':_('Second Study Course')}
     719                        )
     720            if self.context.__parent__.get('studycourse_1', None) is not None:
     721                return (
     722                        {'href':self.url(self.context.student) + '/studycourse_1',
     723                        'title':_('First Study Course')},
     724                        )
     725        return
     726
    608727class StudyCourseManageFormPage(KofaEditFormPage):
    609728    """ Page to edit the student study course data
     
    613732    grok.require('waeup.manageStudent')
    614733    grok.template('studycoursemanagepage')
    615     form_fields = grok.AutoFields(IStudentStudyCourse)
    616734    label = _('Manage study course')
    617735    pnav = 4
     
    620738    tabthreeactions = [_('Add study level')]
    621739
     740    @property
     741    def form_fields(self):
     742        if self.context.is_postgrad:
     743            form_fields = grok.AutoFields(IStudentStudyCourse).omit(
     744                'current_verdict', 'previous_verdict')
     745        else:
     746            form_fields = grok.AutoFields(IStudentStudyCourse)
     747        return form_fields
     748
    622749    def update(self):
     750        if not self.context.is_current:
     751            emit_lock_message(self)
     752            return
    623753        super(StudyCourseManageFormPage, self).update()
    624754        tabs.need()
     
    685815        return
    686816
     817class StudentTransferFormPage(KofaAddFormPage):
     818    """Page to transfer the student.
     819    """
     820    grok.context(IStudent)
     821    grok.name('transfer')
     822    grok.require('waeup.manageStudent')
     823    label = _('Transfer student')
     824    form_fields = grok.AutoFields(IStudentStudyCourseTransfer).omit(
     825        'entry_mode', 'entry_session')
     826    pnav = 4
     827
     828    def update(self):
     829        super(StudentTransferFormPage, self).update()
     830        warning.need()
     831        return
     832
     833    @jsaction(_('Transfer'))
     834    def transferStudent(self, **data):
     835        error = self.context.transfer(**data)
     836        if error == -1:
     837            self.flash(_('Current level does not match certificate levels.'))
     838        elif error == -2:
     839            self.flash(_('Former study course record incomplete.'))
     840        elif error == -3:
     841            self.flash(_('Maximum number of transfers exceeded.'))
     842        else:
     843            self.flash(_('Successfully transferred.'))
     844        return
     845
    687846class StudyLevelDisplayFormPage(KofaDisplayFormPage):
    688847    """ Page to display student study levels
     
    692851    grok.require('waeup.viewStudent')
    693852    form_fields = grok.AutoFields(IStudentStudyLevel)
     853    form_fields[
     854        'validation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
    694855    grok.template('studylevelpage')
    695856    pnav = 4
     
    702863    @property
    703864    def translated_values(self):
    704         lang = self.request.cookies.get('kofa.language')
    705         for value in self.context.values():
    706             value_dict = dict([i for i in value.__dict__.items()])
    707             value_dict['mandatory'] = translate(str(value.mandatory), 'zope',
    708                 target_language=lang)
    709             value_dict['carry_over'] = translate(str(value.carry_over), 'zope',
    710                 target_language=lang)
    711             value_dict['automatic'] = translate(str(value.automatic), 'zope',
    712                 target_language=lang)
    713             yield value_dict
     865        return translated_values(self)
    714866
    715867    @property
     
    771923        Mand = translate(_('Mand.'), 'waeup.kofa', target_language=portal_language)
    772924        Score = translate(_('Score'), 'waeup.kofa', target_language=portal_language)
    773         studentview = StudentBaseDisplayFormPage(self.context.student,
     925        studentview = StudentBasePDFFormPage(self.context.student,
    774926            self.request)
    775927        students_utils = getUtility(IStudentsUtils)
     
    796948    grok.require('waeup.manageStudent')
    797949    grok.template('studylevelmanagepage')
    798     form_fields = grok.AutoFields(IStudentStudyLevel)
     950    form_fields = grok.AutoFields(IStudentStudyLevel).omit(
     951        'validation_date', 'validated_by')
    799952    pnav = 4
    800953    taboneactions = [_('Save'),_('Cancel')]
     
    803956
    804957    def update(self):
     958        if not self.context.__parent__.is_current:
     959            emit_lock_message(self)
     960            return
    805961        super(StudyLevelManageFormPage, self).update()
    806962        tabs.need()
     
    813969        datatable.need()
    814970        return
     971
     972    @property
     973    def translated_values(self):
     974        return translated_values(self)
    815975
    816976    @property
     
    8611021
    8621022    def update(self):
     1023        if not self.context.__parent__.is_current:
     1024            emit_lock_message(self)
     1025            return
    8631026        if str(self.context.__parent__.current_level) != self.context.__name__:
    8641027            self.flash(_('This level does not correspond current level.'))
     
    8831046
    8841047    def update(self):
     1048        if not self.context.__parent__.is_current:
     1049            emit_lock_message(self)
     1050            return
    8851051        if str(self.context.__parent__.current_level) != self.context.__name__:
    8861052            self.flash(_('This level does not correspond current level.'))
     
    9181084    pnav = 4
    9191085
     1086    def update(self):
     1087        if not self.context.__parent__.is_current:
     1088            emit_lock_message(self)
     1089            return
     1090        super(CourseTicketAddFormPage, self).update()
     1091        return
     1092
    9201093    @action(_('Add course ticket'))
    9211094    def addCourseTicket(self, **data):
     
    9241097        ticket.automatic = False
    9251098        ticket.carry_over = False
    926         ticket.code = course.code
    927         ticket.title = course.title
    928         ticket.fcode = course.__parent__.__parent__.__parent__.code
    929         ticket.dcode = course.__parent__.__parent__.code
    930         ticket.credits = course.credits
    931         ticket.passmark = course.passmark
    932         ticket.semester = course.semester
    9331099        try:
    934             self.context.addCourseTicket(ticket)
     1100            self.context.addCourseTicket(ticket, course)
    9351101        except KeyError:
    9361102            self.flash(_('The ticket exists.'))
     
    10301196                mapping = {'a': ', '.join(deleted)}))
    10311197            self.context.writeLogMessage(
    1032                 self,'removed: % s' % ', '.join(deleted))
     1198                self,'removed: %s' % ', '.join(deleted))
    10331199        self.redirect(self.url(self.context))
    10341200        return
     
    10521218    def createTicket(self, **data):
    10531219        p_category = data['p_category']
     1220        previous_session = data.get('p_session', None)
     1221        previous_level = data.get('p_level', None)
    10541222        student = self.context.__parent__
    10551223        if p_category == 'bed_allocation' and student[
     
    10621230                return
    10631231        students_utils = getUtility(IStudentsUtils)
    1064         error, payment = students_utils.setPaymentDetails(p_category, student)
     1232        error, payment = students_utils.setPaymentDetails(
     1233            p_category, student, previous_session, previous_level)
    10651234        if error is not None:
    10661235            self.flash(error)
     1236            if 'Would you like' in error:
     1237                self.redirect(self.url(self.context) + '/@@addpp')
     1238                return
    10671239            self.redirect(self.url(self.context))
    10681240            return
     
    10711243        self.redirect(self.url(self.context))
    10721244        return
     1245
     1246class PreviousPaymentAddFormPage(OnlinePaymentAddFormPage):
     1247    """ Page to add an online payment ticket for previous sessions
     1248    """
     1249    grok.context(IStudentPaymentsContainer)
     1250    grok.name('addpp')
     1251    grok.require('waeup.payStudent')
     1252    form_fields = grok.AutoFields(IStudentPreviousPayment).select(
     1253        'p_category', 'p_session', 'p_level')
     1254    label = _('Add previous session online payment')
     1255    pnav = 4
    10731256
    10741257class OnlinePaymentDisplayFormPage(KofaDisplayFormPage):
     
    11491332        #    self.redirect(self.url(self.context))
    11501333        #    return
    1151         studentview = StudentBaseDisplayFormPage(self.context.student,
     1334        studentview = StudentBasePDFFormPage(self.context.student,
    11521335            self.request)
    11531336        students_utils = getUtility(IStudentsUtils)
     
    13691552
    13701553    def render(self):
    1371         studentview = StudentBaseDisplayFormPage(self.context.student,
     1554        studentview = StudentBasePDFFormPage(self.context.student,
    13721555            self.request)
    13731556        students_utils = getUtility(IStudentsUtils)
     
    15691752            self.flash(_('Activation code is invalid.'))
    15701753            return
     1754        if code.state == USED:
     1755            self.flash(_('Activation code has already been used.'))
     1756            return
    15711757        # Mark pin as used (this also fires a pin related transition)
    15721758        # and fire transition start_clearance
    1573         if code.state == USED:
    1574             self.flash(_('Activation code has already been used.'))
    1575             return
    1576         else:
    1577             comment = _(u"invalidated")
    1578             # Here we know that the ac is in state initialized so we do not
    1579             # expect an exception, but the owner might be different
    1580             if not invalidate_accesscode(pin,comment,self.context.student_id):
    1581                 self.flash(_('You are not the owner of this access code.'))
    1582                 return
    1583             self.context.clr_code = pin
     1759        comment = _(u"invalidated")
     1760        # Here we know that the ac is in state initialized so we do not
     1761        # expect an exception, but the owner might be different
     1762        if not invalidate_accesscode(pin, comment, self.context.student_id):
     1763            self.flash(_('You are not the owner of this access code.'))
     1764            return
     1765        self.context.clr_code = pin
    15841766        IWorkflowInfo(self.context).fireTransition('start_clearance')
    15851767        self.flash(_('Clearance process has been started.'))
     
    15981780    def form_fields(self):
    15991781        if self.context.is_postgrad:
    1600             form_fields = grok.AutoFields(IPGStudentClearance).omit('clearance_locked')
    1601         else:
    1602             form_fields = grok.AutoFields(IUGStudentClearance).omit('clearance_locked')
     1782            form_fields = grok.AutoFields(IPGStudentClearance).omit(
     1783                'clearance_locked', 'clr_code')
     1784        else:
     1785            form_fields = grok.AutoFields(IUGStudentClearance).omit(
     1786                'clearance_locked', 'clr_code')
    16031787        return form_fields
    16041788
     
    16271811            return
    16281812        self.flash(_('Clearance form has been saved.'))
    1629         self.redirect(self.url(self.context,'request_clearance'))
     1813        if self.context.clr_code:
     1814            self.redirect(self.url(self.context, 'request_clearance'))
     1815        else:
     1816            # We bypass the request_clearance page if student
     1817            # has been imported in state 'clearance started' and
     1818            # no clr_code was entered before.
     1819            state = IWorkflowState(self.context).getState()
     1820            if state != CLEARANCE:
     1821                # This shouldn't happen, but the application officer
     1822                # might have forgotten to lock the form after changing the state
     1823                self.flash(_('This form cannot be submitted. Wrong state!'))
     1824                return
     1825            IWorkflowInfo(self.context).fireTransition('request_clearance')
     1826            self.flash(_('Clearance has been requested.'))
     1827            self.redirect(self.url(self.context))
    16301828        return
    16311829
     
    16471845            return
    16481846        pin = '%s-%s-%s' % (self.ac_prefix, self.ac_series, self.ac_number)
    1649         if self.context.clr_code != pin:
     1847        if self.context.clr_code and self.context.clr_code != pin:
    16501848            self.flash(_("This isn't your CLR access code."))
    16511849            return
    16521850        state = IWorkflowState(self.context).getState()
    1653         # This shouldn't happen, but the application officer
    1654         # might have forgotten to lock the form after changing the state
    16551851        if state != CLEARANCE:
     1852            # This shouldn't happen, but the application officer
     1853            # might have forgotten to lock the form after changing the state
    16561854            self.flash(_('This form cannot be submitted. Wrong state!'))
    16571855            return
     
    16731871
    16741872    def update(self, SUBMIT=None):
     1873        if not self.context.is_current:
     1874            emit_lock_message(self)
     1875            return
     1876        super(StartSessionPage, self).update()
    16751877        if not self.context.next_session_allowed:
    16761878            self.flash(_("You are not entitled to start session."))
     
    17301932
    17311933    def update(self):
     1934        if not self.context.is_current:
     1935            emit_lock_message(self)
     1936            return
    17321937        if self.context.student.state != PAID:
    17331938            emit_lock_message(self)
     
    17621967
    17631968    def update(self):
     1969        if not self.context.__parent__.is_current:
     1970            emit_lock_message(self)
     1971            return
    17641972        if self.context.student.state != PAID:
    17651973            emit_lock_message(self)
     
    17761984        level_title = translate(self.context.level_title, 'waeup.kofa',
    17771985            target_language=lang)
    1778         return _('Add and remove course tickets of study level ${a}',
     1986        return _('Edit course list of ${a}',
    17791987            mapping = {'a':level_title})
    17801988
     
    17851993            total_credits += val.credits
    17861994        return total_credits
     1995
     1996    @property
     1997    def translated_values(self):
     1998        return translated_values(self)
    17871999
    17882000    @action(_('Add course ticket'))
     
    18472059        ticket = createObject(u'waeup.CourseTicket')
    18482060        course = data['course']
    1849         for name in ['code', 'title', 'credits', 'passmark', 'semester']:
    1850             setattr(ticket, name, getattr(course, name))
    18512061        ticket.automatic = False
     2062        ticket.carry_over = False
    18522063        try:
    1853             self.context.addCourseTicket(ticket)
     2064            self.context.addCourseTicket(ticket, course)
    18542065        except KeyError:
    18552066            self.flash(_('The ticket exists.'))
     
    19272138    grok.template('requestpw')
    19282139    form_fields = grok.AutoFields(IStudentRequestPW).select(
    1929         'firstname','reg_number','email')
     2140        'firstname','number','email')
    19302141    label = _('Request password for first-time login')
    19312142
     
    19482159        return True
    19492160
    1950     @action(_('Get login credentials'), style='primary')
     2161    @action(_('Send login credentials to email address'), style='primary')
    19512162    def get_credentials(self, **data):
    19522163        if not self.captcha_result.is_valid:
     
    19542165            # No need to flash something.
    19552166            return
    1956         reg_number = data.get('reg_number','')
     2167        number = data.get('number','')
    19572168        firstname = data.get('firstname','')
    19582169        cat = getUtility(ICatalog, name='students_catalog')
    19592170        results = list(
    1960             cat.searchResults(reg_number=(reg_number, reg_number)))
     2171            cat.searchResults(reg_number=(number, number)))
     2172        if not results:
     2173            results = list(
     2174                cat.searchResults(matric_number=(number, number)))
    19612175        if results:
    19622176            student = results[0]
     
    19842198        kofa_utils = getUtility(IKofaUtils)
    19852199        password = kofa_utils.genPassword()
    1986         IUserAccount(student).setPassword(password)
     2200        mandate = PasswordMandate()
     2201        mandate.params['password'] = password
     2202        mandate.params['user'] = student
     2203        site = grok.getSite()
     2204        site['mandates'].addMandate(mandate)
    19872205        # Send email with credentials
    1988         login_url = self.url(grok.getSite(), 'login')
     2206        args = {'mandate_id':mandate.mandate_id}
     2207        mandate_url = self.url(site) + '/mandate?%s' % urlencode(args)
     2208        url_info = u'Confirmation link: %s' % mandate_url
    19892209        msg = _('You have successfully requested a password for the')
    19902210        if kofa_utils.sendCredentials(IUserAccount(student),
    1991             password, login_url, msg):
     2211            password, url_info, msg):
    19922212            email_sent = student.email
    19932213        else:
     
    19952215        self._redirect(email=email_sent, password=password,
    19962216            student_id=student.student_id)
     2217        ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
     2218        self.context.logger.info(
     2219            '%s - %s (%s) - %s' % (ob_class, number, student.student_id, email_sent))
    19972220        return
    19982221
Note: See TracChangeset for help on using the changeset viewer.