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
=== modified file 'lib/lp/registry/browser/configure.zcml'
--- lib/lp/registry/browser/configure.zcml 2011-04-06 11:53:44 +0000
+++ lib/lp/registry/browser/configure.zcml 2011-04-06 11:53:46 +0000
@@ -156,13 +156,19 @@
156 <browser:page156 <browser:page
157 name="+missingpackages"157 name="+missingpackages"
158 for="lp.registry.interfaces.distroseries.IDistroSeries"158 for="lp.registry.interfaces.distroseries.IDistroSeries"
159 class="lp.registry.browser.distroseries.DistroSeriesMissingPackages"159 class="lp.registry.browser.distroseries.DistroSeriesMissingPackagesView"
160 template="../templates/distroseries-localdifferences.pt"160 template="../templates/distroseries-localdifferences.pt"
161 permission="zope.Public"/>161 permission="zope.Public"/>
162 <browser:page162 <browser:page
163 name="+uniquepackages"
164 for="lp.registry.interfaces.distroseries.IDistroSeries"
165 class="lp.registry.browser.distroseries.DistroSeriesUniquePackagesView"
166 template="../templates/distroseries-localdifferences.pt"
167 permission="zope.Public"/>
168 <browser:page
163 name="+localpackagediffs"169 name="+localpackagediffs"
164 for="lp.registry.interfaces.distroseries.IDistroSeries"170 for="lp.registry.interfaces.distroseries.IDistroSeries"
165 class="lp.registry.browser.distroseries.DistroSeriesLocalDifferences"171 class="lp.registry.browser.distroseries.DistroSeriesLocalDifferencesView"
166 template="../templates/distroseries-localdifferences.pt"172 template="../templates/distroseries-localdifferences.pt"
167 permission="zope.Public"/>173 permission="zope.Public"/>
168 <browser:url174 <browser:url
169175
=== modified file 'lib/lp/registry/browser/distroseries.py'
--- lib/lp/registry/browser/distroseries.py 2011-04-06 11:53:44 +0000
+++ lib/lp/registry/browser/distroseries.py 2011-04-06 11:53:46 +0000
@@ -670,8 +670,8 @@
670 required=True)670 required=True)
671671
672672
673class DistroSeriesDifferenceBase(LaunchpadFormView,673class DistroSeriesDifferenceBaseView(LaunchpadFormView,
674 PackageCopyingMixin):674 PackageCopyingMixin):
675 """Base class for all pages presenting differences between675 """Base class for all pages presenting differences between
676 a derived series and its parent."""676 a derived series and its parent."""
677 schema = IDifferencesFormSchema677 schema = IDifferencesFormSchema
@@ -696,7 +696,7 @@
696 self.request.response.redirect(canonical_url(self.context))696 self.request.response.redirect(canonical_url(self.context))
697 return697 return
698698
699 super(DistroSeriesDifferenceBase, self).initialize()699 super(DistroSeriesDifferenceBaseView, self).initialize()
700700
701 def initialize_sync_label(self, label):701 def initialize_sync_label(self, label):
702 self.__class__.actions.byname['actions.sync'].label = label702 self.__class__.actions.byname['actions.sync'].label = label
@@ -720,7 +720,7 @@
720 As this field depends on other search/filtering field values720 As this field depends on other search/filtering field values
721 for its own vocabulary, we set it up after all the others.721 for its own vocabulary, we set it up after all the others.
722 """722 """
723 super(DistroSeriesDifferenceBase, self).setUpFields()723 super(DistroSeriesDifferenceBaseView, self).setUpFields()
724 self.form_fields = (724 self.form_fields = (
725 self.setupPackageFilterRadio() +725 self.setupPackageFilterRadio() +
726 self.form_fields)726 self.form_fields)
@@ -850,8 +850,8 @@
850 return not differences.is_empty()850 return not differences.is_empty()
851851
852852
853class DistroSeriesLocalDifferences(DistroSeriesDifferenceBase,853class DistroSeriesLocalDifferencesView(DistroSeriesDifferenceBaseView,
854 LaunchpadFormView):854 LaunchpadFormView):
855 """Present differences of type DIFFERENT_VERSIONS between855 """Present differences of type DIFFERENT_VERSIONS between
856 a derived series and its parent.856 a derived series and its parent.
857 """857 """
@@ -867,7 +867,7 @@
867 self.context.parent_series.displayname,867 self.context.parent_series.displayname,
868 self.context.displayname,868 self.context.displayname,
869 ))869 ))
870 super(DistroSeriesLocalDifferences, self).initialize()870 super(DistroSeriesLocalDifferencesView, self).initialize()
871871
872 @property872 @property
873 def explanation(self):873 def explanation(self):
@@ -903,8 +903,8 @@
903 self._sync_sources(action, data)903 self._sync_sources(action, data)
904904
905905
906class DistroSeriesMissingPackages(DistroSeriesDifferenceBase,906class DistroSeriesMissingPackagesView(DistroSeriesDifferenceBaseView,
907 LaunchpadFormView):907 LaunchpadFormView):
908 """Present differences of type MISSING_FROM_DERIVED_SERIES between908 """Present differences of type MISSING_FROM_DERIVED_SERIES between
909 a derived series and its parent.909 a derived series and its parent.
910 """910 """
@@ -920,7 +920,7 @@
920 "Include Selected packages into into %s" % (920 "Include Selected packages into into %s" % (
921 self.context.displayname,921 self.context.displayname,
922 ))922 ))
923 super(DistroSeriesMissingPackages, self).initialize()923 super(DistroSeriesMissingPackagesView, self).initialize()
924924
925 @property925 @property
926 def explanation(self):926 def explanation(self):
@@ -949,3 +949,42 @@
949 condition='canPerformSync')949 condition='canPerformSync')
950 def sync_sources(self, action, data):950 def sync_sources(self, action, data):
951 self._sync_sources(action, data)951 self._sync_sources(action, data)
952
953
954class DistroSeriesUniquePackagesView(DistroSeriesDifferenceBaseView,
955 LaunchpadFormView):
956 """Present differences of type UNIQUE_TO_DERIVED_SERIES between
957 a derived series and its parent.
958 """
959 page_title = 'Unique packages'
960 differences_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
961 show_parent_version = False
962 show_package_diffs = False
963 show_packagesets = True
964
965 def initialize(self):
966 super(DistroSeriesUniquePackagesView, self).initialize()
967
968 @property
969 def explanation(self):
970 return structured(
971 "Packages that are listed here are those that have been added to "
972 "%s but are not yet part of the parent series %s.",
973 self.context.displayname,
974 self.context.parent_series.displayname)
975
976 @property
977 def label(self):
978 return (
979 "Packages in '%s' but not in parent series '%s'" % (
980 self.context.displayname,
981 self.context.parent_series.displayname,
982 ))
983
984 @action(_("Update"), name="update")
985 def update_action(self, action, data):
986 """Simply re-issue the form with the new values."""
987 pass
988
989 def canPerformSync(self, *args):
990 return False
952991
=== modified file 'lib/lp/registry/browser/tests/test_series_views.py'
--- lib/lp/registry/browser/tests/test_series_views.py 2011-04-06 11:53:44 +0000
+++ lib/lp/registry/browser/tests/test_series_views.py 2011-04-06 11:53:46 +0000
@@ -809,6 +809,90 @@
809 html, packageset_text, 'parent-packagesets', 'Parent packagesets')809 html, packageset_text, 'parent-packagesets', 'Parent packagesets')
810810
811811
812class DistroSerieUniquePackageDiffsTestCase(TestCaseWithFactory):
813 """Test the distroseries +uniquepackages view."""
814
815 layer = LaunchpadZopelessLayer
816
817 def test_uniquepackages_differences(self):
818 # The view fetches the differences with type
819 # UNIQUE_TO_DERIVED_SERIES.
820 derived_series = self.factory.makeDistroSeries(
821 name='derilucid', parent_series=self.factory.makeDistroSeries(
822 name='lucid'))
823
824 missing_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
825 missing_blacklisted_diff = self.factory.makeDistroSeriesDifference(
826 difference_type=missing_type,
827 derived_series=derived_series,
828 status=DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)
829
830 missing_diff = self.factory.makeDistroSeriesDifference(
831 difference_type=missing_type,
832 derived_series=derived_series,
833 status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION)
834
835 view = create_initialized_view(
836 derived_series, '+uniquepackages')
837
838 self.assertContentEqual(
839 [missing_diff], view.cached_differences.batch)
840
841 def test_uniquepackages_differences_empty(self):
842 # The view is empty if there is no differences with type
843 # UNIQUE_TO_DERIVED_SERIES.
844 derived_series = self.factory.makeDistroSeries(
845 parent_series=self.factory.makeDistroSeries())
846
847 not_missing_type = DistroSeriesDifferenceType.DIFFERENT_VERSIONS
848
849 missing_diff = self.factory.makeDistroSeriesDifference(
850 difference_type=not_missing_type,
851 derived_series=derived_series,
852 status=DistroSeriesDifferenceStatus.NEEDS_ATTENTION)
853
854 view = create_initialized_view(
855 derived_series, '+uniquepackages')
856
857 self.assertContentEqual(
858 [], view.cached_differences.batch)
859
860
861class DistroSeriesUniquePackagesPageTestCase(DistroSeriesDifferenceMixin,
862 TestCaseWithFactory):
863 """Test the distroseries +uniquepackages page."""
864
865 layer = DatabaseFunctionalLayer
866
867 def setUp(self):
868 super(DistroSeriesUniquePackagesPageTestCase,
869 self).setUp('foo.bar@canonical.com')
870 set_derived_series_ui_feature_flag(self)
871 self.simple_user = self.factory.makePerson()
872
873 def test_packagesets_uniquepackages(self):
874 # +uniquepackages displays the packagesets in the parent.
875 missing_type = DistroSeriesDifferenceType.UNIQUE_TO_DERIVED_SERIES
876 self.ds_diff = self.factory.makeDistroSeriesDifference(
877 difference_type=missing_type)
878
879 with celebrity_logged_in('admin'):
880 ps = self.factory.makePackageset(
881 packages=[self.ds_diff.source_package_name],
882 distroseries=self.ds_diff.derived_series)
883
884 with person_logged_in(self.simple_user):
885 view = create_initialized_view(
886 self.ds_diff.derived_series,
887 '+uniquepackages',
888 principal=self.simple_user)
889 html = view()
890
891 packageset_text = re.compile('\s*' + ps.name)
892 self._test_packagesets(
893 html, packageset_text, 'packagesets', 'Packagesets')
894
895
812class TestMilestoneBatchNavigatorAttribute(TestCaseWithFactory):896class TestMilestoneBatchNavigatorAttribute(TestCaseWithFactory):
813 """Test the series.milestone_batch_navigator attribute."""897 """Test the series.milestone_batch_navigator attribute."""
814898
815899
=== modified file 'lib/lp/registry/templates/distroseries-localdifferences.pt'
--- lib/lp/registry/templates/distroseries-localdifferences.pt 2011-04-06 11:53:44 +0000
+++ lib/lp/registry/templates/distroseries-localdifferences.pt 2011-04-06 11:53:46 +0000
@@ -61,7 +61,7 @@
61 <tr tal:define="parent_source_pub difference/parent_source_pub;61 <tr tal:define="parent_source_pub difference/parent_source_pub;
62 source_pub difference/source_pub;62 source_pub difference/source_pub;
63 src_name difference/source_package_name/name;"63 src_name difference/source_package_name/name;"
64 tal:attributes="class parent_source_pub/source_package_name">64 tal:attributes="class src_name">
65 <td>65 <td>
66 <input tal:condition="view/canPerformSync"66 <input tal:condition="view/canPerformSync"
67 name="field.selected_differences" type="checkbox"67 name="field.selected_differences" type="checkbox"
@@ -70,7 +70,7 @@
70 id string:field.selected_differences.${src_name}"/>70 id string:field.selected_differences.${src_name}"/>
7171
72 <a tal:attributes="href difference/fmt:url" class="toggle-extra"72 <a tal:attributes="href difference/fmt:url" class="toggle-extra"
73 tal:content="parent_source_pub/source_package_name">Foo</a>73 tal:content="src_name">Foo</a>
74 </td>74 </td>
75 <td tal:condition="view/show_parent_version">75 <td tal:condition="view/show_parent_version">
76 <a tal:condition="difference/parent_source_package_release"76 <a tal:condition="difference/parent_source_package_release"