Index: main/kofacustom.nigeria/trunk/CHANGES.txt
===================================================================
--- main/kofacustom.nigeria/trunk/CHANGES.txt	(revision 13140)
+++ main/kofacustom.nigeria/trunk/CHANGES.txt	(revision 13142)
@@ -4,4 +4,11 @@
 1.2 (unreleased)
 ================
+
+- Implement CBT application (Uniben).
+  Extend ug application interface. Redefine omit tuples.
+  Remove `jamb_age` field.
+
+- Implement JUPEB pre-studies application (Uniben).
+  Extend pg application interface.
 
 - Payment tickets must not be submitted to Interswitch if they
@@ -17,7 +24,7 @@
   (mutltiples of Kobos) not floats.
 
-- Add 'jamb_age' field.
+- Add `jamb_age` field.
 
-- Check if same payment has been made before calling 'goto_interswitch'.
+- Check if same payment has been made before calling `goto_interswitch`.
 
 - Add interswitch browser tests and add/modify components which are needed
@@ -34,5 +41,5 @@
   sitting exam type.
 
-- Add LGA 'Akwa Ibom / Nsit-Atai'.
+- Add LGA `Akwa Ibom / Nsit-Atai`.
 
 - Do not show current current level in student base data section on
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/browser.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/browser.py	(revision 13140)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/browser.py	(revision 13142)
@@ -43,4 +43,8 @@
     UG_OMIT_MANAGE_FIELDS,
     UG_OMIT_EDIT_FIELDS,
+    CBT_OMIT_DISPLAY_FIELDS,
+    CBT_OMIT_PDF_FIELDS,
+    CBT_OMIT_MANAGE_FIELDS,
+    CBT_OMIT_EDIT_FIELDS,
     PG_OMIT_DISPLAY_FIELDS,
     PG_OMIT_PDF_FIELDS,
@@ -93,4 +97,8 @@
             for field in PG_OMIT_DISPLAY_FIELDS:
                 form_fields = form_fields.omit(field)
+        elif self.target is not None and self.target.startswith('cbt'):
+            form_fields = grok.AutoFields(INigeriaUGApplicant)
+            for field in CBT_OMIT_DISPLAY_FIELDS:
+                form_fields = form_fields.omit(field)
         elif self.target is not None and self.target.startswith('putme'):
             form_fields = grok.AutoFields(INigeriaUGApplicant)
@@ -138,4 +146,8 @@
             for field in PG_OMIT_PDF_FIELDS:
                 form_fields = form_fields.omit(field)
+        elif self.target is not None and self.target.startswith('cbt'):
+            form_fields = grok.AutoFields(INigeriaUGApplicant)
+            for field in CBT_OMIT_PDF_FIELDS:
+                form_fields = form_fields.omit(field)
         elif self.target is not None and self.target.startswith('putme'):
             form_fields = grok.AutoFields(INigeriaUGApplicant)
@@ -182,4 +194,8 @@
             for field in PG_OMIT_MANAGE_FIELDS:
                 form_fields = form_fields.omit(field)
+        elif self.target is not None and self.target.startswith('cbt'):
+            form_fields = grok.AutoFields(INigeriaUGApplicant)
+            for field in CBT_OMIT_MANAGE_FIELDS:
+                form_fields = form_fields.omit(field)
         elif self.target is not None and self.target.startswith('putme'):
             form_fields = grok.AutoFields(INigeriaUGApplicant)
@@ -211,4 +227,8 @@
             form_fields = grok.AutoFields(INigeriaPGApplicant)
             for field in PG_OMIT_EDIT_FIELDS:
+                form_fields = form_fields.omit(field)
+        elif self.target is not None and self.target.startswith('cbt'):
+            form_fields = grok.AutoFields(INigeriaUGApplicant)
+            for field in CBT_OMIT_EDIT_FIELDS:
                 form_fields = form_fields.omit(field)
         elif self.target is not None and self.target.startswith('putme'):
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py	(revision 13140)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py	(revision 13142)
@@ -45,8 +45,34 @@
 UG_OMIT_MANAGE_FIELDS = ('special_application',)
 UG_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
-    'student_id', 'notice',
-    'screening_score', 'screening_venue',
-    'screening_date', 'jamb_age', 'jamb_subjects',
-    'jamb_score', 'aggregate')
+    'student_id',
+    'notice',
+    'screening_score',
+    'screening_venue',
+    'screening_date',
+    #'jamb_age',
+    'jamb_subjects',
+    'jamb_score',
+    'jamb_reg_number',
+    'aggregate')
+
+# CBT is a subgroup of UG with the same interface.
+CBT_OMIT_FIELDS = (
+    'hq_type', 'hq_matric_no',
+    'hq_degree', 'hq_school',
+    'hq_session', 'hq_disc',)
+CBT_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + CBT_OMIT_FIELDS
+CBT_OMIT_MANAGE_FIELDS = UG_OMIT_MANAGE_FIELDS + CBT_OMIT_FIELDS
+CBT_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + CBT_OMIT_FIELDS + (
+    'student_id',
+    'notice',
+    'screening_score',
+    'screening_venue',
+    'screening_date',
+    #'jamb_age',
+    #'jamb_subjects',
+    #'jamb_score',
+    #'jamb_reg_number',
+    'aggregate')
+CBT_OMIT_PDF_FIELDS = CBT_OMIT_DISPLAY_FIELDS + ('phone',)
 
 # PUTME is a subgroup of UG with the same interface.
@@ -159,4 +185,5 @@
     jamb_subjects = schema.Text(
         title = _(u'Subjects and Scores'),
+        description = _(u'(one subject with score per line)'),
         required = False,
         )
@@ -165,6 +192,10 @@
         required = False,
         )
-    jamb_age = schema.Int(
-        title = _(u'Age (provided by JAMB)'),
+    #jamb_age = schema.Int(
+    #    title = _(u'Age (provided by JAMB)'),
+    #    required = False,
+    #    )
+    jamb_reg_number = schema.TextLine(
+        title = _(u'JAMB Registration Number'),
         required = False,
         )
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/tests/test_browser.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/tests/test_browser.py	(revision 13140)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/tests/test_browser.py	(revision 13142)
@@ -365,17 +365,21 @@
             'display_fullname,email,emp2_end,emp2_position,emp2_reason,'
             'emp2_start,emp_end,emp_position,emp_reason,emp_start,employer,'
-            'employer2,firstname,history,hq_degree,hq_disc,hq_matric_no,'
-            'hq_school,hq_session,hq_type,jamb_age,jamb_score,jamb_subjects,'
-            'lastname,lga,locked,middlename,nationality,notice,nysc_lga,'
-            'nysc_year,password,phone,pp_school,presently_inst,reg_number,'
-            'result_uploaded,screening_date,screening_score,screening_venue,'
-            'sex,special,special_application,state,student_id,suspended,'
-            'translated_state\r\n'
+            'employer2,firstname,fst_sit_date,fst_sit_fname,fst_sit_no,'
+            'fst_sit_results,fst_sit_type,history,hq_degree,hq_disc,'
+            'hq_matric_no,hq_school,hq_session,hq_type,jamb_reg_number,'
+            'jamb_score,jamb_subjects,lastname,lga,locked,middlename,'
+            'nationality,notice,nysc_lga,nysc_year,password,phone,'
+            'presently_inst,reg_number,result_uploaded,scd_sit_date,'
+            'scd_sit_fname,scd_sit_no,scd_sit_results,scd_sit_type,'
+            'screening_date,screening_score,screening_venue,sex,special,'
+            'special_application,state,student_id,suspended,translated_state\r\n'
+
             ',dp2011_654321,,654321,dp2011,CERT1,CERT1,CERT1,1981-02-04#,'
-            'Anna M. Tester,anna@sample.com,,,,,,,,,,,Anna,'
-            '[u\'2015-06-23 07:31:05 WAT - Application initialized by system\']'
-            ',,,,,,,,,,Tester,,0,M.,NG,"Some notice in lines.",,,any password,'
-            '+234-123-12345#,,,123456,,"Saturday, 16th June 2012 2:00:00 PM",'
-            '98,Exam Room,f,,,initialized,,0,initialized\r\n')
+            'Anna M. Tester,anna@sample.com,,,,,,,,,,,Anna,,,,,,'
+            '[u\'2015-07-06 11:21:22 WAT - Application initialized by system\']'
+            ',,,,,,,,,,Tester,,0,M.,NG,"Some notice\nin lines.",,,'
+            'any password,+234-123-12345#,,123456,,,,,,,'
+            '"Saturday, 16th June 2012 2:00:00 PM",98,Exam Room,f,,,'
+            'initialized,,0,initialized\r\n')
         # We can import the same file if we ignore some columns.
         # Since the applicants_catalog hasn't been notified, the same
@@ -386,12 +390,15 @@
             ['aggregate','ignore_applicant_id','application_date','ignore_application_number',
             'container_code','course1','course2','course_admitted','date_of_birth',
-            'ignore_display_fullname','email','emp2_end','emp2_position','emp2_reason',
+            'display_fullname','email','emp2_end','emp2_position','emp2_reason',
             'emp2_start','emp_end','emp_position','emp_reason','emp_start','employer',
-            'employer2','firstname','ignore_history','hq_degree','hq_disc','hq_matric_no',
-            'hq_school','hq_session','hq_type','jamb_age','jamb_score','jamb_subjects',
-            'lastname','lga','locked','middlename','nationality','notice','nysc_lga',
-            'nysc_year','password','phone','pp_school','presently_inst','reg_number',
-            'result_uploaded','screening_date','screening_score','screening_venue',
-            'sex','ignore_special','special_application','state','student_id','suspended',
+            'employer2','firstname','fst_sit_date','fst_sit_fname','fst_sit_no',
+            'fst_sit_results','fst_sit_type','history','hq_degree','hq_disc',
+            'hq_matric_no','hq_school','hq_session','hq_type','jamb_reg_number',
+            'jamb_score','jamb_subjects','lastname','lga','locked','middlename',
+            'nationality','notice','nysc_lga','nysc_year','password','phone',
+            'presently_inst','reg_number','result_uploaded','scd_sit_date',
+            'scd_sit_fname','scd_sit_no','scd_sit_results','scd_sit_type',
+            'screening_date','screening_score','screening_venue','sex','special',
+            'special_application','state','student_id','suspended',
             'translated_state'],
             mode='create')
@@ -410,12 +417,15 @@
             ['aggregate','ignore_applicant_id','application_date','ignore_application_number',
             'ignore_container_code','course1','course2','course_admitted','date_of_birth',
-            'ignore_display_fullname','email','emp2_end','emp2_position','emp2_reason',
+            'display_fullname','email','emp2_end','emp2_position','emp2_reason',
             'emp2_start','emp_end','emp_position','emp_reason','emp_start','employer',
-            'employer2','firstname','ignore_history','hq_degree','hq_disc','hq_matric_no',
-            'hq_school','hq_session','hq_type','jamb_age','jamb_score','jamb_subjects',
-            'lastname','lga','locked','middlename','nationality','notice','nysc_lga',
-            'nysc_year','password','phone','pp_school','presently_inst','reg_number',
-            'result_uploaded','screening_date','screening_score','screening_venue',
-            'sex','ignore_special','special_application','state','student_id','suspended',
+            'employer2','firstname','fst_sit_date','fst_sit_fname','fst_sit_no',
+            'fst_sit_results','fst_sit_type','history','hq_degree','hq_disc',
+            'hq_matric_no','hq_school','hq_session','hq_type','jamb_reg_number',
+            'jamb_score','jamb_subjects','lastname','lga','locked','middlename',
+            'nationality','notice','nysc_lga','nysc_year','password','phone',
+            'presently_inst','reg_number','result_uploaded','scd_sit_date',
+            'scd_sit_fname','scd_sit_no','scd_sit_results','scd_sit_type',
+            'screening_date','screening_score','screening_venue','sex','special',
+            'special_application','state','student_id','suspended',
             'translated_state'],
             mode='update')
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py	(revision 13140)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py	(revision 13142)
@@ -41,4 +41,6 @@
         'pgft': ['Postgraduate Full-Time Programmes', 'PG'],
         'pgpt': ['Postgraduate Part-Time Programmes', 'PG'],
+        'pre': ['Pre-Degree Studies', 'PRE'],
+        'cbt': ['Post-UTME CBT Praxis Test', 'CBT'],
         }
 
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py	(revision 13140)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py	(revision 13142)
@@ -261,4 +261,6 @@
         'sandwich': 'Sandwich',
         'cest': 'Part-Time, Diploma, Certificate',
+        'pre': 'Pre-Degree Studies',
+        'cbt': 'Post-UTME CBT Praxis Test',
         }
 
