roundabout,
created on Tuesday, 10 September 2024, 14:05:12 (1725977112),
received on Tuesday, 10 September 2024, 14:05:14 (1725977114)
Author identity: vlad <vlad.muntoiu@gmail.com>
5bd909227e172afef5be3e4cabef258b8b885fc8
app.py
@@ -10,6 +10,7 @@ from flask_httpauth import HTTPBasicAuth
from markupsafe import escape, Markup
from flask_migrate import Migrate, current
from jinja2_fragments.flask import render_block
from sqlalchemy import false
from sqlalchemy.orm import backref
import sqlalchemy.dialects.postgresql
from os import path
@@ -1010,6 +1011,12 @@ def gallery_remove_user(id):
return flask.redirect("/gallery/" + str(gallery.id) + "/users")
class APIError(Exception):
def __init__(self, status_code, message):
self.status_code = status_code
self.message = message
def get_picture_query(query_data):
query = db.session.query(PictureResource)
@@ -1038,16 +1045,24 @@ def get_picture_query(query_data):
}
if "want" in query_data:
for i in query_data["want"]:
if len(i) != 1:
raise APIError(400, "Each requirement must have exactly one key")
requirement, value = list(i.items())[0]
condition = requirement_conditions.get(requirement)
if condition:
query = query.filter(condition(value))
if requirement not in requirement_conditions:
raise APIError(400, f"Unknown requirement type: {requirement}")
condition = requirement_conditions[requirement]
query = query.filter(condition(value))
if "exclude" in query_data:
for i in query_data["exclude"]:
if len(i) != 1:
raise APIError(400, "Each exclusion must have exactly one key")
requirement, value = list(i.items())[0]
condition = requirement_conditions.get(requirement)
if condition:
query = query.filter(~condition(value))
if requirement not in requirement_conditions:
raise APIError(400, f"Unknown requirement type: {requirement}")
condition = requirement_conditions[requirement]
query = query.filter(~condition(value))
if not query_data.get("include_obsolete", False):
query = query.filter(PictureResource.replaced_by_id.is_(None))
@@ -1064,7 +1079,10 @@ def graphical_query_pictures_results():
query_yaml = flask.request.args.get("query", "")
yaml_parser = yaml.YAML()
query_data = yaml_parser.load(query_yaml) or {}
query = get_picture_query(query_data)
try:
query = get_picture_query(query_data)
except APIError as e:
flask.abort(e.status_code)
page = int(flask.request.args.get("page", 1))
per_page = int(flask.request.args.get("per_page", 16))
@@ -1110,7 +1128,10 @@ def query_pictures():
yaml_parser = yaml.YAML()
query_data = yaml_parser.load(flask.request.data) or {}
query = get_picture_query(query_data)
try:
query = get_picture_query(query_data)
except APIError as e:
return flask.jsonify({"error": e.message}), e.status_code
match ordering:
case "date-desc":