Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py	(revision 13157)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py	(revision 13160)
@@ -20,4 +20,5 @@
 
 from zope import schema
+from zope.component import getUtility
 from waeup.kofa.applicants.interfaces import (
     contextual_reg_num_source,
@@ -26,5 +27,9 @@
 from waeup.kofa.schoolgrades import ResultEntryField
 from waeup.kofa.interfaces import (
-    SimpleKofaVocabulary, academic_sessions_vocab, validate_email)
+    SimpleKofaVocabulary,
+    academic_sessions_vocab,
+    validate_email,
+    SubjectSource,
+    IKofaUtils)
 from waeup.kofa.schema import FormattedDate, TextLineChoice
 from waeup.kofa.students.vocabularies import nats_vocab, GenderSource
@@ -34,4 +39,41 @@
 from kofacustom.nigeria.payments.interfaces import INigeriaOnlinePayment
 
+jambsubjects = SimpleKofaVocabulary(
+    (_('Use of English'),'english_language'),
+    (_('Agricultural Science'),'agricultural_science'),
+    (_('Arabic'),'arabic'),
+    (_('Biology'),'biology'),
+    (_('Book Keeping'),'book_keeping'),
+    (_('Chemistry'),'chemistry'),
+    (_('Christian Religious Studies'),'christian_religious_studies'),
+    (_('Commerce'),'commerce'),
+    (_('Economics'),'economics'),
+    (_('Financial Accounting'),'financial_accounting'),
+    (_('Fine Art'),'fine_art'),
+    (_('Food and Nutrition'),'food_and_nutrition'),
+    (_('French'),'french'),
+    (_('Geography'),'geography'),
+    (_('German'),'german'),
+    (_('Government'),'government'),
+    (_('Hausa'),'hausa'),
+    (_('Home Economics'),'home_economics'),
+    (_('History'),'history'),
+    (_('Igbo'),'igbo'),
+    (_('Literature in English'),'literature_in_english'),
+    (_('Literature in Nigerian Languages'),'literature_in_nigerian_languages'),
+    (_('Mathematics'),'mathematics'),
+    (_('Music'),'music'),
+    (_('Physics'),'physics'),
+    (_('Yoruba'),'yoruba'),
+    )
+
+class JAMBSubjectSource(SubjectSource):
+    """A source for school subjects used in exam documentation.
+    """
+
+    def getTitle(self, value):
+        subjects_dict = getUtility(IKofaUtils).EXAM_SUBJECTS_DICT
+        return "%s" % subjects_dict[value]
+
 # Fields to be omitted in all display forms. course_admitted is
 # rendered separately.
@@ -41,7 +83,7 @@
 
 # UG students are all undergraduate students.
-UG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS
+UG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + ('jamb_subjects_list',)
 UG_OMIT_PDF_FIELDS = UG_OMIT_DISPLAY_FIELDS + ('phone',)
-UG_OMIT_MANAGE_FIELDS = ('special_application',)
+UG_OMIT_MANAGE_FIELDS = ('special_application','jamb_subjects_list',)
 UG_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
     'student_id',
@@ -50,5 +92,5 @@
     'screening_venue',
     'screening_date',
-    #'jamb_age',
+    'jamb_age',
     'jamb_subjects',
     'jamb_score',
@@ -61,8 +103,9 @@
     'hq_degree', 'hq_school',
     'hq_session', 'hq_disc',
-    'aggregate')
+    'aggregate', 'jamb_subjects')
 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 + (
+CBT_OMIT_MANAGE_FIELDS = CBT_OMIT_FIELDS + ('special_application',)
+CBT_OMIT_EDIT_FIELDS = OMIT_DISPLAY_FIELDS + CBT_OMIT_FIELDS + (
+    'special_application',
     'student_id',
     'notice',
@@ -81,5 +124,5 @@
     'hq_type', 'hq_matric_no',
     'hq_degree', 'hq_school',
-    'hq_session', 'hq_disc',)
+    'hq_session', 'hq_disc', 'jamb_subjects_list')
 PUTME_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + PUTME_OMIT_FIELDS
 PUTME_OMIT_MANAGE_FIELDS = UG_OMIT_MANAGE_FIELDS + PUTME_OMIT_FIELDS
@@ -97,5 +140,5 @@
 # PUDE is a subgroup of UG with the same interface.
 PUDE_OMIT_FIELDS = (
-    'jamb_subjects','jamb_score', 'jamb_age', 'aggregate')
+    'jamb_subjects','jamb_score', 'jamb_age', 'aggregate', 'jamb_subjects_list')
 PUDE_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + PUDE_OMIT_FIELDS
 PUDE_OMIT_MANAGE_FIELDS = UG_OMIT_MANAGE_FIELDS + PUDE_OMIT_FIELDS
@@ -188,4 +231,13 @@
         required = False,
         )
+    jamb_subjects_list = schema.List(
+        title = _(u'JAMB Subjects'),
+        default = ['english',],
+        required = False,
+        value_type = schema.Choice(
+            vocabulary = jambsubjects
+            #source = JAMBSubjectSource(),
+            ),
+        )
     jamb_score = schema.Int(
         title = _(u'Total JAMB Score'),
@@ -523,8 +575,13 @@
         show_year = True,
         )
-    jamb_subjects = schema.Text(
-        title = _(u'Subjects and Scores'),
-        description = _(u'Enter all four subjects, one subject with score per line!'),
-        required = True,
+    jamb_subjects_list = schema.List(
+        title = _(u'JAMB Subjects'),
+        description = _(u'Select four subjects.'),
+        default = ['english',],
+        required = True,
+        value_type = schema.Choice(
+            vocabulary = jambsubjects
+            #source = JAMBSubjectSource(),
+            ),
         )
 
@@ -534,5 +591,5 @@
     'email'].order = INigeriaUGApplicant['email'].order
 INigeriaUGApplicantEdit[
-    'jamb_subjects'].order = INigeriaUGApplicant['jamb_subjects'].order
+    'jamb_subjects_list'].order = INigeriaUGApplicant['jamb_subjects_list'].order
 
 class INigeriaPGApplicantEdit(INigeriaPGApplicant):
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 13157)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/tests/test_browser.py	(revision 13160)
@@ -348,4 +348,5 @@
         applicant.notice = u'Some notice\nin lines.'
         applicant.jamb_subjects = u'Line 1\nLine 2'
+        applicant.jamb_subjects_list = ['english_language', 'fine_art']
         applicant.screening_score = 98
         applicant.screening_venue = u'Exam Room'
@@ -369,5 +370,6 @@
             '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,'
+            'jamb_score,jamb_subjects,jamb_subjects_list,'
+            'lastname,lga,locked,middlename,'
             'nationality,notice,nysc_lga,nysc_year,password,phone,'
             'presently_inst,reg_number,result_uploaded,scd_sit_date,'
@@ -379,5 +381,6 @@
             'Anna M. Tester,anna@sample.com,,,,,,,,,,,Anna,,,,,,'
             '[u\'2015-07-06 11:21:22 WAT - Application initialized by system\']'
-            ',,,,,,,,,Line 1++Line 2,Tester,,0,M.,NG,"Some notice\nin lines.",,,'
+            ',,,,,,,,,Line 1++Line 2,"[\'english_language\', \'fine_art\']",'
+            '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,,,'
@@ -396,5 +399,6 @@
             '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',
+            'jamb_score','jamb_subjects','jamb_subjects_list',
+            'lastname','lga','locked','middlename',
             'nationality','notice','nysc_lga','nysc_year','password','phone',
             'presently_inst','reg_number','result_uploaded','scd_sit_date',
@@ -423,5 +427,6 @@
             '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',
+            'jamb_score','jamb_subjects','jamb_subjects_list',
+            'lastname','lga','locked','middlename',
             'nationality','notice','nysc_lga','nysc_year','password','phone',
             'presently_inst','reg_number','result_uploaded','scd_sit_date',
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py	(revision 13157)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/utils.py	(revision 13160)
@@ -53,4 +53,5 @@
         'form.employer': _(u'Employment History'),
         'form.jamb_subjects': _(u'JAMB Data'),
+        'form.jamb_subjects_list': _(u'JAMB Data'),
         'form.notice': _(u'Application Process Information'),
         'form.pp_school': _(u'Post Primary School Qualification'),
Index: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py
===================================================================
--- main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py	(revision 13157)
+++ main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/utils/utils.py	(revision 13160)
@@ -88,4 +88,5 @@
         'engineering_science': 'Engineering Science',
         'financial_accounting': 'Financial Accounting',
+        'fine_art': 'Fine Art',
         'food_and_nutrition': 'Food and Nutrition',
         'french': 'French',
@@ -99,4 +100,5 @@
         'health_science': 'Health Science',
         'history': 'History',
+        'home_economics': 'Home Economics',
         'home_management': 'Home Management',
         'human_biology': 'Human Biology',
