forked from uncloud/uncloud
cleanup/in between commit
This commit is contained in:
parent
f7c68b5ca5
commit
e51edab2f5
11 changed files with 107 additions and 99 deletions
|
@ -228,6 +228,10 @@ CELERY_BEAT_SCHEDULE = {
|
|||
'cleanup_tasks': {
|
||||
'task': 'uncloud.tasks.cleanup_tasks',
|
||||
'schedule': 10
|
||||
},
|
||||
'check_balance': {
|
||||
'task': 'uncloud_pay.tasks.check_balance',
|
||||
'schedule': 15
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@ def cleanup_tasks(self):
|
|||
continue
|
||||
|
||||
res = AsyncResult(id=str(task.task_id))
|
||||
print(f"Task {task}: {res.state}")
|
||||
if res.ready():
|
||||
print(res.get())
|
||||
task.delete()
|
||||
|
||||
res.forget()
|
||||
|
|
|
@ -90,7 +90,10 @@ urlpatterns = [
|
|||
path('login/', authviews.LoginView.as_view(), name="login"),
|
||||
path('logout/', authviews.LogoutView.as_view(), name="logout"),
|
||||
path('admin/', admin.site.urls),
|
||||
|
||||
path('cc/reg/', payviews.RegisterCard.as_view(), name="cc_register"),
|
||||
path('cc/submit/', payviews.RegisterCard.as_view(), name="cc_register"),
|
||||
path('cc/list/', payviews.ListCards.as_view(), name="cc_list"),
|
||||
path('cc/delete/<payment_method_id>', payviews.DeleteCard.as_view(), name="cc_delete"),
|
||||
|
||||
path('', uncloudviews.UncloudIndex.as_view(), name="uncloudindex"),
|
||||
]
|
||||
|
|
|
@ -47,10 +47,6 @@ def handle_stripe_error(f):
|
|||
# XXX: maybe send email
|
||||
logging.error(str(e))
|
||||
raise Exception(common_message)
|
||||
except Exception as e:
|
||||
# maybe send email
|
||||
logging.error(str(e))
|
||||
raise Exception(common_message)
|
||||
|
||||
return handle_problems
|
||||
|
||||
|
@ -103,3 +99,25 @@ def create_customer(name, email):
|
|||
@handle_stripe_error
|
||||
def get_customer(customer_id):
|
||||
return stripe.Customer.retrieve(customer_id)
|
||||
|
||||
@handle_stripe_error
|
||||
def get_customer_cards(customer_id):
|
||||
print(f"getting cards for: {customer_id}")
|
||||
|
||||
cards = []
|
||||
stripe_cards = stripe.PaymentMethod.list(
|
||||
customer=customer_id,
|
||||
type="card",
|
||||
)
|
||||
|
||||
for stripe_card in stripe_cards["data"]:
|
||||
card = {}
|
||||
card['brand'] = stripe_card["card"]["brand"]
|
||||
card['last4'] = stripe_card["card"]["last4"]
|
||||
card['month'] = stripe_card["card"]["exp_month"]
|
||||
card['year'] = stripe_card["card"]["exp_year"]
|
||||
card['id'] = stripe_card["card"]["id"]
|
||||
|
||||
cards.append(card)
|
||||
|
||||
return cards
|
||||
|
|
11
uncloud_pay/tasks.py
Normal file
11
uncloud_pay/tasks.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from celery import shared_task
|
||||
from .models import *
|
||||
import uuid
|
||||
|
||||
from uncloud.models import UncloudTask
|
||||
|
||||
@shared_task(bind=True)
|
||||
def check_balance(self):
|
||||
UncloudTask.objects.create(task_id=self.id)
|
||||
print("for each user res is 50")
|
||||
return 50
|
|
@ -1,18 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Error</title>
|
||||
<style>
|
||||
#content {
|
||||
width: 400px;
|
||||
margin: auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<h1>Error</h1>
|
||||
<p>{{ error }}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,76 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Stripe Card Registration</title>
|
||||
|
||||
<!-- https://stripe.com/docs/js/appendix/viewport_meta_requirements -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<style>
|
||||
#content {
|
||||
width: 400px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#callback-form {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<h1>Registering Stripe Credit Card</h1>
|
||||
|
||||
<!-- Stripe form and messages -->
|
||||
<span id="message"></span>
|
||||
<form id="setup-form">
|
||||
<div id="card-element"></div>
|
||||
<button type='button' id="card-button">
|
||||
Save
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- Dirty hack used for callback to API -->
|
||||
<form id="callback-form" action="{{ callback }}" method="post"></form>
|
||||
</div>
|
||||
|
||||
<!-- Enable Stripe from UI elements -->
|
||||
<script>
|
||||
var stripe = Stripe('{{ stripe_pk }}');
|
||||
|
||||
var elements = stripe.elements();
|
||||
var cardElement = elements.create('card');
|
||||
cardElement.mount('#card-element');
|
||||
</script>
|
||||
|
||||
<!-- Handle card submission -->
|
||||
<script>
|
||||
var cardButton = document.getElementById('card-button');
|
||||
var messageContainer = document.getElementById('message');
|
||||
var clientSecret = '{{ client_secret }}';
|
||||
|
||||
cardButton.addEventListener('click', function(ev) {
|
||||
|
||||
stripe.confirmCardSetup(
|
||||
clientSecret,
|
||||
{
|
||||
payment_method: {
|
||||
card: cardElement,
|
||||
billing_details: {
|
||||
},
|
||||
},
|
||||
}
|
||||
).then(function(result) {
|
||||
if (result.error) {
|
||||
var message = document.createTextNode('Error:' + result.error.message);
|
||||
messageContainer.appendChild(message);
|
||||
} else {
|
||||
// Return to API on success.
|
||||
document.getElementById("callback-form").submit();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
30
uncloud_pay/templates/uncloud_pay/list_stripe.html
Normal file
30
uncloud_pay/templates/uncloud_pay/list_stripe.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
{% extends 'uncloud/base.html' %}
|
||||
|
||||
{% block header %}
|
||||
<style>
|
||||
#content {
|
||||
width: 400px;
|
||||
margin: auto;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div id="content">
|
||||
<h1>Your credit cards registered with Stripe</h1>
|
||||
|
||||
<!-- Stripe form and messages -->
|
||||
<span id="message"></span>
|
||||
|
||||
<p>List of stripe credit cards:
|
||||
<ul>
|
||||
{% for card in cards %}
|
||||
<li>{{ card.brand }} ending in {{ card.last4 }} expiring
|
||||
{{ card.year }}-{{ card.month }}
|
||||
{% endfor %}
|
||||
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -45,6 +45,9 @@
|
|||
var clientSecret = '{{ client_secret }}';
|
||||
|
||||
cardButton.addEventListener('click', function(ev) {
|
||||
document.getElementById("ungleichmessage").innerHTML
|
||||
= "Registering card with Stripe, please wait ..."
|
||||
|
||||
stripe.confirmCardSetup(
|
||||
clientSecret,
|
||||
{
|
||||
|
|
|
@ -65,6 +65,36 @@ class RegisterCard(LoginRequiredMixin, TemplateView):
|
|||
context['stripe_pk'] = uncloud_stripe.public_api_key
|
||||
return context
|
||||
|
||||
class ListCards(LoginRequiredMixin, TemplateView):
|
||||
login_url = '/login/'
|
||||
|
||||
template_name = "uncloud_pay/list_stripe.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
customer_id = uncloud_stripe.get_customer_id_for(self.request.user)
|
||||
cards = uncloud_stripe.get_customer_cards(customer_id)
|
||||
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['cards'] = cards
|
||||
context['username'] = self.request.user
|
||||
|
||||
return context
|
||||
|
||||
class DeleteCard(LoginRequiredMixin, TemplateView):
|
||||
login_url = '/login/'
|
||||
|
||||
template_name = "uncloud_pay/delete_stripe_card.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
customer_id = uncloud_stripe.get_customer_id_for(self.request.user)
|
||||
cards = uncloud_stripe.get_customer_cards(customer_id)
|
||||
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['cards'] = cards
|
||||
context['username'] = self.request.user
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class PaymentMethodViewSet(viewsets.ModelViewSet):
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
|
|
Loading…
Reference in a new issue