Up Version with API

This commit is contained in:
Vyacheslav Anzhiganov 2016-06-14 08:05:05 +03:00
parent f0459e572c
commit 7673e1b84c
16 changed files with 172 additions and 105 deletions

View file

@ -7,17 +7,7 @@ from flaskext.markdown import Markdown
from SWSCloudCore import models from SWSCloudCore import models
from SWSCloudCore.config import config from SWSCloudCore.config import config
from SWSCloudCore.models import database from SWSCloudCore.models import database
from SWSCloudServerAPI.ServerAPI import viewServerAPI from SWSCloudAdministrator.Administrator import viewAdministrator
from SWSCloudWeb.views import viewHomepage
from SWSCloudWeb.views.account import viewAccount
from SWSCloudWeb.views.administrator import viewAdministrator
from SWSCloudWeb.views.containers import viewContainers
from SWSCloudWeb.views.documents import viewDocuments
from SWSCloudWeb.views.kb import viewKB
from SWSCloudWeb.views.payments import viewPayments
from SWSCloudWeb.views.support import viewSupport
from SWSCloudWeb.views.tasks import viewTasks
from SWSCloudWeb.views.vms import viewVMs
app = Flask(__name__, static_folder='static', static_url_path='') app = Flask(__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')
@ -26,24 +16,6 @@ app.config['SECRET_KEY'] = config.get("Application", "SECRET_KEY")
Markdown(app) Markdown(app)
babel = Babel(app) babel = Babel(app)
# /
app.register_blueprint(viewHomepage)
app.register_blueprint(viewSupport)
app.register_blueprint(viewKB)
app.register_blueprint(viewDocuments)
# /tasks
app.register_blueprint(viewTasks)
# /containers
app.register_blueprint(viewContainers)
app.register_blueprint(viewVMs)
# /id
app.register_blueprint(viewAccount)
# /payments
app.register_blueprint(viewPayments)
# /api
app.register_blueprint(viewServerAPI)
# /administrator
app.register_blueprint(viewAdministrator) app.register_blueprint(viewAdministrator)
@ -97,3 +69,7 @@ def after_request(response):
# TODO: code to email alert # TODO: code to email alert
# pass # pass
return response return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)

View file

@ -11,20 +11,22 @@
<tr> <tr>
<th>ID</th> <th>ID</th>
<th>Email</th> <th>Email</th>
<th>Balance</th>
<th>Status</th> <th>Status</th>
<th>Action</th> <th>Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% if users.total == 0 %} {% if users['total'] == 0 %}
<tr> <tr>
<td colspan="4">No one users.</td> <td colspan="5">No one users.</td>
</tr> </tr>
{% else %} {% else %}
{% for user in users['items'] %} {% for user in users['items'] %}
<tr> <tr>
<td>{{ user.id }}</td> <td>{{ user.id }}</td>
<td>{{ user.email }}</td> <td>{{ user.email }}</td>
<td>{{ user.usersbalance.balance }}</td>
<td> <td>
{% if user.status == 0 %} {% if user.status == 0 %}
<span class="label label-alert">Inactive</span> <span class="label label-alert">Inactive</span>

View file

@ -118,10 +118,15 @@ class ControllerUsersRecoveryCodes():
return True return True
def check(self, user_id, code): def check(self, user_id, code):
print user_id """
if models.UsersRecoveryCodes.select().\ Проверка существования кода
where(models.UsersRecoveryCodes.user == user_id, models.UsersRecoveryCodes.recovery_code == code).\ :param user_id:
count() == 0: :param code:
:return: bool
"""
if models.UsersRecoveryCodes.select().where(
models.UsersRecoveryCodes.user == user_id, models.UsersRecoveryCodes.recovery_code == code
).count() == 0:
return False return False
return True return True

View file

@ -23,13 +23,26 @@ class ControllerManageUsers:
формируем массив со списком пользователей формируем массив со списком пользователей
:return: :return:
""" """
from peewee import JOIN_LEFT_OUTER, JOIN_INNER, JOIN_FULL
jj = models.Users.select(
models.UsersBalance.balance.alias('balance'),
models.Users.id,
models.Users.email,
models.Users.created,
models.Users.status,
).join(
models.UsersBalance
)
for j in jj:
print j.usersbalance.balance
return { return {
'total': models.Users.select().count(), 'total': len(jj),
'items': models.Users.select() 'items': jj
} }
def item_get(self, user_id): def item_get(self, user_id):
return models.Users.select().where(models.Users.id == user_id)[0] return models.Users.select().where(models.Users.id == user_id).get()
class ControllerManageUsersDetails: class ControllerManageUsersDetails:

View file

@ -97,3 +97,7 @@ def after_request(response):
# TODO: code to email alert # TODO: code to email alert
# pass # pass
return response return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)

View file

@ -1,28 +1,19 @@
<footer> <footer>
<div class="row"> <div class="row">
<div class="large-4 columns"> <div class="large-6 columns">
<p>
GoCloud &copy; Все права защищены.
</p>
</div>
<div class="large-8 columns">
<ul class="inline-list"> <ul class="inline-list">
<!-- li><a href="{{ url_for('documents.view', document_name='politica_konfidencialnosti') }}">Политика конфиденциальности</a></li --> <li>2009&minus;2016 &copy; GoCloud.ru</li>
<!-- li><a href="{{ url_for('documents.view', document_name='pravila_ispolzovaniya') }}">Условия использования</a></li -->
<li><a href="{{ url_for('support.index') }}">Поддержка</a></li> <li><a href="{{ url_for('support.index') }}">Поддержка</a></li>
<!-- li><a href="{{ url_for('kb.index') }}">База знаний</a></li -->
</ul> </ul>
</div> </div>
</div> <div class="large-6 columns">
<div class="row"> <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
<div class="large-4 columns"> <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>
</div> <div class="ya-share2" data-services="vkontakte,facebook,gplus,twitter,blogger,linkedin" data-counter=""></div>
<div class="large-8 columns">
<p>Ваша личная информация под надежной защитой. Ваш браузер соединяется с сайтом по защищенному протоколу HTTPS.</p>
<p>Сайт использует SSL-шифрование для всех передаваемых данных.</p>
</div> </div>
</div> </div>
</footer> </footer>
{% if g.settings['footer_code'] %} {% if g.settings['footer_code'] %}
{{ g.settings['footer_code']|safe }} {{ g.settings['footer_code']|safe }}
{% endif %} {% endif %}

View file

@ -17,12 +17,12 @@
<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">
{% if g.settings.get('SERVICE_CONTAINERS_ENABLE', "0") == "1" %}
<li><a href="{{ url_for('containers.index') }}">Контейнеры</a></li>
{% endif %}
{% if g.settings.get('SERVICE_VMS_ENABLE', '0') == '1' %} {% if g.settings.get('SERVICE_VMS_ENABLE', '0') == '1' %}
<li><a href="{{ url_for('vms.index') }}">Виртуальные машины</a></li> <li><a href="{{ url_for('vms.index') }}">Виртуальные машины</a></li>
{% endif %} {% endif %}
{% if g.settings.get('SERVICE_CONTAINERS_ENABLE', "0") == "1" %}
<li><a href="{{ url_for('containers.index') }}">Контейнеры &beta;</a></li>
{% endif %}
</ul> </ul>
{% else %} {% else %}
<ul class="right"> <ul class="right">

View file

@ -5,17 +5,19 @@
<title>{% block title %}{% endblock %}</title> <title>{% block title %}{% endblock %}</title>
<meta name="description" content="{% block description %}{% endblock %}"> <meta name="description" content="{% block description %}{% endblock %}">
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="{{ url_for('static', filename='js/vendor/jquery.js') }}"></script>
<script src="{{ url_for('static', filename='js/vendor/modernizr.js') }}"></script>
<script src="{{ url_for('static', filename='js/foundation/foundation.min.js') }}"></script>
<link rel="stylesheet" href="{{ url_for('static', filename='css/foundation.min.css') }}" /> <link rel="stylesheet" href="{{ url_for('static', filename='css/foundation.min.css') }}" />
<link rel="stylesheet" href="{{ url_for('static', filename='css/gocloud.css') }}" /> <link rel="stylesheet" href="{{ url_for('static', filename='css/gocloud.css') }}" />
<meta name='shareinstock' content='' /> <script src="{{ url_for('static', filename='js/vendor/jquery.js') }}"></script>
<!-- script src="{{ url_for('static', filename='js/vendor/modernizr.js') }}"></script -->
<script src="{{ url_for('static', filename='js/foundation/foundation.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/foundation/foundation.orbit.js') }}"></script>
{% block head %}{% endblock %} {% block head %}{% endblock %}
</head> </head>
<body> <body>
{% include "default/_header.html" %} {% include "default/_header.html" %}
{% block content %}{% endblock %} {% block content %}{% endblock %}
{% include "default/_footer.html" %} {% include "default/_footer.html" %}
{% block footer %}{% endblock %}
</body> </body>
</html> </html>

View file

@ -8,43 +8,82 @@
<div class="row"> <div class="row">
<div class="large-12 columns"> <div class="large-12 columns">
<p id="slogan">Облачный хостинг для разработчиков</p> <p id="slogan">Облачный хостинг для разработчиков</p>
<p id="sub">Linux контейнер от 100 рублей в месяц</p> <p id="sub">Виртуальный сервер от 300 рублей в месяц</p>
<p> <p>
<a href="{{ url_for('account.registration') }}" class="button alert">Создать контейнер</a> <a href="{{ url_for('containers.create') }}" class="button alert">Создать контейнер &beta;</a>
<a href="{{ url_for('vms.create') }}" class="button success" style="box-shadow: 5px 5px #1a1a1a;">Создать виртуальный сервер</a>
</p> </p>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="large-8 columns"> <div class="large-12 columns">
<div class="row">
<div class="large-3 columns">
<ul class="pricing-table">
<li class="title">G1</li>
<li class="price">590&#8381;/мес.</li>
<li class="bullet-item">Процессор 1</li>
<li class="bullet-item">Память 1Гб</li>
<li class="bullet-item">Диск 20Гб</li>
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
</ul>
</div>
<div class="large-3 columns">
<ul class="pricing-table">
<li class="title">G2</li>
<li class="price">1080&#8381;/мес.</li>
<li class="bullet-item">Процессор 2</li>
<li class="bullet-item">Память 2Гб</li>
<li class="bullet-item">Диск 30Гб</li>
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
</ul>
</div>
<div class="large-3 columns">
<ul class="pricing-table">
<li class="title">G4</li>
<li class="price">2050&#8381;/мес.</li>
<li class="bullet-item">Процессор 2</li>
<li class="bullet-item">Память 4Гб</li>
<li class="bullet-item">Диск 50Гб</li>
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
</ul>
</div>
<div class="large-3 columns">
<ul class="pricing-table">
<li class="title">G8</li>
<li class="price">3900&#8381;/мес.</li>
<li class="bullet-item">Процессор 4</li>
<li class="bullet-item">Память 8Гб</li>
<li class="bullet-item">Диск 80Гб</li>
<li class="cta-button"><a class="button" href="{{ url_for('vms.create') }}">Создать сервер</a></li>
</ul>
</div>
</div>
</div>
<div class="large-12 columns">
<div class="row"> <div class="row">
<div class="large-12 columns"> <div class="large-12 columns">
<h2>Особенности</h2> <h2>Особенности</h2>
</div> </div>
<div class="large-12 columns"> <div class="large-12 columns">
<ul id="features-list"> <ul id="features-list">
<li>Авто масштабируемые LXC контейнеры с Ubuntu Linux</li> <li>Удобная панель управления позволяет легко и удобно администрировать арендованные виртуальные ресурсы.</li>
<li>Оплата только за используемые ресурсы</li> <li>Развернутая инфраструктура и резервированная телекоммуникационная сеть</li>
<li>Готовность к развёртыванию через минуту</li> <li>Готовность к развёртыванию через несколько минут</li>
<li>Публичный IP-адрес</li>
<li>Неограниченный трафик с брандмауэром</li>
<li>Несколько центров обработки данных по всему миру</li> <li>Несколько центров обработки данных по всему миру</li>
<li>Неограниченный трафик</li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
<div class="large-4 columns"> <div class="large-12 columns" style="text-align: center">
<!-- ul class="pricing-table"> <a class="twitter-timeline" href="https://twitter.com/gocloud_ru" data-widget-id="678726736645922816">Твитер @gocloud_ru</a>
<li class="title">Standard</li>
<li class="price">от 100руб./мес.</li>
<li class="bullet-item">б Диск</li>
<li class="bullet-item">512Мб Оперативной памяти</li>
<li class="bullet-item">Неограниченный трафик</li>
<li class="cta-button"><a class="button" href="{{ url_for('account.registration') }}">Создать контейнер</a></li>
</ul -->
<a class="twitter-timeline" href="https://twitter.com/gocloud_ru" data-widget-id="678726736645922816">Tweets by @gocloud_ru</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block footer %}
{% endblock %}

View file

@ -107,7 +107,7 @@ def billing():
cub = ControllerBilling() cub = ControllerBilling()
if not cub.exists(user_id): if not cub.exists(user_id):
cub.create(user=user_id, balance=0) cub.create(user_id, balance=0)
# TODO: move to function # TODO: move to function
user_details = models.Users.select().where( user_details = models.Users.select().where(
@ -131,9 +131,9 @@ def registration():
return redirect(url_for("containers.index")) return redirect(url_for("containers.index"))
if request.method == 'POST': if request.method == 'POST':
email = request.form['email'] email = request.form.get('email')
password = request.form['password'] password = request.form.get('password')
password2 = request.form['password2'] password2 = request.form.get('password2')
# Проверка введён ли проверочный пароль одинаково # Проверка введён ли проверочный пароль одинаково
if password != password2: if password != password2:
@ -294,7 +294,7 @@ 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['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'))

View file

@ -39,11 +39,11 @@ def create():
if not ControllerUsers().check_session(): if not ControllerUsers().check_session():
return redirect(url_for("account.logout")) return redirect(url_for("account.logout"))
# auth user # auth user
if not ControllerUsers().auth(session['email'], session['password']): if not ControllerUsers().auth(session.get('email'), session.get('password')):
return redirect(url_for("account.logout")) return redirect(url_for("account.logout"))
user_balance = ControllerBilling().get(session['user_id']) user_balance = ControllerBilling().get(session.get('user_id'))
user_ssh = ControllerSSHKey(session['user_id']) user_ssh = ControllerSSHKey(session.get('user_id'))
controller_plans = ControllerPlans() controller_plans = ControllerPlans()
if request.method == "POST": if request.method == "POST":

19
extra/uwsgi_admin.ini Normal file
View file

@ -0,0 +1,19 @@
[uwsgi]
virtualenv = /home/gocloud/env
;for http
;protocol = http
;socket = 127.0.0.1:8080
; for unix-socket
socket = /var/run/sws/gocloud_admin.sock
chmod-socket = 777
module = SWSCloudAdministrator:app
master = true
processes = 1
vacuum = true
die-on-term = true

View file

@ -6,7 +6,7 @@ virtualenv = /home/gocloud/env
;socket = 127.0.0.1:8080 ;socket = 127.0.0.1:8080
; for unix-socket ; for unix-socket
socket = /var/run/sws/gocloud.sock socket = /var/run/sws/gocloud_web.sock
chmod-socket = 777 chmod-socket = 777
module = SWSCloudWeb:app module = SWSCloudWeb:app

View file

@ -4,7 +4,7 @@ from setuptools import setup
setup( setup(
name='SWSCloudCore', name='SWSCloudCore',
version='2.5.0', version='2.5.1',
author='Vyacheslav Anzhiganov', author='Vyacheslav Anzhiganov',
author_email='hello@anzhiganov.com', author_email='hello@anzhiganov.com',
packages=[ packages=[
@ -61,6 +61,34 @@ setup(
'static/js/vendor/*.js', 'static/js/vendor/*.js',
# Templates # Templates
'templates/*.html', 'templates/*.html',
'templates/default/*.html',
'templates/default/containers/*.html',
'templates/default/documents/*.html',
'templates/default/homepage/*.html',
'templates/default/id/*.html',
'templates/default/kb/*.html',
'templates/default/payment/*.html',
'templates/default/payment/robokassa/*.html',
'templates/default/support/*.html',
'templates/default/tasks/*.html',
'templates/default/vms/*.html',
'templates/email/simple/*.html',
'templates/email/simple/*.css',
'templates/errors/*.html',
],
'SWSCloudAdministrator': [
# Static files
'static/css/*.css',
'static/images/*.png',
'static/images/cloudns/*.png',
'static/images/control/*.png',
'static/images/payment/*.png',
'static/images/social/*.png',
'static/images/promo/*.png',
'static/js/*.js',
'static/js/foundation/*.js',
'static/js/vendor/*.js',
#
'templates/administrator/*.html', 'templates/administrator/*.html',
'templates/administrator/containers/*.html', 'templates/administrator/containers/*.html',
'templates/administrator/datacenters/*.html', 'templates/administrator/datacenters/*.html',
@ -77,21 +105,9 @@ setup(
'templates/administrator/wiki/*.html', 'templates/administrator/wiki/*.html',
'templates/administrator/wiki/article/*.html', 'templates/administrator/wiki/article/*.html',
'templates/administrator/wiki/category/*.html', 'templates/administrator/wiki/category/*.html',
'templates/default/*.html', # Errors
'templates/default/containers/*.html',
'templates/default/documents/*.html',
'templates/default/homepage/*.html',
'templates/default/id/*.html',
'templates/default/kb/*.html',
'templates/default/payment/*.html',
'templates/default/payment/robokassa/*.html',
'templates/default/support/*.html',
'templates/default/tasks/*.html',
'templates/default/vms/*.html',
'templates/email/simple/*.html',
'templates/email/simple/*.css',
'templates/errors/*.html', 'templates/errors/*.html',
] ],
}, },
scripts=[ scripts=[
'cloud-db-init.py', 'cloud-db-init.py',