roundabout,
created on Sunday, 16 February 2025, 08:59:39 (1739696379),
received on Sunday, 16 February 2025, 08:59:42 (1739696382)
Author identity: vlad <vlad.muntoiu@gmail.com>
0946023c7b70c6b824c95aec0217b796eecf861e
app.py
@@ -15,7 +15,7 @@ from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_migrate import Migrate, current
from urllib.parse import urlencode
from PIL import Image
from PIL import Image, ImageOps
app = flask.Flask(__name__)
bcrypt = Bcrypt(app)
@@ -27,6 +27,13 @@ db = SQLAlchemy(app)
migrate = Migrate(app, db)
def make_thumbnail(pil_image):
pil_image = ImageOps.exif_transpose(pil_image)
pil_image.thumbnail(config.THUMBNAIL_SIZE)
pil_image = pil_image.convert("RGB")
return pil_image
@app.template_filter("split")
def split(value, separator=None, maxsplit=-1):
return value.split(separator, maxsplit)
@@ -544,8 +551,7 @@ def upload_post():
file.save(path.join(config.DATA_PATH, "pictures", str(resource.id)))
pil_image = Image.open(path.join(config.DATA_PATH, "pictures", str(resource.id)))
resource.width, resource.height = pil_image.size
pil_image.thumbnail(config.THUMBNAIL_SIZE)
pil_image = pil_image.convert("RGB")
pil_image = make_thumbnail(pil_image)
pil_image.save(path.join(config.DATA_PATH, "picture-thumbnails", str(resource.id)), **config.THUMBNAIL_SAVE_OPTIONS)
db.session.commit()
@@ -703,6 +709,10 @@ def delete_picture(id):
db.session.delete(resource)
db.session.commit()
# Delete the hard links for the picture and its thumbnail
os.unlink(path.join(config.DATA_PATH, "pictures", str(resource.id)))
os.unlink(path.join(config.DATA_PATH, "picture-thumbnails", str(resource.id)))
return flask.redirect("/")
@@ -1323,8 +1333,7 @@ def raw_picture_thumbnail(id):
if not path.exists(path.join(config.DATA_PATH, "picture-thumbnails", str(resource.id))):
pil_image = Image.open(path.join(config.DATA_PATH, "pictures", str(resource.id)))
pil_image.thumbnail(config.THUMBNAIL_SIZE)
pil_image = pil_image.convert("RGB")
pil_image = make_thumbnail(pil_image)
pil_image.save(path.join(config.DATA_PATH, "picture-thumbnails", str(resource.id)), **config.THUMBNAIL_SAVE_OPTIONS)
response = flask.send_from_directory(path.join(config.DATA_PATH, "picture-thumbnails"),
@@ -1669,6 +1678,24 @@ def api_update_picture(id):
return flask.jsonify({"message": "Picture updated successfully"})
@app.route("/api/picture/<int:id>/delete", methods=["POST"])
def api_delete_picture(id):
resource = db.session.get(PictureResource, id)
if resource is None:
return flask.jsonify({"error": "Picture not found"}), 404
current_user = db.session.get(User, flask.session.get("username"))
if current_user is None:
return flask.jsonify({"error": "You must be logged in to delete pictures"}), 401
if resource.author != current_user and not current_user.admin:
return flask.jsonify({"error": "You are not the author of this picture"}), 403
PictureInGallery.query.filter_by(resource=resource).delete()
db.session.delete(resource)
db.session.commit()
return flask.jsonify({"message": "Picture deleted successfully"})
@app.route("/api/picture/<int:id>/rate", methods=["POST"])
def api_rate_picture(id):
resource = db.session.get(PictureResource, id)