activate item javascript calculator
This commit is contained in:
parent
9d930a0450
commit
11c5712675
8 changed files with 177 additions and 28 deletions
|
@ -4,5 +4,5 @@ from wtforms import validators, ValidationError
|
|||
from wtforms.fields.html5 import EmailField
|
||||
|
||||
class ActivateForm(FlaskForm):
|
||||
period = SelectField('Domain Period', choices=[('1 Year', 12), ('2 Years', 24)])
|
||||
period = SelectField('Domain Period', choices=[(12, '1 Year'), (24, '2 Years'), (36, '3 Years')], coerce=int)
|
||||
submit = SubmitField('Activate')
|
||||
|
|
|
@ -33,13 +33,16 @@ def activate(itemid=0):
|
|||
abort(404)
|
||||
|
||||
service = Service.query.filter_by(pid=itemid).first()
|
||||
price = float(service.price)
|
||||
if service.enabled == True and service.warning == False:
|
||||
abort(404)
|
||||
ppm = float(service.price)
|
||||
form = ActivateForm(period=int(service.period))
|
||||
|
||||
owner = service.owner
|
||||
if owner.confirmed and form.validate_on_submit():
|
||||
if owner.wallet < price:
|
||||
flash('Insufficient Funds')
|
||||
total = ppm * form.period.data
|
||||
if owner.wallet < total:
|
||||
flash('Activation costs {} {}. Insufficient Funds'.format(total, owner.currency))
|
||||
return redirect(url_for('uinvoice.transactions'))
|
||||
current_app.logger.info('[{}] Charge service: {}'.format(owner.email, service.description))
|
||||
today = datetime.utcnow()
|
||||
|
@ -48,7 +51,7 @@ def activate(itemid=0):
|
|||
extradays = relativedelta(today, days=+(service.daysleft))
|
||||
service.date_last_charge = today + extradays
|
||||
service.period = form.period.data
|
||||
service.daysleft = daysleft.days + extradays.days - 1
|
||||
service.daysleft = daysleft.days + extradays.days
|
||||
service.warning = False
|
||||
service.enabled = True
|
||||
db.session.commit()
|
||||
|
@ -64,5 +67,5 @@ def activate(itemid=0):
|
|||
return redirect(url_for('admin.list_items'))
|
||||
else:
|
||||
return redirect(url_for('main.dashboard'))
|
||||
return render_template('smanager/activate.html', form=form, service=service, total=service.price)
|
||||
return render_template('smanager/activate.html', form=form, service=service, ppm=ppm, total=(ppm * service.period))
|
||||
|
||||
|
|
|
@ -1,6 +1,29 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Activate service #{{ service.pid }}{% endblock %}
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
<script type="text/javascript">
|
||||
function getPricePerMonth()
|
||||
{
|
||||
var period = 0;
|
||||
var periodselect = document.getElementById('period');
|
||||
period = periodselect.value;
|
||||
return period;
|
||||
}
|
||||
|
||||
function calculateTotal()
|
||||
{
|
||||
var period = getPricePerMonth();
|
||||
var ppm = {{ ppm }};
|
||||
var total = 0;
|
||||
total = period * ppm;
|
||||
var divobj = document.getElementById('totalPrice');
|
||||
divobj.innerHTML = "Total Price: "+total;
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}Activate service{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
|
||||
|
@ -8,20 +31,20 @@
|
|||
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">Activate</div>
|
||||
<div class="panel-heading">Activate service {{ service.description }}</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<form method="POST" action"{{ url_for('smanager.activate', itemid=service.pid) }}">
|
||||
<h3>
|
||||
{{ form.period.label }} {{ form.period }}<br />
|
||||
<p>
|
||||
{{ form.period.label }} {{ form.period(**{"onchange":"calculateTotal()"}) }}<br />
|
||||
{% for error in form.period.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
<h3>
|
||||
---<br />
|
||||
Total = {{ total }}
|
||||
<div id="totalPrice">Previous Period: {{ total }}</div>
|
||||
</h3>
|
||||
|
||||
<p>
|
||||
{{ form.csrf_token() }}
|
||||
{{ form.submit }}
|
||||
</p>
|
||||
|
|
|
@ -48,9 +48,6 @@ var myChart = new Chart(ctx, {
|
|||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
{% include "/settings/acc_avatar.html" %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-8">
|
||||
<div class="panel panel-info">
|
||||
|
@ -59,6 +56,11 @@ var myChart = new Chart(ctx, {
|
|||
<canvas id="transchart" height="80"></canvas>
|
||||
</div></div></div>
|
||||
|
||||
<div class="col-md-4">
|
||||
{% include "/settings/acc_avatar.html" %}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">Transactions</div>
|
||||
|
|
|
@ -1,6 +1,29 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Activatei deployment #{{ deploy.machine_id }}{% endblock %}
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
<script type="text/javascript">
|
||||
function getPricePerMonth()
|
||||
{
|
||||
var period = 0;
|
||||
var periodselect = document.getElementById('period');
|
||||
period = periodselect.value;
|
||||
return period;
|
||||
}
|
||||
|
||||
function calculateTotal()
|
||||
{
|
||||
var period = getPricePerMonth();
|
||||
var ppm = {{ ppm }};
|
||||
var total = 0;
|
||||
total = period * ppm;
|
||||
var divobj = document.getElementById('totalPrice');
|
||||
divobj.innerHTML = "Total Price: "+total;
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}Activate deployment{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
|
||||
|
@ -8,20 +31,20 @@
|
|||
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">Activate</div>
|
||||
<div class="panel-heading">Activate deployment {{ deploy.machine_alias }}</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<form method="POST" action"{{ url_for('vmanager.activate', itemid=deploy.machine_id) }}">
|
||||
<h3>
|
||||
CPU x {{ deploy.machine_cpu }} cores = {{ cpu_cost }}<br />
|
||||
Memory x {{ deploy.machine_mem }} MB = {{ mem_cost }}<br />
|
||||
Storage x {{ deploy.machine_hdd }} GB = {{ hdd_cost }}<br />
|
||||
{{ form.period.label }} {{ form.period }}<br />
|
||||
CPU: {{ deploy.machine_cpu }} cores<br />
|
||||
Memory: {{ deploy.machine_mem }} MB<br />
|
||||
Storage: {{ deploy.machine_hdd }} GB<br />
|
||||
{{ form.period.label }} {{ form.period(**{"onchange":"calculateTotal()"}) }}<br />
|
||||
{% for error in form.period.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
---<br />
|
||||
Total = {{ total }}
|
||||
<div id="totalPrice">Previous Period: {{ total }}</div>
|
||||
</h3>
|
||||
|
||||
<p>
|
||||
|
|
|
@ -97,7 +97,8 @@ def deploy(product_id=None):
|
|||
'vps_cpu': form.cpu.data,
|
||||
'vps_mem': form.mem.data,
|
||||
'vps_hdd': form.hdd.data,
|
||||
'vps_ipv4': form.ipv4.data }
|
||||
'vps_ipv4': form.ipv4.data,
|
||||
'vps_mac': form.mac.data }
|
||||
|
||||
try:
|
||||
query = contact_proxmaster(data, 'vmcreate')
|
||||
|
@ -106,7 +107,7 @@ def deploy(product_id=None):
|
|||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
if query is not None:
|
||||
deployment = Deployment(user_id=client_id, product_id=product_id, machine_alias=form.servername.data, machine_id=query['cube'], machine_cpu=form.cpu.data, machine_mem=form.mem.data, machine_hdd=form.hdd.data, date_expire=(datetime.utcnow() + timedelta(days=30)), enabled=True)
|
||||
deployment = Deployment(user_id=client_id, product_id=product_id, machine_alias=form.servername.data, machine_id=query['cube'], machine_cpu=form.cpu.data, machine_mem=form.mem.data, machine_hdd=form.hdd.data, enabled=True)
|
||||
db.session.add(deployment)
|
||||
db.session.commit()
|
||||
|
||||
|
@ -132,16 +133,19 @@ def activate(itemid=0):
|
|||
abort(404)
|
||||
|
||||
deploy = Deployment.query.filter_by(machine_id=itemid).first()
|
||||
if deploy.enabled == True and deploy.warning == False:
|
||||
abort(404)
|
||||
cpu_cost = deploy.machine_cpu * current_app.config['CPU_RATIO']
|
||||
mem_cost = ( deploy.machine_mem / 1024 ) * current_app.config['MEM_RATIO']
|
||||
hdd_cost = deploy.machine_hdd * current_app.config['HDD_RATIO']
|
||||
total = round(cpu_cost + mem_cost + hdd_cost,2)
|
||||
ppm = round(cpu_cost + mem_cost + hdd_cost)
|
||||
form = ActivateForm(period=int(deploy.period))
|
||||
|
||||
owner = deploy.owner
|
||||
if owner.confirmed and form.validate_on_submit():
|
||||
total = ppm * form.period.data
|
||||
if owner.wallet < total:
|
||||
flash('Insufficient Funds')
|
||||
flash('Activation costs {} {}. Insufficient Funds'.format(total, owner.currency))
|
||||
return redirect(url_for('uinvoice.transactions'))
|
||||
current_app.logger.info('[{}] Charge deployment: {}'.format(owner.email, deploy.machine_id))
|
||||
today = datetime.utcnow()
|
||||
|
@ -150,7 +154,7 @@ def activate(itemid=0):
|
|||
extradays = relativedelta(today, days=+(deploy.daysleft))
|
||||
deploy.date_last_charge = today + extradays
|
||||
deploy.period = form.period.data
|
||||
deploy.daysleft = daysleft.days + extradays.days - 1
|
||||
deploy.daysleft = daysleft.days + extradays.days
|
||||
deploy.warning = False
|
||||
deploy.enabled = True
|
||||
db.session.commit()
|
||||
|
@ -161,11 +165,13 @@ def activate(itemid=0):
|
|||
|
||||
owner.wallet = owner.wallet - total
|
||||
db.session.commit()
|
||||
|
||||
flash('Deployment {} activated for {} month(s)'.format(str(deploy.machine_alias), form.period.data))
|
||||
if owner.is_administrator:
|
||||
return redirect(url_for('admin.list_items'))
|
||||
else:
|
||||
return redirect(url_for('main.dashboard'))
|
||||
return render_template('vmanager/activate.html', form=form, deploy=deploy, cpu_cost=cpu_cost, mem_cost=mem_cost, hdd_cost=hdd_cost, total=total)
|
||||
return render_template('vmanager/activate.html', form=form, deploy=deploy, cpu_cost=cpu_cost, mem_cost=mem_cost, hdd_cost=hdd_cost, ppm=ppm, total=(ppm * deploy.period))
|
||||
|
||||
@vmanager.route('/<cmd>/<int:vmid>')
|
||||
@login_required
|
||||
|
|
86
config.py.dist
Normal file
86
config.py.dist
Normal file
|
@ -0,0 +1,86 @@
|
|||
import os
|
||||
import random
|
||||
import hashlib
|
||||
import time
|
||||
|
||||
basedir = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
class BaseConfig(object):
|
||||
#DATABASE
|
||||
SQLALCHEMY_DATABASE_URI = 'postgresql://proxadmin:CHANGEME@localhost/proxdb'
|
||||
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
|
||||
SQLALCHEMY_RECORD_QUERIES = True
|
||||
SLOW_DB_QUERY_TIME = 0.5
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = True
|
||||
#SQLALCHEMY_ECHO = True
|
||||
|
||||
#MAIL
|
||||
MAIL_SERVER = 'mail.server.tld'
|
||||
MAIL_PORT = 587
|
||||
MAIL_USE_TLS = True
|
||||
MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'admin@server.tld'
|
||||
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or 'CHANGEME'
|
||||
MAIL_SUBJECT_PREFIX = '[admin]'
|
||||
MAIL_SENDER = 'Virtual Office <admin@server.tld>'
|
||||
MAIL_ADMIN = os.environ.get('MAIL_ADMIN') or 'Proxadmin'
|
||||
|
||||
#API
|
||||
PROXMASTER_URL='https://api.example.tld'
|
||||
APIKEY='CHANGEME'
|
||||
ADMIN_EMAIL='adminuser@example.tld'
|
||||
ADMIN_PREFIX='admin123456'
|
||||
|
||||
#MISC
|
||||
SUPPORTED_LOCALES = ['en']
|
||||
|
||||
#SECURITY
|
||||
SECRET_KEY = 'CHANGEME'
|
||||
CSRF_ENABLED = True
|
||||
WTF_CSRF_ENABLED = True
|
||||
WTF_CSRF_TIME_LIMIT = 180
|
||||
#SESSION_COOKIE_DOMAIN = "www.example.tld"
|
||||
#SESSION_COOKIE_SECURE = True
|
||||
RECAPTCHA_PUBLIC_KEY = "CHANGEME"
|
||||
RECAPTCHA_PRIVATE_KEY = "CHANGEME"
|
||||
RECAPTCHA_DATA_ATTRS = {'theme': 'dark'}
|
||||
|
||||
#FACEBOOK
|
||||
FB_APP_ID = 'CHANGEME'
|
||||
FB_APP_SECRET = 'CHANGEME'
|
||||
FB_PAGE_ID = 'CHANGEME'
|
||||
|
||||
#GOOGLEOAUTH2
|
||||
GOOGLE_CLIENT_ID = ('CHANGEME'
|
||||
'.apps.googleusercontent.com')
|
||||
GOOGLE_CLIENT_SECRET= '6XScleYPVEY5Vvd_GvZ_RHlB'
|
||||
REDIRECT_UTL = 'https://www.example.tld/auth/oauth2callback'
|
||||
AUTH_URI = 'https://accounts.google.com/o/oauth2/auth'
|
||||
TOKEN_URI = 'https://accounts.google.com/o/oauth2/token'
|
||||
USER_INFO = 'https://www.googleapis.com/userinfo/v2/me'
|
||||
|
||||
REGISTER_BONUS = 5.0
|
||||
|
||||
# EXAMPLE DATA
|
||||
REGIONS = [ ('region1', 'Region1'),
|
||||
('region2', 'Region2') ]
|
||||
CPU_RATIO = 4.7
|
||||
MEM_RATIO = 3.0
|
||||
HDD_RATIO = 0.4
|
||||
|
||||
@staticmethod
|
||||
def init_app(app):
|
||||
pass
|
||||
|
||||
|
||||
class ProductionConfig(BaseConfig):
|
||||
DEBUG = False
|
||||
|
||||
class DevelopmentConfig(BaseConfig):
|
||||
DEBUG = True
|
||||
|
||||
config = {
|
||||
'development': DevelopmentConfig,
|
||||
'production': ProductionConfig,
|
||||
'default': ProductionConfig
|
||||
}
|
||||
|
|
@ -98,6 +98,9 @@ def autowarn():
|
|||
print('Deployment "' + deploy.machine_alias + '" is ' + str(daysleft.days) + ' days until expiration. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c'))
|
||||
deploy.warning = True
|
||||
db.session.commit()
|
||||
else:
|
||||
deploy.warning = False
|
||||
db.session.commit()
|
||||
|
||||
services_ena = Service.query.filter_by(enabled=True).all()
|
||||
for service in services_ena:
|
||||
|
@ -111,6 +114,9 @@ def autowarn():
|
|||
print('Service "' + service.description + '" is ' + str(daysleft.days) + ' days until expiration. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c'))
|
||||
service.warning = True
|
||||
db.session.commit()
|
||||
else:
|
||||
service.warning = False
|
||||
db.session.commit()
|
||||
|
||||
domains_ena = Domain.query.filter_by(enabled=True).all()
|
||||
for domain in domains_ena:
|
||||
|
|
Loading…
Reference in a new issue