hot fixes

This commit is contained in:
Vyacheslav Anzhiganov 2016-10-20 04:30:25 +03:00
parent 0e77cb60cc
commit 0a95073b50
19 changed files with 208 additions and 138 deletions

View file

@ -1,45 +1,29 @@
# coding: utf-8
from flask import Blueprint, flash
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 flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
from SWSCloudCore.controllers.administrators import ControllerAdministrators
from SWSCloudCore.controllers.billing import ControllerBilling
from SWSCloudCore.controllers.users.manage import ControllerManageUsers
from SWSCloudCore.controllers.users.manage import ControllerManageUsersBalance
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.route('/')
@requires_login
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(
'administrator/users/index.html',
users=ControllerManageUsers().items_get()
)
users=ControllerManageUsers().items_get())
@view_administrator_users.route('/details/<uuid:user_id>.html')
@requires_login
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
if not ControllerManageUsers().exists_by_id(user_id):
return redirect(url_for('administrator_users.users'))
@ -50,19 +34,12 @@ def user_details(user_id):
'administrator/users/details.html',
user_account=ControllerManageUsers().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'])
@requires_login
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')
__amount = request.form.get('amount')

View file

@ -1,8 +1,10 @@
# coding: utf-8
import os
from flask import Flask, g, render_template
from flask_babel import Babel
from flaskext.markdown import Markdown
from flask_multistatic import MultiStaticFlask
from SWSCloudAdministrator.Administrator import viewAdministrator
from SWSCloudCore import models
@ -18,10 +20,35 @@ from SWSCloudWeb.views.payments import viewPayments
from SWSCloudWeb.views.support import viewSupport
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['DEBUG'] = config.getboolean('Application', 'DEBUG')
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)
babel = Babel(app)

File diff suppressed because one or more lines are too long

View file

@ -7,6 +7,7 @@ body {
header {
background: #333 none repeat scroll 0% 0%;
}
#banner {
overflow: hidden;
padding: 4em 0 5em;
@ -39,14 +40,6 @@ text-align: center;
margin-bottom: 50px;
}
footer {
border-top: 1px solid #999;
}
footer .row {
margin-top: 25px;
margin-bottom: 25px;
}
.price {
text-align: right;
}
@ -98,3 +91,21 @@ ul#features-list li {
#account_bills {
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;
}

View file

@ -1,7 +1,6 @@
<footer>
<div class="row">
<div class="large-6 medium-6 columns">
<b>{{ _('Поддержка') }}</b>
<div class="large-12 columns">
<ul>
{% if g.settings.get('SUPPORT_TEL', None) %}
<li>{{g.system_settings.get('SUPPORT_TEL')}}</li>
@ -9,12 +8,10 @@
{% if g.settings.get('SUPPORT_EMAIL', None) %}
<li>{{g.system_settings.get('SUPPORT_EMAIL')}}</li>
{% endif %}
<li>2009&minus;2016 &copy; GoCloud.ru</li>
<li><a href="{{ url_for('support.index') }}">{{ _('Форма обратной связи') }}</a></li>
</ul>
</div>
<div class="large-6 medium-6 columns">
<p>2009&minus;2016 &copy; GoCloud.ru</p>
</div>
</div>
</footer>
{% if g.settings['footer_code'] %}

View file

@ -13,7 +13,7 @@
{% if session['user_id'] %}
<ul class="right">
<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>
</ul>
<ul class="left">

View file

@ -1,5 +1,5 @@
<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('.charge') }}">Пополнить баланс</a></li>
</ul>

View file

@ -5,9 +5,7 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Счёт / Пополнить баланс</h2>
</div>
<div class="large-12 columns">
<h2>Пополнить баланс</h2>
{% include "default/billing/_menu.html" %}
</div>
</div>
@ -15,7 +13,6 @@
<div class="large-12 column">
<h5>Электронные платёжные системы</h5>
</div>
{% if g.settings['PAY_ROBOKASSA_ENABLED'] == "1" %}
<form action="{{ url_for('payments.robokassa', action='process') }}" method="post">
<div class="large-3 columns">

View file

@ -5,15 +5,20 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Счёт</h2>
</div>
<div class="large-12 columns">
<h2>Баланс</h2>
{% include "default/billing/_menu.html" %}
</div>
</div>
<div class="row">
<div class="large-6 columns">
<p>Баланс: {{ user_balance }} рублей</p>
<div class="large-12 columns">
<p>Баланс: <b>{{ user_balance }} рублей</b>.</p>
</div>
<div class="large-12 columns">
<div style="background: green; color: #fff; padding:1em;">
<p>Мы предоставляем вам возможность работать при отрицательном балансе до &minus;500 рублей.</p>
<p>При отсутствии оплаты в течении 15 дней виртуальный сервер автоматически отключается.
По истечению последующих 30 дней виртуальный сервер удаляется.</p>
</div>
</div>
</div>
{% endblock %}

View file

@ -5,15 +5,12 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Учётная запись</h2>
</div>
<div class="large-12 columns">
<h2>История платежей</h2>
{% include "default/billing/_menu.html" %}
</div>
</div>
<div class="row">
<div class="large-12 columns">
<h4>История платежей</h4>
<table width="100%">
<thead>
<tr>
@ -54,6 +51,7 @@
{% endif %}
</td>
<td>{{record['method']}}</td>
<td>{% if record['paid'] %}{{record['paid']}}{% else %}&minus;{% endif %}</td>
</tr>
{% endfor %}
{% endif %}

View file

@ -2,6 +2,6 @@
<li><a href="{{ url_for('account.index') }}">Учётная запись</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.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>
</ul>

View file

@ -5,17 +5,10 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Учётная запись</h2>
</div>
<div class="large-12 columns">
<h2>API</h2>
{% include "default/id/_menu.html" %}
</div>
</div>
<div class="row">
<div class="large-12 columns">
<h3>API</h3>
</div>
</div>
<div class="row">
<div class="large-12 columns">

View file

@ -5,16 +5,11 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Учётная запись</h2>
</div>
<div class="large-12 columns">
<h2>Смена пароля</h2>
{% include "default/id/_menu.html" %}
</div>
</div>
<div class="row">
<div class="large-12 columns">
<h3>Смена пароля</h3>
</div>
<div class="large-12 columns">
<form action="{{ url_for('account.password_update') }}" method="post">
<label>Старый пароль</label>

View file

@ -4,14 +4,11 @@
{% block content %}
<div class="row">
<div class="large-12 columns">
<h2>Учётная запись</h2>
</div>
</div>
</div>
<div class="large-12 columns content">
<div class="row">
<div class="large-12 columns">
<h3>SSH-ключ</h3>
<h2>SSH-ключ</h2>
{% include "default/id/_menu.html" %}
</div>
</div>
<div class="row">
@ -22,7 +19,7 @@
<input type="submit" value="Удалить ключ" class="button alert" />
</form>
{% else %}
<form action="{{ url_for('account.sshkey') }}" method="post">
<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" />
@ -30,4 +27,6 @@
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -26,8 +26,8 @@
<div class="title-bar-right">
{% if session['user_id'] %}
<ul class="menu">
<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('vms.index') }}">{{ _('Панель управления') }}</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>
</ul>
{% else %}
@ -57,7 +57,8 @@
<footer>
<hr>
<div class="row">
{# <div class="row">
<div class="large-4 columns text-center">
<b>Поддержка</b>
<ul>
@ -79,8 +80,15 @@
</ul>
</div>
</div>
#}
<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>
<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>

View file

@ -13,48 +13,79 @@
</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="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">
<li class="title">G1</li>
<li class="price">590 <small>руб./мес.</small></li>
<li class="bullet-item">Процессор <span>1</span></li>
<li class="bullet-item">Память <span>б</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>
</div>
<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">G2</li>
<li class="price">1080 <small>руб./мес.</small></li>
<li class="bullet-item">Процессор <span>2</span></li>
<li class="bullet-item">Память <span>б</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>
</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">
<li class="title">G4</li>
<li class="price">2050 <small>руб./мес.</small></li>
<li class="bullet-item">Процессор <span>2</span></li>
<li class="bullet-item">Память <span>б</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>
</div>
<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">G8</li>
<li class="price">3900 <small>руб./мес.</small></li>
<li class="bullet-item">Процессор <span>4</span></li>
<li class="bullet-item">Память <span>б</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>
</div>
</div>
</div>
{% include 'gocloud2016/macros/testimonials.html' %}
{% endblock %}

View file

@ -12,20 +12,30 @@
<table>
<thead>
<tr>
<th>&nbsp;</th>
<th>План</th>
<th>Процессор</th>
<th>Память</th>
<th>Диск</th>
<th>Цена</th>
<th>&nbsp;</th>
</tr>
</thead>
<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>
<td>G1</td>
<td>1</td>
<td>1 Гб</td>
<td>20 Гб</td>
<td>590 руб./мес.</td>
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
</tr>
<tr>
<td>G2</td>
@ -33,6 +43,7 @@
<td>2 Гб</td>
<td>30 Гб</td>
<td>1080 руб./мес.</td>
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
</tr>
<tr>
<td>G4</td>
@ -40,6 +51,7 @@
<td>4 Гб</td>
<td>50 Гб</td>
<td>2050 руб./мес.</td>
<td><a href="{{ url_for('vms.create') }}" class="button alert ordernow">Заказать</a></td>
</tr>
<tr>
<td>G8</td>
@ -47,6 +59,15 @@
<td>8 Гб</td>
<td>80 Гб</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>
</tbody>
</table>

View file

@ -259,17 +259,16 @@ def password_reset_step2():
# controllers.Mail().send(request.form['email'], subject, message)
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
return redirect(url_for('account.login'))
# redirect to step 2
g.errors['items'].append(u'Ошибочный код')
g.errors['total'] += 1
flash(u'Ошибочный код')
return redirect(url_for('account.password_reset_step2'))
else:
g.errors['items'].append(u'Произошла ошибка. Введите корректный адрес е.почты.')
g.errors['total'] += 1
flash(u'Произошла ошибка. Введите корректный адрес е.почты.')
return redirect(url_for('account.password_reset_step2'))
return render_template('default/id/password_reset_step2.html')
@ -310,29 +309,31 @@ def password_update():
return render_template('default/id/password_update.html')
@viewAccount.route('/sshkey', methods=['GET', 'POST'])
@viewAccount.route('/sshkey', methods=['GET'])
@requires_login
def sshkey():
controllersshkey = ControllerSSHKey(session['user_id'])
if request.method == "POST":
sshkey = {"exists": controllersshkey.check(), "sshkey": controllersshkey.get()}
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:
g.errors['items'].append(u"Не корректный ssh-ключ.")
g.errors['total'] += 1
flash(u"Не корректный ssh-ключ.")
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 redirect(url_for('account.sshkey'))
@viewAccount.route('/sshkey_delete', methods=['POST'])

View file

@ -4,7 +4,7 @@ from setuptools import setup
setup(
name='SWSCloudCore',
version='2.7.3',
version='2.7.4',
author='Vyacheslav Anzhiganov',
author_email='hello@anzhiganov.com',
packages=[
@ -150,6 +150,7 @@ setup(
'Flask-Markdown==0.3',
'Flask-Babel==0.9',
'flask-peewee==0.6.0',
'flask-multistatic',
'Jinja2==2.8',
'peewee==2.8',
'validators==0.10',