-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
executable file
·157 lines (135 loc) · 5.84 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/env python3
from flask import Flask, g, current_app, request, session, flash, redirect, url_for, abort, render_template, Response
from flask.ext.login import login_user, logout_user, login_required, current_user
from flask.ext.principal import Principal, Identity, AnonymousIdentity, identity_changed, identity_loaded, UserNeed, RoleNeed
from flask.ext.script import Manager, prompt, prompt_pass
from flask.ext.migrate import Migrate, MigrateCommand
from passlib.hash import pbkdf2_sha256
import config
from shared import db, login_manager
from utils import render_layout
from models.forms import LoginForm, NewUserForm
from models.database import User, Statement, Speaker, Topic, Event
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
login_manager.init_app(app)
login_manager.login_view = "login"
login_manager.login_message_category = "alert-error"
Principal(app)
from modules import admin, speech
app.register_blueprint(admin.admin, url_prefix="/admin")
app.register_blueprint(speech.speech, url_prefix="/speech")
@manager.command
def addadmin():
"""Add a new administrative user to the system"""
print("Adding new administrative user:")
admin_real_name = prompt("Real name")
admin_login = prompt("Username")
admin_pass = prompt_pass("Password")
if admin_real_name is not None and admin_login is not None and admin_pass is not None:
admin_hashed_pw = pbkdf2_sha256.encrypt(admin_pass, rounds=200000, salt_size=16)
u = User(admin_real_name, admin_login, admin_hashed_pw, ["admin", "user"])
db.session.add(u)
db.session.commit()
else:
print("The provided data was invalid.")
@manager.command
def adduser():
"""Add a new user to the system"""
print("Adding new user:")
admin_real_name = prompt("Real name")
admin_login = prompt("Username")
admin_pass = prompt_pass("Password")
if admin_real_name is not None and admin_login is not None and admin_pass is not None:
admin_hashed_pw = pbkdf2_sha256.encrypt(admin_pass, rounds=200000, salt_size=16)
u = User(admin_real_name, admin_login, admin_hashed_pw, ["user"])
db.session.add(u)
db.session.commit()
else:
print("The provided data was invalid.")
@app.route("/")
def index():
events = Event.query.all()
return render_layout("index.html", events=events)
@app.route("/update")
def update():
events = Event.query.all()
return render_layout("content_index.html", events=events)
@app.route("/update.js")
def update_js():
update_interval = config.UPDATE_INDEX_INTERVAL or 1
div = "rede-content-div"
target_url = url_for(".update")
return render_layout("update.js", update_interval=update_interval, div=div, target_url=target_url, prefix="index_")
@app.route("/update_time")
def update_time():
return render_layout("content_time.html")
@app.route("/update_time.js")
def update_time_js():
update_interval = config.UPDATE_TIME_INTERVAL or 10
div = "rede-time-div"
target_url = url_for("update_time")
return render_layout("update.js", update_interval=update_interval, div=div, target_url=target_url, prefix="time_")
@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
user = db.session.query(User).filter_by(username=form.username.data).first()
if (user is not None) and (pbkdf2_sha256.verify(form.password.data, user.password)):
login_user(user, remember=form.remember_me.data)
identity_changed.send(current_app._get_current_object(), identity=Identity(user.id))
flash("Welcome back, {}!".format(user.fullname), "alert-success")
return redirect(request.args.get("next") or url_for(".index"))
else:
flash("Invalid username or wrong password", "alert-error")
return render_layout("login.html", form=form)
@app.route("/logout", methods=["GET", "POST"])
@login_required
def logout():
logout_user()
for key in ("identity.name", "identiy.auth_type"):
session.pop(key, None)
identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
flash("You have been logged out.", "alert-success")
return redirect(url_for(".index"))
"""
@app.route("/register", methods=["GET", "POST"])
def register():
form = NewUserForm()
if form.validate_on_submit():
length = len(db.session.query(User).filter_by(username=form.username.data).all())
if length > 0:
flash("There already is a user with that name.")
return render_layout("register.html", form=form)
password = pbkdf2_sha256.encrypt(form.password.data, rounds=200000, salt_size=16)
user = User(fullname, username, password, [])
db.session.add(user)
db.session.commit()
flash("Your account has been created, you may now log in with it.")
return redirect(url_for(".login"))
return render_layout("register.html", form=form)
"""
@app.route("/icon-font.css")
def icon_font():
return Response(render_template("icon-font.css"), mimetype="text/css")
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
# Set the identity user object
identity.user = current_user
# Add the UserNeed to the identity
if hasattr(current_user, "id"):
identity.provides.add(UserNeed(current_user.id))
# Assuming the User Model has a list of roles, update the identity
# with the roles that the user provides
if hasattr(current_user, "roles") and current_user.roles is not None:
for role in current_user.roles:
identity.provides.add(RoleNeed(role))
@login_manager.user_loader
def load_user(user_id):
return db.session.query(User).filter_by(id=user_id).first()
if __name__ == "__main__":
manager.run()