Index: main/waeup.aaue/trunk/src/waeup/aaue/students/batching.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/batching.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/batching.py	(revision 14206)
@@ -29,7 +29,11 @@
     ICustomStudentOnlinePayment,
     ICustomCourseTicketImport,
+    ICustomStudentStudyLevel,
+    ICustomStudentStudyCourse
     )
 from waeup.kofa.students.batching import (
     StudentProcessor, StudentOnlinePaymentProcessor,
+    StudentStudyLevelProcessor,
+    StudentStudyCourseProcessor,
     CourseTicketProcessor)
 
@@ -46,4 +50,14 @@
     iface = ICustomStudentOnlinePayment
 
+class CustomStudentStudyCourseProcessor(StudentStudyCourseProcessor):
+    """
+    """
+    iface = ICustomStudentStudyCourse
+
+class CustomStudentStudyLevelProcessor(StudentStudyLevelProcessor):
+    """
+    """
+    iface = ICustomStudentStudyLevel
+
 class CustomCourseTicketProcessor(CourseTicketProcessor):
     """A batch processor for ICourseTicket objects.
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14206)
@@ -248,5 +248,5 @@
     grok.context(ICustomStudentStudyLevel)
     form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
-        'total_credits', 'gpa', 'level')
+        'total_credits', 'gpa', 'level', 'imported_gpa', 'imported_cgpa')
     form_fields[
         'validation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
@@ -278,5 +278,6 @@
     form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
         'level_session', 'level_verdict',
-        'validated_by', 'validation_date', 'gpa', 'level')
+        'validated_by', 'validation_date', 'gpa', 'level',
+        'imported_gpa', 'imported_cgpa')
 
     omit_fields = ('password', 'suspended', 'suspended_comment',
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/interfaces.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/interfaces.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/interfaces.py	(revision 14206)
@@ -18,4 +18,5 @@
 
 from zope import schema
+from zope.interface import Attribute
 from zc.sourcefactory.contextual import BasicContextualSourceFactory
 from zope.catalog.interfaces import ICatalog
@@ -283,4 +284,10 @@
     """
 
+    imported_cgpa = schema.Float(
+        title = _(u'Imported Cumulative GPA'),
+        required = False,
+        readonly = True,
+        )
+
 class ICustomStudentStudyLevel(INigeriaStudentStudyLevel):
     """A container for course tickets.
@@ -305,4 +312,17 @@
         readonly = True,
         )
+
+    imported_gpa = schema.Float(
+        title = _(u'Imported Level GPA'),
+        required = False,
+        readonly = True,
+        )
+
+    imported_cgpa = schema.Float(
+        title = _(u'Imported Cumulative GPA'),
+        required = False,
+        readonly = True,
+        )
+
 
 class ICustomStudentOnlinePayment(ICustomOnlinePayment):
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14206)
@@ -87,4 +87,8 @@
         if credits_counted:
             level_gpa = round(credits_weighted/credits_counted, 3)
+        # Override level_gpa if value has been imported
+        imported_gpa = getattr(self, 'imported_gpa', None)
+        if imported_gpa:
+            level_gpa = imported_gpa
         return level_gpa, credits_counted, credits_weighted
 
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14206)
@@ -43,35 +43,4 @@
 
 
-class StudentProcessorTest(FunctionalTestCase):
-    """Perform some batching tests.
-    """
-
-    layer = FunctionalLayer
-
-    def setUp(self):
-        super(StudentProcessorTest, self).setUp()
-        # Setup a sample site for each test
-        app = University()
-        self.dc_root = tempfile.mkdtemp()
-        app['datacenter'].setStoragePath(self.dc_root)
-
-        # Prepopulate the ZODB...
-        self.getRootFolder()['app'] = app
-        # we add the site immediately after creation to the
-        # ZODB. Catalogs and other local utilities are not setup
-        # before that step.
-        self.app = self.getRootFolder()['app']
-        # Set site here. Some of the following setup code might need
-        # to access grok.getSite() and should get our new app then
-        setSite(app)
-
-
-    def tearDown(self):
-        super(StudentProcessorTest, self).tearDown()
-        shutil.rmtree(self.workdir)
-        shutil.rmtree(self.dc_root)
-        clearSite()
-        return
-
 UPLOAD_CSV_TEMPLATE = (
     'matric_number,student_id,display_fullname,level,code,level_session,'
@@ -144,5 +113,16 @@
         self.assertEqual(self.student['studycourse']['100'].gpa_params[2], 82.0)
         # sgpa = 82 / 23
-        self.assertEqual(self.student['studycourse']['100'].gpa_params[0], 3.565)
+        self.assertEqual(
+            self.student['studycourse']['100'].gpa_params[0], 3.565)
+        # imported gpa values override calculated values
+        studylevel.imported_gpa = 4.3
+        studylevel.imported_cgpa = 5.4
+        self.assertEqual(self.student['studycourse']['100'].gpa_params[0], 4.3)
+        self.assertEqual(
+            self.student['studycourse']['100'].cumulative_params[0], 5.4)
+        self.assertEqual(self.student['studycourse']['100'].gpa, 4.3)
+        self.student['studycourse'].imported_cgpa = 6.6
+        self.assertEqual(
+            self.student['studycourse'].getTranscriptData()[1], 6.6)
         return
 
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_export.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_export.py	(revision 14165)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_export.py	(revision 14206)
@@ -138,9 +138,10 @@
         self.assertEqual(
             result,
-            'gpa,level,level_session,level_verdict,total_credits,'
+            'gpa,imported_cgpa,imported_gpa,'
+            'level,level_session,level_verdict,total_credits,'
             'total_credits_s1,total_credits_s2,'
             'validated_by,validation_date,'
             'student_id,number_of_tickets,certcode\r\n'
-            '0.0,100,2012,A,100,,,,,A111111,1,CERT1\r\n'
+            '0.0,,,100,2012,A,100,,,,,A111111,1,CERT1\r\n'
             )
         return
