Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9542)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9543)
@@ -745,4 +745,6 @@
     form_fields = grok.AutoFields(IStudentPersonal)
     form_fields['perm_address'].custom_widget = BytesDisplayWidget
+    form_fields[
+        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
     pnav = 4
 
@@ -758,5 +760,5 @@
     grok.name('manage_personal')
     grok.require('waeup.manageStudent')
-    form_fields = grok.AutoFields(IStudentPersonal)
+    form_fields = grok.AutoFields(IStudentPersonal).omit('personal_updated')
     label = _('Manage personal data')
     pnav = 4
@@ -767,11 +769,21 @@
         return
 
-class StudentPersonalEditFormPage(StudentPersonalManageFormPage):
+class StudentPersonalEditFormPage(KofaEditFormPage):
     """ Page to edit personal data
     """
+    grok.context(IStudent)
     grok.name('edit_personal')
     grok.require('waeup.handleStudent')
+    form_fields = grok.AutoFields(IStudentPersonal).omit('personal_updated')
     label = _('Edit personal data')
     pnav = 4
+
+    @action(_('Save/Confirm'), style='primary')
+    def save(self, **data):
+        msave(self, **data)
+        # XXX: Temporarily disabled until all personal forms have been properly
+        # configured
+        #self.context.personal_updated = datetime.utcnow()
+        return
 
 class StudyCourseDisplayFormPage(KofaDisplayFormPage):
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9542)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9543)
@@ -250,8 +250,7 @@
 
     """
-    date_of_birth = FormattedDate(
-        title = _(u'Date of Birth'),
-        required = True,
-        show_year = True,
+    officer_comment = schema.Text(
+        title = _(u"Officer's Comment"),
+        required = False,
         )
 
@@ -268,4 +267,10 @@
         )
 
+    date_of_birth = FormattedDate(
+        title = _(u'Date of Birth'),
+        required = True,
+        show_year = True,
+        )
+
     nationality = schema.Choice(
         vocabulary = nats_vocab,
@@ -274,11 +279,4 @@
         )
 
-    officer_comment = schema.Text(
-        title = _(u"Officer's Comment"),
-        required = False,
-        #description = _(
-        #    u'This comment will be deleted when student is cleared.'),
-        )
-
 class IPGStudentClearance(IUGStudentClearance):
     """Representation of postgraduate student clearance data.
@@ -295,4 +293,10 @@
 
     """
+    personal_updated = schema.Datetime(
+        title = _(u'Updated'),
+        required = False,
+        readonly = False,
+        )
+
     perm_address = schema.Text(
         title = _(u'Permanent Address'),
@@ -669,5 +673,4 @@
         title = _(u'Payment Level'),
         required = False,
-        readonly = True,
         )
 
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 9542)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9543)
@@ -2422,4 +2422,26 @@
         self.assertTrue('An email with' in self.browser.contents)
 
+    def test_student_expired_personal_data(self):
+        # Login
+        delta = timedelta(days=180)
+        self.student.personal_updated = datetime.utcnow() - delta
+        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()
+        self.assertEqual(self.browser.url, self.student_path)
+        self.assertTrue(
+            'You logged in' in self.browser.contents)
+        self.browser.getLink("Logout").click()
+        delta = timedelta(days=181)
+        self.student.personal_updated = datetime.utcnow() - delta
+        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()
+        self.assertEqual(self.browser.url, self.edit_personal_path)
+        self.assertTrue(
+            'Your personal data record expired' in self.browser.contents)
+
 class StudentRequestPWTests(StudentsFullSetup):
     # Tests for student registration
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 9542)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 9543)
@@ -45,9 +45,10 @@
             'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,'
             'firstname,lastname,matric_number,middlename,nationality,officer_comment,'
-            'perm_address,phone,reg_number,sex,student_id,suspended,password,'
+            'perm_address,personal_updated,'
+            'phone,reg_number,sex,student_id,suspended,password,'
             'state,history,certcode,is_postgrad,current_level,current_session\r\n'
 
             'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,'
-            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",'
+            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",,'
             '+234-123-12345#,123,f,A111111,0,,created'
             in result
@@ -65,9 +66,10 @@
             'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,'
             'firstname,lastname,matric_number,middlename,nationality,officer_comment,'
-            'perm_address,phone,reg_number,sex,student_id,suspended,password,'
+            'perm_address,personal_updated'
+            ',phone,reg_number,sex,student_id,suspended,password,'
             'state,history,certcode,is_postgrad,current_level,current_session\r\n'
 
             'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,'
-            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",'
+            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",,'
             '+234-123-12345#,123,f,A111111,0,,created'
             in result
@@ -84,9 +86,10 @@
             'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,'
             'firstname,lastname,matric_number,middlename,nationality,officer_comment,'
-            'perm_address,phone,reg_number,sex,student_id,suspended,password,'
+            'perm_address,personal_updated'
+            ',phone,reg_number,sex,student_id,suspended,password,'
             'state,history,certcode,is_postgrad,current_level,current_session\r\n'
 
             'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,'
-            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",'
+            'Anna,Tester,234,M.,NG,,"Studentroad 21\nLagos 123456\n",,'
             '+234-123-12345#,123,f,A111111,0,,created'
             in result
Index: /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 9542)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 9543)
@@ -190,4 +190,5 @@
     def tzinfo(self):
         # For Nigeria: pytz.timezone('Africa/Lagos')
+        # For Germany: pytz.timezone('Europe/Berlin')
         return pytz.utc
 
