From b263de5ee6a7acd9a23f85c654b6fc265048721f Mon Sep 17 00:00:00 2001 From: bongi23 Date: Tue, 27 Nov 2018 17:17:46 +0100 Subject: [PATCH] added user_id column in Credential, modified create_user and adapted tests --- flaskapp/app.py | 25 ++++++++++++++----------- flaskapp/auth.py | 15 +++++++++++++++ flaskapp/database.py | 1 + flaskapp/utils.py | 4 +++- flaskapp/views/auth.py | 30 +++++++++++++++++++++++++++++- flaskapp/views/home.py | 17 +++-------------- 6 files changed, 65 insertions(+), 27 deletions(-) diff --git a/flaskapp/app.py b/flaskapp/app.py index b6007c5..ca7be0d 100644 --- a/flaskapp/app.py +++ b/flaskapp/app.py @@ -2,6 +2,8 @@ from flask import Flask from flaskapp.views import blueprints from flaskapp.auth import login_manager +from flaskapp.database import db, Credential + def create_app(): @@ -12,6 +14,7 @@ def create_app(): app.config['WTF_CSRF_SECRET_KEY'] = 'A SECRET KEY' app.config['SECRET_KEY'] = 'ANOTHER ONE' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///beepbeep.db' + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['STRAVA_CLIENT_ID'] = os.environ['STRAVA_CLIENT_ID'] app.config['STRAVA_CLIENT_SECRET'] = os.environ['STRAVA_CLIENT_SECRET'] @@ -19,22 +22,22 @@ def create_app(): app.register_blueprint(blueprint) blueprint.app = app - from flaskapp.database import db, Credential db.init_app(app) db.create_all(app=app) login_manager.init_app(app) # create a first admin user - # with app.app_context(): - # q = db.session.query(Credential).filter(Credential.email == 'example@example.com') - # user_credential = q.first() - # if user_credential is None: - # example = Credential() - # example.email = 'example@example.com' - # example.is_admin = True - # example.set_password('admin') - # db.session.add(example) - # db.session.commit() + with app.app_context(): + q = db.session.query(Credential).filter(Credential.email == 'example@example.com') + user_credential = q.first() + if user_credential is None: + example = Credential() + example.email = 'example@example.com' + example.is_admin = True + example.user_id = -1; + example.set_password('admin') + db.session.add(example) + db.session.commit() return app diff --git a/flaskapp/auth.py b/flaskapp/auth.py index 06f32cf..bcd7be0 100644 --- a/flaskapp/auth.py +++ b/flaskapp/auth.py @@ -1,10 +1,25 @@ import functools from flask_login import current_user, LoginManager, fresh_login_required from flaskapp.database import Credential +from stravalib import Client +import os login_manager = LoginManager() +def _strava_auth_url(): + client = Client() + client_id = os.environ['STRAVA_CLIENT_ID'] + redirect = 'http://127.0.0.1:5001/strava_auth' + url = client.authorization_url(client_id=client_id, + redirect_uri=redirect) + return url + + +def strava_auth_url(config): + return _strava_auth_url() + + def admin_required(func): @functools.wraps(func) def _admin_required(*args, **kw): diff --git a/flaskapp/database.py b/flaskapp/database.py index 6bf8623..2d57a6c 100644 --- a/flaskapp/database.py +++ b/flaskapp/database.py @@ -10,6 +10,7 @@ class Credential(db.Model): email = db.Column(db.Unicode(128), nullable=False) password = db.Column(db.Unicode(128), nullable=False) user_id = db.Column(db.Integer, nullable=False) + authorized_strava = db.Column(db.Boolean) is_active = db.Column(db.Boolean, default=True) is_admin = db.Column(db.Boolean, default=False) diff --git a/flaskapp/utils.py b/flaskapp/utils.py index 34df010..9cc8bbe 100644 --- a/flaskapp/utils.py +++ b/flaskapp/utils.py @@ -1,7 +1,9 @@ + def SingletonDecorator(class_): instances = {} + def getinstance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*args, **kwargs) return instances[class_] - return getinstance \ No newline at end of file + return getinstance diff --git a/flaskapp/views/auth.py b/flaskapp/views/auth.py index defebdf..65e7a5b 100644 --- a/flaskapp/views/auth.py +++ b/flaskapp/views/auth.py @@ -1,11 +1,39 @@ -from flask import Blueprint, render_template, redirect, flash, make_response +from flask import Blueprint, render_template, redirect, flash, make_response, request from flask_login import current_user, login_user, logout_user, login_required from flaskapp.database import db, Credential from flaskapp.forms import LoginForm from flaskapp.views.home import index +from stravalib import Client +from flaskapp.auth import strava_auth_url +import os +import requests auth = Blueprint('auth', __name__) +DATASERVICE = os.environ['DATA_SERVICE'] + + +@auth.route('/strava_auth') +@login_required +def _strava_auth(): # pragma: no cover + code = request.args.get('code') + client = Client() + xc = client.exchange_code_for_token + access_token = xc(client_id=os.environ['STRAVA_CLIENT_ID'], + client_secret=os.environ['STRAVA_CLIENT_SECRET'], + code=code) + user_id = db.session.query(Credential).filter(current_user.id == Credential.id).first().user_id + reply = requests.post(DATASERVICE + '/users/'+str(user_id), json={'strava_token': access_token}) + + if reply.status_code == 409: + return make_response(render_template('strava_error.html', auth_url=strava_auth_url()), 409) + + current_user.authorized_strava = True + db.session.merge(current_user) + db.session.commit() + + return redirect('/') + @auth.route('/login', methods=['GET', 'POST']) def login(): diff --git a/flaskapp/views/home.py b/flaskapp/views/home.py index 098f14f..7ef9ec7 100644 --- a/flaskapp/views/home.py +++ b/flaskapp/views/home.py @@ -1,24 +1,12 @@ from flask import Blueprint, render_template from flask_login import current_user from flaskapp.services import DataService +from flaskapp.auth import strava_auth_url from stravalib import Client home = Blueprint('home', __name__) -def _strava_auth_url(config): - client = Client() - client_id = config['STRAVA_CLIENT_ID'] - redirect = 'http://127.0.0.1:5000/strava_auth' - url = client.authorization_url(client_id=client_id, - redirect_uri=redirect) - return url - - -def strava_auth_url(config): - return _strava_auth_url(config) - - @home.route('/') def index(): user = None @@ -36,4 +24,5 @@ def index(): print("ERROR: ", ex) # TODO: Add an error message - return render_template("index.html", current_user=current_user, strava_auth_url=strava_auth_url(home.app.config), total_average_speed=total_average_speed) + return render_template("index.html", current_user=current_user, strava_auth_url=strava_auth_url(home.app.config), + total_average_speed=total_average_speed)