Skip to content

Instantly share code, notes, and snippets.

@ianseyer
Last active August 29, 2015 14:01
Show Gist options
  • Save ianseyer/f4f7442d447c9186958d to your computer and use it in GitHub Desktop.
Save ianseyer/f4f7442d447c9186958d to your computer and use it in GitHub Desktop.
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)
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'))
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