This repository has been archived on 2025-01-27. You can view files and clone it, but cannot push or open issues or pull requests.
wot_stats_server/wotstats/views/home.py
2017-09-03 18:46:19 +03:00

152 lines
4.6 KiB
Python

import re
import requests
from flask import (
g, Blueprint, render_template, abort, current_app, redirect,
redirect, request, url_for, session, flash
)
from jinja2 import TemplateNotFound
from wotstats.openid import oid
from wotstats.database import db
from wotstats.models import *
pages_home = Blueprint('pages_home', __name__, template_folder='templates')
# def show(page):
# try:
# return render_template('pages/%s.html' % page)
# except TemplateNotFound:
# abort(404)
@pages_home.route('/', defaults={'page': 'index'})
@pages_home.route('/<page>')
def index(page):
print session
return render_template('pages/index.html')
# @pages_home.route('/auth.html')
# def auth_step1():
# return render_template('pages/auth_step1.html')
@pages_home.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
print request.form
print request.args
if g.user is not None:
return redirect(oid.get_next_url())
if request.method == 'POST':
openid = request.form.get('openid')
if openid:
return oid.try_login(
openid,
ask_for=['email', 'nickname'],
ask_for_optional=['fullname'])
return render_template(
'pages/login.html',
next=oid.get_next_url(),
error=oid.fetch_error())
@pages_home.route('/create-profile', methods=['GET', 'POST'])
def create_profile():
if g.user is not None or 'openid' not in session:
return redirect(url_for('pages_home.index'))
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
if not name:
flash(u'Error: you have to provide a name')
elif '@' not in email:
flash(u'Error: you have to enter a valid email address')
else:
flash(u'Profile successfully created')
u = User(email)
u.name = name
u.openid = session['openid']
u.password = ''
db.session.add(u)
db.session.commit()
return redirect(oid.get_next_url())
return render_template(
'pages/create_profile.html',
next=oid.get_next_url())
@pages_home.route('/logout')
def logout():
session.pop('openid', None)
session.pop('token', None)
session.pop('user', None)
# flash(u'You were signed out')
return redirect(oid.get_next_url())
@pages_home.route('/token')
def token():
print request.args
print request.form
if 'openid' not in session or 'user' in session:
return redirect(url_for('pages_home.index'))
# ImmutableMultiDict([('status', u'ok'), ('access_token', u'a4d0a13df7c733102fbf6cd650794c6d047e91aa'), ('nickname', u'CrazyPants1999'), ('account_id', u'69552613'), ('', u'1505047809')])
if request.args.get('status') == 'ok' and request.args.get('access_token'):
token = UserWotTokens.query.filter_by(user=session['user'])
access_token = request.args.get('access_token')
expires_at = request.args.get('expires_at')
if token.count() == 0:
t = UserWotTokens()
t.user = session['user']
t.access_token = access_token
t.expires_at = expires_at
db.session.add(t)
db.session.commit()
else:
token.access_token = access_token
token.expires_at = expires_at
db.session.commit()
session['token'] = {
'access_token': access_token,
'expires_at': expires_at
}
return redirect(oid.get_next_url())
# redirect_url = 'http://truesoft.org:5000/token'
response = requests.get('{}?application_id={}&nofollow=1&redirect_uri={}'.format(
current_app.config['WG_TOKEN_URL'],
current_app.config['WG_APPLICATION_ID'], current_app.config['WG_REDIRECT_URL'])).json()
if response.get('status') == 'ok':
return redirect(response.get('data', {}).get('location'))
return redirect(oid.get_next_url())
@oid.after_login
def create_or_login(resp):
session['openid'] = resp.identity_url
session['token'] = None
session['user'] = None
user = User.query.filter_by(openid=resp.identity_url).first()
if not user:
return redirect(url_for(
'pages_home.create_profile',
next=oid.get_next_url(),
name=resp.fullname or resp.nickname,
email=resp.email))
session['user'] = user.id
# flash(u'Successfully signed in')
g.user = user
if not session['token']:
return redirect(url_for('pages_home.token'))
return redirect(oid.get_next_url())