source: main/waeup.uniben/trunk/src/waeup/uniben/applicants/browser.py @ 11968

Last change on this file since 11968 was 11828, checked in by Henrik Bettermann, 10 years ago

Change general notice on application slips.

  • Property svn:keywords set to Id
File size: 10.8 KB
Line 
1## $Id: browser.py 11828 2014-10-10 11:51:15Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""UI components for basic applicants and related components.
19"""
20import grok
21from time import time
22from zope.component import getUtility, createObject
23from zope.security import checkPermission
24from hurry.workflow.interfaces import IWorkflowState
25from waeup.kofa.browser.layout import action, UtilityView
26from waeup.kofa.interfaces import IExtFileStore
27from waeup.kofa.applicants.browser import (
28    ApplicantRegistrationPage, ApplicantsContainerPage,
29    ApplicationFeePaymentAddPage,
30    OnlinePaymentApprovePage,
31    ExportPDFPageApplicationSlip)
32from waeup.kofa.applicants.interfaces import (
33    ISpecialApplicant, IApplicantsUtils)
34from kofacustom.nigeria.applicants.browser import (
35    NigeriaApplicantDisplayFormPage,
36    NigeriaApplicantManageFormPage,
37    NigeriaPDFApplicationSlip)
38from waeup.uniben.applicants.interfaces import (
39    ICustomApplicant)
40from waeup.kofa.applicants.workflow import ADMITTED, PAID
41
42from waeup.uniben.interfaces import MessageFactory as _
43
44PASTQ_ALL = ['ADT','EPCS','ESM','HEK','VTE']
45
46PASTQ_AL = ['ENL','FAA','FOL','HIS','LAL',
47            'PHL','THR','BUL','JIL','LAW','PPL','PUL'] + PASTQ_ALL
48
49PASTQ_BS = ['ANT','ANY','CHH','COH','HAE','MED','MEH','PHS','SUR',
50            'PCG','PCH','PCO', 'PCT','PHA','PHM','PMB','ANA','MBC',
51            'MLS','NSC','PSY','DPV','ODR','OSP','PER', 'RES','AEB',
52            'BCH','BOT','CED','EVL','MCB','OPT','PBB','SLT','ZOO',
53            'AEE','ANS', 'CRS','FIS','FOW','SOS'] + PASTQ_ALL
54
55PASTQ_EPS = ['CHE','CVE','DMIC','EEE','MCH','PEE','PRE','CHM',
56             'CSC','GLY','MTH','PHY'] + PASTQ_ALL
57
58PASTQ_MSS = ['ACC','BNK','BUS','ECO','GEO','POL','SAA','SWK'] + PASTQ_ALL
59
60class CustomApplicantsContainerPage(ApplicantsContainerPage):
61    """The standard view for regular applicant containers.
62    """
63
64    @property
65    def form_fields(self):
66        form_fields = super(CustomApplicantsContainerPage, self).form_fields
67        usertype = getattr(self.request.principal, 'user_type', None)
68        if self.request.principal.id == 'zope.anybody' or  \
69            usertype in ('applicant', 'student'):
70            return form_fields.omit('application_fee')
71        return form_fields
72
73class CustomApplicantRegistrationPage(ApplicantRegistrationPage):
74    """Captcha'd registration page for applicants.
75    """
76
77    def _redirect(self, email, password, applicant_id):
78        # Forward email and credentials to landing page.
79        self.redirect(self.url(self.context, 'registration_complete',
80            data = dict(email=email, password=password,
81            applicant_id=applicant_id)))
82        return
83
84class CustomApplicantDisplayFormPage(NigeriaApplicantDisplayFormPage):
85    """A display view for applicant data.
86    """
87    grok.template('applicantdisplaypage')
88
89    def _show_pastq_putme(self):
90        return self.target.startswith('putme') \
91               and self.context.state in ('paid', 'submitted') \
92               and getattr(self.context, 'course1') is not None
93
94    @property
95    def show_pastq_al(self):
96        return self._show_pastq_putme() \
97               and self.context.course1.__parent__.__parent__.code in PASTQ_AL
98
99    @property
100    def show_pastq_bs(self):
101        return self._show_pastq_putme() \
102               and self.context.course1.__parent__.__parent__.code in PASTQ_BS
103
104    @property
105    def show_pastq_eps(self):
106        return self._show_pastq_putme() \
107               and self.context.course1.__parent__.__parent__.code in PASTQ_EPS
108
109    @property
110    def show_pastq_mss(self):
111        return self._show_pastq_putme() \
112               and self.context.course1.__parent__.__parent__.code in PASTQ_MSS
113
114    @property
115    def show_pastq_pude(self):
116        return self.target.startswith('pude') \
117               and self.context.state in ('paid', 'submitted')
118
119    # Customizations for admission checking payments
120
121    @property
122    def form_fields(self):
123        form_fields = super(CustomApplicantDisplayFormPage, self).form_fields
124        if not self.context.admchecking_fee_paid():
125            form_fields = form_fields.omit(
126                'screening_score', 'aggregate', 'student_id')
127        return form_fields
128
129    @property
130    def display_actions(self):
131        state = IWorkflowState(self.context).getState()
132        actions = []
133        if state == ADMITTED and not self.context.admchecking_fee_paid():
134            actions = [_('Add admission checking payment ticket')]
135        return actions
136
137
138    def getCourseAdmitted(self):
139        """Return link, title and code in html format to the certificate
140           admitted.
141        """
142        course_admitted = self.context.course_admitted
143        if getattr(course_admitted, '__parent__',None) and \
144            self.context.admchecking_fee_paid():
145            url = self.url(course_admitted)
146            title = course_admitted.title
147            code = course_admitted.code
148            return '<a href="%s">%s - %s</a>' %(url,code,title)
149        return ''
150
151    @property
152    def admission_checking_info(self):
153        if self.context.state == ADMITTED and \
154            not self.context.admchecking_fee_paid():
155            return _('You must pay the admission checking fee '
156                     'to view your screening results and course admitted.')
157        return
158
159    @action(_('Add admission checking payment ticket'), style='primary')
160    def addPaymentTicket(self, **data):
161        self.redirect(self.url(self.context, '@@addacp'))
162        return
163
164class CustomNigeriaPDFApplicationSlip(NigeriaPDFApplicationSlip):
165
166    @property
167    def note(self):
168        if self.target is not None and not self._reduced_slip():
169            return _(u'<br /><br /><br />'
170                      'Comfirm your screening venue 72 hours to the screening. '
171                      '<br /><br />'
172                      'No bags, phones and calculators are allowed in the '
173                      'screening venues.'
174                      '<br /><br />'
175                      'DATE OF SCREENING FOR SELECTED PG PROGRAMMES AS WELL '
176                      'AS PART-TIME AGRIC IS ON 18TH OCTOBER 2014.'
177                      )
178        return
179
180class CustomApplicationFeePaymentAddPage(ApplicationFeePaymentAddPage):
181    """ Page to add an online payment ticket
182    """
183
184    @property
185    def custom_requirements(self):
186        store = getUtility(IExtFileStore)
187        if not store.getFileByContext(self.context, attr=u'passport.jpg'):
188            return _('Upload your 1"x1" Red background passport photo before making payment.')
189        return ''
190
191class AdmissionCheckingFeePaymentAddPage(UtilityView, grok.View):
192    """ Page to add an admission checking online payment ticket.
193    """
194    grok.context(ICustomApplicant)
195    grok.name('addacp')
196    grok.require('waeup.payApplicant')
197    factory = u'waeup.ApplicantOnlinePayment'
198
199    def _setPaymentDetails(self, payment):
200        container = self.context.__parent__
201        timestamp = ("%d" % int(time()*10000))[1:]
202        session = str(container.year)
203        try:
204            session_config = grok.getSite()['configuration'][session]
205        except KeyError:
206            return _(u'Session configuration object is not available.'), None
207        payment.p_id = "p%s" % timestamp
208        payment.p_item = container.title
209        payment.p_session = container.year
210        payment.amount_auth = 0.0
211        payment.p_category = 'admission_checking'
212        payment.amount_auth = session_config.admchecking_fee
213        if payment.amount_auth in (0.0, None):
214            return _('Amount could not be determined.'), None
215        return
216
217    def update(self):
218        if self.context.admchecking_fee_paid():
219              self.flash(
220                  _('Admission checking payment has already been made.'),
221                  type='warning')
222              self.redirect(self.url(self.context))
223              return
224        payment = createObject(self.factory)
225        failure = self._setPaymentDetails(payment)
226        if failure is not None:
227            self.flash(failure[0], type='danger')
228            self.redirect(self.url(self.context))
229            return
230        self.context[payment.p_id] = payment
231        self.flash(_('Payment ticket created.'))
232        self.redirect(self.url(payment))
233        return
234
235    def render(self):
236        return
237
238
239class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
240
241    @property
242    def custom_upload_requirements(self):
243        if not checkPermission('waeup.uploadPassportPictures', self.context):
244            return _('You are not entitled to upload passport pictures.')
245
246class CustomOnlinePaymentApprovePage(OnlinePaymentApprovePage):
247    """ Approval view
248    """
249
250
251    def update(self):
252        if self.context.p_category == 'admission_checking':
253            if self.context.p_state == 'paid':
254                flashtype = 'warning'
255                msg = _('This ticket has already been paid.')
256                log = None
257            else:
258                self.context.approve()
259                log = 'payment approved: %s' % self.context.p_id
260                msg = _('Payment approved')
261                flashtype = 'success'
262        else:
263            flashtype, msg, log = self.context.approveApplicantPayment()
264        if log is not None:
265            applicant = self.context.__parent__
266            # Add log message to applicants.log
267            applicant.writeLogMessage(self, log)
268            # Add log message to payments.log
269            self.context.logger.info(
270                '%s,%s,%s,%s,%s,,,,,,' % (
271                applicant.applicant_id,
272                self.context.p_id, self.context.p_category,
273                self.context.amount_auth, self.context.r_code))
274        self.flash(msg, type=flashtype)
275        return
276
277class CustomExportPDFPageApplicationSlip(ExportPDFPageApplicationSlip):
278    """Deliver a PDF slip of the context.
279    """
280
281
282    def update(self):
283        super(CustomExportPDFPageApplicationSlip, self).update()
284        if self.context.state == ADMITTED and \
285            not self.context.admchecking_fee_paid():
286            self.flash(
287                _('Please pay admission checking fee before trying to download '
288                  'the application slip.'), type='warning')
289            return self.redirect(self.url(self.context))
290        return
Note: See TracBrowser for help on using the repository browser.