Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/level_report.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/level_report.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/level_report.py	(revision 14918)
@@ -80,5 +80,6 @@
         final_level_obj = level_obj.student['studycourse'][final_level]
         if final_level_obj.remark not in (
-            'Pass', '3s_rd_s', '2s_2_s', '2s_1_s', '1s_st_s'):
+            'Pass', '3s_rd_s', '2s_2_s', '2s_1_s', '1s_st_s',
+            'Merit', 'Credit', 'Distinction'):
             return True
         return False
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/session_results_presentation.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/session_results_presentation.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/session_results_presentation.py	(revision 14918)
@@ -123,5 +123,6 @@
         final_level_obj = level_obj.student['studycourse'][final_level]
         if final_level_obj.remark not in (
-            'Pass', '3s_rd_s', '2s_2_s', '2s_1_s', '1s_st_s'):
+            'Pass', '3s_rd_s', '2s_2_s', '2s_1_s', '1s_st_s',
+            'Merit', 'Credit', 'Distinction'):
             return True
         return False
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_level_report.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_level_report.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_level_report.py	(revision 14918)
@@ -87,2 +87,17 @@
         print "Sample grad_level_report.pdf written to %s" % path
         return
+
+    def test_create_dp_pdf(self):
+        self.certificate.study_mode = 'dp_ft'
+        self.student['studycourse']['100']['Course1'].ca = 0
+        self.student['studycourse']['100']['Course1'].credits = 91
+        self.certificate.end_level = 100
+        self.app['faculties']['fac1'].officer_1 = 'Rosa Moonshine - Dean of Faculty'
+        self.app['faculties']['fac1']['dep1'].officer_1 = 'Amalia Sunshine - Head of Department'
+        report = GradLevelReport('fac1', 'dep1', 'CERT1', 2010, 100)
+        result = report.create_pdf('JOB_ID')
+        self.assertTrue(result.startswith('%PDF-'))
+        path = os.path.join(samples_dir(), 'dp_grad_level_report.pdf')
+        open(path, 'wb').write(result)
+        print "Sample dp_grad_level_report.pdf written to %s" % path
+        return
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_session_results_presentation.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_session_results_presentation.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/reports/tests/test_session_results_presentation.py	(revision 14918)
@@ -56,4 +56,18 @@
         return
 
+    def test_create_dp_pdf(self):
+        self.certificate.degree = 'BA(FS)'
+        self.certificate.study_mode = 'dp_ft'
+        self.app['faculties']['fac1'].officer_1 = 'Rosa Moonshine - Dean of Faculty'
+        self.app['faculties']['fac1']['dep1'].officer_1 = 'Amalia Sunshine - Head of Department'
+        self.app['faculties']['fac1']['dep1'].officer_2 = 'Theresa Starbright - External Examiner'
+        report = CustomSessionResultsPresentation('fac1', 'dep1', 'CERT1', 2010, 100)
+        result = report.create_pdf('JOB_ID')
+        self.assertTrue(result.startswith('%PDF-'))
+        path = os.path.join(samples_dir(), 'dp_session_results_presentation.pdf')
+        open(path, 'wb').write(result)
+        print "Sample dp_session_results_presentation.pdf written to %s" % path
+        return
+
  
 class GradSessionResultsPresentationTests(CatalogTestSetup):
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14918)
@@ -186,4 +186,8 @@
         certificate = getattr(self.__parent__,'certificate',None)
         end_level = getattr(certificate, 'end_level', None)
+        study_mode = getattr(certificate, 'study_mode', None)
+        is_dp = False
+        if study_mode and study_mode.startswith('dp'):
+            is_dp = True
         failed_limit = 1.5
         if self.student.entry_session < 2013:
@@ -213,12 +217,22 @@
                 return 'Fail'
             if self.cumulative_params[0] < 1.5:
+                if is_dp:
+                    return 'Fail'
                 return 'Pass'
             if self.cumulative_params[0] < 2.4:
+                if is_dp:
+                    return 'Pass'
                 return '3s_rd_s'
             if self.cumulative_params[0] < 3.5:
+                if is_dp:
+                    return 'Merit'
                 return '2s_2_s'
             if self.cumulative_params[0] < 4.5:
+                if is_dp:
+                    return 'Credit'
                 return '2s_1_s'
             if self.cumulative_params[0] < 5.1:
+                if is_dp:
+                    return 'Distinction'
                 return '1s_st_s'
             return 'N/A'
Index: /main/waeup.aaue/trunk/src/waeup/aaue/students/utils.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/students/utils.py	(revision 14917)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/students/utils.py	(revision 14918)
@@ -18,5 +18,6 @@
 import grok
 from time import time
-from zope.component import createObject
+from zope.component import createObject, queryUtility
+from zope.catalog.interfaces import ICatalog
 from waeup.kofa.interfaces import (
     ADMITTED, CLEARANCE, REQUESTED, CLEARED, RETURNING, PAID,
@@ -37,24 +38,41 @@
     PORTRAIT_CHANGE_STATES = (ADMITTED,)
 
-    gpa_boundaries_diploma = ((1.5, 'Fail'),
-                              (1.5, 'Fail'),
-                              (2.4, 'Pass'),
-                              (3.5, 'Merit'),
-                              (4.5, 'Credit'),
-                              (5, 'Distinction'))
-
-    gpa_boundaries = ((1, 'FRNS / NER / NYV'),
-                      (1.5, 'Pass'),
-                      (2.4, '3rd Class Honours (Diploma: Pass)'),
-                      (3.5, '2nd Class Honours Lower Division (Diploma: Merit)'),
-                      (4.5, '2nd Class Honours Upper Division (Diploma: Credit)'),
-                      (5, '1st Class Honours (Diploma: Distinction)'))
+    def GPABoundaries(self, faccode=None, depcode=None,
+                            certcode=None, student=None):
+        if student and student.current_mode.startswith('dp'):
+            return ((1.5, 'Fail'),
+                    (2.4, 'Pass'),
+                    (3.5, 'Merit'),
+                    (4.5, 'Credit'),
+                    (5, 'Distinction'))
+        elif student:
+            return ((1, 'FRNS / NER / NYV'),
+                    (1.5, 'Pass'),
+                    (2.4, '3rd Class Honours'),
+                    (3.5, '2nd Class Honours Lower Division'),
+                    (4.5, '2nd Class Honours Upper Division'),
+                    (5, '1st Class Honours'))
+        # Session Results Presentations depend on certificate
+        results = None
+        if certcode:
+            cat = queryUtility(ICatalog, name='certificates_catalog')
+            results = list(
+                cat.searchResults(code=(certcode, certcode)))
+        if results and results[0].study_mode.startswith('dp'):
+            return ((1.5, 'Fail'),
+                    (2.4, 'Pass'),
+                    (3.5, 'Merit'),
+                    (4.5, 'Credit'),
+                    (5, 'Distinction'))
+        else:
+            return ((1, 'FRNS / NER / NYV'),
+                    (1.5, 'Pass'),
+                    (2.4, '3rd Class Honours'),
+                    (3.5, '2nd Class Honours Lower Division'),
+                    (4.5, '2nd Class Honours Upper Division'),
+                    (5, '1st Class Honours'))
 
     def getClassFromCGPA(self, gpa, student):
-        if student.current_mode.startswith('dp'):
-            gpa_boundaries = self.gpa_boundaries_diploma
-
-        else:
-            gpa_boundaries = self.gpa_boundaries
+        gpa_boundaries = self.GPABoundaries(student=student)
         if gpa < gpa_boundaries[0][0]:
             # FRNS / Fail
