Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9161)
@@ -470,7 +470,5 @@
     location_fields = []
 
-    # Validation fields can be removed after data migration from SRP.
-    additional_fields = ['level',
-        'validated_by', 'validation_date']
+    additional_fields = ['level']
     additional_headers = ['level']
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9161)
@@ -850,4 +850,6 @@
     grok.require('waeup.viewStudent')
     form_fields = grok.AutoFields(IStudentStudyLevel)
+    form_fields[
+        'validation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
     grok.template('studylevelpage')
     pnav = 4
@@ -945,5 +947,6 @@
     grok.require('waeup.manageStudent')
     grok.template('studylevelmanagepage')
-    form_fields = grok.AutoFields(IStudentStudyLevel)
+    form_fields = grok.AutoFields(IStudentStudyLevel).omit(
+        'validation_date', 'validated_by')
     pnav = 4
     taboneactions = [_('Save'),_('Cancel')]
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9161)
@@ -426,6 +426,4 @@
     """
     level = Attribute('The level code')
-    validation_date = Attribute('The date of validation')
-    validated_by = Attribute('User Id of course adviser')
 
     level_session = schema.Choice(
@@ -440,4 +438,16 @@
         default = '0',
         required = False,
+        )
+
+    validated_by = schema.TextLine(
+        title = _(u'Validated by'),
+        default = None,
+        required = False,
+        )
+
+    validation_date = schema.Datetime(
+        title = _(u'Validation Date'),
+        required = False,
+        readonly = False,
         )
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 9161)
@@ -37,6 +37,4 @@
         super(StudentStudyLevel, self).__init__()
         self.level = None
-        self.validation_date = None
-        self.validated_by = None
         return
 
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 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9161)
@@ -967,5 +967,5 @@
         self.app['users'].addUser('mrsadvise', 'mrsadvisesecret')
         self.app['users']['mrsadvise'].email = 'mradvise@foo.ng'
-        self.app['users']['mrsadvise'].title = 'Helen Procter'
+        self.app['users']['mrsadvise'].title = u'Helen Procter'
         # Assign local CourseAdviser100 role for a certificate
         cert = self.app['faculties']['fac1']['dep1'].certificates['CERT1']
@@ -1018,11 +1018,11 @@
         # the 100L CA does see the 'Validate' button
         self.browser.open(L110_student_path)
-        self.assertFalse('Validate' in self.browser.contents)
+        self.assertFalse('Validate courses' in self.browser.contents)
         IWorkflowInfo(self.student).fireTransition('register_courses')
         self.browser.open(L110_student_path)
-        self.assertFalse('Validate' in self.browser.contents)
+        self.assertFalse('Validate courses' in self.browser.contents)
         self.student['studycourse'].current_level = 110
         self.browser.open(L110_student_path)
-        self.assertTrue('Validate' in self.browser.contents)
+        self.assertTrue('Validate courses' in self.browser.contents)
         # ... but a 100L CA does not see the button on other levels
         studylevel2 = StudentStudyLevel()
@@ -1032,9 +1032,15 @@
         L200_student_path = self.studycourse_path + '/200'
         self.browser.open(L200_student_path)
-        self.assertFalse('Validate' in self.browser.contents)
+        self.assertFalse('Validate courses' in self.browser.contents)
         self.browser.open(L110_student_path)
         self.browser.getLink("Validate courses").click()
         self.assertTrue('Course list has been validated' in self.browser.contents)
         self.assertTrue('courses validated' in self.browser.contents)
+        self.assertEqual(self.student['studycourse']['110'].validated_by,
+            'Helen Procter')
+        self.assertMatches(
+            '<YYYY-MM-DD hh:mm:ss>',
+            self.student['studycourse']['110'].validation_date.strftime(
+                "%Y-%m-%d %H:%M:%S"))
         self.browser.getLink("Reject courses").click()
         self.assertTrue('Course list request has been annulled.'
@@ -1044,4 +1050,6 @@
             '/contactstudent?subject=%s' % urlmessage)
         self.assertTrue('school fee paid' in self.browser.contents)
+        self.assertTrue(self.student['studycourse']['110'].validated_by is None)
+        self.assertTrue(self.student['studycourse']['110'].validation_date is None)
         IWorkflowInfo(self.student).fireTransition('register_courses')
         self.browser.open(L110_student_path)
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 9161)
@@ -209,6 +209,7 @@
         self.assertEqual(
             result,
-            'level,level_session,level_verdict,student_id\r\n'
-            ',,0,\r\n'
+            'level,level_session,level_verdict,validated_by,validation_date,'
+            'student_id\r\n'
+            ',,0,,,\r\n'
             )
         return
@@ -225,6 +226,7 @@
         self.assertEqual(
             result,
-            'level,level_session,level_verdict,student_id\r\n'
-            '100,2012,A,A111111\r\n'
+            'level,level_session,level_verdict,validated_by,validation_date,'
+            'student_id\r\n'
+            '100,2012,A,,,A111111\r\n'
             )
         return
@@ -239,6 +241,7 @@
         self.assertEqual(
             result,
-            'level,level_session,level_verdict,student_id\r\n'
-            '100,2012,A,A111111\r\n'
+            'level,level_session,level_verdict,validated_by,validation_date,'
+            'student_id\r\n'
+            '100,2012,A,,,A111111\r\n'
             )
         return
@@ -252,6 +255,7 @@
         self.assertEqual(
             result,
-            'level,level_session,level_verdict,student_id\r\n'
-            '100,2012,A,A111111\r\n'
+            'level,level_session,level_verdict,validated_by,validation_date,'
+            'student_id\r\n'
+            '100,2012,A,,,A111111\r\n'
             )
         return
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 9160)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 9161)
@@ -2,4 +2,5 @@
 """
 import grok
+from datetime import datetime
 from zope.component import getUtility
 from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
@@ -12,4 +13,5 @@
 from waeup.kofa.workflow import KofaWorkflow, KofaWorkflowInfo
 from waeup.kofa.students.interfaces import IStudent, IStudentsUtils
+from waeup.kofa.utils.helpers import get_current_principal
 
 
@@ -234,4 +236,23 @@
         new_session = obj['studycourse'].current_session + 1
         obj['studycourse'].current_session = new_session
+    elif event.transition.transition_id == 'validate_courses':
+        current_level = obj['studycourse'].current_level
+        level_object = obj['studycourse'].get(str(current_level), None)
+        if level_object is not None:
+            user = get_current_principal()
+            if user is None:
+                usertitle = 'system'
+            else:
+                usertitle = getattr(user, 'public_name', None)
+                if not usertitle:
+                    usertitle = user.title
+            level_object.validated_by = usertitle
+            level_object.validation_date = datetime.utcnow()
+    elif event.transition.transition_id == 'reset8':
+        current_level = obj['studycourse'].current_level
+        level_object = obj['studycourse'].get(str(current_level), None)
+        if level_object is not None:
+            level_object.validated_by = None
+            level_object.validation_date = None
     # In some tests we don't have a students container
     try:
