Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/browser.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/browser.py	(revision 15575)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/browser.py	(revision 15576)
@@ -164,4 +164,10 @@
         if self.context.special:
             return grok.AutoFields(ICustomSpecialApplicant)
+        if self.target == 'conv':
+            form_fields = grok.AutoFields(ICustomSpecialApplicant)
+            form_fields = form_fields.omit(
+                'special_application', 'carryover_courses',
+                'locked', 'suspended')
+            return form_fields
         form_fields = grok.AutoFields(ICustomUGApplicant)
         if self.context.is_nd:
@@ -220,4 +226,10 @@
     @property
     def form_fields(self):
+        if self.target == 'conv':
+            form_fields = grok.AutoFields(ICustomSpecialApplicant)
+            form_fields = form_fields.omit(
+                'special_application', 'carryover_courses',
+                'locked', 'suspended')
+            return form_fields
         form_fields = grok.AutoFields(ICustomUGApplicant)
         if self.context.is_nd:
@@ -248,4 +260,10 @@
             form_fields['applicant_id'].for_display = True
             return form_fields
+        if self.target == 'conv':
+            form_fields = grok.AutoFields(ICustomSpecialApplicant)
+            form_fields = form_fields.omit(
+                'special_application', 'carryover_courses',
+                'locked', 'suspended')
+            return form_fields
         form_fields = grok.AutoFields(ICustomUGApplicant)
         if self.context.is_nd:
@@ -278,4 +296,10 @@
                 'locked', 'suspended')
             form_fields['applicant_id'].for_display = True
+            return form_fields
+        if self.target == 'conv':
+            form_fields = grok.AutoFields(ICustomSpecialApplicant)
+            form_fields = form_fields.omit(
+                'special_application', 'carryover_courses',
+                'locked', 'suspended')
             return form_fields
         form_fields = grok.AutoFields(ICustomUGApplicantEdit)
@@ -325,5 +349,6 @@
     def custom_requirements(self):
         store = getUtility(IExtFileStore)
-        if not store.getFileByContext(self.context, attr=u'passport.jpg'):
+        if not store.getFileByContext(self.context, attr=u'passport.jpg') \
+            and self.context.__parent__.with_picture:
             return _('Upload your passport photo before making payment.')
         return ''
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/interfaces.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/interfaces.py	(revision 15575)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/interfaces.py	(revision 15576)
@@ -19,4 +19,5 @@
 """
 
+from datetime import datetime
 from zope import schema
 from waeup.kofa.applicants.interfaces import (
@@ -282,4 +283,8 @@
     """
 
+def grad_year_range():
+    curr_year = datetime.now().year
+    return range(curr_year - 10, curr_year + 0)
+
 class ICustomSpecialApplicant(ISpecialApplicant):
 
@@ -294,4 +299,11 @@
         title = _(u'Department'),
         required = True,
+        readonly = False,
+        )
+
+    grad_year = schema.Choice(
+        title = _(u'Year of Graduation'),
+        required = True,
+        values = grad_year_range(),
         readonly = False,
         )
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/utils.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/utils.py	(revision 15575)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/utils.py	(revision 15576)
@@ -53,4 +53,5 @@
         'prejambites': ['Pre-Admission Security Screening and Results Verification: JAMBITES', 'JMB'],
         'special': ['Supplementary Payment', 'SP'],
+        'conv': ['Convocation Pack Payment', 'CPP'],
         }
 
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/viewlets.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/viewlets.py	(revision 15576)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/applicants/viewlets.py	(revision 15576)
@@ -0,0 +1,36 @@
+## $Id: viewlets.py 11599 2014-04-24 06:17:10Z henrik $
+##
+## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+
+import grok
+from waeup.kofa.browser.viewlets import ManageActionButton
+from waeup.kofa.applicants.viewlets import PDFActionButton
+from kofacustom.dspg.applicants.interfaces import ICustomApplicant
+from kofacustom.dspg.interfaces import MessageFactory as _
+
+class CustomPDFActionButton(PDFActionButton):
+
+    @property
+    def target_url(self):
+        """Get a URL to the target...
+        """
+        if self.context.state in ('initialized', 'started', 'paid') \
+            or self.context.special:
+            return
+        if self.context.__parent__.prefix == 'conv':
+            return
+        return self.view.url(self.view.context, self.target)
