roundabout,
created on Saturday, 14 September 2024, 11:54:51 (1726314891),
received on Saturday, 14 September 2024, 11:54:53 (1726314893)
Author identity: vlad <vlad.muntoiu@gmail.com>
3e95f026da98d4c103776d0fe4077f5670454a3a
app.py
@@ -1214,6 +1214,13 @@ def query_pictures():
except APIError as e: return flask.jsonify({"error": e.message}), e.status_code rating_count_subquery = db.select(db.func.count(PictureRating.id)).where( PictureRating.resource_id == PictureResource.id).scalar_subquery() region_count_subquery = db.select(db.func.count(PictureRegion.id)).where( PictureRegion.resource_id == PictureResource.id).scalar_subquery() rating_subquery = db.select(db.func.coalesce(db.func.avg(PictureRating.rating), 0)).where( PictureRating.resource_id == PictureResource.id).scalar_subquery() match ordering: case "date-desc": query = query.order_by(PictureResource.timestamp.desc())
@@ -1226,9 +1233,17 @@ def query_pictures():
case "random": query = query.order_by(db.func.random()) case "number-regions-desc": query = query.order_by(db.func.count(PictureResource.regions).desc())query = query.order_by(region_count_subquery.desc())case "number-regions-asc": query = query.order_by(db.func.count(PictureResource.regions).asc())query = query.order_by(region_count_subquery.asc()) case "rating-desc": query = query.order_by(rating_subquery.desc()) case "rating-asc": query = query.order_by(rating_subquery.asc()) case "number-ratings-desc": query = query.order_by(rating_count_subquery.desc()) case "number-ratings-asc": query = query.order_by(rating_count_subquery.asc())query = query.offset(offset).limit(limit) resources = query.all()
@@ -1294,6 +1309,8 @@ def api_picture(id):
"replaced_by": resource.replaced_by_id, "regions": [], "download": config.ROOT_URL + flask.url_for("raw_picture", id=resource.id), "rating_average": resource.average_rating, "rating_count": resource.rating_totals,} for region in resource.regions: json_resource["regions"].append({
@@ -1504,3 +1521,39 @@ def api_update_picture(id):
return flask.jsonify({"message": "Picture updated successfully"}) @app.route("/api/picture/<int:id>/rate", methods=["POST"]) def api_rate_picture(id): resource = db.session.get(PictureResource, id) if resource is None: flask.abort(404) current_user = db.session.get(User, flask.session.get("username")) if current_user is None: flask.abort(401) rating = int(flask.request.json.get("rating")) if not rating: # Delete the existing rating if PictureRating.query.filter_by(resource=resource, user=current_user).first(): db.session.delete(PictureRating.query.filter_by(resource=resource, user=current_user).first()) db.session.commit() return flask.jsonify({"message": "Existing rating removed"}) if not 1 <= rating <= 5: flask.flash("Invalid rating") return flask.jsonify({"error": "Invalid rating"}), 400 if PictureRating.query.filter_by(resource=resource, user=current_user).first(): PictureRating.query.filter_by(resource=resource, user=current_user).first().rating = rating else: # Create a new rating db.session.add(PictureRating(resource, current_user, rating)) db.session.commit() return flask.jsonify({"message": "Rating saved"})