Index: /main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- /main/waeup.kofa/trunk/CHANGES.txt	(revision 13710)
+++ /main/waeup.kofa/trunk/CHANGES.txt	(revision 13711)
@@ -4,4 +4,6 @@
 1.4.2.dev0 (unreleased)
 =======================
+
+* Add `flash_notice` field.
 
 * Documentation updates.
Index: /main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 13710)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 13711)
@@ -411,5 +411,5 @@
         self.assertEqual(self.browser.contents,
             'adm_code,clr_code,date_of_birth,email,'
-            'employer,firstname,lastname,matric_number,middlename,'
+            'employer,firstname,flash_notice,lastname,matric_number,middlename,'
             'nationality,officer_comment,perm_address,personal_updated,'
             'phone,reg_number,sex,student_id,suspended,suspended_comment,'
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13710)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13711)
@@ -414,5 +414,5 @@
     grok.template('basepage')
     form_fields = grok.AutoFields(IStudentBase).omit(
-        'password', 'suspended', 'suspended_comment')
+        'password', 'suspended', 'suspended_comment', 'flash_notice')
     pnav = 4
 
@@ -430,4 +430,10 @@
             return _('set')
         return _('unset')
+
+    def update(self):
+        if self.context.flash_notice:
+            self.flash(self.context.flash_notice, type="warning")
+        super(StudentBaseDisplayFormPage, self).update()
+        return
 
 class StudentBasePDFFormPage(KofaDisplayFormPage):
@@ -492,5 +498,5 @@
     prefix = 'form'
 
-    omit_fields = ('date_of_birth', 'current_level')
+    omit_fields = ('date_of_birth', 'current_level', 'flash_notice')
 
     form_fields = grok.AutoFields(IStudentBase).select('student_id', 'reg_number')
@@ -664,5 +670,6 @@
         'suspended', 'phone',
         'adm_code', 'suspended_comment',
-        'date_of_birth', 'current_level')
+        'date_of_birth', 'current_level',
+        'flash_notice')
 
     @property
@@ -1206,5 +1213,5 @@
         'department', 'faculty', 'current_mode', 'entry_session', 'certificate',
         'password', 'suspended', 'phone', 'email',
-        'adm_code', 'suspended_comment', 'current_level')
+        'adm_code', 'suspended_comment', 'current_level', 'flash_notice')
 
     def update(self):
@@ -1356,5 +1363,6 @@
     omit_fields = (
         'password', 'suspended', 'phone', 'date_of_birth',
-        'adm_code', 'sex', 'suspended_comment', 'current_level')
+        'adm_code', 'sex', 'suspended_comment', 'current_level',
+        'flash_notice')
 
     @property
@@ -1919,5 +1927,6 @@
     omit_fields = (
         'password', 'suspended', 'phone', 'date_of_birth',
-        'adm_code', 'sex', 'suspended_comment', 'current_level')
+        'adm_code', 'sex', 'suspended_comment', 'current_level',
+        'flash_notice')
 
     @property
@@ -2203,5 +2212,6 @@
     omit_fields = (
         'password', 'suspended', 'phone', 'adm_code',
-        'suspended_comment', 'date_of_birth', 'current_level')
+        'suspended_comment', 'date_of_birth', 'current_level',
+        'flash_notice')
 
     @property
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 13710)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 13711)
@@ -198,4 +198,12 @@
         )
 
+    flash_notice = schema.TextLine(
+        title = _(u'Flash Notice'),
+        required = False,
+        readonly = False,
+        description = _(
+            u'This single-line message will be shown in a flash box.'),
+        )
+
     student_id = schema.TextLine(
         title = _(u'Student Id'),
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 13710)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 13711)
@@ -544,4 +544,15 @@
         # Only the Application Slip does not exist
         self.assertFalse('Application Slip' in self.browser.contents)
+        return
+
+    def test_flash_notice(self):
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.student_path)
+        self.assertFalse('alert alert-warning' in self.browser.contents)
+        self.student.flash_notice = u'Happy Birthday!'
+        self.browser.open(self.student_path)
+        self.assertTrue(
+            '<div><div class="alert alert-warning">Happy Birthday!</div>'
+            in self.browser.contents)
         return
 
@@ -3522,10 +3533,10 @@
         self.assertTrue(
             'adm_code,clr_code,date_of_birth,email,employer,'
-            'firstname,lastname,matric_number,middlename,nationality,'
+            'firstname,flash_notice,lastname,matric_number,middlename,nationality,'
             'officer_comment,perm_address,personal_updated,phone,reg_number,'
             'sex,student_id,suspended,suspended_comment,transcript_comment,'
             'password,state,history,certcode,is_postgrad,current_level,'
             'current_session\r\n'
-            ',,1981-02-04#,aa@aa.ng,,Anna,Tester,234,,,,,,'
+            ',,1981-02-04#,aa@aa.ng,,Anna,,Tester,234,,,,,,'
             '1234#,123,m,K1000000,0,,,{SSHA}' in self.browser.contents)
 
@@ -3622,10 +3633,10 @@
         self.assertTrue(
             'adm_code,clr_code,date_of_birth,email,employer,'
-            'firstname,lastname,matric_number,middlename,nationality,'
+            'firstname,flash_notice,lastname,matric_number,middlename,nationality,'
             'officer_comment,perm_address,personal_updated,phone,reg_number,'
             'sex,student_id,suspended,suspended_comment,transcript_comment,'
             'password,state,history,certcode,is_postgrad,current_level,'
             'current_session\r\n'
-            ',,1981-02-04#,aa@aa.ng,,Anna,Tester,234,,,,,,'
+            ',,1981-02-04#,aa@aa.ng,,Anna,,Tester,234,,,,,,'
             '1234#,123,m,K1000000,0,,,{SSHA}' in self.browser.contents)
         self.assertEqual(len(self.app['datacenter'].running_exports), 1)
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 13710)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 13711)
@@ -126,5 +126,5 @@
     std_csv_entry = (
         'my adm code,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'
         )
@@ -157,5 +157,5 @@
         self.assertTrue(
             'adm_code,clr_code,date_of_birth,email,'
-            'employer,firstname,lastname,matric_number,middlename,'
+            'employer,firstname,flash_notice,lastname,matric_number,middlename,'
             'nationality,officer_comment,perm_address,personal_updated,'
             'phone,reg_number,sex,student_id,suspended,suspended_comment,'
@@ -163,5 +163,5 @@
             'current_level,current_session\r\n'
             'my adm code,my clr code,'
-            '1981-02-04#,anna@sample.com,,Anna,Tester,234,M.,NG,,'
+            '1981-02-04#,anna@sample.com,,Anna,,Tester,234,M.,NG,,'
             '"Studentroad 21\nLagos 123456\n",,+234-123-12345#,123,f,'
             'A111111,0,,,,created'
@@ -179,5 +179,5 @@
         self.assertTrue(
             'adm_code,clr_code,date_of_birth,email,'
-            'employer,firstname,lastname,matric_number,middlename,'
+            'employer,firstname,flash_notice,lastname,matric_number,middlename,'
             'nationality,officer_comment,perm_address,personal_updated,'
             'phone,reg_number,sex,student_id,suspended,suspended_comment,'
@@ -185,5 +185,5 @@
             'is_postgrad,current_level,current_session\r\n'
             'my adm code,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
@@ -199,5 +199,5 @@
         self.assertTrue(
             'adm_code,clr_code,date_of_birth,email,'
-            'employer,firstname,lastname,matric_number,middlename,'
+            'employer,firstname,flash_notice,lastname,matric_number,middlename,'
             'nationality,officer_comment,perm_address,personal_updated,'
             'phone,reg_number,sex,student_id,suspended,suspended_comment,'
@@ -205,5 +205,5 @@
             'is_postgrad,current_level,current_session\r\n'
             'my adm code,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
