From 11c57126750031bf7c5d70c862474507be73f255 Mon Sep 17 00:00:00 2001 From: deflax Date: Fri, 21 Jul 2017 02:30:09 +0300 Subject: [PATCH] activate item javascript calculator --- app/dmanager/forms.py | 2 +- app/smanager/routes.py | 13 ++-- app/templates/smanager/activate.html | 35 ++++++++-- app/templates/uinvoice/transactions.html | 8 ++- app/templates/vmanager/activate.html | 37 ++++++++-- app/vmanager/routes.py | 18 +++-- config.py.dist | 86 ++++++++++++++++++++++++ manage.py | 6 ++ 8 files changed, 177 insertions(+), 28 deletions(-) create mode 100644 config.py.dist diff --git a/app/dmanager/forms.py b/app/dmanager/forms.py index 8df64ba..5d6670e 100644 --- a/app/dmanager/forms.py +++ b/app/dmanager/forms.py @@ -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') diff --git a/app/smanager/routes.py b/app/smanager/routes.py index 37fb1b1..53bc447 100644 --- a/app/smanager/routes.py +++ b/app/smanager/routes.py @@ -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)) diff --git a/app/templates/smanager/activate.html b/app/templates/smanager/activate.html index 54effcc..8c98153 100644 --- a/app/templates/smanager/activate.html +++ b/app/templates/smanager/activate.html @@ -1,6 +1,29 @@ {% extends "base.html" %} -{% block title %}Activate service #{{ service.pid }}{% endblock %} +{% block head %} +{{ super() }} + +{% endblock %} + +{% block title %}Activate service{% endblock %} {% block page_content %} @@ -8,20 +31,20 @@
-
Activate
+
Activate service {{ service.description }}
-

-{{ form.period.label }} {{ form.period }}
+

+{{ form.period.label }} {{ form.period(**{"onchange":"calculateTotal()"}) }}
{% for error in form.period.errors %} {{ error }}
{% endfor %} +

---
-Total = {{ total }} +
Previous Period: {{ total }}

-

{{ form.csrf_token() }} {{ form.submit }}

diff --git a/app/templates/uinvoice/transactions.html b/app/templates/uinvoice/transactions.html index c540e90..3d39594 100644 --- a/app/templates/uinvoice/transactions.html +++ b/app/templates/uinvoice/transactions.html @@ -48,9 +48,6 @@ var myChart = new Chart(ctx, {
-
- {% include "/settings/acc_avatar.html" %} -
@@ -59,6 +56,11 @@ var myChart = new Chart(ctx, {
+
+ {% include "/settings/acc_avatar.html" %} +
+ +
Transactions
diff --git a/app/templates/vmanager/activate.html b/app/templates/vmanager/activate.html index 72899a3..7a347de 100644 --- a/app/templates/vmanager/activate.html +++ b/app/templates/vmanager/activate.html @@ -1,6 +1,29 @@ {% extends "base.html" %} -{% block title %}Activatei deployment #{{ deploy.machine_id }}{% endblock %} +{% block head %} +{{ super() }} + +{% endblock %} + +{% block title %}Activate deployment{% endblock %} {% block page_content %} @@ -8,20 +31,20 @@
-
Activate
+
Activate deployment {{ deploy.machine_alias }}

-CPU x {{ deploy.machine_cpu }} cores = {{ cpu_cost }}
-Memory x {{ deploy.machine_mem }} MB = {{ mem_cost }}
-Storage x {{ deploy.machine_hdd }} GB = {{ hdd_cost }}
-{{ form.period.label }} {{ form.period }}
+CPU: {{ deploy.machine_cpu }} cores
+Memory: {{ deploy.machine_mem }} MB
+Storage: {{ deploy.machine_hdd }} GB
+{{ form.period.label }} {{ form.period(**{"onchange":"calculateTotal()"}) }}
{% for error in form.period.errors %} {{ error }}
{% endfor %} ---
-Total = {{ total }} +
Previous Period: {{ total }}

diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 6a3a2f0..d4bb571 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -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('//') @login_required diff --git a/config.py.dist b/config.py.dist new file mode 100644 index 0000000..535eaff --- /dev/null +++ b/config.py.dist @@ -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 ' + 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 +} + diff --git a/manage.py b/manage.py index 15758e0..95a1037 100644 --- a/manage.py +++ b/manage.py @@ -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: