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

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

Remove unnecessary customization.

  • Property svn:keywords set to Id
File size: 10.1 KB
Line 
1## $Id: browser.py 12085 2014-11-28 09:55:19Z 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 CustomApplicationFeePaymentAddPage(ApplicationFeePaymentAddPage):
165    """ Page to add an online payment ticket
166    """
167
168    @property
169    def custom_requirements(self):
170        store = getUtility(IExtFileStore)
171        if not store.getFileByContext(self.context, attr=u'passport.jpg'):
172            return _('Upload your 1"x1" Red background passport photo before making payment.')
173        return ''
174
175class AdmissionCheckingFeePaymentAddPage(UtilityView, grok.View):
176    """ Page to add an admission checking online payment ticket.
177    """
178    grok.context(ICustomApplicant)
179    grok.name('addacp')
180    grok.require('waeup.payApplicant')
181    factory = u'waeup.ApplicantOnlinePayment'
182
183    def _setPaymentDetails(self, payment):
184        container = self.context.__parent__
185        timestamp = ("%d" % int(time()*10000))[1:]
186        session = str(container.year)
187        try:
188            session_config = grok.getSite()['configuration'][session]
189        except KeyError:
190            return _(u'Session configuration object is not available.'), None
191        payment.p_id = "p%s" % timestamp
192        payment.p_item = container.title
193        payment.p_session = container.year
194        payment.amount_auth = 0.0
195        payment.p_category = 'admission_checking'
196        payment.amount_auth = session_config.admchecking_fee
197        if payment.amount_auth in (0.0, None):
198            return _('Amount could not be determined.'), None
199        return
200
201    def update(self):
202        if self.context.admchecking_fee_paid():
203              self.flash(
204                  _('Admission checking payment has already been made.'),
205                  type='warning')
206              self.redirect(self.url(self.context))
207              return
208        payment = createObject(self.factory)
209        failure = self._setPaymentDetails(payment)
210        if failure is not None:
211            self.flash(failure[0], type='danger')
212            self.redirect(self.url(self.context))
213            return
214        self.context[payment.p_id] = payment
215        self.flash(_('Payment ticket created.'))
216        self.redirect(self.url(payment))
217        return
218
219    def render(self):
220        return
221
222
223class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
224
225    @property
226    def custom_upload_requirements(self):
227        if not checkPermission('waeup.uploadPassportPictures', self.context):
228            return _('You are not entitled to upload passport pictures.')
229
230class CustomOnlinePaymentApprovePage(OnlinePaymentApprovePage):
231    """ Approval view
232    """
233
234
235    def update(self):
236        if self.context.p_category == 'admission_checking':
237            if self.context.p_state == 'paid':
238                flashtype = 'warning'
239                msg = _('This ticket has already been paid.')
240                log = None
241            else:
242                self.context.approve()
243                log = 'payment approved: %s' % self.context.p_id
244                msg = _('Payment approved')
245                flashtype = 'success'
246        else:
247            flashtype, msg, log = self.context.approveApplicantPayment()
248        if log is not None:
249            applicant = self.context.__parent__
250            # Add log message to applicants.log
251            applicant.writeLogMessage(self, log)
252            # Add log message to payments.log
253            self.context.logger.info(
254                '%s,%s,%s,%s,%s,,,,,,' % (
255                applicant.applicant_id,
256                self.context.p_id, self.context.p_category,
257                self.context.amount_auth, self.context.r_code))
258        self.flash(msg, type=flashtype)
259        return
260
261class CustomExportPDFPageApplicationSlip(ExportPDFPageApplicationSlip):
262    """Deliver a PDF slip of the context.
263    """
264
265
266    def update(self):
267        super(CustomExportPDFPageApplicationSlip, self).update()
268        if self.context.state == ADMITTED and \
269            not self.context.admchecking_fee_paid():
270            self.flash(
271                _('Please pay admission checking fee before trying to download '
272                  'the application slip.'), type='warning')
273            return self.redirect(self.url(self.context))
274        return
Note: See TracBrowser for help on using the repository browser.