Index: main/waeup.uniben/trunk/src/waeup/uniben/students/batching.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/batching.py	(revision 16498)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/batching.py	(revision 16509)
@@ -19,10 +19,12 @@
 """
 from kofacustom.nigeria.students.batching import NigeriaStudentProcessor
-from waeup.kofa.students.batching import StudentOnlinePaymentProcessor
+from waeup.kofa.students.batching import (
+    StudentOnlinePaymentProcessor, CourseTicketProcessor)
 from waeup.uniben.students.interfaces import (
     ICustomStudent,
     ICustomStudentUpdateByRegNo,
     ICustomStudentUpdateByMatricNo,
-    ICustomStudentOnlinePayment
+    ICustomStudentOnlinePayment,
+    ICustomCourseTicketImport
     )
 
@@ -38,2 +40,19 @@
     """
     iface = ICustomStudentOnlinePayment
+
+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', 'carry_over', 'automatic',
+            'outstanding', 'course_category', 'level_session',
+            'title', 'credits', 'passmark', 'semester', 'ticket_session',
+            'unlock_score', 'grading_sys'
+            ] + self.additional_fields
+        return sorted(fields)
+
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 16498)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 16509)
@@ -32,5 +32,7 @@
     StudyLevelEditFormPage, StudyLevelDisplayFormPage,
     StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
-    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
+    CourseTicketDisplayFormPage,
+    CourseTicketManageFormPage,
+    StudentTriggerTransitionFormPage,
     msave, emit_lock_message,
     StudentActivateView, StudentDeactivateView,
@@ -71,5 +73,6 @@
     ICustomStudentPersonal,
     ICustomStudentPersonalEdit,
-    IMedicalHistory)
+    IMedicalHistory,
+    ICustomCourseTicket)
 from waeup.uniben.interfaces import MessageFactory as _
 
@@ -658,5 +661,21 @@
     """ Page to display course tickets
     """
-    form_fields = grok.AutoFields(ICourseTicket).omit('score')
+    form_fields = grok.AutoFields(ICustomCourseTicket).omit('score')
+
+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
 
 class CustomStudentActivateView(StudentActivateView):
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py	(revision 16498)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py	(revision 16509)
@@ -18,6 +18,9 @@
 
 from zope import schema
-from waeup.kofa.interfaces import validate_email, IKofaObject
+from waeup.kofa.interfaces import (
+    validate_email, IKofaObject,
+    academic_sessions_vocab)
 from waeup.kofa.students.vocabularies import StudyLevelSource
+from kofacustom.nigeria.interfaces import GradingSystemSource
 from kofacustom.nigeria.students.interfaces import (
     INigeriaStudentBase, INigeriaUGStudentClearance, INigeriaPGStudentClearance,
@@ -30,4 +33,5 @@
 from waeup.uniben.interfaces import MessageFactory as _
 
+
 class ICustomStudentBase(INigeriaStudentBase):
     """Representation of student base data.
@@ -291,4 +295,35 @@
     """
 
+    grading_sys = schema.Choice(
+        title = _(u'Grading System'),
+        source = GradingSystemSource(),
+        required = True,
+        default = 'A',
+        )
+
+class ICustomCourseTicketImport(ICustomCourseTicket):
+    """An interface for importing course results and nothing more.
+    """
+
+    score = schema.Int(
+        title = _(u'Score'),
+        required = False,
+        readonly = False,
+        )
+
+    level_session = schema.Choice(
+        title = _(u'Level Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+    grading_sys = schema.Choice(
+        title = _(u'Grading System'),
+        source = GradingSystemSource(),
+        required = False,
+        default = 'A',
+        )
+
 class ICustomStudentUpdateByRegNo(INigeriaStudentUpdateByRegNo):
     """Representation of a student. Skip regular reg_number validation.
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/studylevel.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/studylevel.py	(revision 16498)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/studylevel.py	(revision 16509)
@@ -87,4 +87,36 @@
         return True
 
+    @property
+    def _getGradeWeightFromScore(self):
+        """Uniben Course Grading System
+        """
+        if getattr(self, 'grading_sys', 'A') == 'A':
+            if self.total_score is None:
+                return (None, None)
+            if self.total_score >= 70:
+                return ('A',5)
+            if self.total_score >= 60:
+                return ('B',4)
+            if self.total_score >= 50:
+                return ('C',3)
+            if self.total_score >= 45:
+                return ('D',2)
+            if self.total_score >= 40:
+                return ('E',1)
+            return ('F',0)
+        else:
+            if self.total_score is None:
+                return (None, None)
+            if self.total_score >= 70:
+                return ('A',5)
+            if self.total_score >= 60:
+                return ('B',4)
+            if self.total_score >= 50:
+                return ('C',3)
+            if self.total_score >= 45:
+                return ('D',2)
+            return ('F',0)
+
+
 CustomCourseTicket = attrs_to_fields(CustomCourseTicket)
 
