File: //home/arjun/projects/buyercall/cli/commands/cmd_stripe.py
import logging
import click
import stripe
from buyercall.blueprints.billing.gateways.stripecom import Plan as PaymentPlan
from config import settings
from buyercall.lib.util_sqlalchemy import ResourceMixin, AwareDateTime
from buyercall.extensions import db
from sqlalchemy import or_, orm
from buyercall.blueprints.billing.models.credit_card import CreditCard
from buyercall.blueprints.billing.models.coupon import Coupon
from buyercall.blueprints.user.models import User
from buyercall.blueprints.billing.models.subscription import Subscription
from buyercall.blueprints.billing.gateways.stripecom import Card as PaymentCard
from buyercall.blueprints.billing.gateways.stripecom import \
Subscription as PaymentSubscription
STRIPE_SECRET_KEY = None
STRIPE_PLANS = None
try:
from instance import settings
STRIPE_SECRET_KEY = settings.STRIPE_SECRET_KEY
STRIPE_PLANS = settings.STRIPE_PLANS
except ImportError:
logging.error('Ensure __init__.py and settings.py both exist in instance/')
exit(1)
except AttributeError:
from config import settings
if STRIPE_SECRET_KEY is None:
STRIPE_SECRET_KEY = settings.STRIPE_SECRET_KEY
if STRIPE_PLANS is None:
STRIPE_PLANS = settings.STRIPE_PLANS
@click.group()
def cli():
""" Perform various tasks with Stripe's API. """
stripe.api_key = STRIPE_SECRET_KEY
@click.command()
def sync_plans():
"""
Sync (upsert) STRIPE_PLANS to Stripe.
:return: None
"""
if STRIPE_PLANS is None:
return None
for _, value in STRIPE_PLANS.items():
plan = PaymentPlan.retrieve(value.get('id'))
if plan:
PaymentPlan.update(id=value.get('id'),
name=value.get('name'),
metadata=value.get('metadata'),
statement_descriptor=value.get(
'statement_descriptor'))
else:
PaymentPlan.create(**value)
return None
@click.command()
@click.argument('plan_ids', nargs=-1)
def delete_plans(plan_ids):
"""
Delete 1 or more plans from Stripe.
:return: None
"""
for plan_id in plan_ids:
PaymentPlan.delete(plan_id)
return None
@click.command()
def list_plans():
"""
List all existing plans on Stripe.
:return: Stripe plans
"""
return logging.info(PaymentPlan.list())
@click.command()
def associate_invoice_cc():
"""
Associate credit card with invoice plan
:return: Stripe plans
"""
from buyercall.app import create_app
from buyercall.extensions import db
# Create a context for the database connection.
app = create_app()
db.app = app
cc_name = input('Credit Card Name: ')
cc_number = input('Credit Card Number: ')
cc_number = int(cc_number)
cc_exp_month = input('Credit Card Exp Month: ')
cc_exp_month = int(cc_exp_month)
cc_exp_year = input('Credit Card Exp Year: ')
cc_exp_year = int(cc_exp_year)
cc_cvc = input('Credit Card CVC: ')
cc_cvc = int(cc_cvc)
stripe.api_key = STRIPE_SECRET_KEY
token = stripe.Token.create(
card={
"number": '4242424242424242',
"exp_month": 12,
"exp_year": 2017,
"cvc": '123'
},
)
print('token.id:')
print(token.id)
user = User.query.filter(User.role == 'sysadmin').first()
plan = 'invoice'
customer = PaymentSubscription.create(token=token.id, email=user.email, plan=plan)
print('customer.id:')
print(customer.id)
with app.app_context():
subscription = Subscription()
subscription.activate_twilio(user)
subscription.payment_id = customer.id
subscription.cancelled_subscription_on = None
subscription.plan = plan
# Create the credit card.
credit_card = CreditCard(cc_name=cc_name, **CreditCard.extract_card_params(customer))
subscription.credit_card = credit_card
subscription.status = 'active'
db.session.add(user)
db.session.add(credit_card)
db.session.add(subscription)
db.session.commit()
pass
cli.add_command(sync_plans)
cli.add_command(delete_plans)
cli.add_command(list_plans)
cli.add_command(associate_invoice_cc)