This commit is contained in:
Vyacheslav Anzhiganov 2015-12-02 02:34:17 +03:00
parent b93100de31
commit 37f115bed1
4 changed files with 131 additions and 208 deletions

View file

@ -0,0 +1,44 @@
from hashlib import md5
from flask import session
from app import models
class ControllerAdministrators:
def __init__(self):
pass
def auth(self, email, password, status=1):
"""
:param email:
:param password:
:return:
"""
result = models.Admins.select().\
where(
models.Admins.email == email,
models.Admins.password == md5(password).hexdigest(),
models.Admins.status == status
).count()
if result == 0:
return False
return True
def get_id_by_email(self, email):
return models.Admins.get(models.Admins.email == email).id
def check_session(self):
"""
Check session for contain a required keys
:return: bool
"""
required = ['admin_email', 'admin_password', 'admin_id']
success = True
for r in required:
if r in session and success:
continue
else:
success = False
return success

View file

@ -1,7 +1,6 @@
# coding: utf-8
from uuid import uuid4
from flask import Blueprint
from flask import request
from flask import session
@ -9,9 +8,10 @@ from flask import redirect
from flask import render_template
from flask import url_for
from flask import g
from app import models
from app.cloud import controllers
from app.cloud.controllers.common import special_match
from app.cloud.controllers.common import ControllerMessagesEmail
from app.cloud.controllers.administrators import ControllerAdministrators
viewAdministrator = Blueprint('administrator', __name__, url_prefix='/administrator')
@ -24,16 +24,16 @@ def login():
admin_password = request.form['password'].encode('utf-8')
# validation entered data
if not controllers.special_match(admin_email, r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$")\
if not special_match(admin_email, r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$")\
or len(admin_password) < 5:
g.errors['items'].append('Invalid registration data.')
g.errors['total'] += 1
# если ошибок нет, то продолжаем обработку
if g.errors['total'] == 0:
# try auth only active users (with status code 1)
if controllers.Admins().auth(admin_email, admin_password, 1):
if ControllerAdministrators().auth(admin_email, admin_password, 1):
# get user_id
user_id = controllers.Admins().get_id_by_email(admin_email)
user_id = ControllerAdministrators().get_id_by_email(admin_email)
# save user data to session
session['admin_id'] = str(user_id)
@ -59,71 +59,62 @@ def logout():
@viewAdministrator.route('/dashboard')
def dashboard():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
#
stats = {
'users': models.Users.select().count(),
# 'rules': models.Rules.select().count(),
# 'traffic': models.RulesTraffic.select().count(),
'payments': models.UsersBalanceTransactions.select().count(),
}
#
return render_template('administrator/dashboard.html', stats=stats)
@viewAdministrator.route('/users/')
def users():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
# формируем массив со списком пользователей
users_items = {
'total': models.Users.select().count(),
'items': models.Users.select()
}
#
return render_template('administrator/users/index.html', users=users_items)
@viewAdministrator.route('/rules/')
def rules():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
# формируем список правил
rules_items = {
'total': models.Rules.select().count(),
'items': models.Rules.select()
'total': models.Containers.select().count(),
'items': models.Containers.select()
}
return render_template('administrator/rules/index.html', rules=rules_items)
@viewAdministrator.route('/traffic')
def traffic():
# check session
if not controllers.Admins().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
return render_template('administrator/traffic.html')
@viewAdministrator.route('/payments')
def payments():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
payments_items = {
'total': models.UsersBalanceTransactions.select().count(),
@ -135,10 +126,10 @@ def payments():
@viewAdministrator.route('/datacenters')
def datacenters():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
dcs = {
'total': models.DataCenters.select().count(),
@ -150,10 +141,10 @@ def datacenters():
@viewAdministrator.route('/datacenters/create', methods=['GET', 'POST'])
def datacenters_create():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
if request.method == "POST":
@ -177,10 +168,10 @@ def datacenters_create():
@viewAdministrator.route('/datacenters/edit/<uuid:dc_id>', methods=['GET', 'POST'])
def datacenters_edit(dc_id):
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
# check exists datacenter
if models.DataCenters.select().where(models.DataCenters.id == dc_id).count() == 0:
@ -198,10 +189,10 @@ def datacenters_edit(dc_id):
@viewAdministrator.route('/servers/')
def servers_index():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
servers_items = {
@ -215,10 +206,10 @@ def servers_index():
@viewAdministrator.route('/servers/create', methods=['GET', 'POST'])
def servers_create():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
if request.method == "POST":
@ -230,7 +221,14 @@ def servers_create():
server_ip = request.form['ip']
server_status = request.form['status']
models.Servers.create(id=server_id, hostname=server_name, ip=server_ip, datacenter=server_dcid, secret=server_secret, status=server_status)
models.Servers.create(
id=server_id,
hostname=server_name,
ip=server_ip,
datacenter=server_dcid,
secret=server_secret,
status=server_status
)
dcs = {
'total': models.DataCenters.select().count(),
'items': models.DataCenters.select()
@ -242,10 +240,10 @@ def servers_create():
@viewAdministrator.route('/servers/edit/<uuid:server_id>', methods=['GET', 'POST'])
def servers_edit(server_id):
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
# check exists server
if models.Servers.select().where(models.Servers.id == server_id).count() == 0:
@ -259,10 +257,10 @@ def servers_edit(server_id):
@viewAdministrator.route('/settings/')
def settings_index():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
settings_list = {
@ -276,10 +274,10 @@ def settings_index():
@viewAdministrator.route('/settings/create', methods=['GET', 'POST'])
def settings_create():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
# auth user
if not controllers.Admins().auth(session['admin_email'], session['admin_password']):
if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']):
return redirect(url_for("administrator.logout"))
# Обрабатываем POST-запрос
if request.method == 'POST':
@ -299,26 +297,26 @@ def settings_create():
@viewAdministrator.route('/settings/delete', methods=['GET', 'POST'])
def settings_delete():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
#
if models.Settings.select().where(models.Settings.id == request.args['id']).count() == 0:
return redirect(url_for('administrator.settings_index'))
#
if request.method == 'POST':
delete_set = models.Settings.delete().where(models.Settings.id == request.form['id'])
delete_set.execute()
return redirect(url_for('administrator.settings_index'))
#
setting = models.Settings.select().where(models.Settings.id == request.args['id']).limit(1)[0]
#
return render_template('administrator/settings/delete.html', setting=setting)
@viewAdministrator.route('/settings/update', methods=['GET', 'POST'])
def settings_update():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
if models.Settings.select().where(models.Settings.id == request.args['id']).count() == 0:
@ -336,11 +334,9 @@ def settings_update():
@viewAdministrator.route('/settings/messages/email_test.html', methods=['GET', 'POST'])
def settings_messages_email_test():
# check session
if not controllers.Admins().check_session():
if not ControllerAdministrators().check_session():
return redirect(url_for("administrator.logout"))
from app.cloud.controllers import ControllerMessagesEmail
email = ControllerMessagesEmail()
email.send(title='test', to='vanzhiganov@ya.ru', lead='qwdqwd', message='qwdqwd', callout='qwdqwd')
# if request.method == 'POST':
@ -350,115 +346,3 @@ def settings_messages_email_test():
# get setting parameter by ID
setting = models.Settings.select().where(models.Settings.id == request.args['id']).limit(1)[0]
return render_template('administrator/settings/messages/email.html')
@viewAdministrator.route('/wiki/', methods=['GET', 'POST'])
def wiki_index():
# check session
if not controllers.Admins().check_session():
return redirect(url_for("administrator.logout"))
categories = {
"total": models.WikiCategories.select().count(),
"items": models.WikiCategories.select()
}
# get articles for currently category
articles = {
"total": models.WikiArticles.select().count(),
"items": models.WikiArticles.select(
models.WikiArticles.id, models.WikiArticles.title, models.WikiArticles.category
)
}
return render_template('administrator/wiki/index.html', categories=categories, articles=articles)
@viewAdministrator.route('/wiki/category/create', methods=['GET', 'POST'])
def wiki_category_create():
# check session
if not controllers.Admins().check_session():
return redirect(url_for("administrator.logout"))
if request.method == "POST":
category_id = uuid4()
title = request.form['title']
description = request.form['description']
status = request.form['status']
if models.WikiCategories.select().where(models.WikiCategories.title == title).count() == 0:
models.WikiCategories.create(id=category_id, title=title, description=description, status=status)
else:
g.errors['items'].append('Already exists')
g.errors['total'] += 1
return redirect(url_for('administrator.wiki_index'))
return render_template('administrator/wiki/category/create.html')
@viewAdministrator.route('/wiki/article/edit/<uuid:article_id>', methods=['GET', 'POST'])
def wiki_article_edit(article_id):
# check session
if not controllers.Admins().check_session():
return redirect(url_for("administrator.logout"))
# todo: check exists article
if request.method == "POST":
print request.form
print 'ok'
# todo: validate
title = request.form['title']
content = request.form['content']
status = request.form['status']
uq = models.WikiArticles.update(
title=title,
content=content,
status=status
).where(models.WikiArticles.id == article_id)
uq.execute()
# get article
article = models.WikiArticles.select().where(
models.WikiArticles.id == article_id
)[0]
return render_template(
'administrator/wiki/article/edit.html',
article=article
)
@viewAdministrator.route('/wiki/article/create', methods=['GET', 'POST'])
def wiki_article_create():
# check session
if not controllers.Admins().check_session():
return redirect(url_for("administrator.logout"))
if request.method == "POST":
# todo: check exists article
# todo: validate
article_id = uuid4()
title = request.form['title']
content = request.form['content']
status = request.form['status']
category_id = request.form['category_id']
models.WikiArticles.create(
id=article_id,
title=title,
content=content,
status=status,
category=category_id
)
return redirect(url_for('administrator.wiki_index'))
categories = {
"total": models.WikiCategories.select().count(),
"items": models.WikiCategories.select()
}
return render_template(
'administrator/wiki/article/create.html',
categories=categories
)

View file

@ -3,13 +3,9 @@
<title></title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap Core CSS -->
<link href="{{ url_for('static', filename='administrator/css/bootstrap.min.css') }}" rel="stylesheet">
<!-- Custom CSS -->
<link href="{{ url_for('static', filename='administrator/css/sb-admin.css') }}" rel="stylesheet">
<!-- Morris Charts CSS -->
<link href="{{ url_for('static', filename='administrator/css/plugins/morris.css') }}" rel="stylesheet">
<!-- Custom Fonts -->
<link href="{{ url_for('static', filename='administrator/font-awesome/css/font-awesome.min.css') }}" rel="stylesheet" type="text/css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
@ -28,7 +24,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{{ url_for('administrator.dashboard') }}">CDN Manager</a>
<a class="navbar-brand" href="{{ url_for('administrator.dashboard') }}">Cloud Manager</a>
</div>
<!-- Top Menu Items -->
<ul class="nav navbar-right top-nav">
@ -88,46 +84,24 @@
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-bell"></i> <b class="caret"></b></a>
<ul class="dropdown-menu alert-dropdown">
<li>
<a href="#">Alert Name <span class="label label-default">Alert Badge</span></a>
</li>
<li>
<a href="#">Alert Name <span class="label label-primary">Alert Badge</span></a>
</li>
<li>
<a href="#">Alert Name <span class="label label-success">Alert Badge</span></a>
</li>
<li>
<a href="#">Alert Name <span class="label label-info">Alert Badge</span></a>
</li>
<li>
<a href="#">Alert Name <span class="label label-warning">Alert Badge</span></a>
</li>
<li>
<a href="#">Alert Name <span class="label label-danger">Alert Badge</span></a>
</li>
<li><a href="#">Alert Name <span class="label label-default">Alert Badge</span></a></li>
<li><a href="#">Alert Name <span class="label label-primary">Alert Badge</span></a></li>
<li><a href="#">Alert Name <span class="label label-success">Alert Badge</span></a></li>
<li><a href="#">Alert Name <span class="label label-info">Alert Badge</span></a></li>
<li><a href="#">Alert Name <span class="label label-warning">Alert Badge</span></a></li>
<li><a href="#">Alert Name <span class="label label-danger">Alert Badge</span></a></li>
<li class="divider"></li>
<li>
<a href="#">View All</a>
</li>
<li><a href="#">View All</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-user"></i> John Smith <b class="caret"></b></a>
<ul class="dropdown-menu">
<li>
<a href="#"><i class="fa fa-fw fa-user"></i> Profile</a>
</li>
<li>
<a href="#"><i class="fa fa-fw fa-envelope"></i> Inbox</a>
</li>
<li>
<a href="#"><i class="fa fa-fw fa-gear"></i> Settings</a>
</li>
<li><a href="#"><i class="fa fa-fw fa-user"></i> Profile</a></li>
<li><a href="#"><i class="fa fa-fw fa-envelope"></i> Inbox</a></li>
<li><a href="#"><i class="fa fa-fw fa-gear"></i> Settings</a></li>
<li class="divider"></li>
<li>
<a href="#"><i class="fa fa-fw fa-power-off"></i> Log Out</a>
</li>
<li><a href="#"><i class="fa fa-fw fa-power-off"></i> Log Out</a></li>
</ul>
</li>
</ul>
@ -136,16 +110,16 @@
<ul class="nav navbar-nav side-nav">
<li><a href="{{ url_for('administrator.dashboard') }}"><i class="fa fa-fw fa-dashboard"></i> Dashboard</a></li>
<li><a href="{{ url_for('administrator.users') }}"><i class="fa fa-fw fa-table"></i> Users</a></li>
<li><a href="{{ url_for('administrator.rules') }}"><i class="fa fa-fw fa-table"></i> Rules</a></li>
<li><a href="{{ url_for('administrator.rules') }}"><i class="fa fa-fw fa-table"></i> Containers</a></li>
<li><a href="{{ url_for('administrator.payments') }}"><i class="fa fa-fw fa-table"></i> Payments</a></li>
<li><a href="{{ url_for('administrator.traffic') }}"><i class="fa fa-fw fa-table"></i> Traffic</a></li>
<li><a href="{{ url_for('administrator.servers_index') }}"><i class="fa fa-fw fa-table"></i> Servers</a>
<li><a href="#"><i class="fa fa-fw fa-table"></i> Traffic</a></li>
<li><a href="#"><i class="fa fa-fw fa-table"></i> Infrastructure</a>
<ul>
<li><a href="{{ url_for('administrator.datacenters') }}"><i class="fa fa-fw fa-table"></i> Datacenters</a></li>
<li><a href="{{ url_for('administrator.servers_index') }}"><i class="fa fa-fw fa-table"></i> Servers</a></li>
<li><a href="{{ url_for('administrator.servers_index') }}"><i class="fa fa-fw fa-table"></i> IPs</a></li>
</ul>
</li>
<li><a href="{{ url_for('administrator.wiki_index') }}"><i class="fa fa-fw fa-table"></i>Wiki</a></li>
<li><a href="{{ url_for('administrator.settings_index') }}"><i class="fa fa-fw fa-table"></i> Settings</a></li>
</ul>
</div>

21
uwsgi.origin.ini Normal file
View file

@ -0,0 +1,21 @@
[uwsgi]
;virtualenv
;virtualenv = /var/env/gocloud.ru/
virtualenv=/home/vanzhiganov/env/gocloud_server/
;for http
;protocol = http
;socket = 127.0.0.1:8080
; for unix-socket
socket = /tmp/procdnru_server.sock
chmod-socket = 770
module = app:app
master = true
processes = 5
vacuum = true
die-on-term = true