Last active
August 29, 2015 14:01
-
-
Save ianseyer/f4f7442d447c9186958d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from kickstart import * | |
from flask import Flask, render_template, make_response, request, redirect | |
from flask.ext.sqlalchemy import SQLAlchemy | |
import stripe, oauthlib, requests, psycopg2 | |
from campModels import * | |
from userModels import * | |
from userForms import * | |
import datetime | |
import json | |
BASE_URL = 'http://127.0.0.1:5000/' | |
#for a user, use user_datastore.add_role_to_user | |
user_datastore = SQLAlchemyUserDatastore(db, User, Role) | |
app_security = Security(app, user_datastore) | |
principals = Principal(app) | |
user_datastore.create_role(name='base_user', description='This user is allowed to leave a review and upload content.') | |
user_datastore.create_role(name='sales_user', description='Allows Sales team to access directory of campgrounds & verification codes') | |
user_datastore.create_role(name='campground_owner', description='This user can edit a campgrounds content, and opt-in to Roverpass') | |
#create permissions here: | |
access_sales = Permission(RoleNeed('sales_user')) | |
edit_campground = Permission(RoleNeed('sales_user'), RoleNeed('campground_owner')) | |
upload_media = Permission(RoleNeed('sales_user'), RoleNeed('campground_owner'), RoleNeed('base_user')) | |
leave_review = Permission(RoleNeed('base_user')) | |
@app_security.login_context_processor | |
def login_context_processor(): | |
form = LoginForm() | |
return dict(form=form) | |
# LOGIN # | |
@login_manager.user_loader | |
def load_user(id): | |
user = User.objects.filter_by(id=identity).first() | |
return user | |
@login_manager.request_loader | |
def load_user_from_request(request): | |
#try to login with api (request.args.get('api_key')) | |
#then try to login with normal email | |
pass | |
@app.route('/') | |
def index(): | |
if current_user.is_authenticated(): | |
user = current_user | |
return render_template('splash.html', user=user) | |
# USERS # | |
@app.route('/create_user', methods=['GET', 'POST']) | |
def create_user(): | |
form = UserForm(prefix="user") | |
if request.method=='POST' and form.validate(): | |
if User.query.filter_by(email = form.email.data).first() == None: | |
user = user_datastore.create_user(email=form.email.data, | |
password=encrypt_password(form.password.data), | |
active=True, has_pass=False) | |
user_datastore.activate_user(user) | |
login_user | |
user_datastore.add_role_to_user(user, 'base_user') | |
db.session.commit() | |
return redirect('/login') | |
else: | |
return render_template('userExists.html') | |
else: | |
response = render_template('create_user.html', form=form) | |
return render_template('create_user.html', form=form) | |
@app.route('/login', methods=['GET', 'POST']) | |
def login(): | |
#wtform | |
form = LoginForm() | |
if form.validate_on_submit(): | |
username = request.form['username'] | |
password = request.form['password'] | |
registered_user = User.query.filter_by(username=username,password=password).first() | |
if registered_user is None: | |
flash('Username or Password is invalid' , 'error') | |
return redirect('/login') | |
login_user(registered_user) | |
flash('Logged in successfully') | |
return redirect(request.args.get('next') or '/search') | |
return render_template('login_user.html', form=form) | |
@app.route('/logout') | |
@login_required | |
def logout(): | |
# Remove the user information from the session | |
logout_user() | |
# Remove session keys set by Flask-Principal | |
for key in ('identity.name', 'identity.auth_type'): | |
session.pop(key, None) | |
# Tell Flask-Principal the user is anonymous | |
identity_changed.send(current_app._get_current_object(), | |
identity=AnonymousIdentity()) | |
return redirect(request.args.get('next') or '/') | |
# CAMPGROUND & REVIEWS # | |
@app.route('/campground/<slug>') | |
def profile(slug): | |
""" | |
campground profile view. Redirects to AngularJS powered inline editing page if user has the permissions required to edit a campground page. | |
""" | |
campground = Campground.query.filter_by(slug=slug).first() | |
address = json.loads(campground.address) | |
similar = Campground.query.filter_by(state=campground.state).all() | |
similar.remove(campground) | |
if len(campground.reviews) != 0: | |
review = campground.reviews[0] | |
else: | |
review = None | |
if current_user.has_role('campground_owner') and current_user.camp_owned == campground.id: | |
return redirect(str('/campground/'+slug+'/edit'), slug=slug) | |
elif campground: | |
return render_template('campground.html', campground=campground, similar=similar, review=review, name=str(campground.name).replace('{','').replace('"','').replace('}',''), address=address['results'][0]['name'], lat=address['results'][0]['geometry']['location']['lat'], lng=address['results'][0]['geometry']['location']['lng']) | |
return render_template('404.html') | |
@app.route('/campground/<slug>/reviews') | |
def display_reviews(slug): | |
""" | |
Displays a list of all reviews for a campground. | |
""" | |
campground = Campground.query.filter_by(slug=slug).first() | |
if campground: | |
return render_template('review_list.html', reviews=campground.reviews) | |
else: | |
abort(404) | |
@app.route('/campground/<slug>/leave_review', methods=['GET', 'POST']) | |
def leave_review(slug): | |
form = ReviewForm() | |
campground = Campground.query.filter_by(slug=slug).first() | |
if campground and form.validate_on_submit(): | |
campground.reviews.append(Review(stars=form.num_stars.data, review_text=form.review_text.data)) | |
db.session.commit() | |
return render_template('review_success.html') | |
elif not current_user.has_role('leave_review'): | |
return redirect('/login') | |
elif not campground: | |
abort(404) | |
else: | |
return render_template('leave_review.html', form=form) | |
# CLAIM & OPT IN # | |
@app.route('/campground/<slug>/claim', methods=['GET', 'POST']) | |
def claim_campground(slug): | |
form = VerificationNumberForm() | |
campground = Campground.query.filter_by(slug=slug[1:]).first() | |
if not current_user.is_authenticated(): | |
return redirect('/login') | |
else: | |
user = User.query.filter_by(id=current_user.id).first() | |
if request.method == 'POST' and form.validate(): | |
if form.code.data == campground.verification_code: | |
user_datastore.add_role_to_user(user, 'campground_owner') | |
user.camp_owned = campground.id | |
db.session.commit() | |
return redirect(str('/campground/'+slug+'/edit')) | |
else: | |
return render_template('error.html', message='You have entered an incorrect verification code.') | |
else: | |
return render_template('claim_campground.html', form=form, campground=campground) | |
@app.route('/campground/<slug>/edit', methods=['GET', 'POST']) | |
def edit_campground(slug): | |
campground = Campground.query.filter_by(slug=slug[1:]).first() | |
print campground.id | |
print current_user.camp_owned | |
if current_user.has_role('campground_owner') and (current_user.camp_owned == campground.id): | |
return render_template('edit_campground.html', campground=campground) | |
else: | |
return redirect('/campground/'+str(slug)) | |
# SEARCH # | |
###ERROR HANDLING### | |
@app.errorhandler(404) | |
def pageNotFound(error): | |
return render_template('404.html') | |
@app.errorhandler(500) | |
def server_error(error): | |
return "something broke" | |
if __name__ == '__main__': | |
app.run(debug=True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class User(db.Model, UserMixin): | |
""" | |
A User of the system.. | |
""" | |
#methods required by flask-login: | |
#is_authenticated() | |
#is_active() | |
#is_anonymous() | |
#get_id() | |
#it will inherit all of these from UserMixin | |
id = db.Column(db.Integer, primary_key=True) | |
email = db.Column(db.String(255), unique=True) | |
password = db.Column(db.String(120)) | |
active = db.Column(db.Boolean()) | |
has_pass = db.Column(db.Boolean()) | |
roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) | |
camp_owned = db.Column(db.Integer, db.ForeignKey('campground.id')) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Traceback (most recent call last): | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1836, in __call__ | |
return self.wsgi_app(environ, start_response) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1820, in wsgi_app | |
response = self.make_response(self.handle_exception(e)) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1403, in handle_exception | |
reraise(exc_type, exc_value, tb) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1817, in wsgi_app | |
response = self.full_dispatch_request() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1477, in full_dispatch_request | |
rv = self.handle_user_exception(e) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1381, in handle_user_exception | |
reraise(exc_type, exc_value, tb) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1473, in full_dispatch_request | |
rv = self.preprocess_request() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/app.py", line 1666, in preprocess_request | |
rv = func() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/flask_principal.py", line 477, in _on_before_request | |
identity = loader() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/flask_security/core.py", line 168, in _identity_loader | |
if not isinstance(current_user._get_current_object(), AnonymousUser): | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object | |
return self.__local() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask_Login-0.2.10-py2.7.egg/flask_login.py", line 46, in <lambda> | |
current_user = LocalProxy(lambda: _get_user()) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask_Login-0.2.10-py2.7.egg/flask_login.py", line 794, in _get_user | |
current_app.login_manager._load_user() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask_Login-0.2.10-py2.7.egg/flask_login.py", line 363, in _load_user | |
return self.reload_user() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/Flask_Login-0.2.10-py2.7.egg/flask_login.py", line 325, in reload_user | |
user = self.user_callback(user_id) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/flask_security/core.py", line 153, in _user_loader | |
return _security.datastore.find_user(id=user_id) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/flask_security/datastore.py", line 202, in find_user | |
return self.user_model.query.filter_by(**kwargs).first() | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2156, in first | |
ret = list(self[0:1]) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2023, in __getitem__ | |
return list(res) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2227, in __iter__ | |
return self._execute_and_instances(context) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2242, in _execute_and_instances | |
result = conn.execute(querycontext.statement, self._params) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1449, in execute | |
params) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1584, in _execute_clauseelement | |
compiled_sql, distilled_params | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1698, in _execute_context | |
context) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1691, in _execute_context | |
context) | |
File "/Users/ianseyer/Documents/programming/web/RoverPass/env/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 331, in do_execute | |
cursor.execute(statement, parameters) | |
DataError: (DataError) invalid input syntax for integer: "None" | |
LINE 3: WHERE "user".id = 'None' | |
^ | |
'SELECT "user".id AS user_id, "user".email AS user_email, "user".password AS user_password, "user".active AS user_active, "user".has_pass AS user_has_pass, "user".camp_owned AS user_camp_owned \nFROM "user" \nWHERE "user".id = %(id_1)s \n LIMIT %(param_1)s' {'id_1': u'None', 'param_1': 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment