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
vanzhiganov 2688960be3 upd
2017-12-25 04:09:03 +03:00

183 lines
5.5 KiB
Python

# coding: utf-8
import re
import requests
import validator
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 *
from wotstats.lib import parse_wargaming_openid_url
# from wotstats.tasks import get_stats
pages_home = Blueprint('pages_home', __name__, template_folder='templates')
# TODO: add it after login
# get_stats.delay()
@pages_home.route('/', defaults={'page': 'index'})
@pages_home.route('/<page>')
def index(page):
return render_template('pages/index.html')
@pages_home.route('/login', methods=['GET'])
@oid.loginhandler
def login():
print request.args
if g.user is not None:
return redirect(oid.get_next_url())
return render_template(
'pages/login.html',
next=oid.get_next_url(),
error=oid.fetch_error())
@pages_home.route('/login', methods=['POST'])
@oid.loginhandler
def login_post():
if g.user is not None:
return redirect(oid.get_next_url())
openid = request.form.get('openid')
if not openid:
return redirect(url_for('home.login'))
return oid.try_login(
openid, ask_for=['email', 'nickname'], ask_for_optional=['fullname'])
@pages_home.route('/create-profile', methods=['GET'])
def create_profile():
if g.user is not None or 'openid' not in session:
return redirect(url_for('pages_home.index'))
return render_template('pages/create_profile.html', next=oid.get_next_url())
@pages_home.route('/create-profile', methods=['POST'])
def create_profile_post():
if g.user is not None or 'openid' not in session:
return redirect(url_for('pages_home.index'))
name = request.form['name']
email = request.form['email']
if not name:
flash(u'Error: you have to provide a name')
if not validator.email(email):
flash(u'Error: you have to enter a valid email address')
return redirect(url_for('home.create_profile'))
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())
@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
print session
# 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())
url = current_app.config['WG_TOKEN_URL']
payload = {
'application_id': current_app.config['WG_APPLICATION_ID'],
'redirect_uri': current_app.config['WG_REDIRECT_URL'],
'nofollow': 1,
}
response = requests.get(url, params=payload).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):
# resp
# 'aim', 'blog', 'country', 'date_of_birth', 'email', 'extensions', 'fullname', 'gender', 'icq', 'identity_url', 'image', 'jabber', 'language', 'month_of_birth', 'msn', 'nickname', 'phone', 'postcode', 'skype', 'timezone', 'website', 'yahoo', 'year_of_birth'
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))
wot_account_id, wot_account_nickname = parse_wargaming_openid_url(resp.identity_url)
user_wot_account = WotAccounts.query.filter_by(account_id=wot_account_id).first()
if not user_wot_account:
x = WotAccounts(account_id=wot_account_id, nickname=wot_account_nickname)
x.user = user.id
db.session.add(x)
db.session.commit()
else:
if user_wot_account.user != user.id:
user_wot_account.user = user.id
db.session.commit()
session['user'] = user.id
# flash(u'Successfully signed in')
g.user = user
print('session: {}'.format(session))
if session['token'] is None:
print('not token')
return redirect(url_for('pages_home.token'))
return redirect(oid.get_next_url())