Fix
roundabout,
created on Sunday, 6 October 2024, 11:02:23 (1728212543),
received on Saturday, 12 October 2024, 14:56:18 (1728744978)
Author identity: vlad <vlad.muntoiu@gmail.com>
fca9b839557558ce139ad697eacc4e7e9f019a81
app.py
@@ -443,8 +443,24 @@ def has_object(id):
if object_ is None:
flask.abort(404)
query = db.session.query(PictureResource).join(PictureRegion).filter(
PictureRegion.object_id == id)
descendants_cte = (
db.select(PictureObject.id)
.where(PictureObject.id == id)
.cte(name="descendants_cte", recursive=True)
)
descendants_cte = descendants_cte.union_all(
db.select(PictureObjectInheritance.child_id)
.where(PictureObjectInheritance.parent_id == descendants_cte.c.id)
)
query = db.session.query(PictureResource).filter(
PictureResource.regions.any(
PictureRegion.object_id.in_(
db.select(descendants_cte.c.id)
)
)
)
page = int(flask.request.args.get("page", 1))
per_page = int(flask.request.args.get("per_page", 16))
@@ -1149,28 +1165,30 @@ class APIError(Exception):
def get_picture_query(query_data):
query = db.session.query(PictureResource)
descendants_cte = (
db.select(PictureObject.id)
.where(PictureObject.id == PictureRegion.object_id)
.cte(name="descendants_cte", recursive=True)
)
def has_condition(id):
descendants_cte = (
db.select(PictureObject.id)
.where(PictureObject.id == id)
.cte(name=f"descendants_cte_{id}", recursive=True)
)
descendants_cte = descendants_cte.union_all(
db.select(PictureObjectInheritance.child_id)
.where(PictureObjectInheritance.parent_id == descendants_cte.c.id)
)
descendants_cte = descendants_cte.union_all(
db.select(PictureObjectInheritance.child_id)
.where(PictureObjectInheritance.parent_id == descendants_cte.c.id)
)
return PictureResource.regions.any(
PictureRegion.object_id.in_(
db.select(descendants_cte.c.id)
)
)
requirement_conditions = {
# Has an object with the ID in the given list
"has_object": lambda value: PictureResource.regions.any(
PictureRegion.object_id.in_(value)),
# Has an object with the ID in the given list, or a subtype of it
"has": lambda value: PictureResource.regions.any(
PictureRegion.object_id.in_(
db.select(descendants_cte.c.id)
)
),
"has": lambda value: db.or_(*[has_condition(id) for id in value]),
"nature": lambda value: PictureResource.nature_id.in_(value),
"licence": lambda value: PictureResource.licences.any(
PictureLicence.licence_id.in_(value)),