Index: WAeUP_SRP/base/WAeUPTables.py
===================================================================
--- WAeUP_SRP/base/WAeUPTables.py	(revision 2395)
+++ WAeUP_SRP/base/WAeUPTables.py	(revision 2396)
@@ -459,4 +459,9 @@
     ###)
 
+    security.declarePublic("missingValue")###(
+    def missingValue(self):
+        from Missing import MV
+        return MV
+    ###)
 ###)
 
@@ -538,7 +543,5 @@
             return 2
         return -3
-
 InitializeClass(PinTable)
-
 ###)
 
@@ -1083,12 +1086,15 @@
             return
         rpl = infos['rpath'].split('/')
-        if pt == 'Student' and mt == 'CPS Proxy Folder'\
-           and event_type == "sys_add_object":
+        if pt == 'Student' and mt == 'CPS Proxy Folder':
             student_id = object.id
-            try:
-                self.addRecord(id = student_id)
-            except ValueError:
-                pass
-            return
+            if event_type == "sys_add_object":
+                try:
+                    self.addRecord(id = student_id)
+                except ValueError:
+                    pass
+                return
+            elif event_type == 'sys_del_object':
+                self.deleteRecord(student_id)
+                #import pdb;pdb.set_trace()
         elif pt == 'StudentCourseResult' and mt == 'CPS Proxy Folder':
             if event_type not in ("sys_add_object","sys_del_object"):
@@ -1108,5 +1114,4 @@
             if not registered_courses:
                 registered_courses = []
-            #import pdb;pdb.set_trace()
             if event_type == "sys_add_object":
                 if course_id not in registered_courses:
Index: WAeUP_SRP/base/WAeUPTool.py
===================================================================
--- WAeUP_SRP/base/WAeUPTool.py	(revision 2395)
+++ WAeUP_SRP/base/WAeUPTool.py	(revision 2396)
@@ -690,4 +690,26 @@
     ###)
 
+    security.declareProtected(ModifyPortalContent,'removePictureFolder') ###(
+    def removePictureFolder(self,student_id):
+        """remove picture_folder by renaming it"""
+        path = 'images'
+        picture_path = os.path.join(i_home,path,student_id)
+        if not os.path.exists(picture_path):
+            return False
+        os.rename(picture_path,picture_path + "_removed")
+        return True
+    ###)
+
+    security.declareProtected(ModifyPortalContent,'restorePictureFolder') ###(
+    def restorePictureFolder(self,student_id):
+        """restore picture_folder by renaming it"""
+        path = 'images'
+        picture_path = os.path.join(i_home,path,student_id)
+        if not os.path.exists(picture_path + "_removed"):
+            return False
+        os.rename(picture_path + "_removed",picture_path)
+        return True
+    ###)
+
     security.declarePublic('picturesExist') ###(
     def picturesExist(self, ids):
Index: WAeUP_SRP/base/skins/waeup_utilities/remove_students.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_utilities/remove_students.py	(revision 2396)
+++ WAeUP_SRP/base/skins/waeup_utilities/remove_students.py	(revision 2396)
@@ -0,0 +1,94 @@
+## Script (Python) "remove_students"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=REQUEST
+##title=
+##
+# $Id$
+"""
+remove a list of students
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+import logging
+logger = logging.getLogger('Skins.remove_students')
+from Products.AdvancedQuery import Eq, Between, Le,In
+#aq_portal = context.portal_catalog_real.evalAdvancedQuery
+aq_students = context.students_catalog.evalAdvancedQuery
+students_folder = context.portal_url.getPortalObject().campus.students
+stdir = context.portal_directories.students
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+rget = REQUEST.form.get
+info = {}
+info['member'] = member
+info['is_so'] = context.isSectionOfficer()
+ids = info['choosen_ids'] = rget('ids',[])
+search_list = rget('search_string','')
+delete = rget('delete',None)
+info['search_string'] = search_list
+student_ids = search_list.split()
+students = []
+#set_trace()
+psm = 'nothing done'
+deleted_list = []
+if delete:
+    if not ids:
+        psm = "nothing checked"
+    else:
+        for student_id in ids:
+            logger.info("%s deletes student %s" % (member,student_id))
+            if hasattr(students_folder,student_id):
+                students_folder.manage_delObjects((student_id),)
+                logger.info("%s deleted student object for %s" % (member,student_id))
+            else:
+                logger.info("No student object for %s" % (student_id))
+                continue
+            # remove from directory
+            if hasattr(stdir, student_id):
+                stdir.deleteEntry(student_id)
+                logger.info("%s deleted Student directory for %s" % (member,student_id))
+            else:
+                logger.info("No Student directory for %s" % (student_id))
+                continue
+            context.waeup_tool.removePictureFolder(student_id)
+            deleted_list.append(student_id)
+            
+        psm = "%s deleted" % ' '.join(deleted_list)
+if student_ids:
+    brains = aq_students(In('id',student_ids))
+    brains_dict = {}
+    if brains:
+        for b in brains:
+            brains_dict[b.id] = b
+    for student_id in student_ids:
+        student = {}
+        student['deleted'] = delete and student_id in ids
+        if student_id in brains_dict.keys():
+            student['found'] = True
+            student['id'] = brains_dict[student_id].id
+            student['jamb_reg_no'] = brains_dict[student_id].jamb_reg_no
+            student['name'] = brains_dict[student_id].name
+            student['matric_no'] = brains_dict[student_id].matric_no
+        else:
+            student['found'] = False
+            student['id'] = student_id
+            student['jamb_reg_no'] = ""
+            student['name'] = "not found"
+            student['matric_no'] = ''
+        student['show_checkbox'] = not student['deleted'] and student['found']
+        students.append(student)
+
+
+return context.remove_students_form(info = info,
+                                    students = students,
+                                    allowed = True,
+                                    psm = psm,
+                                    )
Index: WAeUP_SRP/base/skins/waeup_utilities/remove_students_form.pt
===================================================================
--- WAeUP_SRP/base/skins/waeup_utilities/remove_students_form.pt	(revision 2396)
+++ WAeUP_SRP/base/skins/waeup_utilities/remove_students_form.pt	(revision 2396)
@@ -0,0 +1,162 @@
+<tal:block tal:define="portal_status_message options/psm;
+           students options/students;
+           info options/info|nothing;
+           is_so info/is_so;
+           allowed options/allowed|nothing;"
+           >
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main">
+    <span tal:condition="not: allowed">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="allowed" tal:omit-tag="">
+      <h3> Remove Student Section</h3><br />
+      You are logged in as member <span tal:replace="info/member|nothing" /> 
+      <form action="remove_students" method="post"
+            enctype="multipart/form-data" class="workflow">
+        <div class="">
+          <div class="documentFields">
+            <table width="" cellpadding="2" cellspacing="2" summary="Form layout">
+              <tr valign="top">
+                <td colspan="1">
+                  <div class=""
+                       id="widget__search_string_widget">
+                    <div class="label">
+                      <label for="search_string">provide a list of student ids  to remove</label>
+                    </div>
+                    <div class="field">
+                      <input name="search_string" 
+                             type="text" 
+                             id="search_string" 
+                             value="" 
+                             size="80" 
+                             tal:attributes="value info/search_string"/>
+                    </div>
+                  </div>
+                </td>
+              </tr>
+            </table>
+            <input type="submit" class="standalone" name="cpsdocument_edit_button" value="Search" />
+          </div>        
+        </div>
+        <span tal:condition="students">
+          <span
+            tal:define="items students;
+            columns python:3;
+            items_per_page python:40;
+            max_items python:300;
+            zoom python:0;
+            batches_all python:here.getBatchList(items,columns, items_per_page,zoom,max_items=400);
+            batches python:batches_all[0];
+            batch_info python:batches_all[1];
+            zoomed python:batches_all[2];
+            mq nocall:modules/ZTUtils/make_query;"
+            tal:omit-tag=""
+            >
+          <tal:block tal:condition="python: items and batch_info and batch_info['nb_pages'] > 1">
+            <div class="batchLayout">
+              <span i18n:translate="">
+                Objects: 
+                <strong>
+                  <tal:block replace="batch_info/start"
+                             i18n:name="batch_start" /> - <tal:block replace="batch_info/limit"
+                                                                     i18n:name="batch_limit" />
+                </strong>
+                of <tal:block replace="batch_info/length"
+                              i18n:name="batch_length" />
+              </span>
+            </div>
+            <br />
+          </tal:block>
+            <table class="contentListing" width="100%">
+              <span tal:repeat="rows batches" tal:omit-tag="">
+                <span tal:repeat="student rows">
+                  <tr tal:condition="student" 
+                      tal:attributes="class python:test(repeat['student'].even(), 'even ajaxtd', 'odd ajaxtd')">
+                    <td align="left" valign="middle" style="width: 5px;" 
+                        tal:condition="is_so">
+                      <input type="checkbox" name="ids:list" value="" id="" class="noborder"
+                             tal:condition="student/show_checkbox"
+                             tal:define="id student/id"
+                             tal:attributes="value id;
+                             id python:'cb_' + id;
+                             checked python:id in info['choosen_ids'];" 
+                             />
+                    </td>
+                    <td>
+                      <a href="id" tal:condition="student/show_checkbox" 
+                         tal:attributes="href string:${context/portal_url}/campus/students/${student/id}"
+                         tal:content="student/id"></a>
+                      <span tal:content="student/id" tal:condition="not: student/show_checkbox" tal:omit-tag="" />
+                    </td>    
+                    <td>
+                      <span tal:replace="student/name" />
+                    </td>    
+                    <td><span tal:replace="student/matric_no" /></td>   
+                    <td><span tal:replace="student/jamb_reg_no" /></td>
+                  </tr>
+                </span>
+              </span>
+              <tr>
+                <td align="left" valign="top" rowspan="3"></td>
+                <td align="left" valign="top">
+                  <span tal:condition="is_so">
+                    <input type="button" value="button_select_all" class="context"
+                           onclick="someJavaScriptFunctionThatWillBeReplaced"
+                           i18n:attributes="value"
+                           tal:attributes="onclick python:'toggleSelect(this, \'%s\', \'%s\')'
+                           % (cpsmcat('button_select_all'), cpsmcat('button_deselect_all'))"
+                           />
+                    <input type="submit" name="delete" value="Delete checked"
+                           class="destructive"
+                           tal:attributes="onclick python:'return window.confirm(\'%s\')' %
+                           (cpsmcat('description_confirm_delete'), )" 
+                           />
+                  </span>
+                </td>
+              </tr>
+            </table>
+            <tal:block condition="python:batch_info and batch_info['nb_pages'] > 1">
+              <div class="pageNavigationLayout">
+                <a tal:define="previous batch_info/previous"
+                   tal:condition="python:previous is not None"
+                   tal:attributes="href python:'%s?%s'%(request['URL'],
+                   mq(request.form, b_start=0))"
+                   >
+                (&lt;&lt;)</a>
+                <a tal:define="previous batch_info/previous"
+                   tal:condition="python:previous is not None"
+                   tal:attributes="href python:'%s?%s'%(request['URL'],
+                   mq(request.form, b_start=previous))"
+                   i18n:translate="batch_previous">Previous</a>
+                <tal:block repeat="page batch_info/pages">
+                  <tal:block condition="python:page != batch_info['start'] - 1">
+                    <a tal:attributes="href python:'%s?%s'%(request['URL'],
+                    mq(request.form, b_start=page))"
+                    tal:content="repeat/page/number">1</a>&nbsp;
+                  </tal:block>
+                  <tal:block condition="python:page == batch_info['start'] - 1">
+                    <span tal:content="string:${repeat/page/number}" />&nbsp;
+                  </tal:block>
+                </tal:block>
+                <a tal:define="next batch_info/next"
+                   tal:condition="python:next is not None"
+                   tal:attributes="href python:'%s?%s'%(request['URL'],
+                   mq(request.form, b_start=next))"
+                   i18n:translate="batch_next">Next</a>
+                <a tal:define="next batch_info/next;
+                last_page python:batch_info['pages'][-1]"
+                tal:condition="python:next is not None"
+                tal:attributes="href python:'%s?%s'%(request['URL'],
+                mq(request.form, b_start=last_page))"
+                >
+                (&gt;&gt;)</a>
+              </div>
+            </tal:block>
+          </span>
+        </span>
+      </form>
+    </span>
+  </metal:main>
+</metal:body>
+</tal:block>
