diff --git a/requirements.txt b/requirements.txt index f9d4a7b..6b1d27a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ validators jsonschema Flask-JWT Flask-OpenID +requests diff --git a/wotstats/init.py b/wotstats/init.py index a380b05..533b2e3 100644 --- a/wotstats/init.py +++ b/wotstats/init.py @@ -2,7 +2,8 @@ from flask import Flask, render_template, g, session from wotstats.database import db, migrate from wotstats.openid import oid -from wotstats.views import pages_home +from wotstats.views.home import pages_home +from wotstats.views.account import pages_account def init_app(): app = Flask(__name__) @@ -21,6 +22,7 @@ def init_app(): # jwt = JWT(app, authenticate, identity) app.register_blueprint(pages_home) + app.register_blueprint(pages_account) @app.before_request def lookup_current_user(): diff --git a/wotstats/lib/__init__.py b/wotstats/lib/__init__.py new file mode 100644 index 0000000..9b1fef0 --- /dev/null +++ b/wotstats/lib/__init__.py @@ -0,0 +1,11 @@ +import re + + +def parse_wargaming_openid_url(url): + """ + >>> parse_wargaming_openid_url('https://ru.wargaming.net/id/69552613-CrazyPants1999/') + ('69552613', 'CrazyPants1999') + + """ + pattern = '^https?.*id\/([0-9]+)-(\w+)\/$' + return re.findall(pattern, url)[0] diff --git a/wotstats/templates/layouts/main.html b/wotstats/templates/layouts/main.html index fff57a5..31086a3 100644 --- a/wotstats/templates/layouts/main.html +++ b/wotstats/templates/layouts/main.html @@ -4,6 +4,21 @@

wotstats

+ {% if session['openid'] %} + + {% else %} + + {% endif %} {% block content %}{% endblock %} diff --git a/wotstats/templates/pages/account/index.html b/wotstats/templates/pages/account/index.html new file mode 100644 index 0000000..fe8cf26 --- /dev/null +++ b/wotstats/templates/pages/account/index.html @@ -0,0 +1,5 @@ +{% extends 'layouts/main.html' %} + +{% block content %} +{{account_statistics}} +{% endblock %} diff --git a/wotstats/templates/pages/account/statistics.html b/wotstats/templates/pages/account/statistics.html new file mode 100644 index 0000000..49cd9a3 --- /dev/null +++ b/wotstats/templates/pages/account/statistics.html @@ -0,0 +1,5 @@ +{% extends 'layouts/main.html' %} + +{% block content %} + +{% endblock %} diff --git a/wotstats/templates/pages/auth_step1.html b/wotstats/templates/pages/auth_step1.html index 08bdc0e..49cd9a3 100644 --- a/wotstats/templates/pages/auth_step1.html +++ b/wotstats/templates/pages/auth_step1.html @@ -1,7 +1,5 @@ {% extends 'layouts/main.html' %} {% block content %} - + {% endblock %} diff --git a/wotstats/templates/pages/index.html b/wotstats/templates/pages/index.html index e20837b..49cd9a3 100644 --- a/wotstats/templates/pages/index.html +++ b/wotstats/templates/pages/index.html @@ -1,19 +1,5 @@ {% extends 'layouts/main.html' %} {% block content %} - {% if session['openid'] %} - - {% else %} - - {% endif %} + {% endblock %} diff --git a/wotstats/views/__init__.py b/wotstats/views/__init__.py index 6191bfe..e69de29 100644 --- a/wotstats/views/__init__.py +++ b/wotstats/views/__init__.py @@ -1,104 +0,0 @@ -import re -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 User - -pages_home = Blueprint('pages_home', __name__, template_folder='templates') - -# def show(page): -# try: -# return render_template('pages/%s.html' % page) -# except TemplateNotFound: -# abort(404) - -def parse_wargaming_openid_url(url): - """ - >>> parse_wargaming_openid_url('https://ru.wargaming.net/id/69552613-CrazyPants1999/') - ('69552613', 'CrazyPants1999') - - """ - pattern = '^https?.*id\/([0-9]+)-(\w+)\/$' - return re.findall(pattern, url)[0] - - -@pages_home.route('/', defaults={'page': 'index'}) -@pages_home.route('/') -def index(page): - z = session['openid'] - 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(): - 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) - flash(u'You were signed out') - return redirect(oid.get_next_url()) - -@oid.after_login -def create_or_login(resp): - session['openid'] = resp.identity_url - user = User.query.filter_by(openid=resp.identity_url).first() - if user is not None: - flash(u'Successfully signed in') - g.user = user - return redirect(oid.get_next_url()) - return redirect(url_for( - 'pages_home.create_profile', - next=oid.get_next_url(), - name=resp.fullname or resp.nickname, - email=resp.email)) diff --git a/wotstats/views/account.py b/wotstats/views/account.py new file mode 100644 index 0000000..e1c575e --- /dev/null +++ b/wotstats/views/account.py @@ -0,0 +1,35 @@ +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 User +from wotstats.lib import parse_wargaming_openid_url + +pages_account = Blueprint('pages_account', __name__, url_prefix='/account', template_folder='templates') + +def __get_player_personal_data(): + user_id = parse_wargaming_openid_url(session['openid'])[0] + # current_app.config['WG_ID'] + __ = requests.get( + 'https://api.worldoftanks.ru/wot/account/info/?application_id={}&account_id={}'.format( + current_app.config['WG_ID'], user_id + ) + ).json() + return __.get('data', {}).get(user_id) + + +@pages_account.route('/') +def index(): + account_statistics = __get_player_personal_data() + return render_template('pages/account/index.html', account_statistics=account_statistics) + + +@pages_account.route('/statistics.html') +def statistics(): + return render_template( + 'pages/account/statistics.html') diff --git a/wotstats/views/home.py b/wotstats/views/home.py new file mode 100644 index 0000000..5564dee --- /dev/null +++ b/wotstats/views/home.py @@ -0,0 +1,104 @@ +import re +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 User + +pages_home = Blueprint('pages_home', __name__, template_folder='templates') + +# def show(page): +# try: +# return render_template('pages/%s.html' % page) +# except TemplateNotFound: +# abort(404) + +def parse_wargaming_openid_url(url): + """ + >>> parse_wargaming_openid_url('https://ru.wargaming.net/id/69552613-CrazyPants1999/') + ('69552613', 'CrazyPants1999') + + """ + pattern = '^https?.*id\/([0-9]+)-(\w+)\/$' + return re.findall(pattern, url)[0] + + +@pages_home.route('/', defaults={'page': 'index'}) +@pages_home.route('/') +def index(page): + z = session['openid'] + 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(): + 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) + flash(u'You were signed out') + return redirect(oid.get_next_url()) + +@oid.after_login +def create_or_login(resp): + session['openid'] = resp.identity_url + user = User.query.filter_by(openid=resp.identity_url).first() + if user is not None: + flash(u'Successfully signed in') + g.user = user + return redirect(oid.get_next_url()) + return redirect(url_for( + 'pages_home.create_profile', + next=oid.get_next_url(), + name=resp.fullname or resp.nickname, + email=resp.email))