roundabout,
created on Wednesday, 24 April 2024, 13:47:04 (1713966424),
received on Wednesday, 31 July 2024, 06:54:46 (1722408886)
Author identity: vlad <vlad.muntoiu@gmail.com>
514142621a78300c551c235634f71cb735513a4f
app.py
@@ -460,12 +460,30 @@ def repository_index(username, repository):
@app.route("/info/<username>/avatar")
def user_avatar(username):
serverUserdataLocation = os.path.join(config.USERDATA_PATH, username)
if not os.path.exists(serverUserdataLocation):
server_userdata_location = os.path.join(config.USERDATA_PATH, username)
if not os.path.exists(server_userdata_location):
return flask.render_template("not-found.html"), 404
return flask.send_from_directory(serverUserdataLocation, "avatar.png")
return flask.send_from_directory(server_userdata_location, "avatar.png")
@app.route("/info/<username>/avatar", methods=["POST"])
def user_avatar_upload(username):
server_userdata_location = os.path.join(config.USERDATA_PATH, username)
if not os.path.exists(server_userdata_location):
flask.abort(404)
if not flask.session.get("username") == username:
flask.abort(403)
# Convert image to PNG
try:
image = Image.open(flask.request.files["avatar"])
except:
flask.abort(400)
image.save(os.path.join(server_userdata_location, "avatar.png"))
return flask.redirect(f"/{username}", code=303)
@app.route("/<username>/<repository>/raw/<branch>/<path:subpath>")
static/style.css
@@ -534,3 +534,24 @@ strong, em {
display: inline-flex;
margin: 0;
}
#change-avatar-label {
cursor: pointer;
position: relative;
width: max(25%, 128px);
aspect-ratio: 1/1;
border-radius: 50%;
overflow: hidden;
}
#change-avatar-label:hover::before {
position: absolute;
content: attr(data-change-label);
background: #00000080;
color: #ffffff;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
templates/user-settings.html
@@ -17,6 +17,20 @@
</x-buttonbox>
</section>
</article>
<article class="card">
<section class="card-main">
<h2>{% trans %}Avatar{% endtrans %}</h2>
<x-vbox>
<label for="change-avatar" id="change-avatar-label" data-change-label="{% trans %}Change{% endtrans %}">
<img src="/info/{{ user.username }}/avatar" alt="{{ user.username }}" class="avatar" style="width: 100%;">
</label>
<form method="post" enctype="multipart/form-data" action="/info/{{ user.username }}/avatar">
<input type="file" name="avatar" accept="image/*" style="display: none;" id="change-avatar">
<button type="submit">{% trans %}Update{% endtrans %}</button>
</form>
</x-vbox>
</section>
</article>
<article class="card">
<section class="card-main">
<form method="post">