From 2158c8e86ff4417973dd7ca650fab91e32c4e56a Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Mon, 18 Mar 2019 14:10:12 +0000 Subject: initial commit --- app/__init__.py | 13 +++++++++++ app/config.py | 11 +++++++++ app/forms.py | 12 ++++++++++ app/models.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ app/routes.py | 24 ++++++++++++++++++++ app/templates/base.html | 27 ++++++++++++++++++++++ app/templates/index.html | 5 ++++ app/templates/login.html | 24 ++++++++++++++++++++ 8 files changed, 175 insertions(+) create mode 100644 app/__init__.py create mode 100644 app/config.py create mode 100644 app/forms.py create mode 100644 app/models.py create mode 100644 app/routes.py create mode 100644 app/templates/base.html create mode 100644 app/templates/index.html create mode 100644 app/templates/login.html (limited to 'app') 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 "" % 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 "" % 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 "" % (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 "" % 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 @@ + + + {% if title %} + {{ title }} - Annotate Change + {% else %} + Welcome to Annotate Change + {% endif %} + + +
Annotate Change: + Home + Login +
+
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
    + {% for message in messages %} +
  • {{ message}}
  • + {% endfor %} +
+ {% endif %} + {% endwith %} + {% block content %} + {% endblock %} + + 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 %} +

Hi, {{ user.username }}!

+{% 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 %} +

Sign In

+
+ {{ form.hidden_tag() }} +

+ {{ form.username.label }}
+ {{ form.username(size=32) }} + {% for error in form.username.errors %} + [{{ error }}] + {% endfor %} +

+

+ {{ form.password.label }}
+ {{ form.password(size=32) }} + {% for error in form.username.errors %} + [{{ error }}] + {% endfor %} +

+

{{ form.remember_me() }} {{ form.remember_me.label }}

+

{{ form.submit() }}

+
+{% endblock %} -- cgit v1.2.3