Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 16248)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 16251)
@@ -4,4 +4,8 @@
 1.6.1.dev0 (unreleased)
 =======================
+
+* Implement `ExportPDFPersonalDataSlip` (without button
+  in the base package). Rename `ExportPDFBaseDataPlusSlip`
+  `ExportPDFStudyCourseBaseDataSlip`.
 
 * Save email address provided by mandate when referee report
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16248)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16251)
@@ -702,9 +702,9 @@
             mapping = {'a':self.context.display_fullname})
 
-class ExportPDFBaseDataPlusSlip(UtilityView, grok.View):
+class ExportPDFStudyCourseBaseDataSlip(UtilityView, grok.View):
     """Deliver a PDF base and studycourse data slip.
     """
     grok.context(IStudentStudyCourse)
-    grok.name('basedata_slip.pdf')
+    grok.name('studycourse_slip.pdf')
     grok.require('waeup.viewStudent')
     prefix = 'form'
@@ -740,4 +740,44 @@
             self.context.student, studentview, 
             omit_fields=self.omit_fields)
+
+class ExportPDFPersonalDataSlip(UtilityView, grok.View):
+    """Deliver a PDF base and personal data slip.
+    """
+    grok.context(IStudent)
+    grok.name('personal_slip.pdf')
+    grok.require('waeup.viewStudent')
+    prefix = 'form'
+
+    omit_fields = (
+        'suspended',
+        'adm_code', 'suspended_comment',
+        'current_level',
+        'flash_notice', 'entry_session',
+        'parents_email')
+
+    form_fields = grok.AutoFields(IStudentPersonal)
+
+    @property
+    def title(self):
+        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+        return translate(_('Personal Data'), 'waeup.kofa',
+            target_language=portal_language)
+
+    @property
+    def label(self):
+        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+        return translate(_('Personal Data of'),
+            'waeup.kofa', target_language=portal_language) \
+            + ' %s' % self.context.student.display_fullname
+
+    def render(self):
+        studentview = StudentBasePDFFormPage(self.context.student,
+            self.request, self.omit_fields)
+        students_utils = getUtility(IStudentsUtils)
+        return students_utils.renderPDF(
+            self, 'personal_slip.pdf',
+            self.context.student, studentview,
+            omit_fields=self.omit_fields)
+
 
 class ExportPDFClearanceSlip(grok.View):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 16248)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 16251)
@@ -2768,5 +2768,5 @@
         return
 
-    def test_student_basedata_slip(self):
+    def test_student_studycourse_slip(self):
         IWorkflowState(self.student).setState('school fee paid')
         self.browser.open(self.login_path)
@@ -2774,13 +2774,29 @@
         self.browser.getControl(name="form.password").value = 'spwd'
         self.browser.getControl("Login").click()
-        # Students can open base data slip
+        # Students can open study course base data slip
         # (no button available in base package)
-        pdf_url = '%s/basedata_slip.pdf' % self.studycourse_path
+        pdf_url = '%s/studycourse_slip.pdf' % self.studycourse_path
         self.browser.open(pdf_url)
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
-        path = os.path.join(samples_dir(), 'basedata_slip.pdf')
+        path = os.path.join(samples_dir(), 'studycourse_slip.pdf')
         open(path, 'wb').write(self.browser.contents)
-        print "Sample PDF basedata_slip.pdf written to %s" % path
+        print "Sample PDF studycourse_slip.pdf written to %s" % path
+
+    def test_student_personal_slip(self):
+        IWorkflowState(self.student).setState('school fee paid')
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = self.student_id
+        self.browser.getControl(name="form.password").value = 'spwd'
+        self.browser.getControl("Login").click()
+        # Students can personal data slip
+        # (no button available in base package)
+        pdf_url = '%s/personal_slip.pdf' % self.student_path
+        self.browser.open(pdf_url)
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
+        path = os.path.join(samples_dir(), 'personal_slip.pdf')
+        open(path, 'wb').write(self.browser.contents)
+        print "Sample PDF personal_slip.pdf written to %s" % path
 
     def test_student_clearance(self):
