diff --git a/app/models.py b/app/models.py index 4886263..764a562 100644 --- a/app/models.py +++ b/app/models.py @@ -234,6 +234,7 @@ class Service(db.Model): daysleft = db.Column(db.Integer) warning = db.Column(db.Boolean, default=False) enabled = db.Column(db.Boolean, default=False) + cancelled = db.Column(db.Boolean, default=False) category = db.Column(db.String) description = db.Column(db.Unicode) @@ -248,7 +249,9 @@ class Deployment(db.Model): period = db.Column(db.Integer) daysleft = db.Column(db.Integer) warning = db.Column(db.Boolean, default=False) - enabled = db.Column(db.Boolean, default=False) + enabled = db.Column(db.Boolean, default=True) + protected = db.Column(db.Boolean, default=False) #machines with this False will be autodeleted after the warning period is over. + cancelled = db.Column(db.Boolean, default=False) machine_id = db.Column(db.BigInteger) #cubeid machine_alias = db.Column(db.String) #dns name @@ -308,6 +311,7 @@ class Domain(db.Model): daysleft = db.Column(db.Integer) warning = db.Column(db.Boolean, default=False) enabled = db.Column(db.Boolean, default=False) + cancelled = db.Column(db.Boolean, default=False) user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow) diff --git a/app/smanager/routes.py b/app/smanager/routes.py index e449863..1454b13 100644 --- a/app/smanager/routes.py +++ b/app/smanager/routes.py @@ -19,6 +19,11 @@ def after_request(response): current_app.logger.warning('Slow query: %s\nParameters: %s\nDuration: %fs\nContext: %s\n' % (query.statement, query.parameters, query.duration, query.context)) return response +@smanager.route('/requestservice', methods=['GET', 'POST']) +@login_required +def requestservice(): + abort(403) + @smanager.route('/activate/', methods=['GET', 'POST']) @login_required def activate(itemid=0): diff --git a/app/templates/admin/admin_tasks.html b/app/templates/admin/admin_tasks.html index 76d56fa..4495bed 100644 --- a/app/templates/admin/admin_tasks.html +++ b/app/templates/admin/admin_tasks.html @@ -3,13 +3,13 @@
Admin Pages
- - - - - - - + + + + + + +
diff --git a/app/templates/main/dashboard.html b/app/templates/main/dashboard.html index 1b5caf6..dc77116 100644 --- a/app/templates/main/dashboard.html +++ b/app/templates/main/dashboard.html @@ -128,6 +128,7 @@ addEventListener("DOMContentLoaded", function() {
Deployments

+

@@ -153,7 +154,7 @@ addEventListener("DOMContentLoaded", function() { - + {% else %} {% if deploy.warning == True %} @@ -185,7 +186,8 @@ addEventListener("DOMContentLoaded", function() {
{% for addr in deploy.machine_addresses %} {{ addr.ip }}
{% endfor %}
- + +
@@ -220,10 +222,10 @@ addEventListener("DOMContentLoaded", function() { {{ service.description }} {{ moment(service.date_last_charge).format('lll') }} ({{ moment(service.date_last_charge).fromNow() }}) {% if service.enabled == False %} - + {% else %} {% if service.warning == True %} - + {% else %} {{ service.daysleft }} day(s) {% endif %} @@ -233,7 +235,8 @@ addEventListener("DOMContentLoaded", function() { - + + @@ -261,7 +264,7 @@ addEventListener("DOMContentLoaded", function() { EXPIRED {% else %} {% if domain.warning == True %} - + {% else %} {{ domain.daysleft }} day(s) {% endif %} @@ -272,7 +275,9 @@ addEventListener("DOMContentLoaded", function() { - + + + @@ -304,7 +309,9 @@ addEventListener("DOMContentLoaded", function() { - + + + diff --git a/app/templates/main/footer_simple.html b/app/templates/main/footer_simple.html index 50984b0..fe0392a 100644 --- a/app/templates/main/footer_simple.html +++ b/app/templates/main/footer_simple.html @@ -1,4 +1,5 @@ +

- -

+ +

Icons by icons8.com

diff --git a/app/templates/vmanager/recipe.html b/app/templates/vmanager/recipe.html new file mode 100644 index 0000000..5b1f8ed --- /dev/null +++ b/app/templates/vmanager/recipe.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} + +{% block head %} +{{ super() }} + +{% endblock %} + +{% block title %}Apply Recipe{% endblock %} + +{% block page_content %} + +
+ +
+
+
Apply Recipe {{ deploy.machine_alias }}
+
+ +
+

+{{ form.recipe.label }} {{ form.recipe(**{"onchange":"previewDetails()"}) }}
+ {% for error in form.recipe.errors %} + {{ error }}
+ {% endfor %} +---
+
Preview
+

+ +

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

+ +
+
+
+ +{% endblock %} + diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 95c6f83..5f899c4 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -19,11 +19,6 @@ import ast def randstr(n): return ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.digits) for _ in range(n)) -#@vmanager.before_app_request -#def before_request(): -# g.user = current_user -# print('current_user: %s, g.user: %s, leaving bef_req' % (current_user, g.user)) - @vmanager.after_app_request def after_request(response): for query in get_debug_queries(): @@ -31,58 +26,19 @@ def after_request(response): current_app.logger.warning('Slow query: %s\nParameters: %s\nDuration: %fs\nContext: %s\n' % (query.statement, query.parameters, query.duration, query.context)) return response -#APP STORE -@vmanager.route('/market/', methods=['GET']) + +@vmanager.route('/createvm', methods=['GET', 'POST']) @login_required -def market(group_id=0): - page = { 'title': 'Market' } - allproducts = Product.get_products() - allgroups = current_app.config['GROUPS'] - - if group_id == 0: - return render_template('vmanager/market.html', groups=allgroups, products=allproducts) - - filtered_products = {} - for key, value in allproducts.items(): - if value['group'] == group_id: - filtered_products[key] = value - - if filtered_products == {}: - abort(404) - return render_template('vmanager/marketgroup.html', groupname=allgroups[group_id], products=filtered_products) - - -@vmanager.route('/deploy/', methods=['GET', 'POST']) -@login_required -def deploy(product_id=None): - #if current_user.wallet < 20: - # flash('Недостатъчно средства в сметката за тази операция') - # return redirect(url_for('uinvoice.addfunds')) - +def createvm(): if current_user.name is None: flash('Please update profile info for this operation.') - return redirect(url_for('uinvoice.profile')) - - page = { 'title': 'Deploy' } - try: - product = Product.get_products()[product_id] - except: - current_app.logger.error('unknown product {}'.format(product_id)) - abort(404) - product_pic = '..' + product['img'] - product_name = product['name'] - product_description = product['description'] + return redirect(url_for('settings.profile')) - product_cpu = product['cpu'] - product_mem = product['mem'] - product_hdd = product['hdd'] - product_recipe = product['recipe'] - - hostname = 'deploy-{}.local'.format(randstr(6)) - - form = DeployForm(servername=hostname, cpu=product_cpu, mem=product_mem, hdd=product_hdd, recipe=product_recipe) - form.region.choices = current_app.config['REGIONS'] - form.recipe.choices = current_app.config['RECIPES'] + deployment_seeds = Deployment.query.filter_by(protected=False).all() + if deployment_seeds != []: + flash('Offline deployments exist.') + return redirect(url_for('main.dashboard')) + if current_user.confirmed and form.validate_on_submit(): client_id = current_user.pid @@ -93,7 +49,6 @@ def deploy(product_id=None): 'vmpass': form.vmpassword.data, 'region': form.region.data, 'vps_type': 'kvm', - 'vps_recipe': form.recipe.data, 'vps_cpu': form.cpu.data, 'vps_mem': form.mem.data, 'vps_hdd': form.hdd.data, @@ -117,7 +72,6 @@ def deploy(product_id=None): return redirect(url_for('main.dashboard')) - return render_template('vmanager/deploy.html', page=page, form=form, product_id=product_id, product_pic=product_pic, product_name=product_name, product_description=product_description, product_recipe=product_recipe) @vmanager.route('/activate/', methods=['GET', 'POST']) @login_required @@ -173,6 +127,7 @@ def activate(itemid=0): 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, total=(ppm * deploy.period), currency=owner.currency) + @vmanager.route('//') @login_required def command(cmd=None, vmid=0): @@ -205,3 +160,23 @@ def command(cmd=None, vmid=0): return redirect(db_result['url']) abort(404) +#APP STORE +@vmanager.route('/market/', methods=['GET']) +@login_required +def market(group_id=0): + page = { 'title': 'Market' } + allproducts = Product.get_products() + allgroups = current_app.config['GROUPS'] + + if group_id == 0: + return render_template('vmanager/market.html', groups=allgroups, products=allproducts) + + filtered_products = {} + for key, value in allproducts.items(): + if value['group'] == group_id: + filtered_products[key] = value + + if filtered_products == {}: + abort(404) + return render_template('vmanager/marketgroup.html', groupname=allgroups[group_id], products=filtered_products) +