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

Last change on this file since 11877 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
RevLine 
[8012]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"""
[10287]20import grok
[11784]21from time import time
[11782]22from zope.component import getUtility, createObject
[11736]23from zope.security import checkPermission
[11784]24from hurry.workflow.interfaces import IWorkflowState
25from waeup.kofa.browser.layout import action, UtilityView
[11728]26from waeup.kofa.interfaces import IExtFileStore
[10587]27from waeup.kofa.applicants.browser import (
[11728]28    ApplicantRegistrationPage, ApplicantsContainerPage,
[11782]29    ApplicationFeePaymentAddPage,
[11784]30    OnlinePaymentApprovePage,
31    ExportPDFPageApplicationSlip)
[11782]32from waeup.kofa.applicants.interfaces import (
33    ISpecialApplicant, IApplicantsUtils)
[10378]34from kofacustom.nigeria.applicants.browser import (
35    NigeriaApplicantDisplayFormPage,
[11736]36    NigeriaApplicantManageFormPage,
[10378]37    NigeriaPDFApplicationSlip)
[11782]38from waeup.uniben.applicants.interfaces import (
39    ICustomApplicant)
[11784]40from waeup.kofa.applicants.workflow import ADMITTED, PAID
[8012]41
[10378]42from waeup.uniben.interfaces import MessageFactory as _
43
[10338]44PASTQ_ALL = ['ADT','EPCS','ESM','HEK','VTE']
[8012]45
[10338]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
[10587]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
[10589]67        usertype = getattr(self.request.principal, 'user_type', None)
68        if self.request.principal.id == 'zope.anybody' or  \
69            usertype in ('applicant', 'student'):
[10587]70            return form_fields.omit('application_fee')
71        return form_fields
72
[8630]73class CustomApplicantRegistrationPage(ApplicantRegistrationPage):
74    """Captcha'd registration page for applicants.
75    """
76
[10337]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
[10287]83
[10375]84class CustomApplicantDisplayFormPage(NigeriaApplicantDisplayFormPage):
85    """A display view for applicant data.
[10287]86    """
[10375]87    grok.template('applicantdisplaypage')
[10338]88
[10622]89    def _show_pastq_putme(self):
[10338]90        return self.target.startswith('putme') \
[10375]91               and self.context.state in ('paid', 'submitted') \
[10338]92               and getattr(self.context, 'course1') is not None
93
94    @property
95    def show_pastq_al(self):
[10622]96        return self._show_pastq_putme() \
[10338]97               and self.context.course1.__parent__.__parent__.code in PASTQ_AL
98
99    @property
100    def show_pastq_bs(self):
[10622]101        return self._show_pastq_putme() \
[10338]102               and self.context.course1.__parent__.__parent__.code in PASTQ_BS
103
104    @property
105    def show_pastq_eps(self):
[10622]106        return self._show_pastq_putme() \
[10338]107               and self.context.course1.__parent__.__parent__.code in PASTQ_EPS
108
109    @property
110    def show_pastq_mss(self):
[10622]111        return self._show_pastq_putme() \
[10338]112               and self.context.course1.__parent__.__parent__.code in PASTQ_MSS
113
[10622]114    @property
115    def show_pastq_pude(self):
116        return self.target.startswith('pude') \
117               and self.context.state in ('paid', 'submitted')
118
[11784]119    # Customizations for admission checking payments
120
[11782]121    @property
122    def form_fields(self):
[11784]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')
[11782]127        return form_fields
128
[11784]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
[11786]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
[11784]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
[10378]164class CustomNigeriaPDFApplicationSlip(NigeriaPDFApplicationSlip):
[10338]165
[10378]166    @property
167    def note(self):
[11828]168        if self.target is not None and not self._reduced_slip():
[10378]169            return _(u'<br /><br /><br />'
[11771]170                      'Comfirm your screening venue 72 hours to the screening. '
[11770]171                      '<br /><br />'
172                      'No bags, phones and calculators are allowed in the '
[11828]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                      )
[10378]178        return
179
[11728]180class CustomApplicationFeePaymentAddPage(ApplicationFeePaymentAddPage):
181    """ Page to add an online payment ticket
182    """
[10378]183
[11728]184    @property
185    def custom_requirements(self):
186        store = getUtility(IExtFileStore)
187        if not store.getFileByContext(self.context, attr=u'passport.jpg'):
[11782]188            return _('Upload your 1"x1" Red background passport photo before making payment.')
[11728]189        return ''
190
[11784]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
[11782]217    def update(self):
[11784]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
[11782]224        payment = createObject(self.factory)
[11784]225        failure = self._setPaymentDetails(payment)
[11782]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
[11736]234
[11784]235    def render(self):
236        return
[11736]237
[11784]238
[11782]239class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
240
[11736]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.')
[11782]245
246class CustomOnlinePaymentApprovePage(OnlinePaymentApprovePage):
247    """ Approval view
248    """
249
[11784]250
[11782]251    def update(self):
[11784]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()
[11782]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
[11784]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.