Index: main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/batching.py
===================================================================
--- main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/batching.py	(revision 17024)
+++ main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/batching.py	(revision 17025)
@@ -20,5 +20,6 @@
 from kofacustom.nigeria.students.batching import NigeriaStudentProcessor
 from waeup.kofa.students.batching import (
-    StudentOnlinePaymentProcessor, StudentStudyLevelProcessor)
+    StudentOnlinePaymentProcessor, StudentStudyLevelProcessor,
+    CourseTicketProcessor)
 from kofacustom.unidel.students.interfaces import (
     ICustomStudent,
@@ -26,5 +27,6 @@
     ICustomStudentUpdateByMatricNo,
     ICustomStudentOnlinePayment,
-    ICustomStudentStudyLevel
+    ICustomStudentStudyLevel,
+    ICustomCourseTicketImport
     )
 
@@ -53,2 +55,18 @@
         fields.remove('total_credits_s2')
         return  fields
+
+class CustomCourseTicketProcessor(CourseTicketProcessor):
+    """A batch processor for ICourseTicket objects.
+    """
+    iface = ICustomCourseTicketImport
+
+    @property
+    def available_fields(self):
+        fields = [
+            'student_id','reg_number','matric_number',
+            'mandatory', 'score', 'ca', 'carry_over', 'automatic',
+            'level_session', 'outstanding', 'course_category',
+            'title', 'credits', 'passmark', 'semester', 'ticket_session',
+            'unlock_score', 'previous'
+            ] + self.additional_fields
+        return sorted(fields)
Index: main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/browser.py
===================================================================
--- main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/browser.py	(revision 17024)
+++ main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/browser.py	(revision 17025)
@@ -29,5 +29,6 @@
     StudyLevelEditFormPage, StudyLevelDisplayFormPage, StudyLevelManageFormPage,
     StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
-    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
+    CourseTicketDisplayFormPage, CourseTicketManageFormPage,
+    StudentTriggerTransitionFormPage,
     PaymentsManageFormPage, msave, emit_lock_message)
 from waeup.kofa.students.interfaces import IStudentsUtils, ICourseTicket
@@ -49,5 +50,6 @@
     ICustomStudentStudyLevel,
     ICustomUGStudentClearance,
-    ICustomPGStudentClearance)
+    ICustomPGStudentClearance,
+    ICustomCourseTicket)
 from kofacustom.unidel.interfaces import MessageFactory as _
 
@@ -151,2 +153,27 @@
                 [_('Faculty Officer\'s Signature')],
                 [_('Student\'s Signature')])
+
+class CustomCourseTicketDisplayFormPage(CourseTicketDisplayFormPage):
+    """ Page to display course tickets
+    """
+
+    @property
+    def form_fields(self):
+        return grok.AutoFields(ICustomCourseTicket).omit('course_category',
+            'ticket_session')
+
+class CustomCourseTicketManageFormPage(CourseTicketManageFormPage):
+    """ Page to manage course tickets
+    """
+    
+    form_fields = grok.AutoFields(ICustomCourseTicket).omit('course_category')
+    form_fields['title'].for_display = True
+    form_fields['fcode'].for_display = True
+    form_fields['dcode'].for_display = True
+    form_fields['semester'].for_display = True
+    form_fields['passmark'].for_display = True
+    form_fields['credits'].for_display = True
+    form_fields['mandatory'].for_display = False
+    form_fields['automatic'].for_display = True
+    form_fields['carry_over'].for_display = True
+    form_fields['ticket_session'].for_display = True
Index: main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/interfaces.py
===================================================================
--- main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/interfaces.py	(revision 17024)
+++ main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/interfaces.py	(revision 17025)
@@ -19,4 +19,5 @@
 from zope import schema
 from waeup.kofa.students.vocabularies import StudyLevelSource
+from waeup.kofa.interfaces import (IKofaObject, academic_sessions_vocab)
 from kofacustom.nigeria.students.interfaces import (
     INigeriaStudentBase, INigeriaUGStudentClearance, INigeriaPGStudentClearance,
@@ -107,4 +108,48 @@
     """
 
+    score = schema.Int(
+        title = _(u'Score'),
+        required = False,
+        readonly = False,
+        max = 100,
+        )
+
+    ca = schema.Int(
+        title = _(u'CA'),
+        default = None,
+        required = False,
+        missing_value = None,
+        max = 90,
+        )
+
+ICustomCourseTicket['score'].order = INigeriaCourseTicket['score'].order
+ICustomCourseTicket['ca'].order = ICustomCourseTicket['score'].order
+
+class ICustomCourseTicketImport(ICustomCourseTicket):
+    """An interface for importing course results and nothing more.
+    """
+    
+    score = schema.Int(
+        title = _(u'Score'),
+        required = False,
+        readonly = False,
+        max = 100,
+        )
+
+    ca = schema.Int(
+        title = _(u'CA'),
+        required = False,
+        readonly = False,
+        max = 90,
+        )
+
+    level_session = schema.Choice(
+        title = _(u'Level Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+
 class ICustomStudentUpdateByRegNo(INigeriaStudentUpdateByRegNo):
     """Representation of a student. Skip regular reg_number validation.
Index: main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/studylevel.py
===================================================================
--- main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/studylevel.py	(revision 17024)
+++ main/kofacustom.unidel/trunk/src/kofacustom/unidel/students/studylevel.py	(revision 17025)
@@ -81,4 +81,18 @@
     grok.provides(ICustomCourseTicket)
 
+    @property
+    def total_score(self):
+        """Returns ca + score or imported total score.
+        """
+        if self.outstanding:
+            return None
+        # Override total_score if value has been imported
+        if getattr(self, 'imported_ts', None):
+            return self.imported_ts
+        if self.score == -1:
+            return 0
+        if not None in (self.score, self.ca):
+            return self.score + self.ca
+        return None
 
 CustomCourseTicket = attrs_to_fields(CustomCourseTicket)
