Index: /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/applicant.py
===================================================================
--- /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/applicant.py	(revision 7760)
+++ /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/applicant.py	(revision 7761)
@@ -37,4 +37,15 @@
 from waeup.sirp.applicants.workflow import application_states_dict
 
+from waeup.sirp.applicants.interfaces import IResultEntry
+from zope.schema.fieldproperty import FieldProperty
+class ResultEntry(grok.Model):
+    grok.implements(IResultEntry)
+    subject = FieldProperty(IResultEntry['subject'])
+    grade = FieldProperty(IResultEntry['grade'])
+
+    #def __init__(self, subject=None, grade=None):
+    #    self.subject = subject
+    #    self.grade = grade
+
 class Applicant(grok.Container):
     grok.implements(IApplicant,IApplicantEdit)
Index: /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/browser.py
===================================================================
--- /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/browser.py	(revision 7760)
+++ /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/browser.py	(revision 7761)
@@ -638,4 +638,12 @@
     return True
 
+from waeup.sirp.applicants.interfaces import IResultEntry
+from waeup.sirp.widgets.objectwidget import SIRPObjectWidget
+from waeup.sirp.applicants.applicant import ResultEntry
+from zope.formlib.widget import CustomWidgetFactory
+from zope.formlib.widgets import ListSequenceWidget
+entry_widget = CustomWidgetFactory(SIRPObjectWidget, ResultEntry)
+sw = CustomWidgetFactory(ListSequenceWidget, subwidget=entry_widget)
+
 class ApplicantManageFormPage(SIRPEditFormPage):
     """A full edit view for applicant data.
@@ -649,4 +657,5 @@
     form_fields['applicant_id'].for_display = True
     form_fields['phone'].custom_widget = PhoneWidget
+    form_fields['school_grades'].custom_widget = sw
     grok.template('applicanteditpage')
     manage_applications = True
@@ -780,4 +789,5 @@
     form_fields['phone'].custom_widget = PhoneWidget
     form_fields['applicant_id'].for_display = True
+    form_fields['school_grades'].custom_widget = sw
     grok.template('applicanteditpage')
     manage_applications = False
Index: /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/interfaces.py
===================================================================
--- /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/interfaces.py	(revision 7760)
+++ /main/waeup.sirp/branches/ulif-schoolgrades/src/waeup/sirp/applicants/interfaces.py	(revision 7761)
@@ -78,4 +78,26 @@
 directlyProvides(contextual_reg_num_source, IContextSourceBinder)
 
+SUBJECTS = dict(math=_(u'Math'),
+                bio=_(u'Biology'),
+                eng=_(u'English'),
+                )
+class SubjectSource(BasicSourceFactory):
+    def getValues(self):
+        return sorted(SUBJECTS.keys())
+    def getTitle(self, value):
+        return SUBJECTS.get(value, None)
+
+GRADES = {'A':_(u'Very Good'),
+          'B':_(u'Good'),
+          'C':_(u'Satisfactory'),
+          'D':_(u'Sufficient'),
+          'E':_(u'Fail'),
+          }
+class GradeSource(BasicSourceFactory):
+    def getValues(self):
+        return sorted(GRADES.keys())
+    def getTitle(self, value):
+        return GRADES.get(value, None)
+
 class AppCatCertificateSource(CertificateSource):
     """An application certificate source delivers all courses which belong to
@@ -352,4 +374,20 @@
     'provider'].order =  IApplicantsContainer['provider'].order
 
+class IResultEntry(Interface):
+    subject = schema.Choice(
+        title = _(u'Subject'),
+        source = SubjectSource(),
+        )
+    #subject = schema.TextLine(
+    #    title = _(u'Subject'),
+    #    )
+    grade = schema.Choice(
+        title = _(u'Grafde'),
+        source = GradeSource(),
+        )
+    #grade = schema.TextLine(
+    #    title = _(u'Grade'),
+    #    )
+
 class IApplicantBaseData(ISIRPObject):
     """The data for an applicant.
@@ -360,9 +398,9 @@
     state, depending on use-case.
 
-    This base interface is also implemented by the StudentApplication
-    class in the students package. Thus, these are the data which are saved
-    after admission.
-    """
-
+    This base interface is also implemented by the
+    :class:`waeup.sirp.students.StudentApplication` class in the
+    students package. Thus, these are the data which are saved after
+    admission.
+    """
     applicant_id = schema.TextLine(
         title = _(u'Applicant Id'),
@@ -430,4 +468,20 @@
         required = False,
         )
+    school_grades = schema.List(
+        title = _(u'School Grades'),
+        value_type = schema.Object(
+            schema = IResultEntry),
+        required = True,
+        default = [],
+        )
+    #school_grades = schema.Dict(
+    #    title = _(u'School Grades'),
+    #    key_type = schema.TextLine(
+    #        title = _(u'Subject'),
+    #        ),
+    #    value_type = schema.TextLine(
+    #        title = _(u'Grade'),
+    #        )
+    #    )
 
     #
