data_annotation_platform/app/models.py (97 lines of code) (raw):
# -*- coding: utf-8 -*-
# Author: G.J.J. van den Burg <gvandenburg@turing.ac.uk>
# License: See LICENSE file
# Copyright: 2020 (c) The Alan Turing Institute
import datetime
import jwt
import time
from flask import current_app
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from app import db
from app import login
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(256), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
last_active = db.Column(
db.DateTime(), nullable=False, default=datetime.datetime.utcnow
)
is_admin = db.Column(db.Boolean(), default=False)
# after email is confirmed:
is_confirmed = db.Column(db.Boolean(), default=False)
# after all demo tasks completed:
is_introduced = db.Column(db.Boolean(), default=False)
# checkboxes during registration
read_toc = db.Column(db.Boolean(), default=False)
wants_credit = db.Column(db.Boolean(), default=False)
wants_updates = db.Column(db.Boolean(), default=False)
# full name
fullname = db.Column(db.String(256), unique=False, nullable=True)
# max tasks
max_tasks = db.Column(db.Integer, nullable=False, default=50)
def __repr__(self):
return "<User %r>" % self.username
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def get_reset_password_token(self, expires_in=600):
return jwt.encode(
{"reset_password": self.id, "exp": time.time() + expires_in},
current_app.config["SECRET_KEY"],
algorithm="HS256",
)#.decode("utf-8")
@staticmethod
def verify_reset_password_token(token):
try:
_id = jwt.decode(
token, current_app.config["SECRET_KEY"], algorithms=["HS256"]
)["reset_password"]
except:
return None
return User.query.get(_id)
def get_email_confirmation_token(self, expires_in=3600):
return jwt.encode(
{"email": self.email, "exp": time.time() + expires_in},
current_app.config["SECRET_KEY"],
algorithm="HS256",
)#.decode("utf-8")
@staticmethod
def verify_email_confirmation_token(token):
try:
_email = jwt.decode(
token, current_app.config["SECRET_KEY"], algorithms=["HS256"]
)["email"]
except:
return None
return User.query.filter_by(email=_email).first()
class Dataset(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True, nullable=False)
created = db.Column(
db.DateTime, nullable=False, default=datetime.datetime.utcnow
)
md5sum = db.Column(db.String(32), unique=True, nullable=False)
# Whether or not dataset is a demo dataset.
is_demo = db.Column(db.Boolean(), default=True)
def __repr__(self):
return "<Dataset %r>" % self.name
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
annotator_id = db.Column(db.Integer, nullable=False)
dataset_id = db.Column(db.Integer, nullable=False)
done = db.Column(db.Boolean, nullable=False, default=False)
annotated_on = db.Column(db.DateTime, nullable=True)
time_spent = db.Column(db.Integer)
difficulty = db.Column(db.Integer)
problem = db.Column(db.Text)
admin_assigned = db.Column(db.Boolean, default=False)
user = db.relation("User")
annotator_id = db.Column(db.Integer, db.ForeignKey("user.id"))
dataset = db.relation("Dataset")
dataset_id = db.Column(db.Integer, db.ForeignKey("dataset.id"))
def __repr__(self):
return "<Task (%r, %r)>" % (self.annotator_id, self.dataset_id)
class Annotation(db.Model):
id = db.Column(db.Integer, primary_key=True)
cp_index = db.Column(db.Integer)
type = db.Column(db.String(50))
task = db.relation("Task")
task_id = db.Column(db.Integer, db.ForeignKey("task.id"))
def __repr__(self):
return "<Annotation %r>" % self.id
@login.user_loader
def load_user(_id):
return User.query.get(int(_id))