hot fixes
This commit is contained in:
parent
0e77cb60cc
commit
0a95073b50
19 changed files with 208 additions and 138 deletions
|
@ -1,45 +1,29 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from flask import Blueprint, flash
|
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
|
||||||
from flask import g
|
|
||||||
from flask import redirect
|
|
||||||
from flask import render_template
|
|
||||||
from flask import request
|
|
||||||
from flask import session
|
|
||||||
from flask import url_for
|
|
||||||
|
|
||||||
from SWSCloudCore.controllers.administrators import ControllerAdministrators
|
from SWSCloudCore.controllers.administrators import ControllerAdministrators
|
||||||
from SWSCloudCore.controllers.billing import ControllerBilling
|
from SWSCloudCore.controllers.billing import ControllerBilling
|
||||||
from SWSCloudCore.controllers.users.manage import ControllerManageUsers
|
from SWSCloudCore.controllers.users.manage import ControllerManageUsers
|
||||||
from SWSCloudCore.controllers.users.manage import ControllerManageUsersBalance
|
from SWSCloudCore.controllers.users.manage import ControllerManageUsersBalance
|
||||||
from SWSCloudCore.controllers.users.manage import ControllerManageUsersDetails
|
from SWSCloudCore.controllers.users.manage import ControllerManageUsersDetails
|
||||||
|
from SWSCloudAdministrator.Administrator.common import requires_login
|
||||||
|
|
||||||
view_administrator_users = Blueprint('administrator_users', __name__, url_prefix='/administrator/users')
|
view_administrator_users = Blueprint('administrator_users', __name__, url_prefix='/administrator/users')
|
||||||
|
|
||||||
|
|
||||||
@view_administrator_users.route('/')
|
@view_administrator_users.route('/')
|
||||||
|
@requires_login
|
||||||
def users():
|
def users():
|
||||||
# check session
|
|
||||||
if not ControllerAdministrators().check_session():
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
# auth user
|
|
||||||
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
#
|
#
|
||||||
return render_template(
|
return render_template(
|
||||||
'administrator/users/index.html',
|
'administrator/users/index.html',
|
||||||
users=ControllerManageUsers().items_get()
|
users=ControllerManageUsers().items_get())
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@view_administrator_users.route('/details/<uuid:user_id>.html')
|
@view_administrator_users.route('/details/<uuid:user_id>.html')
|
||||||
|
@requires_login
|
||||||
def user_details(user_id):
|
def user_details(user_id):
|
||||||
# check session
|
|
||||||
if not ControllerAdministrators().check_session():
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
# auth user
|
|
||||||
if not ControllerAdministrators().auth(session.get('admin_email'), session.get('admin_password')):
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
# check exists user by uuid
|
# check exists user by uuid
|
||||||
if not ControllerManageUsers().exists_by_id(user_id):
|
if not ControllerManageUsers().exists_by_id(user_id):
|
||||||
return redirect(url_for('administrator_users.users'))
|
return redirect(url_for('administrator_users.users'))
|
||||||
|
@ -50,19 +34,12 @@ def user_details(user_id):
|
||||||
'administrator/users/details.html',
|
'administrator/users/details.html',
|
||||||
user_account=ControllerManageUsers().item_get(user_id),
|
user_account=ControllerManageUsers().item_get(user_id),
|
||||||
user_details=ControllerManageUsersDetails().item_get(user_id),
|
user_details=ControllerManageUsersDetails().item_get(user_id),
|
||||||
user_balance=ControllerManageUsersBalance().item_get(user_id),
|
user_balance=ControllerManageUsersBalance().item_get(user_id))
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@view_administrator_users.route('/credit_increase.html', methods=['POST'])
|
@view_administrator_users.route('/credit_increase.html', methods=['POST'])
|
||||||
|
@requires_login
|
||||||
def user_credits_add():
|
def user_credits_add():
|
||||||
# check session
|
|
||||||
if not ControllerAdministrators().check_session():
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
# auth user
|
|
||||||
if not ControllerAdministrators().auth(session.get('admin_email'), session.get('admin_password')):
|
|
||||||
return redirect(url_for("administrator.logout"))
|
|
||||||
|
|
||||||
user_id = request.form.get('user_id')
|
user_id = request.form.get('user_id')
|
||||||
__amount = request.form.get('amount')
|
__amount = request.form.get('amount')
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
from flask import Flask, g, render_template
|
from flask import Flask, g, render_template
|
||||||
from flask_babel import Babel
|
from flask_babel import Babel
|
||||||
from flaskext.markdown import Markdown
|
from flaskext.markdown import Markdown
|
||||||
|
from flask_multistatic import MultiStaticFlask
|
||||||
|
|
||||||
from SWSCloudAdministrator.Administrator import viewAdministrator
|
from SWSCloudAdministrator.Administrator import viewAdministrator
|
||||||
from SWSCloudCore import models
|
from SWSCloudCore import models
|
||||||
|
@ -18,10 +20,35 @@ from SWSCloudWeb.views.payments import viewPayments
|
||||||
from SWSCloudWeb.views.support import viewSupport
|
from SWSCloudWeb.views.support import viewSupport
|
||||||
from SWSCloudWeb.views.tasks import viewTasks
|
from SWSCloudWeb.views.tasks import viewTasks
|
||||||
|
|
||||||
app = Flask(__name__, static_folder='static', static_url_path='')
|
# app = Flask(__name__, static_folder='static', static_url_path='')
|
||||||
|
app = MultiStaticFlask(__name__, static_folder='static', static_url_path='')
|
||||||
# app.config['SERVER_NAME'] = settings.get('Application', 'SERVER_NAME')
|
# app.config['SERVER_NAME'] = settings.get('Application', 'SERVER_NAME')
|
||||||
app.config['DEBUG'] = config.getboolean('Application', 'DEBUG')
|
app.config['DEBUG'] = config.getboolean('Application', 'DEBUG')
|
||||||
app.config['SECRET_KEY'] = config.get("Application", "SECRET_KEY")
|
app.config['SECRET_KEY'] = config.get("Application", "SECRET_KEY")
|
||||||
|
|
||||||
|
|
||||||
|
if app.config.get('THEME_TEMPLATE_FOLDER', False):
|
||||||
|
# Jinja can be told to look for templates in different folders
|
||||||
|
# That's what we do here
|
||||||
|
template_folder = app.config['THEME_TEMPLATE_FOLDER']
|
||||||
|
if template_folder[0] != '/':
|
||||||
|
template_folder = os.path.join(app.root_path, app.template_folder, template_folder)
|
||||||
|
import jinja2
|
||||||
|
|
||||||
|
# Jinja looks for the template in the order of the folders specified
|
||||||
|
templ_loaders = [jinja2.FileSystemLoader(template_folder), app.jinja_loader]
|
||||||
|
app.jinja_loader = jinja2.ChoiceLoader(templ_loaders)
|
||||||
|
if app.config.get('THEME_STATIC_FOLDER', False):
|
||||||
|
static_folder = app.config['THEME_STATIC_FOLDER']
|
||||||
|
if static_folder[0] != '/':
|
||||||
|
static_folder = os.path.join(app.root_path, 'static', static_folder)
|
||||||
|
print static_folder
|
||||||
|
# Unlike templates, to serve static files from multiples folders we
|
||||||
|
# need flask-multistatic
|
||||||
|
# app.static_folder = [static_folder, os.path.join(app.root_path, 'static')]
|
||||||
|
app.static_folder = static_folder
|
||||||
|
|
||||||
|
|
||||||
Markdown(app)
|
Markdown(app)
|
||||||
babel = Babel(app)
|
babel = Babel(app)
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7,6 +7,7 @@ body {
|
||||||
header {
|
header {
|
||||||
background: #333 none repeat scroll 0% 0%;
|
background: #333 none repeat scroll 0% 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#banner {
|
#banner {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 4em 0 5em;
|
padding: 4em 0 5em;
|
||||||
|
@ -39,14 +40,6 @@ text-align: center;
|
||||||
margin-bottom: 50px;
|
margin-bottom: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
footer {
|
|
||||||
border-top: 1px solid #999;
|
|
||||||
}
|
|
||||||
footer .row {
|
|
||||||
margin-top: 25px;
|
|
||||||
margin-bottom: 25px;
|
|
||||||
}
|
|
||||||
.price {
|
.price {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
@ -97,4 +90,22 @@ ul#features-list li {
|
||||||
|
|
||||||
#account_bills {
|
#account_bills {
|
||||||
color: white;
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
/*border-top: 1px solid #999;*/
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 3em; /* choose any height */
|
||||||
|
}
|
||||||
|
|
||||||
|
footer .row div ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
footer .row div ul li {
|
||||||
|
float: left;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
margin: .7em;
|
||||||
}
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
<footer>
|
<footer>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-6 medium-6 columns">
|
<div class="large-12 columns">
|
||||||
<b>{{ _('Поддержка') }}</b>
|
|
||||||
<ul>
|
<ul>
|
||||||
{% if g.settings.get('SUPPORT_TEL', None) %}
|
{% if g.settings.get('SUPPORT_TEL', None) %}
|
||||||
<li>{{g.system_settings.get('SUPPORT_TEL')}}</li>
|
<li>{{g.system_settings.get('SUPPORT_TEL')}}</li>
|
||||||
|
@ -9,12 +8,10 @@
|
||||||
{% if g.settings.get('SUPPORT_EMAIL', None) %}
|
{% if g.settings.get('SUPPORT_EMAIL', None) %}
|
||||||
<li>{{g.system_settings.get('SUPPORT_EMAIL')}}</li>
|
<li>{{g.system_settings.get('SUPPORT_EMAIL')}}</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<li>2009−2016 © GoCloud.ru</li>
|
||||||
<li><a href="{{ url_for('support.index') }}">{{ _('Форма обратной связи') }}</a></li>
|
<li><a href="{{ url_for('support.index') }}">{{ _('Форма обратной связи') }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="large-6 medium-6 columns">
|
|
||||||
<p>2009−2016 © GoCloud.ru</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
{% if g.settings['footer_code'] %}
|
{% if g.settings['footer_code'] %}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
{% if session['user_id'] %}
|
{% if session['user_id'] %}
|
||||||
<ul class="right">
|
<ul class="right">
|
||||||
<li><a href="{{ url_for('account.index') }}">{{ _('Учётная запись') }}</a></li>
|
<li><a href="{{ url_for('account.index') }}">{{ _('Учётная запись') }}</a></li>
|
||||||
<li><a href="{{ url_for('bills.index') }}">{{ _('Счёт') }}<span id="account_bills"></span></a></li>
|
<li><a href="{{ url_for('bills.index') }}">{{ _('Баланс') }}<span id="account_bills"></span></a></li>
|
||||||
<li><a href="{{ url_for('account.logout') }}">{{ _('Выход') }}</a></li>
|
<li><a href="{{ url_for('account.logout') }}">{{ _('Выход') }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="left">
|
<ul class="left">
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<ul class="inline-list">
|
<ul class="inline-list">
|
||||||
<li><a href="{{ url_for('.index') }}">Счёт</a></li>
|
<li><a href="{{ url_for('.index') }}">Баланс</a></li>
|
||||||
<li><a href="{{ url_for('.payments') }}">Платежи</a></li>
|
<li><a href="{{ url_for('.payments') }}">Платежи</a></li>
|
||||||
<li><a href="{{ url_for('.charge') }}">Пополнить баланс</a></li>
|
<li><a href="{{ url_for('.charge') }}">Пополнить баланс</a></li>
|
||||||
</ul>
|
</ul>
|
|
@ -5,9 +5,7 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h2>Счёт / Пополнить баланс</h2>
|
<h2>Пополнить баланс</h2>
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% include "default/billing/_menu.html" %}
|
{% include "default/billing/_menu.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,7 +13,6 @@
|
||||||
<div class="large-12 column">
|
<div class="large-12 column">
|
||||||
<h5>Электронные платёжные системы</h5>
|
<h5>Электронные платёжные системы</h5>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if g.settings['PAY_ROBOKASSA_ENABLED'] == "1" %}
|
{% if g.settings['PAY_ROBOKASSA_ENABLED'] == "1" %}
|
||||||
<form action="{{ url_for('payments.robokassa', action='process') }}" method="post">
|
<form action="{{ url_for('payments.robokassa', action='process') }}" method="post">
|
||||||
<div class="large-3 columns">
|
<div class="large-3 columns">
|
||||||
|
|
|
@ -5,15 +5,20 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h2>Счёт</h2>
|
<h2>Баланс</h2>
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% include "default/billing/_menu.html" %}
|
{% include "default/billing/_menu.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-6 columns">
|
<div class="large-12 columns">
|
||||||
<p>Баланс: {{ user_balance }} рублей</p>
|
<p>Баланс: <b>{{ user_balance }} рублей</b>.</p>
|
||||||
|
</div>
|
||||||
|
<div class="large-12 columns">
|
||||||
|
<div style="background: green; color: #fff; padding:1em;">
|
||||||
|
<p>Мы предоставляем вам возможность работать при отрицательном балансе до −500 рублей.</p>
|
||||||
|
<p>При отсутствии оплаты в течении 15 дней виртуальный сервер автоматически отключается.
|
||||||
|
По истечению последующих 30 дней виртуальный сервер удаляется.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -5,15 +5,12 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h2>Учётная запись</h2>
|
<h2>История платежей</h2>
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% include "default/billing/_menu.html" %}
|
{% include "default/billing/_menu.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h4>История платежей</h4>
|
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -53,7 +50,8 @@
|
||||||
{{ record['status'] }}
|
{{ record['status'] }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>{{record['method']}}</td>
|
<td>{{record['method']}}</td>
|
||||||
|
<td>{% if record['paid'] %}{{record['paid']}}{% else %}−{% endif %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
<li><a href="{{ url_for('account.index') }}">Учётная запись</a></li>
|
<li><a href="{{ url_for('account.index') }}">Учётная запись</a></li>
|
||||||
{# <li><a href="{{ url_for('account.settings') }}">Настройки</a></li>#}
|
{# <li><a href="{{ url_for('account.settings') }}">Настройки</a></li>#}
|
||||||
<li><a href="{{ url_for('account.password_update') }}">Смена пароля</a></li>
|
<li><a href="{{ url_for('account.password_update') }}">Смена пароля</a></li>
|
||||||
<li><a href="{{ url_for('account.sshkey') }}">SSH ключ</a></li>
|
<li><a href="{{ url_for('account.sshkey') }}">SSH-ключ</a></li>
|
||||||
<li><a href="{{ url_for('account.api_index') }}">API</a></li>
|
<li><a href="{{ url_for('account.api_index') }}">API</a></li>
|
||||||
</ul>
|
</ul>
|
|
@ -5,17 +5,10 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h2>Учётная запись</h2>
|
<h2>API</h2>
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% include "default/id/_menu.html" %}
|
{% include "default/id/_menu.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
<div class="large-12 columns">
|
|
||||||
<h3>API</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
|
|
|
@ -5,16 +5,11 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<h2>Учётная запись</h2>
|
<h2>Смена пароля</h2>
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% include "default/id/_menu.html" %}
|
{% include "default/id/_menu.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
|
||||||
<h3>Смена пароля</h3>
|
|
||||||
</div>
|
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<form action="{{ url_for('account.password_update') }}" method="post">
|
<form action="{{ url_for('account.password_update') }}" method="post">
|
||||||
<label>Старый пароль</label>
|
<label>Старый пароль</label>
|
||||||
|
|
|
@ -3,31 +3,30 @@
|
||||||
{% block title %}SSH-ключ{% endblock %}
|
{% block title %}SSH-ключ{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns content">
|
||||||
<h2>Учётная запись</h2>
|
<div class="row">
|
||||||
|
<div class="large-12 columns">
|
||||||
|
<h2>SSH-ключ</h2>
|
||||||
|
{% include "default/id/_menu.html" %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="large-12 columns">
|
||||||
|
{% if sshkey.exists %}
|
||||||
|
<form action="{{ url_for('account.sshkey_delete') }}" method="post">
|
||||||
|
<input type="text" value="{{ sshkey.sshkey }}" disabled />
|
||||||
|
<input type="submit" value="Удалить ключ" class="button alert" />
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<form action="{{ url_for('account.sshkey_post') }}" method="post">
|
||||||
|
<label for="sshkey">SSH-ключ</label>
|
||||||
|
<input type="text" name="sshkey" value="" id="sshkey" class="form" />
|
||||||
|
<input type="submit" value="Добавить ключ" class="button button-success" />
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
</div>
|
||||||
<div class="large-12 columns">
|
|
||||||
<h3>SSH-ключ</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="large-12 columns">
|
|
||||||
{% if sshkey.exists %}
|
|
||||||
<form action="{{ url_for('account.sshkey_delete') }}" method="post">
|
|
||||||
<input type="text" value="{{ sshkey.sshkey }}" disabled />
|
|
||||||
<input type="submit" value="Удалить ключ" class="button alert" />
|
|
||||||
</form>
|
|
||||||
{% else %}
|
|
||||||
<form action="{{ url_for('account.sshkey') }}" method="post">
|
|
||||||
<label for="sshkey">SSH-ключ</label>
|
|
||||||
<input type="text" name="sshkey" value="" id="sshkey" class="form" />
|
|
||||||
<input type="submit" value="Добавить ключ" class="button button-success" />
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
<div class="title-bar-right">
|
<div class="title-bar-right">
|
||||||
{% if session['user_id'] %}
|
{% if session['user_id'] %}
|
||||||
<ul class="menu">
|
<ul class="menu">
|
||||||
<li><a href="{{ url_for('account.index') }}">{{ _('Учётная запись') }}</a></li>
|
<li><a href="{{ url_for('vms.index') }}">{{ _('Панель управления') }}</a></li>
|
||||||
<li><a href="{{ url_for('bills.index') }}">{{ _('Счёт') }}<span id="account_bills"></span></a></li>
|
<li><a href="{{ url_for('bills.index') }}">{{ _('Баланс') }}<span id="account_bills"></span></a></li>
|
||||||
<li><a href="{{ url_for('account.logout') }}">{{ _('Выход') }}</a></li>
|
<li><a href="{{ url_for('account.logout') }}">{{ _('Выход') }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -57,7 +57,8 @@
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
{# <div class="row">
|
||||||
|
|
||||||
<div class="large-4 columns text-center">
|
<div class="large-4 columns text-center">
|
||||||
<b>Поддержка</b>
|
<b>Поддержка</b>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -79,8 +80,15 @@
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
#}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns text-center">
|
<div class="large-6 columns text-center">
|
||||||
|
<ul>
|
||||||
|
<li>+7 499 702-02-36</li>
|
||||||
|
<li>support@gocloud.ru</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="large-6 columns text-center">
|
||||||
<p class="copyright">2009-2016 © GoCloud.ru</p>
|
<p class="copyright">2009-2016 © GoCloud.ru</p>
|
||||||
<script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
|
<script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
|
||||||
<script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>
|
<script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>
|
||||||
|
|
|
@ -13,48 +13,79 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<article class="row">
|
||||||
|
<div class="large-12 columns">
|
||||||
|
<p>Виртуальный приватный сервер, практически полностью позволяющий заменить основные возможности физического сервера.</p>
|
||||||
|
<p>На нем можно реализовать проекты любой сложности, например персональный блог, интернет-магазина, крупный корпоративный портал или требующий больших ресурсов проект.</p>
|
||||||
|
<p>VPS хостинг GoCloud отличают невысокие цены, высокая скорость работы, гибкость работы в виртуальной машине.</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
<div class="pricing">
|
<div class="pricing">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-3 medium-12 small-12 columns">
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
|
<ul class="pricing-table">
|
||||||
|
<li class="title">G0</li>
|
||||||
|
<li class="price">200 <small>руб./мес.</small></li>
|
||||||
|
<li class="bullet-item">Процессор <span>1</span></li>
|
||||||
|
<li class="bullet-item">Память <span>512Мб</span></li>
|
||||||
|
<li class="bullet-item">Диск <span>10Гб</span></li>
|
||||||
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
<ul class="pricing-table">
|
<ul class="pricing-table">
|
||||||
<li class="title">G1</li>
|
<li class="title">G1</li>
|
||||||
<li class="price">590 <small>руб./мес.</small></li>
|
<li class="price">590 <small>руб./мес.</small></li>
|
||||||
<li class="bullet-item">Процессор <span>1</span></li>
|
<li class="bullet-item">Процессор <span>1</span></li>
|
||||||
<li class="bullet-item">Память <span>1Гб</span></li>
|
<li class="bullet-item">Память <span>1Гб</span></li>
|
||||||
<li class="bullet-item">Диск <span>20Гб</span></li>
|
<li class="bullet-item">Диск <span>20Гб</span></li>
|
||||||
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="large-3 medium-12 small-12 columns">
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
<ul class="pricing-table">
|
<ul class="pricing-table">
|
||||||
<li class="title">G2</li>
|
<li class="title">G2</li>
|
||||||
<li class="price">1080 <small>руб./мес.</small></li>
|
<li class="price">1080 <small>руб./мес.</small></li>
|
||||||
<li class="bullet-item">Процессор <span>2</span></li>
|
<li class="bullet-item">Процессор <span>2</span></li>
|
||||||
<li class="bullet-item">Память <span>2Гб</span></li>
|
<li class="bullet-item">Память <span>2Гб</span></li>
|
||||||
<li class="bullet-item">Диск <span>30Гб</span></li>
|
<li class="bullet-item">Диск <span>30Гб</span></li>
|
||||||
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="large-3 medium-12 small-12 columns">
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
<ul class="pricing-table">
|
<ul class="pricing-table">
|
||||||
<li class="title">G4</li>
|
<li class="title">G4</li>
|
||||||
<li class="price">2050 <small>руб./мес.</small></li>
|
<li class="price">2050 <small>руб./мес.</small></li>
|
||||||
<li class="bullet-item">Процессор <span>2</span></li>
|
<li class="bullet-item">Процессор <span>2</span></li>
|
||||||
<li class="bullet-item">Память <span>4Гб</span></li>
|
<li class="bullet-item">Память <span>4Гб</span></li>
|
||||||
<li class="bullet-item">Диск <span>50Гб</span></li>
|
<li class="bullet-item">Диск <span>50Гб</span></li>
|
||||||
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="large-3 medium-12 small-12 columns">
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
<ul class="pricing-table">
|
<ul class="pricing-table">
|
||||||
<li class="title">G8</li>
|
<li class="title">G8</li>
|
||||||
<li class="price">3900 <small>руб./мес.</small></li>
|
<li class="price">3900 <small>руб./мес.</small></li>
|
||||||
<li class="bullet-item">Процессор <span>4</span></li>
|
<li class="bullet-item">Процессор <span>4</span></li>
|
||||||
<li class="bullet-item">Память <span>8Гб</span></li>
|
<li class="bullet-item">Память <span>8Гб</span></li>
|
||||||
<li class="bullet-item">Диск <span>80Гб</span></li>
|
<li class="bullet-item">Диск <span>80Гб</span></li>
|
||||||
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="large-4 medium-4 small-12 columns">
|
||||||
|
<ul class="pricing-table">
|
||||||
|
<li class="title">G16</li>
|
||||||
|
<li class="price">6800 <small>руб./мес.</small></li>
|
||||||
|
<li class="bullet-item">Процессор <span>8</span></li>
|
||||||
|
<li class="bullet-item">Память <span>16Гб</span></li>
|
||||||
|
<li class="bullet-item">Диск <span>160Гб</span></li>
|
||||||
|
<li class="cta-button"><a class="button alert" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% include 'gocloud2016/macros/testimonials.html' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -12,20 +12,30 @@
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th> </th>
|
<th>План</th>
|
||||||
<th>Процессор</th>
|
<th>Процессор</th>
|
||||||
<th>Память</th>
|
<th>Память</th>
|
||||||
<th>Диск</th>
|
<th>Диск</th>
|
||||||
<th>Цена</th>
|
<th>Цена</th>
|
||||||
|
<th> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>G0</td>
|
||||||
|
<td>1</td>
|
||||||
|
<td>0.5 Гб</td>
|
||||||
|
<td>10 Гб</td>
|
||||||
|
<td>200 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>G1</td>
|
<td>G1</td>
|
||||||
<td>1</td>
|
<td>1</td>
|
||||||
<td>1 Гб</td>
|
<td>1 Гб</td>
|
||||||
<td>20 Гб</td>
|
<td>20 Гб</td>
|
||||||
<td>590 руб./мес.</td>
|
<td>590 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>G2</td>
|
<td>G2</td>
|
||||||
|
@ -33,6 +43,7 @@
|
||||||
<td>2 Гб</td>
|
<td>2 Гб</td>
|
||||||
<td>30 Гб</td>
|
<td>30 Гб</td>
|
||||||
<td>1080 руб./мес.</td>
|
<td>1080 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>G4</td>
|
<td>G4</td>
|
||||||
|
@ -40,6 +51,7 @@
|
||||||
<td>4 Гб</td>
|
<td>4 Гб</td>
|
||||||
<td>50 Гб</td>
|
<td>50 Гб</td>
|
||||||
<td>2050 руб./мес.</td>
|
<td>2050 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>G8</td>
|
<td>G8</td>
|
||||||
|
@ -47,6 +59,15 @@
|
||||||
<td>8 Гб</td>
|
<td>8 Гб</td>
|
||||||
<td>80 Гб</td>
|
<td>80 Гб</td>
|
||||||
<td>3900 руб./мес.</td>
|
<td>3900 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>G16</td>
|
||||||
|
<td>8</td>
|
||||||
|
<td>16 Гб</td>
|
||||||
|
<td>160 Гб</td>
|
||||||
|
<td>6800 руб./мес.</td>
|
||||||
|
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -259,17 +259,16 @@ def password_reset_step2():
|
||||||
# controllers.Mail().send(request.form['email'], subject, message)
|
# controllers.Mail().send(request.form['email'], subject, message)
|
||||||
|
|
||||||
email = ControllerMessagesEmail()
|
email = ControllerMessagesEmail()
|
||||||
email.send(title=subject, to=request.form.GET('email'), lead=lead, message=message, callout=callout)
|
email.send(title=subject, to=request.form.get('email'), lead=lead, message=message, callout=callout)
|
||||||
|
|
||||||
# redirect to login page
|
# redirect to login page
|
||||||
return redirect(url_for('account.login'))
|
return redirect(url_for('account.login'))
|
||||||
# redirect to step 2
|
# redirect to step 2
|
||||||
g.errors['items'].append(u'Ошибочный код')
|
flash(u'Ошибочный код')
|
||||||
g.errors['total'] += 1
|
|
||||||
return redirect(url_for('account.password_reset_step2'))
|
return redirect(url_for('account.password_reset_step2'))
|
||||||
else:
|
else:
|
||||||
g.errors['items'].append(u'Произошла ошибка. Введите корректный адрес е.почты.')
|
flash(u'Произошла ошибка. Введите корректный адрес е.почты.')
|
||||||
g.errors['total'] += 1
|
return redirect(url_for('account.password_reset_step2'))
|
||||||
return render_template('default/id/password_reset_step2.html')
|
return render_template('default/id/password_reset_step2.html')
|
||||||
|
|
||||||
|
|
||||||
|
@ -310,31 +309,33 @@ def password_update():
|
||||||
return render_template('default/id/password_update.html')
|
return render_template('default/id/password_update.html')
|
||||||
|
|
||||||
|
|
||||||
@viewAccount.route('/sshkey', methods=['GET', 'POST'])
|
@viewAccount.route('/sshkey', methods=['GET'])
|
||||||
@requires_login
|
@requires_login
|
||||||
def sshkey():
|
def sshkey():
|
||||||
controllersshkey = ControllerSSHKey(session['user_id'])
|
controllersshkey = ControllerSSHKey(session['user_id'])
|
||||||
|
|
||||||
if request.method == "POST":
|
sshkey = {"exists": controllersshkey.check(), "sshkey": controllersshkey.get()}
|
||||||
try:
|
|
||||||
ssh = SSHKey(request.form['sshkey'])
|
|
||||||
except Exception as e:
|
|
||||||
g.errors['items'].append(u"Не корректный ssh-ключ.")
|
|
||||||
g.errors['total'] += 1
|
|
||||||
else:
|
|
||||||
print(ssh.bits)
|
|
||||||
print(ssh.hash())
|
|
||||||
|
|
||||||
controllersshkey.set(request.form['sshkey'])
|
|
||||||
|
|
||||||
sshkey = {
|
|
||||||
"exists": controllersshkey.check(),
|
|
||||||
"sshkey": controllersshkey.get()
|
|
||||||
}
|
|
||||||
|
|
||||||
return render_template('default/id/sshkey.html', sshkey=sshkey)
|
return render_template('default/id/sshkey.html', sshkey=sshkey)
|
||||||
|
|
||||||
|
|
||||||
|
@viewAccount.route('/sshkey', methods=['POST'])
|
||||||
|
@requires_login
|
||||||
|
def sshkey_post():
|
||||||
|
controllersshkey = ControllerSSHKey(session['user_id'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
ssh = SSHKey(request.form['sshkey'])
|
||||||
|
except Exception as e:
|
||||||
|
flash(u"Не корректный ssh-ключ.")
|
||||||
|
else:
|
||||||
|
print(ssh.bits)
|
||||||
|
print(ssh.hash())
|
||||||
|
|
||||||
|
controllersshkey.set(request.form['sshkey'])
|
||||||
|
return redirect(url_for('account.sshkey'))
|
||||||
|
|
||||||
|
|
||||||
@viewAccount.route('/sshkey_delete', methods=['POST'])
|
@viewAccount.route('/sshkey_delete', methods=['POST'])
|
||||||
@requires_login
|
@requires_login
|
||||||
def sshkey_delete():
|
def sshkey_delete():
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -4,7 +4,7 @@ from setuptools import setup
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='SWSCloudCore',
|
name='SWSCloudCore',
|
||||||
version='2.7.3',
|
version='2.7.4',
|
||||||
author='Vyacheslav Anzhiganov',
|
author='Vyacheslav Anzhiganov',
|
||||||
author_email='hello@anzhiganov.com',
|
author_email='hello@anzhiganov.com',
|
||||||
packages=[
|
packages=[
|
||||||
|
@ -150,6 +150,7 @@ setup(
|
||||||
'Flask-Markdown==0.3',
|
'Flask-Markdown==0.3',
|
||||||
'Flask-Babel==0.9',
|
'Flask-Babel==0.9',
|
||||||
'flask-peewee==0.6.0',
|
'flask-peewee==0.6.0',
|
||||||
|
'flask-multistatic',
|
||||||
'Jinja2==2.8',
|
'Jinja2==2.8',
|
||||||
'peewee==2.8',
|
'peewee==2.8',
|
||||||
'validators==0.10',
|
'validators==0.10',
|
||||||
|
|
Loading…
Add table
Reference in a new issue