diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2019-03-18 18:30:21 +0000 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2019-03-18 18:30:21 +0000 |
| commit | bff5795ed10c923f0e26781ed53ff04fd2284923 (patch) | |
| tree | 487bb1d33fafbfe052e6f6eb44459c9b8af5afea /app/admin | |
| parent | Add command line interface for admin tasks (diff) | |
| download | AnnotateChange-bff5795ed10c923f0e26781ed53ff04fd2284923.tar.gz AnnotateChange-bff5795ed10c923f0e26781ed53ff04fd2284923.zip | |
Start work on admin panel
Diffstat (limited to 'app/admin')
| -rw-r--r-- | app/admin/__init__.py | 7 | ||||
| -rw-r--r-- | app/admin/decorators.py | 21 | ||||
| -rw-r--r-- | app/admin/forms.py | 12 | ||||
| -rw-r--r-- | app/admin/routes.py | 42 |
4 files changed, 82 insertions, 0 deletions
diff --git a/app/admin/__init__.py b/app/admin/__init__.py new file mode 100644 index 0000000..737dcc6 --- /dev/null +++ b/app/admin/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +from flask import Blueprint + +bp = Blueprint("admin", __name__, url_prefix="/admin") + +from app.admin import routes diff --git a/app/admin/decorators.py b/app/admin/decorators.py new file mode 100644 index 0000000..f42b582 --- /dev/null +++ b/app/admin/decorators.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from functools import wraps + +from flask import current_app, request +from flask_login import current_user +from flask_login.config import EXEMPT_METHODS + + +def admin_required(func): + @wraps(func) + def decorated_view(*args, **kwargs): + if request.method in EXEMPT_METHODS: + return func(*args, **kwargs) + elif current_app.config.get("LOGIN_DISABLED"): + return func(*args, **kwargs) + elif not current_user.is_admin: + return current_app.login_manager.unauthorized() + return func(*args, **kwargs) + + return decorated_view diff --git a/app/admin/forms.py b/app/admin/forms.py new file mode 100644 index 0000000..b33b1c6 --- /dev/null +++ b/app/admin/forms.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from flask_wtf import FlaskForm + +from wtforms import StringField, PasswordField, BooleanField, SubmitField +from wtforms.validators import DataRequired, ValidationError, Email, EqualTo + + +class AdminAssignTaskForm(FlaskForm): + username = StringField("Username", validators=[DataRequired()]) + dataset = StringField("Dataset", validators=[DataRequired()]) + submit = SubmitField("Assign") diff --git a/app/admin/routes.py b/app/admin/routes.py new file mode 100644 index 0000000..1150f72 --- /dev/null +++ b/app/admin/routes.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +from flask import render_template, flash, redirect, url_for +from flask_login import login_required + +from app import db +from app.admin import bp +from app.admin.decorators import admin_required +from app.admin.forms import AdminAssignTaskForm +from app.models import User, Dataset, Task + + +@bp.route("/assign", methods=("GET", "POST")) +@login_required +@admin_required +def assign(): + form = AdminAssignTaskForm() + if form.validate_on_submit(): + user = User.query.filter_by(username=form.username.data).first() + if user is None: + flash("User does not exist.") + return redirect(url_for("admin.assign")) + dataset = Dataset.query.filter_by(name=form.dataset.data).first() + if dataset is None: + flash("Dataset does not exist.") + return redirect(url_for("admin.assign")) + + task = Task.query.filter_by( + annotator_id=user.id, dataset_id=dataset.id + ) + if not task is None: + flash("Task assignment already exists.") + return redirect(url_for("admin.assign")) + + task = Task(annotator_id=user.id, dataset_id=dataset.id) + db.session.add(task) + db.session.commit() + flash("Task registered successfully.") + tasks = Task.query.all() + return render_template( + "admin/assign.html", title="Assign Task", form=form, tasks=tasks + ) |
