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

Last change on this file since 10368 was 10232, checked in by Henrik Bettermann, 11 years ago

Rename property attribute to avoid confusion with workflow state.

Remove redundant property attributes.

  • Property svn:keywords set to Id
File size: 5.8 KB
RevLine 
[7191]1## $Id: payments.py 10232 2013-05-27 06:51:17Z 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
[10030]28from waeup.kofa.payments.interfaces import IPayer
[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
[8735]68    def writeLogMessage(self, view, message):
69        return self.__parent__.__parent__.writeLogMessage(view, message)
70
[8732]71    def _createActivationCodes(self):
[8736]72        student = self.student
[8420]73        if self.p_category == 'clearance':
74            # Create CLR access code
75            pin, error = create_accesscode(
76                'CLR',0,self.amount_auth,student.student_id)
77            if error:
[8732]78                return error
[8420]79            self.ac = pin
[8732]80        elif self.p_category in ('schoolfee', 'schoolfee_1'):
[8420]81            # Create SFE access code
82            pin, error = create_accesscode(
83                'SFE',0,self.amount_auth,student.student_id)
84            if error:
[8732]85                return error
[8420]86            self.ac = pin
87        elif self.p_category == 'bed_allocation':
88            # Create HOS access code
89            pin, error = create_accesscode(
90                'HOS',0,self.amount_auth,student.student_id)
91            if error:
[8732]92                return error
[8420]93            self.ac = pin
[8732]94        return None
95
96    def doAfterStudentPayment(self):
97        """Process student after payment was made.
98        """
[9148]99        if self.p_current:
100            error = self._createActivationCodes()
101            if error is not None:
102                return False, error, error
[9438]103        log = 'successful %s payment: %s' % (self.p_category, self.p_id)
[8428]104        msg = _('Successful payment')
105        return True, msg, log
[8420]106
[8453]107    def doAfterStudentPaymentApproval(self):
108        """Process student after payment was approved.
109        """
[9148]110        if self.p_current:
111            error = self._createActivationCodes()
112            if error is not None:
113                return False, error, error
[9438]114        log = '%s payment approved: %s' % (self.p_category, self.p_id)
[8453]115        msg = _('Payment approved')
116        return True, msg, log
117
[8422]118    def approveStudentPayment(self):
119        """Approve payment and process student.
120        """
121        if self.p_state == 'paid':
[8428]122            return False, _('This ticket has already been paid.'), None
[8422]123        self.approve()
[8732]124        return self.doAfterStudentPaymentApproval()
[8422]125
126
[9984]127StudentOnlinePayment = attrs_to_fields(
128    StudentOnlinePayment, omit=['display_item'])
[6875]129
[10030]130class Payer(grok.Adapter):
131    """An adapter to publish student data through a simple webservice.
[8703]132    """
133    grok.context(IStudentOnlinePayment)
[10030]134    grok.implements(IPayer)
[8703]135
136    @property
[8708]137    def display_fullname(self):
[10030]138        "Name of  payer"
[8736]139        return self.context.student.display_fullname
[8703]140
[8708]141    @property
142    def id(self):
[10030]143        "Id of payer"
[8736]144        return self.context.student.student_id
[8708]145
146    @property
[9733]147    def matric_number(self):
[10030]148        "Matric number or reg number of payer"
[9506]149        return self.context.student.matric_number
150
151    @property
[9733]152    def reg_number(self):
[10030]153        "Reg number or reg number of payer"
[9733]154        return self.context.student.reg_number
155
156    @property
[8708]157    def faculty(self):
[10030]158        "Faculty of payer"
[8736]159        return self.context.student.faccode
[8708]160
161    @property
162    def department(self):
[10030]163        "Department of payer"
[8736]164        return self.context.student.depcode
[8708]165
[6875]166# Student online payments must be importable. So we might need a factory.
167class StudentOnlinePaymentFactory(grok.GlobalUtility):
168    """A factory for student online payments.
169    """
170    grok.implements(IFactory)
171    grok.name(u'waeup.StudentOnlinePayment')
172    title = u"Create a new online payment.",
173    description = u"This factory instantiates new online payment instances."
174
175    def __call__(self, *args, **kw):
176        return StudentOnlinePayment()
177
178    def getInterfaces(self):
[7811]179        return implementedBy(StudentOnlinePayment)
Note: See TracBrowser for help on using the repository browser.