integrate bootstrap
This commit is contained in:
parent
6c15d2086e
commit
48ce21f833
7 changed files with 88 additions and 45 deletions
|
@ -2,6 +2,7 @@
|
||||||
django
|
django
|
||||||
djangorestframework
|
djangorestframework
|
||||||
django-auth-ldap
|
django-auth-ldap
|
||||||
|
django-bootstrap4
|
||||||
|
|
||||||
psycopg2
|
psycopg2
|
||||||
ldap3
|
ldap3
|
||||||
|
|
|
@ -51,6 +51,7 @@ INSTALLED_APPS = [
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'django_extensions',
|
'django_extensions',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
|
'bootstrap4',
|
||||||
'uncloud',
|
'uncloud',
|
||||||
'uncloud_pay',
|
'uncloud_pay',
|
||||||
'uncloud_auth',
|
'uncloud_auth',
|
||||||
|
@ -164,6 +165,11 @@ USE_TZ = True
|
||||||
# https://docs.djangoproject.com/en/3.0/howto/static-files/
|
# https://docs.djangoproject.com/en/3.0/howto/static-files/
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ]
|
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ]
|
||||||
|
STATICFILES_FINDERS = [
|
||||||
|
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||||
|
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# XML-RPC interface of opennebula
|
# XML-RPC interface of opennebula
|
||||||
OPENNEBULA_URL = 'https://opennebula.example.com:2634/RPC2'
|
OPENNEBULA_URL = 'https://opennebula.example.com:2634/RPC2'
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{% extends 'bootstrap4/bootstrap4.html' %}
|
||||||
|
|
||||||
|
{% load bootstrap4 %}
|
||||||
|
|
||||||
|
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
@ -5,10 +10,17 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
<title>{% block title %}Welcome to uncloud{% endblock %}</title>
|
{% block bootstrap4_title %}{% block title %}Welcome to uncloud{% endblock %}{% endblock %}
|
||||||
|
|
||||||
{% block header %}{% endblock %}
|
{% block header %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
{% block bootstrap4_content %}
|
||||||
|
<div class="container">
|
||||||
{% block body %}{% endblock %}
|
{% block body %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% autoescape off %}{% bootstrap_messages %}{% endautoescape %}
|
||||||
|
{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -2,19 +2,61 @@
|
||||||
{% block title %}{% endblock %}
|
{% block title %}{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div>
|
<div id="content">
|
||||||
<h1>Welcome to uncloud</h1>
|
<h1>Welcome to uncloud</h1>
|
||||||
Welcome to uncloud, checkout the following locations:
|
<div id="intro">
|
||||||
|
Welcome to uncloud, the Open Source cloud management
|
||||||
|
system by <a href="https://ungleich.ch">ungleich</a>.
|
||||||
|
It is an <a href="{% url 'api-root' %}">API</a> driven system with
|
||||||
|
some convience views provided by
|
||||||
|
the <a href="https://www.django-rest-framework.org/">Django Rest
|
||||||
|
Framework</a>. You can
|
||||||
|
freely <a href="https://code.ungleich.ch/uncloud/uncloud/">access
|
||||||
|
the source code of uncloud</a>.
|
||||||
|
|
||||||
|
|
||||||
|
<div id="creditcards">
|
||||||
|
<h2>Credit cards</h2>
|
||||||
|
<div>
|
||||||
|
Credit cards are registered with stripe. We only save a the
|
||||||
|
last 4 digits and the expiry date of the card to make
|
||||||
|
identification for you easier.
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="{% url 'api-root' %}">The uncloud API</a>
|
|
||||||
<li><a href="{% url 'cc_register' %}">Register a credit card</a>
|
<li><a href="{% url 'cc_register' %}">Register a credit card</a>
|
||||||
(this is required to be done via Javascript so that we never see
|
(this is required to be done via Javascript so that we never see
|
||||||
your credit card, but it is sent directly to stripe)
|
your credit card, but it is sent directly to stripe)
|
||||||
|
<li><a href="{% url 'stripecreditcard-list' %}">You can list your
|
||||||
|
credit cards</a>
|
||||||
|
By default the first credit card is used for charging
|
||||||
|
("active: true") and later added cards will not be
|
||||||
|
used. To change this, first disable the active flag and
|
||||||
|
then set it on another credit card.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="pay">
|
||||||
|
<h2>Payments and Balance</h2>
|
||||||
|
To trigger a payment
|
||||||
|
|
||||||
You can list your credit card via the API.
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="{% url 'payment-list' %}">Make a payment or list your payments</a>
|
||||||
|
<li><a href="{% url 'payment-balance-list' %}">Show your balance</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="net">
|
||||||
|
<h2>Networking</h2>
|
||||||
|
With uncloud you can use a variety of network related services.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>You can <a href="{% url 'wireguardvpnnetwork-list' %}">list or
|
||||||
|
create VPNs</a> based on wireguard
|
||||||
|
<li>You can also <a href="{% url 'wireguardvpnnetworksizes-list'
|
||||||
|
%}">list which network sizes are available</a>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -26,38 +26,27 @@ router = routers.DefaultRouter()
|
||||||
router.register(r'beta/vm', vmviews.NicoVMProductViewSet, basename='nicovmproduct')
|
router.register(r'beta/vm', vmviews.NicoVMProductViewSet, basename='nicovmproduct')
|
||||||
|
|
||||||
# VM
|
# VM
|
||||||
router.register(r'v1/vm/snapshot', vmviews.VMSnapshotProductViewSet, basename='vmsnapshotproduct')
|
# router.register(r'v1/vm/snapshot', vmviews.VMSnapshotProductViewSet, basename='vmsnapshotproduct')
|
||||||
router.register(r'v1/vm/diskimage', vmviews.VMDiskImageProductViewSet, basename='vmdiskimageproduct')
|
# router.register(r'v1/vm/diskimage', vmviews.VMDiskImageProductViewSet, basename='vmdiskimageproduct')
|
||||||
router.register(r'v1/vm/disk', vmviews.VMDiskProductViewSet, basename='vmdiskproduct')
|
# router.register(r'v1/vm/disk', vmviews.VMDiskProductViewSet, basename='vmdiskproduct')
|
||||||
router.register(r'v1/vm/vm', vmviews.VMProductViewSet, basename='vmproduct')
|
# router.register(r'v1/vm/vm', vmviews.VMProductViewSet, basename='vmproduct')
|
||||||
|
|
||||||
|
|
||||||
# creates VM from os image
|
|
||||||
#router.register(r'vm/ipv6onlyvm', vmviews.VMProductViewSet, basename='vmproduct')
|
|
||||||
# ... AND adds IPv4 mapping
|
|
||||||
#router.register(r'vm/dualstackvm', vmviews.VMProductViewSet, basename='vmproduct')
|
|
||||||
|
|
||||||
# Services
|
# Services
|
||||||
router.register(r'v1/service/matrix', serviceviews.MatrixServiceProductViewSet, basename='matrixserviceproduct')
|
# router.register(r'v1/service/matrix', serviceviews.MatrixServiceProductViewSet, basename='matrixserviceproduct')
|
||||||
router.register(r'v1/service/generic', serviceviews.GenericServiceProductViewSet, basename='genericserviceproduct')
|
# router.register(r'v1/service/generic', serviceviews.GenericServiceProductViewSet, basename='genericserviceproduct')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Pay
|
# Pay
|
||||||
router.register(r'v1/my/address', payviews.BillingAddressViewSet, basename='billingaddress')
|
# router.register(r'v1/my/address', payviews.BillingAddressViewSet, basename='billingaddress')
|
||||||
router.register(r'v1/my/bill', payviews.BillViewSet, basename='bill')
|
# router.register(r'v1/my/bill', payviews.BillViewSet, basename='bill')
|
||||||
router.register(r'v1/my/order', payviews.OrderViewSet, basename='order')
|
# router.register(r'v1/my/order', payviews.OrderViewSet, basename='order')
|
||||||
#router.register(r'v1/my/payment', payviews.PaymentViewSet, basename='payment')
|
# router.register(r'v1/my/payment-method', payviews.PaymentMethodViewSet, basename='payment-method')
|
||||||
router.register(r'v1/my/payment-method', payviews.PaymentMethodViewSet, basename='payment-method')
|
|
||||||
|
|
||||||
# admin/staff urls
|
# admin/staff urls
|
||||||
router.register(r'v1/admin/bill', payviews.AdminBillViewSet, basename='admin/bill')
|
# router.register(r'v1/admin/bill', payviews.AdminBillViewSet, basename='admin/bill')
|
||||||
#router.register(r'v1/admin/payment', payviews.AdminPaymentViewSet, basename='admin/payment')
|
# router.register(r'v1/admin/order', payviews.AdminOrderViewSet, basename='admin/order')
|
||||||
router.register(r'v1/admin/order', payviews.AdminOrderViewSet, basename='admin/order')
|
# router.register(r'v1/admin/vmhost', vmviews.VMHostViewSet)
|
||||||
router.register(r'v1/admin/vmhost', vmviews.VMHostViewSet)
|
# router.register(r'v1/admin/vmcluster', vmviews.VMClusterViewSet)
|
||||||
router.register(r'v1/admin/vmcluster', vmviews.VMClusterViewSet)
|
|
||||||
#router.register(r'v1/admin/vpnpool', netviews.VPNPoolViewSet)
|
|
||||||
#router.register(r'v1/admin/opennebula', oneviews.VMViewSet, basename='opennebula')
|
|
||||||
|
|
||||||
# User/Account
|
# User/Account
|
||||||
router.register(r'v1/my/user', authviews.UserViewSet, basename='user')
|
router.register(r'v1/my/user', authviews.UserViewSet, basename='user')
|
||||||
|
@ -73,7 +62,7 @@ router.register(r'v2/net/wireguardvpn', netviews.WireGuardVPNViewSet, basename='
|
||||||
router.register(r'v2/net/wireguardvpnsizes', netviews.WireGuardVPNSizes, basename='wireguardvpnnetworksizes')
|
router.register(r'v2/net/wireguardvpnsizes', netviews.WireGuardVPNSizes, basename='wireguardvpnnetworksizes')
|
||||||
|
|
||||||
# Payment related
|
# Payment related
|
||||||
router.register(r'v2/payment/credit-card', payviews.CreditCardViewSet, basename='credit-card')
|
router.register(r'v2/payment/credit-card', payviews.CreditCardViewSet, basename='stripecreditcard')
|
||||||
router.register(r'v2/payment/payment', payviews.PaymentViewSet, basename='payment')
|
router.register(r'v2/payment/payment', payviews.PaymentViewSet, basename='payment')
|
||||||
router.register(r'v2/payment/balance', payviews.BalanceViewSet, basename='payment-balance')
|
router.register(r'v2/payment/balance', payviews.BalanceViewSet, basename='payment-balance')
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ from uncloud import AMOUNT_DECIMALS, AMOUNT_MAX_DIGITS
|
||||||
###
|
###
|
||||||
# 2020-12 Checked code
|
# 2020-12 Checked code
|
||||||
|
|
||||||
class StripeCreditCardSerializer(serializers.ModelSerializer):
|
class StripeCreditCardSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = StripeCreditCard
|
model = StripeCreditCard
|
||||||
exclude = [ "card_id", "owner" ]
|
exclude = [ "card_id", "owner" ]
|
||||||
|
|
|
@ -2,13 +2,6 @@
|
||||||
|
|
||||||
{% block header %}
|
{% block header %}
|
||||||
<script src="https://js.stripe.com/v3/"></script>
|
<script src="https://js.stripe.com/v3/"></script>
|
||||||
|
|
||||||
<style>
|
|
||||||
#content {
|
|
||||||
width: 400px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
Loading…
Reference in a new issue