Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 13543)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 13544)
@@ -23,10 +23,11 @@
 from kofacustom.nigeria.applicants.applicant import NigeriaApplicant
 from waeup.aaue.applicants.interfaces import(
-    ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit, IPUTMEApplicantEdit)
+    ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit,
+    IPUTMEApplicantEdit, ITranscriptApplicant)
 
 class CustomApplicant(NigeriaApplicant):
 
     grok.implements(ICustomApplicant, ICustomUGApplicantEdit,
-        ICustomPGApplicantEdit, IPUTMEApplicantEdit)
+        ICustomPGApplicantEdit, IPUTMEApplicantEdit, ITranscriptApplicant)
     grok.provides(ICustomApplicant)
 
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/batching.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/batching.py	(revision 13544)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/batching.py	(revision 13544)
@@ -0,0 +1,25 @@
+## $Id$
+##
+## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+"""Batch processing for applicants.
+"""
+from kofacustom.nigeria.applicants.batching import NigeriaApplicantProcessor
+from waeup.aaue.applicants.interfaces import ICustomApplicant
+
+class CustomApplicantProcessor(NigeriaApplicantProcessor):
+
+    iface = ICustomApplicant
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 13543)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 13544)
@@ -26,5 +26,4 @@
 from waeup.kofa.utils.helpers import string_from_bytes, file_size
 from waeup.kofa.applicants.browser import ApplicantCheckStatusPage
-from waeup.kofa.applicants.interfaces import ISpecialApplicant
 from waeup.kofa.applicants.viewlets import PDFActionButton
 from waeup.aaue.interfaces import MessageFactory as _
@@ -41,7 +40,7 @@
     UG_OMIT_EDIT_FIELDS)
 from waeup.aaue.applicants.interfaces import (
-    ICustomApplicant,
     ICustomUGApplicant,
-    ICustomUGApplicantEdit
+    ICustomUGApplicantEdit,
+    ITranscriptApplicant
     )
 
@@ -71,6 +70,9 @@
     def form_fields(self):
         if self.target is not None and self.target == 'trans':
-            return grok.AutoFields(ISpecialApplicant).omit(
-                'locked', 'suspended', 'special_application')
+            form_fields = grok.AutoFields(ITranscriptApplicant).omit(
+                'locked', 'suspended')
+            form_fields['dispatch_address'].custom_widget = BytesDisplayWidget
+            form_fields['perm_address'].custom_widget = BytesDisplayWidget
+            return form_fields
         # AAUE is using the same interface for all regular applications.
         form_fields = grok.AutoFields(ICustomUGApplicant)
@@ -160,6 +162,5 @@
     def form_fields(self):
         if self.target is not None and self.target == 'trans':
-            form_fields = grok.AutoFields(ISpecialApplicant).omit(
-                'special_application')
+            form_fields = grok.AutoFields(ITranscriptApplicant)
             form_fields['applicant_id'].for_display = True
             return form_fields
@@ -188,6 +189,6 @@
     def form_fields(self):
         if self.target is not None and self.target == 'trans':
-            form_fields = grok.AutoFields(ISpecialApplicant).omit(
-                'locked', 'suspended', 'special_application')
+            form_fields = grok.AutoFields(ITranscriptApplicant).omit(
+                'locked', 'suspended')
             form_fields['applicant_id'].for_display = True
             return form_fields
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 13543)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 13544)
@@ -23,5 +23,6 @@
 from kofacustom.nigeria.applicants.interfaces import (
     INigeriaUGApplicant, INigeriaPGApplicant)
-from waeup.aaue.applicants.interfaces import ICustomUGApplicant
+from waeup.aaue.applicants.interfaces import (
+    ICustomUGApplicant, ITranscriptApplicant)
 
 class CustomApplicantExporter(NigeriaApplicantExporter):
@@ -33,4 +34,5 @@
         #INigeriaUGApplicant.names() +
         INigeriaPGApplicant.names() +
-        IApplicantBaseData.names()
+        IApplicantBaseData.names() +
+        ITranscriptApplicant.names()
         )))
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 13543)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 13544)
@@ -27,9 +27,12 @@
 from waeup.kofa.interfaces import (
     SimpleKofaVocabulary, academic_sessions_vocab, validate_email)
-from waeup.kofa.schema import FormattedDate, TextLineChoice
-from waeup.kofa.students.vocabularies import nats_vocab, GenderSource
+from waeup.kofa.schema import FormattedDate, TextLineChoice, PhoneNumber
+from waeup.kofa.interfaces import IKofaObject
+from waeup.kofa.students.vocabularies import (
+    nats_vocab, GenderSource, StudyLevelSource)
 from waeup.kofa.applicants.interfaces import (
     contextual_reg_num_source,
     IApplicantBaseData)
+from waeup.kofa.university.vocabularies import StudyModeSource
 from kofacustom.nigeria.applicants.interfaces import (
     LGASource, high_qual, high_grade, exam_types,
@@ -279,6 +282,145 @@
     """
 
-class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant):
-    """An interface for both types of applicants.
+class ITranscriptApplicant(IKofaObject):
+    """A transcript applicant.
+    """
+
+    suspended = schema.Bool(
+        title = _(u'Account suspended'),
+        default = False,
+        required = False,
+        )
+
+    locked = schema.Bool(
+        title = _(u'Form locked'),
+        default = False,
+        required = False,
+        )
+
+    applicant_id = schema.TextLine(
+        title = _(u'Applicant Id'),
+        required = False,
+        readonly = False,
+        )
+
+    firstname = schema.TextLine(
+        title = _(u'First Name'),
+        required = True,
+        )
+
+    middlename = schema.TextLine(
+        title = _(u'Middle Name'),
+        required = False,
+        )
+
+    lastname = schema.TextLine(
+        title = _(u'Last Name (Surname)'),
+        required = True,
+        )
+
+    matric_number = schema.TextLine(
+        title = _(u'Matriculation Number'),
+        readonly = False,
+        required = True,
+        )
+
+    date_of_birth = FormattedDate(
+        title = _(u'Date of Birth'),
+        required = False,
+        #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
+        show_year = True,
+        )
+
+    place_of_birth = schema.TextLine(
+        title = _(u'Place of Birth'),
+        readonly = False,
+        required = False,
+        )
+
+    nationality = schema.Choice(
+        vocabulary = nats_vocab,
+        title = _(u'Nationality'),
+        required = False,
+        )
+
+    email = schema.ASCIILine(
+        title = _(u'Email Address'),
+        required = True,
+        constraint=validate_email,
+        )
+
+    phone = PhoneNumber(
+        title = _(u'Phone'),
+        description = u'',
+        required = False,
+        )
+
+    perm_address = schema.Text(
+        title = _(u'Current Local Address'),
+        required = False,
+        readonly = False,
+        )
+
+    dispatch_address = schema.Text(
+        title = _(u'Dispatch Address'),
+        description = u'Address to which transcript should be posted.',
+        required = False,
+        readonly = False,
+        )
+
+    entry_mode = schema.Choice(
+        title = _(u'Entry Mode'),
+        source = StudyModeSource(),
+        required = False,
+        readonly = False,
+        )
+
+    entry_session = schema.Choice(
+        title = _(u'Entry Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+    end_session = schema.Choice(
+        title = _(u'End Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+    course_studied = schema.Choice(
+        title = _(u'Course of Study / Degree'),
+        source = CertificateSource(),
+        required = False,
+        readonly = False,
+        )
+
+    purpose = schema.TextLine(
+        title = _(u'Purpose of this Application'),
+        readonly = False,
+        required = False,
+        )
+
+    course_changed = schema.Choice(
+        title = _(u'Change of Study Course'),
+        description = u'If yes, select previous course of study.',
+        source = CertificateSource(),
+        readonly = False,
+        required = False,
+        )
+
+    change_level = schema.Choice(
+        title = _(u'Change Level'),
+        description = u'If yes, select level at which you changed course of study.',
+        source = StudyLevelSource(),
+        required = False,
+        readonly = False,
+        )
+
+
+class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant,
+    ITranscriptApplicant):
+    """An interface for all three types of applicants.
 
     Attention: The ICustomPGApplicant field seetings will be overwritten
@@ -355,2 +497,4 @@
     """
 
+
+
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py	(revision 13543)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py	(revision 13544)
@@ -17,7 +17,10 @@
 ##
 import grok
+import datetime
+import pytz
 from zope.event import notify
 from zope.component import createObject, getUtility
 from waeup.kofa.configuration import SessionConfiguration
+from waeup.kofa.applicants.container import ApplicantsContainer
 from waeup.aaue.testing import FunctionalLayer
 from waeup.kofa.applicants.tests.test_browser import (
@@ -65,2 +68,31 @@
                  'application/pdf')
         return
+
+    def test_transcript_application_manage(self):
+        # Add trans applicants container
+        self.transcontainer = ApplicantsContainer()
+        self.transcontainer.mode = 'create'
+        self.transcontainer.code = u'trans%s' % session_1
+        self.transcontainer.prefix = u'trans'
+        self.transcontainer.application_category = u'no'
+        self.transcontainer.year = session_1
+        self.transcontainer.application_fee = 300.0
+        self.transcontainer.title = u'This is the trans%s container' % session_1
+        self.app['applicants'][self.transcontainer.code] = self.transcontainer
+        delta = datetime.timedelta(days=10)
+        self.transcontainer.startdate = datetime.datetime.now(pytz.utc) - delta
+        self.transcontainer.enddate = datetime.datetime.now(pytz.utc) + delta
+        # Add applicant
+        transapplicant = createObject(u'waeup.Applicant')
+        transapplicant.firstname = u'Anna'
+        transapplicant.lastname = u'Post'
+        self.app['applicants'][self.transcontainer.code].addApplicant(transapplicant)
+        self.transapplication_number = transapplicant.application_number
+        self.transapplicant = self.app['applicants'][self.transcontainer.code][
+            self.transapplication_number]
+        self.transapplicant_path = ('http://localhost/app/applicants/trans%s/%s'
+            % (session_1, self.transapplication_number))
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.transapplicant_path)
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertTrue("Dispatch Address" in self.browser.contents)
