mirror of
https://codeberg.org/rimu/pyfedi
synced 2025-01-23 19:36:56 -08:00
users can remove profile pics (communities too)
This commit is contained in:
parent
11ce2919dd
commit
d1f7d35a83
7 changed files with 127 additions and 5 deletions
|
@ -506,8 +506,11 @@ def refresh_user_profile_task(user_id):
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
if user.avatar_id and avatar_changed:
|
if user.avatar_id and avatar_changed:
|
||||||
make_image_sizes(user.avatar_id, 40, 250, 'users')
|
make_image_sizes(user.avatar_id, 40, 250, 'users')
|
||||||
|
cache.delete_memoized(User.avatar_image, user)
|
||||||
|
cache.delete_memoized(User.avatar_thumbnail, user)
|
||||||
if user.cover_id and cover_changed:
|
if user.cover_id and cover_changed:
|
||||||
make_image_sizes(user.cover_id, 700, 1600, 'users')
|
make_image_sizes(user.cover_id, 700, 1600, 'users')
|
||||||
|
cache.delete_memoized(User.cover_image, user)
|
||||||
|
|
||||||
|
|
||||||
def refresh_community_profile(community_id):
|
def refresh_community_profile(community_id):
|
||||||
|
|
|
@ -1099,6 +1099,7 @@ def community_edit(community_id: int):
|
||||||
file = save_icon_file(icon_file)
|
file = save_icon_file(icon_file)
|
||||||
if file:
|
if file:
|
||||||
community.icon = file
|
community.icon = file
|
||||||
|
cache.delete_memoized(Community.icon_image, community)
|
||||||
banner_file = request.files['banner_file']
|
banner_file = request.files['banner_file']
|
||||||
if banner_file and banner_file.filename != '':
|
if banner_file and banner_file.filename != '':
|
||||||
if community.image_id:
|
if community.image_id:
|
||||||
|
@ -1106,6 +1107,7 @@ def community_edit(community_id: int):
|
||||||
file = save_banner_file(banner_file)
|
file = save_banner_file(banner_file)
|
||||||
if file:
|
if file:
|
||||||
community.image = file
|
community.image = file
|
||||||
|
cache.delete_memoized(Community.header_image, community)
|
||||||
|
|
||||||
# Languages of the community
|
# Languages of the community
|
||||||
db.session.execute(text('DELETE FROM "community_language" WHERE community_id = :community_id'),
|
db.session.execute(text('DELETE FROM "community_language" WHERE community_id = :community_id'),
|
||||||
|
@ -1140,6 +1142,38 @@ def community_edit(community_id: int):
|
||||||
abort(401)
|
abort(401)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/community/<int:community_id>/remove_icon', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def remove_icon(community_id):
|
||||||
|
community = Community.query.get_or_404(community_id)
|
||||||
|
if community.icon_id:
|
||||||
|
community.icon.delete_from_disk()
|
||||||
|
if community.icon_id:
|
||||||
|
file = File.query.get(community.icon_id)
|
||||||
|
file.delete_from_disk()
|
||||||
|
community.icon_id = None
|
||||||
|
db.session.delete(file)
|
||||||
|
db.session.commit()
|
||||||
|
cache.delete_memoized(Community.icon_image, community)
|
||||||
|
return _('Icon removed!')
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/community/<int:community_id>/remove_header', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def remove_header(community_id):
|
||||||
|
community = Community.query.get_or_404(community_id)
|
||||||
|
if community.image_id:
|
||||||
|
community.image.delete_from_disk()
|
||||||
|
if community.image_id:
|
||||||
|
file = File.query.get(community.image_id)
|
||||||
|
file.delete_from_disk()
|
||||||
|
community.image_id = None
|
||||||
|
db.session.delete(file)
|
||||||
|
db.session.commit()
|
||||||
|
cache.delete_memoized(Community.header_image, community)
|
||||||
|
return '<div> ' + _('Banner removed!') + '</div>'
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/community/<int:community_id>/delete', methods=['GET', 'POST'])
|
@bp.route('/community/<int:community_id>/delete', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def community_delete(community_id: int):
|
def community_delete(community_id: int):
|
||||||
|
|
|
@ -669,7 +669,7 @@ class User(UserMixin, db.Model):
|
||||||
else:
|
else:
|
||||||
return '[deleted]'
|
return '[deleted]'
|
||||||
|
|
||||||
@cache.memoize(timeout=10)
|
@cache.memoize(timeout=500)
|
||||||
def avatar_thumbnail(self) -> str:
|
def avatar_thumbnail(self) -> str:
|
||||||
if self.avatar_id is not None:
|
if self.avatar_id is not None:
|
||||||
if self.avatar.thumbnail_path is not None:
|
if self.avatar.thumbnail_path is not None:
|
||||||
|
@ -681,7 +681,7 @@ class User(UserMixin, db.Model):
|
||||||
return self.avatar_image()
|
return self.avatar_image()
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
@cache.memoize(timeout=10)
|
@cache.memoize(timeout=500)
|
||||||
def avatar_image(self) -> str:
|
def avatar_image(self) -> str:
|
||||||
if self.avatar_id is not None:
|
if self.avatar_id is not None:
|
||||||
if self.avatar.file_path is not None:
|
if self.avatar.file_path is not None:
|
||||||
|
@ -696,6 +696,7 @@ class User(UserMixin, db.Model):
|
||||||
return self.avatar.source_url
|
return self.avatar.source_url
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
@cache.memoize(timeout=500)
|
||||||
def cover_image(self) -> str:
|
def cover_image(self) -> str:
|
||||||
if self.cover_id is not None:
|
if self.cover_id is not None:
|
||||||
if self.cover.thumbnail_path is not None:
|
if self.cover.thumbnail_path is not None:
|
||||||
|
|
|
@ -12,8 +12,24 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
setupConversationChooser();
|
setupConversationChooser();
|
||||||
setupMarkdownEditorEnabler();
|
setupMarkdownEditorEnabler();
|
||||||
setupAddPollChoice();
|
setupAddPollChoice();
|
||||||
|
setupShowElementLinks();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// All elements with the class "showElement" will show the DOM element referenced by the data-id attribute
|
||||||
|
function setupShowElementLinks() {
|
||||||
|
var elements = document.querySelectorAll('.showElement');
|
||||||
|
elements.forEach(function(element) {
|
||||||
|
element.addEventListener('click', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
var dataId = this.getAttribute('data-id');
|
||||||
|
var targetElement = document.getElementById(dataId);
|
||||||
|
if (targetElement) {
|
||||||
|
targetElement.style.display = 'inherit';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function renderMasonry(masonry, htmlSnippets) {
|
function renderMasonry(masonry, htmlSnippets) {
|
||||||
const mainPane = document.querySelector('.main_pane');
|
const mainPane = document.querySelector('.main_pane');
|
||||||
const mainPaneWidth = mainPane.offsetWidth;
|
const mainPaneWidth = mainPane.offsetWidth;
|
||||||
|
@ -636,9 +652,12 @@ function setupMarkdownEditorEnabler() {
|
||||||
function setupAddPollChoice() {
|
function setupAddPollChoice() {
|
||||||
const addChoiceButton = document.getElementById('addPollChoice');
|
const addChoiceButton = document.getElementById('addPollChoice');
|
||||||
const pollChoicesFieldset = document.getElementById('pollChoicesFieldset');
|
const pollChoicesFieldset = document.getElementById('pollChoicesFieldset');
|
||||||
|
if(pollChoicesFieldset == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const formGroups = pollChoicesFieldset.getElementsByClassName('form-group');
|
const formGroups = pollChoicesFieldset.getElementsByClassName('form-group');
|
||||||
|
|
||||||
if(addChoiceButton) {
|
if(addChoiceButton && addChoiceButton) {
|
||||||
addChoiceButton.addEventListener('click', function(event) {
|
addChoiceButton.addEventListener('click', function(event) {
|
||||||
// Loop through the form groups and show the first hidden one
|
// Loop through the form groups and show the first hidden one
|
||||||
for (let i = 0; i < formGroups.length; i++) {
|
for (let i = 0; i < formGroups.length; i++) {
|
||||||
|
|
|
@ -31,15 +31,29 @@
|
||||||
{{ render_field(form.title) }}
|
{{ render_field(form.title) }}
|
||||||
{{ render_field(form.description) }}
|
{{ render_field(form.description) }}
|
||||||
{% if community.icon_id %}
|
{% if community.icon_id %}
|
||||||
<img class="community_icon_big rounded-circle" src="{{ community.icon_image() }}" />
|
<!-- <img class="community_icon_big rounded-circle" src="{{ community.icon_image() }}" /> -->
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ render_field(form.icon_file) }}
|
{{ render_field(form.icon_file) }}
|
||||||
<small class="field_hint">Provide a square image that looks good when small.</small>
|
<small class="field_hint">Provide a square image that looks good when small.</small>
|
||||||
{% if community.image_id %}
|
{% if community.image_id %}
|
||||||
<a href="{{ community.header_image() }}"><img class="community_icon_big" src="{{ community.header_image() }}" /></a>
|
<!-- <a href="{{ community.header_image() }}"><img class="community_icon_big" src="{{ community.header_image() }}" /></a> -->
|
||||||
|
{% endif %}
|
||||||
|
{% if community.icon_id %}
|
||||||
|
<p><a href="{{ community.icon_image() }}" class="btn btn-sm btn-primary showElement" data-id="icon_image">{{ _('View image') }}</a>
|
||||||
|
<a href="{{ url_for('community.remove_icon', community_id=community.id) }}" class="btn btn-sm btn-primary" hx-post="{{ url_for('community.remove_icon', community_id=community.id) }}" hx-target="#icon_image" hx-swap="outerHTML">{{ _('Delete image') }}</a>
|
||||||
|
</p>
|
||||||
|
<p><img id="icon_image" class="community_icon_big rounded-circle" loading="lazy" style="display: none;" src="{{ community.icon_image() }}" alt="{{ _('Profile pic') }}" /></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ render_field(form.banner_file) }}
|
{{ render_field(form.banner_file) }}
|
||||||
<small class="field_hint">Provide a wide image - letterbox orientation.</small>
|
<small class="field_hint">Provide a wide image - letterbox orientation.</small>
|
||||||
|
{% if community.image_id %}
|
||||||
|
<p><a href="{{ community.header_image() }}" class="btn btn-sm btn-primary showElement" data-id="image_div">{{ _('View image') }}</a>
|
||||||
|
<a href="{{ url_for('community.remove_header', community_id=community.id) }}" class="btn btn-sm btn-primary"
|
||||||
|
hx-post="{{ url_for('community.remove_header', community_id=community.id) }}"
|
||||||
|
hx-target="#image_div" hx-swap="outerHTML">{{ _('Delete image') }}</a>
|
||||||
|
</p>
|
||||||
|
<div id="image_div" class="community_header mb-4" style="display: none; height: 240px; background-image: url({{ community.header_image() }});"></div>
|
||||||
|
{% endif %}
|
||||||
{{ render_field(form.rules) }}
|
{{ render_field(form.rules) }}
|
||||||
{{ render_field(form.nsfw) }}
|
{{ render_field(form.nsfw) }}
|
||||||
{{ render_field(form.restricted_to_mods) }}
|
{{ render_field(form.restricted_to_mods) }}
|
||||||
|
|
|
@ -50,8 +50,25 @@
|
||||||
<h5> Profile Images </h5>
|
<h5> Profile Images </h5>
|
||||||
{{ render_field(form.profile_file) }}
|
{{ render_field(form.profile_file) }}
|
||||||
<small class="field_hint">Provide a square image that looks good when small.</small>
|
<small class="field_hint">Provide a square image that looks good when small.</small>
|
||||||
|
{% if user.avatar_id %}
|
||||||
|
<p><a href="{{ user.avatar_image() }}" class="btn btn-sm btn-primary showElement" data-id="avatar_image">{{ _('View image') }}</a>
|
||||||
|
<a href="{{ url_for('user.remove_avatar') }}" class="btn btn-sm btn-primary"
|
||||||
|
hx-post="{{ url_for('user.remove_avatar') }}"
|
||||||
|
hx-target="#avatar_image"
|
||||||
|
hx-swap="outerHTML">{{ _('Remove image') }}</a>
|
||||||
|
</p>
|
||||||
|
<p><img id="avatar_image" class="community_icon_big rounded-circle" loading="lazy" style="display: none;" src="{{ user.avatar_image() }}" alt="{{ _('Profile pic') }}" /></p>
|
||||||
|
{% endif %}
|
||||||
{{ render_field(form.banner_file) }}
|
{{ render_field(form.banner_file) }}
|
||||||
<small class="field_hint">Provide a wide image - letterbox orientation.</small>
|
<small class="field_hint">Provide a wide image - letterbox orientation.</small>
|
||||||
|
{% if user.cover_id %}
|
||||||
|
<p><a href="{{ user.cover_image() }}" class="btn btn-sm btn-primary showElement" data-id="cover_div">{{ _('View image') }}</a> |
|
||||||
|
<a href="{{ url_for('user.remove_cover') }}" class="btn btn-sm btn-primary"
|
||||||
|
hx-post="{{ url_for('user.remove_cover') }}"
|
||||||
|
hx-target="#cover_div"
|
||||||
|
hx-swap="outerHTML">{{ _('Remove image') }}</a></p>
|
||||||
|
<div id="cover_div" class="community_header mb-4" style="display: none; height: 240px; background-image: url({{ user.cover_image() }});"></div>
|
||||||
|
{% endif %}
|
||||||
{{ render_field(form.submit) }}
|
{{ render_field(form.submit) }}
|
||||||
</form>
|
</form>
|
||||||
<p class="mt-4 pt-4">
|
<p class="mt-4 pt-4">
|
||||||
|
|
|
@ -138,6 +138,8 @@ def edit_profile(actor):
|
||||||
file = save_icon_file(profile_file, 'users')
|
file = save_icon_file(profile_file, 'users')
|
||||||
if file:
|
if file:
|
||||||
current_user.avatar = file
|
current_user.avatar = file
|
||||||
|
cache.delete_memoized(User.avatar_image, current_user)
|
||||||
|
cache.delete_memoized(User.avatar_thumbnail, current_user)
|
||||||
banner_file = request.files['banner_file']
|
banner_file = request.files['banner_file']
|
||||||
if banner_file and banner_file.filename != '':
|
if banner_file and banner_file.filename != '':
|
||||||
# remove old cover
|
# remove old cover
|
||||||
|
@ -151,6 +153,7 @@ def edit_profile(actor):
|
||||||
file = save_banner_file(banner_file, 'users')
|
file = save_banner_file(banner_file, 'users')
|
||||||
if file:
|
if file:
|
||||||
current_user.cover = file
|
current_user.cover = file
|
||||||
|
cache.delete_memoized(User.cover_image, current_user)
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@ -171,6 +174,37 @@ def edit_profile(actor):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/user/remove_avatar', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def remove_avatar():
|
||||||
|
if current_user.avatar_id:
|
||||||
|
current_user.avatar.delete_from_disk()
|
||||||
|
if current_user.avatar_id:
|
||||||
|
file = File.query.get(current_user.avatar_id)
|
||||||
|
file.delete_from_disk()
|
||||||
|
current_user.avatar_id = None
|
||||||
|
db.session.delete(file)
|
||||||
|
db.session.commit()
|
||||||
|
cache.delete_memoized(User.avatar_image, current_user)
|
||||||
|
cache.delete_memoized(User.avatar_thumbnail, current_user)
|
||||||
|
return _('Avatar removed!')
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/user/remove_cover', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def remove_cover():
|
||||||
|
if current_user.cover_id:
|
||||||
|
current_user.cover.delete_from_disk()
|
||||||
|
if current_user.cover_id:
|
||||||
|
file = File.query.get(current_user.cover_id)
|
||||||
|
file.delete_from_disk()
|
||||||
|
current_user.cover_id = None
|
||||||
|
db.session.delete(file)
|
||||||
|
db.session.commit()
|
||||||
|
cache.delete_memoized(User.cover_image, current_user)
|
||||||
|
return '<div> ' + _('Banner removed!') + '</div>'
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/user/settings', methods=['GET', 'POST'])
|
@bp.route('/user/settings', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def change_settings():
|
def change_settings():
|
||||||
|
|
Loading…
Add table
Reference in a new issue