diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/__init__.py | 13 | ||||
| -rw-r--r-- | app/config.py | 11 | ||||
| -rw-r--r-- | app/forms.py | 12 | ||||
| -rw-r--r-- | app/models.py | 59 | ||||
| -rw-r--r-- | app/routes.py | 24 | ||||
| -rw-r--r-- | app/templates/base.html | 27 | ||||
| -rw-r--r-- | app/templates/index.html | 5 | ||||
| -rw-r--r-- | app/templates/login.html | 24 |
8 files changed, 175 insertions, 0 deletions
diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..996b683 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,13 @@ +__version__ = "0.1.0" + +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from .config import Config + +app = Flask(__name__) +app.config.from_object(Config) +db = SQLAlchemy(app) +migrate = Migrate(app, db) + +from app import routes, models diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..c33cf25 --- /dev/null +++ b/app/config.py @@ -0,0 +1,11 @@ +import os + +# TODO: change these things to an instance path +basedir = os.path.abspath(os.path.dirname(__file__)) + +class Config(object): + SECRET_KEY = os.environ.get("SECRET_KEY") or "you-will-never-guess" + + SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL") or "sqlite:///" + os.path.join(basedir, "app.db") + SQLALCHEMY_TRACK_MODIFICATIONS = False + diff --git a/app/forms.py b/app/forms.py new file mode 100644 index 0000000..919db70 --- /dev/null +++ b/app/forms.py @@ -0,0 +1,12 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, BooleanField, SubmitField +from wtforms.validators import DataRequired + +class LoginForm(FlaskForm): + username = StringField("Username", validators=[DataRequired()]) + password = PasswordField("Password", validators=[DataRequired()]) + remember_me = BooleanField("Remember Me") + submit = SubmitField("Sign In") + + + diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..9d11ffb --- /dev/null +++ b/app/models.py @@ -0,0 +1,59 @@ + +import datetime + + +from app import db + + +class User(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(), 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 + ) + + def __repr__(self): + return "<User %r>" % self.username + + +class Dataset(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(), 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) + + 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) + + 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) + time_start = db.Column(db.Integer) + time_end = db.Column(db.Integer) + + task = db.relation("Task") + task_id = db.Column(db.Integer, db.ForeignKey("task.id")) + + def __repr__(self): + return "<Annotation %r>" % self.id diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..2f9d9b8 --- /dev/null +++ b/app/routes.py @@ -0,0 +1,24 @@ + +from flask import render_template, flash, redirect, url_for +from app import app +from app.forms import LoginForm + + +@app.route("/") +@app.route("/index") +def index(): + user = {"username": "Gertjan"} + return render_template("index.html", title="Home", user=user) + + +@app.route("/login", methods=("GET", "POST")) +def login(): + form = LoginForm() + if form.validate_on_submit(): + flash( + "Login requested for user {}, remember_me={}".format( + form.username.data, form.remember_me.data + ) + ) + return redirect(url_for("index")) + return render_template("login.html", title="Sign In", form=form) diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..c40482d --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,27 @@ +<html> + <head> + {% if title %} + <title>{{ title }} - Annotate Change</title> + {% else %} + <title>Welcome to Annotate Change</title> + {% endif %} + </head> + <body> + <div>Annotate Change: + <a href="{{ url_for('index') }}">Home</a> + <a href="{{ url_for('login') }}">Login</a> + </div> + <hr> + {% with messages = get_flashed_messages() %} + {% if messages %} + <ul> + {% for message in messages %} + <li>{{ message}}</li> + {% endfor %} + </ul> + {% endif %} + {% endwith %} + {% block content %} + {% endblock %} + </body> +</html> diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..f111cd6 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block content %} +<h1>Hi, {{ user.username }}!</h1> +{% endblock %} diff --git a/app/templates/login.html b/app/templates/login.html new file mode 100644 index 0000000..21e0161 --- /dev/null +++ b/app/templates/login.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block content %} + <h1>Sign In</h1> + <form action="" method="post" novalidate> + {{ form.hidden_tag() }} + <p> + {{ form.username.label }}<br> + {{ form.username(size=32) }} + {% for error in form.username.errors %} + <span style="color: red;">[{{ error }}]</span> + {% endfor %} + </p> + <p> + {{ form.password.label }}<br> + {{ form.password(size=32) }} + {% for error in form.username.errors %} + <span style="color: red;">[{{ error }}]</span> + {% endfor %} + </p> + <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p> + <p>{{ form.submit() }}</p> + </form> +{% endblock %} |
