Merge lp:~rvb/launchpad/dds-add-unique-packages into lp:launchpad

Proposed by Raphaël Badin
Status: Merged
Approved by: Данило Шеган
Approved revision: no longer in the source branch.
Merged at revision: 12761
Proposed branch: lp:~rvb/launchpad/dds-add-unique-packages
Merge into: lp:launchpad
Prerequisite: lp:~rvb/launchpad/dds-add-missingpackages-page2
Diff against target: 258 lines (+143/-14)
4 files modified
lib/lp/registry/browser/configure.zcml (+8/-2)
lib/lp/registry/browser/distroseries.py (+49/-10)
lib/lp/registry/browser/tests/test_series_views.py (+84/-0)
lib/lp/registry/templates/distroseries-localdifferences.pt (+2/-2)
To merge this branch: bzr merge lp:~rvb/launchpad/dds-add-unique-packages
Reviewer Review Type Date Requested Status
Данило Шеган (community) Approve
Review via email: mp+56548@code.launchpad.net

Commit message

[r=danilo][bug=752397] Add a page (+uniquepackages) to interact with packages in derived series but not in the parent series.

Description of the change

This branch adds a page (+uniquepackages) to interact with packages in the derived series but not in the parent series.

== Tests ==
./bin/test -cvv test_series_views test_uniquepackages_differences
./bin/test -cvv test_series_views test_uniquepackages_differences_empty
./bin/test -cvv test_series_views test_packagesets_uniquepackages

== QA ==
- Turn on the feature flag :
    'soyuz.derived-series-ui.enabled default 1 on'
- Modify the differences in the sample dataset:
    update distroseriesdifference set status=1;
- Check out the page:
    https://launchpad.dev/deribuntu/deriwarty/+uniquepackages
    (not much to do here, except click on 'Update' to reload the page and make
     sure the differences are properly displayed)

To post a comment you must log in.
Revision history for this message
Данило Шеган (danilo) wrote :

From the IRC conversation:

 rvba, is it intentional that this pages uses the same template as +localpackagediffs?
<rvba> danilos: yes
<danilos> rvba, if so, you'd probably want to rename the template so it better indicates what is it about
<rvba> danilos: that's right.
 danilos: actually the template name is distroseries-localdifferences.pt. The 3 pages sharing this templates are all used to display local differences ... of different types.
<danilos> rvba, ok, then I guess it's fine to keep the name
<rvba> yep
<danilos> rvba, the branch looks pretty good otherwise, but I have another naming question: I believe it's our practice to name all our view classes as SomethingSomethingView, so it'd be nice to change that as well
 s/as well//
 rvba, other than that, r=me

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/browser/configure.zcml'
2--- lib/lp/registry/browser/configure.zcml 2011-04-06 11:53:44 +0000
3+++ lib/lp/registry/browser/configure.zcml 2011-04-06 11:53:46 +0000
4@@ -156,13 +156,19 @@
5 <browser:page
6 name="+missingpackages"
7 for="lp.registry.interfaces.distroseries.IDistroSeries"
8- class="lp.registry.browser.distroseries.DistroSeriesMissingPackages"
9+ class="lp.registry.browser.distroseries.DistroSeriesMissingPackagesView"
10 template="../templates/distroseries-localdifferences.pt"
11 permission="zope.Public"/>
12 <browser:page
13+ name="+uniquepackages"
14+ for="lp.registry.interfaces.distroseries.IDistroSeries"
15+ class="lp.registry.browser.distroseries.DistroSeriesUniquePackagesView"
16+ template="../templates/distroseries-localdifferences.pt"
17+ permission="zope.Public"/>
18+ <browser:page
19 name="+localpackagediffs"
20 for="lp.registry.interfaces.distroseries.IDistroSeries"
21- class="lp.registry.browser.distroseries.DistroSeriesLocalDifferences"
22+ class="lp.registry.browser.distroseries.DistroSeriesLocalDifferencesView"
23 template="../templates/distroseries-localdifferences.pt"
24 permission="zope.Public"/>
25 <browser:url
26
27=== modified file 'lib/lp/registry/browser/distroseries.py'
28--- lib/lp/registry/browser/distroseries.py 2011-04-06 11:53:44 +0000
29+++ lib/lp/registry/browser/distroseries.py 2011-04-06 11:53:46 +0000
30@@ -670,8 +670,8 @@
31 required=True)
32
33
34-class DistroSeriesDifferenceBase(LaunchpadFormView,
35- PackageCopyingMixin):
36+class DistroSeriesDifferenceBaseView(LaunchpadFormView,
37+ PackageCopyingMixin):
38 """Base class for all pages presenting differences between
39 a derived series and its parent."""
40 schema = IDifferencesFormSchema
41@@ -696,7 +696,7 @@
42 self.request.response.redirect(canonical_url(self.context))
43 return
44
45- super(DistroSeriesDifferenceBase, self).initialize()
46+ super(DistroSeriesDifferenceBaseView, self).initialize()
47
48 def initialize_sync_label(self, label):
49 self.__class__.actions.byname['actions.sync'].label = label
50@@ -720,7 +720,7 @@
51 As this field depends on other search/filtering field values
52 for its own vocabulary, we set it up after all the others.
53 """
54- super(DistroSeriesDifferenceBase, self).setUpFields()
55+ super(DistroSeriesDifferenceBaseView, self).setUpFields()
56 self.form_fields = (
57 self.setupPackageFilterRadio() +
58 self.form_fields)
59@@ -850,8 +850,8 @@
60 return not differences.is_empty()
61
62
63-class DistroSeriesLocalDifferences(DistroSeriesDifferenceBase,
64- LaunchpadFormView):
65+class DistroSeriesLocalDifferencesView(DistroSeriesDifferenceBaseView,
66+ LaunchpadFormView):
67 """Present differences of type DIFFERENT_VERSIONS between
68 a derived series and its parent.
69 """
70@@ -867,7 +867,7 @@
71 self.context.parent_series.displayname,
72 self.context.displayname,
73 ))
74- super(DistroSeriesLocalDifferences, self).initialize()
75+ super(DistroSeriesLocalDifferencesView, self).initialize()
76
77 @property
78 def explanation(self):
79@@ -903,8 +903,8 @@
80 self._sync_sources(action, data)
81
82
83-class DistroSeriesMissingPackages(DistroSeriesDifferenceBase,
84- LaunchpadFormView):
85+class DistroSeriesMissingPackagesView(DistroSeriesDifferenceBaseView,
86+ LaunchpadFormView):
87 """Present differences of type MISSING_FROM_DERIVED_SERIES between
88 a derived series and its parent.
89 """
90@@ -920,7 +920,7 @@
91 "Include Selected packages into into %s" % (
92 self.context.displayname,
93 ))
94- super(DistroSeriesMissingPackages, self).initialize()
95+ super(DistroSeriesMissingPackagesView, self).initialize()
96
97 @property
98 def explanation(self):
99@@ -949,3 +949,42 @@
100 condition='canPerformSync')
101 def sync_sources(self, action, data):
102 self._sync_sources(action, data)
103+
104+
105+class DistroSeriesUniquePackagesView(DistroSeriesDifferenceBaseView,
106+ LaunchpadFormView):
107+ """Present differences of type UNIQUE_TO_DERIVED_SERIES between
108+ a derived series and its parent.
109+ """
110+ page_title = 'Unique packages'
111+ differences_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
112+ show_parent_version = False
113+ show_package_diffs = False
114+ show_packagesets = True
115+
116+ def initialize(self):
117+ super(DistroSeriesUniquePackagesView, self).initialize()
118+
119+ @property
120+ def explanation(self):
121+ return structured(
122+ "Packages that are listed here are those that have been added to "
123+ "%s but are not yet part of the parent series %s.",
124+ self.context.displayname,
125+ self.context.parent_series.displayname)
126+
127+ @property
128+ def label(self):
129+ return (
130+ "Packages in '%s' but not in parent series '%s'" % (
131+ self.context.displayname,
132+ self.context.parent_series.displayname,
133+ ))
134+
135+ @action(_("Update"), name="update")
136+ def update_action(self, action, data):
137+ """Simply re-issue the form with the new values."""
138+ pass
139+
140+ def canPerformSync(self, *args):
141+ return False
142
143=== modified file 'lib/lp/registry/browser/tests/test_series_views.py'
144--- lib/lp/registry/browser/tests/test_series_views.py 2011-04-06 11:53:44 +0000
145+++ lib/lp/registry/browser/tests/test_series_views.py 2011-04-06 11:53:46 +0000
146@@ -809,6 +809,90 @@
147 html, packageset_text, 'parent-packagesets', 'Parent packagesets')
148
149
150+class DistroSerieUniquePackageDiffsTestCase(TestCaseWithFactory):
151+ """Test the distroseries +uniquepackages view."""
152+
153+ layer = LaunchpadZopelessLayer
154+
155+ def test_uniquepackages_differences(self):
156+ # The view fetches the differences with type
157+ # UNIQUE_TO_DERIVED_SERIES.
158+ derived_series = self.factory.makeDistroSeries(
159+ name='derilucid', parent_series=self.factory.makeDistroSeries(
160+ name='lucid'))
161+
162+ missing_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
163+ missing_blacklisted_diff = self.factory.makeDistroSeriesDifference(
164+ difference_type=missing_type,
165+ derived_series=derived_series,
166+ status=DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)
167+
168+ missing_diff = self.factory.makeDistroSeriesDifference(
169+ difference_type=missing_type,
170+ derived_series=derived_series,
171+ status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION)
172+
173+ view = create_initialized_view(
174+ derived_series, '+uniquepackages')
175+
176+ self.assertContentEqual(
177+ [missing_diff], view.cached_differences.batch)
178+
179+ def test_uniquepackages_differences_empty(self):
180+ # The view is empty if there is no differences with type
181+ # UNIQUE_TO_DERIVED_SERIES.
182+ derived_series = self.factory.makeDistroSeries(
183+ parent_series=self.factory.makeDistroSeries())
184+
185+ not_missing_type = DistroSeriesDifferenceType.DIFFERENT_VERSIONS
186+
187+ missing_diff = self.factory.makeDistroSeriesDifference(
188+ difference_type=not_missing_type,
189+ derived_series=derived_series,
190+ status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION)
191+
192+ view = create_initialized_view(
193+ derived_series, '+uniquepackages')
194+
195+ self.assertContentEqual(
196+ [], view.cached_differences.batch)
197+
198+
199+class DistroSeriesUniquePackagesPageTestCase(DistroSeriesDifferenceMixin,
200+ TestCaseWithFactory):
201+ """Test the distroseries +uniquepackages page."""
202+
203+ layer = DatabaseFunctionalLayer
204+
205+ def setUp(self):
206+ super(DistroSeriesUniquePackagesPageTestCase,
207+ self).setUp('foo.bar@canonical.com')
208+ set_derived_series_ui_feature_flag(self)
209+ self.simple_user = self.factory.makePerson()
210+
211+ def test_packagesets_uniquepackages(self):
212+ # +uniquepackages displays the packagesets in the parent.
213+ missing_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
214+ self.ds_diff = self.factory.makeDistroSeriesDifference(
215+ difference_type=missing_type)
216+
217+ with celebrity_logged_in('admin'):
218+ ps = self.factory.makePackageset(
219+ packages=[self.ds_diff.source_package_name],
220+ distroseries=self.ds_diff.derived_series)
221+
222+ with person_logged_in(self.simple_user):
223+ view = create_initialized_view(
224+ self.ds_diff.derived_series,
225+ '+uniquepackages',
226+ principal=self.simple_user)
227+ html = view()
228+
229+ packageset_text = re.compile('\s*' + ps.name)
230+ self._test_packagesets(
231+ html, packageset_text, 'packagesets', 'Packagesets')
232+
233+
234 class TestMilestoneBatchNavigatorAttribute(TestCaseWithFactory):
235 """Test the series.milestone_batch_navigator attribute."""
236
237
238=== modified file 'lib/lp/registry/templates/distroseries-localdifferences.pt'
239--- lib/lp/registry/templates/distroseries-localdifferences.pt 2011-04-06 11:53:44 +0000
240+++ lib/lp/registry/templates/distroseries-localdifferences.pt 2011-04-06 11:53:46 +0000
241@@ -61,7 +61,7 @@
242 <tr tal:define="parent_source_pub difference/parent_source_pub;
243 source_pub difference/source_pub;
244 src_name difference/source_package_name/name;"
245- tal:attributes="class parent_source_pub/source_package_name">
246+ tal:attributes="class src_name">
247 <td>
248 <input tal:condition="view/canPerformSync"
249 name="field.selected_differences" type="checkbox"
250@@ -70,7 +70,7 @@
251 id string:field.selected_differences.${src_name}"/>
252
253 <a tal:attributes="href difference/fmt:url" class="toggle-extra"
254- tal:content="parent_source_pub/source_package_name">Foo</a>
255+ tal:content="src_name">Foo</a>
256 </td>
257 <td tal:condition="view/show_parent_version">
258 <a tal:condition="difference/parent_source_package_release"