aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/__init__.py13
-rw-r--r--app/config.py11
-rw-r--r--app/forms.py12
-rw-r--r--app/models.py59
-rw-r--r--app/routes.py24
-rw-r--r--app/templates/base.html27
-rw-r--r--app/templates/index.html5
-rw-r--r--app/templates/login.html24
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 %}