Index: /main/waeup.sirp/trunk/src/waeup/sirp/applicants/batching.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/applicants/batching.py	(revision 7261)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/applicants/batching.py	(revision 7262)
@@ -22,5 +22,6 @@
 from waeup.sirp.interfaces import IBatchProcessor
 from waeup.sirp.utils.batching import BatchProcessor
-from waeup.sirp.applicants.interfaces import IApplicantsContainer
+from waeup.sirp.applicants.interfaces import (
+    IApplicantsContainer, IApplicant)
 
 class ApplicantsContainerImporter(BatchProcessor):
@@ -64,2 +65,59 @@
         del parent[row['code']]
         return
+
+class ApplicantProcessor(BatchProcessor):
+    """A batch processor for IApplicant objects.
+    """
+    grok.implements(IBatchProcessor)
+    grok.provides(IBatchProcessor)
+    grok.context(Interface)
+    util_name = 'applicantimporter'
+    grok.name(util_name)
+    name = u'Applicant Importer'
+    iface = IApplicant
+    location_fields = []
+    factory_name = 'waeup.Applicant'
+    location_fields = ['container_code', 'application_number']
+
+    mode = None
+
+    @property
+    def req(self):
+        result = dict(
+            create = ['container_code'] + self.required_fields,
+            update = self.location_fields,
+            remove = self.location_fields,
+        )
+        return result
+
+    def parentsExist(self, row, site):
+        if not 'applicants' in site.keys():
+            return False
+        return row['container_code'] in site['applicants'].keys()
+
+    def entryExists(self, row, site):
+        if not self.parentsExist(row, site):
+            return None
+        parent = self.getParent(row, site)
+        if 'application_number' in row.keys() and row['application_number']:
+            if row['application_number'] in parent.keys():
+                return parent[row['application_number']]
+        return None
+
+    def getParent(self, row, site):
+        return site['applicants'][row['container_code']]
+
+    def getEntry(self, row, site):
+        return self.entryExists(row, site)
+
+    def addEntry(self, obj, row, site):
+        parent = self.getParent(row, site)
+        parent.addApplicant(obj)
+        return
+
+    def delEntry(self, row, site):
+        applicant = self.entryExists(row, site)
+        if applicant:
+            parent = self.getParent(row, site)
+            del parent[row['application_number']]
+        pass
Index: /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 7261)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 7262)
@@ -259,5 +259,4 @@
         readonly = False,
         )
-
     reg_no = schema.TextLine(
         title = u'JAMB Registration Number',
@@ -269,14 +268,4 @@
         required = False,
         readonly = True,
-        )
-    course1 = schema.Choice(
-        title = u'1st Choice Course of Study',
-        source = AppCatCertificateSource(),
-        required = True,
-        )
-    course2 = schema.Choice(
-        title = u'2nd Choice Course of Study',
-        source = AppCatCertificateSource(),
-        required = False,
         )
     firstname = schema.TextLine(
@@ -318,12 +307,14 @@
         required = False,
         )
-    #passport = ImageFile(
-    #    title = u'Passport Photograph',
-    #    #default = DEFAULT_PASSPORT_IMAGE_MALE,
-    #    defaultFactory = default_passport_image,
-    #    description = u'Maximun file size is 20 kB.',
-    #    required = True,
-    #    max_size = 20480,
-    #    )
+    course1 = schema.Choice(
+        title = u'1st Choice Course of Study',
+        source = CertificateSource(),
+        required = True,
+        )
+    course2 = schema.Choice(
+        title = u'2nd Choice Course of Study',
+        source = CertificateSource(),
+        required = False,
+        )
 
     #
@@ -371,7 +362,21 @@
     Here we can repeat the fields from base data and set the
     `required` and `readonly` attributes to True to further restrict
-    the data access. We cannot omit fields. This has to be done in the
+    the data access. Or we can allow only certain certificates to be
+    selected by choosing the appropriate source.
+
+    We cannot omit fields here. This has to be done in the
     respective form page.
     """
+
+    course1 = schema.Choice(
+        title = u'1st Choice Course of Study',
+        source = AppCatCertificateSource(),
+        required = True,
+        )
+    course2 = schema.Choice(
+        title = u'2nd Choice Course of Study',
+        source = AppCatCertificateSource(),
+        required = False,
+        )
     screening_score = schema.Int(
         title = u'Screening Score',
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt	(revision 7261)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/batchprocessing.txt	(revision 7262)
@@ -93,5 +93,6 @@
     >>> importerselect = browser.getControl(name='importer')
     >>> importerselect.displayOptions
-    ['Applicants Container Importer',
+    ['Applicant Importer',
+     'Applicants Container Importer',
      'Student Importer',
      'StudentStudyCourse Importer (update only)',
