Index: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/applicant.py
===================================================================
--- main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/applicant.py	(revision 16054)
+++ main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/applicant.py	(revision 16062)
@@ -22,8 +22,11 @@
 from waeup.kofa.interfaces import IExtFileStore
 from waeup.kofa.applicants.applicant import ApplicantFactory
+from waeup.kofa.applicants.refereereport import (
+    ApplicantRefereeReport, ApplicantRefereeReportFactory)
 from waeup.kofa.utils.helpers import attrs_to_fields
 from kofacustom.nigeria.applicants.applicant import NigeriaApplicant
 from kofacustom.iuokada.applicants.interfaces import(
-    ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit, IPUTMEApplicantEdit)
+    ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit,
+    IPUTMEApplicantEdit, ICustomApplicantRefereeReport)
 
 class CustomApplicant(NigeriaApplicant):
@@ -33,8 +36,4 @@
     grok.provides(ICustomApplicant)
 
-# Set all attributes of CustomApplicant required in ICustomApplicant as field
-# properties. Doing this, we do not have to set initial attributes
-# ourselves and as a bonus we get free validation when an attribute is
-# set.
 CustomApplicant = attrs_to_fields(CustomApplicant)
 
@@ -48,2 +47,21 @@
     def getInterfaces(self):
         return implementedBy(CustomApplicant)
+
+class CustomApplicantRefereeReport(ApplicantRefereeReport):
+    """This is a custom referee report.
+    """
+    grok.implements(ICustomApplicantRefereeReport)
+    grok.provides(ICustomApplicantRefereeReport)
+
+CustomApplicantRefereeReport = attrs_to_fields(CustomApplicantRefereeReport)
+
+class CustomApplicantRefereeReportFactory(ApplicantRefereeReportFactory):
+    """A factory for applicant online payments.
+    """
+
+    def __call__(self, *args, **kw):
+        return CustomApplicantRefereeReport()
+
+    def getInterfaces(self):
+        return implementedBy(CustomApplicantRefereeReport)
+
Index: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/browser.py
===================================================================
--- main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/browser.py	(revision 16054)
+++ main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/browser.py	(revision 16062)
@@ -26,5 +26,7 @@
 from waeup.kofa.utils.helpers import string_from_bytes, file_size, now
 from waeup.kofa.applicants.browser import (
-    ApplicantRegistrationPage, ApplicantsContainerPage, AdditionalFile)
+    ApplicantRegistrationPage, ApplicantsContainerPage, AdditionalFile,
+    RefereeReportAddFormPage, ExportPDFReportSlipPage, ExportPDFReportSlipPage2,
+    RefereeReportDisplayFormPage)
 from waeup.kofa.applicants.interfaces import (
     ISpecialApplicant, IApplicantsContainer)
@@ -51,5 +53,5 @@
     ICustomPGApplicant, ICustomUGApplicant, ICustomApplicant,
     ICustomPGApplicantEdit, ICustomUGApplicantEdit,
-    ICustomApplicantOnlinePayment
+    ICustomApplicantOnlinePayment, ICustomApplicantRefereeReport
     )
 from kofacustom.iuokada.interfaces import MessageFactory as _
@@ -246,4 +248,29 @@
         return form_fields
 
+class RefereeReportAddFormPage(RefereeReportAddFormPage):
+    """Add-form to add an referee report. This form
+    is protected by a mandate.
+    """
+    form_fields = grok.AutoFields(
+        ICustomApplicantRefereeReport).omit('creation_date')
+
+class CustomRefereeReportDisplayFormPage(RefereeReportDisplayFormPage):
+    """A display view for referee reports.
+    """
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
+
+class CustomExportPDFReportSlipPage(ExportPDFReportSlipPage):
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
+class CustomExportPDFReportSlipPage2(ExportPDFReportSlipPage2):
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
 class ResultStatement(AdditionalFile):
     grok.name('res_stat.pdf')
Index: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/interfaces.py
===================================================================
--- main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/interfaces.py	(revision 16054)
+++ main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/interfaces.py	(revision 16062)
@@ -29,5 +29,5 @@
 from waeup.kofa.students.vocabularies import nats_vocab, GenderSource
 from waeup.kofa.applicants.interfaces import (
-    contextual_reg_num_source, IApplicantBaseData)
+    contextual_reg_num_source, IApplicantBaseData, IApplicantRefereeReport)
 from waeup.kofa.refereeentries import RefereeEntryField
 from kofacustom.nigeria.applicants.interfaces import (
@@ -70,4 +70,22 @@
     )
 
+rating_vocab = SimpleKofaVocabulary(
+    (_('Excellent'), 'e'),
+    (_('Very good'), 'vg'),
+    (_('Good'), 'g'),
+    (_('Slightly above average'), 'saa'),
+    (_('Average'), 'a'),
+    (_('Below average'), 'ba'),
+    (_('Unable to assess'), 'unable'),
+    )
+
+
+overallpromise_vocab = SimpleKofaVocabulary(
+    (_('Very good (highest 10%'), 'vg'),
+    (_('Above average (next 15%)'), 'aa'),
+    (_('Average (middle 20%)'), 'a'),
+    (_('Below average (middle 40%)'), 'ba'),
+    )
+
 class ICustomUGApplicant(IApplicantBaseData):
     """An undergraduate applicant.
@@ -418,2 +436,80 @@
     the applicant object.
     """
+
+class ICustomApplicantRefereeReport(IApplicantRefereeReport):
+    """A referee report.
+    """
+
+    duration = schema.Text(
+        title = _(u'How long and in what capacity have you known the candidate?'),
+        required = False,
+        )
+
+    itellectual = schema.Choice(
+        title = _(u'Intellectual Capacity'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    persistent = schema.Choice(
+        title = _(u'Capacity for Persistent and Independent Academic Study'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    imaginative = schema.Choice(
+        title = _(u'Ability for Imaginative Thought'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    productive = schema.Choice(
+        title = _(u'Promise of Productive Scholarship'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    previous = schema.Choice(
+        title = _(u'Quality of Previous Work'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    expression = schema.Choice(
+        title = _(u'Oral and Written Expression in English'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    personality = schema.Text(
+        title = _(u'Please comment on the candidate\'s personality '
+            'with particular reference to his/her moral character, emotional '
+            'and physical stabilty'),
+        required = False,
+        )
+
+    promise = schema.Choice(
+        title = _(u'Candidate\'s overall promise'),
+        required = False,
+        readonly = False,
+        vocabulary = overallpromise_vocab,
+        )
+
+    report = schema.Text(
+        title = _(u'Any other relevant information which would help '
+            'in determining the candidate\'s suitability?'),
+        required = False,
+        )
+
+    objection = schema.Text(
+        title = _(u'Have you any objection to the contents of this '
+            'evaluation being disclosed to any award-given body if '
+            'the need arises?'),
+        required = False,
+        )
Index: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/utils.py
===================================================================
--- main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/utils.py	(revision 16054)
+++ main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/utils.py	(revision 16062)
@@ -91,6 +91,6 @@
         """
         try: title = "%s / %s / %s (%s)" % (
-            value.__parent__.__parent__.__parent__.code,
-            value.__parent__.__parent__.code,
+            value.__parent__.__parent__.__parent__.longtitle,
+            value.__parent__.__parent__.longtitle,
             value.title, value.code)
         except AttributeError:
