~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/bugs/doc/bugtask-expiration.txt

  • Committer: Stuart Bishop
  • Date: 2011-09-28 12:49:24 UTC
  • mfrom: (9893.10.1 trivial)
  • mto: This revision was merged to the branch mainline in revision 14178.
  • Revision ID: stuart.bishop@canonical.com-20110928124924-m5a22fymqghw6c5i
Merged trivial into distinct-db-users.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
= Bugtask Expiration =
 
1
Bugtask Expiration
 
2
==================
2
3
 
3
4
Old unattended Incomplete bugtasks clutter the search results of
4
5
Launchpad Bugs making the bug staff's job difficult. A script is run
21
22
all the rules stated above.
22
23
 
23
24
 
24
 
== findExpirableBugTasks() Part 1 ==
 
25
findExpirableBugTasks() Part 1
 
26
------------------------------
25
27
 
26
28
BugTaskSet provides findExpirableBugTasks() to find bugtasks that
27
29
qualify for expiration. The bugtasks must must meet all the
50
52
    >>> expirable_bugtasks.count()
51
53
    0
52
54
 
53
 
 
54
 
== Setup ==
 
55
We need a function to reset the last_modified date of a bug because
 
56
setPrivate() now publishes an object modified event which will cause the
 
57
date_last_modified to be set to 'now'. We require some bugs used in this test
 
58
to be last modified in the past.
 
59
 
 
60
    >>> def reset_bug_modified_date(bug, days_ago):
 
61
    ...     from datetime import datetime, timedelta
 
62
    ...     import pytz
 
63
    ...     UTC = pytz.timezone('UTC')
 
64
    ...     date_modified = datetime.now(UTC) - timedelta(days=days_ago)
 
65
    ...     bug.date_last_updated = date_modified
 
66
 
 
67
 
 
68
Setup
 
69
-----
55
70
 
56
71
Let's make some bugtasks that qualify for expiration. A Jokosher
57
72
bugtask and a conjoined pair of ubuntu_hoary and ubuntu bugtasks
229
244
    recent           False    31  Incomplete  False     False  False  False
230
245
    no_expire        False    61  Incomplete  False     False  False  False
231
246
 
232
 
== isExpirable() ==
 
247
isExpirable()
 
248
-------------
233
249
 
234
250
In addition to can_expire bugs have an isExpirable method to which a custom
235
251
number of days, days_old, can be passed.  days_old is then used with
245
261
    >>> very_old_bugtask.transitionToStatus(
246
262
    ...     BugTaskStatus.INVALID, sample_person)
247
263
 
248
 
    # Pass isExpirable() a days_old parameter, then set the bug to Invalid so it
249
 
    # doesn't affect the rest of the doctest
 
264
    # Pass isExpirable() a days_old parameter, then set the bug to Invalid so
 
265
    # it doesn't affect the rest of the doctest.
250
266
    >>> from lp.bugs.tests.bug import create_old_bug
251
267
    >>> not_so_old_bugtask = create_old_bug('expirable_distro', 31, ubuntu)
252
268
    >>> not_so_old_bugtask.bug.isExpirable(days_old=14)
255
271
    ...     BugTaskStatus.INVALID, sample_person)
256
272
 
257
273
 
258
 
== findExpirableBugTasks() Part 2 ==
 
274
findExpirableBugTasks() Part 2
 
275
------------------------------
259
276
 
260
277
The value of the min_days_old controls the bugtasks that are
261
278
returned. The oldest bug in this test is 351 days old, the youngest is
364
381
    ROLE         EXPIRE  AGE  STATUS      ASSIGNED  DUP    MILE   REPLIES
365
382
 
366
383
 
367
 
== Privacy ==
 
384
Privacy
 
385
-------
368
386
 
369
387
The user parameter indicates which user is performing the search. Only
370
388
bugs that the user has permission to view are returned. A value of None
384
402
    u'expirable_distro'
385
403
    >>> private_bug.setPrivate(True, sample_person)
386
404
    True
 
405
    >>> reset_bug_modified_date(private_bug, 351)
387
406
 
388
407
    >>> expirable_bugtasks = bugtaskset.findExpirableBugTasks(
389
408
    ...     0, user=None, target=ubuntu)
405
424
 
406
425
    >>> private_bug.subscribe(no_priv, sample_person)
407
426
    <lp.bugs.model.bugsubscription.BugSubscription ...>
 
427
    >>> reset_bug_modified_date(private_bug, 351)
408
428
    >>> expirable_bugtasks = bugtaskset.findExpirableBugTasks(
409
429
    ...     0, user=no_priv, target=ubuntu)
410
430
    >>> visible_bugs = set(bugtask.bug for bugtask in expirable_bugtasks)
428
448
 
429
449
    >>> private_bug.setPrivate(False, sample_person)
430
450
    True
431
 
 
432
 
 
433
 
== The default expiration age ==
 
451
    >>> reset_bug_modified_date(private_bug, 351)
 
452
 
 
453
The default expiration age
 
454
--------------------------
434
455
 
435
456
The expiration age is set using the
436
457
config.malone.days_before_expiration configuration variable. It
444
465
    60
445
466
 
446
467
 
447
 
== Running the script ==
 
468
Running the script
 
469
------------------
448
470
 
449
471
There are no Expired Bugtasks in sampledata, from the tests above.
450
472
 
489
511
    >>> bugtasks = [BugTask.get(bugtask.id) for bugtask in bugtasks]
490
512
 
491
513
 
492
 
== After the script has run ==
 
514
After the script has run
 
515
------------------------
493
516
 
494
517
There are three Expired bugtasks. Jokosher, hoary and ubuntu were
495
518
expired by the expiration process. Although ubuntu was never returned
536
559
    Launchpad Janitor  Ubuntu Hoary: status  Incomplete  Expired
537
560
 
538
561
 
539
 
== enable_bug_expiration ==
 
562
enable_bug_expiration
 
563
---------------------
540
564
 
541
565
The bugtask no_expiration_bugtask has not been expired because it does
542
566
not participate in bug expiration. When uses_bug_expiration is set to