Add ability to rotate a photo
This commit is contained in:
parent
95da4b19a1
commit
200befc65f
|
@ -195,12 +195,47 @@ def edit_photo(key, data):
|
||||||
|
|
||||||
album = index["map"][key]
|
album = index["map"][key]
|
||||||
|
|
||||||
logger.info("Completely deleting the photo {} from album {}".format(key, album))
|
logger.info("Updating data for the photo {} from album {}".format(key, album))
|
||||||
index["albums"][album][key].update(data)
|
index["albums"][album][key].update(data)
|
||||||
|
|
||||||
write_index(index)
|
write_index(index)
|
||||||
|
|
||||||
|
|
||||||
|
def rotate_photo(key, rotate):
|
||||||
|
"""Rotate a photo 90 degrees to the left or right."""
|
||||||
|
photo = get_photo(key)
|
||||||
|
if not photo: return
|
||||||
|
|
||||||
|
# Degrees to rotate.
|
||||||
|
degrees = None
|
||||||
|
if rotate == "left":
|
||||||
|
degrees = 90
|
||||||
|
elif rotate == "right":
|
||||||
|
degrees = -90
|
||||||
|
else:
|
||||||
|
degrees = 180
|
||||||
|
|
||||||
|
new_names = dict()
|
||||||
|
for size in ["large", "thumb", "avatar"]:
|
||||||
|
fname = os.path.join(config.PHOTO_ROOT_PRIVATE, photo[size])
|
||||||
|
logger.info("Rotating image {} by {} degrees.".format(fname, degrees))
|
||||||
|
|
||||||
|
# Give it a new name.
|
||||||
|
filetype = fname.split(".")[-1]
|
||||||
|
outfile = random_name(filetype)
|
||||||
|
new_names[size] = outfile
|
||||||
|
|
||||||
|
img = Image.open(fname)
|
||||||
|
img = img.rotate(degrees)
|
||||||
|
img.save(os.path.join(config.PHOTO_ROOT_PRIVATE, outfile))
|
||||||
|
|
||||||
|
# Delete the old name.
|
||||||
|
os.unlink(fname)
|
||||||
|
|
||||||
|
# Save the new image names.
|
||||||
|
edit_photo(key, new_names)
|
||||||
|
|
||||||
|
|
||||||
def delete_photo(key):
|
def delete_photo(key):
|
||||||
"""Delete a photo."""
|
"""Delete a photo."""
|
||||||
index = get_index()
|
index = get_index()
|
||||||
|
@ -216,7 +251,9 @@ def delete_photo(key):
|
||||||
# Delete all the images.
|
# Delete all the images.
|
||||||
for size in ["large", "thumb", "avatar"]:
|
for size in ["large", "thumb", "avatar"]:
|
||||||
logger.info("Delete: {}".format(photo[size]))
|
logger.info("Delete: {}".format(photo[size]))
|
||||||
os.unlink(os.path.join(config.PHOTO_ROOT_PRIVATE, photo[size]))
|
fname = os.path.join(config.PHOTO_ROOT_PRIVATE, photo[size])
|
||||||
|
if os.path.isfile(fname):
|
||||||
|
os.unlink(fname)
|
||||||
|
|
||||||
# Delete it from the sort list.
|
# Delete it from the sort list.
|
||||||
index["photo-order"][album].remove(key)
|
index["photo-order"][album].remove(key)
|
||||||
|
@ -543,6 +580,7 @@ def write_index(index):
|
||||||
|
|
||||||
def random_name(filetype):
|
def random_name(filetype):
|
||||||
"""Get a random available file name to save a new photo."""
|
"""Get a random available file name to save a new photo."""
|
||||||
|
filetype = filetype.lower()
|
||||||
outfile = random_hash() + "." + filetype
|
outfile = random_hash() + "." + filetype
|
||||||
while os.path.isfile(os.path.join(config.PHOTO_ROOT_PRIVATE, outfile)):
|
while os.path.isfile(os.path.join(config.PHOTO_ROOT_PRIVATE, outfile)):
|
||||||
outfile = random_hash() + "." + filetype
|
outfile = random_hash() + "." + filetype
|
||||||
|
|
|
@ -195,7 +195,13 @@ def edit(key):
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
caption = request.form.get("caption", "")
|
caption = request.form.get("caption", "")
|
||||||
|
rotate = request.form.get("rotate", "")
|
||||||
Photo.edit_photo(key, dict(caption=caption))
|
Photo.edit_photo(key, dict(caption=caption))
|
||||||
|
|
||||||
|
# Rotating the photo?
|
||||||
|
if rotate in ["left", "right", "180"]:
|
||||||
|
Photo.rotate_photo(key, rotate)
|
||||||
|
|
||||||
flash("The photo has been updated.")
|
flash("The photo has been updated.")
|
||||||
return redirect(url_for(".view_photo", key=key))
|
return redirect(url_for(".view_photo", key=key))
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,20 @@
|
||||||
<strong>Photo Caption:</strong><br>
|
<strong>Photo Caption:</strong><br>
|
||||||
<input type="text" size="40" name="caption" value="{{ photo['caption'] }}"><p>
|
<input type="text" size="40" name="caption" value="{{ photo['caption'] }}"><p>
|
||||||
|
|
||||||
|
Rotate:
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="rotate" value="" checked> Leave alone
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="rotate" value="left"> Left 90°
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="rotate" value="right"> Right 90°
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="rotate" value="180"> 180°
|
||||||
|
</label><p>
|
||||||
|
|
||||||
<button type="submit">Save Changes</button>
|
<button type="submit">Save Changes</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user