Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if self.type == 'sepa_debit':
return PaymentMethod._requires_authentication(self)
return False
def _attaching_is_declined(self):
if self.type == 'sepa_debit':
return PaymentMethod._attaching_is_declined(self)
return False
def _charging_is_declined(self):
if self.type == 'sepa_debit':
return PaymentMethod._charging_is_declined(self)
return False
class SetupIntent(StripeObject):
object = 'setup_intent'
_id_prefix = 'seti_'
def __init__(self, customer=None, usage=None, payment_method_types=None,
metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
if customer is not None:
assert type(customer) is str and customer.startswith('cus_')
if usage is None:
usage = 'off_session'
assert usage in ('off_session', 'on_session')
if payment_method_types is None:
payment_method_types = ['card']
def _api_list_all(cls, url, charge=None, limit=None):
try:
if charge is not None:
assert type(charge) is str and charge.startswith('ch_')
except AssertionError:
raise UserError(400, 'Bad request')
li = super(Refund, cls)._api_list_all(url, limit=limit)
if charge is not None:
Charge._api_retrieve(charge) # to return 404 if not existant
li._list = [r for r in li._list if r.charge == charge]
li._list.sort(key=lambda i: i.date, reverse=True)
return li
class Source(StripeObject):
object = 'source'
_id_prefix = 'src_'
def __init__(self, type=None, currency=None, owner=None, metadata=None,
# custom arguments depending on the type:
sepa_debit=None,
**kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type in (
'ach_credit_transfer', 'ach_debit', 'alipay', 'bancontact',
'bitcoin', 'card', 'eps', 'giropay', 'ideal', 'multibanco',
'p24', 'sepa_debit', 'sofort', 'three_d_secure')
assert _type(currency) is str and currency
self.display_name = display_name
self.inclusive = inclusive
self.percentage = percentage
self.active = active
self.description = description
self.jurisdiction = jurisdiction
self.metadata = metadata or {}
def _tax_amount(self, amount):
return {'amount': int(amount * self.percentage / 100.0),
'inclusive': self.inclusive,
'tax_rate': self.id}
class Token(StripeObject):
object = 'token'
_id_prefix = 'tok_'
def __init__(self, card=None, customer=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type(card) is dict
if customer is not None:
assert type(customer) is str and customer.startswith('cus_')
except AssertionError:
raise UserError(400, 'Bad request')
# If this raises, abort and don't create the token
card['object'] = 'card'
# All exceptions must be raised before this point.
super().__init__(id)
self.amount_off = amount_off
self.percent_off = percent_off
self.metadata = metadata or {}
self.currency = currency
self.duration = duration
self.duration_in_months = duration_in_months
self.max_redemptions = None
self.redeem_by = None
self.times_redeemed = 0
self.valid = True
class Customer(StripeObject):
object = 'customer'
_id_prefix = 'cus_'
def __init__(self, name=None, description=None, email=None,
phone=None, address=None,
invoice_settings=None, business_vat_id=None,
preferred_locales=None, tax_id_data=None,
metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
if name is not None:
assert type(name) is str
if description is not None:
assert type(description) is str
@property
def last4(self):
return self._card_number[-4:]
def _requires_authentication(self):
return PaymentMethod._requires_authentication(self)
def _attaching_is_declined(self):
return PaymentMethod._attaching_is_declined(self)
def _charging_is_declined(self):
return PaymentMethod._charging_is_declined(self)
class Charge(StripeObject):
object = 'charge'
_id_prefix = 'ch_'
def __init__(self, amount=None, currency=None, description=None,
metadata=None, customer=None, source=None, capture=True,
**kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
amount = try_convert_to_int(amount)
capture = try_convert_to_bool(capture)
try:
assert type(amount) is int and amount >= 0
assert type(currency) is str and currency
if description is not None:
assert type(description) is str
obj = cls._api_retrieve(id)
lines = List('/v1/invoices/' + id + '/lines', limit=limit)
lines._list = obj.lines._list
return lines
extra_apis.extend((
('GET', '/v1/invoices/upcoming', Invoice._api_upcoming_invoice),
('POST', '/v1/invoices/{id}/pay', Invoice._api_pay_invoice),
('POST', '/v1/invoices/{id}/void', Invoice._api_void_invoice),
('GET', '/v1/invoices/{id}/lines', Invoice._api_list_lines)))
class InvoiceItem(StripeObject):
object = 'invoiceitem'
_id_prefix = 'ii_'
def __init__(self, invoice=None, subscription=None, plan=None, amount=None,
currency=None, customer=None, period_start=None,
period_end=None, proration=False, description=None,
tax_rates=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
amount = try_convert_to_int(amount)
period_start = try_convert_to_int(period_start)
period_end = try_convert_to_int(period_end)
proration = try_convert_to_bool(proration)
try:
if invoice is not None:
return [tr._tax_amount(self.amount) for tr in self.tax_rates]
@classmethod
def _api_create(cls, **data):
raise UserError(405, 'Method Not Allowed')
@classmethod
def _api_update(cls, id, **data):
raise UserError(405, 'Method Not Allowed')
@classmethod
def _api_delete(cls, id):
raise UserError(405, 'Method Not Allowed')
class List(StripeObject):
object = 'list'
def __init__(self, url=None, limit=None):
limit = try_convert_to_int(limit)
limit = 10 if limit is None else limit
try:
assert type(limit) is int and limit > 0
except AssertionError:
raise UserError(400, 'Bad request')
# All exceptions must be raised before this point.
super().__init__()
self.url = url
self._limit = limit
if type(obj[k]) is str:
id = obj[k]
cls = StripeObject._get_class_for_id(id)
obj[k] = cls._api_retrieve(id)._export()
if path is not None:
do_expand(path, obj[k])
try:
for path in expand:
do_expand(path, obj)
except KeyError as e:
raise UserError(400, 'Bad expand %s' % e)
return obj
class Card(StripeObject):
object = 'card'
_id_prefix = 'card_'
def __init__(self, source=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type(source) is dict
assert source.get('object', None) == 'card'
number = source.get('number', None)
exp_month = try_convert_to_int(source.get('exp_month', None))
exp_year = try_convert_to_int(source.get('exp_year', None))
cvc = source.get('cvc', None)
address_city = source.get('address_city', None)
address_country = source.get('address_country', None)
obj.payment_method = None
if obj.invoice:
invoice = Invoice._api_retrieve(obj.invoice)
invoice._on_payment_failure_later()
return obj
extra_apis.extend((
('POST', '/v1/payment_intents/{id}/confirm', PaymentIntent._api_confirm),
('POST', '/v1/payment_intents/{id}/cancel', PaymentIntent._api_cancel),
('POST', '/v1/payment_intents/{id}/_authenticate',
PaymentIntent._api_authenticate)))
class PaymentMethod(StripeObject):
object = 'payment_method'
_id_prefix = 'pm_'
def __init__(self, type=None, billing_details=None, card=None,
sepa_debit=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type in ('card', 'sepa_debit')
assert billing_details is None or _type(billing_details) is dict
if type == 'card':
assert _type(card) is dict and card.keys() == {
'number', 'exp_month', 'exp_year', 'cvc'}
card['exp_month'] = try_convert_to_int(card['exp_month'])
card['exp_year'] = try_convert_to_int(card['exp_year'])
Customer._api_remove_source),
('GET', '/v1/customers/{id}/subscriptions',
Customer._api_list_subscriptions),
('POST', '/v1/customers/{id}/subscriptions',
Customer._api_add_subscription),
('GET', '/v1/customers/{id}/subscriptions/{subscription_id}',
Customer._api_retrieve_subscription),
('POST', '/v1/customers/{id}/subscriptions/{subscription_id}',
Customer._api_update_subscription),
# This is the old API route:
('POST', '/v1/customers/{id}/cards', Customer._api_add_source),
('POST', '/v1/customers/{id}/tax_ids', Customer._api_add_tax_id),
('GET', '/v1/customers/{id}/tax_ids', Customer._api_list_tax_ids)))
class Event(StripeObject):
object = 'event'
_id_prefix = 'evt_'
def __init__(self, type, data):
# All exceptions must be raised before this point.
super().__init__()
self.type = type
self.data = {'object': data._export()}
self.api_version = '2017-08-15'
@classmethod
def _api_create(cls, **data):
raise UserError(405, 'Method Not Allowed')
@classmethod