Index: WAeUP_SRP/branches/uli/skins/waeup_student/add_course_result.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/add_course_result.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/add_course_result.py	(revision 1653)
@@ -38,13 +38,13 @@
     if d['title'] == 'unknown':
         err = "No such course!"
-        logger.info('%s tried to add StudentCourseResult object %s for non-existing course' % (member,course_id))
+        #logger.info('%s tried to add StudentCourseResult object %s for non-existing course' % (member,course_id))
         break
     if context.hasObject(course_id):
         err = "Course already exists!"
-        logger.info('%s tried to add StudentCourseResult object %s which is already in course list' % (member,course_id))
+        #logger.info('%s tried to add StudentCourseResult object %s which is already in course list' % (member,course_id))
         break
     if context.hasObject("%s_co" % course_id):
         err = "Course already exists as carryover course!"
-        logger.info('%s tried to add StudentCourseResult object %s which already exists as carryover course' % (member,course_id))
+        #logger.info('%s tried to add StudentCourseResult object %s which already exists as carryover course' % (member,course_id))
         break
     break
@@ -54,5 +54,5 @@
     #args['error'] = err
     args['portal_status_message'] = err
-    url = "%s?%s" % (context.absolute_url(),urlencode(args))
+    url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
     return request.RESPONSE.redirect(url)
 
@@ -66,10 +66,12 @@
 args['course_id'] = course_id
 
-logger.info('%s added StudentCourseResult object %s' % (member,course_id))
+logger.info('%s added StudentCourseResult object %s for %s' % (member,course_id,context.getStudentId()))
 
-args = {}
 psm = "You successfully added course %s!" % course_id
 args['portal_status_message'] = psm
-url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+if action_after_validate:
+    url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+else:
+    url = context.absolute_url() + '?' + urlencode(args)
 return REQUEST.RESPONSE.redirect(url)
 
Index: WAeUP_SRP/branches/uli/skins/waeup_student/change_password.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/change_password.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/change_password.py	(revision 1653)
@@ -4,4 +4,14 @@
 
 """
+
+return
+
+
+
+
+
+
+
+
 request = context.REQUEST
 import DateTime,logging
Index: WAeUP_SRP/branches/uli/skins/waeup_student/clearance_edit.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/clearance_edit.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/clearance_edit.py	(revision 1653)
@@ -120,5 +120,5 @@
         wftool.doActionFor(info['clear'],'open')
         wftool.doActionFor(info['student'],'reject_clearance')
-        action = "/contact_student_form"
+        action = "/external_contact_student_form"
         psm = "Student's clearance request has been rejected! Please fill and submit the form below!"
         subject = "Clearance request rejected"
Index: WAeUP_SRP/branches/uli/skins/waeup_student/contact_student_form.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/contact_student_form.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/contact_student_form.pt	(revision 1653)
@@ -28,4 +28,6 @@
       <input type="hidden" name="probtype" type="text" id="probtype"
              tal:attributes="value subject"/>     
+      <input type="hidden" name="action" type="text" id="action"
+             tal:attributes="value continue"/>  
              
       <table width="100%" border="0" cellspacing="5" cellpadding="0">
Index: WAeUP_SRP/branches/uli/skins/waeup_student/course_registration_slip.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/course_registration_slip.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/course_registration_slip.pt	(revision 1653)
@@ -19,5 +19,8 @@
       
       <div tal:condition="validated">
-        - validated by Course Adviser -
+        - validated by Course Adviser - 
+      <span tal:condition="info/doc/validated_by|nothing" tal:omit-tag="">
+        <span tal:replace="info/doc/validated_by" /> on <span tal:replace="info/doc/validation_date" />
+      </span>
       </div>
       <div tal:condition="not: validated">
Index: WAeUP_SRP/branches/uli/skins/waeup_student/create_level.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/create_level.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/create_level.py	(revision 1653)
@@ -31,27 +31,32 @@
 current_level = student.level
 in_progress =  request.get('in_progress','not started')
+level_created =  request.get('level_created','xxx')
+create_level =  request.get('create_level',None)
 
-if context.hasObject(current_level):
-    response.redirect("%s/%s" % (context.absolute_url(),current_level))
+if context.hasObject(current_level) and create_level :
+    logger.info('%s", level %s already exists' % (student.id,current_level))
     return
 
-if in_progress in ('not started','started'):
-    session.set('in_progress','started')
-    view = context.in_progress_view(refresh=3,page='create_level?in_progress=started')
-    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
-    response.setHeader('Content-length','%d' % (len(view)))
-    response.setStatus('OK')
-    response.write(view)
-    response.write('')
-    if in_progress == 'started':
-        return
+##if in_progress in ('not started','started'):
+##    session.set('in_progress','started')
+##    view = context.in_progress_view(refresh=20,page='create_level?in_progress=started')
+##    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
+##    response.setHeader('Content-length','%d' % (len(view)))
+##    response.setStatus('OK')
+##    response.write(view)
+##    response.write('')
+##    if in_progress == 'started':
+##        return
     
-
-context.invokeFactory('StudentStudyLevel',"%s" % current_level)
-level = getattr(context,"%s" % current_level)
-context.portal_workflow.doActionFor(level,'open')
-study_session = context.getSessionString()
-level.getContent().edit(mapping={'session': study_session})
-context.portal_workflow.doActionFor(level,'close_for_edit')
+if level_created == current_level:
+    level = getattr(context,"%s" % current_level)
+else:
+    context.invokeFactory('StudentStudyLevel',"%s" % current_level)
+    level = getattr(context,"%s" % current_level)
+    context.portal_workflow.doActionFor(level,'open')
+    study_session = context.getSessionString()
+    level.getContent().edit(mapping={'session': study_session})
+    context.portal_workflow.doActionFor(level,'close_for_edit')
+    response.redirect("%s?level_created=%s" % (context.absolute_url(),current_level))
 results = context.results_import(matric_no = student.matric_no)
 if results:
@@ -90,19 +95,22 @@
         context.portal_workflow.doActionFor(course_result,'open')
         course_result.getContent().edit(mapping=d)
-res = context.portal_catalog(portal_type="Certificate", id = cert_id)
-l = []
-if res:
-    cert = res[0]
-    path = cert.getPath()
-    query = Eq("path",path) &\
-            Eq('portal_type','CertificateCourse') &\
-            Eq('SearchableText', "%s" % student.level)
-    courses = aq_portal(query)
-    for c in courses:
-        d = context.getCourseInfo(c.getId)
-        cr_id = level.invokeFactory('StudentCourseResult',c.getId)
-        course_result = getattr(level,cr_id)
-        context.portal_workflow.doActionFor(course_result,'open')
-        d['core_or_elective'] = getattr(c.getObject().getContent(),'core_or_elective')
-        course_result.getContent().edit(mapping=d)
-return
+level['create_course_results'](cert_id,current_level)
+##res = context.portal_catalog(portal_type="Certificate", id = cert_id)
+##l = []
+##if res:
+##    cert = res[0]
+##    path = cert.getPath()
+##    #set_trace()
+##    query = Eq("path","%s/%s" % (path,current_level)) &\
+##            Eq('portal_type','CertificateCourse')
+##    courses = aq_portal(query)
+##    for c in courses:
+##        d = context.getCourseInfo(c.getId)
+##        cr_id = level.invokeFactory('StudentCourseResult',c.getId)
+##        course_result = getattr(level,cr_id)
+##        context.portal_workflow.doActionFor(course_result,'open')
+##        d['core_or_elective'] = getattr(c.getObject().getContent(),'core_or_elective')
+##        course_result.getContent().edit(mapping=d)
+        
+return response.redirect("%s/%s" % (context.absolute_url(),current_level))
+
Index: WAeUP_SRP/branches/uli/skins/waeup_student/delete_course_result.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/delete_course_result.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/delete_course_result.py	(revision 1653)
@@ -14,4 +14,6 @@
 
 from Products.CMFCore.utils import getToolByName
+from AccessControl import Unauthorized
+
 here = context
 from urllib import urlencode
@@ -30,13 +32,21 @@
             real_ids.append(id)
     if real_ids:
-        context.manage_delObjects(real_ids)
-        logger.info('%s deleted StudentCourseResult object %s' % (member,id))
-        message = 'psm_item(s)_deleted'
+        try:
+            context.manage_delObjects(real_ids)
+            logger.info('%s deleted StudentCourseResult object %s for %s' % (member,id,context.getStudentId()))
+            message = 'psm_item(s)_deleted'
+        except Unauthorized:
+            logger.info('%s has no permission to delete StudentCourseResult objects for %s' % (member,context.getStudentId()))
+            message = 'no item(s) deleted'
 else:
     message = 'psm_select_at_least_one_document'
-    
+
 args = {}
 args['portal_status_message'] = message
-url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+
+if action_after_validate:
+    url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+else:
+    url = context.absolute_url() + '?' + urlencode(args)
 if REQUEST is not None:
-    return REQUEST.RESPONSE.redirect(url)    
+    return REQUEST.RESPONSE.redirect(url)
Index: WAeUP_SRP/branches/uli/skins/waeup_student/getSessionResults.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/getSessionResults.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/getSessionResults.py	(revision 1653)
@@ -101,5 +101,5 @@
 #set_trace()
 verdict_voc = context.portal_vocabularies.verdicts
-verdict_code = student_from_cat.get('verdict',None)
+verdict_code = student_from_cat.verdict
 if verdict_code:
     info['verdict'] = verdict = verdict_voc.get(verdict_code,'N/A').upper()
Index: WAeUP_SRP/branches/uli/skins/waeup_student/getStudyCourseInfo.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/getStudyCourseInfo.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/getStudyCourseInfo.py	(revision 1653)
@@ -25,5 +25,5 @@
 info = {}
 info['is_so'] = context.isSectionOfficer()
-info['action'] = "%s" % context.campus.absolute_url()
+info['action'] = "%s" % context.absolute_url()
 info['choosen_ids'] = request.get('ids',[])
 course  = info['doc'] = context.getContent()
@@ -57,5 +57,5 @@
 may_register = (student_review_state in ('school_fee_paid',)) and\
                current_level not in levels and\
-               (sbrain.verdict in ('A','B') or sbrain.jamb_reg_no.startswith('6'))
+               (sbrain.verdict in ('A','B','C') or sbrain.jamb_reg_no.startswith('6'))
 
 levels.sort()
Index: WAeUP_SRP/branches/uli/skins/waeup_student/getStudyLevelInfo.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/getStudyLevelInfo.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/getStudyLevelInfo.py	(revision 1653)
@@ -40,8 +40,10 @@
     return 0.0
 
-def cmp_semester(a,b):
-    if a['semester'] == b['semester']:
+def cmp_semester_id(a,b):
+    s1 = "%(semester)s%(id)s" % a
+    s2 = "%(semester)s%(id)s" % b
+    if s1 == s2:
         return 0
-    if a['semester'] > b['semester']:
+    if s1 > s2:
         return 1
     return -1
@@ -104,7 +106,7 @@
         normal.append(d)
 info['credits_total'] = credits_total
-carry_overs.sort(cmp_semester)
+carry_overs.sort(cmp_semester_id)
 info['carry_overs'] = carry_overs
-normal.sort(cmp_semester)
+normal.sort(cmp_semester_id)
 info['normal'] = normal
 
Index: WAeUP_SRP/branches/uli/skins/waeup_student/layout_personal_view.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/layout_personal_view.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/layout_personal_view.pt	(revision 1653)
@@ -9,5 +9,5 @@
       <td><span class="dlabel">Student ID</span>:
       </td>
-      <td tal:condition="nothing"> 
+      <td> 
          <span tal:replace="context/getStudentId" />
       </td>      
Index: WAeUP_SRP/branches/uli/skins/waeup_student/mail2student.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/mail2student.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/mail2student.py	(revision 1653)
@@ -5,8 +5,10 @@
 ##bind script=script
 ##bind subpath=traverse_subpath
-##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None
+##parameters=co_name=None,co_email=None,student_email=None,probtype=None,commt=None, action=None
 ##title=
 ##
 # $Id: mail2admin.py 869 2006-11-15 13:46:49Z henrik $
+
+from urllib import urlencode
 
 mhost = context.MailHost
@@ -27,11 +29,13 @@
 #prop.email_from_address should be used for To:
 REQUEST = context.REQUEST
-url_tuple = REQUEST.HTTP_REFERER.split('?')
-if len(url_tuple) == 2:
-    url_tuple[1] ='portal_status_message=Your message has been sent!'
-else:
-    url_tuple.append('portal_status_message=Your message has been sent!')
-redirect_url = "?".join(url_tuple)
-REQUEST.set('rurl', redirect_url) # to see the result in the error log
+
+#url_tuple = REQUEST.HTTP_REFERER.split('?')
+#if len(url_tuple) == 2:
+#    url_tuple[1] ='portal_status_message=Your message has been sent!'
+#else:
+#    url_tuple.append('portal_status_message=Your message has been sent!')
+#redirect_url = "?".join(url_tuple)
+#REQUEST.set('rurl', redirect_url) # to see the result in the error log
+
 msg = message % (
      co_name,
@@ -39,5 +43,5 @@
      student_email,
      co_email,
-     'henrik@waeup.org',
+     'waeup@saoas.org',
 #    'js@aixtraware.de',
      co_email,
@@ -47,6 +51,18 @@
 mhost.send(msg)
 
-REQUEST = context.REQUEST
-RESPONSE = REQUEST.RESPONSE
 
-RESPONSE.redirect(redirect_url)
+#REQUEST = context.REQUEST
+#RESPONSE = REQUEST.RESPONSE
+#RESPONSE.redirect(redirect_url)
+
+args = {}
+psm = "Your message has been sent!"
+args['portal_status_message'] = psm
+if action:
+    url = context.absolute_url() + '/' + action + '?' + urlencode(args)
+else:
+    url = context.absolute_url() +'?' + urlencode(args)
+return REQUEST.RESPONSE.redirect(url)
+
+
+
Index: WAeUP_SRP/branches/uli/skins/waeup_student/refresh_level.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/refresh_level.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/refresh_level.py	(revision 1653)
@@ -112,4 +112,7 @@
 psm = "Course list updated!"
 args['portal_status_message'] = psm
-url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+if action_after_validate:
+    url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+else:
+    url = context.absolute_url() + '?' + urlencode(args)
 return REQUEST.RESPONSE.redirect(url)
Index: WAeUP_SRP/branches/uli/skins/waeup_student/register_courses.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/register_courses.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/register_courses.py	(revision 1653)
@@ -19,5 +19,5 @@
         pass
 
-from urllib import urlencode        
+from urllib import urlencode
 
 request = context.REQUEST
@@ -47,4 +47,7 @@
 psm = "You successfully submitted your course list!"
 args['portal_status_message'] = psm
-url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+if action_after_validate:
+    url = context.absolute_url() + '/' + action_after_validate + '?' + urlencode(args)
+else:
+    url = context.absolute_url() + '?' + urlencode(args)
 return REQUEST.RESPONSE.redirect(url)
Index: WAeUP_SRP/branches/uli/skins/waeup_student/reject_courses.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/reject_courses.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/reject_courses.py	(revision 1653)
@@ -46,4 +46,7 @@
 args['continue'] = action_after_validate
 args['portal_status_message'] = psm
-url = context.absolute_url() + '/' + action_after_reject + '?' + urlencode(args)
+if action_after_reject:
+    url = context.absolute_url() + '/' + action_after_reject + '?' + urlencode(args)
+else:
+    url = context.absolute_url() + '?' + urlencode(args)
 return REQUEST.RESPONSE.redirect(url)
Index: WAeUP_SRP/branches/uli/skins/waeup_student/statistics_new_view.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/statistics_new_view.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/statistics_new_view.pt	(revision 1653)
@@ -33,5 +33,5 @@
             <th align="right">CR</th>
             <th align="right">VC</th>
-            <th align="right">SFP</th>
+            <th align="right">SFP+</th>
           </tr>
           <tr tal:repeat="d departments"
@@ -74,5 +74,5 @@
         <tr><td>CR: </td> <td>Clearance requested</td></tr>
         <tr><td>VC: </td> <td>Validated and cleared</td></tr>
-        <tr><td>SFP: </td> <td>School fee paid</td></tr>
+        <tr><td>SFP+: </td> <td>School fee paid and further</td></tr>
         </table>
       </span>
Index: WAeUP_SRP/branches/uli/skins/waeup_student/statistics_ret_view.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/statistics_ret_view.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/statistics_ret_view.pt	(revision 1653)
@@ -34,5 +34,5 @@
             <th >Faculty</th>
             <th align="right">RET</th>
-            <th align="right">SFP</th>
+            <th align="right">SFP+</th>
           </tr>
           <tr tal:define="d python:departments[0]"
@@ -60,5 +60,5 @@
         <table>
         <tr><td>RET:</td> <td>Returning students who have logged in</td></tr>
-        <tr><td>SFP:</td> <td>Returning students who already paid their school fee</td></tr>
+        <tr><td>SFP:</td> <td>Returning students who paid their school fee</td></tr>
         </table>        
       </span>
Index: WAeUP_SRP/branches/uli/skins/waeup_student/study_course_view.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/study_course_view.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/study_course_view.pt	(revision 1653)
@@ -66,5 +66,5 @@
             tal:attributes="class python:test(repeat['row'].even(), 'even ajaxtd', 'odd ajaxtd')">
             <td align="left" valign="middle" style="width: 5px;" 
-                tal:condition="python: 0 and is_so">
+                tal:condition="python:is_so">
               <input type="checkbox" name="ids:list" value="" id="" class="noborder"
                      tal:condition="is_so"
@@ -84,9 +84,8 @@
                summary="contents of the folder"
                class="folderButtons">
-          <tr>
+          <tr tal:condition="python: is_so and info['items']">
             <td align="left" valign="top" rowspan="3"></td>
             <td align="left" valign="top">
-              <span tal:condition="python:0 and is_so">
-                <input type="button" value="button_select_all" class="context"
+              <input type="button" value="button_select_all" class="context"
                        onclick="someJavaScriptFunctionThatWillBeReplaced"
                        i18n:attributes="value"
@@ -94,10 +93,9 @@
                        % (cpsmcat('button_select_all'), cpsmcat('button_deselect_all'))"
                        />
-                <input type="submit" name="folder_delete:method" value="button_delete"
-                       class="destructive" i18n:attributes="value"
-                       tal:attributes="onclick python:'return window.confirm(\'%s\')' %
-                       (cpsmcat('description_confirm_delete'), )" 
-                       />
-              </span>
+              <input type="submit" name="folder_delete:method" value="button_delete"
+                     class="destructive" i18n:attributes="value"
+                     tal:attributes="onclick python:'return window.confirm(\'%s\')' %
+                     (cpsmcat('description_confirm_delete'), )" 
+                     />
             </td>
           </tr>
Index: WAeUP_SRP/branches/uli/skins/waeup_student/study_level_view.pt
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/study_level_view.pt	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/study_level_view.pt	(revision 1653)
@@ -64,5 +64,6 @@
         <br />
       <div class="" tal:condition="not: info/normal">
-        Your faculty has not yet provided the list of courses for your certificate. Please contact your faculty!
+        <font color="red">Your faculty has not yet provided the list of courses for your certificate. Please contact your faculty!</font>
+        <br /><br />
       </div>
         <table class="contentListing" width="100%" id="folder_content"
@@ -109,8 +110,21 @@
                        class="context" value="Update" 
                        />
+                      
+                       
                 <br /><br />
                 <input tal:condition="info/normal" 
                        type="submit" name="register_courses:method"
                        class="context" value="Submit" />
+                       
+                <input type="hidden" name="action_after_validate" type="text" id="action_after_validate"
+                       tal:attributes="value string:study_level_view"/>  
+                       
+                <br /><br />
+                
+                <strong>Note:</strong> 'Update' checks for all courses in your certificate and will add them to your course list irrespective of
+                prior deletion, i.e. already deleted courses will show up again. 
+                
+                Please use this function only if you are sure that your faculty has added courses which are not yet on your course list.                                
+                       
             </td>
           </tr>
@@ -142,4 +156,9 @@
                 <input tal:condition="python: review_state in ('courses_registered', 'courses_validated',)" type="submit" name="reject_courses:method"
                        class="context" value="Reject" />
+                       
+                <input type="hidden" name="action_after_validate" type="text" id="action_after_validate"
+                       tal:attributes="value string:study_level_view"/>                         
+                <input type="hidden" name="action_after_reject" type="text" id="action_after_reject"
+                       tal:attributes="value string:contact_student_form"/>                         
 
             </td>
@@ -176,7 +195,7 @@
                        
                 <input type="hidden" name="action_after_validate" type="text" id="action_after_validate"
-                       tal:attributes="value string:/study_level_view"/>                         
+                       tal:attributes="value string:study_level_view"/>                         
                 <input type="hidden" name="action_after_reject" type="text" id="action_after_reject"
-                       tal:attributes="value string:/contact_student_form"/>    
+                       tal:attributes="value string:contact_student_form"/>    
                                              
 
@@ -199,5 +218,5 @@
                      />
               <input type="hidden" name="action_after_validate" type="text" id="action_after_validate"
-                       tal:attributes="value string:/study_level_view"/>                       
+                       tal:attributes="value string:study_level_view"/>                       
             </td>                
         </table>
Index: WAeUP_SRP/branches/uli/skins/waeup_student/validate_courses.py
===================================================================
--- WAeUP_SRP/branches/uli/skins/waeup_student/validate_courses.py	(revision 1593)
+++ WAeUP_SRP/branches/uli/skins/waeup_student/validate_courses.py	(revision 1653)
@@ -13,4 +13,6 @@
 """
 from Products.CMFCore.WorkflowCore import WorkflowException
+import DateTime
+current = DateTime.DateTime()
 try:
     from Products.zdb import set_trace
@@ -30,4 +32,8 @@
 student_id = context.getStudentId()
 student = getattr(students_folder,student_id)
+level_doc = context.getContent()
+if level_doc.portal_type == 'StudentStudyLevel':
+    level_doc.edit(mapping={'validated_by': member_id,
+                            'validation_date': current,})
 try:
     wftool.doActionFor(student,'validate_courses')
