mirror of
https://codeberg.org/rimu/pyfedi
synced 2025-01-23 19:36:56 -08:00
move import and export to dedicated form #316
rather than mixing it in with the settings
This commit is contained in:
parent
dfe976a8b6
commit
4fcdcc0b77
5 changed files with 95 additions and 39 deletions
|
@ -10,6 +10,9 @@
|
||||||
<a href="/user/settings/filters" class="btn {{ 'btn-primary' if request.path == '/user/settings/filters' else 'btn-outline-secondary' }}">
|
<a href="/user/settings/filters" class="btn {{ 'btn-primary' if request.path == '/user/settings/filters' else 'btn-outline-secondary' }}">
|
||||||
{{ _('Blocks & Filters') }}
|
{{ _('Blocks & Filters') }}
|
||||||
</a>
|
</a>
|
||||||
|
<a href="/user/settings/import_export" class="btn {{ 'btn-primary' if request.path == '/user/settings/import_export' else 'btn-outline-secondary' }}">
|
||||||
|
{{ _('Import & Export') }}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -34,14 +34,7 @@
|
||||||
{{ render_field(form.default_filter) }}
|
{{ render_field(form.default_filter) }}
|
||||||
{{ render_field(form.theme) }}
|
{{ render_field(form.theme) }}
|
||||||
{{ render_field(form.vote_privately) }}
|
{{ render_field(form.vote_privately) }}
|
||||||
<h5>Import</h5>
|
|
||||||
{{ render_field(form.import_file) }}
|
|
||||||
{{ render_field(form.submit) }}
|
{{ render_field(form.submit) }}
|
||||||
<hr>
|
|
||||||
<h5>Export</h5>
|
|
||||||
<p>Export community subscriptions and user settings</p>
|
|
||||||
{{ render_field(form.export_settings) }}
|
|
||||||
<hr>
|
|
||||||
</form>
|
</form>
|
||||||
<p class="mt-4 pt-4">
|
<p class="mt-4 pt-4">
|
||||||
<a class="btn btn-warning" href="{{ url_for('user.delete_account') }}">{{ _('Delete account') }}</a>
|
<a class="btn btn-warning" href="{{ url_for('user.delete_account') }}">{{ _('Delete account') }}</a>
|
||||||
|
|
35
app/templates/user/import_export.html
Normal file
35
app/templates/user/import_export.html
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{% if theme() and file_exists('app/templates/themes/' + theme() + '/base.html') %}
|
||||||
|
{% extends 'themes/' + theme() + '/base.html' %}
|
||||||
|
{% else %}
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% endif %} %}
|
||||||
|
{% from 'bootstrap/form.html' import render_field %}
|
||||||
|
{% set active_child = 'settings' %}
|
||||||
|
|
||||||
|
{% block app_content %}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-md-8 position-relative main_pane">
|
||||||
|
<nav class="mb-2" aria-label="breadcrumb" id="breadcrumb_nav" title="Navigation">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a href="/">{{ _('Home') }}</a></li>
|
||||||
|
<li class="breadcrumb-item"><a href="/u/{{ user.link() }}">{{ user.display_name() }}</a></li>
|
||||||
|
<li class="breadcrumb-item active">{{ _('Change settings') }}</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
<h1>{{ _('Change settings') }}</h1>
|
||||||
|
{% include "user/_user_nav.html" %}
|
||||||
|
<form method='post' enctype="multipart/form-data" role="form">
|
||||||
|
{{ form.csrf_token() }}
|
||||||
|
<h5>Import</h5>
|
||||||
|
{{ render_field(form.import_file) }}
|
||||||
|
{{ render_field(form.submit) }}
|
||||||
|
<hr>
|
||||||
|
<h5>Export</h5>
|
||||||
|
<p>Export community subscriptions and user settings</p>
|
||||||
|
{{ render_field(form.export_settings) }}
|
||||||
|
<hr>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -45,8 +45,6 @@ class SettingsForm(FlaskForm):
|
||||||
indexable = BooleanField(_l('My posts appear in search results'))
|
indexable = BooleanField(_l('My posts appear in search results'))
|
||||||
manually_approves_followers = BooleanField(_l('Manually approve followers'))
|
manually_approves_followers = BooleanField(_l('Manually approve followers'))
|
||||||
vote_privately = BooleanField(_l('Vote privately'))
|
vote_privately = BooleanField(_l('Vote privately'))
|
||||||
import_file = FileField(_l('Import community subscriptions and user blocks from Lemmy'))
|
|
||||||
export_settings = SubmitField(_l('Export'))
|
|
||||||
sorts = [('hot', _l('Hot')),
|
sorts = [('hot', _l('Hot')),
|
||||||
('top', _l('Top')),
|
('top', _l('Top')),
|
||||||
('new', _l('New')),
|
('new', _l('New')),
|
||||||
|
@ -65,6 +63,12 @@ class SettingsForm(FlaskForm):
|
||||||
submit = SubmitField(_l('Save settings'))
|
submit = SubmitField(_l('Save settings'))
|
||||||
|
|
||||||
|
|
||||||
|
class ImportExportForm(FlaskForm):
|
||||||
|
import_file = FileField(_l('Import community subscriptions and user blocks from Lemmy'))
|
||||||
|
export_settings = SubmitField(_l('Export'))
|
||||||
|
submit = SubmitField(_l('Import'))
|
||||||
|
|
||||||
|
|
||||||
class DeleteAccountForm(FlaskForm):
|
class DeleteAccountForm(FlaskForm):
|
||||||
submit = SubmitField(_l('Yes, delete my account'))
|
submit = SubmitField(_l('Yes, delete my account'))
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ from app.models import Post, Community, CommunityMember, User, PostReply, PostVo
|
||||||
InstanceBlock, NotificationSubscription, PostBookmark, PostReplyBookmark
|
InstanceBlock, NotificationSubscription, PostBookmark, PostReplyBookmark
|
||||||
from app.user import bp
|
from app.user import bp
|
||||||
from app.user.forms import ProfileForm, SettingsForm, DeleteAccountForm, ReportUserForm, \
|
from app.user.forms import ProfileForm, SettingsForm, DeleteAccountForm, ReportUserForm, \
|
||||||
FilterForm, KeywordFilterEditForm, RemoteFollowForm
|
FilterForm, KeywordFilterEditForm, RemoteFollowForm, ImportExportForm
|
||||||
from app.user.utils import purge_user_then_delete, unsubscribe_from_community
|
from app.user.utils import purge_user_then_delete, unsubscribe_from_community
|
||||||
from app.utils import get_setting, render_template, markdown_to_html, user_access, markdown_to_text, shorten_string, \
|
from app.utils import get_setting, render_template, markdown_to_html, user_access, markdown_to_text, shorten_string, \
|
||||||
is_image_url, ensure_directory_exists, gibberish, file_get_contents, community_membership, user_filters_home, \
|
is_image_url, ensure_directory_exists, gibberish, file_get_contents, community_membership, user_filters_home, \
|
||||||
|
@ -372,21 +372,7 @@ def change_settings():
|
||||||
('de', _l('German')),
|
('de', _l('German')),
|
||||||
('ja', _l('Japanese')),
|
('ja', _l('Japanese')),
|
||||||
]
|
]
|
||||||
# separate if to handle just the 'Export' button being clicked
|
if form.validate_on_submit():
|
||||||
if form.export_settings.data and form.validate():
|
|
||||||
# get the user settings for this user
|
|
||||||
buffer = export_user_settings(user)
|
|
||||||
|
|
||||||
# confirmation displayed to user when the page loads up again
|
|
||||||
flash(_('Export Complete.'))
|
|
||||||
|
|
||||||
# send the file to the user as a download
|
|
||||||
# the as_attachment=True results in flask
|
|
||||||
# redirecting to the current page, so no
|
|
||||||
# url_for needed here
|
|
||||||
return send_file(buffer, download_name=f'{user.user_name}_piefed_settings.json', as_attachment=True,
|
|
||||||
mimetype='application/json')
|
|
||||||
elif form.validate_on_submit():
|
|
||||||
propagate_indexable = form.indexable.data != current_user.indexable
|
propagate_indexable = form.indexable.data != current_user.indexable
|
||||||
current_user.newsletter = form.newsletter.data
|
current_user.newsletter = form.newsletter.data
|
||||||
current_user.searchable = form.searchable.data
|
current_user.searchable = form.searchable.data
|
||||||
|
@ -403,11 +389,57 @@ def change_settings():
|
||||||
current_user.alt_user_name = gibberish(randint(8, 20))
|
current_user.alt_user_name = gibberish(randint(8, 20))
|
||||||
else:
|
else:
|
||||||
current_user.alt_user_name = ''
|
current_user.alt_user_name = ''
|
||||||
import_file = request.files['import_file']
|
|
||||||
if propagate_indexable:
|
if propagate_indexable:
|
||||||
db.session.execute(text('UPDATE "post" set indexable = :indexable WHERE user_id = :user_id'),
|
db.session.execute(text('UPDATE "post" set indexable = :indexable WHERE user_id = :user_id'),
|
||||||
{'user_id': current_user.id,
|
{'user_id': current_user.id,
|
||||||
'indexable': current_user.indexable})
|
'indexable': current_user.indexable})
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
flash(_('Your changes have been saved.'), 'success')
|
||||||
|
return redirect(url_for('user.change_settings'))
|
||||||
|
elif request.method == 'GET':
|
||||||
|
form.newsletter.data = current_user.newsletter
|
||||||
|
form.email_unread.data = current_user.email_unread
|
||||||
|
form.searchable.data = current_user.searchable
|
||||||
|
form.indexable.data = current_user.indexable
|
||||||
|
form.default_sort.data = current_user.default_sort
|
||||||
|
form.default_filter.data = current_user.default_filter
|
||||||
|
form.theme.data = current_user.theme
|
||||||
|
form.markdown_editor.data = current_user.markdown_editor
|
||||||
|
form.interface_language.data = current_user.interface_language
|
||||||
|
form.vote_privately.data = current_user.vote_privately()
|
||||||
|
|
||||||
|
return render_template('user/edit_settings.html', title=_('Edit profile'), form=form, user=current_user,
|
||||||
|
moderating_communities=moderating_communities(current_user.get_id()),
|
||||||
|
joined_communities=joined_communities(current_user.get_id()),
|
||||||
|
menu_topics=menu_topics(), site=g.site
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/user/settings/import_export', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def user_settings_import_export():
|
||||||
|
user = User.query.filter_by(id=current_user.id, deleted=False, banned=False, ap_id=None).first()
|
||||||
|
if user is None:
|
||||||
|
abort(404)
|
||||||
|
form = ImportExportForm()
|
||||||
|
# separate if to handle just the 'Export' button being clicked
|
||||||
|
if form.export_settings.data and form.validate():
|
||||||
|
# get the user settings for this user
|
||||||
|
buffer = export_user_settings(user)
|
||||||
|
|
||||||
|
# confirmation displayed to user when the page loads up again
|
||||||
|
flash(_('Export Complete.'))
|
||||||
|
|
||||||
|
# send the file to the user as a download
|
||||||
|
# the as_attachment=True results in flask
|
||||||
|
# redirecting to the current page, so no
|
||||||
|
# url_for needed here
|
||||||
|
return send_file(buffer, download_name=f'{user.user_name}_piefed_settings.json', as_attachment=True,
|
||||||
|
mimetype='application/json')
|
||||||
|
elif form.validate_on_submit():
|
||||||
|
import_file = request.files['import_file']
|
||||||
if import_file and import_file.filename != '':
|
if import_file and import_file.filename != '':
|
||||||
file_ext = os.path.splitext(import_file.filename)[1]
|
file_ext = os.path.splitext(import_file.filename)[1]
|
||||||
if file_ext.lower() != '.json':
|
if file_ext.lower() != '.json':
|
||||||
|
@ -428,20 +460,9 @@ def change_settings():
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
flash(_('Your changes have been saved.'), 'success')
|
flash(_('Your changes have been saved.'), 'success')
|
||||||
return redirect(url_for('user.change_settings'))
|
return redirect(url_for('user.user_settings_import_export'))
|
||||||
elif request.method == 'GET':
|
|
||||||
form.newsletter.data = current_user.newsletter
|
|
||||||
form.email_unread.data = current_user.email_unread
|
|
||||||
form.searchable.data = current_user.searchable
|
|
||||||
form.indexable.data = current_user.indexable
|
|
||||||
form.default_sort.data = current_user.default_sort
|
|
||||||
form.default_filter.data = current_user.default_filter
|
|
||||||
form.theme.data = current_user.theme
|
|
||||||
form.markdown_editor.data = current_user.markdown_editor
|
|
||||||
form.interface_language.data = current_user.interface_language
|
|
||||||
form.vote_privately.data = current_user.vote_privately()
|
|
||||||
|
|
||||||
return render_template('user/edit_settings.html', title=_('Edit profile'), form=form, user=current_user,
|
return render_template('user/import_export.html', title=_('Import & Export'), form=form, user=current_user,
|
||||||
moderating_communities=moderating_communities(current_user.get_id()),
|
moderating_communities=moderating_communities(current_user.get_id()),
|
||||||
joined_communities=joined_communities(current_user.get_id()),
|
joined_communities=joined_communities(current_user.get_id()),
|
||||||
menu_topics=menu_topics(), site=g.site
|
menu_topics=menu_topics(), site=g.site
|
||||||
|
|
Loading…
Add table
Reference in a new issue