diff --git a/warehouse/locale/messages.pot b/warehouse/locale/messages.pot index 6be0ddeaba94..36337e664c6c 100644 --- a/warehouse/locale/messages.pot +++ b/warehouse/locale/messages.pot @@ -307,11 +307,11 @@ msgid "" "cannot be added as a ${role_name} for organization" msgstr "" -#: warehouse/manage/views.py:1269 warehouse/manage/views.py:2413 +#: warehouse/manage/views.py:1269 warehouse/manage/views.py:2478 msgid "User '${username}' already has an active invite. Please try again later." msgstr "" -#: warehouse/manage/views.py:1311 warehouse/manage/views.py:2471 +#: warehouse/manage/views.py:1311 warehouse/manage/views.py:2536 msgid "Invitation sent to '${username}'" msgstr "" @@ -319,31 +319,31 @@ msgstr "" msgid "Could not find organization invitation." msgstr "" -#: warehouse/manage/views.py:1380 warehouse/manage/views.py:2529 +#: warehouse/manage/views.py:1380 warehouse/manage/views.py:2594 msgid "Invitation already expired." msgstr "" -#: warehouse/manage/views.py:1398 warehouse/manage/views.py:2553 +#: warehouse/manage/views.py:1398 warehouse/manage/views.py:2618 msgid "Invitation revoked from '${username}'." msgstr "" -#: warehouse/manage/views.py:1708 +#: warehouse/manage/views.py:1773 msgid "" "There have been too many attempted OpenID Connect registrations. Try " "again later." msgstr "" -#: warehouse/manage/views.py:2389 +#: warehouse/manage/views.py:2454 msgid "User '${username}' already has ${role_name} role for project" msgstr "" -#: warehouse/manage/views.py:2400 +#: warehouse/manage/views.py:2465 msgid "" "User '${username}' does not have a verified primary email address and " "cannot be added as a ${role_name} for project" msgstr "" -#: warehouse/manage/views.py:2518 +#: warehouse/manage/views.py:2583 msgid "Could not find role invitation." msgstr "" diff --git a/warehouse/manage/views.py b/warehouse/manage/views.py index 2367cbd30a52..0dd1015ea794 100644 --- a/warehouse/manage/views.py +++ b/warehouse/manage/views.py @@ -1487,68 +1487,67 @@ def change_organization_role( @view_config( - route_name="manage.project.delete_role", - context=Project, + route_name="manage.organization.delete_role", + context=Organization, uses_session=True, require_methods=["POST"], - permission="manage:project", + # permission="manage:organization", has_translations=True, require_reauth=True, ) -def delete_project_role(project, request): +def delete_organization_role(organization, request): try: role = ( - request.db.query(Role) + request.db.query(OrganizationRole) .join(User) - .filter(Role.project == project) - .filter(Role.id == request.POST["role_id"]) + .filter(OrganizationRole.organization == organization) + .filter(OrganizationRole.id == request.POST["role_id"]) .one() ) - removing_self = role.role_name == "Owner" and role.user == request.user + removing_self = ( + role.role_name == OrganizationRoleType.Owner and role.user == request.user + ) if removing_self: request.session.flash("Cannot remove yourself as Owner", queue="error") else: request.db.delete(role) - request.db.add( - JournalEntry( - name=project.name, - action=f"remove {role.role_name} {role.user.username}", - submitted_by=request.user, - submitted_from=request.remote_addr, - ) - ) - project.record_event( - tag="project:role:delete", + organization.record_event( + tag="organization:role:delete", ip_address=request.remote_addr, additional={ - "submitted_by": request.user.username, - "role_name": role.role_name, - "target_user": role.user.username, + "submitted_by_user_id": str(request.user.id), + "role_name": role.role_name.value, + "target_user_id": str(role.user.id), }, ) - owner_users = set(project_owners(request, project)) + owner_users = set(organization_owners(request, organization)) + # Don't send owner notification email to new user # if they are now an owner owner_users.discard(role.user) - send_collaborator_removed_email( - request, - owner_users, - user=role.user, - submitter=request.user, - project_name=project.name, - ) - - send_removed_as_collaborator_email( - request, role.user, submitter=request.user, project_name=project.name - ) - request.session.flash("Removed role", queue="success") + # TODO: Send notification emails. + # send_member_removed_email( + # request, + # owner_users, + # user=role.user, + # submitter=request.user, + # organization_name=organization.name, + # ) + # + # send_removed_as_member_email( + # request, role.user, submitter=request.user, organization_name=organization.name + # ) + + request.session.flash("Removed member", queue="success") except NoResultFound: - request.session.flash("Could not find role", queue="error") + request.session.flash("Could not find member", queue="error") return HTTPSeeOther( - request.route_path("manage.project.roles", project_name=project.name) + request.route_path( + "manage.organization.roles", organization_name=organization.name + ) ) diff --git a/warehouse/routes.py b/warehouse/routes.py index 4c942f11a971..db4120be7740 100644 --- a/warehouse/routes.py +++ b/warehouse/routes.py @@ -248,6 +248,13 @@ def includeme(config): traverse="/{organization_name}", domain=warehouse, ) + config.add_route( + "manage.organization.delete_role", + "/manage/organization/{organization_name}/people/delete/", + factory="warehouse.organizations.models:OrganizationFactory", + traverse="/{organization_name}", + domain=warehouse, + ) config.add_route("manage.projects", "/manage/projects/", domain=warehouse) config.add_route( "manage.project.settings", diff --git a/warehouse/templates/manage/organization/roles.html b/warehouse/templates/manage/organization/roles.html index f18d79d7ea28..42184ef4fb1f 100644 --- a/warehouse/templates/manage/organization/roles.html +++ b/warehouse/templates/manage/organization/roles.html @@ -112,7 +112,7 @@