diff --git a/pagure/forms.py b/pagure/forms.py index d6d0e24..8802c98 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -359,7 +359,23 @@ class CommentForm(wtf.Form): [wtforms.validators.Required(), file_virus_validator]) -class NewGroupForm(wtf.Form): +class EditGroupForm(wtf.Form): + """ Form to ask for a password change. """ + display_name = wtforms.TextField( + 'Group name to display *', + [ + wtforms.validators.Required(), + ] + ) + description = wtforms.TextField( + 'Description *', + [ + wtforms.validators.Required(), + ] + ) + + +class NewGroupForm(EditGroupForm): """ Form to ask for a password change. """ group_name = wtforms.TextField( 'Group name *', diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 73a0ad5..03efeca 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2498,6 +2498,51 @@ def add_user_to_group(session, username, group, user, is_admin): new_user.username, group.group_name) +def edit_group_info( + session, group, display_name, description, user, is_admin): + ''' Edit the information regarding a given group. + ''' + action_user = user + user = search_user(session, username=user) + if not user: + raise pagure.exceptions.PagureException( + 'No user `%s` found' % action_user) + + if group.group_name not in user.groups \ + and not is_admin \ + and user.username != group.creator.username: + raise pagure.exceptions.PagureException( + 'You are not allowed to edit this group') + + edits = [] + if display_name and display_name != group.display_name: + group.display_name = display_name + edits.append('display_name') + if description and description != group.description: + group.description = description + edits.append('description') + + session.add(group) + session.flush() + + msg = 'Nothing changed' + if edits: + pagure.lib.notify.log( + None, + topic='group.edit', + msg=dict( + group=group.to_json(public=True), + fields=edits, + agent=user.username, + ), + redis=REDIS, + ) + msg = 'Group "%s" (%s) edited' % ( + group.display_name, group.group_name) + + return msg + + def delete_user_of_group(session, username, groupname, user, is_admin, force=False): ''' Removes the specified user from the given group. diff --git a/pagure/templates/edit_group.html b/pagure/templates/edit_group.html new file mode 100644 index 0000000..8013b60 --- /dev/null +++ b/pagure/templates/edit_group.html @@ -0,0 +1,32 @@ +{% extends "master.html" %} +{% from "_formhelper.html" import render_field_in_row %} + +{% set tag = "groups" %} +{% block title %}Edit group: {{ group.group_name }}{% endblock %} + + +{% block content %} + +

Edit group: {{ group.group_name }}

+ +
+
+ + + {{ render_field_in_row(form.display_name) }} + {{ render_field_in_row(form.description) }} + {%- if admin %} + {{ render_field_in_row(form.group_type) }} + {%- endif %} +
+

+ + + {{ form.csrf_token }} +

+
+
+ +{% endblock %} diff --git a/pagure/ui/groups.py b/pagure/ui/groups.py index a1183ca..877333d 100644 --- a/pagure/ui/groups.py +++ b/pagure/ui/groups.py @@ -114,6 +114,63 @@ def view_group(group): ) +@pagure.APP.route('/group//edit/', methods=['GET', 'POST']) +@pagure.APP.route('/group//edit', methods=['GET', 'POST']) +@pagure.login_required +def edit_group(group): + ''' Allows editing the information about this group. ''' + if not pagure.APP.config.get('ENABLE_USER_MNGT', True): + flask.abort(404) + + group_type = 'user' + is_admin = pagure.is_admin() + if is_admin: + group_type = None + group = pagure.lib.search_groups( + pagure.SESSION, group_name=group, group_type=group_type) + + if not group: + flask.abort(404, 'Group not found') + + # Edit group info + form = pagure.forms.EditGroupForm() + if form.validate_on_submit(): + + try: + msg = pagure.lib.edit_group_info( + pagure.SESSION, + group=group, + display_name=form.display_name.data, + description=form.description.data, + user=flask.g.fas_user.username, + is_admin=is_admin, + ) + pagure.SESSION.commit() + flask.flash(msg) + return flask.redirect( + flask.url_for('.view_group', group=group.group_name)) + except pagure.exceptions.PagureException as err: + pagure.SESSION.rollback() + flask.flash(err.message, 'error') + return flask.redirect( + flask.url_for('.view_group', group=group.group_name)) + except SQLAlchemyError as err: # pragma: no cover + pagure.SESSION.rollback() + flask.flash( + 'Could not edit group `%s`.' % (group.group_name), + 'error') + pagure.APP.logger.debug( + 'Could not edit group `%s`.' % (group.group_name)) + pagure.APP.logger.exception(err) + + + return flask.render_template( + 'edit_group.html', + group=group, + form=form, + ) + + @pagure.APP.route('/group///delete', methods=['POST']) @pagure.login_required def group_user_delete(user, group):