__author__ = 'chunk' from flask import Flask, request from flask import * from functools import wraps from flask.ext.login import login_required, login_user, logout_user, current_user from werkzeug.utils import secure_filename from web import * from models import * def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS'] @app.route('/favicon.ico') def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'pic/favicon.png', mimetype='image/vnd.microsoft.icon') @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @login_manager.user_loader def user_loader(user_id): return User.query.get(user_id) @login_manager.unauthorized_handler def unauthorized_callback(): flash('Sorry! You are not authorized.', 'warning') return redirect('/login?next=' + request.path) # return redirect(url_for('login', next=request.url)) # def login_required(f): # @wraps(f) # def decorated_function(*args, **kwargs): # if not current_user.is_authenticated(): # return redirect(url_for('login', next=request.url)) # return f(*args, **kwargs) # # return decorated_function def requires_roles(*roles): def wrapper(f): @wraps(f) def wrapped(*args, **kwargs): if current_user.username not in roles: flash('Sorry! You are not privileged to see the page.', 'warning') return redirect(url_for('login', next=request.url)) return f(*args, **kwargs) return wrapped return wrapper @app.route('/') def home(): return render_template("index.html") @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): # user = User.query.get(form.username.data) user = User.query.filter_by(username=form.username.data).first() if user: if bcrypt.check_password_hash(user.password, form.password.data): user.authenticated = True db.session.add(user) db.session.commit() login_user(user, remember=False) return redirect(request.args.get('next') or url_for("home")) else: flash('Validation Failed!', 'error') else: flash('Validation Failed!', 'error') return render_template("login.html", form=form) @app.route('/logout') @login_required def logout(): user = current_user user.authenticated = False db.session.add(user) db.session.commit() logout_user() return redirect(url_for('home')) @app.route('/tasks') @login_required def tasks(): open_tasks = Task.query.filter_by(status=0).all() closed_tasks = Task.query.filter_by(status=1).all() secret_tasks = Task.query.filter_by(status=-1).all() if current_user.username == 'admin': return render_template('tasks.html', open_tasks=open_tasks, closed_tasks=closed_tasks, secret_tasks=secret_tasks) else: return render_template('tasks.html', open_tasks=open_tasks, closed_tasks=closed_tasks) @app.route('/manage') @login_required @requires_roles('admin') def manage(): form_task = TaskForm() return render_template('manage.html', form=form_task) @app.route('/user/') @login_required def user(username): if username != current_user.username: return render_template('404.html'), 404 user = User.query.get(current_user.id) tasks = user.tasks return render_template('user.html', user=current_user, tasks=tasks) @app.route('/add', methods=['POST']) @login_required def new_task(): form_task = TaskForm() if form_task.validate_on_submit(): name = form_task.name.data duedate = form_task.duedate.data priority = form_task.priority.data description = form_task.description.data if 'secret' in request.form.getlist("CheckboxOptions"): status = -1 else: status = 0 if not len(description): description = None attachfile = secure_filename(form_task.attachfile.data.filename) if len(attachfile): form_task.attachfile.data.save(os.path.join(app.config['UPLOAD_FOLDER'], attachfile)) else: attachfile = None new_task = Task(name, duedate, priority, status, datetime.today(), attachfile, description) db.session.add(new_task) db.session.commit() flash('new task added!', 'info') return redirect(url_for('tasks')) else: flash('Validation Failed!', 'error') return redirect(url_for('manage')) @app.route('/download/', methods=['GET', 'POST']) def download(filename): return send_from_directory(directory=app.config['UPLOAD_FOLDER'], filename=filename) @app.route('/info/', ) @login_required def info(task_id): task = Task.query.get(task_id) users = task.users.all() return render_template('info.html', task=task, users=users) @app.route('/edit/', ) @login_required def edit(task_id): task = Task.query.get(task_id) users = task.users.all() return render_template('edit.html', task=task, users=users) @app.route('/update/', methods=['GET', 'POST']) @login_required def update(category): id = request.form["pk"] value = request.form["value"] print id, value task = Task.query.get(id) if category == 0: # taskname task.name = value elif category == 1: # duedate task.duedate = datetime.strptime(value, '%m/%d/%Y') elif category == 2: # attachfile task.attachfile = value elif category == 3: # description task.description = value elif category == 4: # priority task.priority = value elif category == 5: # status task.status = value else: pass db.session.add(task) db.session.commit() return json.dumps({}) @app.route('/take/', ) @login_required def take(task_id): task = Task.query.get(task_id) task.users.append(User.query.get(current_user.id)) db.session.commit() return redirect(url_for('user', username=current_user.username)) @app.route('/untake/', ) @login_required def untake(task_id): task = Task.query.get(task_id) task.users.remove(User.query.get(current_user.id)) db.session.commit() return redirect(url_for('user', username=current_user.username)) @app.route('/delete/', ) @login_required def delete_entry(task_id): del_task = Task.query.get(task_id) db.session.delete(del_task) db.session.commit() flash('The task was deleted!', 'info') return redirect(url_for('tasks')) @app.route('/complete/', ) @login_required def complete(task_id): Task.query.filter_by(id=task_id).update(dict(status=1)) db.session.commit() flash('The task was marked as complete!', 'info') return redirect(url_for('tasks')) @app.route('/incomplete/', ) @login_required def incomplete(task_id): Task.query.filter_by(id=task_id).update(dict(status=0)) db.session.commit() flash('The task was marked as incomplete!', 'info') return redirect(url_for('tasks'))