Ignore:
Timestamp:
20 Sep 2012, 08:49:37 (12 years ago)
Author:
uli
Message:

Merge changes from update branch (includes trunk changes until r9107).

Location:
main/waeup.kofa/branches/uli-zc-async
Files:
20 edited

Legend:

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

  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/applicant.py

    r9079 r9209  
    2727from zope.securitypolicy.interfaces import IPrincipalRoleManager
    2828from zope.interface import implementedBy
    29 from zope.schema.interfaces import RequiredMissing
     29from zope.schema.interfaces import RequiredMissing, ConstraintNotSatisfied
    3030from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
    3131from waeup.kofa.image import KofaImageFile
     
    3636from waeup.kofa.interfaces import MessageFactory as _
    3737from waeup.kofa.students.vocabularies import RegNumNotInSource
     38from waeup.kofa.students.studycourse import StudentStudyCourse
    3839from waeup.kofa.utils.helpers import attrs_to_fields
    3940from waeup.kofa.applicants.interfaces import IApplicant, IApplicantEdit
     
    118119        if self.course_admitted is None:
    119120            return False, _('No course admitted provided.')
    120         # Add student object
     121        # Set student attributes
    121122        try:
    122123            for name in self.create_names:
    123124                setattr(student, name, getattr(self, name, None))
    124125        except RequiredMissing, err:
    125             return False, _('RequiredMissing: %s' % err)
     126            return False, 'RequiredMissing: %s' % err
     127        except:
     128            return False, 'Error: %s' % err
     129        # Finally prove if the certificate still exists
     130        try:
     131            StudentStudyCourse().certificate = self.course_admitted
     132        except ConstraintNotSatisfied, err:
     133            return False, 'ConstraintNotSatisfied: %s' % self.course_admitted.code
     134        # Add student
    126135        site = grok.getSite()
    127136        site['students'].addStudent(student)
     137        # Save student_id
    128138        self.student_id = student.student_id
     139        # Fire transitions
    129140        IWorkflowInfo(self).fireTransition('create')
    130141        IWorkflowInfo(student).fireTransition('admit')
    131 
    132142        # Set password
    133143        IUserAccount(student).setPassword(self.application_number)
    134 
    135144        # Save the certificate and set session attributes
    136145        student['studycourse'].certificate = self.course_admitted
     
    142151        # Update the catalog
    143152        notify(grok.ObjectModifiedEvent(student))
    144 
    145153        # Save application slip
    146154        self._createApplicationPDF(student, view=view)
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/batching.py

    r8617 r9209  
    4040    grok.provides(IBatchProcessor)
    4141    grok.context(Interface)
    42     util_name = 'applicants container processor'
     42    util_name = 'applicantscontainerprocessor'
    4343    grok.name(util_name)
    4444
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser.py

    r9166 r9209  
    309309    pnav = 3
    310310
    311     form_fields = grok.AutoFields(IApplicantsContainer).omit('title')
    312     form_fields['description'].custom_widget = HTMLDisplayWidget
    313     form_fields[
    314         'startdate'].custom_widget = FriendlyDatetimeDisplayWidget('le')
    315     form_fields[
    316         'enddate'].custom_widget = FriendlyDatetimeDisplayWidget('le')
     311    @property
     312    def form_fields(self):
     313        form_fields = grok.AutoFields(IApplicantsContainer).omit('title')
     314        form_fields['description'].custom_widget = HTMLDisplayWidget
     315        form_fields[
     316            'startdate'].custom_widget = FriendlyDatetimeDisplayWidget('le')
     317        form_fields[
     318            'enddate'].custom_widget = FriendlyDatetimeDisplayWidget('le')
     319        if self.request.principal.id == 'zope.anybody':
     320            form_fields = form_fields.omit(
     321                'code', 'prefix', 'year', 'mode',
     322                'strict_deadline', 'application_category')
     323        return form_fields
    317324
    318325    @property
     
    494501    grok.template('applicantdisplaypage')
    495502    form_fields = grok.AutoFields(IApplicant).omit(
    496         'locked', 'course_admitted', 'password')
     503        'locked', 'course_admitted', 'password', 'suspended')
    497504    label = _('Applicant')
    498505    pnav = 3
     506    hide_hint = False
    499507
    500508    @property
     
    539547    grok.name('base')
    540548    form_fields = grok.AutoFields(IApplicant).select(
    541         'applicant_id', 'firstname', 'lastname','email', 'course1')
     549        'applicant_id','email', 'course1')
    542550
    543551class CreateStudentPage(UtilityView, grok.View):
     
    708716
    709717    def update(self):
    710         if self.context.state in ('initialized', 'started'):
     718        if self.context.state in ('initialized', 'started', 'paid'):
    711719            self.flash(
    712                 _('Please pay before trying to download the application slip.'))
     720                _('Please pay and submit before trying to download the application slip.'))
    713721            return self.redirect(self.url(self.context))
    714722        return
     
    882890    form_fields = grok.AutoFields(IApplicantEdit).omit(
    883891        'locked', 'course_admitted', 'student_id',
    884         'screening_score',
     892        'suspended'
    885893        )
    886894    form_fields['applicant_id'].for_display = True
     
    10341042        return
    10351043
    1036     @action(_('Get login credentials'), style='primary')
     1044    @action(_('Send login credentials to email address'), style='primary')
    10371045    def register(self, **data):
    10381046        if not self.captcha_result.is_valid:
     
    10851093        # Send email with credentials
    10861094        login_url = self.url(grok.getSite(), 'login')
     1095        url_info = u'Login: %s' % login_url
    10871096        msg = _('You have successfully been registered for the')
    10881097        if kofa_utils.sendCredentials(IUserAccount(applicant),
    1089             password, login_url, msg):
     1098            password, url_info, msg):
    10901099            email_sent = applicant.email
    10911100        else:
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser_templates/applicantdisplaypage.pt

    r8273 r9209  
    1 <h2>
    2 ... <span tal:replace="context/translated_state">APPLICATIONSTATE</span> ...
     1<h2 i18n:domain="waeup.kofa">
     2  ...
     3  <span tal:replace="context/translated_state">APPLICATIONSTATE
     4  </span>
     5  <span tal:omit-tag=""
     6    i18n:translate="" tal:condition="context/suspended">(account suspended)
     7  </span>
     8  ...
    39</h2>
    410
     
    1420  <tbody>
    1521    <tal:widgets content="structure provider:widgets" />
    16     <tr>
     22    <tr tal:condition="view/getCourseAdmitted">
    1723      <td class="fieldname" i18n:translate="">
    1824          Admitted Course of Study:
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser_templates/applicanteditpage.pt

    r8486 r9209  
    33      autocomplete="off">
    44
    5   <h2>
    6   ... <span tal:replace="context/translated_state">APPLICATIONSTATE</span> ...
     5  <h2 i18n:domain="waeup.kofa">
     6    ...
     7    <span tal:replace="context/translated_state">APPLICATIONSTATE
     8    </span>
     9    <span tal:omit-tag=""
     10      i18n:translate="" tal:condition="context/suspended">(account suspended)
     11    </span>
     12    ...
    713  </h2>
    814
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser_templates/applicantregemailsent.pt

    r8629 r9209  
    2929    <tr>
    3030  </table>
    31   <p i18n:translate="">
    32     Print this page and proceed to the
     31  <p>
     32    <span i18n:translate="">Print this page and proceed to the</span>
    3333    <a tal:attributes="href python: view.url(layout.site, 'login')">login form</a>.
    34     Please note that passwords are case-sensitive,
     34    <span i18n:translate="">Please note that passwords are case-sensitive,
    3535    <br />when entering your credentials, and keep your password secret!
     36    </span>
    3637  </p>
    3738  <p tal:condition = "view/email">
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser_templates/applicantscontainerpage.pt

    r8406 r9209  
    1 <span tal:condition="view/introduction" tal:omit-tag="">
    2   <p tal:content="structure view/introduction">INTRODUCTION</p>
    3 </span>
    4 
    5 <table class="form-table" tal:condition="layout/isAuthenticated">
     1<table class="form-table">
    62  <tbody>
    73    <tal:block repeat="widget view/widgets">
     
    1915  </tbody>
    2016</table>
     17
     18<span tal:condition="view/introduction" tal:omit-tag="">
     19  <p tal:content="structure view/introduction">INTRODUCTION</p>
     20</span>
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt

    r8388 r9209  
    2525      </td>
    2626      <td>
    27       <span tal:content="python: layout.formatDate(entry.startdate)">START</span>
     27      <span tal:content="python: layout.formatTZDate(entry.startdate)">START</span>
    2828      -
    29       <span tal:content="python: layout.formatDate(entry.enddate)">END</span>
     29      <span tal:content="python: layout.formatTZDate(entry.enddate)">END</span>
    3030      </td>
    3131    </tr>
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/container.py

    r8665 r9209  
    5151    description_dict = {}
    5252
    53     @property
    54     def local_roles(self):
    55         return []
     53    local_roles = []
    5654
    5755    def archive(self, app_ids=None):
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/dynamicroles.py

    r7811 r9209  
    2424import grok
    2525from zope.securitypolicy.interfaces import IPrincipalRoleManager
     26from zope.securitypolicy.principalrole import AnnotationPrincipalRoleManager
    2627from waeup.kofa.applicants.interfaces import IApplicant
    27 from waeup.kofa.students.dynamicroles import StudentPrincipalRoleManager
    2828
    2929# All components in here have the same context: Applicant instances
    3030grok.context(IApplicant)
    3131
    32 class ApplicantPrincipalRoleManager(StudentPrincipalRoleManager):
    33 
     32class ApplicantPrincipalRoleManager(AnnotationPrincipalRoleManager,
     33                                    grok.Adapter):
    3434    grok.provides(IPrincipalRoleManager)
    3535
    3636    #: The attribute name to lookup for additional roles
    3737    extra_attrib = 'course1'
    38     subcontainer = None
    3938
    4039    # Role name mapping:
     
    4544        'waeup.local.ClearanceOfficer':'waeup.ApplicationsOfficer',
    4645        }
     46
     47    def getRolesForPrincipal(self, principal_id):
     48        """Get roles for principal with id `principal_id`.
     49
     50        Different to the default implementation, this method also
     51        takes into account local roles set on any department connected
     52        to the context student.
     53
     54        If the given principal has at least one of the
     55        `external_rolenames` roles granted for the external object, it
     56        additionally gets `additional_rolename` role for the context
     57        student.
     58
     59        For the additional roles the `extra_attrib` and all its parent
     60        objects are looked up, because 'role inheritance' does not
     61        work on that basic level of permission handling.
     62
     63        Some advantages of this approach:
     64
     65        - we don't have to store extra local roles for clearance
     66          officers in ZODB for each student
     67
     68        - when local roles on a department change, we don't have to
     69          update thousands of students; the local role is assigned
     70          dynamically.
     71
     72        Disadvantage:
     73
     74        - More expensive role lookups when a clearance officer wants
     75          to see an student form.
     76
     77        This implementation is designed to be usable also for other
     78        contexts than students. You can inherit from it and set
     79        different role names to lookup/set easily via the static class
     80        attributes.
     81        """
     82        apr_manager = AnnotationPrincipalRoleManager(self._context)
     83        result = apr_manager.getRolesForPrincipal(principal_id)
     84        if result != []:
     85            # If there are local roles defined here, no additional
     86            # lookup is done.
     87            return result
     88        # The principal has no local roles yet. Let's lookup the
     89        # connected course, dept, etc.
     90        obj = getattr(self._context, self.extra_attrib, None)
     91        # Lookup local roles for connected course and all parent
     92        # objects. This way we fake 'role inheritance'.
     93        while obj is not None:
     94            extra_roles = IPrincipalRoleManager(obj).getRolesForPrincipal(
     95                principal_id)
     96            for role_id, setting in extra_roles:
     97                if role_id in self.rolename_mapping.keys():
     98                    # Grant additional role
     99                    # permissions (allow, deny or unset)
     100                    # according to the rolename mapping above.
     101                    result.append(
     102                        (self.rolename_mapping[role_id], setting))
     103                    return result
     104            obj = getattr(obj, '__parent__', None)
     105        return result
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/export.py

    r8724 r9209  
    8383        elif name == 'history':
    8484            value = value.messages
     85        elif name == 'phone' and value is not None:
     86            # Append hash '#' to phone numbers to circumvent
     87            # unwanted excel automatic
     88            value = str('%s#' % value)
    8589        return super(
    8690            ApplicantsExporter, self).mangle_value(
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/interfaces.py

    r9004 r9209  
    1818"""Interfaces of the university application package.
    1919"""
     20from datetime import datetime
    2021from grokcore.content.interfaces import IContainer
    2122from zc.sourcefactory.contextual import BasicContextualSourceFactory
     
    2930from waeup.kofa.schema import TextLineChoice, FormattedDate
    3031from waeup.kofa.interfaces import (
    31     IKofaObject, year_range, validate_email,
     32    IKofaObject, validate_email,
    3233    SimpleKofaVocabulary)
    3334from waeup.kofa.interfaces import MessageFactory as _
     
    4142
    4243_marker = object() # a marker different from None
     44
     45def year_range():
     46    curr_year = datetime.now().year
     47    return range(curr_year - 2, curr_year + 5)
    4348
    4449class RegNumInSource(ValidationError):
     
    323328    application_number = Attribute('The key under which the record is stored')
    324329
     330    suspended = schema.Bool(
     331        title = _(u'Account suspended'),
     332        default = False,
     333        required = False,
     334        )
     335
    325336    applicant_id = schema.TextLine(
    326337        title = _(u'Applicant Id'),
     
    393404        required = False,
    394405        )
    395     screening_venue = schema.TextLine(
    396         title = _(u'Screening Venue'),
    397         required = False,
    398         )
    399     screening_score = schema.Int(
    400         title = _(u'Screening Score'),
    401         required = False,
    402         )
    403406    student_id = schema.TextLine(
    404407        title = _(u'Student Id'),
     
    460463        required = False,
    461464        )
    462     screening_score = schema.Int(
    463         title = _(u'Screening Score'),
    464         required = False,
    465         readonly = True,
    466         )
    467     screening_venue = schema.TextLine(
    468         title = _(u'Screening Venue'),
    469         required = False,
    470         readonly = True,
    471         )
    472465    course_admitted = schema.Choice(
    473466        title = _(u'Admitted Course of Study'),
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/tests/test_applicantcopier.py

    r8667 r9209  
    2121import os
    2222import grok
     23from datetime import datetime
    2324from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
    2425from zope.event import notify
     
    2829from waeup.kofa.interfaces import IExtFileStore, IFileStoreNameChooser
    2930from waeup.kofa.applicants.tests.test_browser import ApplicantsFullSetup
     31
     32session = datetime.now().year - 2
    3033
    3134class ApplicantCopierFunctionalTests(ApplicantsFullSetup):
     
    6770        self.browser.getControl(name="form.course_admitted").value = ['CERT1']
    6871        self.browser.getControl("Save").click()
     72        # Maybe the certificate has meanwhile been removed
     73        del self.app['faculties']['fac1']['dep1'].certificates['CERT1']
     74        (success, msg) = self.applicant.createStudent()
     75        self.assertFalse(success)
     76        self.assertTrue('ConstraintNotSatisfied: CERT1' in msg)
     77        # Ok, lets add the certificate and try again
     78        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
     79            self.certificate)
    6980        (success, msg) = self.applicant.createStudent()
    7081        self.assertTrue('created' in msg)
     
    8293        self.assertEqual(student.firstname, 'John')
    8394        self.assertEqual(student.lastname, 'Tester')
     95        # student_id set in application record?
     96        self.assertEqual(self.applicant.student_id, student.student_id)
    8497        # Check if passport image has been copied
    8598        storage = getUtility(IExtFileStore)
     
    110123        # Has the student studycourse the correct attributes?
    111124        self.assertEqual(student['studycourse'].certificate.code, 'CERT1')
    112         self.assertEqual(student['studycourse'].entry_session, 2009)
     125        self.assertEqual(student['studycourse'].entry_session, session)
    113126        self.assertEqual(student['studycourse'].entry_mode, 'ug_ft')
    114         self.assertEqual(student['studycourse'].current_session, 2009)
     127        self.assertEqual(student['studycourse'].current_session, session)
    115128        self.assertEqual(student['studycourse'].current_level, 100)
    116129
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/tests/test_authentication.py

    r8351 r9209  
    6464    email = None
    6565    phone = None
     66    suspended = False
    6667
    6768
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/tests/test_browser.py

    r8778 r9209  
    2323import tempfile
    2424import grok
     25from datetime import datetime
    2526from StringIO import StringIO
    2627from datetime import datetime, date, timedelta
     
    4647PH_LEN = 2059  # Length of placeholder file
    4748
     49session_1 = datetime.now().year - 2
     50container_name_1 = u'app%s' % session_1
     51session_2 = datetime.now().year - 1
     52container_name_2 = u'app%s' % session_2
     53
    4854class ApplicantsFullSetup(FunctionalTestCase):
    4955    # A test case that only contains a setup and teardown
     
    8086        self.manage_root_path = self.root_path + '/@@manage'
    8187        self.add_container_path = self.root_path + '/@@add'
    82         self.container_path = 'http://localhost/app/applicants/app2009'
     88        self.container_path = 'http://localhost/app/applicants/%s' % container_name_1
    8389        self.manage_container_path = self.container_path + '/@@manage'
    8490
    8591        # Add an applicants container
    8692        applicantscontainer = ApplicantsContainer()
    87         applicantscontainer.code = u'app2009'
     93        applicantscontainer.code = container_name_1
    8894        applicantscontainer.prefix = 'app'
    89         applicantscontainer.year = 2009
    90         applicantscontainer.title = u'This is the app2009 container'
     95        applicantscontainer.year = session_1
     96        applicantscontainer.title = u'This is the %s container' % container_name_1
    9197        applicantscontainer.application_category = 'basic'
    9298        applicantscontainer.mode = 'create'
     
    95101        applicantscontainer.startdate = datetime.now(pytz.utc) - delta
    96102        applicantscontainer.enddate = datetime.now(pytz.utc) + delta
    97         self.app['applicants']['app2009'] = applicantscontainer
    98         self.applicantscontainer = self.app['applicants']['app2009']
     103        self.app['applicants'][container_name_1] = applicantscontainer
     104        self.applicantscontainer = self.app['applicants'][container_name_1]
    99105
    100106        # Populate university
     
    135141        self.applicant.reg_number = u'1234'
    136142        self.applicant.course1 = certificate
    137         app['applicants']['app2009'].addApplicant(self.applicant)
     143        app['applicants'][container_name_1].addApplicant(self.applicant)
    138144        IUserAccount(
    139             self.app['applicants']['app2009'][
     145            self.app['applicants'][container_name_1][
    140146            self.applicant.application_number]).setPassword('apwd')
    141147        self.manage_path = 'http://localhost/app/applicants/%s/%s/%s' % (
    142             'app2009', self.applicant.application_number, 'manage')
     148            container_name_1, self.applicant.application_number, 'manage')
    143149        self.edit_path = 'http://localhost/app/applicants/%s/%s/%s' % (
    144             'app2009', self.applicant.application_number, 'edit')
     150            container_name_1, self.applicant.application_number, 'edit')
    145151        self.view_path = 'http://localhost/app/applicants/%s/%s' % (
    146             'app2009', self.applicant.application_number)
     152            container_name_1, self.applicant.application_number)
    147153
    148154    def login(self):
     
    303309            'There were errors' in self.browser.contents)
    304310        self.browser.getControl(name="form.prefix").value = ['app']
    305         self.browser.getControl(name="form.year").value = ['2010']
     311        self.browser.getControl(name="form.year").value = [str(session_2)]
    306312        self.browser.getControl(name="form.mode").value = ['create']
    307313        self.browser.getControl(
     
    317323        self.browser.open(self.add_container_path)
    318324        self.browser.getControl(name="form.prefix").value = ['app']
    319         self.browser.getControl(name="form.year").value = ['2010']
     325        self.browser.getControl(name="form.year").value = [str(session_2)]
    320326        self.browser.getControl(name="form.mode").value = ['create']
    321327        self.browser.getControl(
     
    326332        self.browser.open(self.manage_root_path)
    327333        ctrl = self.browser.getControl(name='val_id')
    328         ctrl.getControl(value='app2010').selected = True
     334        ctrl.getControl(value=container_name_2).selected = True
    329335        self.browser.getControl("Remove selected", index=0).click()
    330336        self.assertTrue('Successfully removed:' in self.browser.contents)
    331337        self.browser.open(self.add_container_path)
    332338        self.browser.getControl(name="form.prefix").value = ['app']
    333         self.browser.getControl(name="form.year").value = ['2010']
     339        self.browser.getControl(name="form.year").value = [str(session_2)]
    334340        self.browser.getControl(name="form.mode").value = ['create']
    335341        #self.browser.getControl(name="form.ac_prefix").value = ['APP']
     
    337343            name="form.application_category").value = ['basic']
    338344        self.browser.getControl("Add applicants container").click()
    339         del self.app['applicants']['app2010']
     345        del self.app['applicants'][container_name_2]
    340346        ctrl = self.browser.getControl(name='val_id')
    341         ctrl.getControl(value='app2010').selected = True
     347        ctrl.getControl(value=container_name_2).selected = True
    342348        self.browser.getControl("Remove selected", index=0).click()
    343349        self.assertMatches('...Could not delete...', self.browser.contents)
     
    465471        self.browser.open(self.slip_path)
    466472        self.assertTrue(
    467             'Please pay before trying to download the application slip.'
     473            'Please pay and submit before trying to download the application slip.'
    468474            in self.browser.contents)
    469475        # If applicant is in correct state the pdf slip can be opened.
    470         IWorkflowState(self.applicant).setState('paid')
     476        IWorkflowState(self.applicant).setState('submitted')
    471477        self.browser.open(self.manage_path)
    472478        self.browser.getLink("Download application slip").click()
     
    493499            self.browser.headers['content-length'], str(PH_LEN))
    494500
     501    def test_applicant_login(self):
     502        self.applicant.suspended = True
     503        self.login()
     504        self.assertTrue(
     505            'You entered invalid credentials.' in self.browser.contents)
     506        self.applicant.suspended = False
     507        self.browser.getControl("Login").click()
     508        self.assertTrue(
     509            'You logged in.' in self.browser.contents)
     510
    495511    def test_applicant_access(self):
    496512        # Applicants can edit their record
    497513        self.browser.open(self.login_path)
    498514        self.login()
     515        self.assertTrue(
     516            'You logged in.' in self.browser.contents)
    499517        self.browser.open(self.edit_path)
    500518        self.assertTrue(self.browser.url != self.login_path)
     
    699717            in self.browser.contents)
    700718        configuration = SessionConfiguration()
    701         configuration.academic_session = 2009
     719        configuration.academic_session = session_1
    702720        configuration.application_fee = 200.0
    703721        self.app['configuration'].addSessionConfiguration(configuration)
     
    727745        payment_id = self.applicant.keys()[0]
    728746        payment = self.applicant[payment_id]
    729         self.assertEqual(payment.p_item,'This is the app2009 container')
    730         self.assertEqual(payment.p_session,2009)
     747        self.assertEqual(payment.p_item,'This is the %s container' % container_name_1)
     748        self.assertEqual(payment.p_session, session_1)
    731749        self.assertEqual(payment.p_category,'application')
    732750        self.assertEqual(payment.amount_auth,200.0)
     
    821839        self.browser.getControl("Final Submit").click()
    822840        self.assertTrue(
    823             '... submitted ...' in self.browser.contents)
     841            'Application submitted' in self.browser.contents)
    824842        # ... or allow submission after deadline.
    825843        IWorkflowState(self.applicant).setState('paid')
     
    830848        self.browser.getControl("Final Submit").click()
    831849        self.assertTrue(
    832             '... submitted ...' in self.browser.contents)
     850            'Application submitted' in self.browser.contents)
    833851        self.browser.goBack(count=1)
    834852        self.browser.getControl("Save").click()
     
    917935        self.browser.getControl(name="form.phone.area").value = '555'
    918936        self.browser.getControl(name="form.phone.ext").value = '6666666'
    919         self.browser.getControl("Get login credentials").click()
     937        self.browser.getControl("Send login credentials").click()
    920938        self.assertEqual(self.browser.url,
    921939            self.container_path + '/registration_complete?email=xx%40yy.zz')
     
    944962        self.browser.getControl(name="form.reg_number").value = 'anynumber'
    945963        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
    946         self.browser.getControl("Get login credentials").click()
     964        self.browser.getControl("Send login credentials").click()
    947965        self.assertTrue('No application record found.'
    948966            in self.browser.contents)
     
    954972        self.browser.getControl(name="form.reg_number").value = '1234'
    955973        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
    956         self.browser.getControl("Get login credentials").click()
     974        self.browser.getControl("Send login credentials").click()
    957975        self.assertTrue('An error occurred.' in self.browser.contents)
    958976        # Let's set this attribute manually
     
    963981        self.browser.getControl(name="form.reg_number").value = '1234'
    964982        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
    965         self.browser.getControl("Get login credentials").click()
     983        self.browser.getControl("Send login credentials").click()
    966984        # Anonymous is not informed that firstname verification failed.
    967985        # It seems that the record doesn't exist.
     
    973991        self.browser.getControl(name="form.firstname").value = 'John'
    974992        self.browser.getControl(name="form.reg_number").value = '1234'
    975         self.browser.getControl("Get login credentials").click()
     993        self.browser.getControl("Send login credentials").click()
    976994        self.assertTrue('Your password has already been set and used.'
    977995            in self.browser.contents)
    978996        #IUserAccount(
    979         #    self.app['applicants']['app2009'][
     997        #    self.app['applicants'][container_name_1][
    980998        #    self.applicant.application_number]).context.password = None
    981999        # Even without unsetting the password we can re-register if state
     
    9871005        self.browser.getControl(name="form.reg_number").value = '1234'
    9881006        self.browser.getControl(name="form.email").value = 'new@yy.zz'
    989         self.browser.getControl("Get login credentials").click()
     1007        self.browser.getControl("Send login credentials").click()
    9901008        # Yeah, we succeded ...
    9911009        self.assertTrue('Your registration was successful.'
     
    10031021        self.browser.getControl(name="form.identifier").value = '1234'
    10041022        self.browser.getControl(name="form.email").value = 'aa@aa.ng'
    1005         self.browser.getControl("Get login credentials").click()
     1023        self.browser.getControl("Send login credentials").click()
    10061024        self.assertTrue('No record found' in self.browser.contents)
    10071025        self.applicant.email = 'aa@aa.ng'
     
    10111029        self.browser.getControl(name="form.identifier").value = '1234'
    10121030        self.browser.getControl(name="form.email").value = 'aa@aa.ng'
    1013         self.browser.getControl("Get login credentials").click()
     1031        self.browser.getControl("Send login credentials").click()
    10141032        self.assertTrue(
    10151033            'An email with your user name and password has been sent'
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/tests/test_export.py

    r8724 r9209  
    120120        applicant.course_admitted = self.certificate
    121121        applicant.notice = u'Some notice\nin lines.'
    122         applicant.screening_score = 98
    123         applicant.screening_venue = u'Exam Room'
    124122        applicant.password = 'any password'
    125123        result_entry = ResultEntry(
     
    144142            'course_admitted,date_of_birth,display_fullname,email,firstname,'
    145143            'history,lastname,locked,middlename,notice,password,phone,'
    146             'reg_number,screening_score,screening_venue,sex,state,'
    147             'student_id,container_code\r\n'
     144            'reg_number,sex,state,'
     145            'student_id,suspended,container_code\r\n'
    148146            'dp2011_654321,,654321,,,,,Anna Tester,,Anna,'
    149147            in result)
    150148        self.assertTrue(
    151149            'Application initialized by system\'],Tester,'
    152             '0,,,,,,,,,initialized,,dp2011\r\n'
     150            '0,,,,,,,initialized,,0,dp2011\r\n'
    153151            in result)
    154152        return
     
    168166            'course_admitted,date_of_birth,display_fullname,email,firstname,'
    169167            'history,lastname,locked,middlename,notice,password,phone,'
    170             'reg_number,screening_score,screening_venue,sex,state,'
    171             'student_id,container_code\r\n'
     168            'reg_number,sex,state,'
     169            'student_id,suspended,container_code\r\n'
    172170            'dp2011_654321,,654321,CERT1,CERT1,CERT1,1981-02-04#,'
    173171            'Anna M. Tester,anna@sample.com,Anna,'
     
    176174            'Application initialized by system\'],'
    177175            'Tester,0,M.,"Some notice\nin lines.",any password,'
    178             '+234-123-12345,123456,98,Exam Room,f,initialized,,dp2011\r\n'
     176            '+234-123-12345#,123456,f,initialized,,0,dp2011\r\n'
    179177            in result)
    180178
     
    192190            'course_admitted,date_of_birth,display_fullname,email,firstname,'
    193191            'history,lastname,locked,middlename,notice,password,phone,'
    194             'reg_number,screening_score,screening_venue,sex,state,'
    195             'student_id,container_code\r\n'
     192            'reg_number,sex,state,'
     193            'student_id,suspended,container_code\r\n'
    196194            'dp2011_654321,,654321,CERT1,CERT1,CERT1,1981-02-04#,'
    197195            'Anna M. Tester,anna@sample.com,Anna,'
     
    200198            'Application initialized by system\'],'
    201199            'Tester,0,M.,"Some notice\nin lines.",any password,'
    202             '+234-123-12345,123456,98,Exam Room,f,initialized,,dp2011\r\n'
    203             in result)
    204         return
     200            '+234-123-12345#,123456,f,initialized,,0,dp2011\r\n'
     201            in result)
     202        return
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/utils.py

    r8664 r9209  
    3939    SEPARATORS_DICT = {
    4040      'form.course1': _(u'Desired Study Courses'),
    41       'form.screening_score': _(u'Process Data'),
     41      'form.student_id': _(u'Process Data'),
    4242      }
    4343
     
    4545        """Set the payment data of an applicant.
    4646        """
    47         timestamp = "%d" % int(time()*1000)
     47        timestamp = ("%d" % int(time()*10000))[1:]
    4848        container_fee = container.application_fee
    4949        if container_fee:
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/viewlets.py

    r8684 r9209  
    183183        """Get a URL to the target...
    184184        """
    185         if self.context.state in ('initialized', 'started'):
     185        if self.context.state in ('initialized', 'started', 'paid'):
    186186            return
    187187        return self.view.url(self.view.context, self.target)
     
    204204
    205205class PaymentReceiptActionButton(ManageActionButton):
    206     grok.order(1)
     206    grok.order(9) # This button should always be the last one.
    207207    grok.context(IApplicantOnlinePayment)
    208208    grok.view(OnlinePaymentDisplayFormPage)
     
    219219
    220220class ApprovePaymentActionButton(ManageActionButton):
    221     grok.order(2)
     221    grok.order(8)
    222222    grok.context(IApplicantOnlinePayment)
    223223    grok.view(OnlinePaymentDisplayFormPage)
  • main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/workflow.py

    r8752 r9209  
    150150        source = PAID,
    151151        destination = STARTED),
     152    Transition(
     153        transition_id = 'reset7',
     154        title = _('Reset application to admitted'),
     155        msg = _('Application reset to admitted'),
     156        source = CREATED,
     157        destination = ADMITTED),
    152158    )
    153159
Note: See TracChangeset for help on using the changeset viewer.