diff --git a/tests/unit/manage/test_views.py b/tests/unit/manage/test_views.py index 876b2979ca53..ddcdf1c33be3 100644 --- a/tests/unit/manage/test_views.py +++ b/tests/unit/manage/test_views.py @@ -1363,6 +1363,41 @@ def test_default_response(self, monkeypatch): "delete_macaroon_form": delete_macaroon_obj, } + def test_project_names(self, db_request): + user = UserFactory.create() + another_user = UserFactory.create() + + db_request.user = user + db_request.find_service = lambda *a, **kw: pretend.stub() + + # A project with a sole owner that is the user + with_sole_owner = ProjectFactory.create(name="foo") + RoleFactory.create(user=user, project=with_sole_owner, role_name="Owner") + RoleFactory.create( + user=another_user, project=with_sole_owner, role_name="Maintainer" + ) + + # A project with multiple owners, including the user + with_multiple_owners = ProjectFactory.create(name="bar") + RoleFactory.create(user=user, project=with_multiple_owners, role_name="Owner") + RoleFactory.create( + user=another_user, project=with_multiple_owners, role_name="Owner" + ) + + # A project with a sole owner that is not the user + not_an_owner = ProjectFactory.create(name="baz") + RoleFactory.create(user=user, project=not_an_owner, role_name="Maintainer") + RoleFactory.create(user=another_user, project=not_an_owner, role_name="Owner") + + # A project that the user is neither owner nor maintainer of + neither_owner_nor_maintainer = ProjectFactory.create(name="quux") + RoleFactory.create( + user=another_user, project=neither_owner_nor_maintainer, role_name="Owner" + ) + + view = views.ProvisionMacaroonViews(db_request) + assert set(view.project_names) == {"foo", "bar", "baz"} + def test_manage_macaroons(self, monkeypatch): request = pretend.stub(find_service=lambda *a, **kw: pretend.stub()) @@ -1412,10 +1447,10 @@ def test_create_macaroon_invalid_form(self, monkeypatch): ) monkeypatch.setattr(views, "CreateMacaroonForm", create_macaroon_cls) - user_projects = pretend.call_recorder( - lambda r: {"projects_owned": [pretend.stub(name=pretend.stub())]} + project_names = [pretend.stub()] + monkeypatch.setattr( + views.ProvisionMacaroonViews, "project_names", project_names ) - monkeypatch.setattr(views, "user_projects", user_projects) default_response = {"default": "response"} monkeypatch.setattr( @@ -1458,11 +1493,10 @@ def test_create_macaroon(self, monkeypatch): ) monkeypatch.setattr(views, "CreateMacaroonForm", create_macaroon_cls) - project_name = pretend.stub() - user_projects = pretend.call_recorder( - lambda r: {"projects_owned": [pretend.stub(name=project_name)]} + project_names = [pretend.stub()] + monkeypatch.setattr( + views.ProvisionMacaroonViews, "project_names", project_names ) - monkeypatch.setattr(views, "user_projects", user_projects) default_response = {"default": "response"} monkeypatch.setattr( diff --git a/warehouse/manage/views.py b/warehouse/manage/views.py index 7e1f5e1dd63e..2b523c493abf 100644 --- a/warehouse/manage/views.py +++ b/warehouse/manage/views.py @@ -559,8 +559,7 @@ def __init__(self, request): @property def project_names(self): - projects = user_projects(self.request)["projects_owned"] - return [project.name for project in projects] + return sorted(project.name for project in self.request.user.projects) @property def default_response(self): diff --git a/warehouse/templates/manage/account.html b/warehouse/templates/manage/account.html index a19d0ddfd330..63a17b646429 100644 --- a/warehouse/templates/manage/account.html +++ b/warehouse/templates/manage/account.html @@ -152,7 +152,7 @@ All projects {% else %} {% for project in macaroon.caveats.get("permissions")['projects'] %} - {{ project }} + {{ project }} {% endfor %} {% endif %} diff --git a/warehouse/templates/manage/token.html b/warehouse/templates/manage/token.html index daecf4e56425..4b0cfcb6ca20 100644 --- a/warehouse/templates/manage/token.html +++ b/warehouse/templates/manage/token.html @@ -88,6 +88,7 @@

Add another token