diff --git a/app/admin/routes.py b/app/admin/routes.py index 3bd71a9..0152a2b 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -129,7 +129,7 @@ def dashboard(user_pid=0): flash('Deploy #{} unreachable. Support is notified'.format(str(cubeid))) send_email(current_app.config['MAIL_USERNAME'], 'Cube {} is unreachable'.format(cubeid), 'vmanager/email/adm_unreachable', user=cuser, cubeid=cubeid ) - current_app.logger.info('[ADMIN] {} deployments: {}, services: {}, domains: {}, services: {}'.format(cuser.email, inv_deployments_list, inv_services_list, inv_domains_list, inv_addresses_list )) + current_app.logger.warning('[ADMIN] {} deployments: {}, services: {}, domains: {}, services: {}'.format(cuser.email, inv_deployments_list, inv_services_list, inv_domains_list, inv_addresses_list )) return render_template('main/dashboard.html', rrd=rrd, status=statuses, inv_deployments=inv_deployments, inv_services=inv_services, inv_domains=inv_domains, inv_addresses=inv_addresses, region=regions) @admin.route("/listtransactions", methods=['GET']) diff --git a/app/dmanager/routes.py b/app/dmanager/routes.py index 9c40f58..7f6c155 100644 --- a/app/dmanager/routes.py +++ b/app/dmanager/routes.py @@ -23,7 +23,7 @@ def after_request(response): def activate(itemid=0): if current_user.wallet < 1: flash('Insufficient Funds') - return redirect(url_for('uinvoice.addfunds')) + return redirect(url_for('uinvoice.transactions')) #work with disabled deploys only result = current_user.inv_domains.all() @@ -32,9 +32,9 @@ def activate(itemid=0): inventory.extend([invcls.pid]) if current_user.is_administrator(): - current_app.logger.info('[ADMIN] Access override for domain id:{}'.format(itemid)) + current_app.logger.warning('[ADMIN] Access override for domain id:{}'.format(itemid)) elif not itemid in inventory: - current_app.logger.warning('[{}] Access violation with domain id: {}'.format(current_user.email, itemid)) + current_app.logger.error('[{}] Access violation with domain id: {}'.format(current_user.email, itemid)) abort(404) #current_app.logger.info('[{}] Disabled deployments: {}'.format(current_user.email, inventory)) diff --git a/app/smanager/forms.py b/app/smanager/forms.py index 4151179..edcb238 100644 --- a/app/smanager/forms.py +++ b/app/smanager/forms.py @@ -4,5 +4,5 @@ from wtforms import validators, ValidationError from wtforms.fields.html5 import EmailField class ActivateForm(FlaskForm): - period = SelectField('Service Period', choices=[('1 Month', 1), ('3 Months', 3), ('6 Months', 6), ('1 Year', 12), ('2 Years', 24)]) + period = SelectField('Service Period', choices=[(1, '1 Month'), (3, '3 Months'), (6, '6 Months'), (12, '1 Year'), (24, '2 Years')], coerce=int) submit = SubmitField('Activate') diff --git a/app/smanager/routes.py b/app/smanager/routes.py index fee3b48..37fb1b1 100644 --- a/app/smanager/routes.py +++ b/app/smanager/routes.py @@ -6,10 +6,11 @@ from . import smanager from .forms import ActivateForm from .. import db from ..email import send_email -from ..models import User, Permission, Service +from ..models import User, Permission, Service, Transaction from ..decorators import admin_required, permission_required from datetime import datetime, timedelta, date, time +from dateutil.relativedelta import relativedelta @smanager.after_app_request def after_request(response): @@ -21,25 +22,47 @@ def after_request(response): @smanager.route('/activate/', methods=['GET', 'POST']) @login_required def activate(itemid=0): - if current_user.wallet < 1: - flash('Insufficient Funds') - return redirect(url_for('uinvoice.addfunds')) - - #work with disabled deploys only result = current_user.inv_services.all() inventory = [] for invcls in result: inventory.extend([invcls.pid]) - if current_user.is_administrator(): - current_app.logger.info('[ADMIN] Access override for service id:{}'.format(itemid)) + current_app.logger.warning('[ADMIN] Access override for service id:{}'.format(itemid)) elif not itemid in inventory: - current_app.logger.warning('[{}] Access violation with service id: {}'.format(current_user.email, itemid)) + current_app.logger.error('[{}] Access violation with service id: {}'.format(current_user.email, itemid)) abort(404) - #current_app.logger.info('[{}] Disabled deployments: {}'.format(current_user.email, inventory)) - form = ActivateForm(period=Service.query.filter_by(pid=itemid)) - if current_user.confirmed and form.validate_on_submit(): - current_app.logger.info('payment') - return render_template('smanager/activate.html', form=form, itemid=itemid) + service = Service.query.filter_by(pid=itemid).first() + price = 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') + return redirect(url_for('uinvoice.transactions')) + current_app.logger.info('[{}] Charge service: {}'.format(owner.email, service.description)) + today = datetime.utcnow() + expiry = today + relativedelta(today, months=+(form.period.data)) + daysleft = expiry - today + 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.warning = False + service.enabled = True + db.session.commit() + + transaction = Transaction(user_id=int(owner.pid), description='Deployment {} activated for {} month(s)'.format(str(service.description), form.period.data), value=-price) + db.session.add(transaction) + db.session.commit() + + owner.wallet = owner.wallet - price + db.session.commit() + + if owner.is_administrator: + 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) diff --git a/app/templates/main/dashboard.html b/app/templates/main/dashboard.html index 88a0218..1b5caf6 100644 --- a/app/templates/main/dashboard.html +++ b/app/templates/main/dashboard.html @@ -172,14 +172,13 @@ addEventListener("DOMContentLoaded", function() { {% endif %} {% if status[deploy.machine_id] == 'running' %} - + {% endif %} {% if deploy.warning == True %} {% else %} {{ deploy.daysleft }} day(s) {% endif %} - - {% endif %} + {% endif %} {% endfor %} diff --git a/app/templates/smanager/activate.html b/app/templates/smanager/activate.html index bb88bce..54effcc 100644 --- a/app/templates/smanager/activate.html +++ b/app/templates/smanager/activate.html @@ -1,6 +1,6 @@ {% extends "base.html" %} -{% block title %}Activate{% endblock %} +{% block title %}Activate service #{{ service.pid }}{% endblock %} {% block page_content %} @@ -11,12 +11,16 @@
Activate
-
-

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

+{{ form.period.label }} {{ form.period }}
{% for error in form.period.errors %} {{ error }}
{% endfor %} -

+---
+Total = {{ total }} +

+

{{ form.csrf_token() }} {{ form.submit }} diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 52a75f8..6a3a2f0 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -121,15 +121,14 @@ def deploy(product_id=None): @vmanager.route('/activate/', methods=['GET', 'POST']) @login_required def activate(itemid=0): - #work with disabled deploys only result = current_user.inv_deployments.all() inventory = [] for invcls in result: inventory.extend([invcls.machine_id]) if current_user.is_administrator(): - current_app.logger.info('[ADMIN] Access override for deployment id:{}'.format(itemid)) + current_app.logger.warning('[ADMIN] Access override for deployment id:{}'.format(itemid)) elif not itemid in inventory: - current_app.logger.warning('[{}] Access violation with deployment id: {}'.format(current_user.email, itemid)) + current_app.logger.error('[{}] Access violation with deployment id: {}'.format(current_user.email, itemid)) abort(404) deploy = Deployment.query.filter_by(machine_id=itemid).first() @@ -139,44 +138,43 @@ def activate(itemid=0): total = round(cpu_cost + mem_cost + hdd_cost,2) form = ActivateForm(period=int(deploy.period)) - if current_user.confirmed and form.validate_on_submit(): - if current_user.wallet < total: + owner = deploy.owner + if owner.confirmed and form.validate_on_submit(): + if owner.wallet < total: flash('Insufficient Funds') return redirect(url_for('uinvoice.transactions')) - current_app.logger.info('[{}] Charge deployment: {}'.format(current_user.email, deploy.machine_id)) + current_app.logger.info('[{}] Charge deployment: {}'.format(owner.email, deploy.machine_id)) today = datetime.utcnow() - current_app.logger.info(form.period.data) - - daysleft = relativedelta(today, months=+(form.period.data)) - - deploy.date_last_charge = today + expiry = today + relativedelta(today, months=+(form.period.data)) + daysleft = expiry - today + extradays = relativedelta(today, days=+(deploy.daysleft)) + deploy.date_last_charge = today + extradays deploy.period = form.period.data - deploy.daysleft = form.period.data * daysleft.days + deploy.daysleft = daysleft.days + extradays.days - 1 deploy.warning = False deploy.enabled = True db.session.commit() - transaction = Transaction(user_id=int(current_user.pid), description='Deployment {} activated for {} month(s)'.format(str(deploy.machine_alias), form.period.data), value=-total) + transaction = Transaction(user_id=int(owner.pid), description='Deployment {} activated for {} month(s)'.format(str(deploy.machine_alias), form.period.data), value=-total) db.session.add(transaction) db.session.commit() - current_user.wallet = current_user.wallet - total + owner.wallet = owner.wallet - total db.session.commit() - return redirect(url_for('main.dashboard')) + 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) @vmanager.route('//') @login_required def command(cmd=None, vmid=0): - valid_commands = ['vmstatus', 'vmstart', 'vmshutdown', 'vmstop', 'vmvnc'] - #checks whether this is a valid command + valid_commands = ['vmstatus', 'vmstart', 'vmshutdown', 'vmstop', 'vmvnc'] if not cmd in valid_commands: current_app.logger.warning(cmd + ' is not a valid command!') abort(404) - #if cmd == 'vmstart' and current_user.wallet < 3.0: - # flash('Недостатъчно средства в сметката за тази операция') - # return redirect(url_for('uinvoice.addfunds')) #work with enabled deploys only result = current_user.inv_deployments.filter_by(enabled=True) @@ -185,19 +183,19 @@ def command(cmd=None, vmid=0): inventory.extend([invcls.machine_id]) if current_user.is_administrator(): - current_app.logger.info('[ADMIN] Access override for cube id:{}'.format(vmid)) + current_app.logger.warning('[ADMIN] Access override for cube id:{}'.format(vmid)) db_result = contact_proxmaster({}, cmd, vmid) if cmd == 'vmvnc': return redirect(db_result['url']) else: #checks if current user owns this vmid if not vmid in inventory: - current_app.logger.warning('[{}] Access violation with cube id: {}'.format(current_user.email, vmid)) + current_app.logger.error('[{}] Access violation with cube id: {}'.format(current_user.email, vmid)) #TODO: log ips else: db_result = contact_proxmaster({}, cmd, vmid) #print(db_result) - if cmd == 'vmvnc': - return redirect(db_result['url']) + if cmd == 'vmvnc': + return redirect(db_result['url']) abort(404)