roundabout,
created on Thursday, 5 September 2024, 07:50:34 (1725522634),
received on Thursday, 5 September 2024, 10:39:47 (1725532787)
Author identity: vlad <vlad.muntoiu@gmail.com>
7c142dcccbdb6306bdc938661842c24caaabfaf0
app.py
@@ -6,7 +6,7 @@ from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt from flask_httpauth import HTTPBasicAuth from markupsafe import escape, Markup from flask_migrate import Migratefrom flask_migrate import Migrate, currentfrom jinja2_fragments.flask import render_block from sqlalchemy.orm import backref import sqlalchemy.dialects.postgresql
@@ -278,7 +278,7 @@ def profile(username):
user = db.session.get(User, username) if user is None: return flask.abort(404)flask.abort(404)return flask.render_template("profile.html", user=user)
@@ -313,7 +313,7 @@ def upload_post():
def picture(id): resource = db.session.get(PictureResource, id) if resource is None: return flask.abort(404)flask.abort(404)image = Image.open(path.join(config.DATA_PATH, "pictures", str(resource.id)))
@@ -327,11 +327,13 @@ def picture(id):
def annotate_picture(id): resource = db.session.get(PictureResource, id) current_user = db.session.get(User, flask.session.get("username")) if current_user is None: flask.abort(401)if resource.author != current_user and not current_user.admin: return flask.abort(403)flask.abort(403)if resource is None: return flask.abort(404)flask.abort(404)return flask.render_template("picture-annotation.html", resource=resource, file_extension=mimetypes.guess_extension(resource.file_format))
@@ -341,11 +343,11 @@ def annotate_picture(id):
def save_annotations(id): resource = db.session.get(PictureResource, id) if resource is None: return flask.abort(404)flask.abort(404)current_user = db.session.get(User, flask.session.get("username")) if resource.author != current_user and not current_user.admin: return flask.abort(403)flask.abort(403)# Delete all previous annotations db.session.query(PictureRegion).filter_by(resource_id=id).delete()
@@ -375,7 +377,7 @@ def save_annotations(id):
def get_annotations(id): resource = db.session.get(PictureResource, id) if resource is None: return flask.abort(404)flask.abort(404)regions = db.session.query(PictureRegion).filter_by(resource_id=id).all()
@@ -395,7 +397,7 @@ def get_annotations(id):
def raw_picture(id): resource = db.session.get(PictureResource, id) if resource is None: return flask.abort(404)flask.abort(404)response = flask.send_from_directory(path.join(config.DATA_PATH, "pictures"), str(resource.id)) response.mimetype = resource.file_format
static/style.css
@@ -7,6 +7,11 @@
--text-softer: #0000009A; --text-faint: #00000066; --color-shape-label: #0097A7; --color-shape-label-text: #ffffff; /*view-transition-name: root;*/ } nav { /*view-transition-name: nav;*/} p {
@@ -161,3 +166,44 @@ iconify-icon {
fill-opacity: 0.1; stroke-opacity: 1; } /* Disabled for now, until there is more navigation that would benefit from transitions */ /* @view-transition { navigation: auto; } @keyframes move-out { from { transform: translateX(0%); } to { transform: translateX(-100%); } } @keyframes move-in { from { transform: translateX(100%); } to { transform: translateX(0%); } } @media (prefers-reduced-motion: no-preference) { ::view-transition-old(root), ::view-transition-new(root) { animation-duration: 0.25s; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); } ::view-transition-old(root) { animation-name: move-out; } ::view-transition-new(root) { animation-name: move-in; } } */