diff --git a/app/admin/forms.py b/app/admin/forms.py index 004525bf..6a759280 100644 --- a/app/admin/forms.py +++ b/app/admin/forms.py @@ -117,6 +117,11 @@ class AddUserForm(FlaskForm): ignore_bots = BooleanField(_l('Hide posts by bots')) nsfw = BooleanField(_l('Show NSFW posts')) nsfl = BooleanField(_l('Show NSFL posts')) + role_options = [(2, _l('User')), + (3, _l('Staff')), + (4, _l('Admin')), + ] + role = SelectField(_l('Role'), choices=role_options, default=2, coerce=int) submit = SubmitField(_l('Save')) def validate_email(self, email): @@ -174,6 +179,11 @@ class EditUserForm(FlaskForm): searchable = BooleanField(_l('Show profile in user list')) indexable = BooleanField(_l('Allow search engines to index this profile')) manually_approves_followers = BooleanField(_l('Manually approve followers')) + role_options = [(2, _l('User')), + (3, _l('Staff')), + (4, _l('Admin')), + ] + role = SelectField(_l('Role'), choices=role_options, default=2, coerce=int) submit = SubmitField(_l('Save')) diff --git a/app/admin/routes.py b/app/admin/routes.py index 77f22043..9811da09 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -15,7 +15,7 @@ from app.admin.forms import FederationForm, SiteMiscForm, SiteProfileForm, EditC from app.admin.util import unsubscribe_from_everything_then_delete, unsubscribe_from_community, send_newsletter from app.community.util import save_icon_file, save_banner_file from app.models import AllowedInstances, BannedInstances, ActivityPubLog, utcnow, Site, Community, CommunityMember, \ - User, Instance, File, Report, Topic, UserRegistration + User, Instance, File, Report, Topic, UserRegistration, Role from app.utils import render_template, permission_required, set_setting, get_setting, gibberish, markdown_to_html, \ moderating_communities, joined_communities, finalize_user_setup, theme_list from app.admin import bp @@ -553,6 +553,13 @@ def admin_user_edit(user_id): user.searchable = form.searchable.data user.indexable = form.indexable.data user.ap_manually_approves_followers = form.manually_approves_followers.data + + # Update user roles. The UI only lets the user choose 1 role but the DB structure allows for multiple roles per user. + for role in user.roles: + if role.id != form.role.data: + user.roles.remove(role) + user.roles.append(Role.query.get(form.role.data)) + db.session.commit() user.flush_cache() flash(_('Saved')) @@ -573,6 +580,8 @@ def admin_user_edit(user_id): form.searchable.data = user.searchable form.indexable.data = user.indexable form.manually_approves_followers.data = user.ap_manually_approves_followers + if user.roles: + form.role.data = user.roles[0].id return render_template('admin/edit_user.html', title=_('Edit user'), form=form, user=user, moderating_communities=moderating_communities(current_user.get_id()), @@ -635,6 +644,7 @@ def admin_users_add(): user.ap_profile_id = f"https://{current_app.config['SERVER_NAME']}/u/{user.user_name}" user.ap_public_url = f"https://{current_app.config['SERVER_NAME']}/u/{user.user_name}" user.ap_inbox_url = f"https://{current_app.config['SERVER_NAME']}/u/{user.user_name}/inbox" + user.roles.append(Role.query.get(form.role.data)) db.session.add(user) db.session.commit() diff --git a/app/templates/admin/add_user.html b/app/templates/admin/add_user.html index 5b83db59..fafcbbf2 100644 --- a/app/templates/admin/add_user.html +++ b/app/templates/admin/add_user.html @@ -39,6 +39,7 @@ {{ render_field(form.newsletter) }} {{ render_field(form.nsfw) }} {{ render_field(form.nsfl) }} + {{ render_field(form.role) }} {{ render_field(form.submit) }} diff --git a/app/templates/admin/edit_user.html b/app/templates/admin/edit_user.html index 5aa8c2c8..9e2d7b8c 100644 --- a/app/templates/admin/edit_user.html +++ b/app/templates/admin/edit_user.html @@ -39,6 +39,7 @@ {{ render_field(form.searchable) }} {{ render_field(form.indexable) }} {{ render_field(form.manually_approves_followers) }} + {{ render_field(form.role) }} {{ render_field(form.submit) }}