Index: main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9296)
@@ -28,4 +28,5 @@
 from time import time
 from datetime import datetime
+from zope.i18n import translate
 from zope.interface import Interface
 from zope.schema import getFields
@@ -37,4 +38,5 @@
     IBatchProcessor, FatalCSVError, IObjectConverter, IUserAccount,
     IObjectHistory, VALIDATED, REGISTERED, IGNORE_MARKER)
+from waeup.kofa.interfaces import IKofaUtils
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.students.interfaces import (
@@ -721,5 +723,6 @@
         'current_session',
         'current_level',
-        'bypass_validation']
+        'bypass_validation',
+        'validated_by']
 
     def checkUpdateRequirements(self, obj, row, site):
@@ -741,5 +744,5 @@
             return 'Study level object is missing.'
         # Check if student is in state REGISTERED or VALIDATED
-        if row.get('bypass_validation') in ('1', 'True', 'TRUE', 'yes'):
+        if row.get('bypass_validation'):
             if obj.student.state not in (VALIDATED, REGISTERED):
                 return 'Student in wrong state.'
@@ -760,9 +763,17 @@
         level_string = str(obj.current_level)
         obj[level_string].level_verdict = row['current_verdict']
-        # Fire transition depending on student's state
+        # Fire transition and set studylevel attributes
+        # depending on student's state
         if obj.__parent__.state == REGISTERED:
+            validated_by = row.get('validated_by', '')
+            if validated_by in (IGNORE_MARKER, ''):
+                portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+                system = translate(_('System'),'waeup.kofa',
+                                  target_language=portal_language)
+                obj[level_string].validated_by = system
+            else:
+                obj[level_string].validated_by = validated_by
+            obj[level_string].validation_date = datetime.utcnow()
             IWorkflowInfo(obj.__parent__).fireTransition('bypass_validation')
-            obj[level_string].validated_by = _('System')
-            obj[level_string].validation_date = datetime.utcnow()
         else:
             IWorkflowInfo(obj.__parent__).fireTransition('return')
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9296)
@@ -423,4 +423,14 @@
         )
 
+    bypass_validation = schema.Bool(
+        title = _(u'Bypass validation'),
+        required = False,
+        )
+
+    validated_by = schema.TextLine(
+        title = _(u'Validated by'),
+        required = False,
+        )
+
 class IStudentStudyLevel(IKofaObject):
     """A container for course tickets.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv	(revision 9296)
@@ -8,2 +8,3 @@
 X111111,Fabian,Riester,7,1990-01-02,100006,aa@aa.ng,1234,m,courses validated
 X222222,Thomas,Kinderman,8,1990-01-02,100007,aa@aa.ng,1234,m,courses validated
+X333333,Paula,Schall,9,1990-01-02,100008,aa@aa.ng,1234,m,courses registered
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv	(revision 9296)
@@ -9,2 +9,3 @@
 7,,CERT1,2008,200
 8,,CERT1,2008,200
+9,,CERT1,2008,200
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studylevel_data.csv
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studylevel_data.csv	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studylevel_data.csv	(revision 9296)
@@ -10,2 +10,3 @@
 6,,2008,A,200
 7,,2008,A,200
+9,,2008,A,200
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv	(revision 9296)
@@ -1,9 +1,10 @@
-matric_number,current_session,current_level,current_verdict,bypass_validation
-100000,2008,200,0,0
-100001,2008,100,B,False
-100002,2007,200,C,
-100003,2008,200,A,
-100004,2008,200,,
-100005,2008,200,A,1
-100006,2008,200,A,True
-100007,2008,200,A,True
+matric_number,current_session,current_level,current_verdict,bypass_validation,validated_by
+100000,2008,200,0,0,
+100001,2008,100,B,False,
+100002,2007,200,C,,
+100003,2008,200,A,,
+100004,2008,200,,,
+100005,2008,200,A,1,
+100006,2008,200,A,True,
+100007,2008,200,A,True,
+100008,2008,200,A,True,Juliana
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 9295)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 9296)
@@ -360,5 +360,5 @@
             self.csv_file, STUDENT_HEADER_FIELDS)
         self.assertEqual(num_warns,0)
-        self.assertEqual(len(self.app['students']), 9)
+        self.assertEqual(len(self.app['students']), 10)
         self.assertEqual(self.app['students']['X666666'].reg_number,'1')
         self.assertEqual(
@@ -980,5 +980,6 @@
         num, num_warns, fin_file, fail_file = self.processor.doImport(
             self.csv_file, VERDICT_HEADER_FIELDS,'update')
-        content = open(fail_file).read()
+        #content = open(fail_file).read()
+        #import pdb; pdb.set_trace()
         self.assertEqual(num_warns,5)
         self.assertEqual(studycourse.current_verdict, '0')
@@ -994,14 +995,17 @@
         self.assertTrue(isinstance(
             student['studycourse']['200'].validation_date, datetime.datetime))
+        student = self.processor.getParent(
+            dict(matric_number='100008'), self.app)
+        self.assertEqual(student['studycourse']['200'].validated_by, 'Juliana')
         content = open(fail_file).read()
         self.assertEqual(
             content,
-            'current_session,current_verdict,bypass_validation,'
-            'matric_number,current_level,--ERRORS--\r\n'
-            '2008,B,False,100001,100,Current level does not correspond.\r\n'
-            '2007,C,<IGNORE>,100002,200,Current session does not correspond.\r\n'
-            '2008,A,<IGNORE>,100003,200,Student in wrong state.\r\n'
-            '2008,<IGNORE>,<IGNORE>,100004,200,No verdict in import file.\r\n'
-            '2008,A,True,100007,200,Study level object is missing.\r\n'
+            'current_session,current_level,bypass_validation,current_verdict,'
+            'matric_number,validated_by,--ERRORS--\r\n'
+            '2008,100,False,B,100001,<IGNORE>,Current level does not correspond.\r\n'
+            '2007,200,<IGNORE>,C,100002,<IGNORE>,Current session does not correspond.\r\n'
+            '2008,200,<IGNORE>,A,100003,<IGNORE>,Student in wrong state.\r\n'
+            '2008,200,<IGNORE>,<IGNORE>,100004,<IGNORE>,No verdict in import file.\r\n'
+            '2008,200,True,A,100007,<IGNORE>,Study level object is missing.\r\n'
             )
         logcontent = open(self.logfile).read()
