launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #26861
[Merge] ~pappacena/launchpad:oci-recipes-link-for-teams into launchpad:master
Thiago F. Pappacena has proposed merging ~pappacena/launchpad:oci-recipes-link-for-teams into launchpad:master.
Commit message:
Moving "View OCI recipe" link to correct place and adding it to team page
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~pappacena/launchpad/+git/launchpad/+merge/400897
--
Your team Launchpad code reviewers is requested to review the proposed merge of ~pappacena/launchpad:oci-recipes-link-for-teams into launchpad:master.
diff --git a/lib/lp/oci/browser/hasocirecipes.py b/lib/lp/oci/browser/hasocirecipes.py
new file mode 100644
index 0000000..2df4148
--- /dev/null
+++ b/lib/lp/oci/browser/hasocirecipes.py
@@ -0,0 +1,27 @@
+# Copyright 2021 Canonical Ltd. This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Mixins for browser classes for objects related to OCI recipe."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+ 'HasOCIRecipesMenuMixin',
+ ]
+
+from lp.oci.interfaces.ocirecipe import IOCIRecipeSet
+from zope.component import getUtility
+
+from lp.services.webapp import Link
+
+
+class HasOCIRecipesMenuMixin:
+ """A mixin for context menus for objects that has OCI recipes."""
+
+ def view_oci_recipes(self):
+ target = '+oci-recipes'
+ text = 'View OCI recipes'
+ enabled = not getUtility(IOCIRecipeSet).findByContext(
+ self.context, visible_by_user=self.user).is_empty()
+ return Link(target, text, enabled=enabled, icon='info')
diff --git a/lib/lp/registry/browser/person.py b/lib/lp/registry/browser/person.py
index 6d5d8da..2b71694 100644
--- a/lib/lp/registry/browser/person.py
+++ b/lib/lp/registry/browser/person.py
@@ -138,11 +138,9 @@ from lp.code.browser.sourcepackagerecipelisting import HasRecipesMenuMixin
from lp.code.errors import InvalidNamespace
from lp.code.interfaces.branchnamespace import IBranchNamespaceSet
from lp.code.interfaces.gitlookup import IGitTraverser
+from lp.oci.browser.hasocirecipes import HasOCIRecipesMenuMixin
from lp.oci.interfaces.ocipushrule import IOCIPushRuleSet
-from lp.oci.interfaces.ocirecipe import (
- IOCIRecipe,
- IOCIRecipeSet,
- )
+from lp.oci.interfaces.ocirecipe import IOCIRecipe
from lp.oci.interfaces.ociregistrycredentials import (
IOCIRegistryCredentialsSet,
OCIRegistryCredentialsAlreadyExist,
@@ -777,13 +775,6 @@ class CommonMenuLinks:
enabled = user_can_edit_credentials_for_owner(self.context, self.user)
return Link(target, text, enabled=enabled, icon='info')
- def oci_recipes(self):
- target = '+oci-recipes'
- text = 'OCI recipes'
- enabled = not getUtility(IOCIRecipeSet).findByContext(
- self.context, visible_by_user=self.user).is_empty()
- return Link(target, text, enabled=enabled, icon='info')
-
class PersonMenuMixin(CommonMenuLinks):
@@ -818,8 +809,8 @@ class PersonMenuMixin(CommonMenuLinks):
return Link(target, text, icon='edit')
-class PersonOverviewMenu(ApplicationMenu, PersonMenuMixin,
- HasRecipesMenuMixin, HasSnapsMenuMixin):
+class PersonOverviewMenu(ApplicationMenu, PersonMenuMixin, HasRecipesMenuMixin,
+ HasSnapsMenuMixin, HasOCIRecipesMenuMixin):
usedfor = IPerson
facet = 'overview'
@@ -848,10 +839,10 @@ class PersonOverviewMenu(ApplicationMenu, PersonMenuMixin,
'ppa',
'oauth_tokens',
'oci_registry_credentials',
- 'oci_recipes',
'related_software_summary',
'view_recipes',
'view_snaps',
+ 'view_oci_recipes',
'subscriptions',
'structural_subscriptions',
]
diff --git a/lib/lp/registry/browser/team.py b/lib/lp/registry/browser/team.py
index 93f121c..d419603 100644
--- a/lib/lp/registry/browser/team.py
+++ b/lib/lp/registry/browser/team.py
@@ -1,4 +1,4 @@
-# Copyright 2009-2020 Canonical Ltd. This software is licensed under the
+# Copyright 2009-2021 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
__metaclass__ = type
@@ -94,6 +94,7 @@ from lp.app.widgets.itemswidgets import (
from lp.app.widgets.owner import HiddenUserWidget
from lp.app.widgets.popup import PersonPickerWidget
from lp.code.browser.sourcepackagerecipelisting import HasRecipesMenuMixin
+from lp.oci.browser.hasocirecipes import HasOCIRecipesMenuMixin
from lp.registry.browser.branding import BrandingChangeView
from lp.registry.browser.mailinglists import enabled_with_active_mailing_list
from lp.registry.browser.objectreassignment import ObjectReassignmentView
@@ -1623,7 +1624,7 @@ class TeamMenuMixin(PPANavigationMenuMixIn, CommonMenuLinks):
class TeamOverviewMenu(ApplicationMenu, TeamMenuMixin, HasRecipesMenuMixin,
- HasSnapsMenuMixin):
+ HasSnapsMenuMixin, HasOCIRecipesMenuMixin):
usedfor = ITeam
facet = 'overview'
@@ -1653,6 +1654,7 @@ class TeamOverviewMenu(ApplicationMenu, TeamMenuMixin, HasRecipesMenuMixin,
'related_software_summary',
'view_recipes',
'view_snaps',
+ 'view_oci_recipes',
'subscriptions',
'structural_subscriptions',
'upcomingwork',
diff --git a/lib/lp/registry/browser/tests/test_person.py b/lib/lp/registry/browser/tests/test_person.py
index bbc2f4e..b327adc 100644
--- a/lib/lp/registry/browser/tests/test_person.py
+++ b/lib/lp/registry/browser/tests/test_person.py
@@ -479,7 +479,7 @@ class TestPersonIndexView(BrowserTestCase):
'OCI recipes link', 'a',
attrs={
'href': expected_url},
- text='OCI recipes'))
+ text='View OCI recipes'))
self.assertThat(markup, link_match)
login(ANONYMOUS)
@@ -501,7 +501,7 @@ class TestPersonIndexView(BrowserTestCase):
'OCI recipes link', 'a',
attrs={
'href': expected_url},
- text='OCI recipes'))
+ text='View OCI recipes'))
self.assertThat(markup, Not(link_match))
login(ANONYMOUS)
diff --git a/lib/lp/registry/browser/tests/test_team.py b/lib/lp/registry/browser/tests/test_team.py
index a26c701..03a7d3f 100644
--- a/lib/lp/registry/browser/tests/test_team.py
+++ b/lib/lp/registry/browser/tests/test_team.py
@@ -1,4 +1,4 @@
-# Copyright 2010-2020 Canonical Ltd. This software is licensed under the
+# Copyright 2010-2021 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
from __future__ import absolute_import, print_function, unicode_literals
@@ -16,6 +16,7 @@ from zope.component import getUtility
from zope.security.proxy import removeSecurityProxy
from lp.app.enums import InformationType
+from lp.oci.interfaces.ocirecipe import OCI_RECIPE_ALLOW_CREATE
from lp.registry.browser.team import (
TeamIndexMenu,
TeamMailingListArchiveView,
@@ -35,6 +36,7 @@ from lp.registry.interfaces.teammembership import (
ITeamMembershipSet,
TeamMembershipStatus,
)
+from lp.services.features.testing import FeatureFixture
from lp.services.propertycache import get_property_cache
from lp.services.webapp.authorization import check_permission
from lp.services.webapp.escaping import html_escape
@@ -936,6 +938,54 @@ class TestTeamIndexView(TestCaseWithFactory):
self.assertNotEqual('', markup)
self.assertThat(markup, Not(link_match))
+ def test_show_oci_recipes_link(self):
+ self.useFixture(FeatureFixture({OCI_RECIPE_ALLOW_CREATE: "on"}))
+ member = self.factory.makePerson()
+ team = self.factory.makeTeam(owner=member, members=[member])
+
+ # Creates a recipe, so the link appears.
+ self.factory.makeOCIRecipe(owner=team, registrant=member)
+ with person_logged_in(member):
+ expected_url = 'http://launchpad.test/~%s/+oci-recipes' % team.name
+ team_url = canonical_url(team)
+ browser = self.getUserBrowser(team_url, user=member)
+
+ link_match = soupmatchers.HTMLContains(
+ soupmatchers.Tag(
+ 'OCI recipes link', 'a',
+ attrs={
+ 'href': expected_url},
+ text='View OCI recipes'))
+ self.assertThat(browser.contents, link_match)
+
+ browser = self.getUserBrowser(team_url, user=None)
+ self.assertThat(browser.contents, link_match)
+
+ def test_hides_oci_recipes_link_if_user_doesnt_have_oci_recipes(self):
+ self.useFixture(FeatureFixture({OCI_RECIPE_ALLOW_CREATE: "on"}))
+ member = self.factory.makePerson()
+ team = self.factory.makeTeam(owner=member, members=[member])
+
+ # Creates a recipe from another user, just to make sure it will not
+ # interfere.
+ self.factory.makeOCIRecipe()
+
+ with person_logged_in(member):
+ expected_url = 'http://launchpad.test/~%s/+oci-recipes' % team.name
+ team_url = canonical_url(team)
+ browser = self.getUserBrowser(team_url, user=member)
+
+ link_match = soupmatchers.HTMLContains(
+ soupmatchers.Tag(
+ 'OCI recipes link', 'a',
+ attrs={
+ 'href': expected_url},
+ text='View OCI recipes'))
+ self.assertThat(browser.contents, Not(link_match))
+
+ browser = self.getUserBrowser(team_url, user=None)
+ self.assertThat(browser.contents, Not(link_match))
+
class TestPersonIndexVisibilityView(TestCaseWithFactory):
diff --git a/lib/lp/registry/templates/person-index.pt b/lib/lp/registry/templates/person-index.pt
index 708c477..1261219 100644
--- a/lib/lp/registry/templates/person-index.pt
+++ b/lib/lp/registry/templates/person-index.pt
@@ -92,10 +92,6 @@
tal:define="link context/menu:overview/oci_registry_credentials"
tal:condition="link/enabled"
tal:content="structure link/fmt:link" />
- <li
- tal:define="link context/menu:overview/oci_recipes"
- tal:condition="link/enabled"
- tal:content="structure link/fmt:link" />
</ul>
<div class="yui-g">
diff --git a/lib/lp/registry/templates/team-index.pt b/lib/lp/registry/templates/team-index.pt
index 25db8f5..8d78109 100644
--- a/lib/lp/registry/templates/team-index.pt
+++ b/lib/lp/registry/templates/team-index.pt
@@ -90,7 +90,8 @@
<div class="yui-g">
<!-- First portlet column. -->
<div class="first yui-u">
- <div tal:content="structure context/@@+portlet-ppas" />
+ <span tal:content="context/menu:overview/view_oci_recipes" />
+ vai menu: <div tal:content="structure context/@@+portlet-ppas" />
<div tal:content="structure context/@@+portlet-mailinglist" />
</div>
diff --git a/lib/lp/soyuz/templates/person-portlet-ppas.pt b/lib/lp/soyuz/templates/person-portlet-ppas.pt
index 8f6453e..19b7e6e 100644
--- a/lib/lp/soyuz/templates/person-portlet-ppas.pt
+++ b/lib/lp/soyuz/templates/person-portlet-ppas.pt
@@ -33,15 +33,19 @@
</div>
<ul class="horizontal" style="margin-top: 0;"
tal:define="recipes_link context/menu:overview/view_recipes;
- snaps_link context/menu:overview/view_snaps"
- tal:condition="python: recipes_link.enabled or snaps_link.enabled">
+ snaps_link context/menu:overview/view_snaps;
+ oci_recipes_link context/menu:overview/view_oci_recipes"
+ tal:condition="python: recipes_link.enabled
+ or snaps_link.enabled
+ or oci_recipes_link.enabled">
<li tal:condition="recipes_link/enabled">
<a tal:replace="structure recipes_link/fmt:link" />
</li>
<li tal:condition="snaps_link/enabled">
<a tal:replace="structure snaps_link/fmt:link" />
</li>
+ <li tal:condition="oci_recipes_link/enabled">
+ <a tal:replace="structure oci_recipes_link/fmt:link" />
+ </li>
</ul>
-
-
</tal:root>
Follow ups