Index: main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 17821)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 17822)
@@ -77,4 +77,5 @@
     IMedicalHistory,
     ITiship,
+    INYSC,
     ICustomCourseTicket)
 from waeup.uniben.interfaces import MessageFactory as _
@@ -552,10 +553,4 @@
         form_fields = grok.AutoFields(
             ICustomStudentPersonalEdit).omit('personal_updated') + grok.AutoFields(ITiship)
-        studycourse = self.context['studycourse']
-        certificate = getattr(studycourse,'certificate',None)
-        current_level = studycourse.current_level
-        end_level = certificate.end_level
-        if not self.context.current_level >= end_level:
-            form_fields = form_fields.omit('nysc')
         return form_fields
 
@@ -1072,2 +1067,60 @@
             self.context.student, omit_fields=self.omit_fields,
             letterhead_path=letterhead_path, post_text=None)
+
+class StudentNYSCEditFormPage(KofaEditFormPage):
+    """ Page to edit NYSC data
+    """
+    grok.context(ICustomStudent)
+    grok.name('edit_nysc')
+    grok.require('waeup.handleStudent')
+    label = _('NYSC Request')
+    pnav = 4
+
+    def update(self):
+        if not self.context.eligible_for_nysc:
+            self.flash('You are not allowed to apply for NYSC.',
+                type="warning")
+            self.redirect(self.url(self.context))
+            return
+        return super(StudentNYSCEditFormPage, self).update()
+
+    @property
+    def form_fields(self):
+        form_fields = grok.AutoFields(INYSC)
+        form_fields['nysc_updated'].for_display = True
+        form_fields['nysc_senate_info'].for_display = True
+        form_fields['nysc'].field.description = u'Ensure that all your school charges are paid up to date to your graduating session before making this nysc application.'
+        form_fields['nysc'].field.title = u'Do you want to apply for NYSC?'
+        form_fields[
+            'nysc_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+        form_fields['nysc'].custom_widget = CustomBooleanRadioWidget
+        return form_fields
+
+    @action(_('Save'), style='primary')
+    def save(self, **data):
+        msave(self, **data)
+        self.context.nysc_updated = datetime.utcnow()
+        return
+
+class StudentNYSCManageFormPage(KofaEditFormPage):
+    """ Page to manage NYSC data
+    """
+    grok.context(ICustomStudent)
+    grok.name('manage_nysc')
+    grok.require('waeup.manageStudent')
+    label = _('Manage NYSC request data')
+
+    @property
+    def form_fields(self):
+        form_fields = grok.AutoFields(INYSC)
+        form_fields['nysc_updated'].for_display = True
+        form_fields['nysc'].field.description = u''
+        form_fields['nysc'].field.title = u'NYSC requested'
+        form_fields[
+            'nysc_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+        return form_fields
+
+    @action(_('Save'), style='primary')
+    def save(self, **data):
+        msave(self, **data)
+        return
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py	(revision 17821)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/interfaces.py	(revision 17822)
@@ -23,4 +23,5 @@
 from waeup.kofa.students.vocabularies import StudyLevelSource
 from kofacustom.nigeria.interfaces import GradingSystemSource
+from waeup.kofa.schema import FormattedDate
 from kofacustom.nigeria.students.interfaces import (
     INigeriaStudentBase, INigeriaUGStudentClearance, INigeriaPGStudentClearance,
@@ -215,4 +216,29 @@
         )
 
+class INYSC(IKofaObject):
+    """Student NYSC data.
+    """
+
+    nysc = schema.Bool(
+        title = u'NYSC',
+        default = False,
+        required = True,
+        )
+
+    nysc_updated = schema.Datetime(
+        title = _(u'NYSC request data last updated by student'),
+        )
+
+    nysc_date_of_graduation = FormattedDate(
+        title = _(u'Date of Graduation'),
+        required = False,
+        show_year = True,
+        )
+
+    nysc_senate_info = schema.TextLine(
+        title = _(u'Senate Info'),
+        required = False,
+        )
+
 class ITiship(IKofaObject):
     """Student tiship data.
@@ -239,10 +265,4 @@
         )
 
-    nysc = schema.Bool(
-        title = _(u'Applying for NYSC'),
-        default = False,
-        required = True,
-        )
-
 class ICustomStudentPersonalEdit(INigeriaStudentPersonalEdit):
     """Interface for editing personal data by students.
@@ -255,11 +275,4 @@
         )
 
-    nysc = schema.Bool(
-        title = _(u'Do you want to apply for NYSC?'),
-        default = False,
-        description = u'Ensure that all your school charges are paid up to date to your graduating session before making this nysc application.',
-        required = True,
-        )
-
 class ICustomUGStudentClearance(INigeriaUGStudentClearance):
     """Representation of ug student clearance data.
@@ -272,5 +285,5 @@
 class ICustomStudent(ICustomStudentBase, ICustomUGStudentClearance,
     ICustomPGStudentClearance, ICustomStudentPersonal, IMedicalHistory,
-    ITiship):
+    ITiship, INYSC):
     """Representation of a student.
     """
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/student.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/student.py	(revision 17821)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/student.py	(revision 17822)
@@ -29,5 +29,6 @@
 from kofacustom.nigeria.students.student import NigeriaStudent
 from waeup.uniben.students.interfaces import (
-    ICustomStudent, ICustomStudentPersonalEdit, IMedicalHistory, ITiship)
+    ICustomStudent, ICustomStudentPersonalEdit,
+    IMedicalHistory, ITiship, INYSC)
 
 
@@ -38,5 +39,5 @@
     grok.implements(
         ICustomStudent, IStudentNavigation, ICustomStudentPersonalEdit,
-        IMedicalHistory, ITiship)
+        IMedicalHistory, ITiship, INYSC)
     grok.provides(ICustomStudent)
 
@@ -64,4 +65,17 @@
         return self.state in (TRANSREL, TRANSVAL)
 
+    @property
+    def eligible_for_nysc(self):
+        if not self.current_mode.startswith('ug') \
+            and not self.current_mode.startswith('de'):
+            return False
+        studycourse = self['studycourse']
+        certificate = getattr(studycourse,'certificate',None)
+        current_level = studycourse.current_level
+        end_level = certificate.end_level
+        if not self.current_level >= end_level:
+            return False
+        return True
+
 
 # Set all attributes of Student required in IStudent as field
Index: main/waeup.uniben/trunk/src/waeup/uniben/students/viewlets.py
===================================================================
--- main/waeup.uniben/trunk/src/waeup/uniben/students/viewlets.py	(revision 17821)
+++ main/waeup.uniben/trunk/src/waeup/uniben/students/viewlets.py	(revision 17822)
@@ -237,4 +237,28 @@
         return self.view.url(self.view.context, self.target)
 
+class NYSCEditActionButton(ManageActionButton):
+    grok.order(13)
+    grok.context(ICustomStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.handleStudent')
+    text = _('NYSC Request')
+    target = 'edit_nysc'
+    icon = 'actionicon_nigeria.png'
+
+    @property
+    def target_url(self):
+        if not self.context.eligible_for_nysc:
+            return ''
+        return self.view.url(self.view.context, self.target)
+
+class NYSCManageActionButton(ManageActionButton):
+    grok.require('waeup.manageStudent')
+    text = _('Manage NYSC request data')
+    target = 'manage_nysc'
+    grok.order(13)
+    grok.context(ICustomStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    icon = 'actionicon_nigeria.png'
+
 # JAMB Letter
 
