diff --git a/app/admin/routes.py b/app/admin/routes.py index ee35e05..9b2fe8e 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -7,7 +7,7 @@ from .forms import ChargeForm, Addr2PoolForm from .. import db from ..email import send_email -from ..models import User, Transaction, Deployment, Service, Region, Bridge, Router, Address, Domain, contact_proxmaster +from ..models import User, Transaction, Server, Deployment, Service, Region, Bridge, Router, Address, Domain, contact_proxmaster from ..decorators import admin_required, permission_required import base64 @@ -65,6 +65,30 @@ def list_recyclebin(): domains = Domain.query.filter_by(deleted=True).all() return render_template('admin/list_recyclebin.html', deployments=deployments, services=services, domains=domains) +@admin.route("/listusers", methods=['GET']) +@fresh_login_required +@admin_required +def list_users(): + allusers = User.query.filter_by(active=True).order_by(User.last_seen.desc()).all() + return render_template('admin/list_users.html', users=allusers) + +@admin.route("/charge/", methods=['GET', 'POST']) +@fresh_login_required +@admin_required +def charge(user_pid=0): + cuser = User.query.filter_by(pid=user_pid).first() + form = ChargeForm() + if form.validate_on_submit(): + transaction = Transaction(user_id=int(cuser.pid), description='Account charged by staff', value=float(form.amount.data)) + db.session.add(transaction) + db.session.commit() + + cuser.wallet += float(form.amount.data) + db.session.add(cuser) + db.session.commit() + return redirect(url_for('admin.list_users')) + return render_template('admin/charge.html', form=form, usr=cuser) + @admin.route("/listaddresses", methods=['GET']) @fresh_login_required @admin_required @@ -94,29 +118,12 @@ def addr2pool(): return redirect(url_for('admin.list_addresses')) return render_template('admin/addr2pool.html', form=form, alladdresses=alladdrlist) -@admin.route("/listusers", methods=['GET']) +@admin.route("/listservers", methods=['GET']) @fresh_login_required @admin_required -def list_users(): - allusers = User.query.filter_by(active=True).order_by(User.last_seen.desc()).all() - return render_template('admin/list_users.html', users=allusers) - -@admin.route("/charge/", methods=['GET', 'POST']) -@fresh_login_required -@admin_required -def charge(user_pid=0): - cuser = User.query.filter_by(pid=user_pid).first() - form = ChargeForm() - if form.validate_on_submit(): - transaction = Transaction(user_id=int(cuser.pid), description='Account charged by staff', value=float(form.amount.data)) - db.session.add(transaction) - db.session.commit() - - cuser.wallet += float(form.amount.data) - db.session.add(cuser) - db.session.commit() - return redirect(url_for('admin.list_users')) - return render_template('admin/charge.html', form=form, usr=cuser) +def list_servers(): + allservers = Server.query.all() + return render_template('admin/list_servers.html', servers=allservers) @admin.route("/listtransactions", methods=['GET']) @fresh_login_required diff --git a/app/main/routes.py b/app/main/routes.py index 2c0d2c3..b28d3b5 100644 --- a/app/main/routes.py +++ b/app/main/routes.py @@ -5,7 +5,7 @@ from flask_sqlalchemy import get_debug_queries from . import main from .. import db from ..email import send_email -from ..models import User, Permission, Deployment, Service, Region, Address, Bridge, Router, Domain, contact_proxmaster +from ..models import User, Permission, Server, Deployment, Service, Region, Address, Bridge, Router, Domain, contact_proxmaster import base64 @@ -19,7 +19,8 @@ def after_request(response): #STATIC PAGES @main.route("/", methods=['GET']) def index(): - return render_template('main/index.html') + allservers = Server.query.all() + return render_template('main/index.html', servers=allservers) @main.route("/chat", methods=['GET']) def chat(): diff --git a/app/models.py b/app/models.py index e715f67..aaa425e 100644 --- a/app/models.py +++ b/app/models.py @@ -87,6 +87,7 @@ class User(db.Model, UserMixin): wallet = db.Column(db.Float) currency = db.Column(db.String, default='BGN') + inv_servers = db.relationship('Server', backref='owner', lazy='dynamic') inv_routers = db.relationship('Router', backref='owner', lazy='dynamic') inv_addresses = db.relationship('Address', backref='owner', lazy='dynamic') inv_bridges = db.relationship('Bridge', backref='owner', lazy='dynamic') @@ -95,6 +96,7 @@ class User(db.Model, UserMixin): inv_services = db.relationship('Service', backref='owner', lazy='dynamic') inv_domains = db.relationship('Domain', backref='owner', lazy='dynamic') + inv_transactions = db.relationship('Transaction', backref='owner', lazy='dynamic') def __init__(self, **kwargs): @@ -232,6 +234,7 @@ def contact_proxmaster(data, method): class Region(db.Model): __tablename__ = 'regions' pid = db.Column(db.Integer, primary_key=True) + inv_servers = db.relationship('Server', backref='region', lazy='dynamic') inv_addresses = db.relationship('Address', backref='region', lazy='dynamic') inv_bridges = db.relationship('Bridge', backref='region', lazy='dynamic') @@ -240,6 +243,16 @@ class Region(db.Model): description = db.Column(db.String) extraprice = db.Column(db.Float) +class Server(db.Model): + __tablename__ = 'servers' + pid = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.ForeignKey('users.pid')) #FK + region_id = db.Column(db.ForeignKey('regions.pid')) #FK + + name = db.Column(db.String) + description = db.Column(db.String) + address = db.Column(db.String) + class Bridge(db.Model): __tablename__ = 'bridges' pid = db.Column(db.Integer, primary_key=True) diff --git a/app/templates/admin/admin_tasks.html b/app/templates/admin/admin_tasks.html index 3d5c9a0..c2c8824 100644 --- a/app/templates/admin/admin_tasks.html +++ b/app/templates/admin/admin_tasks.html @@ -8,7 +8,8 @@ - + + diff --git a/app/templates/admin/list_servers.html b/app/templates/admin/list_servers.html new file mode 100644 index 0000000..e0f8c42 --- /dev/null +++ b/app/templates/admin/list_servers.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} + +{% block page_content %} +
+ + {% include "admin/admin_tasks.html" %} + +
+
+
Transactions
+
+ +
+ + + + + + + + + + + + + {% for server in servers %} + + + + + + + + + {% endfor %} +
NameDescriptionAddressRegionSeller
{{ server.name }}{{ server.description }}{{ server.address }}{{ server.region.name }}{{ server.owner.email }}
+
+ +
+
+ + +
+ +{% endblock %} + diff --git a/app/templates/main/index.html b/app/templates/main/index.html index 4cf9c1f..93d0aaa 100644 --- a/app/templates/main/index.html +++ b/app/templates/main/index.html @@ -81,6 +81,16 @@
+{% for server in servers %} +
+
+
+
+
+
+
+
+{% endfor %}
@@ -97,7 +107,7 @@

Поддръжка

-

Ще Ви помогнем във всички неприятни ситуации, по всяко време. Независимо от нивото на умения Ви. Ние сме винаги насреща за въпроси.

+

Ще Ви помогнем във всички неприятни ситуации, по всяко време.

@@ -124,15 +134,6 @@
-
-
-
-
- -
-
-
-
{% endblock %} diff --git a/app/templates/vmanager/activate.html b/app/templates/vmanager/activate.html index 575c9c7..1b77a61 100644 --- a/app/templates/vmanager/activate.html +++ b/app/templates/vmanager/activate.html @@ -14,17 +14,17 @@ function getPeriod() function calculateTotal() { var period = getPeriod(); - var ppm = {{ ppm }}; + var tpm = {{ tpm }}; var discount = {{ discount }}; - + var ppm = {{ ppm }}; + var pricetotal = 0; pricetotal = period * ppm; var priceselect = document.getElementById('totalPrice'); - priceselect.innerHTML = "Total Price: "+pricetotal+" {{ currency }}"; + priceselect.innerHTML = "Total: " + period + " x " + ppm + " = " + pricetotal +" {{ currency }}"; var discounttotal = 0; discounttotal = period * discount; - var discountselect = document.getElementById('totalDiscount'); discountselect.innerHTML = "Discount -{{ deploy.discount }}%: "+discounttotal+" {{ currency }}"; @@ -54,9 +54,10 @@ Storage: {{ deploy.machine_hdd }} GB
{% endfor %} ---
{% if deploy.discount != 0 %} -
Discount -{{ deploy.discount }}%: {{ discount }} {{ currency }}
+
Discount -{{ deploy.discount }}%: {{ deploy.period * discount }} {{ currency }}
{% endif %} -
{% if deploy.protected == False %}Total:{% else %}Previous Period:{% endif %} {{ total }} {{ currency }}
+
Total: {{ deploy.period }} x {{ ppm }} = {{ total }} {{ currency }}
+

diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 42b50c7..c93cc87 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -138,9 +138,9 @@ def activate(itemid=0): 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'] - ppm = cpu_cost + mem_cost + hdd_cost - discount = round(( ppm * deploy.discount ) / 100) - ppm = round(ppm - discount) + tpm = cpu_cost + mem_cost + hdd_cost + discount = round(( tpm * deploy.discount ) / 100) + ppm = round(tpm - discount) #default period = 1 for virgin deployments if deploy.period is None: @@ -232,7 +232,7 @@ def activate(itemid=0): return redirect(url_for('admin.list_deployments')) 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, ppm=ppm, discount=discount, total=total, currency=owner.currency) + return render_template('vmanager/activate.html', form=form, deploy=deploy, cpu_cost=cpu_cost, mem_cost=mem_cost, hdd_cost=hdd_cost, tpm=tpm, ppm=ppm, discount=discount, total=total, currency=owner.currency) @vmanager.route('/vmremove/', methods=['GET', 'POST']) @login_required diff --git a/manage.py b/manage.py index 2e71ca6..5e1eab9 100644 --- a/manage.py +++ b/manage.py @@ -68,8 +68,8 @@ def autodisable(): expiry = lastcharge + relativedelta(lastcharge, months=+(deploy.period)) if today >= expiry: email_content = '[!] Deployment "' + deploy.machine_alias + '" is past expiration date and will be marked INACTIVE. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c') - print(str(email_content)) - send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=deploy.owner, content=str(email_content)) + print(str(email_content) + " [mail sent]") + #send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=deploy.owner, content=str(email_content)) #send_email(str(deploy.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) deploy.warning = False deploy.enabled = False @@ -83,8 +83,8 @@ def autodisable(): expiry = lastcharge + relativedelta(lastcharge, months=+(service.period)) if today >= expiry: email_content = '[!] Service "' + service.description + '" is past expiration date and will be marked INACTIVE. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c') - print(str(email_content)) - send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=service.owner, content=str(email_content)) + print(str(email_content) + " [mail sent]") + #send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=service.owner, content=str(email_content)) #send_email(str(deploy.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) service.warning = False service.enabled = False @@ -97,8 +97,8 @@ def autodisable(): expiry = domain.date_expire if today >= expiry: email_content = '[!] Domain "' + domain.fqdn + '" is past expiration date and will be marked as INACTIVE. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c') - print(str(email_content)) - send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=domain.owner, content=str(email_content)) + print(str(email_content) + " [mail sent]") + #send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=domain.owner, content=str(email_content)) #send_email(str(deploy.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) domain.warning = False domain.enabled = False @@ -122,8 +122,9 @@ def autowarn(): db.session.commit() warndays = deploy.period * 5 email_content = 'Deployment "' + deploy.machine_alias + '" is ' + str(daysleft.days) + ' days until expiration. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c') - if daysleft.days == warndays or (daysleft.days / 2) == warndays: - send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=deploy.owner, content=str(email_content)) + if daysleft.days == warndays or round(daysleft.days / 2) == warndays: + print(str(email_content) + " [mail sent]") + #send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=deploy.owner, content=str(email_content)) #send_email(str(deploy.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) deploy.warning = True if daysleft.days < warndays: @@ -141,7 +142,8 @@ def autowarn(): db.session.commit() warndays = service.period * 5 email_content = 'Service "' + service.description + '" is ' + str(daysleft.days) + ' days until expiration. Last charged: ' + lastcharge.strftime('%c') + ' expiry date: ' + expiry.strftime('%c') - if daysleft.days == warndays or (daysleft.days / 2) == warndays: + if daysleft.days == warndays or round(daysleft.days / 2) == warndays: + print(str(email_content) + " [mail sent]") send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=service.owner, content=str(email_content)) send_email(str(service.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) service.warning = True @@ -159,6 +161,7 @@ def autowarn(): warndays = domain.period * 5 email_content = 'Domain "' + domain.fqdn + '" is ' + str(daysleft.days)+ ' days until expiration. Expiry date: ' + expiry.strftime('%c') if daysleft.days == warndays or (daysleft.days / 2) == warndays: + print(str(email_content) + " [mail sent]") send_email(app.config['MAIL_USERNAME'], str(email_content), 'email/adm_logger', user=domain.owner, content=str(email_content)) send_email(str(domain.owner.email), str(email_content), 'email/client_logger', content=str(email_content)) domain.warning = True