Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14302)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14306)
@@ -29,6 +29,7 @@
 from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
 from waeup.kofa.interfaces import (
-    IKofaUtils, academic_sessions_vocab, ICSVExporter)
-from waeup.kofa.students.interfaces import IStudentsUtils, IStudent
+    IKofaUtils, academic_sessions_vocab, ICSVExporter, IKofaObject)
+from waeup.kofa.students.interfaces import (
+    IStudentsUtils, IStudent, IStudentRequestPW)
 from waeup.kofa.students.workflow import PAID, REGISTERED, RETURNING
 from waeup.kofa.students.studylevel import getGradeWeightFromScore
@@ -51,4 +52,5 @@
     StudyCourseTranscriptPage,
     DownloadScoresView,
+    StudentRequestPasswordPage
     )
 from kofacustom.nigeria.students.browser import (
@@ -81,4 +83,6 @@
 from waeup.aaue.interswitch.browser import gateway_net_amt
 from waeup.aaue.interfaces import MessageFactory as _
+
+grok.context(IKofaObject)  # Make IKofaObject the default context
 
 class CustomStudentBaseDisplayFormPage(NigeriaStudentBaseDisplayFormPage):
@@ -866,2 +870,17 @@
                                  code=self.context.code)
         return
+
+class AlumniRequestPasswordPage(StudentRequestPasswordPage):
+    """Captcha'd request password page for students.
+    """
+    grok.name('alumni_requestpw')
+    grok.require('waeup.Anonymous')
+    grok.template('alumni_requestpw')
+    form_fields = grok.AutoFields(IStudentRequestPW).select(
+        'lastname','number','email')
+    label = _('Search student record and send password for first-time login')
+
+    def _redirect_no_student(self):
+        self.flash(_('No student record found.'), type="warning")
+        self.redirect(self.application_url() + '/applicants/trans2017/register')
+        return
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/alumni_requestpw.pt
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/alumni_requestpw.pt	(revision 14306)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/alumni_requestpw.pt	(revision 14306)
@@ -0,0 +1,34 @@
+<form action="." tal:attributes="action request/URL" method="post"
+    i18n:domain="waeup.kofa" enctype="multipart/form-data">
+
+  <table class="form-table">
+    <tbody>
+      <tal:widgets content="structure provider:widgets" />
+      <tr tal:condition="view/captcha_code">
+        <td i18n:translate="">
+          Please solve the captcha<br />to prevent misuse of this service:
+        </td>
+        <td>
+          <div tal:content="structure view/captcha_code"></div>
+        </td>
+      </tr>
+
+    </tbody>
+  </table>
+  <p i18n:translate="">
+    Your student record will be looked up and
+    your login credentials will be sent to the email address given above.
+    To be able to proceed you must provide a valid email address!
+  </p>
+  <p i18n:translate="">
+    If no student record can be found, you'll be redirected to the
+    application section of the portal, where you can apply for a
+    transcript.
+  </p>
+  <br />
+  <div tal:condition="view/availableActions">
+    <input tal:repeat="action view/actions"
+           tal:replace="structure action/render"
+           />
+  </div>
+</form>
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14302)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14306)
@@ -38,4 +38,5 @@
 from waeup.kofa.authentication import LocalRoleSetEvent
 from waeup.kofa.browser.tests.test_pdf import samples_dir
+from waeup.kofa.applicants.container import ApplicantsContainer
 from waeup.aaue.testing import FunctionalLayer
 
@@ -1107,2 +1108,29 @@
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
+
+    def test_alumni_request_pw(self):
+        # Add an applicants container
+        applicantscontainer = ApplicantsContainer()
+        applicantscontainer.code = u'trans2017'
+        applicantscontainer.prefix = 'trans'
+        applicantscontainer.year = 2017
+        applicantscontainer.title = u'This is the trans2017 container'
+        applicantscontainer.application_category = 'no'
+        applicantscontainer.mode = 'create'
+        applicantscontainer.strict_deadline = True
+        delta = timedelta(days=10)
+        applicantscontainer.startdate = datetime.now(pytz.utc) - delta
+        applicantscontainer.enddate = datetime.now(pytz.utc) + delta
+        self.app['applicants']['trans2017'] = applicantscontainer
+        self.applicantscontainer = self.app['applicants']['trans2017']
+        # Student with wrong number can't be found.
+        # Applicant is redirected to application section.
+        self.browser.open('http://localhost/app/alumni_requestpw')
+        self.browser.getControl(name="form.lastname").value = 'Tester'
+        self.browser.getControl(name="form.number").value = 'anynumber'
+        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
+        self.browser.getControl("Send login credentials").click()
+        self.assertTrue('No student record found.'
+            in self.browser.contents)
+        self.assertEqual(self.browser.url,
+            'http://localhost/app/applicants/trans2017/register')
