views.py 7.19 KB
__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/<string:username>')
@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/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    return send_from_directory(directory=app.config['UPLOAD_FOLDER'], filename=filename)


@app.route('/info/<int:task_id>', )
@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/<int:task_id>', )
@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/<int:category>', 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/<int:task_id>', )
@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/<int:task_id>', )
@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/<int:task_id>', )
@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/<int:task_id>', )
@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/<int:task_id>', )
@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'))