1
0
Fork 0
This repository has been archived on 2019-02-15. You can view files and clone it, but cannot push or open issues or pull requests.
skehsucks-share/notpiracyiswear.py
Derek Schmidt edbf1bff5c
Add user signup flow via user referal
gonna need a default user for this to work
2018-06-03 16:33:55 -07:00

151 lines
5 KiB
Python

from flask import Flask, render_template, flash, send_from_directory, redirect, request, session, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager, current_user, login_user, logout_user, login_required
from operator import itemgetter
import os
from models import db, User, Referal
app = Flask(__name__)
app.config.from_pyfile('settings.cfg')
db.app = app
db.init_app(app)
migrate = Migrate(app, db)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
@login_manager.user_loader
def load_user(id):
return User.query.get(id)
@app.route('/')
def index():
if current_user.is_authenticated:
return redirect(url_for('browse'))
else:
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
if current_user.is_authenticated:
return redirect(request.args.get('next') or url_for('index'))
else:
return render_template('login.html')
else:
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user is None:
flash("username / password all fucked up", 'error')
return redirect(request.path)
if user.check_password(password) == True:
success = login_user(user)
if success:
flash("holy cow you are logged in!", 'info')
return redirect(request.args.get('next') or url_for('index'))
else:
flash("oof ouch u banned my dude", 'error')
return redirect(request.path)
else:
flash("username / password all fucked up", 'error')
return redirect(request.path)
@app.route('/signup', methods=['GET', 'POST'])
def signup():
referal_key = request.args.get('referalkey')
if not referal_key:
return render_template('genericerror.html', message="I don't trust y'all. Signups are by referal only rn.")
referal = Referal.query.filter_by(key=referal_key).first()
if not referal:
return render_template('genericerror.html', message="Someone gave you a bad referal code. What a dumbass. \nGo ask for a new one.")
if not referal.user.active == True:
return render_template('genericerror.html', message="Looks like {user} got a good 'ol banaroni. Referals from them aren't valid anymore. \nSorry pal.".format(user=referal.user.username))
if request.method == 'GET':
return render_template('signup.html', referer_username=referal.user.username, referal_message=referal.message or "oh worm? make an account my dude")
else:
username = request.form['username']
password = request.form['password']
new_user = User(username, password)
db.session.add(new_user)
db.session.delete(referal)
db.session.commit()
login_success = login_user(new_user)
if login_success:
return redirect(url_for('browse'))
else:
flash("couldn't log you in because ?? guess you'll have to do it yourself", 'error')
return redirect(url_for('login'))
@app.route('/logout')
@login_required
def logout():
logout_user()
flash("bye binch", 'info')
return redirect(url_for('login'))
#FIXME: make this functionality avalible in a settings/admin view
@app.route('/newreferal')
@login_required
def newreferal():
referal = Referal(current_user)
db.session.add(referal)
db.session.commit()
return referal.key
@app.route('/browse/')
@app.route('/browse/<path:path>')
@login_required
def browse(path = None):
# Search for files in path
searchpath = os.path.join('files', path) if path is not None else 'files'
# 404 if no such path exists
if not os.path.exists(searchpath):
return render_template('404.html'), 404
if not os.path.isdir(searchpath):
return redirect(url_for('files', path=path), code=301)
# Organize files and some props into tuple list
file_size_isdir_tuple_list = [];
for filename in os.listdir(searchpath):
if not filename.startswith('.'):
fullpath = os.path.join(searchpath, filename)
file_size_bytes = os.path.getsize(fullpath)
file_size_isdir_tuple_list.append((filename, file_size_bytes, os.path.isdir(fullpath)))
file_size_isdir_tuple_list.sort(key=itemgetter(0))
file_size_isdir_tuple_list.sort(key=itemgetter(2), reverse=True)
# Render out the item browser
return render_template('items.html', files = file_size_isdir_tuple_list, path = os.path.normpath(path) + '/' if path is not None else '')
@app.route('/files/<path:path>')
@login_required
def files(path):
return send_from_directory('files', path)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_error(e):
return render_template('500.html'), 500
if __name__ == "__main__":
app.run()