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 Migrate
from flask_migrate import Migrate, current
from 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;
}
}
*/