Exemple #1
0
    def __init__(self,
                 verbose_name=None,
                 name=None,
                 max_digits=None,
                 decimal_places=None,
                 default=None,
                 default_currency=DEFAULT_CURRENCY,
                 currency_choices=CURRENCY_CHOICES,
                 **kwargs):

        nullable = kwargs.get('null', False)
        if default is None and not nullable:
            # Backwards compatible fix for non-nullable fields
            default = 0.0

        if isinstance(default, basestring):
            try:
                # handle scenario where default is formatted like:
                # 'amount currency-code'
                amount, currency = default.split(" ")
            except ValueError:
                # value error would be risen if the default is
                # without the currency part, i.e
                # 'amount'
                amount = default
                currency = default_currency
            default = Money(float(amount), Currency(code=currency))
        elif isinstance(default, (float, Decimal, int)):
            default = Money(default, default_currency)

        if not (nullable and default is None) and not isinstance(
                default, Money):
            raise Exception(
                "default value must be an instance of Money, is: %s" %
                str(default))

        # Avoid giving the user hard-to-debug errors if they miss required attributes
        if max_digits is None:
            raise Exception(
                "You have to provide a max_digits attribute to Money fields.")

        if decimal_places is None:
            raise Exception(
                "You have to provide a decimal_places attribute to Money fields."
            )

        if not default_currency:
            default_currency = default.currency

        self.default_currency = default_currency
        self.currency_choices = currency_choices
        self.frozen_by_south = kwargs.pop('frozen_by_south', False)

        super(MoneyField, self).__init__(verbose_name,
                                         name,
                                         max_digits,
                                         decimal_places,
                                         default=default,
                                         **kwargs)
def _load_currency(val):
    """Deserialize string values as standard currencies, but
    manually define fully-defined currencies (with code/name/numeric/countries).
    """
    from moneyed import get_currency
    try:
        return get_currency(code=val)
    except:
        return Currency(**val)
Exemple #3
0
    def __init__(self, name, currency, balance=0):
        if not isinstance(currency, Currency):
            currency = Currency(currency)
        if not isinstance(balance, Money):
            balance = Money(balance, currency)
        if balance.currency != currency:
            raise TypeError('Currency mismatch')

        self.name = name
        self.balance = balance
        self.currency = currency
    def __init__(self,
                 verbose_name=None,
                 name=None,
                 max_digits=None,
                 decimal_places=None,
                 default=Money(0.0, DEFAULT_CURRENCY),
                 default_currency=DEFAULT_CURRENCY,
                 currency_choices=CURRENCY_CHOICES,
                 **kwargs):

        if isinstance(default, basestring):
            amount, currency = default.split(" ")
            default = Money(float(amount), Currency(code=currency))
        elif isinstance(default, (float, Decimal)):
            default = Money(default, default_currency)

        if not isinstance(default, Money):
            raise Exception(
                "default value must be an instance of Money, is: %s" %
                str(default))

        # Avoid giving the user hard-to-debug errors if they miss required attributes
        if max_digits is None:
            raise Exception(
                "You have to provide a max_digits attribute to Money fields.")

        if decimal_places is None:
            raise Exception(
                "You have to provide a decimal_places attribute to Money fields."
            )

        if not default_currency:
            default_currency = default.currency

        self.default_currency = default_currency
        self.currency_choices = currency_choices
        self.frozen_by_south = kwargs.pop('frozen_by_south', False)

        super(MoneyField, self).__init__(verbose_name,
                                         name,
                                         max_digits,
                                         decimal_places,
                                         default=default,
                                         **kwargs)
Exemple #5
0
 def setup_default(self, default, default_currency, nullable):
     if default is None and not nullable:
         # Backwards compatible fix for non-nullable fields
         default = 0.0
     if isinstance(default, string_types):
         try:
             # handle scenario where default is formatted like:
             # 'amount currency-code'
             amount, currency = default.split(' ')
         except ValueError:
             # value error would be risen if the default is
             # without the currency part, i.e
             # 'amount'
             amount = default
             currency = default_currency
         default = Money(Decimal(amount), Currency(code=currency))
     elif isinstance(default, (float, Decimal, int)):
         default = Money(default, default_currency)
     if not (nullable and default is None) and not isinstance(default, Money):
         raise ValueError('default value must be an instance of Money, is: %s' % default)
     return default
Exemple #6
0
    def __init__(self, request):
        self.charset = request.POST.get('charset', None)
        logger.debug("charset: %s", self.charset)
        # logger.debug("request body: %s", request.body)

        ipn_log = None
        if settings.IPN_LOG_ENABLED:
            ipn_log = IPNLog()
            ipn_log._start_time = time.time()
            ipn_log.path = request.path
            ipn_log.post = json.dumps(request.POST, cls=DjangoJSONEncoder)
            ipn_log.save()

        # verify that the request is paypal's
        url = '%s?cmd=_notify-validate' % settings.PAYPAL_PAYMENT_HOST
        # post_data = {}
        # for k, v in request.POST.copy().iteritems():
        #     post_data[k] = unicode(v).encode('utf-8')
        # data = urllib.urlencode(post_data)
        # verify_request = UrlRequest().call(url, data=data)
        verify_request = UrlRequest().call(url, data=request.body)

        # check code
        if verify_request.code != 200:
            raise IpnError('PayPal response code was %s' % verify_request.code)

        # check response
        raw_response = verify_request.response
        if ipn_log:
            ipn_log.verify_request_response = raw_response
            ipn_log.save()

        if raw_response != 'VERIFIED':
            raise IpnError('PayPal response was "%s"' % raw_response)

        # check transaction type
        raw_type = request.POST.get('transaction_type', None)
        allowed_types = [
            IPN_TYPE_PAYMENT,
            IPN_TYPE_ADJUSTMENT,
            IPN_TYPE_PREAPPROVAL,
            None,
        ]

        if raw_type in allowed_types:
            self.type = raw_type
        else:
            raise IpnError('Unknown transaction_type received: %s' % raw_type)

        self.transactions = self.process_transactions(request.POST)

        try:
            # payments and adjustments define these
            self.status = request.POST.get('status', None)
            self.sender_email = request.POST.get('sender_email', '')
            self.action_type = request.POST.get('action_type', None)
            self.payment_request_date = IPN.process_date(
                request.POST.get('payment_request_date', None))
            self.reverse_all_parallel_payments_on_error = request.POST.get(
                'reverse_all_parallel_payments_on_error', 'false') == 'true'
            self.return_url = request.POST.get('return_url', None)
            self.cancel_url = request.POST.get('cancel_url', None)
            self.ipn_notification_url = request.POST.get(
                'ipn_notification_url', None)
            self.pay_key = request.POST.get('pay_key', None)
            self.memo = request.POST.get('memo', None)
            self.fees_payer = request.POST.get('fees_payer', None)
            self.trackingId = request.POST.get('trackingId', None)
            self.preapproval_key = request.POST.get('preapproval_key', None)
            self.reason_code = request.POST.get('reason_code', None)

            # preapprovals define these
            self.approved = request.POST.get('approved', 'false') == 'true'
            self.current_number_of_payments = IPN.process_int(
                request.POST.get('current_number_of_payments', None))
            self.current_total_amount_of_all_payments = IPN.process_money(
                request.POST.get('current_total_amount_of_all_payments', None))
            self.current_period_attempts = IPN.process_int(
                request.POST.get('current_period_attempts', None))
            self.currency_code = Currency(
                request.POST.get('currency_code', None))
            self.date_of_month = IPN.process_int(
                request.POST.get('date_of_month', None))
            self.day_of_week = IPN.process_int(
                request.POST.get('day_of_week', None), None)
            self.starting_date = IPN.process_date(
                request.POST.get('starting_date', None))
            self.ending_date = IPN.process_date(
                request.POST.get('ending_date', None))
            self.max_total_amount_of_all_payments = Money(
                request.POST.get('max_total_amount_of_all_payments', 0.0),
                request.POST.get('currency_code', settings.DEFAULT_CURRENCY))
            self.max_amount_per_payment = IPN.process_money(
                request.POST.get('max_amount_per_payment', None))
            self.max_number_of_payments = IPN.process_int(
                request.POST.get('max_number_of_payments', None))
            self.payment_period = request.POST.get('payment_period', None)
            self.pin_type = request.POST.get('pin_type', None)
        except Exception, e:
            logger.error('Could not parse request')
            raise e
Exemple #7
0
 def test_currency_user(self):
     a = Currency(code='AAA', numeric=9999, name='test')
     b = self.dump_and_load(a)
     self.assertEqual(b.code, a.code)
     self.assertEqual(b.numeric, a.numeric)
     self.assertEqual(b.name, a.name)