~launchpad-pqm/launchpad/devel

« back to all changes in this revision

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

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-10-03 15:22:48 UTC
  • mfrom: (8758.4.18 garbo-lockfile)
  • Revision ID: launchpad@pqm.canonical.com-20111003152248-cv30fo2i8p0mu5mb
[r=lifeless][bug=553254] Regularly prune LoginToken rows

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
Introduction
2
 
===================================
 
1
= Introduction =
3
2
 
4
3
Bugs are problems in software. When a bug gets assigned to a specific
5
4
upstream or distro/sourcepackagename, a bug /task/ is created. In
7
6
place. Where a bug has things like a title, comments and subscribers,
8
7
it's the bug task that tracks importance, assignee, etc.
9
8
 
10
 
Working with Bug Tasks in Launchpad
11
 
===================================
12
 
 
13
 
 
14
 
Creating Bug Tasks
15
 
------------------
 
9
= Working with Bug Tasks in Launchpad =
 
10
 
 
11
 
 
12
== Creating Bug Tasks ==
16
13
 
17
14
All BugTask creation and retrieval is done through an IBugTaskSet utility.
18
15
 
91
88
# the connection after a ProgrammingError is raised. ARGH.
92
89
 
93
90
 
94
 
Bug Task Targets
95
 
----------------
 
91
== Bug Task Targets ==
96
92
 
97
 
    >>> from lp.registry.interfaces.distributionsourcepackage \
98
 
    ...     import IDistributionSourcePackage
 
93
    >>> from lp.registry.interfaces.distributionsourcepackage import IDistributionSourcePackage
 
94
    >>> from lp.registry.model.distributionsourcepackage import DistributionSourcePackage
99
95
 
100
96
The "target" of an IBugTask can be one of the items in the following
101
97
list.
129
125
  * a distribution sourcepackage
130
126
 
131
127
    >>> def get_expected_target(distro_sp_task):
 
128
    ...      expected_target = DistributionSourcePackage(
 
129
    ...         distro_sp_task.distribution,
 
130
    ...         distro_sp_task.sourcepackagename)
132
131
    ...      return distro_sp_task.target
133
 
 
 
132
    ...
134
133
    >>> debian_ff_task = bugtaskset.get(4)
135
134
    >>> IDistributionSourcePackage.providedBy(debian_ff_task.target)
136
135
    True
162
161
    True
163
162
 
164
163
Each task has a "bugtargetdisplayname" and a "bugtargetname", strings
165
 
describing the site of the task. They concatenate the names of the
166
 
distribution,
 
164
describing the site of the task. They concatenate the names of the distribution,
167
165
 
168
166
    >>> bugtask = bugtaskset.get(17)
169
167
    >>> bugtask.bugtargetdisplayname
184
182
package).
185
183
 
186
184
 
187
 
getPackageComponent
188
 
...................
 
185
=== getPackageComponent ===
189
186
 
190
187
We offer a convenience method on IBugTask which allows you to look up
191
188
the archive component associated to the bugtask's target. Obviously, it
212
209
    main
213
210
 
214
211
 
215
 
Editing Bug Tasks
216
 
-----------------
 
212
== Editing Bug Tasks ==
217
213
 
218
214
When changing status we must pass the user making the change. Some
219
215
statuses are restricted to Bug Supervisors only.
220
216
 
221
217
 
222
 
Upstream Bug Tasks
223
 
..................
 
218
=== Upstream Bug Tasks ===
224
219
 
225
220
To edit an upstream task, you must be logged in. Anonymous users
226
221
cannot edit upstream tasks.
239
234
    ...     STATUS_FIXRELEASED, getUtility(ILaunchBag).user)
240
235
 
241
236
 
242
 
Distro and Distro Series Bug Tasks
243
 
..................................
 
237
=== Distro and Distro Series Bug Tasks ===
244
238
 
245
239
Any logged-in user can edit tasks filed on distros as long as the bug
246
240
is not marked private. So, as an anonymous user, we cannot edit
270
264
    >>> distro_series_task.transitionToAssignee(sample_person)
271
265
 
272
266
 
273
 
Conjoined Bug Tasks
274
 
...................
 
267
=== Conjoined Bug Tasks ===
275
268
 
276
269
A bugtask open on the current development series for a distro is kept
277
270
in sync with the "generic" bugtask for that distro, because they
278
271
represent the same piece of work. The same is true for product and
279
272
productseries tasks, when the productseries task is targeted to the
280
 
IProduct.developmentfocus. The following attributes are synced:
 
273
IProduct.developmentfocus. The following attributes are synched:
281
274
 
282
275
    * status
283
276
    * assignee
570
563
    Traceback (most recent call last):
571
564
    ...
572
565
    UserCannotEditBugTaskImportance:
573
 
      User does not have sufficient permissions to edit the
574
 
      bug task importance.
 
566
      User does not have sufficient permissions to edit the bug task importance.
575
567
 
576
568
    >>> print generic_netapplet_task.importance.title
577
569
    Medium
602
594
    Traceback (most recent call last):
603
595
    ...
604
596
    UserCannotEditBugTaskMilestone:
605
 
      User does not have sufficient permissions to edit the bug
606
 
      task milestone.
 
597
      User does not have sufficient permissions to edit the bug task milestone.
607
598
 
608
599
    >>> print devel_focus_alsa_utils_task.milestone.name
609
600
    test
694
685
    False
695
686
 
696
687
 
697
 
Bug Privacy
698
 
===========
 
688
= Bug Privacy =
699
689
 
700
 
A bug is either private or public. Private bugs are only visible
701
 
(e.g. in search listings) to explicit subscribers and Launchpad
702
 
admins. Public bugs are visible to anyone.
 
690
A bug is either private or public. Private bugs are only visible (e.g. in search
 
691
listings) to explicit subscribers and Launchpad admins. Public bugs are visible
 
692
to anyone.
703
693
 
704
694
    >>> from zope.event import notify
705
695
    >>> from lazr.lifecycle.event import ObjectModifiedEvent
706
696
 
707
697
 
708
 
Privacy and Unprivileged Users
709
 
------------------------------
 
698
== Privacy and Unprivileged Users ==
710
699
 
711
700
Let's log in as the user Foo Bar (to be allowed to edit bugs):
712
701
 
740
729
    >>> from canonical.database.sqlbase import flush_database_updates
741
730
    >>> flush_database_updates()
742
731
 
743
 
If we now login as someone who was neither implicitly nor explicitly
744
 
subscribed to this bug, e.g. No Privileges Person, they will not be
745
 
able to access or set properties of the bugtask.
 
732
If we now login as someone who was neither implicitly nor explicitly subscribed
 
733
to this bug, e.g. No Privileges Person, they will not be able to access or set
 
734
properties of the bugtask.
746
735
 
747
736
    >>> login("no-priv@canonical.com")
748
737
    >>> mr_no_privs = launchbag.user
783
772
    [2]
784
773
 
785
774
 
786
 
Open bugtask count for a given list of projects
787
 
-----------------------------------------------
 
775
== Open bugtask count for a given list of projects ==
788
776
 
789
777
IBugTaskSet.getOpenBugTasksPerProduct() will return a dictionary
790
778
of product_id:count entries for bugs in an open status that
822
810
    product_id=20 count=3
823
811
 
824
812
 
825
 
Privacy and Priviledged Users
826
 
-----------------------------
 
813
== Privacy and Priviledged Users ==
827
814
 
828
815
Now, we'll log in as Mark Shuttleworth, who was assigned to this bug
829
816
when it was marked private:
839
826
    ...     BugTaskStatus.NEW, getUtility(ILaunchBag).user)
840
827
 
841
828
 
842
 
Privacy and Team Awareness
843
 
--------------------------
 
829
== Privacy and Team Awareness ==
844
830
 
845
831
No Privileges Person can't see the private bug, because he's not a subscriber:
846
832
 
852
838
    [4, 5, 6]
853
839
 
854
840
 
855
 
But if we add No Privileges Person to the Ubuntu Team, and because the
856
 
Ubuntu Team *is* subscribed to the bug, No Privileges Person will see
857
 
the private bug.
 
841
But if we add No Privileges Person to the Ubuntu Team, and because the Ubuntu
 
842
Team *is* subscribed to the bug, No Privileges Person will see the private bug.
858
843
 
859
844
    >>> login("mark@example.com")
860
845
    >>> ignored = ubuntu_team.addMember(
878
863
    [1, 4, 5, 7, 13, 15, 15]
879
864
 
880
865
 
881
 
Privacy and Launchpad Admins
882
 
----------------------------
 
866
== Privacy and Launchpad Admins ==
883
867
 
884
868
Let's log in as Daniel Henrique Debonzi:
885
869
 
924
908
 
925
909
 
926
910
 
927
 
Sorting Bug Tasks
928
 
-----------------
 
911
== Sorting Bug Tasks ==
929
912
 
930
913
Bug tasks need to sort in a very particular order. We want product tasks
931
914
first, then ubuntu tasks, then other distro-related tasks. In the
949
932
    Tubuntu
950
933
 
951
934
 
952
 
BugTask Adaptation
953
 
------------------
 
935
== BugTask Adaptation ==
954
936
 
955
937
An IBugTask can be adapted to an IBug.
956
938
 
957
 
    >>> from lp.bugs.interfaces.bug import IBug
958
 
 
959
 
    >>> bugtask_four = bugtaskset.get(4)
960
 
    >>> bug = IBug(bugtask_four)
961
 
    >>> bug.title
962
 
    u'Firefox does not support SVG'
963
 
 
964
 
 
965
 
The targetnamecache attribute of BugTask
966
 
----------------------------------------
967
 
 
968
 
The BugTask table has this targetnamecache attribute which stores a
969
 
computed value to allow us to sort and search on that value without
970
 
having to do lots of SQL joins. This cached value gets updated daily
971
 
by the update-bugtask-targetnamecaches cronscript and whenever the
972
 
bugtask is changed.  Of course, it's also computed and set when a
973
 
bugtask is created.
 
939
   >>> from lp.bugs.interfaces.bug import IBug
 
940
 
 
941
   >>> bugtask_four = bugtaskset.get(4)
 
942
   >>> bug = IBug(bugtask_four)
 
943
   >>> bug.title
 
944
   u'Firefox does not support SVG'
 
945
 
 
946
 
 
947
== The targetnamecache attribute of BugTask ==
 
948
 
 
949
The BugTask table has this targetnamecache attribute which stores a computed
 
950
value to allow us to sort and search on that value without having to do lots
 
951
of SQL joins. This cached value gets updated daily by the
 
952
update-bugtask-targetnamecaches cronscript and whenever the bugtask is changed.
 
953
Of course, it's also computed and set when a bugtask is created.
974
954
 
975
955
`BugTask.bugtargetdisplayname` simply returns `targetnamecache`, and
976
956
the latter is not exposed in `IBugTask`, so the `bugtargetdisplayname`
1008
988
    >>> (out, err) = process.communicate()
1009
989
 
1010
990
    >>> print err
1011
 
    INFO Creating lockfile:
1012
 
        /var/lock/launchpad-launchpad-targetnamecacheupdater.lock
 
991
    INFO Creating lockfile: /var/lock/launchpad-launchpad-targetnamecacheupdater.lock
1013
992
    INFO Updating targetname cache of bugtasks.
1014
993
    INFO Calculating targets.
1015
994
    INFO Will check ... targets.
1101
1080
    u'Mozilla Thunderbird'
1102
1081
 
1103
1082
 
1104
 
Target Uses Malone
1105
 
------------------
 
1083
== Target Uses Malone ==
1106
1084
 
1107
1085
Bug tasks have a flag, target_uses_malone, that says whether the bugtask
1108
1086
target uses Malone as its official bugtracker.
1120
1098
    Tubuntu                        False
1121
1099
 
1122
1100
 
1123
 
BugTask badges
1124
 
--------------
 
1101
== BugTask badges ==
1125
1102
 
1126
1103
A bug can have certain properties, which results in a badge being
1127
1104
displayed in bug listings. BugTaskSet has a method,
1180
1157
     has_specification: False
1181
1158
 
1182
1159
 
1183
 
Similar bugs
1184
 
------------
 
1160
== Similar bugs ==
1185
1161
 
1186
1162
It's possible to get a list of bugs similar to the current bug by
1187
1163
accessing the similar_bugs property of its bug tasks.