Merge lp:~wgrant/launchpad/bugsummary-v2-app-no-fixed-upstream into lp:launchpad
- bugsummary-v2-app-no-fixed-upstream
- Merge into devel
Proposed by
William Grant
on 2012-05-21
| Status: | Merged |
|---|---|
| Merged at revision: | 15277 |
| Proposed branch: | lp:~wgrant/launchpad/bugsummary-v2-app-no-fixed-upstream |
| Merge into: | lp:launchpad |
| Diff against target: |
871 lines (+87/-500) 10 files modified
lib/lp/bugs/browser/bugtask.py (+5/-14) lib/lp/bugs/browser/tests/special/bugs-fixed-elsewhere.txt (+0/-144) lib/lp/bugs/browser/tests/test_bugs_fixed_elsewhere.py (+0/-73) lib/lp/bugs/doc/bugsummary.txt (+69/-72) lib/lp/bugs/interfaces/bugsummary.py (+0/-1) lib/lp/bugs/model/bugsummary.py (+0/-1) lib/lp/bugs/model/tests/test_bugsummary.py (+0/-137) lib/lp/bugs/stories/xx-bugs-statistics-portlet.txt (+12/-39) lib/lp/bugs/templates/bugtarget-portlet-bugfilters-content.pt (+1/-12) lib/lp/services/features/flags.py (+0/-7) |
| To merge this branch: | bzr merge lp:~wgrant/launchpad/bugsummary-v2-app-no-fixed-upstream |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Ian Booth (community) | 2012-05-21 | Approve on 2012-05-21 | |
|
Review via email:
|
|||
Commit Message
Completely drop the 'Bugs fixed elsewhere' count and remove BugSummary.
Description of the Change
This branch continues bug #950502, completely removing the application side of the "Bugs fixed elsewhere" count that has been disabled on production for two months. BugSummary.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
| 1 | === modified file 'lib/lp/bugs/browser/bugtask.py' |
| 2 | --- lib/lp/bugs/browser/bugtask.py 2012-05-01 07:24:59 +0000 |
| 3 | +++ lib/lp/bugs/browser/bugtask.py 2012-05-21 03:40:21 +0000 |
| 4 | @@ -1977,8 +1977,8 @@ |
| 5 | # Circular fail. |
| 6 | from lp.bugs.model.bugsummary import BugSummary |
| 7 | bug_task_set = getUtility(IBugTaskSet) |
| 8 | - groups = (BugSummary.status, BugSummary.importance, |
| 9 | - BugSummary.has_patch, BugSummary.fixed_upstream) |
| 10 | + groups = ( |
| 11 | + BugSummary.status, BugSummary.importance, BugSummary.has_patch) |
| 12 | counts = bug_task_set.countBugs(self.user, [self.context], groups) |
| 13 | # Sum the split out aggregates. |
| 14 | new = 0 |
| 15 | @@ -1987,12 +1987,10 @@ |
| 16 | critical = 0 |
| 17 | high = 0 |
| 18 | with_patch = 0 |
| 19 | - resolved_upstream = 0 |
| 20 | for metadata, count in counts.items(): |
| 21 | status = metadata[0] |
| 22 | importance = metadata[1] |
| 23 | has_patch = metadata[2] |
| 24 | - was_resolved_upstream = metadata[3] |
| 25 | if status == BugTaskStatus.NEW: |
| 26 | new += count |
| 27 | elif status == BugTaskStatus.INPROGRESS: |
| 28 | @@ -2003,20 +2001,13 @@ |
| 29 | high += count |
| 30 | if has_patch and DISPLAY_BUG_STATUS_FOR_PATCHES[status]: |
| 31 | with_patch += count |
| 32 | - if was_resolved_upstream: |
| 33 | - resolved_upstream += count |
| 34 | open += count |
| 35 | - result = dict(new=new, open=open, inprogress=inprogress, high=high, |
| 36 | - critical=critical, with_patch=with_patch, |
| 37 | - resolved_upstream=resolved_upstream) |
| 38 | + result = dict( |
| 39 | + new=new, open=open, inprogress=inprogress, high=high, |
| 40 | + critical=critical, with_patch=with_patch) |
| 41 | return result |
| 42 | |
| 43 | @property |
| 44 | - def bugs_fixed_elsewhere_count(self): |
| 45 | - """A count of bugs fixed elsewhere.""" |
| 46 | - return self._bug_stats['resolved_upstream'] |
| 47 | - |
| 48 | - @property |
| 49 | def open_cve_bugs_count(self): |
| 50 | """A count of open bugs linked to CVEs.""" |
| 51 | params = get_default_search_params(self.user) |
| 52 | |
| 53 | === removed file 'lib/lp/bugs/browser/tests/special/bugs-fixed-elsewhere.txt' |
| 54 | --- lib/lp/bugs/browser/tests/special/bugs-fixed-elsewhere.txt 2012-04-04 05:46:26 +0000 |
| 55 | +++ lib/lp/bugs/browser/tests/special/bugs-fixed-elsewhere.txt 1970-01-01 00:00:00 +0000 |
| 56 | @@ -1,144 +0,0 @@ |
| 57 | -Bugs Fixed Elsewhere |
| 58 | -==================== |
| 59 | - |
| 60 | -The +bugtarget-portlet-bugfilters-info view for a distribution or |
| 61 | -product contains a property for a URL to a list of bugs fixed |
| 62 | -elsewhere. |
| 63 | - |
| 64 | - >>> from zope.component import getMultiAdapter |
| 65 | - >>> from lp.services.webapp.servers import LaunchpadTestRequest |
| 66 | - |
| 67 | - >>> view = getMultiAdapter( |
| 68 | - ... (bugtarget, LaunchpadTestRequest()), |
| 69 | - ... name='+bugtarget-portlet-bugfilters-info') |
| 70 | - >>> view.initialize() |
| 71 | - |
| 72 | - >>> view.bugs_fixed_elsewhere_url |
| 73 | - u'http://.../+bugs?field.status_upstream=resolved_upstream' |
| 74 | - |
| 75 | -The +bugtarget-portlet-bugfilters-stats view for a distribution or |
| 76 | -product contains the URL as above in addition to a count of how many |
| 77 | -bugs that are fixed elsewhere. This count can take a while to |
| 78 | -calculate, so it is put on this separate view which can be requested |
| 79 | -asyncronously. |
| 80 | - |
| 81 | - >>> def get_view(): |
| 82 | - ... view = getMultiAdapter( |
| 83 | - ... (bugtarget, LaunchpadTestRequest()), |
| 84 | - ... name='+bugtarget-portlet-bugfilters-stats') |
| 85 | - ... view.initialize() |
| 86 | - ... return view |
| 87 | - |
| 88 | - >>> view = get_view() |
| 89 | - >>> view.bugs_fixed_elsewhere_url |
| 90 | - u'http://.../+bugs?field.status_upstream=resolved_upstream' |
| 91 | - >>> view.bugs_fixed_elsewhere_count |
| 92 | - 0 |
| 93 | - |
| 94 | -Simply opening a bug elsewhere won't increase the count. |
| 95 | - |
| 96 | - >>> from lp.registry.interfaces.product import IProductSet |
| 97 | - >>> evolution = getUtility(IProductSet).getByName('evolution') |
| 98 | - >>> evolution != bugtarget |
| 99 | - True |
| 100 | - |
| 101 | - >>> bug = filebug(bugtarget, 'Example Bug') |
| 102 | - |
| 103 | - >>> from lp.bugs.interfaces.bugtask import IBugTaskSet |
| 104 | - >>> elsewhere = getUtility(IBugTaskSet).createTask( |
| 105 | - ... bug, getUtility(ILaunchBag).user, evolution) |
| 106 | - >>> get_view().bugs_fixed_elsewhere_count |
| 107 | - 0 |
| 108 | - |
| 109 | -But if we mark the bug as fixed in the other, the count will increase |
| 110 | -by one. |
| 111 | - |
| 112 | - >>> from lp.bugs.interfaces.bugtask import BugTaskStatus |
| 113 | - >>> elsewhere.transitionToStatus( |
| 114 | - ... BugTaskStatus.FIXRELEASED, getUtility(ILaunchBag).user) |
| 115 | - |
| 116 | - >>> get_view().bugs_fixed_elsewhere_count |
| 117 | - 1L |
| 118 | - |
| 119 | -Bugs fixed elsewhere also show up when we perform an advanced bug |
| 120 | -search, using the appropriate query string parameter to ask for "bugs |
| 121 | -resolved elsewhere": |
| 122 | - |
| 123 | - >>> search_view = getMultiAdapter( |
| 124 | - ... (bugtarget, |
| 125 | - ... LaunchpadTestRequest( |
| 126 | - ... form={'field.status_upstream': 'resolved_upstream'})), |
| 127 | - ... name='+bugs') |
| 128 | - >>> search_view.initialize() |
| 129 | - >>> navigator = search_view.search() |
| 130 | - |
| 131 | - >>> for task in search_view.search().batch: |
| 132 | - ... for related_task in task.related_tasks: |
| 133 | - ... print related_task.target.name |
| 134 | - ... print related_task.status.name |
| 135 | - evolution |
| 136 | - FIXRELEASED |
| 137 | - |
| 138 | - |
| 139 | -Private Bugs |
| 140 | ------------- |
| 141 | - |
| 142 | -Only bugs that the user has permission to view are included in the count. |
| 143 | - |
| 144 | - >>> another_bug = filebug(bugtarget, 'Example Bug') |
| 145 | - >>> another_bug.setPrivate(True, getUtility(ILaunchBag).user) |
| 146 | - True |
| 147 | - |
| 148 | - >>> another_elsewhere = getUtility(IBugTaskSet).createTask( |
| 149 | - ... another_bug, getUtility(ILaunchBag).user, evolution) |
| 150 | - >>> another_elsewhere.transitionToStatus( |
| 151 | - ... BugTaskStatus.FIXRELEASED, getUtility(ILaunchBag).user) |
| 152 | - |
| 153 | - >>> get_view().bugs_fixed_elsewhere_count |
| 154 | - 2L |
| 155 | - |
| 156 | -This means that No Privileges Person will see that there is only one bug |
| 157 | -fixed elsewhere. |
| 158 | - |
| 159 | - >>> login('no-priv@canonical.com') |
| 160 | - >>> get_view().bugs_fixed_elsewhere_count |
| 161 | - 1L |
| 162 | - |
| 163 | -If the private bug is made public again, he will of course see that |
| 164 | -there are two bugs fixed. |
| 165 | - |
| 166 | - >>> login('foo.bar@canonical.com') |
| 167 | - >>> another_bug.setPrivate(False, getUtility(ILaunchBag).user) |
| 168 | - True |
| 169 | - |
| 170 | - >>> login('no-priv@canonical.com') |
| 171 | - >>> get_view().bugs_fixed_elsewhere_count |
| 172 | - 2L |
| 173 | - |
| 174 | - |
| 175 | -Duplicate Bugs |
| 176 | --------------- |
| 177 | - |
| 178 | -Bugs that are duplicate of other bugs aren't included in the count. |
| 179 | - |
| 180 | - >>> another_bug.markAsDuplicate(bug) |
| 181 | - |
| 182 | - >>> get_view().bugs_fixed_elsewhere_count |
| 183 | - 1L |
| 184 | - |
| 185 | - |
| 186 | -Resolved Bugs |
| 187 | -------------- |
| 188 | - |
| 189 | -The count includes only bugs that are open in the current context. |
| 190 | - |
| 191 | - >>> for bugtask in bug.bugtasks: |
| 192 | - ... if bugtask.target == bugtarget: |
| 193 | - ... break |
| 194 | - ... else: |
| 195 | - ... print "Couldn't find a bugtasks for %r" % bugtarget |
| 196 | - >>> bugtask.transitionToStatus( |
| 197 | - ... BugTaskStatus.FIXRELEASED, getUtility(ILaunchBag).user) |
| 198 | - |
| 199 | - >>> get_view().bugs_fixed_elsewhere_count |
| 200 | - 0 |
| 201 | |
| 202 | === removed file 'lib/lp/bugs/browser/tests/test_bugs_fixed_elsewhere.py' |
| 203 | --- lib/lp/bugs/browser/tests/test_bugs_fixed_elsewhere.py 2011-12-30 06:14:56 +0000 |
| 204 | +++ lib/lp/bugs/browser/tests/test_bugs_fixed_elsewhere.py 1970-01-01 00:00:00 +0000 |
| 205 | @@ -1,73 +0,0 @@ |
| 206 | -# Copyright 2009 Canonical Ltd. This software is licensed under the |
| 207 | -# GNU Affero General Public License version 3 (see the file LICENSE). |
| 208 | - |
| 209 | -"""Test harness for running the bugs-fixed-elsewhere.txt tests.""" |
| 210 | - |
| 211 | -__metaclass__ = type |
| 212 | - |
| 213 | -__all__ = [] |
| 214 | - |
| 215 | -import unittest |
| 216 | - |
| 217 | -from zope.component import getUtility |
| 218 | - |
| 219 | -from lp.bugs.interfaces.bug import CreateBugParams |
| 220 | -from lp.bugs.interfaces.bugtask import BugTaskStatus |
| 221 | -from lp.registry.interfaces.distribution import IDistributionSet |
| 222 | -from lp.registry.interfaces.product import IProductSet |
| 223 | -from lp.services.database.sqlbase import ( |
| 224 | - cursor, |
| 225 | - sqlvalues, |
| 226 | - ) |
| 227 | -from lp.services.webapp.interfaces import ILaunchBag |
| 228 | -from lp.testing import login |
| 229 | -from lp.testing.layers import LaunchpadFunctionalLayer |
| 230 | -from lp.testing.systemdocs import ( |
| 231 | - LayeredDocFileSuite, |
| 232 | - setUp, |
| 233 | - tearDown, |
| 234 | - ) |
| 235 | - |
| 236 | - |
| 237 | -def bugtarget_filebug(bugtarget, summary): |
| 238 | - """File a bug as the current user on the bug target and return it.""" |
| 239 | - return bugtarget.createBug(CreateBugParams( |
| 240 | - getUtility(ILaunchBag).user, summary, comment=summary)) |
| 241 | - |
| 242 | -def commonSetUp(test): |
| 243 | - """Set up common for all tests.""" |
| 244 | - setUp(test) |
| 245 | - test.globs['filebug'] = bugtarget_filebug |
| 246 | - login('test@canonical.com') |
| 247 | - # Ensure that there are no fixed bugs in sample data that might |
| 248 | - # interfere with the tests. |
| 249 | - cur = cursor() |
| 250 | - cur.execute("UPDATE BugTask SET status = %s" % ( |
| 251 | - sqlvalues(BugTaskStatus.NEW))) |
| 252 | - |
| 253 | - |
| 254 | -def productSetUp(test): |
| 255 | - commonSetUp(test) |
| 256 | - test.globs['bugtarget'] = getUtility(IProductSet).getByName('firefox') |
| 257 | - |
| 258 | - |
| 259 | -def distributionSetUp(test): |
| 260 | - commonSetUp(test) |
| 261 | - test.globs['bugtarget'] = getUtility(IDistributionSet).getByName('ubuntu') |
| 262 | - |
| 263 | - |
| 264 | -def test_suite(): |
| 265 | - suite = unittest.TestSuite() |
| 266 | - |
| 267 | - setUpMethods = [ |
| 268 | - productSetUp, |
| 269 | - distributionSetUp, |
| 270 | - ] |
| 271 | - |
| 272 | - for setUpMethod in setUpMethods: |
| 273 | - test = LayeredDocFileSuite( |
| 274 | - 'special/bugs-fixed-elsewhere.txt', |
| 275 | - setUp=setUpMethod, tearDown=tearDown, |
| 276 | - layer=LaunchpadFunctionalLayer) |
| 277 | - suite.addTest(test) |
| 278 | - return suite |
| 279 | |
| 280 | === modified file 'lib/lp/bugs/doc/bugsummary.txt' |
| 281 | --- lib/lp/bugs/doc/bugsummary.txt 2012-05-02 05:25:11 +0000 |
| 282 | +++ lib/lp/bugs/doc/bugsummary.txt 2012-05-21 03:40:21 +0000 |
| 283 | @@ -14,20 +14,19 @@ |
| 284 | - milestone |
| 285 | - importance |
| 286 | - has_patch |
| 287 | - - fixed_upstream |
| 288 | |
| 289 | |
| 290 | First we should setup some helpers to use in the examples. These will |
| 291 | let us dump the BugSummary table in a readable format. |
| 292 | |
| 293 | --------------------------------------------------------------- |
| 294 | - prod ps dist ds spn tag mile status import pa up vis # |
| 295 | + prod ps dist ds spn tag mile status import pa vis # |
| 296 | --------------------------------------------------------------- |
| 297 | |
| 298 | The columns are product, productseries, distribution, distroseries, |
| 299 | sourcepackagename, tag, milestone, status, importance, has_patch, |
| 300 | -fixed_upstream, viewed_by and the count. viewed_by is a team reference |
| 301 | -and used to query private bug counts. |
| 302 | +viewed_by and the count. viewed_by is a team reference and used to |
| 303 | +query private bug counts. |
| 304 | |
| 305 | >>> from lp.services.database.lpstorm import IMasterStore |
| 306 | >>> from lp.bugs.interfaces.bugtask import BugTaskStatus |
| 307 | @@ -60,14 +59,13 @@ |
| 308 | ... BugSummary.sourcepackagename_id, BugSummary.tag, |
| 309 | ... BugSummary.milestone_id, BugSummary.status, |
| 310 | ... BugSummary.importance, BugSummary.has_patch, |
| 311 | - ... BugSummary.fixed_upstream, BugSummary.viewed_by_id, |
| 312 | - ... BugSummary.id) |
| 313 | + ... BugSummary.viewed_by_id, BugSummary.id) |
| 314 | ... fmt = ( |
| 315 | ... "%-4s %-4s %-4s %-4s %-5s %-3s %-4s " |
| 316 | - ... "%-6s %-6s %-2s %-2s %-4s %3s") |
| 317 | + ... "%-6s %-6s %-2s %-4s %3s") |
| 318 | ... header = fmt % ( |
| 319 | ... 'prod', 'ps', 'dist', 'ds', 'spn', 'tag', 'mile', |
| 320 | - ... 'status', 'import', 'pa', 'up', 'vis', '#') |
| 321 | + ... 'status', 'import', 'pa', 'vis', '#') |
| 322 | ... print "-" * len(header) |
| 323 | ... print header |
| 324 | ... print "-" * len(header) |
| 325 | @@ -83,7 +81,6 @@ |
| 326 | ... str(bugsummary.status)[:6], |
| 327 | ... str(bugsummary.importance)[:6], |
| 328 | ... str(bugsummary.has_patch)[:1], |
| 329 | - ... str(bugsummary.fixed_upstream)[:1], |
| 330 | ... name(bugsummary.viewed_by), |
| 331 | ... bugsummary.count) |
| 332 | ... print " " * (len(header) - 4), |
| 333 | @@ -122,12 +119,12 @@ |
| 334 | ... BugSummary.tag == None) |
| 335 | |
| 336 | >>> print_result(bug_summaries) |
| 337 | - --------------------------------------------------------------- |
| 338 | - prod ps dist ds spn tag mile status import pa up vis # |
| 339 | - --------------------------------------------------------------- |
| 340 | - pr-a x x x x x x New Undeci F F x 1 |
| 341 | - === |
| 342 | - 1 |
| 343 | + ------------------------------------------------------------ |
| 344 | + prod ps dist ds spn tag mile status import pa vis # |
| 345 | + ------------------------------------------------------------ |
| 346 | + pr-a x x x x x x New Undeci F x 1 |
| 347 | + === |
| 348 | + 1 |
| 349 | |
| 350 | There is one row per tag per combination of product, status and milestone. |
| 351 | If we are interested in all bugs targeted to a product regardless of how |
| 352 | @@ -148,13 +145,13 @@ |
| 353 | ... BugSummary.product == prod_a, |
| 354 | ... BugSummary.tag == None, |
| 355 | ... BugSummary.viewed_by == None) |
| 356 | - --------------------------------------------------------------- |
| 357 | - prod ps dist ds spn tag mile status import pa up vis # |
| 358 | - --------------------------------------------------------------- |
| 359 | - pr-a x x x x x x New Undeci F F x 2 |
| 360 | - pr-a x x x x x x Confir Undeci F F x 2 |
| 361 | - === |
| 362 | - 4 |
| 363 | + ------------------------------------------------------------ |
| 364 | + prod ps dist ds spn tag mile status import pa vis # |
| 365 | + ------------------------------------------------------------ |
| 366 | + pr-a x x x x x x New Undeci F x 2 |
| 367 | + pr-a x x x x x x Confir Undeci F x 2 |
| 368 | + === |
| 369 | + 4 |
| 370 | |
| 371 | Here are the rows associated with the 't-a' tag. There is 1 Confirmed |
| 372 | bug task targetted to the pr-a product who's bug is tagged 't-a'.: |
| 373 | @@ -163,12 +160,12 @@ |
| 374 | ... BugSummary.product == prod_a, |
| 375 | ... BugSummary.tag == u't-a', |
| 376 | ... BugSummary.viewed_by == None) |
| 377 | - --------------------------------------------------------------- |
| 378 | - prod ps dist ds spn tag mile status import pa up vis # |
| 379 | - --------------------------------------------------------------- |
| 380 | - pr-a x x x x t-a x Confir Undeci F F x 1 |
| 381 | - === |
| 382 | - 1 |
| 383 | + ------------------------------------------------------------ |
| 384 | + prod ps dist ds spn tag mile status import pa vis # |
| 385 | + ------------------------------------------------------------ |
| 386 | + pr-a x x x x t-a x Confir Undeci F x 1 |
| 387 | + === |
| 388 | + 1 |
| 389 | |
| 390 | You will normally want to get the total count counted in the database |
| 391 | rather than waste transmission time to calculate the rows client side. |
| 392 | @@ -208,17 +205,17 @@ |
| 393 | >>> print_find( |
| 394 | ... BugSummary.product == prod_a, |
| 395 | ... BugSummary.viewed_by == None) |
| 396 | - --------------------------------------------------------------- |
| 397 | - prod ps dist ds spn tag mile status import pa up vis # |
| 398 | - --------------------------------------------------------------- |
| 399 | - pr-a x x x x t-a x Confir Undeci F F x 1 |
| 400 | - pr-a x x x x t-b ms-a New Undeci F F x 1 |
| 401 | - pr-a x x x x t-c ms-a New Undeci F F x 1 |
| 402 | - pr-a x x x x x ms-a New Undeci F F x 1 |
| 403 | - pr-a x x x x x x New Undeci F F x 2 |
| 404 | - pr-a x x x x x x Confir Undeci F F x 2 |
| 405 | - === |
| 406 | - 8 |
| 407 | + ------------------------------------------------------------ |
| 408 | + prod ps dist ds spn tag mile status import pa vis # |
| 409 | + ------------------------------------------------------------ |
| 410 | + pr-a x x x x t-a x Confir Undeci F x 1 |
| 411 | + pr-a x x x x t-b ms-a New Undeci F x 1 |
| 412 | + pr-a x x x x t-c ms-a New Undeci F x 1 |
| 413 | + pr-a x x x x x ms-a New Undeci F x 1 |
| 414 | + pr-a x x x x x x New Undeci F x 2 |
| 415 | + pr-a x x x x x x Confir Undeci F x 2 |
| 416 | + === |
| 417 | + 8 |
| 418 | |
| 419 | Number of New bugs not targeted to a milestone. Note the difference |
| 420 | between selecting records where tag is None, and where milestone is None: |
| 421 | @@ -272,13 +269,13 @@ |
| 422 | ... BugSummary.productseries == productseries_b, |
| 423 | ... BugSummary.product == prod_b), |
| 424 | ... BugSummary.viewed_by == None) |
| 425 | - --------------------------------------------------------------- |
| 426 | - prod ps dist ds spn tag mile status import pa up vis # |
| 427 | - --------------------------------------------------------------- |
| 428 | - pr-b x x x x x x New Undeci F F x 1 |
| 429 | - x ps-b x x x x x New Undeci F F x 1 |
| 430 | - === |
| 431 | - 2 |
| 432 | + ------------------------------------------------------------ |
| 433 | + prod ps dist ds spn tag mile status import pa vis # |
| 434 | + ------------------------------------------------------------ |
| 435 | + pr-b x x x x x x New Undeci F x 1 |
| 436 | + x ps-b x x x x x New Undeci F x 1 |
| 437 | + === |
| 438 | + 2 |
| 439 | |
| 440 | Distribution Bug Counts |
| 441 | ----------------------- |
| 442 | @@ -300,14 +297,14 @@ |
| 443 | >>> print_find( |
| 444 | ... BugSummary.distribution == distribution, |
| 445 | ... BugSummary.viewed_by == None) |
| 446 | - --------------------------------------------------------------- |
| 447 | - prod ps dist ds spn tag mile status import pa up vis # |
| 448 | - --------------------------------------------------------------- |
| 449 | - x x di-a x sp-a x x New Undeci F F x 1 |
| 450 | - x x di-a x x x x New Undeci F F x 1 |
| 451 | - x x di-a x x x x Confir Undeci F F x 1 |
| 452 | - === |
| 453 | - 3 |
| 454 | + ------------------------------------------------------------ |
| 455 | + prod ps dist ds spn tag mile status import pa vis # |
| 456 | + ------------------------------------------------------------ |
| 457 | + x x di-a x sp-a x x New Undeci F x 1 |
| 458 | + x x di-a x x x x New Undeci F x 1 |
| 459 | + x x di-a x x x x Confir Undeci F x 1 |
| 460 | + === |
| 461 | + 3 |
| 462 | |
| 463 | How many bugs targeted to a distribution? |
| 464 | |
| 465 | @@ -372,12 +369,12 @@ |
| 466 | >>> print_find( |
| 467 | ... BugSummary.distroseries == series_c, |
| 468 | ... BugSummary.viewed_by == None) |
| 469 | - --------------------------------------------------------------- |
| 470 | - prod ps dist ds spn tag mile status import pa up vis # |
| 471 | - --------------------------------------------------------------- |
| 472 | - x x x ds-c x x x New Undeci F F x 1 |
| 473 | - === |
| 474 | - 1 |
| 475 | + ------------------------------------------------------------ |
| 476 | + prod ps dist ds spn tag mile status import pa vis # |
| 477 | + ------------------------------------------------------------ |
| 478 | + x x x ds-c x x x New Undeci F x 1 |
| 479 | + === |
| 480 | + 1 |
| 481 | |
| 482 | |
| 483 | Privacy |
| 484 | @@ -444,18 +441,18 @@ |
| 485 | ... BugSummary.distribution == distro_p, |
| 486 | ... BugSummary.distroseries == series_p) |
| 487 | >>> print_find(distro_or_series) |
| 488 | - --------------------------------------------------------------- |
| 489 | - prod ps dist ds spn tag mile status import pa up vis # |
| 490 | - --------------------------------------------------------------- |
| 491 | - x x di-p x x x x New Undeci F F p-b 1 |
| 492 | - x x di-p x x x x New Undeci F F own 3 |
| 493 | - x x di-p x x x x New Undeci F F t-a 1 |
| 494 | - x x di-p x x x x New Undeci F F t-c 1 |
| 495 | - x x di-p x x x x New Undeci F F x 1 |
| 496 | - x x x ds-p x x x New Undeci F F own 1 |
| 497 | - x x x ds-p x x x New Undeci F F t-c 1 |
| 498 | - === |
| 499 | - 9 |
| 500 | + ------------------------------------------------------------ |
| 501 | + prod ps dist ds spn tag mile status import pa vis # |
| 502 | + ------------------------------------------------------------ |
| 503 | + x x di-p x x x x New Undeci F p-b 1 |
| 504 | + x x di-p x x x x New Undeci F own 3 |
| 505 | + x x di-p x x x x New Undeci F t-a 1 |
| 506 | + x x di-p x x x x New Undeci F t-c 1 |
| 507 | + x x di-p x x x x New Undeci F x 1 |
| 508 | + x x x ds-p x x x New Undeci F own 1 |
| 509 | + x x x ds-p x x x New Undeci F t-c 1 |
| 510 | + === |
| 511 | + 9 |
| 512 | |
| 513 | So how many public bugs are there on the distro? |
| 514 | |
| 515 | |
| 516 | === modified file 'lib/lp/bugs/interfaces/bugsummary.py' |
| 517 | --- lib/lp/bugs/interfaces/bugsummary.py 2011-12-24 16:54:44 +0000 |
| 518 | +++ lib/lp/bugs/interfaces/bugsummary.py 2012-05-21 03:40:21 +0000 |
| 519 | @@ -72,7 +72,6 @@ |
| 520 | viewed_by = Object(IPerson, readonly=True) |
| 521 | |
| 522 | has_patch = Bool(readonly=True) |
| 523 | - fixed_upstream = Bool(readonly=True) |
| 524 | |
| 525 | |
| 526 | class IBugSummaryDimension(Interface): |
| 527 | |
| 528 | === modified file 'lib/lp/bugs/model/bugsummary.py' |
| 529 | --- lib/lp/bugs/model/bugsummary.py 2011-12-30 06:14:56 +0000 |
| 530 | +++ lib/lp/bugs/model/bugsummary.py 2012-05-21 03:40:21 +0000 |
| 531 | @@ -78,7 +78,6 @@ |
| 532 | viewed_by = Reference(viewed_by_id, Person.id) |
| 533 | |
| 534 | has_patch = Bool() |
| 535 | - fixed_upstream = Bool() |
| 536 | |
| 537 | |
| 538 | class CombineBugSummaryConstraint: |
| 539 | |
| 540 | === modified file 'lib/lp/bugs/model/tests/test_bugsummary.py' |
| 541 | --- lib/lp/bugs/model/tests/test_bugsummary.py 2012-05-02 05:25:11 +0000 |
| 542 | +++ lib/lp/bugs/model/tests/test_bugsummary.py 2012-05-21 03:40:21 +0000 |
| 543 | @@ -976,143 +976,6 @@ |
| 544 | BugSummary.milestone == milestone), |
| 545 | 0) |
| 546 | |
| 547 | - def test_fixUpstream(self): |
| 548 | - distribution = self.factory.makeDistribution() |
| 549 | - product = self.factory.makeProduct() |
| 550 | - distro_bugtask = self.factory.makeBugTask(target=distribution) |
| 551 | - bug = distro_bugtask.bug |
| 552 | - product_bugtask = self.factory.makeBugTask(bug=bug, target=product) |
| 553 | - |
| 554 | - self.assertEqual( |
| 555 | - self.getPublicCount( |
| 556 | - BugSummary.distribution == distribution, |
| 557 | - BugSummary.fixed_upstream == True), |
| 558 | - 0) |
| 559 | - self.assertEqual( |
| 560 | - self.getPublicCount( |
| 561 | - BugSummary.distribution == distribution, |
| 562 | - BugSummary.fixed_upstream == False), |
| 563 | - 1) |
| 564 | - |
| 565 | - product_bugtask.transitionToStatus( |
| 566 | - BugTaskStatus.FIXRELEASED, bug.owner) |
| 567 | - |
| 568 | - self.assertEqual( |
| 569 | - self.getPublicCount( |
| 570 | - BugSummary.distribution == distribution, |
| 571 | - BugSummary.fixed_upstream == True), |
| 572 | - 1) |
| 573 | - self.assertEqual( |
| 574 | - self.getPublicCount( |
| 575 | - BugSummary.distribution == distribution, |
| 576 | - BugSummary.fixed_upstream == False), |
| 577 | - 0) |
| 578 | - |
| 579 | - def test_breakUpstream(self): |
| 580 | - distribution = self.factory.makeDistribution() |
| 581 | - product = self.factory.makeProduct() |
| 582 | - distro_bugtask = self.factory.makeBugTask(target=distribution) |
| 583 | - bug = distro_bugtask.bug |
| 584 | - product_bugtask = self.factory.makeBugTask(bug=bug, target=product) |
| 585 | - |
| 586 | - product_bugtask.transitionToStatus( |
| 587 | - BugTaskStatus.FIXCOMMITTED, bug.owner) |
| 588 | - |
| 589 | - self.assertEqual( |
| 590 | - self.getPublicCount( |
| 591 | - BugSummary.distribution == distribution, |
| 592 | - BugSummary.fixed_upstream == True), |
| 593 | - 1) |
| 594 | - self.assertEqual( |
| 595 | - self.getPublicCount( |
| 596 | - BugSummary.distribution == distribution, |
| 597 | - BugSummary.fixed_upstream == False), |
| 598 | - 0) |
| 599 | - |
| 600 | - product_bugtask.transitionToStatus( |
| 601 | - BugTaskStatus.INPROGRESS, bug.owner) |
| 602 | - |
| 603 | - self.assertEqual( |
| 604 | - self.getPublicCount( |
| 605 | - BugSummary.distribution == distribution, |
| 606 | - BugSummary.fixed_upstream == True), |
| 607 | - 0) |
| 608 | - self.assertEqual( |
| 609 | - self.getPublicCount( |
| 610 | - BugSummary.distribution == distribution, |
| 611 | - BugSummary.fixed_upstream == False), |
| 612 | - 1) |
| 613 | - |
| 614 | - def test_fixUpstreamViaWatch(self): |
| 615 | - distribution = self.factory.makeDistribution() |
| 616 | - product = self.factory.makeProduct() |
| 617 | - distro_bugtask = self.factory.makeBugTask(target=distribution) |
| 618 | - bug = distro_bugtask.bug |
| 619 | - product_bugtask = self.factory.makeBugTask(bug=bug, target=product) |
| 620 | - self.factory.makeBugWatch(bug_task=product_bugtask) |
| 621 | - |
| 622 | - self.assertEqual( |
| 623 | - self.getPublicCount( |
| 624 | - BugSummary.distribution == distribution, |
| 625 | - BugSummary.fixed_upstream == True), |
| 626 | - 0) |
| 627 | - self.assertEqual( |
| 628 | - self.getPublicCount( |
| 629 | - BugSummary.distribution == distribution, |
| 630 | - BugSummary.fixed_upstream == False), |
| 631 | - 1) |
| 632 | - |
| 633 | - # Bugs flagged INVALID by upstream count as fixed upstream. |
| 634 | - product_bugtask.transitionToStatus( |
| 635 | - BugTaskStatus.INVALID, bug.owner) |
| 636 | - |
| 637 | - self.assertEqual( |
| 638 | - self.getPublicCount( |
| 639 | - BugSummary.distribution == distribution, |
| 640 | - BugSummary.fixed_upstream == True), |
| 641 | - 1) |
| 642 | - self.assertEqual( |
| 643 | - self.getPublicCount( |
| 644 | - BugSummary.distribution == distribution, |
| 645 | - BugSummary.fixed_upstream == False), |
| 646 | - 0) |
| 647 | - |
| 648 | - def test_breakUpstreamViaWatch(self): |
| 649 | - distribution = self.factory.makeDistribution() |
| 650 | - product = self.factory.makeProduct() |
| 651 | - distro_bugtask = self.factory.makeBugTask(target=distribution) |
| 652 | - bug = distro_bugtask.bug |
| 653 | - product_bugtask = self.factory.makeBugTask(bug=bug, target=product) |
| 654 | - self.factory.makeBugWatch(bug_task=product_bugtask) |
| 655 | - |
| 656 | - product_bugtask.transitionToStatus( |
| 657 | - BugTaskStatus.FIXCOMMITTED, bug.owner) |
| 658 | - |
| 659 | - self.assertEqual( |
| 660 | - self.getPublicCount( |
| 661 | - BugSummary.distribution == distribution, |
| 662 | - BugSummary.fixed_upstream == True), |
| 663 | - 1) |
| 664 | - self.assertEqual( |
| 665 | - self.getPublicCount( |
| 666 | - BugSummary.distribution == distribution, |
| 667 | - BugSummary.fixed_upstream == False), |
| 668 | - 0) |
| 669 | - |
| 670 | - product_bugtask.transitionToStatus( |
| 671 | - BugTaskStatus.UNKNOWN, bug.owner) |
| 672 | - |
| 673 | - self.assertEqual( |
| 674 | - self.getPublicCount( |
| 675 | - BugSummary.distribution == distribution, |
| 676 | - BugSummary.fixed_upstream == True), |
| 677 | - 0) |
| 678 | - self.assertEqual( |
| 679 | - self.getPublicCount( |
| 680 | - BugSummary.distribution == distribution, |
| 681 | - BugSummary.fixed_upstream == False), |
| 682 | - 1) |
| 683 | - |
| 684 | def test_addPatch(self): |
| 685 | product = self.factory.makeProduct() |
| 686 | bug = self.factory.makeBug(product=product) |
| 687 | |
| 688 | === modified file 'lib/lp/bugs/stories/xx-bugs-statistics-portlet.txt' |
| 689 | --- lib/lp/bugs/stories/xx-bugs-statistics-portlet.txt 2012-03-15 05:55:42 +0000 |
| 690 | +++ lib/lp/bugs/stories/xx-bugs-statistics-portlet.txt 2012-05-21 03:40:21 +0000 |
| 691 | @@ -37,7 +37,7 @@ |
| 692 | 0 Critical bugs |
| 693 | 0 High importance bugs |
| 694 | <BLANKLINE> |
| 695 | - 0 Bugs fixed elsewhere |
| 696 | + Bugs fixed elsewhere |
| 697 | 0 Bugs with patches |
| 698 | 2 Open CVE bugs - CVE reports |
| 699 | |
| 700 | @@ -71,7 +71,7 @@ |
| 701 | 0 Bugs reported by me |
| 702 | Bugs affecting me |
| 703 | <BLANKLINE> |
| 704 | - 0 Bugs fixed elsewhere |
| 705 | + Bugs fixed elsewhere |
| 706 | 0 Bugs with patches |
| 707 | 2 Open CVE bugs - CVE reports |
| 708 | |
| 709 | @@ -107,7 +107,7 @@ |
| 710 | 0 Critical bugs |
| 711 | 0 High importance bugs |
| 712 | <BLANKLINE> |
| 713 | - 0 Bugs fixed elsewhere |
| 714 | + Bugs fixed elsewhere |
| 715 | 0 Bugs with patches |
| 716 | 1 Open CVE bug - CVE report |
| 717 | |
| 718 | @@ -140,7 +140,7 @@ |
| 719 | 0 Bugs reported by me |
| 720 | Bugs affecting me |
| 721 | <BLANKLINE> |
| 722 | - 0 Bugs fixed elsewhere |
| 723 | + Bugs fixed elsewhere |
| 724 | 0 Bugs with patches |
| 725 | 1 Open CVE bug - CVE report |
| 726 | |
| 727 | @@ -175,7 +175,7 @@ |
| 728 | 0 Critical bugs |
| 729 | 0 High importance bugs |
| 730 | <BLANKLINE> |
| 731 | - 0 Bugs fixed elsewhere |
| 732 | + Bugs fixed elsewhere |
| 733 | 0 Bugs with patches |
| 734 | 2 Open CVE bugs |
| 735 | |
| 736 | @@ -208,7 +208,7 @@ |
| 737 | 0 Bugs reported by me |
| 738 | Bugs affecting me |
| 739 | <BLANKLINE> |
| 740 | - 0 Bugs fixed elsewhere |
| 741 | + Bugs fixed elsewhere |
| 742 | 0 Bugs with patches |
| 743 | 2 Open CVE bugs |
| 744 | |
| 745 | @@ -247,7 +247,7 @@ |
| 746 | 0 Critical bugs |
| 747 | 0 High importance bugs |
| 748 | <BLANKLINE> |
| 749 | - 0 Bugs fixed elsewhere |
| 750 | + Bugs fixed elsewhere |
| 751 | 0 Bugs with patches |
| 752 | 1 Open CVE bug |
| 753 | |
| 754 | @@ -280,7 +280,7 @@ |
| 755 | 0 Bugs reported by me |
| 756 | Bugs affecting me |
| 757 | <BLANKLINE> |
| 758 | - 0 Bugs fixed elsewhere |
| 759 | + Bugs fixed elsewhere |
| 760 | 0 Bugs with patches |
| 761 | 1 Open CVE bug |
| 762 | |
| 763 | @@ -318,7 +318,7 @@ |
| 764 | 1 Critical bug |
| 765 | 0 High importance bugs |
| 766 | <BLANKLINE> |
| 767 | - 0 Bugs fixed elsewhere |
| 768 | + Bugs fixed elsewhere |
| 769 | 0 Bugs with patches |
| 770 | 1 Open CVE bug |
| 771 | |
| 772 | @@ -352,7 +352,7 @@ |
| 773 | 0 Bugs reported by me |
| 774 | Bugs affecting me |
| 775 | <BLANKLINE> |
| 776 | - 0 Bugs fixed elsewhere |
| 777 | + Bugs fixed elsewhere |
| 778 | 0 Bugs with patches |
| 779 | 1 Open CVE bug |
| 780 | |
| 781 | @@ -390,7 +390,7 @@ |
| 782 | 1 Critical bug |
| 783 | 0 High importance bugs |
| 784 | <BLANKLINE> |
| 785 | - 0 Bugs fixed elsewhere |
| 786 | + Bugs fixed elsewhere |
| 787 | 0 Bugs with patches |
| 788 | 1 Open CVE bug - CVE report |
| 789 | |
| 790 | @@ -424,7 +424,7 @@ |
| 791 | 0 Bugs reported by me |
| 792 | Bugs affecting me |
| 793 | <BLANKLINE> |
| 794 | - 0 Bugs fixed elsewhere |
| 795 | + Bugs fixed elsewhere |
| 796 | 0 Bugs with patches |
| 797 | 1 Open CVE bug - CVE report |
| 798 | |
| 799 | @@ -433,30 +433,3 @@ |
| 800 | |
| 801 | >>> print user_browser.getLink('CVE report').url |
| 802 | http://bugs.launchpad.dev/firefox/+cve |
| 803 | - |
| 804 | - |
| 805 | -Hiding "Bugs fixed elsewhere" counts |
| 806 | ------------------------------------- |
| 807 | - |
| 808 | -The count of bugs fixed elsewhere is of dubious utility, and it's |
| 809 | -expensive to calculate when generating BugSummary. As a trial before we |
| 810 | -remove it, there's a feature flag to hide the count. |
| 811 | - |
| 812 | - >>> print_bugfilters_portlet_filled(user_browser, path) |
| 813 | - 3 New bugs |
| 814 | - ... |
| 815 | - <BLANKLINE> |
| 816 | - 0 Bugs fixed elsewhere |
| 817 | - 0 Bugs with patches |
| 818 | - ... |
| 819 | - |
| 820 | - >>> from lp.services.features.testing import FeatureFixture |
| 821 | - >>> with FeatureFixture( |
| 822 | - ... {'bugs.statistics_portlet.hide_fixed_elsewhere_count': 'true'}): |
| 823 | - ... print print_bugfilters_portlet_filled(user_browser, path) |
| 824 | - 3 New bugs |
| 825 | - ... |
| 826 | - <BLANKLINE> |
| 827 | - Bugs fixed elsewhere |
| 828 | - 0 Bugs with patches |
| 829 | - ... |
| 830 | |
| 831 | === modified file 'lib/lp/bugs/templates/bugtarget-portlet-bugfilters-content.pt' |
| 832 | --- lib/lp/bugs/templates/bugtarget-portlet-bugfilters-content.pt 2012-03-14 13:19:43 +0000 |
| 833 | +++ lib/lp/bugs/templates/bugtarget-portlet-bugfilters-content.pt 2012-05-21 03:40:21 +0000 |
| 834 | @@ -110,18 +110,7 @@ |
| 835 | |
| 836 | <tr><td colspan="2"><br /></td></tr> |
| 837 | |
| 838 | - <tr tal:condition="not: request/features/bugs.statistics_portlet.hide_fixed_elsewhere_count" |
| 839 | - tal:define="count view/bugs_fixed_elsewhere_count|nothing; |
| 840 | - plural string: Bugs fixed elsewhere; |
| 841 | - singular string: Bug fixed elsewhere;"> |
| 842 | - <td class="bugs-count" tal:content="count" /> |
| 843 | - <td class="bugs-link"> |
| 844 | - <a tal:attributes="href string:${view/bugs_fixed_elsewhere_url}"> |
| 845 | - <metal:message use-macro="context/@@+base-layout-macros/plural-message"/> |
| 846 | - </a> |
| 847 | - </td> |
| 848 | - </tr> |
| 849 | - <tr tal:condition="request/features/bugs.statistics_portlet.hide_fixed_elsewhere_count"> |
| 850 | + <tr> |
| 851 | <tal:comment condition="nothing"> |
| 852 | No count here, because generating it is expensive. |
| 853 | </tal:comment> |
| 854 | |
| 855 | === modified file 'lib/lp/services/features/flags.py' |
| 856 | --- lib/lp/services/features/flags.py 2012-05-08 01:31:10 +0000 |
| 857 | +++ lib/lp/services/features/flags.py 2012-05-21 03:40:21 +0000 |
| 858 | @@ -96,13 +96,6 @@ |
| 859 | '', |
| 860 | '', |
| 861 | ''), |
| 862 | - ('bugs.statistics_portlet.hide_fixed_elsewhere_count', |
| 863 | - 'boolean', |
| 864 | - ('Hides the "Bugs fixed elsewhere" count in the bug target statistics ' |
| 865 | - 'portlet.'), |
| 866 | - '', |
| 867 | - '', |
| 868 | - ''), |
| 869 | ('code.ajax_revision_diffs.enabled', |
| 870 | 'boolean', |
| 871 | ("Offer expandable inline diffs for branch revisions."), |

Looks fine.