Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt	(revision 6820)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt	(revision 6821)
@@ -94,11 +94,12 @@
     >>> importerselect.displayOptions
     ['Applicants Container Importer',
-     'CertificateCourse importer',
-     'Certificate importer',
-     'Course importer',
-     'Department importer',
-     'Faculty importer']
-
-    >>> importerselect.getControl('Faculty importer').selected = True
+     'Student Importer',
+     'CertificateCourse Importer',
+     'Certificate Importer',
+     'Course Importer',
+     'Department Importer',
+     'Faculty Importer']
+
+    >>> importerselect.getControl('Faculty Importer').selected = True
 
     >>> modeselect = browser.getControl(name='mode')
@@ -188,5 +189,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('Department importer').selected = True
+    >>> importerselect.getControl('Department Importer').selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
@@ -253,5 +254,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('Course importer', index=1).selected = True
+    >>> importerselect.getControl('Course Importer', index=1).selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
@@ -319,5 +320,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('Certificate importer').selected = True
+    >>> importerselect.getControl('Certificate Importer').selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
@@ -384,5 +385,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('CertificateCourse importer').selected = True
+    >>> importerselect.getControl('CertificateCourse Importer').selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
@@ -457,5 +458,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('Faculty importer').selected = True
+    >>> importerselect.getControl('Faculty Importer').selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
@@ -519,5 +520,5 @@
 
     >>> importerselect = browser.getControl(name='importer')
-    >>> importerselect.getControl('Faculty importer').selected = True
+    >>> importerselect.getControl('Faculty Importer').selected = True
     >>> modeselect = browser.getControl(name='mode')
     >>> modeselect.getControl(value='create').selected = True
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/batching.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/batching.py	(revision 6821)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/batching.py	(revision 6821)
@@ -0,0 +1,67 @@
+"""Batch processing components for academics objects.
+
+Batch processors eat CSV files to add, update or remove large numbers
+of certain kinds of objects at once.
+
+Here we define the processors for academics specific objects like
+faculties, departments and the like.
+"""
+import grok
+from zope.interface import Interface
+from waeup.sirp.interfaces import IBatchProcessor
+from waeup.sirp.students.interfaces import IStudent
+from waeup.sirp.utils.batching import BatchProcessor
+
+class StudentProcessor(BatchProcessor):
+    """A batch processor for IStudent objects.
+    """
+    grok.implements(IBatchProcessor)
+    grok.provides(IBatchProcessor)
+    grok.context(Interface)
+    util_name = 'studentimporter'
+    grok.name(util_name)
+
+    name = u'Student Importer'
+    iface = IStudent
+
+    location_fields = ['student_id',]
+    factory_name = 'waeup.Student'
+
+    mode = None
+
+    @property
+    def req(self):
+        result = dict(
+            create = self.required_fields,
+            update = self.location_fields,
+            remove = self.location_fields,
+        )
+        return result
+
+    def parentsExist(self, row, site):
+        return 'students' in site.keys()
+
+    # The entry never exists in create mode.
+    def entryExists(self, row, site):
+        if row.has_key('student_id'):
+            return row['student_id'] in site['students'].keys()
+        return False
+
+    def getParent(self, row, site):
+        return site['students']
+
+    def getEntry(self, row, site):
+        if not self.entryExists(row, site):
+            return None
+        parent = self.getParent(row, site)
+        return parent.get(row['student_id'])
+
+    def addEntry(self, obj, row, site):
+        parent = self.getParent(row, site)
+        parent.addStudent(obj)
+        return
+
+    def delEntry(self, row, site):
+        parent = self.getParent(row, site)
+        del parent[row['student_id']]
+        pass
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/batching.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/batching.py	(revision 6820)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/batching.py	(revision 6821)
@@ -24,5 +24,5 @@
     grok.name(util_name)
 
-    name = u'Faculty importer'
+    name = u'Faculty Importer'
     iface = IFaculty
 
@@ -66,5 +66,5 @@
     grok.name(util_name)
 
-    name = u'Department importer'
+    name = u'Department Importer'
     iface = IDepartment
 
@@ -113,5 +113,5 @@
     grok.name(util_name)
 
-    name = u'Course importer'
+    name = u'Course Importer'
     iface = ICourse
 
@@ -164,5 +164,5 @@
     grok.name(util_name)
 
-    name = u'Certificate importer'
+    name = u'Certificate Importer'
     iface = ICertificate
 
@@ -215,5 +215,5 @@
     grok.name(util_name)
 
-    name = u'CertificateCourse importer'
+    name = u'CertificateCourse Importer'
     iface = ICertificateCourse
 
