Merge lp:~cjwatson/launchpad/git-recipe-browser-listing into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17900
Proposed branch: lp:~cjwatson/launchpad/git-recipe-browser-listing
Merge into: lp:launchpad
Prerequisite: lp:~cjwatson/launchpad/recipe-name-policy
Diff against target: 509 lines (+233/-35)
11 files modified
lib/lp/code/browser/configure.zcml (+21/-3)
lib/lp/code/browser/gitref.py (+23/-3)
lib/lp/code/browser/gitrepository.py (+24/-3)
lib/lp/code/browser/sourcepackagerecipelisting.py (+6/-4)
lib/lp/code/stories/sourcepackagerecipes/xx-recipe-listings.txt (+99/-14)
lib/lp/code/templates/branch-recipes.pt (+1/-1)
lib/lp/code/templates/gitref-index.pt (+11/-2)
lib/lp/code/templates/gitref-recipes.pt (+19/-0)
lib/lp/code/templates/gitrepository-index.pt (+7/-2)
lib/lp/code/templates/gitrepository-recipes.pt (+19/-0)
lib/lp/code/templates/sourcepackagerecipe-listing.pt (+3/-3)
To merge this branch: bzr merge lp:~cjwatson/launchpad/git-recipe-browser-listing
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+282321@code.launchpad.net

Commit message

Add views to list existing Git recipes.

Description of the change

Add views to list existing Git recipes.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/code/browser/configure.zcml'
--- lib/lp/code/browser/configure.zcml 2015-11-23 11:34:15 +0000
+++ lib/lp/code/browser/configure.zcml 2016-01-12 15:24:34 +0000
@@ -1,4 +1,4 @@
1<!-- Copyright 2009-2015 Canonical Ltd. This software is licensed under the1<!-- Copyright 2009-2016 Canonical Ltd. This software is licensed under the
2 GNU Affero General Public License version 3 (see the file LICENSE).2 GNU Affero General Public License version 3 (see the file LICENSE).
3-->3-->
44
@@ -800,6 +800,9 @@
800 <browser:page800 <browser:page
801 name="++repository-management"801 name="++repository-management"
802 template="../templates/gitrepository-management.pt"/>802 template="../templates/gitrepository-management.pt"/>
803 <browser:page
804 name="++repository-recipes"
805 template="../templates/gitrepository-recipes.pt"/>
803 </browser:pages>806 </browser:pages>
804 <browser:page807 <browser:page
805 for="lp.code.interfaces.gitrepository.IGitRepository"808 for="lp.code.interfaces.gitrepository.IGitRepository"
@@ -884,11 +887,14 @@
884 name="++ref-commits"887 name="++ref-commits"
885 template="../templates/gitref-commits.pt"/>888 template="../templates/gitref-commits.pt"/>
886 <browser:page889 <browser:page
890 name="++ref-management"
891 template="../templates/gitref-management.pt"/>
892 <browser:page
887 name="++ref-pending-merges"893 name="++ref-pending-merges"
888 template="../templates/gitref-pending-merges.pt"/>894 template="../templates/gitref-pending-merges.pt"/>
889 <browser:page895 <browser:page
890 name="++ref-management"896 name="++ref-recipes"
891 template="../templates/gitref-management.pt"/>897 template="../templates/gitref-recipes.pt"/>
892 </browser:pages>898 </browser:pages>
893 <browser:page899 <browser:page
894 for="lp.code.interfaces.gitref.IGitRef"900 for="lp.code.interfaces.gitref.IGitRef"
@@ -1232,6 +1238,18 @@
1232 name="+recipes"1238 name="+recipes"
1233 template="../templates/sourcepackagerecipe-listing.pt"/>1239 template="../templates/sourcepackagerecipe-listing.pt"/>
1234 <browser:page1240 <browser:page
1241 for="lp.code.interfaces.gitrepository.IGitRepository"
1242 class="lp.code.browser.sourcepackagerecipelisting.BranchRecipeListingView"
1243 permission="zope.Public"
1244 name="+recipes"
1245 template="../templates/sourcepackagerecipe-listing.pt"/>
1246 <browser:page
1247 for="lp.code.interfaces.gitref.IGitRef"
1248 class="lp.code.browser.sourcepackagerecipelisting.BranchRecipeListingView"
1249 permission="zope.Public"
1250 name="+recipes"
1251 template="../templates/sourcepackagerecipe-listing.pt"/>
1252 <browser:page
1235 for="lp.registry.interfaces.product.IProduct"1253 for="lp.registry.interfaces.product.IProduct"
1236 class="lp.code.browser.sourcepackagerecipelisting.ProductRecipeListingView"1254 class="lp.code.browser.sourcepackagerecipelisting.ProductRecipeListingView"
1237 permission="zope.Public"1255 permission="zope.Public"
12381256
=== modified file 'lib/lp/code/browser/gitref.py'
--- lib/lp/code/browser/gitref.py 2015-11-30 03:03:14 +0000
+++ lib/lp/code/browser/gitref.py 2016-01-12 15:24:34 +0000
@@ -1,4 +1,4 @@
1# Copyright 2015 Canonical Ltd. This software is licensed under the1# Copyright 2015-2016 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Git reference views."""4"""Git reference views."""
@@ -35,6 +35,7 @@
35from lp.code.browser.branchmergeproposal import (35from lp.code.browser.branchmergeproposal import (
36 latest_proposals_for_each_branch,36 latest_proposals_for_each_branch,
37 )37 )
38from lp.code.browser.sourcepackagerecipelisting import HasRecipesMenuMixin
38from lp.code.errors import InvalidBranchMergeProposal39from lp.code.errors import InvalidBranchMergeProposal
39from lp.code.interfaces.branchmergeproposal import IBranchMergeProposal40from lp.code.interfaces.branchmergeproposal import IBranchMergeProposal
40from lp.code.interfaces.codereviewvote import ICodeReviewVoteReference41from lp.code.interfaces.codereviewvote import ICodeReviewVoteReference
@@ -49,18 +50,19 @@
49 Link,50 Link,
50 )51 )
51from lp.services.webapp.authorization import check_permission52from lp.services.webapp.authorization import check_permission
53from lp.services.webapp.escaping import structured
52from lp.snappy.browser.hassnaps import (54from lp.snappy.browser.hassnaps import (
53 HasSnapsMenuMixin,55 HasSnapsMenuMixin,
54 HasSnapsViewMixin,56 HasSnapsViewMixin,
55 )57 )
5658
5759
58class GitRefContextMenu(ContextMenu, HasSnapsMenuMixin):60class GitRefContextMenu(ContextMenu, HasRecipesMenuMixin, HasSnapsMenuMixin):
59 """Context menu for Git references."""61 """Context menu for Git references."""
6062
61 usedfor = IGitRef63 usedfor = IGitRef
62 facet = 'branches'64 facet = 'branches'
63 links = ['create_snap', 'register_merge', 'source']65 links = ['create_snap', 'register_merge', 'source', 'view_recipes']
6466
65 def source(self):67 def source(self):
66 """Return a link to the branch's browsing interface."""68 """Return a link to the branch's browsing interface."""
@@ -144,6 +146,24 @@
144 def dependent_landing_count_text(self):146 def dependent_landing_count_text(self):
145 return self._getBranchCountText(len(self.dependent_landings))147 return self._getBranchCountText(len(self.dependent_landings))
146148
149 @property
150 def recipes_link(self):
151 """A link to recipes for this reference."""
152 count = self.context.recipes.count()
153 if count == 0:
154 # Nothing to link to.
155 return 'No recipes using this branch.'
156 elif count == 1:
157 # Link to the single recipe.
158 return structured(
159 '<a href="%s">1 recipe</a> using this branch.',
160 canonical_url(self.context.recipes.one())).escapedtext
161 else:
162 # Link to a recipe listing.
163 return structured(
164 '<a href="+recipes">%s recipes</a> using this branch.',
165 count).escapedtext
166
147167
148class GitRefRegisterMergeProposalSchema(Interface):168class GitRefRegisterMergeProposalSchema(Interface):
149 """The schema to define the form for registering a new merge proposal."""169 """The schema to define the form for registering a new merge proposal."""
150170
=== modified file 'lib/lp/code/browser/gitrepository.py'
--- lib/lp/code/browser/gitrepository.py 2015-10-07 16:14:42 +0000
+++ lib/lp/code/browser/gitrepository.py 2016-01-12 15:24:34 +0000
@@ -1,4 +1,4 @@
1# Copyright 2015 Canonical Ltd. This software is licensed under the1# Copyright 2015-2016 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Git repository views."""4"""Git repository views."""
@@ -52,6 +52,7 @@
52from lp.app.vocabularies import InformationTypeVocabulary52from lp.app.vocabularies import InformationTypeVocabulary
53from lp.app.widgets.itemswidgets import LaunchpadRadioWidgetWithDescription53from lp.app.widgets.itemswidgets import LaunchpadRadioWidgetWithDescription
54from lp.code.browser.branch import CodeEditOwnerMixin54from lp.code.browser.branch import CodeEditOwnerMixin
55from lp.code.browser.sourcepackagerecipelisting import HasRecipesMenuMixin
55from lp.code.browser.widgets.gitrepositorytarget import (56from lp.code.browser.widgets.gitrepositorytarget import (
56 GitRepositoryTargetDisplayWidget,57 GitRepositoryTargetDisplayWidget,
57 GitRepositoryTargetWidget,58 GitRepositoryTargetWidget,
@@ -203,12 +204,14 @@
203 return Link("+delete", text, icon="trash-icon")204 return Link("+delete", text, icon="trash-icon")
204205
205206
206class GitRepositoryContextMenu(ContextMenu):207class GitRepositoryContextMenu(ContextMenu, HasRecipesMenuMixin):
207 """Context menu for `IGitRepository`."""208 """Context menu for `IGitRepository`."""
208209
209 usedfor = IGitRepository210 usedfor = IGitRepository
210 facet = "branches"211 facet = "branches"
211 links = ["add_subscriber", "source", "subscription", "visibility"]212 links = [
213 "add_subscriber", "source", "subscription",
214 "view_recipes", "visibility"]
212215
213 @enabled_with_permission("launchpad.AnyPerson")216 @enabled_with_permission("launchpad.AnyPerson")
214 def subscription(self):217 def subscription(self):
@@ -291,6 +294,24 @@
291 """All branches in this repository, sorted for display."""294 """All branches in this repository, sorted for display."""
292 return GitRefBatchNavigator(self, self.context)295 return GitRefBatchNavigator(self, self.context)
293296
297 @property
298 def recipes_link(self):
299 """A link to recipes for this repository."""
300 count = self.context.recipes.count()
301 if count == 0:
302 # Nothing to link to.
303 return 'No recipes using this repository.'
304 elif count == 1:
305 # Link to the single recipe.
306 return structured(
307 '<a href="%s">1 recipe</a> using this repository.',
308 canonical_url(self.context.recipes.one())).escapedtext
309 else:
310 # Link to a recipe listing.
311 return structured(
312 '<a href="+recipes">%s recipes</a> using this repository.',
313 count).escapedtext
314
294315
295class GitRepositoryEditFormView(LaunchpadEditFormView):316class GitRepositoryEditFormView(LaunchpadEditFormView):
296 """Base class for forms that edit a Git repository."""317 """Base class for forms that edit a Git repository."""
297318
=== modified file 'lib/lp/code/browser/sourcepackagerecipelisting.py'
--- lib/lp/code/browser/sourcepackagerecipelisting.py 2015-10-05 13:36:06 +0000
+++ lib/lp/code/browser/sourcepackagerecipelisting.py 2016-01-12 15:24:34 +0000
@@ -1,4 +1,4 @@
1# Copyright 2010-2015 Canonical Ltd. This software is licensed under the1# Copyright 2010-2016 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Base class view for sourcepackagerecipe listings."""4"""Base class view for sourcepackagerecipe listings."""
@@ -14,6 +14,7 @@
1414
1515
16from lp.code.browser.decorations import DecoratedBranch16from lp.code.browser.decorations import DecoratedBranch
17from lp.code.interfaces.branch import IBranch
17from lp.services.feeds.browser import FeedsMixin18from lp.services.feeds.browser import FeedsMixin
18from lp.services.webapp import (19from lp.services.webapp import (
19 LaunchpadView,20 LaunchpadView,
@@ -42,8 +43,8 @@
4243
43 @property44 @property
44 def page_title(self):45 def page_title(self):
45 return 'Source Package Recipes for %(displayname)s' % {46 return 'Source Package Recipes for %(display_name)s' % {
46 'displayname': self.context.displayname}47 'display_name': self.context.display_name}
4748
4849
49class BranchRecipeListingView(RecipeListingView):50class BranchRecipeListingView(RecipeListingView):
@@ -54,7 +55,8 @@
54 super(BranchRecipeListingView, self).initialize()55 super(BranchRecipeListingView, self).initialize()
55 # Replace our context with a decorated branch, if it is not already56 # Replace our context with a decorated branch, if it is not already
56 # decorated.57 # decorated.
57 if not isinstance(self.context, DecoratedBranch):58 if (IBranch.providedBy(self.context) and
59 not isinstance(self.context, DecoratedBranch)):
58 self.context = DecoratedBranch(self.context)60 self.context = DecoratedBranch(self.context)
5961
6062
6163
=== modified file 'lib/lp/code/stories/sourcepackagerecipes/xx-recipe-listings.txt'
--- lib/lp/code/stories/sourcepackagerecipes/xx-recipe-listings.txt 2011-06-29 16:49:05 +0000
+++ lib/lp/code/stories/sourcepackagerecipes/xx-recipe-listings.txt 2016-01-12 15:24:34 +0000
@@ -52,18 +52,84 @@
52 >>> print nopriv_browser.url52 >>> print nopriv_browser.url
53 http://code.launchpad.dev/%7Eperson-name.../product-name.../branch.../+recipes53 http://code.launchpad.dev/%7Eperson-name.../product-name.../branch.../+recipes
5454
55The "Base branch" column should not be shown.55The "Base Source" column should not be shown.
5656
57 >>> print_recipe_listing_head(nopriv_browser)57 >>> print_recipe_listing_head(nopriv_browser)
58 Name58 Name
59 Owner59 Owner
60 Registered60 Registered
6161
62The branch page should have a list of all the recipes the branch is a62The recipe listing page should have a list of all the recipes the branch is
63base_branch for.63a base for.
6464
65 >>> print_recipe_listing_contents(nopriv_browser)65 >>> print_recipe_listing_contents(nopriv_browser)
66 spr-name... Person-name...66 spr-name... Person-name...
67 spr-name... Person-name...
68 spr-name... Person-name...
69
70
71Git Recipe Listings
72===================
73
74Create a new sample repository, some branches in it, and some source package
75recipes to go along with them.
76
77 >>> login('foo.bar@canonical.com')
78 >>> repository = factory.makeGitRepository()
79 >>> ref1, ref2, ref3 = factory.makeGitRefs(
80 ... repository=repository,
81 ... paths=[u"refs/heads/a", u"refs/heads/b", u"refs/heads/c"])
82 >>> recipe1a = factory.makeSourcePackageRecipe(branches=[ref1])
83 >>> recipe1b = factory.makeSourcePackageRecipe(branches=[ref1])
84 >>> recipe2 = factory.makeSourcePackageRecipe(branches=[ref2])
85 >>> recipe3 = factory.makeSourcePackageRecipe(branches=[ref3])
86
87Keep these urls, including the target url. We'll use these later.
88
89 >>> repository_url = canonical_url(repository)
90 >>> ref1_url = canonical_url(ref1)
91 >>> target_url = canonical_url(repository.target)
92
93 >>> logout()
94
95Since there are 4 recipes associated with this repository now, the link
96should now read "4 recipes." Let's click through.
97
98 >>> nopriv_browser.open(repository_url)
99 >>> nopriv_browser.getLink('4 recipes').click()
100 >>> print nopriv_browser.url
101 http://code.launchpad.dev/%7Eperson-name.../product-name.../+git/gitrepository.../+recipes
102
103The "Base Source" column should not be shown.
104
105 >>> print_recipe_listing_head(nopriv_browser)
106 Name
107 Owner
108 Registered
109
110The recipe listing page should have a list of all the recipes the repository
111is a base for.
112
113 >>> print_recipe_listing_contents(nopriv_browser)
114 spr-name... Person-name...
115 spr-name... Person-name...
116 spr-name... Person-name...
117 spr-name... Person-name...
118
119If we start from one of the branches instead, then only two recipes are
120listed.
121
122 >>> nopriv_browser.open(ref1_url)
123 >>> nopriv_browser.getLink('2 recipes').click()
124 >>> print nopriv_browser.url
125 http://code.launchpad.dev/%7Eperson-name.../product-name.../+git/gitrepository.../+ref/a/+recipes
126
127 >>> print_recipe_listing_head(nopriv_browser)
128 Name
129 Owner
130 Registered
131
132 >>> print_recipe_listing_contents(nopriv_browser)
67 spr-name... Person-name...133 spr-name... Person-name...
68 spr-name... Person-name...134 spr-name... Person-name...
69135
@@ -81,7 +147,7 @@
81 >>> print_recipe_listing_head(nopriv_browser)147 >>> print_recipe_listing_head(nopriv_browser)
82 Name148 Name
83 Owner149 Owner
84 Base Branch150 Base Source
85 Registered151 Registered
86152
87The listings should now show all recipes whose base branch is a branch from153The listings should now show all recipes whose base branch is a branch from
@@ -92,6 +158,25 @@
92 spr-name... Person-name... lp://dev/... ...158 spr-name... Person-name... lp://dev/... ...
93 spr-name... Person-name... lp://dev/... ...159 spr-name... Person-name... lp://dev/... ...
94160
161The same thing works for the target of the former Git repository test.
162
163 >>> nopriv_browser.open(target_url)
164 >>> nopriv_browser.getLink('View source package recipes').click()
165 >>> print nopriv_browser.url
166 http://code.launchpad.dev/product-name.../+recipes
167
168 >>> print_recipe_listing_head(nopriv_browser)
169 Name
170 Owner
171 Base Source
172 Registered
173
174 >>> print_recipe_listing_contents(nopriv_browser)
175 spr-name... Person-name... lp:~.../+git/... ...
176 spr-name... Person-name... lp:~.../+git/... ...
177 spr-name... Person-name... lp:~.../+git/... ...
178 spr-name... Person-name... lp:~.../+git/... ...
179
95180
96Person Recipe Listings181Person Recipe Listings
97======================182======================
@@ -115,7 +200,7 @@
115200
116 >>> print_recipe_listing_head(nopriv_browser)201 >>> print_recipe_listing_head(nopriv_browser)
117 Name202 Name
118 Base Branch203 Base Source
119 Registered204 Registered
120205
121The listings should now show all recipes whose base branch is a branch from206The listings should now show all recipes whose base branch is a branch from
122207
=== modified file 'lib/lp/code/templates/branch-recipes.pt'
--- lib/lp/code/templates/branch-recipes.pt 2015-10-05 13:36:06 +0000
+++ lib/lp/code/templates/branch-recipes.pt 2016-01-12 15:24:34 +0000
@@ -3,7 +3,7 @@
3 xmlns:metal="http://xml.zope.org/namespaces/metal"3 xmlns:metal="http://xml.zope.org/namespaces/metal"
4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
5 tal:define="context_menu view/context/menu:context"5 tal:define="context_menu view/context/menu:context"
6 id="related-bugs-and-blueprints">6 id="related-recipes">
77
8 <h3>Related source package recipes</h3>8 <h3>Related source package recipes</h3>
99
1010
=== modified file 'lib/lp/code/templates/gitref-index.pt'
--- lib/lp/code/templates/gitref-index.pt 2015-09-18 15:41:08 +0000
+++ lib/lp/code/templates/gitref-index.pt 2016-01-12 15:24:34 +0000
@@ -7,6 +7,15 @@
7 i18n:domain="launchpad"7 i18n:domain="launchpad"
8>8>
99
10<metal:block fill-slot="head_epilogue">
11 <style type="text/css">
12 #merge-summary, #recipe-summary {
13 margin-top: .5em;
14 margin-bottom: .1em;
15 }
16 </style>
17</metal:block>
18
10<body>19<body>
1120
12<tal:registering metal:fill-slot="registering">21<tal:registering metal:fill-slot="registering">
@@ -24,10 +33,10 @@
24 </div>33 </div>
2534
26 <div class="yui-g">35 <div class="yui-g">
27 <div id="ref-relations" class="portlet"36 <div id="ref-relations" class="portlet">
28 tal:condition="python: view.show_merge_links or view.show_snap_information">
29 <tal:ref-pending-merges37 <tal:ref-pending-merges
30 replace="structure context/@@++ref-pending-merges" />38 replace="structure context/@@++ref-pending-merges" />
39 <tal:ref-recipes replace="structure context/@@++ref-recipes" />
31 <div metal:use-macro="context/@@+snap-macros/related-snaps" />40 <div metal:use-macro="context/@@+snap-macros/related-snaps" />
32 </div>41 </div>
33 </div>42 </div>
3443
=== added file 'lib/lp/code/templates/gitref-recipes.pt'
--- lib/lp/code/templates/gitref-recipes.pt 1970-01-01 00:00:00 +0000
+++ lib/lp/code/templates/gitref-recipes.pt 2016-01-12 15:24:34 +0000
@@ -0,0 +1,19 @@
1<div
2 xmlns:tal="http://xml.zope.org/namespaces/tal"
3 xmlns:metal="http://xml.zope.org/namespaces/metal"
4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
5 id="related-recipes">
6
7 <h3>Related source package recipes</h3>
8
9 <div id="recipe-links" class="actions">
10 <div id="recipe-summary">
11 <img src="/@@/source-package-recipe" />
12 <tal:recipes replace="structure view/recipes_link" />
13
14 <a href="/+help-code/related-recipes.html" target="help"
15 class="sprite maybe action-icon">(?)</a>
16 </div>
17 </div>
18
19</div>
020
=== modified file 'lib/lp/code/templates/gitrepository-index.pt'
--- lib/lp/code/templates/gitrepository-index.pt 2015-12-04 15:48:39 +0000
+++ lib/lp/code/templates/gitrepository-index.pt 2016-01-12 15:24:34 +0000
@@ -9,6 +9,10 @@
99
10<metal:block fill-slot="head_epilogue">10<metal:block fill-slot="head_epilogue">
11 <style type="text/css">11 <style type="text/css">
12 #merge-summary, #recipe-summary {
13 margin-top: .5em;
14 margin-bottom: .1em;
15 }
12 #clone-url dt {16 #clone-url dt {
13 font-weight: strong;17 font-weight: strong;
14 }18 }
@@ -41,8 +45,9 @@
41 </div>45 </div>
4246
43 <div class="yui-g">47 <div class="yui-g">
44 <div id="repository-relations" class="portlet"48 <div id="repository-relations" class="portlet">
45 tal:condition="view/show_snap_information">49 <tal:repository-recipes
50 replace="structure context/@@++repository-recipes" />
46 <div metal:use-macro="context/@@+snap-macros/related-snaps">51 <div metal:use-macro="context/@@+snap-macros/related-snaps">
47 <metal:context-type fill-slot="context_type">repository</metal:context-type>52 <metal:context-type fill-slot="context_type">repository</metal:context-type>
48 </div>53 </div>
4954
=== added file 'lib/lp/code/templates/gitrepository-recipes.pt'
--- lib/lp/code/templates/gitrepository-recipes.pt 1970-01-01 00:00:00 +0000
+++ lib/lp/code/templates/gitrepository-recipes.pt 2016-01-12 15:24:34 +0000
@@ -0,0 +1,19 @@
1<div
2 xmlns:tal="http://xml.zope.org/namespaces/tal"
3 xmlns:metal="http://xml.zope.org/namespaces/metal"
4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
5 id="related-recipes">
6
7 <h3>Related source package recipes</h3>
8
9 <div id="recipe-links" class="actions">
10 <div id="recipe-summary">
11 <img src="/@@/source-package-recipe" />
12 <tal:recipes replace="structure view/recipes_link" />
13
14 <a href="/+help-code/related-recipes.html" target="help"
15 class="sprite maybe action-icon">(?)</a>
16 </div>
17 </div>
18
19</div>
020
=== modified file 'lib/lp/code/templates/sourcepackagerecipe-listing.pt'
--- lib/lp/code/templates/sourcepackagerecipe-listing.pt 2011-02-23 01:24:09 +0000
+++ lib/lp/code/templates/sourcepackagerecipe-listing.pt 2016-01-12 15:24:34 +0000
@@ -15,7 +15,7 @@
15 <tr>15 <tr>
16 <th colspan="2">Name</th>16 <th colspan="2">Name</th>
17 <th tal:condition="view/owner_enabled">Owner</th>17 <th tal:condition="view/owner_enabled">Owner</th>
18 <th tal:condition="view/branch_enabled">Base Branch</th>18 <th tal:condition="view/branch_enabled">Base Source</th>
19 <th>Registered</th>19 <th>Registered</th>
20 </tr>20 </tr>
21 </thead>21 </thead>
@@ -32,8 +32,8 @@
32 </a>32 </a>
33 </td>33 </td>
34 <td tal:condition="view/branch_enabled">34 <td tal:condition="view/branch_enabled">
35 <a tal:replace="structure recipe/base_branch/fmt:link">35 <a tal:replace="structure recipe/base/fmt:link">
36 Branch36 Source
37 </a>37 </a>
38 </td>38 </td>
39 <td tal:content="recipe/date_created/fmt:datetime" />39 <td tal:content="recipe/date_created/fmt:datetime" />