source: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/students/browser.py @ 17811

Last change on this file since 17811 was 17811, checked in by Henrik Bettermann, 5 months ago

Use allowPortraitChange utility method.

  • Property svn:keywords set to Id
File size: 15.4 KB
Line 
1## $Id: browser.py 17811 2024-06-06 11:11:23Z henrik $
2##
3## Copyright (C) 2012 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##
18import grok
19from zope.formlib.textwidgets import BytesDisplayWidget
20from zope.component import getUtility
21from zope.security import checkPermission
22from zope.i18n import translate
23from datetime import datetime
24from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
25from waeup.kofa.interfaces import IExtFileStore, IObjectHistory, IKofaUtils
26from waeup.kofa.browser.layout import action, UtilityView
27from waeup.kofa.utils.helpers import get_current_principal, to_timezone
28from waeup.kofa.students.browser import (
29    StudentPersonalDisplayFormPage, StudentPersonalManageFormPage,
30    StudentClearanceManageFormPage, StudentClearanceEditFormPage,
31    StudentClearanceDisplayFormPage, OnlinePaymentFakeApproveView,
32    ExportPDFClearanceSlip, StudentBaseManageFormPage,
33    StudentBaseDisplayFormPage,
34    StudentBasePDFFormPage,
35    StudentBaseEditFormPage, StudentPersonalEditFormPage,
36    OnlinePaymentDisplayFormPage, OnlinePaymentAddFormPage,
37    OnlinePaymentBreadcrumb, ExportPDFPaymentSlip,
38    ExportPDFCourseRegistrationSlip,
39    ExportPDFBedTicketSlip,
40    StudentFilesUploadPage, emit_lock_message,
41    AccommodationManageFormPage,
42    AccommodationDisplayFormPage,
43    BedTicketAddPage)
44from waeup.kofa.students.interfaces import IStudentsUtils
45from kofacustom.nigeria.students.interfaces import (
46    INigeriaStudentBase, INigeriaStudent, INigeriaStudentPersonal,
47    INigeriaStudentPersonalEdit,
48    INigeriaUGStudentClearance,INigeriaPGStudentClearance,
49    INigeriaStudentOnlinePayment
50    )
51from waeup.kofa.students.workflow import ADMITTED
52from kofacustom.nigeria.interfaces import MessageFactory as _
53
54class NigeriaOnlinePaymentBreadcrumb(OnlinePaymentBreadcrumb):
55    """A breadcrumb for payments.
56    """
57    grok.context(INigeriaStudentOnlinePayment)
58
59class NigeriaStudentBaseDisplayFormPage(StudentBaseDisplayFormPage):
60    """ Page to display student base data
61    """
62    form_fields = grok.AutoFields(INigeriaStudentBase).omit(
63        'password', 'suspended', 'suspended_comment',
64        'flash_notice', 'provisionally_cleared')
65    form_fields[
66        'financial_clearance_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
67
68class NigeriaStudentBaseManageFormPage(StudentBaseManageFormPage):
69    """ View to manage student base data
70    """
71    form_fields = grok.AutoFields(INigeriaStudentBase).omit(
72        'student_id', 'adm_code', 'suspended',
73        'financially_cleared_by', 'financial_clearance_date')
74
75class NigeriaStudentBaseEditFormPage(StudentBaseEditFormPage):
76    """ View to edit student base data
77    """
78    form_fields = grok.AutoFields(INigeriaStudentBase).select(
79        'email', 'phone')
80
81class NigeriaStudentPersonalDisplayFormPage(StudentPersonalDisplayFormPage):
82    """ Page to display student personal data
83    """
84    form_fields = grok.AutoFields(INigeriaStudentPersonal)
85    form_fields['perm_address'].custom_widget = BytesDisplayWidget
86    form_fields['next_kin_address'].custom_widget = BytesDisplayWidget
87    form_fields[
88        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
89
90class NigeriaStudentPersonalEditFormPage(StudentPersonalEditFormPage):
91    """ Page to edit personal data
92    """
93    form_fields = grok.AutoFields(INigeriaStudentPersonalEdit).omit('personal_updated')
94
95class NigeriaStudentPersonalManageFormPage(StudentPersonalManageFormPage):
96    """ Page to edit personal data
97    """
98    form_fields = grok.AutoFields(INigeriaStudentPersonal)
99    form_fields['personal_updated'].for_display = True
100    form_fields[
101        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
102
103class NigeriaStudentClearanceDisplayFormPage(StudentClearanceDisplayFormPage):
104    """ Page to display student clearance data
105    """
106
107    @property
108    def form_fields(self):
109        if self.context.is_postgrad:
110            form_fields = grok.AutoFields(
111                INigeriaPGStudentClearance).omit('clearance_locked')
112        else:
113            form_fields = grok.AutoFields(
114                INigeriaUGStudentClearance).omit('clearance_locked')
115        if not getattr(self.context, 'officer_comment'):
116            form_fields = form_fields.omit('officer_comment')
117        else:
118            form_fields['officer_comment'].custom_widget = BytesDisplayWidget
119        return form_fields
120
121class NigeriaExportPDFClearanceSlip(ExportPDFClearanceSlip):
122    """Deliver a PDF slip of the context.
123    """
124    omit_fields = ('password', 'suspended', 'suspended_comment',
125        'phone', 'adm_code', 'email', 'date_of_birth', 'current_level',
126        'flash_notice')
127
128    @property
129    def form_fields(self):
130        if self.context.is_postgrad:
131            form_fields = grok.AutoFields(
132                INigeriaPGStudentClearance).omit('clearance_locked')
133        else:
134            form_fields = grok.AutoFields(
135                INigeriaUGStudentClearance).omit('clearance_locked')
136        if not getattr(self.context, 'officer_comment'):
137            form_fields = form_fields.omit('officer_comment')
138        return form_fields
139
140class NigeriaStudentClearanceManageFormPage(StudentClearanceManageFormPage):
141    """ Page to edit student clearance data
142    """
143
144    @property
145    def form_fields(self):
146        if self.context.is_postgrad:
147            form_fields = grok.AutoFields(
148                INigeriaPGStudentClearance).omit('clr_code')
149        else:
150            form_fields = grok.AutoFields(
151                INigeriaUGStudentClearance).omit('clr_code')
152        return form_fields
153
154class NigeriaStudentClearanceEditFormPage(StudentClearanceEditFormPage):
155    """ View to edit student clearance data by student
156    """
157
158    @property
159    def form_fields(self):
160        if self.context.is_postgrad:
161            form_fields = grok.AutoFields(INigeriaPGStudentClearance).omit(
162            'clearance_locked', 'nysc_location', 'clr_code', 'officer_comment',
163            'physical_clearance_date')
164        else:
165            form_fields = grok.AutoFields(INigeriaUGStudentClearance).omit(
166            'clearance_locked', 'clr_code', 'officer_comment',
167            'physical_clearance_date')
168        return form_fields
169
170class NigeriaExportPDFCourseRegistrationSlip(ExportPDFCourseRegistrationSlip):
171    """Deliver a PDF slip of the context.
172    """
173    omit_fields = ('password', 'suspended', 'suspended_comment',
174        'phone', 'adm_code', 'sex', 'email', 'date_of_birth', 'current_level',
175        'flash_notice')
176
177class NigeriaOnlinePaymentDisplayFormPage(OnlinePaymentDisplayFormPage):
178    """ Page to view an online payment ticket
179    """
180    grok.context(INigeriaStudentOnlinePayment)
181    form_fields = grok.AutoFields(INigeriaStudentOnlinePayment).omit(
182        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item','p_combi')
183    form_fields[
184        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
185    form_fields[
186        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
187
188class NigeriaOnlinePaymentAddFormPage(OnlinePaymentAddFormPage):
189    """ Page to add an online payment ticket
190    """
191    form_fields = grok.AutoFields(INigeriaStudentOnlinePayment).select(
192        'p_combi')
193
194class NigeriaOnlinePaymentFakeApproveView(OnlinePaymentFakeApproveView):
195    """ Disable payment approval view for students.
196
197    This view is used for browser tests only and
198    has to be neutralized here!
199    """
200    grok.name('fake_approve')
201    grok.require('waeup.managePortal')
202
203    def update(self):
204        return
205
206class NigeriaExportPDFPaymentSlip(ExportPDFPaymentSlip):
207    """Deliver a PDF slip of the context.
208    """
209    grok.context(INigeriaStudentOnlinePayment)
210    form_fields = grok.AutoFields(INigeriaStudentOnlinePayment).omit(
211        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item',
212        'p_split_data','p_combi')
213    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
214    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
215    omit_fields = ('password', 'suspended', 'suspended_comment', 'phone',
216        'adm_code', 'sex', 'email', 'date_of_birth', 'current_level',
217        'flash_notice')
218
219    def update(self):
220        if not self.context.p_state in ('paid', 'waived', 'scholarship') \
221            and not self.context.r_company:
222            self.redirect(self.url(self.context))
223            return
224        return
225
226class NigeriaAccommodationDisplayFormPage(AccommodationDisplayFormPage):
227    """ Page to view bed tickets.
228    """
229    with_hostel_selection = False
230
231class NigeriaAccommodationManageFormPage(AccommodationManageFormPage):
232    """ Page to manage bed tickets.
233    This manage form page is for both students and students officers.
234    """
235    with_hostel_selection = False
236
237class NigeriaBedTicketAddPage(BedTicketAddPage):
238    """ Page to add a bed ticket
239    """
240    with_ac = True
241    with_bedselection = False
242
243class NigeriaExportPDFBedTicketSlip(ExportPDFBedTicketSlip):
244    """Deliver a PDF slip of the context.
245    """
246    omit_fields = ('password', 'suspended', 'suspended_comment',
247        'phone', 'adm_code', 'email', 'date_of_birth', 'current_level',
248        'flash_notice')
249
250class ClearStudentFinancially(UtilityView, grok.View):
251    """ Clear student financially by financial clearance officer
252    """
253    grok.context(INigeriaStudent)
254    grok.name('clear_financially')
255    grok.require('waeup.clearStudentFinancially')
256
257    def update(self):
258        if self.context.financially_cleared_by:
259            self.flash(_('This student has already been financially cleared.'),
260                       type="danger")
261            self.redirect(self.url(self.context))
262            return
263        user = get_current_principal()
264        if user is None:
265            usertitle = 'system'
266        else:
267            usertitle = getattr(user, 'public_name', None)
268            if not usertitle:
269                usertitle = user.title
270        self.context.financially_cleared_by = usertitle
271        self.context.financial_clearance_date = datetime.utcnow()
272        self.context.writeLogMessage(self,'financially cleared')
273        history = IObjectHistory(self.context)
274        history.addMessage('Financially cleared')
275        self.flash(_('Student has been financially cleared.'))
276        self.redirect(self.url(self.context))
277        return
278
279    def render(self):
280        return
281
282class WithdrawFinancialClearance(UtilityView, grok.View):
283    """ Withdraw financial clearance by financial clearance officer
284    """
285    grok.context(INigeriaStudent)
286    grok.name('withdraw_financial_clearance')
287    grok.require('waeup.clearStudentFinancially')
288
289    def update(self):
290        if not self.context.financially_cleared_by:
291            self.flash(_('This student has not yet been financially cleared.'),
292                       type="danger")
293            self.redirect(self.url(self.context))
294            return
295        self.context.financially_cleared_by = None
296        self.context.financial_clearance_date = None
297        self.context.writeLogMessage(self,'financial clearance withdrawn')
298        history = IObjectHistory(self.context)
299        history.addMessage('Financial clearance withdrawn')
300        self.flash(_('Financial clearance withdrawn.'))
301        self.redirect(self.url(self.context))
302        return
303
304    def render(self):
305        return
306
307cleared_note = """
308<br /><br /><br />
309<strong>Financially cleared on %s by %s.</strong>
310
311"""
312
313class NigeriaExportPDFFinancialClearancePage(UtilityView, grok.View):
314    """Deliver a PDF financial clearance slip.
315    """
316    grok.context(INigeriaStudent)
317    grok.name('fee_payment_history.pdf')
318    grok.require('waeup.viewStudent')
319    prefix = 'form'
320
321    omit_fields = (
322        'suspended', 'phone',
323        'adm_code', 'suspended_comment',
324        'date_of_birth', 'current_level',
325        'flash_notice')
326
327    form_fields = None
328
329    @property
330    def label(self):
331        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
332        return translate(_('Fee Payment History for'),
333            'waeup.kofa', target_language=portal_language) \
334            + ' %s' % self.context.display_fullname
335
336    def _sigsInFooter(self):
337        if not checkPermission('waeup.clearStudentFinancially', self.context):
338            return ()
339        return (_('Date, Checking Officer Signature'),
340                _('Date, Approving Officer Signature'),
341                )
342
343    @property
344    def note(self):
345        if self.context.financially_cleared_by:
346            tz = getUtility(IKofaUtils).tzinfo
347            try:
348                timestamp = to_timezone(
349                    self.context.financial_clearance_date, tz).strftime(
350                        "%Y-%m-%d %H:%M:%S")
351            except ValueError:
352                return
353            return cleared_note % (
354                timestamp, self.context.financially_cleared_by)
355        return
356
357    @property
358    def tabletitle(self):
359        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
360        tabletitle = []
361        tabletitle.append(translate(_('Successful Payments'), 'waeup.kofa',
362            target_language=portal_language))
363        return tabletitle
364
365    def render(self):
366        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
367        P_ID = translate(_('Payment Id'), 'waeup.kofa', target_language=portal_language)
368        #CD = translate(_('Creation Date'), 'waeup.kofa', target_language=portal_language)
369        PD = translate(_('Payment Date'), 'waeup.kofa', target_language=portal_language)
370        CAT = translate(_('Payment Category'), 'waeup.kofa', target_language=portal_language)
371        ITEM = translate(_('Payment Item'), 'waeup.kofa', target_language=portal_language)
372        AMT = translate(_('Amount (Naira)'), 'waeup.kofa', target_language=portal_language)
373        SSS = translate(_('Payment Session'), 'waeup.kofa', target_language=portal_language)
374        studentview = StudentBasePDFFormPage(self.context.student,
375            self.request, self.omit_fields)
376        students_utils = getUtility(IStudentsUtils)
377
378        tabledata = []
379        tableheader = []
380        tabledata.append(sorted(
381            [value for value in self.context['payments'].values()
382             if value.p_state in ('paid', 'waived', 'scholarship')],
383             key=lambda value: value.p_session))
384        tableheader.append([(P_ID,'p_id', 4.2),
385                         #(CD,'creation_date', 3),
386                         (PD,'formatted_p_date', 3),
387                         (CAT,'category', 3),
388                         (ITEM, 'p_item', 3),
389                         (AMT, 'amount_auth', 2),
390                         (SSS, 'p_session', 2),
391                         ])
392        return students_utils.renderPDF(
393            self, 'financial_clearance_slip.pdf',
394            self.context.student, studentview,
395            tableheader=tableheader,
396            tabledata=tabledata,
397            signatures=None,
398            sigs_in_footer=self._sigsInFooter(),
399            omit_fields=self.omit_fields,
400            note=self.note
401            )
Note: See TracBrowser for help on using the repository browser.