Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16097)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16116)
@@ -26,4 +26,5 @@
 from datetime import datetime, date
 from time import time, sleep
+import xmlrpclib
 from zope.event import notify
 from zope.component import getUtility, queryUtility, createObject, getAdapter
@@ -1653,4 +1654,46 @@
         return
 
+class CheckTranscriptStatus(KofaPage):
+    """A display page for checking transcript processing status.
+    """
+    grok.context(IApplicantsRoot)
+    grok.name('checktranscript')
+    grok.require('waeup.Public')
+    label = _('Check transcript status')
+    buttonname = _('Check status now')
+    pnav = 8
+    websites = (('DemoPortal', 'http://localhost:8080/app'),)
+    appl_url1 = 'http://localhost:8080/app/applicants'
+    appl_url2 = 'http://localhost:8080/app/applicants'
+
+    def update(self, SUBMIT=None):
+        form = self.request.form
+        self.button = False
+        # Handle captcha
+        self.captcha = getUtility(ICaptchaManager).getCaptcha()
+        self.captcha_result = self.captcha.verify(self.request)
+        self.captcha_code = self.captcha.display(self.captcha_result.error_code)
+        if SUBMIT:
+            self.results = []
+            if not self.captcha_result.is_valid:
+                # Captcha will display error messages automatically.
+                # No need to flash something.
+                return
+            unique_id = form.get('unique_id', None)
+            email = form.get('email', None)
+            if not unique_id or not email:
+                self.flash(
+                    _('Required input missing.'), type='warning')
+                return
+            self.button = True
+            # Call webservice of all websites
+            for website in self.websites:
+                server = xmlrpclib.ServerProxy(website[1])
+                result = server.get_grad_student(unique_id, email)
+                if not result:
+                    continue
+                self.results.append((result, website))
+        return
+
 class ExportJobContainerOverview(KofaPage):
     """Page that lists active applicant data export jobs and provides links
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/checktranscriptstatus.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/checktranscriptstatus.pt	(revision 16116)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/checktranscriptstatus.pt	(revision 16116)
@@ -0,0 +1,84 @@
+<p tal:condition="not:view/button" i18n:translate="checktranscript">
+    Check your transcript status in Kofa first. Depending on the existence
+    and status of your student record in Kofa you will be redirected
+    to the appropriate application form.
+</p>
+
+<form method="post" enctype="multipart/form-data"
+    tal:condition="not:view/button" i18n:domain="waeup.kofa">
+<br />
+  <table class="form-table">
+    <tr>
+      <td i18n:translate="" class="fieldname">
+        Student Id, Registration Number or <br />Matric Number:
+      </td>
+      <td>
+        <input class="textType half" type="text" name="unique_id" />
+      </td>
+    </tr>
+    <tr>
+      <td i18n:translate="" class="fieldname">
+        Email Address:
+      </td>
+      <td>
+        <input class="textType half" type="text" name="email" />
+      </td>
+    </tr>
+  </table>
+  <div tal:content="structure view/captcha_code"></div>
+  <br />
+  <input class="btn btn-primary" type="submit" name="SUBMIT"
+      tal:attributes="value view/buttonname" />
+</form>
+
+<div tal:condition="view/button" i18n:domain="waeup.kofa">
+  <br />
+  <tal:noresults condition="not: view/results">
+    <br />
+    <p i18n:translate="check_transcript_1">
+      No student record was found in Kofa. However, if
+      you are sure that you are entitled to receive a transcript, 
+      you can apply for your transcript
+      <a  i18n:name="no_result_appl_url" tal:attributes="href view/appl_url1">here
+      </a>.
+    </p>
+  </tal:noresults>
+
+  <tal:results condition="view/results">
+    <br />
+    <p i18n:translate="check_transcript_2"
+       tal:condition="python:not view.results[0][0][2]">
+      Your student record was found. If you remember your student id
+      and password, you can just login
+      <a i18n:name="login_url"
+         tal:attributes="href python:view.results[0][1][1] + '/login'">
+        here
+      </a> to check your student record status.
+      <tal:withemail tal:condition="python:view.results[0][0][1]">
+         You have forgotten your password? Since your email address matches
+         the email address stored in Kofa, you can just request a new password
+        <a i18n:name="changepw_url"
+           tal:attributes="href python:view.results[0][1][1] + '/changepw'">
+          here
+        </a>.
+      </tal:withemail>
+    </p>
+    <p i18n:translate="check_transcript_3"
+       tal:condition="python:not view.results[0][0][2]">
+      But it is not necessary to login with your former student credential. If
+      you are sure that you are entitled to receive a transcript,
+      you can proceed and directly apply for your transcript
+      <a  i18n:name="result_appl_url" tal:attributes="href view/appl_url2">here
+      </a>.
+    </p>
+    <p i18n:translate="check_transcript_4"
+       tal:condition="python:view.results[0][0][2]">
+      Your student record exists and your transcript has already
+      been released and sent to the address provided.
+      If you want your transcript to be resent, maybe to another destination,
+      you can proceed and directly apply for transcript delivery
+      <a  i18n:name="result_appl_url" tal:attributes="href view/appl_url2">here
+      </a> again.
+    </p>
+  </tal:results>
+</div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16097)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16116)
@@ -1539,5 +1539,22 @@
           'password is: <strong>%s</strong>' % self.applicant.application_number
           in self.browser.contents)
-        
+
+    def test_check_transcript_status(self):
+        self.applicant.email = 'aa@aa.aa'
+        self.browser.open('http://localhost/app/applicants/checktranscript')
+        self.browser.getControl(name="unique_id").value = 'nonsense'
+        self.browser.getControl(name="email").value = 'aa@aa.aa'
+        self.browser.getControl("Check status now").click()
+        # Here the test fails because it seems that
+        # xmlrpclib.ServerProxy can't be
+        # used in tests even if we use
+        # zope.app.testing.xmlrpc import ServerProxy with correct
+        # URL. Any idea Uli?
+        self.assertTrue('No student record was found in Kofa'
+            in self.browser.contents)
+        self.browser.getControl(
+          name="unique_id").value = self.applicant.applicant_id
+        self.browser.getControl(name="email").value = 'aa@aa.aa'
+        self.browser.getControl("Check status now").click()
 
 class ApplicantsExportTests(ApplicantsFullSetup, FunctionalAsyncTestCase):
