Merge lp:~michael.nelson/launchpad/649599-ajax-comment-on-dsdiff into lp:launchpad/db-devel

Proposed by Michael Nelson
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merged at revision: 9849
Proposed branch: lp:~michael.nelson/launchpad/649599-ajax-comment-on-dsdiff
Merge into: lp:launchpad/db-devel
Diff against target: 462 lines (+152/-28)
13 files modified
lib/canonical/launchpad/interfaces/__init__.py (+1/-0)
lib/canonical/launchpad/interfaces/_schema_circular_imports.py (+6/-0)
lib/lp/registry/browser/configure.zcml (+8/-0)
lib/lp/registry/browser/distroseriesdifference.py (+31/-6)
lib/lp/registry/browser/tests/test_distroseriesdifference_views.py (+9/-9)
lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py (+13/-0)
lib/lp/registry/interfaces/distroseriesdifference.py (+8/-1)
lib/lp/registry/interfaces/distroseriesdifferencecomment.py (+19/-2)
lib/lp/registry/model/distroseriesdifference.py (+2/-2)
lib/lp/registry/model/distroseriesdifferencecomment.py (+25/-2)
lib/lp/registry/templates/distroseries-localdifferences.pt (+3/-3)
lib/lp/registry/templates/distroseriesdifference-listing-extra.pt (+1/-1)
lib/lp/registry/tests/test_distroseriesdifferencecomment.py (+26/-2)
To merge this branch: bzr merge lp:~michael.nelson/launchpad/649599-ajax-comment-on-dsdiff
Reviewer Review Type Date Requested Status
Jelmer Vernooij (community) code Approve
Review via email: mp+36966@code.launchpad.net

Commit message

Exposes IDistroSeriesDifferenceComments and IDSD.addComment() via API

Description of the change

= Summary =
This branch exposes IDistroSeriesDifferenceComment objects for bug 649599,
getting ready to add comments via JS.

It follows on from:
https://code.edge.launchpad.net/~michael.nelson/launchpad/644328-blacklist-ui/+merge/36442

== Pre-implementation notes ==
The UI has been discussed as part of the LEP:
https://dev.launchpad.net/LEP/DerivativeDistributions

in particular, the mockup at:
https://dev.launchpad.net/LEP/DerivativeDistributions?action=AttachFile&do=get&target=derived-series-diffs_uiround2.png

(Add comment will be what the next branch adds).

== Implementation details ==

Nothing out of the ordinary.

== Tests ==
bin/test -vvm test_distroseriesdifferencecomment -m
test_distroseriesdifference_webservice

== Demo and Q/A ==
None

= Launchpad lint =

I'm updating the lint in the two files below now.

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/registry/tests/test_distroseriesdifferencecomment.py
  lib/lp/registry/browser/configure.zcml
  lib/lp/registry/templates/distroseries-localdifferences.pt
  lib/canonical/launchpad/interfaces/__init__.py
  lib/lp/registry/interfaces/distroseriesdifference.py
  lib/lp/registry/model/distroseriesdifferencecomment.py
  lib/lp/registry/browser/distroseriesdifference.py
  lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py
  lib/lp/registry/model/distroseriesdifference.py
  lib/lp/registry/interfaces/distroseriesdifferencecomment.py
  lib/lp/registry/templates/distroseriesdifference-listing-extra.pt
  lib/canonical/launchpad/interfaces/_schema_circular_imports.py
  lib/lp/registry/browser/tests/test_distroseriesdifference_views.py

./lib/lp/registry/tests/test_distroseriesdifferencecomment.py
      70: W391 blank line at end of file
      52: Line exceeds 78 characters.
./lib/canonical/launchpad/interfaces/__init__.py
      12: 'from canonical.launchpad.interfaces.launchpad import *' used; unable to detect undefined names
      ...
./lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py
      20: 'person_logged_in' imported but unused
      11: 'Store' imported but unused

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

Not much to add. Nice work!

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/interfaces/__init__.py'
--- lib/canonical/launchpad/interfaces/__init__.py 2010-09-20 14:37:52 +0000
+++ lib/canonical/launchpad/interfaces/__init__.py 2010-09-29 09:56:01 +0000
@@ -56,6 +56,7 @@
56from lp.registry.interfaces.distributionmirror import *56from lp.registry.interfaces.distributionmirror import *
57from lp.registry.interfaces.distributionsourcepackage import *57from lp.registry.interfaces.distributionsourcepackage import *
58from lp.registry.interfaces.distroseriesdifference import *58from lp.registry.interfaces.distroseriesdifference import *
59from lp.registry.interfaces.distroseriesdifferencecomment import *
59from lp.soyuz.interfaces.distributionsourcepackagecache import *60from lp.soyuz.interfaces.distributionsourcepackagecache import *
60from lp.soyuz.interfaces.distributionsourcepackagerelease import *61from lp.soyuz.interfaces.distributionsourcepackagerelease import *
61from lp.registry.interfaces.series import *62from lp.registry.interfaces.series import *
6263
=== modified file 'lib/canonical/launchpad/interfaces/_schema_circular_imports.py'
--- lib/canonical/launchpad/interfaces/_schema_circular_imports.py 2010-09-17 10:50:51 +0000
+++ lib/canonical/launchpad/interfaces/_schema_circular_imports.py 2010-09-29 09:56:01 +0000
@@ -77,6 +77,9 @@
77 IDistributionSourcePackage,77 IDistributionSourcePackage,
78 )78 )
79from lp.registry.interfaces.distroseries import IDistroSeries79from lp.registry.interfaces.distroseries import IDistroSeries
80from lp.registry.interfaces.distroseriesdifferencecomment import (
81 IDistroSeriesDifferenceComment,
82 )
80from lp.registry.interfaces.person import (83from lp.registry.interfaces.person import (
81 IPerson,84 IPerson,
82 IPersonPublic,85 IPersonPublic,
@@ -370,6 +373,9 @@
370 IDistroSeries, 'getPackageUploads', IPackageUpload)373 IDistroSeries, 'getPackageUploads', IPackageUpload)
371patch_reference_property(IDistroSeries, 'parent_series', IDistroSeries)374patch_reference_property(IDistroSeries, 'parent_series', IDistroSeries)
372375
376# IDistroSeriesDifferenceComment
377IDistroSeriesDifferenceComment['comment_author'].schema = IPerson
378
373# IDistroArchSeries379# IDistroArchSeries
374patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)380patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)
375381
376382
=== modified file 'lib/lp/registry/browser/configure.zcml'
--- lib/lp/registry/browser/configure.zcml 2010-09-29 07:09:03 +0000
+++ lib/lp/registry/browser/configure.zcml 2010-09-29 09:56:01 +0000
@@ -180,6 +180,14 @@
180 <browser:defaultView180 <browser:defaultView
181 for="lp.registry.interfaces.distroseriesdifference.IDistroSeriesDifference"181 for="lp.registry.interfaces.distroseriesdifference.IDistroSeriesDifference"
182 name="+listing-distroseries-extra"/>182 name="+listing-distroseries-extra"/>
183 <browser:navigation
184 module="lp.registry.browser.distroseriesdifference"
185 classes="DistroSeriesDifferenceNavigation"/>
186 <browser:url
187 for="lp.registry.interfaces.distroseriesdifferencecomment.IDistroSeriesDifferenceComment"
188 path_expression="string:comments/${id}"
189 attribute_to_parent="distro_series_difference"
190 rootsite="mainsite"/>
183 <browser:menus191 <browser:menus
184 classes="192 classes="
185 DistroSeriesFacets193 DistroSeriesFacets
186194
=== modified file 'lib/lp/registry/browser/distroseriesdifference.py'
--- lib/lp/registry/browser/distroseriesdifference.py 2010-09-28 07:00:56 +0000
+++ lib/lp/registry/browser/distroseriesdifference.py 2010-09-29 09:56:01 +0000
@@ -9,6 +9,7 @@
9 ]9 ]
1010
11from zope.app.form.browser.itemswidgets import RadioWidget11from zope.app.form.browser.itemswidgets import RadioWidget
12from zope.component import getUtility
12from zope.interface import (13from zope.interface import (
13 implements,14 implements,
14 Interface,15 Interface,
@@ -19,16 +20,41 @@
19 SimpleVocabulary,20 SimpleVocabulary,
20 )21 )
2122
22from canonical.launchpad.webapp import LaunchpadFormView23from canonical.launchpad.webapp import (
24 LaunchpadFormView,
25 Navigation,
26 stepthrough,
27 )
23from canonical.launchpad.webapp.authorization import check_permission28from canonical.launchpad.webapp.authorization import check_permission
24from canonical.launchpad.webapp.launchpadform import custom_widget29from canonical.launchpad.webapp.launchpadform import custom_widget
25from lp.registry.enum import DistroSeriesDifferenceStatus30from lp.registry.enum import DistroSeriesDifferenceStatus
31from lp.registry.interfaces.distroseriesdifference import (
32 IDistroSeriesDifference,
33 )
34from lp.registry.interfaces.distroseriesdifferencecomment import (
35 IDistroSeriesDifferenceCommentSource,
36 )
26from lp.services.comments.interfaces.conversation import (37from lp.services.comments.interfaces.conversation import (
27 IComment,38 IComment,
28 IConversation,39 IConversation,
29 )40 )
3041
3142
43class DistroSeriesDifferenceNavigation(Navigation):
44 usedfor = IDistroSeriesDifference
45
46 @stepthrough('comments')
47 def traverse_comment(self, id_str):
48 try:
49 id = int(id_str)
50 except ValueError:
51 return None
52
53 return getUtility(
54 IDistroSeriesDifferenceCommentSource).getForDifference(
55 self.context, id)
56
57
32class IDistroSeriesDifferenceForm(Interface):58class IDistroSeriesDifferenceForm(Interface):
33 """An interface used in the browser only for displaying form elements."""59 """An interface used in the browser only for displaying form elements."""
34 blacklist_options = Choice(vocabulary=SimpleVocabulary((60 blacklist_options = Choice(vocabulary=SimpleVocabulary((
@@ -86,7 +112,7 @@
86 comment in self.context.getComments()]112 comment in self.context.getComments()]
87113
88 @property114 @property
89 def show_blacklist_options(self):115 def show_edit_options(self):
90 """Only show the options if an editor requests via JS."""116 """Only show the options if an editor requests via JS."""
91 return self.request.is_ajax and check_permission(117 return self.request.is_ajax and check_permission(
92 'launchpad.Edit', self.context)118 'launchpad.Edit', self.context)
@@ -103,7 +129,6 @@
103129
104 def __init__(self, comment):130 def __init__(self, comment):
105 """Setup the attributes required by `IComment`."""131 """Setup the attributes required by `IComment`."""
106 self.message_body = comment.comment132 self.comment_author = comment.comment_author
107 self.comment_author = comment.message.owner133 self.comment_date = comment.comment_date
108 self.comment_date = comment.message.datecreated134 self.body_text = comment.body_text
109 self.body_text = comment.comment
110135
=== modified file 'lib/lp/registry/browser/tests/test_distroseriesdifference_views.py'
--- lib/lp/registry/browser/tests/test_distroseriesdifference_views.py 2010-09-28 07:11:16 +0000
+++ lib/lp/registry/browser/tests/test_distroseriesdifference_views.py 2010-09-29 09:56:01 +0000
@@ -130,7 +130,7 @@
130 self.assertIs(None, ds_diff.source_pub)130 self.assertIs(None, ds_diff.source_pub)
131 self.assertIs(None, view.binary_summaries)131 self.assertIs(None, view.binary_summaries)
132132
133 def test_show_blacklist_options_non_ajax(self):133 def test_show_edit_options_non_ajax(self):
134 # Blacklist options are not shown for non-ajax requests.134 # Blacklist options are not shown for non-ajax requests.
135 ds_diff = self.factory.makeDistroSeriesDifference()135 ds_diff = self.factory.makeDistroSeriesDifference()
136136
@@ -138,9 +138,9 @@
138 with person_logged_in(ds_diff.owner):138 with person_logged_in(ds_diff.owner):
139 view = create_initialized_view(139 view = create_initialized_view(
140 ds_diff, '+listing-distroseries-extra')140 ds_diff, '+listing-distroseries-extra')
141 self.assertFalse(view.show_blacklist_options)141 self.assertFalse(view.show_edit_options)
142142
143 def test_show_blacklist_options_editor(self):143 def test_show_edit_options_editor(self):
144 # Blacklist options are shown if requested by an editor via144 # Blacklist options are shown if requested by an editor via
145 # ajax.145 # ajax.
146 ds_diff = self.factory.makeDistroSeriesDifference()146 ds_diff = self.factory.makeDistroSeriesDifference()
@@ -149,16 +149,16 @@
149 with person_logged_in(ds_diff.owner):149 with person_logged_in(ds_diff.owner):
150 view = create_initialized_view(150 view = create_initialized_view(
151 ds_diff, '+listing-distroseries-extra', request=request)151 ds_diff, '+listing-distroseries-extra', request=request)
152 self.assertTrue(view.show_blacklist_options)152 self.assertTrue(view.show_edit_options)
153153
154 def test_show_blacklist_options_non_editor(self):154 def test_show_edit_options_non_editor(self):
155 # Even with a JS request, non-editors do not see the options.155 # Even with a JS request, non-editors do not see the options.
156 ds_diff = self.factory.makeDistroSeriesDifference()156 ds_diff = self.factory.makeDistroSeriesDifference()
157157
158 request = LaunchpadTestRequest(HTTP_X_REQUESTED_WITH='XMLHttpRequest')158 request = LaunchpadTestRequest(HTTP_X_REQUESTED_WITH='XMLHttpRequest')
159 view = create_initialized_view(159 view = create_initialized_view(
160 ds_diff, '+listing-distroseries-extra', request=request)160 ds_diff, '+listing-distroseries-extra', request=request)
161 self.assertFalse(view.show_blacklist_options)161 self.assertFalse(view.show_edit_options)
162162
163163
164class DistroSeriesDifferenceTemplateTestCase(TestCaseWithFactory):164class DistroSeriesDifferenceTemplateTestCase(TestCaseWithFactory):
@@ -266,7 +266,7 @@
266 self.assertEqual(266 self.assertEqual(
267 1, len(soup.findAll('div', {'class': 'blacklist-options'})))267 1, len(soup.findAll('div', {'class': 'blacklist-options'})))
268268
269 def test_blacklist_options_initial_values_NONE(self):269 def test_blacklist_options_initial_values_none(self):
270 ds_diff = self.factory.makeDistroSeriesDifference()270 ds_diff = self.factory.makeDistroSeriesDifference()
271 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')271 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')
272272
@@ -274,7 +274,7 @@
274 # as the default value for the field.274 # as the default value for the field.
275 self.assertEqual('NONE', view.initial_values.get('blacklist_options'))275 self.assertEqual('NONE', view.initial_values.get('blacklist_options'))
276276
277 def test_blacklist_options_initial_values_CURRENT(self):277 def test_blacklist_options_initial_values_current(self):
278 ds_diff = self.factory.makeDistroSeriesDifference(278 ds_diff = self.factory.makeDistroSeriesDifference(
279 status=DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)279 status=DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)
280 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')280 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')
@@ -283,7 +283,7 @@
283 DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT,283 DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT,
284 view.initial_values.get('blacklist_options'))284 view.initial_values.get('blacklist_options'))
285285
286 def test_blacklist_options_initial_values_ALWAYS(self):286 def test_blacklist_options_initial_values_always(self):
287 ds_diff = self.factory.makeDistroSeriesDifference(287 ds_diff = self.factory.makeDistroSeriesDifference(
288 status=DistroSeriesDifferenceStatus.BLACKLISTED_ALWAYS)288 status=DistroSeriesDifferenceStatus.BLACKLISTED_ALWAYS)
289 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')289 view = create_initialized_view(ds_diff, '+listing-distroseries-extra')
290290
=== modified file 'lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py'
--- lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py 2010-09-22 13:45:16 +0000
+++ lib/lp/registry/browser/tests/test_distroseriesdifference_webservice.py 2010-09-29 09:56:01 +0000
@@ -84,3 +84,16 @@
84 self.assertEqual(84 self.assertEqual(
85 DistroSeriesDifferenceStatus.NEEDS_ATTENTION,85 DistroSeriesDifferenceStatus.NEEDS_ATTENTION,
86 ds_diff.status)86 ds_diff.status)
87
88 def test_addComment(self):
89 # Comments can be added via the API
90 ds_diff = self.factory.makeDistroSeriesDifference()
91 ws_diff = ws_object(self.factory.makeLaunchpadService(
92 ds_diff.owner), ds_diff)
93
94 result = ws_diff.addComment(comment='Hey there')
95
96 self.assertEqual('Hey there', result['body_text'])
97 self.assertTrue(
98 result['resource_type_link'].endswith(
99 '#distro_series_difference_comment'))
87100
=== modified file 'lib/lp/registry/interfaces/distroseriesdifference.py'
--- lib/lp/registry/interfaces/distroseriesdifference.py 2010-09-23 11:17:45 +0000
+++ lib/lp/registry/interfaces/distroseriesdifference.py 2010-09-29 09:56:01 +0000
@@ -14,10 +14,12 @@
14 ]14 ]
1515
16from lazr.restful.declarations import (16from lazr.restful.declarations import (
17 call_with,
17 export_as_webservice_entry,18 export_as_webservice_entry,
18 export_write_operation,19 export_write_operation,
19 exported,20 exported,
20 operation_parameters,21 operation_parameters,
22 REQUEST_USER,
21 )23 )
22from lazr.restful.fields import Reference24from lazr.restful.fields import Reference
23from zope.interface import Interface25from zope.interface import Interface
@@ -25,6 +27,7 @@
25 Bool,27 Bool,
26 Choice,28 Choice,
27 Int,29 Int,
30 Text,
28 TextLine,31 TextLine,
29 )32 )
3033
@@ -134,7 +137,11 @@
134class IDistroSeriesDifferenceEdit(Interface):137class IDistroSeriesDifferenceEdit(Interface):
135 """Difference attributes requiring launchpad.Edit."""138 """Difference attributes requiring launchpad.Edit."""
136139
137 def addComment(owner, comment):140 @call_with(commenter=REQUEST_USER)
141 @operation_parameters(
142 comment=Text(title=_("Comment text"), required=True))
143 @export_write_operation()
144 def addComment(commenter, comment):
138 """Add a comment on this difference."""145 """Add a comment on this difference."""
139146
140 @operation_parameters(147 @operation_parameters(
141148
=== modified file 'lib/lp/registry/interfaces/distroseriesdifferencecomment.py'
--- lib/lp/registry/interfaces/distroseriesdifferencecomment.py 2010-08-31 15:56:29 +0000
+++ lib/lp/registry/interfaces/distroseriesdifferencecomment.py 2010-09-29 09:56:01 +0000
@@ -10,9 +10,14 @@
10 ]10 ]
1111
1212
13from lazr.restful.declarations import (
14 export_as_webservice_entry,
15 exported,
16 )
13from lazr.restful.fields import Reference17from lazr.restful.fields import Reference
14from zope.interface import Interface18from zope.interface import Interface
15from zope.schema import (19from zope.schema import (
20 Datetime,
16 Int,21 Int,
17 Text,22 Text,
18 )23 )
@@ -26,6 +31,7 @@
2631
27class IDistroSeriesDifferenceComment(Interface):32class IDistroSeriesDifferenceComment(Interface):
28 """A comment for a distroseries difference record."""33 """A comment for a distroseries difference record."""
34 export_as_webservice_entry()
2935
30 id = Int(title=_('ID'), required=True, readonly=True)36 id = Int(title=_('ID'), required=True, readonly=True)
3137
@@ -38,9 +44,17 @@
38 IMessage, title=_("Message"), required=True, readonly=True,44 IMessage, title=_("Message"), required=True, readonly=True,
39 description=_("A comment about this difference."))45 description=_("A comment about this difference."))
4046
41 comment = Text(47 body_text = exported(Text(
42 title=_("Comment text"), readonly=True, description=_(48 title=_("Comment text"), readonly=True, description=_(
43 "The comment text for the related distro series difference."))49 "The comment text for the related distro series difference.")))
50
51 comment_author = exported(Reference(
52 # Really IPerson.
53 Interface, title=_("The author of the comment."),
54 readonly=True))
55
56 comment_date = exported(Datetime(
57 title=_('Comment date.'), readonly=True))
4458
4559
46class IDistroSeriesDifferenceCommentSource(Interface):60class IDistroSeriesDifferenceCommentSource(Interface):
@@ -55,3 +69,6 @@
55 :param comment: The comment.69 :param comment: The comment.
56 :return: A new `DistroSeriesDifferenceComment` object.70 :return: A new `DistroSeriesDifferenceComment` object.
57 """71 """
72
73 def getForDifference(distro_series_difference, id):
74 """Return the `IDistroSeriesDifferenceComment` with the given id."""
5875
=== modified file 'lib/lp/registry/model/distroseriesdifference.py'
--- lib/lp/registry/model/distroseriesdifference.py 2010-09-22 11:03:20 +0000
+++ lib/lp/registry/model/distroseriesdifference.py 2010-09-29 09:56:01 +0000
@@ -253,10 +253,10 @@
253253
254 return updated254 return updated
255255
256 def addComment(self, owner, comment):256 def addComment(self, commenter, comment):
257 """See `IDistroSeriesDifference`."""257 """See `IDistroSeriesDifference`."""
258 return getUtility(IDistroSeriesDifferenceCommentSource).new(258 return getUtility(IDistroSeriesDifferenceCommentSource).new(
259 self, owner, comment)259 self, commenter, comment)
260260
261 def getComments(self):261 def getComments(self):
262 """See `IDistroSeriesDifference`."""262 """See `IDistroSeriesDifference`."""
263263
=== modified file 'lib/lp/registry/model/distroseriesdifferencecomment.py'
--- lib/lp/registry/model/distroseriesdifferencecomment.py 2010-08-31 15:56:29 +0000
+++ lib/lp/registry/model/distroseriesdifferencecomment.py 2010-09-29 09:56:01 +0000
@@ -22,7 +22,10 @@
22 )22 )
2323
24from canonical.launchpad.database.message import Message, MessageChunk24from canonical.launchpad.database.message import Message, MessageChunk
25from canonical.launchpad.interfaces.lpstorm import IMasterStore25from canonical.launchpad.interfaces.lpstorm import (
26 IMasterStore,
27 IStore,
28 )
26from lp.registry.interfaces.distroseriesdifferencecomment import (29from lp.registry.interfaces.distroseriesdifferencecomment import (
27 IDistroSeriesDifferenceComment,30 IDistroSeriesDifferenceComment,
28 IDistroSeriesDifferenceCommentSource,31 IDistroSeriesDifferenceCommentSource,
@@ -46,10 +49,20 @@
46 message = Reference(message_id, 'Message.id')49 message = Reference(message_id, 'Message.id')
4750
48 @property51 @property
49 def comment(self):52 def comment_author(self):
53 """See `IDistroSeriesDifferenceComment`."""
54 return self.message.owner
55
56 @property
57 def body_text(self):
50 """See `IDistroSeriesDifferenceComment`."""58 """See `IDistroSeriesDifferenceComment`."""
51 return self.message.text_contents59 return self.message.text_contents
5260
61 @property
62 def comment_date(self):
63 """See `IDistroSeriesDifferenceComment`."""
64 return self.message.datecreated
65
53 @staticmethod66 @staticmethod
54 def new(distro_series_difference, owner, comment):67 def new(distro_series_difference, owner, comment):
55 """See `IDistroSeriesDifferenceCommentSource`."""68 """See `IDistroSeriesDifferenceCommentSource`."""
@@ -65,3 +78,13 @@
65 dsd_comment.message = message78 dsd_comment.message = message
6679
67 return store.add(dsd_comment)80 return store.add(dsd_comment)
81
82 @staticmethod
83 def getForDifference(distro_series_difference, id):
84 """See `IDistroSeriesDifferenceCommentSource`."""
85 store = IStore(DistroSeriesDifferenceComment)
86 DSDComment = DistroSeriesDifferenceComment
87 return store.find(
88 DSDComment,
89 DSDComment.distro_series_difference == distro_series_difference,
90 DSDComment.id == id).one()
6891
=== modified file 'lib/lp/registry/templates/distroseries-localdifferences.pt'
--- lib/lp/registry/templates/distroseries-localdifferences.pt 2010-09-23 11:17:45 +0000
+++ lib/lp/registry/templates/distroseries-localdifferences.pt 2010-09-29 09:56:01 +0000
@@ -68,11 +68,11 @@
68 <td>68 <td>
69 <tal:comment tal:define="comment python:difference.getComments().first();"69 <tal:comment tal:define="comment python:difference.getComments().first();"
70 tal:condition="comment">70 tal:condition="comment">
71 <span tal:replace="comment/comment/fmt:shorten/50">I'm on this.</span>71 <span tal:replace="comment/body_text/fmt:shorten/50">I'm on this.</span>
72 <br /><span class="greyed-out greylink"><span72 <br /><span class="greyed-out greylink"><span
73 tal:replace="comment/message/datecreated/fmt:approximatedate">2005-09-16</span>73 tal:replace="comment/comment_date/fmt:approximatedate">2005-09-16</span>
74 by <a tal:replace="structure74 by <a tal:replace="structure
75 comment/message/owner/fmt:link">joesmith</a></span>75 comment/comment_author/fmt:link">joesmith</a></span>
76 </tal:comment>76 </tal:comment>
77 </td>77 </td>
78 </tr>78 </tr>
7979
=== modified file 'lib/lp/registry/templates/distroseriesdifference-listing-extra.pt'
--- lib/lp/registry/templates/distroseriesdifference-listing-extra.pt 2010-09-27 14:18:38 +0000
+++ lib/lp/registry/templates/distroseriesdifference-listing-extra.pt 2010-09-29 09:56:01 +0000
@@ -4,7 +4,7 @@
4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"4 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
5 i18n:domain="launchpad">5 i18n:domain="launchpad">
66
7 <tal:show_options condition="view/show_blacklist_options">7 <tal:show_options condition="view/show_edit_options">
8 <div class="blacklist-options" style="float:right">8 <div class="blacklist-options" style="float:right">
9 <dl>9 <dl>
10 <dt>Blacklisted:</dt>10 <dt>Blacklisted:</dt>
1111
=== modified file 'lib/lp/registry/tests/test_distroseriesdifferencecomment.py'
--- lib/lp/registry/tests/test_distroseriesdifferencecomment.py 2010-08-31 15:56:29 +0000
+++ lib/lp/registry/tests/test_distroseriesdifferencecomment.py 2010-09-29 09:56:01 +0000
@@ -29,12 +29,12 @@
2929
30 verifyObject(IDistroSeriesDifferenceComment, dsd_comment)30 verifyObject(IDistroSeriesDifferenceComment, dsd_comment)
3131
32 def test_comment(self):32 def test_body_text(self):
33 # The comment attribute returns the text of the comment.33 # The comment attribute returns the text of the comment.
34 dsd_comment = self.factory.makeDistroSeriesDifferenceComment(34 dsd_comment = self.factory.makeDistroSeriesDifferenceComment(
35 comment="Wait until version 2.3")35 comment="Wait until version 2.3")
3636
37 self.assertEqual("Wait until version 2.3", dsd_comment.comment)37 self.assertEqual("Wait until version 2.3", dsd_comment.body_text)
3838
39 def test_subject(self):39 def test_subject(self):
40 # The subject of the message is set from the distro series diff40 # The subject of the message is set from the distro series diff
@@ -44,3 +44,27 @@
44 self.assertEqual(44 self.assertEqual(
45 dsd_comment.distro_series_difference.title,45 dsd_comment.distro_series_difference.title,
46 dsd_comment.message.subject)46 dsd_comment.message.subject)
47
48 def test_comment_author(self):
49 # The comment author just proxies the author from the message.
50 dsd_comment = self.factory.makeDistroSeriesDifferenceComment()
51
52 self.assertEqual(
53 dsd_comment.message.owner, dsd_comment.comment_author)
54
55 def test_comment_date(self):
56 # The comment date attribute just proxies from the message.
57 dsd_comment = self.factory.makeDistroSeriesDifferenceComment()
58
59 self.assertEqual(
60 dsd_comment.message.datecreated, dsd_comment.comment_date)
61
62 def test_getForDifference(self):
63 # The utility can get comments by id.
64 dsd_comment = self.factory.makeDistroSeriesDifferenceComment()
65 Store.of(dsd_comment).flush()
66
67 comment_src = getUtility(IDistroSeriesDifferenceCommentSource)
68 self.assertEqual(
69 dsd_comment, comment_src.getForDifference(
70 dsd_comment.distro_series_difference, dsd_comment.id))

Subscribers

People subscribed via source and target branches

to status/vote changes: