source: main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py @ 10009

Last change on this file since 10009 was 9984, checked in by Henrik Bettermann, 12 years ago

FCEOkene wants to hide the bed coordinates if maintenance fee is not yet paid. Thus we need additional property attributes which return the p_item (payment tickets) and the bed_coordinates attributes (bed tickets) by default and can be easily customized to hide this information in certain cases. bed_coordinates and p_item must be omitted on forms. The new display_ attributes are displayed instead.

All packages must now be adjusted.

The 'cost-benefit ratio' of these kinds of customizations is quite bad and we should think about declining such customization requests. However, I started customization and these are the changed made in the base package.

  • Property svn:keywords set to Id
File size: 6.1 KB
RevLine 
[7191]1## $Id: payments.py 9984 2013-02-24 08:29:24Z henrik $
2##
[6635]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"""
[7599]19Student payment components.
[6635]20"""
21import grok
22from zope.component.interfaces import IFactory
[6875]23from zope.interface import implementedBy
[8420]24from waeup.kofa.interfaces import MessageFactory as _
[7811]25from waeup.kofa.students.interfaces import (
[6877]26    IStudentPaymentsContainer, IStudentNavigation, IStudentOnlinePayment)
[7811]27from waeup.kofa.payments import PaymentsContainer, OnlinePayment
[8703]28from waeup.kofa.payments.interfaces import IPaymentWebservice
[7811]29from waeup.kofa.utils.helpers import attrs_to_fields
[8420]30from waeup.kofa.accesscodes import create_accesscode
[6635]31
[6860]32class StudentPaymentsContainer(PaymentsContainer):
[6635]33    """This is a container for student payments.
34    """
[6860]35    grok.implements(IStudentPaymentsContainer, IStudentNavigation)
36    grok.provides(IStudentPaymentsContainer)
[6635]37
38    def __init__(self):
[6860]39        super(StudentPaymentsContainer, self).__init__()
[6635]40        return
41
[8736]42    @property
43    def student(self):
[6642]44        return self.__parent__
45
[8735]46    def writeLogMessage(self, view, message):
47        return self.__parent__.writeLogMessage(view, message)
48
[6875]49StudentPaymentsContainer = attrs_to_fields(StudentPaymentsContainer)
50
51class StudentOnlinePayment(OnlinePayment):
52    """This is an online payment.
53    """
[6877]54    grok.implements(IStudentOnlinePayment, IStudentNavigation)
55    grok.provides(IStudentOnlinePayment)
[6875]56
57    def __init__(self):
58        super(StudentOnlinePayment, self).__init__()
59        return
60
[8736]61    @property
62    def student(self):
[8368]63        try:
64            return self.__parent__.__parent__
65        except AttributeError:
66            return None
[6875]67
[9258]68    @property
69    def student_state(self):
70        try:
71            return self.student.state
72        except AttributeError:
73            return None
74
[9278]75    @property
76    def current_session(self):
77        try:
78            return self.student.current_session
79        except AttributeError:
80            return None
81
[8735]82    def writeLogMessage(self, view, message):
83        return self.__parent__.__parent__.writeLogMessage(view, message)
84
[8732]85    def _createActivationCodes(self):
[8736]86        student = self.student
[8420]87        if self.p_category == 'clearance':
88            # Create CLR access code
89            pin, error = create_accesscode(
90                'CLR',0,self.amount_auth,student.student_id)
91            if error:
[8732]92                return error
[8420]93            self.ac = pin
[8732]94        elif self.p_category in ('schoolfee', 'schoolfee_1'):
[8420]95            # Create SFE access code
96            pin, error = create_accesscode(
97                'SFE',0,self.amount_auth,student.student_id)
98            if error:
[8732]99                return error
[8420]100            self.ac = pin
101        elif self.p_category == 'bed_allocation':
102            # Create HOS access code
103            pin, error = create_accesscode(
104                'HOS',0,self.amount_auth,student.student_id)
105            if error:
[8732]106                return error
[8420]107            self.ac = pin
[8732]108        return None
109
110    def doAfterStudentPayment(self):
111        """Process student after payment was made.
112        """
[9148]113        if self.p_current:
114            error = self._createActivationCodes()
115            if error is not None:
116                return False, error, error
[9438]117        log = 'successful %s payment: %s' % (self.p_category, self.p_id)
[8428]118        msg = _('Successful payment')
119        return True, msg, log
[8420]120
[8453]121    def doAfterStudentPaymentApproval(self):
122        """Process student after payment was approved.
123        """
[9148]124        if self.p_current:
125            error = self._createActivationCodes()
126            if error is not None:
127                return False, error, error
[9438]128        log = '%s payment approved: %s' % (self.p_category, self.p_id)
[8453]129        msg = _('Payment approved')
130        return True, msg, log
131
[8422]132    def approveStudentPayment(self):
133        """Approve payment and process student.
134        """
135        if self.p_state == 'paid':
[8428]136            return False, _('This ticket has already been paid.'), None
[8422]137        self.approve()
[8732]138        return self.doAfterStudentPaymentApproval()
[8422]139
140
[9984]141StudentOnlinePayment = attrs_to_fields(
142    StudentOnlinePayment, omit=['display_item'])
[6875]143
[8703]144class PaymentWebservice(grok.Adapter):
145    """An adapter to publish student data through a webservice.
146    """
147    grok.context(IStudentOnlinePayment)
148    grok.implements(IPaymentWebservice)
149
150    @property
[8708]151    def display_fullname(self):
[9506]152        "Name of  payee"
[8736]153        return self.context.student.display_fullname
[8703]154
[8708]155    @property
156    def id(self):
157        "Id of payee"
[8736]158        return self.context.student.student_id
[8708]159
160    @property
[9733]161    def matric_number(self):
[9506]162        "Matric number or reg number of payee"
163        return self.context.student.matric_number
164
165    @property
[9733]166    def reg_number(self):
167        "Reg number or reg number of payee"
168        return self.context.student.reg_number
169
170    @property
[8708]171    def faculty(self):
172        "Faculty of payee"
[8736]173        return self.context.student.faccode
[8708]174
175    @property
176    def department(self):
177        "Department of payee"
[8736]178        return self.context.student.depcode
[8708]179
[6875]180# Student online payments must be importable. So we might need a factory.
181class StudentOnlinePaymentFactory(grok.GlobalUtility):
182    """A factory for student online payments.
183    """
184    grok.implements(IFactory)
185    grok.name(u'waeup.StudentOnlinePayment')
186    title = u"Create a new online payment.",
187    description = u"This factory instantiates new online payment instances."
188
189    def __call__(self, *args, **kw):
190        return StudentOnlinePayment()
191
192    def getInterfaces(self):
[7811]193        return implementedBy(StudentOnlinePayment)
Note: See TracBrowser for help on using the repository browser.