Merge lp:~jml/launchpad/remove-bounty-bug-418453 into lp:launchpad

Proposed by Jonathan Lange
Status: Merged
Approved by: Henning Eggers
Approved revision: no longer in the source branch.
Merged at revision: not available
Proposed branch: lp:~jml/launchpad/remove-bounty-bug-418453
Merge into: lp:launchpad
Diff against target: None lines
To merge this branch: bzr merge lp:~jml/launchpad/remove-bounty-bug-418453
Reviewer Review Type Date Requested Status
Henning Eggers (community) code Approve
Review via email: mp+10897@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Jonathan Lange (jml) wrote :

This branch removes the bounty code from Launchpad. It keeps the bounty subscription code, since it's still needed to do person merges correctly.

Revision history for this message
Henning Eggers (henninge) wrote :

Die old code, die!

Although I am not aware of the reasons why bounties had to go but that is besides the point ...

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/canonical/launchpad/browser/__init__.py'
2--- lib/canonical/launchpad/browser/__init__.py 2009-07-18 00:05:49 +0000
3+++ lib/canonical/launchpad/browser/__init__.py 2009-08-28 06:16:16 +0000
4@@ -15,8 +15,6 @@
5 from lp.soyuz.browser.archive import *
6 from lp.code.browser.bazaar import *
7 from lp.soyuz.browser.binarypackagerelease import *
8-from canonical.launchpad.browser.bounty import *
9-from canonical.launchpad.browser.bountysubscription import *
10 from lp.code.browser.branchmergeproposal import *
11 from lp.code.browser.branchref import *
12 from lp.code.browser.branchsubscription import *
13@@ -48,7 +46,6 @@
14 from canonical.launchpad.browser.logintoken import *
15 from lp.registry.browser.mailinglists import *
16 from lp.registry.browser.mentoringoffer import *
17-from canonical.launchpad.browser.message import *
18 from canonical.launchpad.browser.oauth import *
19 from canonical.launchpad.browser.objectreassignment import *
20 from canonical.launchpad.browser.packagerelationship import *
21
22=== removed file 'lib/canonical/launchpad/browser/bounty.py'
23--- lib/canonical/launchpad/browser/bounty.py 2009-06-25 05:30:52 +0000
24+++ lib/canonical/launchpad/browser/bounty.py 1970-01-01 00:00:00 +0000
25@@ -1,182 +0,0 @@
26-# Copyright 2009 Canonical Ltd. This software is licensed under the
27-# GNU Affero General Public License version 3 (see the file LICENSE).
28-
29-__metaclass__ = type
30-
31-__all__ = [
32- 'BountySetNavigation',
33- 'BountiesAppMenu',
34- 'BountyContextMenu',
35- 'BountyView',
36- 'BountyLinkView',
37- 'BountyEditView',
38- 'BountyAddView',
39- 'BountySetView'
40- ]
41-
42-from zope.component import getUtility
43-from zope.event import notify
44-from zope.lifecycleevent import ObjectCreatedEvent
45-from zope.app.form.browser.add import AddView
46-from zope.security.interfaces import Unauthorized
47-from zope.app.form.browser.editview import EditView
48-
49-from canonical.launchpad.interfaces import (
50- IBounty, IBountySet, ILaunchBag, IProduct, IProject, IDistribution)
51-
52-from canonical.launchpad.webapp import (
53- canonical_url, LaunchpadView, ApplicationMenu, ContextMenu, Link,
54- enabled_with_permission, GetitemNavigation)
55-
56-
57-class BountySetNavigation(GetitemNavigation):
58-
59- usedfor = IBountySet
60-
61-
62-class BountiesAppMenu(ApplicationMenu):
63- usedfor = IBountySet
64- facet = 'bounties'
65- links = ['new']
66-
67- def new(self):
68- text = "Register a bounty"
69- return Link('+new', text, icon="add")
70-
71-
72-class BountyContextMenu(ContextMenu):
73- usedfor = IBounty
74- links = ['edit', 'subscription', 'administer']
75-
76- def edit(self):
77- text = 'Edit bounty'
78- return Link('+edit', text, icon='edit')
79-
80- def subscription(self):
81- user = getUtility(ILaunchBag).user
82- if (user is not None and
83- get_subscription_for_person(user, self.context) is not None):
84- text = 'Unsubscribe from Bounty'
85- icon = 'remove'
86- elif user is None:
87- text = 'Subscribe/Unsubscribe'
88- icon = 'edit'
89- else:
90- text = 'Subscribe to Bounty'
91- icon = 'add'
92- return Link('+subscribe', text, icon=icon)
93-
94- @enabled_with_permission('launchpad.Admin')
95- def administer(self):
96- text = 'Administer'
97- return Link('+admin', text, icon='edit')
98-
99-
100-def get_subscription_for_person(person, bounty):
101- """Return the subscription the person has on the bounty, or None if there
102- is not such subscription.
103- """
104- # XXX: SteveAlexander 2005-09-23:
105- # Refactor to method on IBounty.
106- for subscription in bounty.subscriptions:
107- if subscription.person.id == person.id:
108- return subscription
109- return None
110-
111-
112-class BountyView(LaunchpadView):
113- """View class used for bounty pages."""
114-
115- __used_for__ = IBounty
116-
117- def initialize(self):
118- self.notices = []
119- # establish if a subscription form was posted
120- newsub = self.request.form.get('subscribe', None)
121- if newsub is not None and self.user and self.request.method == 'POST':
122- if newsub == 'Subscribe':
123- self.context.subscribe(self.user)
124- elif newsub == 'Unsubscribe':
125- self.context.unsubscribe(self.user)
126- self.notices.append(
127- "Your subscription to this bounty has been updated.")
128-
129- @property
130- def subscription(self):
131- """establish if this user has a subscription"""
132- if self.user is None:
133- return None
134- return get_subscription_for_person(self.user, self.context)
135-
136-
137-class BountyEditView(EditView):
138-
139- def changed(self):
140- self.request.response.redirect(canonical_url(self.context))
141-
142-
143-class BountyLinkView(AddView):
144-
145- def __init__(self, context, request):
146- self.request = request
147- self.context = context
148- self._nextURL = '.'
149- AddView.__init__(self, context, request)
150-
151- def createAndAdd(self, data):
152- bounty = data['bounty']
153- bountylink = self.context.ensureRelatedBounty(bounty)
154- self._nextURL = canonical_url(self.context)
155- return bounty
156-
157- def nextURL(self):
158- return self._nextURL
159-
160-
161-class BountyAddView(AddView):
162-
163- def __init__(self, context, request):
164- self.request = request
165- self.context = context
166- self._nextURL = '.'
167- AddView.__init__(self, context, request)
168-
169- def createAndAdd(self, data):
170- # add the owner information for the bounty
171- owner = getUtility(ILaunchBag).user
172- if not owner:
173- raise Unauthorized(
174- "Must have an authenticated user in order to create a bounty")
175- # XXX Mark Shuttleworth 2004-11-09:
176- # Need the fancy-person selector to select a reviewer.
177- reviewer = owner
178- bounty = getUtility(IBountySet).new(
179- name=data['name'],
180- title=data['title'],
181- summary=data['summary'],
182- description=data['description'],
183- usdvalue=data['usdvalue'],
184- owner=owner,
185- reviewer=reviewer)
186- # if the context is a product, or a project, or a distribution, then
187- # we need to link to it
188- if IProduct.providedBy(self.context) or \
189- IProject.providedBy(self.context) or \
190- IDistribution.providedBy(self.context):
191- self.context.ensureRelatedBounty(bounty)
192- notify(ObjectCreatedEvent(bounty))
193- self._nextURL = canonical_url(bounty)
194- return bounty
195-
196- def nextURL(self):
197- return self._nextURL
198-
199-
200-class BountySetView(LaunchpadView):
201-
202- def initialize(self):
203- self.bounties = getUtility(IBountySet)
204-
205- def top_bounties(self):
206- return self.bounties.top_bounties
207-
208
209=== removed file 'lib/canonical/launchpad/browser/bountysubscription.py'
210--- lib/canonical/launchpad/browser/bountysubscription.py 2009-06-25 05:30:52 +0000
211+++ lib/canonical/launchpad/browser/bountysubscription.py 1970-01-01 00:00:00 +0000
212@@ -1,15 +0,0 @@
213-# Copyright 2009 Canonical Ltd. This software is licensed under the
214-# GNU Affero General Public License version 3 (see the file LICENSE).
215-
216-__metaclass__ = type
217-
218-__all__ = ['BountySubscriptionNavigation']
219-
220-from canonical.launchpad.webapp import GetitemNavigation
221-from canonical.launchpad.interfaces import IBountySubscription
222-
223-
224-class BountySubscriptionNavigation(GetitemNavigation):
225-
226- usedfor = IBountySubscription
227-
228
229=== modified file 'lib/canonical/launchpad/browser/launchpad.py'
230--- lib/canonical/launchpad/browser/launchpad.py 2009-08-26 07:59:49 +0000
231+++ lib/canonical/launchpad/browser/launchpad.py 2009-08-28 06:38:41 +0000
232@@ -52,7 +52,6 @@
233 from lp.registry.interfaces.announcement import IAnnouncementSet
234 from lp.soyuz.interfaces.binarypackagename import (
235 IBinaryPackageNameSet)
236-from canonical.launchpad.interfaces.bounty import IBountySet
237 from lp.code.interfaces.branch import IBranchSet
238 from lp.code.interfaces.branchlookup import IBranchLookup
239 from lp.code.interfaces.branchnamespace import InvalidNamespace
240@@ -136,7 +135,7 @@
241 if link.enabled or config.devmode],
242 key=operator.attrgetter('sort_key'))
243 facet = menuapi.selectedfacetname()
244- if facet not in ('unknown', 'bounties'):
245+ if facet != 'unknown':
246 # XXX sinzui 2008-06-23 bug=242453:
247 # Why are we getting unknown? Bounties are borked. We need
248 # to end the facet hacks to get a clear state for the menus.
249@@ -341,12 +340,6 @@
250 summary = 'Launchpad feature specification tracker.'
251 return Link(target, text, summary)
252
253- def bounties(self):
254- target = 'bounties'
255- text = 'Bounties'
256- summary = 'The Launchpad Universal Bounty Tracker'
257- return Link(target, text, summary)
258-
259 def branches(self):
260 target = ''
261 text = 'Code'
262@@ -492,7 +485,6 @@
263 '+announcements': IAnnouncementSet,
264 'binarypackagenames': IBinaryPackageNameSet,
265 'branches': IBranchSet,
266- 'bounties': IBountySet,
267 'bugs': IMaloneApplication,
268 'builders': IBuilderSet,
269 '+code': IBazaarApplication,
270
271=== modified file 'lib/canonical/launchpad/browser/message.py'
272--- lib/canonical/launchpad/browser/message.py 2009-06-25 05:30:52 +0000
273+++ lib/canonical/launchpad/browser/message.py 2009-08-27 07:05:16 +0000
274@@ -5,33 +5,10 @@
275
276 __metaclass__ = type
277
278-__all__ = ['MessageAddView']
279-
280 from zope.interface import implements
281
282-from canonical.launchpad import _
283-from canonical.launchpad.interfaces.message import IIndexedMessage, IMessage
284-from canonical.launchpad.webapp import canonical_url
285+from canonical.launchpad.interfaces.message import IIndexedMessage
286 from canonical.launchpad.webapp.interfaces import ICanonicalUrlData
287-from canonical.launchpad.webapp.launchpadform import action, LaunchpadFormView
288-
289-
290-# XXX: salgado, 2008-10-16: This view is currently unused because it's only
291-# used by bounties and those are not exposed anywhere. It is also untested, so
292-# it's very likely it doesn't work -- I only touched it because I wanted to
293-# get rid of SQLObjectAddView and this was the last place using it.
294-class MessageAddView(LaunchpadFormView):
295- """View class for adding an IMessage to an IBug."""
296-
297- schema = IMessage
298- label = 'Add message or comment'
299- field_names = ['subject', 'content']
300-
301- @action(_('Add'), name='add')
302- def add_action(self, action, data):
303- self.context.newMessage(
304- owner=self.user, subject=data['subject'], content=data['content'])
305- self.next_url = canonical_url(self.context)
306
307
308 class BugMessageCanonicalUrlData:
309
310=== modified file 'lib/canonical/launchpad/database/__init__.py'
311--- lib/canonical/launchpad/database/__init__.py 2009-07-23 18:10:26 +0000
312+++ lib/canonical/launchpad/database/__init__.py 2009-08-27 07:05:16 +0000
313@@ -56,16 +56,10 @@
314
315 from canonical.launchpad.database.account import *
316 from canonical.launchpad.database.personnotification import *
317-from canonical.launchpad.database.productbounty import *
318 from canonical.launchpad.database.packaging import *
319-from canonical.launchpad.database.projectbounty import *
320 from canonical.launchpad.database.librarian import *
321 from canonical.launchpad.database.launchpadstatistic import *
322 from canonical.launchpad.database.binaryandsourcepackagename import *
323-from canonical.launchpad.database.distributionbounty import *
324-from canonical.launchpad.database.bounty import *
325-from canonical.launchpad.database.bountymessage import *
326-from canonical.launchpad.database.bountysubscription import *
327 from canonical.launchpad.database.message import *
328 from canonical.launchpad.database.structuralsubscription import *
329 from canonical.launchpad.database.logintoken import *
330
331=== removed file 'lib/canonical/launchpad/database/bounty.py'
332--- lib/canonical/launchpad/database/bounty.py 2009-06-25 05:30:52 +0000
333+++ lib/canonical/launchpad/database/bounty.py 1970-01-01 00:00:00 +0000
334@@ -1,158 +0,0 @@
335-# Copyright 2009 Canonical Ltd. This software is licensed under the
336-# GNU Affero General Public License version 3 (see the file LICENSE).
337-
338-# pylint: disable-msg=E0611,W0212
339-
340-__metaclass__ = type
341-__all__ = ['Bounty', 'BountySet']
342-
343-
344-from email.Utils import make_msgid
345-
346-from zope.interface import implements
347-from zope.app.form.browser.interfaces import IAddFormCustomization
348-
349-from sqlobject import ForeignKey, StringCol
350-from sqlobject import CurrencyCol
351-from sqlobject import SQLMultipleJoin, SQLRelatedJoin
352-
353-from canonical.launchpad.interfaces import (
354- BountyDifficulty, BountyStatus, IBounty, IBountySet, NotFoundError)
355-
356-from canonical.database.sqlbase import SQLBase
357-from canonical.database.constants import DEFAULT
358-from canonical.database.datetimecol import UtcDateTimeCol
359-from canonical.database.enumcol import EnumCol
360-
361-from canonical.launchpad.database.message import Message, MessageChunk
362-from canonical.launchpad.database.bountymessage import BountyMessage
363-from canonical.launchpad.database.bountysubscription import BountySubscription
364-from lp.registry.interfaces.person import validate_public_person
365-
366-
367-class Bounty(SQLBase):
368- """A bounty."""
369-
370- implements(IBounty)
371-
372- # default to listing newest first
373- _defaultOrder = '-id'
374-
375- # db field names
376- name = StringCol(unique=True, notNull=True)
377- title = StringCol(notNull=True)
378- summary = StringCol(notNull=True)
379- description = StringCol( notNull=True)
380- usdvalue = CurrencyCol(notNull=True)
381- bountystatus = EnumCol(enum=BountyStatus, notNull=True,
382- default=BountyStatus.OPEN)
383- difficulty = EnumCol(enum=BountyDifficulty, notNull=True,
384- default=BountyDifficulty.NORMAL)
385- reviewer = ForeignKey(
386- dbName='reviewer', foreignKey='Person',
387- storm_validator=validate_public_person, notNull=True)
388- datecreated = UtcDateTimeCol(notNull=True, default=DEFAULT)
389- owner = ForeignKey(
390- dbName='owner', foreignKey='Person',
391- storm_validator=validate_public_person, notNull=True)
392- claimant = ForeignKey(
393- dbName='claimant', foreignKey='Person',
394- storm_validator=validate_public_person, notNull=False, default=None)
395-
396- # useful joins
397- subscriptions = SQLMultipleJoin('BountySubscription', joinColumn='bounty',
398- orderBy='id')
399- products = SQLRelatedJoin('Product', joinColumn='bounty',
400- intermediateTable='ProductBounty', otherColumn='product',
401- orderBy='name')
402- projects = SQLRelatedJoin('Project', joinColumn='bounty',
403- intermediateTable='ProjectBounty', otherColumn='project',
404- orderBy='name')
405- distributions = SQLRelatedJoin('Distribution', joinColumn='bounty',
406- intermediateTable='DistributionBounty', otherColumn='distribution',
407- orderBy='name')
408-
409- # subscriptions
410- def subscribe(self, person):
411- # first see if a relevant subscription exists, and if so, update it
412- for sub in self.subscriptions:
413- if sub.person.id == person.id:
414- return sub
415- # since no previous subscription existed, create a new one
416- return BountySubscription(
417- bounty=self,
418- person=person)
419-
420- def unsubscribe(self, person):
421- # see if a relevant subscription exists, and if so, delete it
422- for sub in self.subscriptions:
423- if sub.person.id == person.id:
424- sub.destroySelf()
425- return
426-
427- # message related
428- messages = SQLRelatedJoin('Message', joinColumn='bounty',
429- otherColumn='message',
430- intermediateTable='BountyMessage', orderBy='datecreated')
431-
432- def newMessage(self, owner, subject, content):
433- """See IMessageTarget."""
434- msg = Message(owner=owner, rfc822msgid=make_msgid('bounty'),
435- subject=subject)
436- chunk = MessageChunk(message=msg, content=content, sequence=1)
437- bountymsg = BountyMessage(bounty=self, message=msg)
438- return bountymsg
439-
440- def linkMessage(self, message):
441- """See IMessageTarget."""
442- for msg in self.messages:
443- if msg == message:
444- return None
445- BountyMessage(bounty=self, message=message)
446- return None
447-
448- @property
449- def followup_subject(self):
450- """See IMessageTarget."""
451- if not self.messages:
452- return 'Re: '+ self.title
453- subject = self.messages[-1].title
454- if subject[:4].lower() == 're: ':
455- return subject
456- return 'Re: ' + subject
457-
458-
459-class BountySet:
460- """A set of bounties."""
461-
462- implements(IBountySet, IAddFormCustomization)
463-
464- def __init__(self):
465- self.title = 'Launchpad Bounties'
466-
467- def __getitem__(self, name):
468- bounty = Bounty.selectOneBy(name=name)
469- if bounty is None:
470- raise NotFoundError(name)
471- return bounty
472-
473- def __iter__(self):
474- for row in Bounty.select():
475- yield row
476-
477- def new(self, name, title, summary, description, usdvalue, owner,
478- reviewer):
479- return Bounty(
480- name=name,
481- title=title,
482- summary=summary,
483- description=description,
484- usdvalue=usdvalue,
485- owner=owner,
486- reviewer=reviewer)
487-
488- @property
489- def top_bounties(self):
490- """See IBountySet."""
491- return Bounty.select(orderBy=['-usdvalue'])[:5]
492-
493
494=== removed file 'lib/canonical/launchpad/database/bountymessage.py'
495--- lib/canonical/launchpad/database/bountymessage.py 2009-06-25 05:30:52 +0000
496+++ lib/canonical/launchpad/database/bountymessage.py 1970-01-01 00:00:00 +0000
497@@ -1,32 +0,0 @@
498-# Copyright 2009 Canonical Ltd. This software is licensed under the
499-# GNU Affero General Public License version 3 (see the file LICENSE).
500-
501-# pylint: disable-msg=E0611,W0212
502-
503-__metaclass__ = type
504-
505-__all__ = ['BountyMessage', ]
506-
507-from email.Utils import make_msgid
508-
509-from zope.interface import implements
510-
511-from sqlobject import ForeignKey
512-
513-from canonical.launchpad import _
514-from canonical.database.sqlbase import SQLBase
515-from canonical.launchpad.interfaces import IBountyMessage
516-from canonical.launchpad.database.message import Message, MessageChunk
517-
518-
519-class BountyMessage(SQLBase):
520- """A table linking bounties and messages."""
521-
522- implements(IBountyMessage)
523-
524- _table = 'BountyMessage'
525-
526- bounty = ForeignKey(dbName='bounty', foreignKey='Bounty', notNull=True)
527- message = ForeignKey(dbName='message', foreignKey='Message', notNull=True)
528-
529-
530
531=== removed file 'lib/canonical/launchpad/database/bountysubscription.py'
532--- lib/canonical/launchpad/database/bountysubscription.py 2009-06-25 05:30:52 +0000
533+++ lib/canonical/launchpad/database/bountysubscription.py 1970-01-01 00:00:00 +0000
534@@ -1,37 +0,0 @@
535-# Copyright 2009 Canonical Ltd. This software is licensed under the
536-# GNU Affero General Public License version 3 (see the file LICENSE).
537-
538-# pylint: disable-msg=E0611,W0212
539-
540-__metaclass__ = type
541-__all__ = ['BountySubscription', 'BountySubscriptionSet']
542-
543-from zope.interface import implements
544-
545-from sqlobject import ForeignKey
546-
547-from canonical.launchpad.interfaces import \
548- IBountySubscription, IBountySubscriptionSet
549-
550-from canonical.database.sqlbase import SQLBase
551-from lp.registry.interfaces.person import validate_public_person
552-
553-
554-class BountySubscription(SQLBase):
555- """A subscription by a person to a bounty."""
556-
557- implements(IBountySubscription)
558-
559- _table = 'BountySubscription'
560-
561- bounty = ForeignKey(dbName='bounty', foreignKey='Bounty', notNull=True)
562- person = ForeignKey(
563- dbName='person', foreignKey='Person',
564- storm_validator=validate_public_person, notNull=True)
565-
566-
567-class BountySubscriptionSet:
568- """A set for BountySubscription objects."""
569-
570- implements(IBountySubscriptionSet)
571-
572
573=== removed file 'lib/canonical/launchpad/database/distributionbounty.py'
574--- lib/canonical/launchpad/database/distributionbounty.py 2009-06-25 05:30:52 +0000
575+++ lib/canonical/launchpad/database/distributionbounty.py 1970-01-01 00:00:00 +0000
576@@ -1,27 +0,0 @@
577-# Copyright 2009 Canonical Ltd. This software is licensed under the
578-# GNU Affero General Public License version 3 (see the file LICENSE).
579-
580-# pylint: disable-msg=E0611,W0212
581-
582-__metaclass__ = type
583-__all__ = ['DistributionBounty',]
584-
585-from zope.interface import implements
586-
587-from sqlobject import ForeignKey
588-
589-from canonical.launchpad.interfaces import IDistributionBounty
590-
591-from canonical.database.sqlbase import SQLBase
592-
593-
594-class DistributionBounty(SQLBase):
595- """A relationship between a distribution and a bounty."""
596-
597- implements(IDistributionBounty)
598-
599- _table='DistributionBounty'
600- bounty = ForeignKey(dbName='bounty', foreignKey='Bounty', notNull=True)
601- distribution = ForeignKey(dbName='distribution',
602- foreignKey='Distribution', notNull=True)
603-
604
605=== removed file 'lib/canonical/launchpad/database/productbounty.py'
606--- lib/canonical/launchpad/database/productbounty.py 2009-06-25 05:30:52 +0000
607+++ lib/canonical/launchpad/database/productbounty.py 1970-01-01 00:00:00 +0000
608@@ -1,26 +0,0 @@
609-# Copyright 2009 Canonical Ltd. This software is licensed under the
610-# GNU Affero General Public License version 3 (see the file LICENSE).
611-
612-# pylint: disable-msg=E0611,W0212
613-
614-__metaclass__ = type
615-__all__ = ['ProductBounty',]
616-
617-from zope.interface import implements
618-
619-from sqlobject import ForeignKey
620-
621-from canonical.launchpad.interfaces import IProductBounty
622-
623-from canonical.database.sqlbase import SQLBase
624-
625-
626-class ProductBounty(SQLBase):
627- """A relationship between a product and a bounty."""
628-
629- implements(IProductBounty)
630-
631- _table='ProductBounty'
632- bounty = ForeignKey(dbName='bounty', foreignKey='Bounty', notNull=True)
633- product = ForeignKey(dbName='product', foreignKey='Product', notNull=True)
634-
635
636=== removed file 'lib/canonical/launchpad/database/projectbounty.py'
637--- lib/canonical/launchpad/database/projectbounty.py 2009-06-25 05:30:52 +0000
638+++ lib/canonical/launchpad/database/projectbounty.py 1970-01-01 00:00:00 +0000
639@@ -1,27 +0,0 @@
640-# Copyright 2009 Canonical Ltd. This software is licensed under the
641-# GNU Affero General Public License version 3 (see the file LICENSE).
642-
643-# pylint: disable-msg=E0611,W0212
644-
645-__metaclass__ = type
646-__all__ = ['ProjectBounty',]
647-
648-from zope.interface import implements
649-
650-from sqlobject import ForeignKey
651-
652-from canonical.launchpad.interfaces import IProjectBounty
653-
654-from canonical.database.sqlbase import SQLBase
655-
656-
657-class ProjectBounty(SQLBase):
658- """A relationship between a project and a bounty."""
659-
660- implements(IProjectBounty)
661-
662- _table='ProjectBounty'
663- bounty = ForeignKey(dbName='bounty', foreignKey='Bounty', notNull=True)
664- project = ForeignKey(dbName='project', foreignKey='Project',
665- notNull=True)
666-
667
668=== removed file 'lib/canonical/launchpad/doc/bounty.txt'
669--- lib/canonical/launchpad/doc/bounty.txt 2007-08-09 14:49:07 +0000
670+++ lib/canonical/launchpad/doc/bounty.txt 1970-01-01 00:00:00 +0000
671@@ -1,26 +0,0 @@
672-
673-This is a basic test that sanity checks and reassigns a bounty.
674-
675- >>> from zope.component import getUtility
676- >>> from canonical.launchpad.webapp.testing import verifyObject
677- >>> from canonical.launchpad.interfaces import IBountySet, IPersonSet
678- >>> from canonical.launchpad.ftests import login
679- >>> from canonical.database.sqlbase import flush_database_updates
680-
681-Be a superuser:
682-
683- >>> login("foo.bar@canonical.com")
684-
685-Grab any bounty:
686-
687- >>> bounty = getUtility(IBountySet)["evo-vcard"]
688- >>> print bounty.owner.name
689- name16
690- >>> sample_person = getUtility(IPersonSet).getByName("name12")
691-
692-Let's try to reassign:
693-
694- >>> bounty.owner = sample_person
695- >>> print bounty.owner.name
696- name12
697-
698
699=== modified file 'lib/canonical/launchpad/icing/style.css'
700--- lib/canonical/launchpad/icing/style.css 2009-08-28 13:40:55 +0000
701+++ lib/canonical/launchpad/icing/style.css 2009-08-31 00:06:29 +0000
702@@ -137,7 +137,6 @@
703 .translation-template {background:url(icon-sprites-2) 0 -864px no-repeat;}
704 .trash-icon {background:url(icon-sprites-2) 0 -896px no-repeat;}
705 .stop {background:url(icon-sprites-2) 0 -928px no-repeat;}
706-.bounty {background:url(icon-sprites-2) 0 -960px no-repeat;}
707 .list {background:url(icon-sprites-2) 0 -992px no-repeat;}
708 .bullet {background:url(icon-sprites-2) 0 -1024px no-repeat;}
709 .zoom-in {background:url(icon-sprites-2) 0 -1056px no-repeat;}
710
711=== modified file 'lib/canonical/launchpad/interfaces/__init__.py'
712--- lib/canonical/launchpad/interfaces/__init__.py 2009-07-17 00:26:05 +0000
713+++ lib/canonical/launchpad/interfaces/__init__.py 2009-08-27 07:05:16 +0000
714@@ -27,9 +27,6 @@
715 from canonical.launchpad.interfaces.authtoken import *
716 from lp.soyuz.interfaces.binarypackagerelease import *
717 from lp.soyuz.interfaces.binarypackagename import *
718-from canonical.launchpad.interfaces.bounty import *
719-from canonical.launchpad.interfaces.bountymessage import *
720-from canonical.launchpad.interfaces.bountysubscription import *
721 from lp.bugs.interfaces.bugactivity import *
722 from lp.bugs.interfaces.bugattachment import *
723 from lp.bugs.interfaces.bug import *
724@@ -56,7 +53,6 @@
725 from lp.bugs.interfaces.cve import *
726 from lp.bugs.interfaces.cvereference import *
727 from lp.registry.interfaces.distribution import *
728-from canonical.launchpad.interfaces.distributionbounty import *
729 from lp.registry.interfaces.distributionmirror import *
730 from lp.registry.interfaces.distributionsourcepackage import *
731 from lp.soyuz.interfaces.distributionsourcepackagecache import *
732@@ -103,12 +99,10 @@
733 from lp.registry.interfaces.poll import *
734 from lp.soyuz.interfaces.processor import *
735 from lp.registry.interfaces.product import *
736-from canonical.launchpad.interfaces.productbounty import *
737 from lp.registry.interfaces.productlicense import *
738 from lp.registry.interfaces.productrelease import *
739 from lp.registry.interfaces.productseries import *
740 from lp.registry.interfaces.project import *
741-from canonical.launchpad.interfaces.projectbounty import *
742 from lp.soyuz.interfaces.publishedpackage import *
743 from lp.soyuz.interfaces.publishing import *
744 from lp.soyuz.interfaces.queue import *
745
746=== removed file 'lib/canonical/launchpad/interfaces/bounty.py'
747--- lib/canonical/launchpad/interfaces/bounty.py 2009-07-17 00:26:05 +0000
748+++ lib/canonical/launchpad/interfaces/bounty.py 1970-01-01 00:00:00 +0000
749@@ -1,225 +0,0 @@
750-# Copyright 2009 Canonical Ltd. This software is licensed under the
751-# GNU Affero General Public License version 3 (see the file LICENSE).
752-
753-# pylint: disable-msg=E0211,E0213
754-
755-"""Bounty interfaces."""
756-
757-__metaclass__ = type
758-
759-__all__ = [
760- 'BountyDifficulty',
761- 'BountyStatus',
762- 'IBounty',
763- 'IBountySet',
764- ]
765-
766-
767-from zope.interface import Attribute
768-
769-from zope.schema import Datetime, Int, Choice, Text, TextLine, Float
770-from zope.app.form.browser.interfaces import IAddFormCustomization
771-from lazr.enum import DBEnumeratedType, DBItem
772-
773-from canonical.launchpad import _
774-from canonical.launchpad.fields import Summary, Title, PublicPersonChoice
775-from canonical.launchpad.validators.name import name_validator
776-from lp.registry.interfaces.role import IHasOwner
777-
778-
779-class BountyDifficulty(DBEnumeratedType):
780- """Bounty Difficulty
781-
782- An indicator of the difficulty of a particular bounty.
783- """
784-
785- TRIVIAL = DBItem(10, """
786- Trivial
787-
788- This bounty requires only very basic skills to complete the task. No
789- real domain knowledge is required, only simple system
790- administration, writing or configuration skills, and the ability to
791- publish the work.""")
792-
793- BASIC = DBItem(20, """
794- Basic
795-
796- This bounty requires some basic programming skills, in a high level
797- language like Python or C# or... BASIC. However, the project is
798- being done "standalone" and so no knowledge of existing code is
799- required.""")
800-
801- STRAIGHTFORWARD = DBItem(30, """
802- Straightforward
803-
804- This bounty is easy to implement but does require some broader
805- understanding of the framework or application within which the work
806- must be done.""")
807-
808- NORMAL = DBItem(50, """
809- Normal
810-
811- This bounty requires a moderate amount of programming skill, in a
812- high level language like HTML, CSS, JavaScript, Python or C#. It is
813- an extension to an existing application or package so the work will
814- need to follow established project coding standards.""")
815-
816- CHALLENGING = DBItem(60, """
817- Challenging
818-
819- This bounty requires knowledge of a low-level programming language
820- such as C or C++.""")
821-
822- DIFFICULT = DBItem(70, """
823- Difficult
824-
825- This project requires knowledge of a low-level programming language
826- such as C or C++ and, in addition, requires extensive knowledge of
827- an existing codebase into which the work must fit.""")
828-
829- VERYDIFFICULT = DBItem(90, """
830- Very Difficult
831-
832- This project requires exceptional programming skill and knowledge of
833- very low level programming environments, such as assembly
834- language.""")
835-
836- EXTREME = DBItem(100, """
837- Extreme
838-
839- In order to complete this work, detailed knowledge of an existing
840- project is required, and in addition the work itself must be done in
841- a low-level language like assembler or C on multiple
842- architectures.""")
843-
844-
845-class BountyStatus(DBEnumeratedType):
846- """Bounty Status
847-
848- An indicator of the status of a particular bounty. This can be edited by
849- the bounty owner or reviewer.
850- """
851-
852- OPEN = DBItem(1, """
853- Open
854-
855- This bounty is open. People are still welcome to contact the creator
856- or reviewer of the bounty, and submit their work for consideration
857- for the bounty.""")
858-
859- WITHDRAWN = DBItem(9, """
860- Withdrawn
861-
862- This bounty has been withdrawn.
863- """)
864-
865- CLOSED = DBItem(10, """
866- Closed
867-
868- This bounty is closed. No further submissions will be considered.
869- """)
870-
871-
872-class IBounty(IHasOwner):
873- """The core bounty description."""
874-
875- id = Int(
876- title=_('Bounty ID'), required=True, readonly=True,
877- )
878- name = TextLine(
879- title=_('Name'), required=True,
880- description=_("""Keep this name very short, unique, and
881- descriptive, because it will be used in URLs. Examples:
882- mozilla-type-ahead-find, postgres-smart-serial."""),
883- constraint=name_validator,
884- )
885- title = Title(
886- title=_('Title'), required=True
887- )
888- summary = Summary(
889- title=_('Summary'), required=True
890- )
891- description = Text(
892- title=_('Description'), required=True,
893- description=_("""Include exact results that will be acceptable to
894- the bounty owner and reviewer, and contact details for the person
895- coordinating the bounty.""")
896- )
897- usdvalue = Float(
898- title=_('Estimated value (US dollars)'),
899- required=True, description=_("""In some cases the
900- bounty may have been offered in a variety of
901- currencies, so this USD value is an estimate based
902- on recent currency rates.""")
903- )
904- bountystatus = Choice(
905- title=_('Status'), vocabulary=BountyStatus,
906- default=BountyStatus.OPEN)
907- difficulty = Choice(
908- title=_('Difficulty'), vocabulary=BountyDifficulty,
909- default=BountyDifficulty.NORMAL)
910- reviewer = PublicPersonChoice(
911- title=_('The bounty reviewer.'), required=False,
912- description=_("The person who is responsible for deciding whether "
913- "the bounty is awarded, and to whom if there are multiple "
914- "claimants."), vocabulary='ValidPersonOrTeam')
915- datecreated = Datetime(
916- title=_('Date Created'), required=True, readonly=True,
917- )
918- owner = PublicPersonChoice(
919- title=_('Owner'),
920- required=True,
921- vocabulary='ValidOwner',
922- description=_("""Owner (registrant) of Bounty."""))
923- # XXX kiko 2005-01-14:
924- # is this really necessary? IDs shouldn't be exposed in interfaces.
925- ownerID = Int(
926- title=_('Owner'), required=True, readonly=True
927- )
928-
929- # joins
930- subscriptions = Attribute('The set of subscriptions to this bounty.')
931- projects = Attribute(
932- 'The project groups which this bounty is related to.')
933- products = Attribute('The projects to which this bounty is related.')
934- distributions = Attribute(
935- 'The distributions to which this bounty is related.')
936-
937- # subscription-related methods
938- def subscribe(person):
939- """Subscribe this person to the bounty."""
940-
941- def unsubscribe(person):
942- """Remove this person's subscription to this bounty."""
943-
944- messages = Attribute(
945- "The messages related to this object, in reverse "
946- "order of creation (so newest first).")
947-
948- followup_subject = Attribute("The likely subject of the next message.")
949-
950- def newMessage(owner, subject, content):
951- """Create a new message, and link it to this object."""
952-
953- def linkMessage(message):
954- """Link the given message to this object."""
955-
956-
957-
958-# Interfaces for containers
959-class IBountySet(IAddFormCustomization):
960- """A container for bounties."""
961-
962- title = Attribute('Title')
963-
964- top_bounties = Attribute('The top 5 bounties in the system')
965-
966- def __getitem__(key):
967- """Get a bounty."""
968-
969- def __iter__():
970- """Iterate through the bounties in this set."""
971-
972- def new(name, title, summary, description, usdvalue, owner, reviewer):
973- """Create a new bounty."""
974-
975
976=== removed file 'lib/canonical/launchpad/interfaces/bountymessage.py'
977--- lib/canonical/launchpad/interfaces/bountymessage.py 2009-06-25 05:30:52 +0000
978+++ lib/canonical/launchpad/interfaces/bountymessage.py 1970-01-01 00:00:00 +0000
979@@ -1,23 +0,0 @@
980-# Copyright 2009 Canonical Ltd. This software is licensed under the
981-# GNU Affero General Public License version 3 (see the file LICENSE).
982-
983-# pylint: disable-msg=E0211,E0213
984-
985-"""Bounty message interfaces."""
986-
987-__metaclass__ = type
988-
989-__all__ = [
990- 'IBountyMessage',
991- ]
992-
993-from zope.interface import Interface, Attribute
994-from canonical.launchpad import _
995-
996-class IBountyMessage(Interface):
997- """A link between a bounty and a message."""
998-
999- bounty = Attribute("The bounty.")
1000- message = Attribute("The message.")
1001-
1002-
1003
1004=== removed file 'lib/canonical/launchpad/interfaces/bountysubscription.py'
1005--- lib/canonical/launchpad/interfaces/bountysubscription.py 2009-06-25 05:30:52 +0000
1006+++ lib/canonical/launchpad/interfaces/bountysubscription.py 1970-01-01 00:00:00 +0000
1007@@ -1,44 +0,0 @@
1008-# Copyright 2009 Canonical Ltd. This software is licensed under the
1009-# GNU Affero General Public License version 3 (see the file LICENSE).
1010-
1011-# pylint: disable-msg=E0211,E0213
1012-
1013-"""Bounty subscription interfaces."""
1014-
1015-__metaclass__ = type
1016-
1017-__all__ = [
1018- 'IBountySubscription',
1019- 'IBountySubscriptionSet',
1020- ]
1021-
1022-from zope.interface import Interface, Attribute
1023-from zope.schema import Int
1024-from canonical.launchpad import _
1025-from canonical.launchpad.fields import PublicPersonChoice
1026-
1027-class IBountySubscription(Interface):
1028- """The relationship between a person and a bounty."""
1029-
1030- id = Int(title=_('ID'), readonly=True, required=True)
1031- person = PublicPersonChoice(
1032- title=_('Person ID'), required=True,
1033- vocabulary='ValidPersonOrTeam', readonly=True,
1034- )
1035- bounty = Int(title=_('Bounty ID'), required=True, readonly=True)
1036-
1037-
1038-class IBountySubscriptionSet(Interface):
1039- """A set for IBountySubscription objects."""
1040-
1041- title = Attribute('Title')
1042-
1043- def __getitem__(key):
1044- """Get a BountySubscription object."""
1045-
1046- def __iter__():
1047- """Iterate over all bounty subscriptions."""
1048-
1049- def delete(id):
1050- """Delete a bounty subscription."""
1051-
1052
1053=== removed file 'lib/canonical/launchpad/interfaces/distributionbounty.py'
1054--- lib/canonical/launchpad/interfaces/distributionbounty.py 2009-06-25 05:30:52 +0000
1055+++ lib/canonical/launchpad/interfaces/distributionbounty.py 1970-01-01 00:00:00 +0000
1056@@ -1,28 +0,0 @@
1057-# Copyright 2009 Canonical Ltd. This software is licensed under the
1058-# GNU Affero General Public License version 3 (see the file LICENSE).
1059-
1060-# pylint: disable-msg=E0211,E0213
1061-"""Interface for the linker between Distribution and Bounty."""
1062-
1063-__metaclass__ = type
1064-
1065-__all__ = [
1066- 'IDistributionBounty',
1067- ]
1068-
1069-from zope.interface import Interface
1070-from zope.schema import Choice, Int
1071-from canonical.launchpad import _
1072-
1073-class IDistributionBounty(Interface):
1074- """The relationship between a distribution and a bounty."""
1075-
1076- id = Int(title=_('ID'), readonly=True, required=True)
1077- distribution = Choice(
1078- title=_('Distribution'), required=True, vocabulary='Distribution',
1079- readonly=True)
1080- bounty = Choice(title=_('Bounty'), required=True, readonly=True,
1081- vocabulary='Bounty', description=_("The existing Launchpad "
1082- "bounty, which you would like to show as being related to this "
1083- "distribution."))
1084-
1085
1086=== removed file 'lib/canonical/launchpad/interfaces/productbounty.py'
1087--- lib/canonical/launchpad/interfaces/productbounty.py 2009-06-25 05:30:52 +0000
1088+++ lib/canonical/launchpad/interfaces/productbounty.py 1970-01-01 00:00:00 +0000
1089@@ -1,29 +0,0 @@
1090-# Copyright 2009 Canonical Ltd. This software is licensed under the
1091-# GNU Affero General Public License version 3 (see the file LICENSE).
1092-
1093-# pylint: disable-msg=E0211,E0213
1094-
1095-"""Interface for the linker between Product and Bounty."""
1096-
1097-__metaclass__ = type
1098-
1099-__all__ = [
1100- 'IProductBounty',
1101- ]
1102-
1103-from zope.interface import Interface
1104-from zope.schema import Choice, Int
1105-from canonical.launchpad import _
1106-
1107-class IProductBounty(Interface):
1108- """The relationship between a product and a bounty."""
1109-
1110- id = Int(title=_('ID'), readonly=True, required=True)
1111- product = Choice(
1112- title=_('Project'), required=True, vocabulary='Product',
1113- readonly=True)
1114- bounty = Choice(title=_('Bounty'), required=True, readonly=True,
1115- vocabulary='Bounty', description=_("The existing Launchpad "
1116- "bounty, which you would like to show as being related to "
1117- "this project."))
1118-
1119
1120=== removed file 'lib/canonical/launchpad/interfaces/projectbounty.py'
1121--- lib/canonical/launchpad/interfaces/projectbounty.py 2009-06-25 05:30:52 +0000
1122+++ lib/canonical/launchpad/interfaces/projectbounty.py 1970-01-01 00:00:00 +0000
1123@@ -1,29 +0,0 @@
1124-# Copyright 2009 Canonical Ltd. This software is licensed under the
1125-# GNU Affero General Public License version 3 (see the file LICENSE).
1126-
1127-# pylint: disable-msg=E0211,E0213
1128-
1129-"""Interface for the linker between Project and Bounty."""
1130-
1131-__metaclass__ = type
1132-
1133-__all__ = [
1134- 'IProjectBounty',
1135- ]
1136-
1137-from zope.interface import Interface
1138-from zope.schema import Choice, Int
1139-from canonical.launchpad import _
1140-
1141-class IProjectBounty(Interface):
1142- """The relationship between a project and a bounty."""
1143-
1144- id = Int(title=_('ID'), readonly=True, required=True)
1145- project = Choice(
1146- title=_('Project'), required=True, vocabulary='Project',
1147- readonly=True)
1148- bounty = Choice(title=_('Bounty'), required=True, readonly=True,
1149- vocabulary='Bounty', description=_("The existing Launchpad "
1150- "bounty, which you would like to show as being related to this "
1151- "project."))
1152-
1153
1154=== modified file 'lib/canonical/launchpad/locales/launchpad.po.es.old'
1155--- lib/canonical/launchpad/locales/launchpad.po.es.old 2007-05-27 23:01:01 +0000
1156+++ lib/canonical/launchpad/locales/launchpad.po.es.old 2009-08-27 07:05:16 +0000
1157@@ -35,14 +35,6 @@
1158 msgid "Administer something"
1159 msgstr ""
1160
1161-#: /home/carlos/Work/dists/launchpad/lib/canonical/launchpad/zcml/bounty.zcml:36
1162-msgid "Modify Bounty:"
1163-msgstr ""
1164-
1165-#: /home/carlos/Work/dists/launchpad/lib/canonical/launchpad/zcml/bounty.zcml:65
1166-msgid "Create A New Bounty"
1167-msgstr ""
1168-
1169 #: /home/carlos/Work/dists/launchpad/lib/canonical/launchpad/zcml/bug.zcml:36
1170 msgid "Change Bug Information"
1171 msgstr ""
1172@@ -207,116 +199,6 @@
1173 msgid "Name"
1174 msgstr ""
1175
1176-#: l/launchpad/interfaces/bounty.py:19
1177-msgid "Bounty ID"
1178-msgstr ""
1179-
1180-#: l/launchpad/interfaces/bounty.py:22
1181-msgid "Bounty name"
1182-msgstr ""
1183-
1184-#: l/launchpad/interfaces/bounty.py:23
1185-msgid ""
1186-"A short and unique name for this bounty. \n"
1187-" This allows us to refer to the bounty directly in a url,\n"
1188-" so it needs to be destinct and descriptive. For example:\n"
1189-" mozilla-type-ahead-find and\n"
1190-" postgres-smart-serial."
1191-msgstr ""
1192-
1193-#: l/launchpad/interfaces/bounty.py:31
1194-msgid "Bounty title"
1195-msgstr ""
1196-
1197-#: l/launchpad/interfaces/bounty.py:32
1198-msgid ""
1199-"The title of the bounty should be no more than 70\n"
1200-" characters long, and is displayed in every list or report of "
1201-"bounties. It\n"
1202-" should be as clear as possible in the space allotted what the\n"
1203-" bounty is for."
1204-msgstr ""
1205-
1206-#: l/launchpad/interfaces/bounty.py:38 l/launchpad/interfaces/bug.py:41
1207-#: l/launchpad/interfaces/distribution.py:19
1208-#: l/launchpad/interfaces/distroseries.py:21
1209-#: l/launchpad/interfaces/product.py:37
1210-msgid "Summary"
1211-msgstr ""
1212-
1213-#: l/launchpad/interfaces/bounty.py:39
1214-msgid ""
1215-"The bounty summary is a single paragraph\n"
1216-" description of the bounty. This will also be desplayed in most\n"
1217-" bounty listings."
1218-msgstr ""
1219-
1220-#: l/launchpad/interfaces/bounty.py:44 l/launchpad/interfaces/bug.py:47
1221-#: l/launchpad/interfaces/bugattachment.py:23
1222-#: l/launchpad/interfaces/bugtracker.py:14
1223-#: l/launchpad/interfaces/country.py:32
1224-#: l/launchpad/interfaces/distribution.py:22
1225-#: l/launchpad/interfaces/distroseries.py:25
1226-#: l/launchpad/interfaces/product.py:40
1227-#: l/launchpad/interfaces/productrelease.py:20
1228-#: l/launchpad/interfaces/project.py:35
1229-#: l/launchpad/interfaces/sourcepackage.py:33
1230-#: l/launchpad/interfaces/sourcepackage.py:34
1231-#: l/launchpad/interfaces/sourcepackage.py:52
1232-#: l/launchpad/interfaces/sourcepackage.py:53
1233-msgid "Description"
1234-msgstr ""
1235-
1236-#: l/launchpad/interfaces/bounty.py:45
1237-msgid ""
1238-"The bounty description should be a detailed\n"
1239-" description of the bounty, aimed ad specifying the exact "
1240-"results\n"
1241-" that will be acceptable to the bounty owner and reviewer."
1242-msgstr ""
1243-
1244-#: l/launchpad/interfaces/bounty.py:50
1245-msgid "Estimated USD Value"
1246-msgstr ""
1247-
1248-#: l/launchpad/interfaces/bounty.py:51
1249-msgid ""
1250-"The value of this bounty, in\n"
1251-" USD. Note that in some cases the bounty may have been offered "
1252-"in\n"
1253-" a variety of currencies, so this USD value is an estimate based\n"
1254-" on recent currency rates."
1255-msgstr ""
1256-
1257-#: l/launchpad/interfaces/bounty.py:57
1258-msgid "Difficulty"
1259-msgstr ""
1260-
1261-#: l/launchpad/interfaces/bounty.py:58
1262-msgid ""
1263-"The difficulty of this bounty,\n"
1264-" rated from 1 to 100 where 100 is most difficult. An example of\n"
1265-" an extremely difficult bounty would be something that requires\n"
1266-" extensive and rare knowledge, such as a kernel memory "
1267-"management\n"
1268-" subsystem."
1269-msgstr ""
1270-
1271-#: l/launchpad/interfaces/bounty.py:65
1272-msgid "Duration"
1273-msgstr ""
1274-
1275-#: l/launchpad/interfaces/bounty.py:66
1276-msgid ""
1277-"The expected time required to\n"
1278-" complete this bounty work, given the necessary skills."
1279-msgstr ""
1280-
1281-#: l/launchpad/interfaces/bounty.py:70
1282-msgid "Reviewer"
1283-msgstr ""
1284-
1285-#: l/launchpad/interfaces/bounty.py:72 l/launchpad/interfaces/bug.py:22
1286 #: l/launchpad/interfaces/bugassignment.py:28
1287 #: l/launchpad/interfaces/bugassignment.py:81
1288 #: l/launchpad/interfaces/bugextref.py:33
1289@@ -327,7 +209,6 @@
1290 msgid "Date Created"
1291 msgstr ""
1292
1293-#: l/launchpad/interfaces/bounty.py:75 l/launchpad/interfaces/bug.py:54
1294 #: l/launchpad/interfaces/bug.py:117
1295 #: l/launchpad/interfaces/bugassignment.py:31
1296 #: l/launchpad/interfaces/bugassignment.py:35
1297
1298=== modified file 'lib/canonical/launchpad/locales/launchpad.pot'
1299--- lib/canonical/launchpad/locales/launchpad.pot 2007-05-27 23:01:01 +0000
1300+++ lib/canonical/launchpad/locales/launchpad.pot 2009-08-27 07:05:16 +0000
1301@@ -173,7 +173,6 @@
1302 msgstr ""
1303
1304 #: d/interfaces/archuser.py:22
1305-#: d/interfaces/bounty.py:82
1306 #: d/interfaces/bug.py:60
1307 #: d/interfaces/bug.py:219
1308 #: d/interfaces/bugextref.py:48
1309@@ -205,7 +204,6 @@
1310
1311 #: d/interfaces/binarypackage.py:22
1312 #: d/interfaces/binarypackagename.py:21
1313-#: d/interfaces/bountysubscription.py:21
1314 #: d/interfaces/bugattachment.py:24
1315 #: d/interfaces/bugextref.py:29
1316 #: d/interfaces/bugsubscription.py:21
1317@@ -242,12 +240,6 @@
1318 msgid "Valid Binary package name"
1319 msgstr ""
1320
1321-#: d/interfaces/bounty.py:29
1322-#: d/interfaces/bountysubscription.py:26
1323-msgid "Bounty ID"
1324-msgstr ""
1325-
1326-#: d/interfaces/bounty.py:32
1327 #: d/interfaces/bugattachment.py:31
1328 #: d/interfaces/bugtracker.py:23
1329 #: d/interfaces/cal.py:102
1330@@ -268,14 +260,6 @@
1331 msgid "Name"
1332 msgstr ""
1333
1334-#: d/interfaces/bounty.py:33
1335-msgid ""
1336-"Keep this name very short, unique, and\n"
1337-" descriptive, because it will be used in URLs. Examples:\n"
1338-" mozilla-type-ahead-find, postgres-smart-serial."
1339-msgstr ""
1340-
1341-#: d/interfaces/bounty.py:39
1342 #: d/interfaces/bug.py:49
1343 #: d/interfaces/bugextref.py:40
1344 #: d/interfaces/bugtracker.py:24
1345@@ -291,14 +275,6 @@
1346 msgid "Title"
1347 msgstr ""
1348
1349-#: d/interfaces/bounty.py:40
1350-msgid ""
1351-"Describe the task as clearly as\n"
1352-" possible in up to 70 characters. This title is\n"
1353-" displayed in every bounty list or report."
1354-msgstr ""
1355-
1356-#: d/interfaces/bounty.py:45
1357 #: d/interfaces/bug.py:52
1358 #: d/interfaces/bugtracker.py:25
1359 #: d/interfaces/distribution.py:36
1360@@ -310,14 +286,6 @@
1361 msgid "Summary"
1362 msgstr ""
1363
1364-#: d/interfaces/bounty.py:46
1365-msgid ""
1366-"A single-paragraph description of the\n"
1367-" bounty. This will also be displayed in most\n"
1368-" bounty listings."
1369-msgstr ""
1370-
1371-#: d/interfaces/bounty.py:51
1372 #: d/interfaces/bug.py:57
1373 #: d/interfaces/bug.py:220
1374 #: d/interfaces/bugattachment.py:34
1375@@ -334,54 +302,6 @@
1376 msgid "Description"
1377 msgstr ""
1378
1379-#: d/interfaces/bounty.py:52
1380-msgid ""
1381-"A detailed description. Include exact\n"
1382-" results that will be acceptable to the bounty owner and\n"
1383-" reviewer."
1384-msgstr ""
1385-
1386-#: d/interfaces/bounty.py:57
1387-msgid "Estimated value (US dollars)"
1388-msgstr ""
1389-
1390-#: d/interfaces/bounty.py:58
1391-msgid ""
1392-"In some cases the\n"
1393-" bounty may have been offered in a variety of\n"
1394-" currencies, so this USD value is an estimate based\n"
1395-" on recent currency rates."
1396-msgstr ""
1397-
1398-#: d/interfaces/bounty.py:64
1399-msgid "Difficulty"
1400-msgstr ""
1401-
1402-#: d/interfaces/bounty.py:65
1403-msgid ""
1404-"From 1 (easiest) to 100\n"
1405-" (most difficult). An example of\n"
1406-" an extremely difficult bounty would be something that requires\n"
1407-" extensive and rare knowledge, such as a kernel memory management\n"
1408-" subsystem."
1409-msgstr ""
1410-
1411-#: d/interfaces/bounty.py:72
1412-msgid "Duration"
1413-msgstr ""
1414-
1415-#: d/interfaces/bounty.py:73
1416-msgid ""
1417-"The expected time required to\n"
1418-" complete this bounty work, given the necessary skills."
1419-msgstr ""
1420-
1421-#: d/interfaces/bounty.py:77
1422-#: d/interfaces/person.py:566
1423-msgid "Reviewer"
1424-msgstr ""
1425-
1426-#: d/interfaces/bounty.py:79
1427 #: d/interfaces/bug.py:41
1428 #: d/interfaces/bugextref.py:45
1429 #: d/interfaces/bugwatch.py:34
1430@@ -403,26 +323,14 @@
1431 msgid "Date Created"
1432 msgstr ""
1433
1434-#: d/interfaces/bountysubscription.py:23
1435 #: d/interfaces/bugsubscription.py:23
1436 msgid "Person ID"
1437 msgstr ""
1438
1439-#: d/interfaces/bountysubscription.py:28
1440 #: d/interfaces/bugsubscription.py:28
1441 msgid "Subscription"
1442 msgstr ""
1443
1444-#: d/interfaces/bountysubscription.py:29
1445-msgid ""
1446-"Your subscription to a bounty can be one of\n"
1447-" \"watch\", \"cc\" or \"none\". If you \"watch\" a bounty then it will\n"
1448-" show up on your reports, but you won't normally receive bounty\n"
1449-" mail. If you \"cc\" yourself on a bounty you will receive a copy of\n"
1450-" all bounty update notifications by email.\n"
1451-" "
1452-msgstr ""
1453-
1454 #: d/interfaces/bug.py:199
1455 #: d/interfaces/bugtask.py:39
1456 msgid "Bug #"
1457@@ -1072,10 +980,6 @@
1458 msgid "The Lucille Config."
1459 msgstr ""
1460
1461-#: d/interfaces/distribution.py:80
1462-msgid "The bounties that are related to this distro."
1463-msgstr ""
1464-
1465 #: d/interfaces/distroseries.py:27
1466 msgid "The name of this distribution release."
1467 msgstr ""
1468@@ -2052,10 +1956,6 @@
1469 " when."
1470 msgstr ""
1471
1472-#: d/interfaces/product.py:174
1473-msgid "The bounties that are related to this product."
1474-msgstr ""
1475-
1476 #: d/interfaces/product.py:200
1477 msgid "The URL of the root directory for the product used when the series doesn't supply one."
1478 msgstr ""
1479@@ -2281,10 +2181,6 @@
1480 msgid "Whether or not this project has been reviewed."
1481 msgstr ""
1482
1483-#: d/interfaces/project.py:134
1484-msgid "The bounties that are related to this project."
1485-msgstr ""
1486-
1487 #: d/interfaces/project.py:197
1488 msgid "Bug Tracker"
1489 msgstr ""
1490@@ -2858,14 +2754,6 @@
1491 msgid "Create a new Binary Package Name"
1492 msgstr ""
1493
1494-#: d/zcml/bounty.zcml:102
1495-msgid "Create A New Bounty"
1496-msgstr ""
1497-
1498-#: d/zcml/bounty.zcml:62
1499-msgid "Modify Bounty:"
1500-msgstr ""
1501-
1502 #: d/zcml/bug.zcml:150
1503 msgid "File a Bug on a Product"
1504 msgstr ""
1505
1506=== modified file 'lib/canonical/launchpad/pagetests/basics/notfound-traversals.txt'
1507--- lib/canonical/launchpad/pagetests/basics/notfound-traversals.txt 2009-08-21 21:10:49 +0000
1508+++ lib/canonical/launchpad/pagetests/basics/notfound-traversals.txt 2009-08-27 07:05:16 +0000
1509@@ -96,8 +96,6 @@
1510 >>> check_not_found("/+groups/foos",
1511 ... host='translations.launchpad.dev')
1512
1513->>> check("/bounties")
1514->>> check("/bounties/foomatic-widgets")
1515
1516 >>> check("/codeofconduct")
1517 >>> check("/codeofconduct/1.0")
1518@@ -146,7 +144,6 @@
1519 >>> check("/distros/+add", auth=True)
1520
1521 >>> check("/ubuntu")
1522->>> check("/ubuntu/+bounties")
1523 >>> check("/ubuntu/+bugs")
1524 >>> check("/ubuntu/+specs")
1525 >>> check("/ubuntu/+cve")
1526@@ -158,8 +155,6 @@
1527 >>> check("/ubuntu/+settings", host='translations.launchpad.dev',
1528 ... auth=True)
1529 >>> check("/ubuntu/hoary/+addmilestone", auth=True)
1530->>> check("/ubuntu/+linkbounty", auth=True)
1531->>> check("/ubuntu/+addbounty", auth=True)
1532 >>> check("/ubuntu/+addspec", auth=True)
1533 >>> check("/ubuntu/+imports", host='translations.launchpad.dev')
1534 >>> check("/debian/+milestone/3.1")
1535@@ -379,7 +374,6 @@
1536 >>> check("/~name18/+reassign", auth=True)
1537 >>> check("/~name18/+review", auth=True)
1538 >>> check("/~name18/+specs")
1539->>> check("/~name18/+bounties")
1540 >>> check_redirect("/~name18/+translations", status=301)
1541 >>> check("/~name18/+translations", host='translations.launchpad.dev')
1542 >>> check("/~name18/+imports", host='translations.launchpad.dev')
1543
1544=== removed directory 'lib/canonical/launchpad/pagetests/bounty'
1545=== removed file 'lib/canonical/launchpad/pagetests/bounty/xx-bounty-creation.txt'
1546--- lib/canonical/launchpad/pagetests/bounty/xx-bounty-creation.txt 2007-04-14 10:26:11 +0000
1547+++ lib/canonical/launchpad/pagetests/bounty/xx-bounty-creation.txt 1970-01-01 00:00:00 +0000
1548@@ -1,254 +0,0 @@
1549-Creating Bounties
1550-=================
1551-
1552-We should be able to create a bounty directly, without any connected product
1553-or project or distribution. Note this is a bad idea.
1554-
1555- >>> print http(r"""
1556- ... GET /bounties/+new HTTP/1.1
1557- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1558- ... """)
1559- HTTP/1.1 200 Ok
1560- ...
1561-
1562-First we test if the name field validator is working
1563-
1564- >>> print http(r"""
1565- ... POST /firefox/+addbounty HTTP/1.1
1566- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1567- ... Content-Length: 1948
1568- ... Content-Type: multipart/form-data; boundary=---------------------------33938214415580350852058287477
1569- ...
1570- ... -----------------------------33938214415580350852058287477
1571- ... Content-Disposition: form-data; name="field.name"
1572- ...
1573- ... New-FF-bounty
1574- ... -----------------------------33938214415580350852058287477
1575- ... Content-Disposition: form-data; name="field.title"
1576- ...
1577- ... fs dsdfkjhsdlkhjslkjdf sdlkjf slkjd hfsdhfsdh
1578- ... -----------------------------33938214415580350852058287477
1579- ... Content-Disposition: form-data; name="field.summary"
1580- ...
1581- ... hfs lskjdhf zlkjdshf zslkdjlkj hzdl hflz hlhvlkjc hvlkjhdsflkhdsf lskd lkjsz hlkjds flzkshflkjsz lkjsz hlkjz flkjszh lkfzhlkz lkjzs flkjsz hflksz hlkzs hflkj hdszlkjhs dlkfhsdlkjh sdlkjh slkjs hfdlkjs hfdlkjs hdlkshlkj hdlksjhdslkjh fslkjhslkdhflkds hlkjds hfslkjd hflksjhslkjh lkjd sd s.s sd fhsk s sdfs.
1582- ... -----------------------------33938214415580350852058287477
1583- ... Content-Disposition: form-data; name="field.usdvalue"
1584- ...
1585- ... 230.00
1586- ... -----------------------------33938214415580350852058287477
1587- ... Content-Disposition: form-data; name="field.difficulty"
1588- ...
1589- ... Difficult
1590- ... -----------------------------33938214415580350852058287477
1591- ... Content-Disposition: form-data; name="field.difficulty-empty-marker"
1592- ...
1593- ... 1
1594- ... -----------------------------33938214415580350852058287477
1595- ... Content-Disposition: form-data; name="field.description"
1596- ...
1597- ... kjsd hkjs hfksd hfksdj hfkjds hfskdj hskdjhf skdhf skdhf sdkj skj hfdkjsdh fksjd hfkjshd fkjshfdkshd fksksjd hfksjd hfkshfdksjdhf ksjhsd fkjhskjhsdkfh skdhfksdhfksdjhf kks hdfkjshd ksj hks ksjdhfks hks ks kjdshfksjdh fkjsh ksj hfkshf skjhd ksjh fks hdfkshd fksjhkjshd fks h.
1598- ...
1599- ... sdf lksjflskjdflks dlkfsdlkf slusdou s shd fkjshdfkjshdf kskj hfkskjs hksjhfd kshflzkjdhfkhvllkjfd vlnb belk i d f,mbd,mbelkh lv lkdjh lk jkmd,ks jhlkjh lkcj hfdkjh skjh kjds fkjdshf skdjhf lkuvcyiuyvlkejre ,nb ,m siu yvdyieyerkjekjfdkksd skdjh dskh kdsjhfkjsd.
1600- ... -----------------------------33938214415580350852058287477
1601- ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
1602- ...
1603- ... Add
1604- ... -----------------------------33938214415580350852058287477--
1605- ... """)
1606- HTTP/1.1 200 Ok
1607- ...
1608- ...Invalid name 'New-FF-bounty'...
1609- ...
1610-
1611-
1612-Now let's create a bounty for the Firefox product.
1613-
1614- >>> print http(r"""
1615- ... POST /firefox/+addbounty HTTP/1.1
1616- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1617- ... Content-Length: 1948
1618- ... Content-Type: multipart/form-data; boundary=---------------------------33938214415580350852058287477
1619- ...
1620- ... -----------------------------33938214415580350852058287477
1621- ... Content-Disposition: form-data; name="field.name"
1622- ...
1623- ... new-ff-bounty
1624- ... -----------------------------33938214415580350852058287477
1625- ... Content-Disposition: form-data; name="field.title"
1626- ...
1627- ... fs dsdfkjhsdlkhjslkjdf sdlkjf slkjd hfsdhfsdh
1628- ... -----------------------------33938214415580350852058287477
1629- ... Content-Disposition: form-data; name="field.summary"
1630- ...
1631- ... hfs lskjdhf zlkjdshf zslkdjlkj hzdl hflz hlhvlkjc hvlkjhdsflkhdsf lskd lkjsz hlkjds flzkshflkjsz lkjsz hlkjz flkjszh lkfzhlkz lkjzs flkjsz hflksz hlkzs hflkj hdszlkjhs dlkfhsdlkjh sdlkjh slkjs hfdlkjs hfdlkjs hdlkshlkj hdlksjhdslkjh fslkjhslkdhflkds hlkjds hfslkjd hflksjhslkjh lkjd sd s.s sd fhsk s sdfs.
1632- ... -----------------------------33938214415580350852058287477
1633- ... Content-Disposition: form-data; name="field.usdvalue"
1634- ...
1635- ... 230.00
1636- ... -----------------------------33938214415580350852058287477
1637- ... Content-Disposition: form-data; name="field.difficulty"
1638- ...
1639- ... Difficult
1640- ... -----------------------------33938214415580350852058287477
1641- ... Content-Disposition: form-data; name="field.difficulty-empty-marker"
1642- ...
1643- ... 1
1644- ... -----------------------------33938214415580350852058287477
1645- ... Content-Disposition: form-data; name="field.description"
1646- ...
1647- ... kjsd hkjs hfksd hfksdj hfkjds hfskdj hskdjhf skdhf skdhf sdkj skj hfdkjsdh fksjd hfkjshd fkjshfdkshd fksksjd hfksjd hfkshfdksjdhf ksjhsd fkjhskjhsdkfh skdhfksdhfksdjhf kks hdfkjshd ksj hks ksjdhfks hks ks kjdshfksjdh fkjsh ksj hfkshf skjhd ksjh fks hdfkshd fksjhkjshd fks h.
1648- ...
1649- ... sdf lksjflskjdflks dlkfsdlkf slusdou s shd fkjshdfkjshdf kskj hfkskjs hksjhfd kshflzkjdhfkhvllkjfd vlnb belk i d f,mbd,mbelkh lv lkdjh lk jkmd,ks jhlkjh lkcj hfdkjh skjh kjds fkjdshf skdjhf lkuvcyiuyvlkejre ,nb ,m siu yvdyieyerkjekjfdkksd skdjh dskh kdsjhfkjsd.
1650- ... -----------------------------33938214415580350852058287477
1651- ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
1652- ...
1653- ... Add
1654- ... -----------------------------33938214415580350852058287477--
1655- ... """)
1656- HTTP/1.1 303 See Other
1657- ...
1658- Location: http://.../bounties/new-ff-bounty
1659- ...
1660-
1661-And let's view it, making sure it is linked to Firefox.
1662-
1663- >>> print http(r"""
1664- ... GET /bounties/new-ff-bounty HTTP/1.1
1665- ... """)
1666- HTTP/1.1 200 Ok
1667- ...Mozilla Firefox...
1668-
1669-
1670-OK, we should also be able to see the +addbounty page on a Project.
1671-
1672- >>> print http(r"""
1673- ... GET /mozilla/+addbounty HTTP/1.1
1674- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1675- ... """)
1676- HTTP/1.1 200 Ok
1677- ...
1678-
1679-Let's test it!
1680-
1681- >>> print http(r"""
1682- ... POST /mozilla/+addbounty HTTP/1.1
1683- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1684- ... Content-Length: 1948
1685- ... Content-Type: multipart/form-data; boundary=---------------------------33938214415580350852058287477
1686- ...
1687- ... -----------------------------33938214415580350852058287477
1688- ... Content-Disposition: form-data; name="field.name"
1689- ...
1690- ... new-mz-bounty
1691- ... -----------------------------33938214415580350852058287477
1692- ... Content-Disposition: form-data; name="field.title"
1693- ...
1694- ... fs dsdfkjhsdlkhjslkjdf sdlkjf slkjd hfsdhfsdh
1695- ... -----------------------------33938214415580350852058287477
1696- ... Content-Disposition: form-data; name="field.summary"
1697- ...
1698- ... hfs lskjdhf zlkjdshf zslkdjlkj hzdl hflz hlhvlkjc hvlkjhdsflkhdsf lskd lkjsz hlkjds flzkshflkjsz lkjsz hlkjz flkjszh lkfzhlkz lkjzs flkjsz hflksz hlkzs hflkj hdszlkjhs dlkfhsdlkjh sdlkjh slkjs hfdlkjs hfdlkjs hdlkshlkj hdlksjhdslkjh fslkjhslkdhflkds hlkjds hfslkjd hflksjhslkjh lkjd sd s.s sd fhsk s sdfs.
1699- ... -----------------------------33938214415580350852058287477
1700- ... Content-Disposition: form-data; name="field.usdvalue"
1701- ...
1702- ... 230.00
1703- ... -----------------------------33938214415580350852058287477
1704- ... Content-Disposition: form-data; name="field.difficulty"
1705- ...
1706- ... Difficult
1707- ... -----------------------------33938214415580350852058287477
1708- ... Content-Disposition: form-data; name="field.difficulty-empty-marker"
1709- ...
1710- ... 1
1711- ... -----------------------------33938214415580350852058287477
1712- ... Content-Disposition: form-data; name="field.description"
1713- ...
1714- ... kjsd hkjs hfksd hfksdj hfkjds hfskdj hskdjhf skdhf skdhf sdkj skj hfdkjsdh fksjd hfkjshd fkjshfdkshd fksksjd hfksjd hfkshfdksjdhf ksjhsd fkjhskjhsdkfh skdhfksdhfksdjhf kks hdfkjshd ksj hks ksjdhfks hks ks kjdshfksjdh fkjsh ksj hfkshf skjhd ksjh fks hdfkshd fksjhkjshd fks h.
1715- ...
1716- ... sdf lksjflskjdflks dlkfsdlkf slusdou s shd fkjshdfkjshdf kskj hfkskjs hksjhfd kshflzkjdhfkhvllkjfd vlnb belk i d f,mbd,mbelkh lv lkdjh lk jkmd,ks jhlkjh lkcj hfdkjh skjh kjds fkjdshf skdjhf lkuvcyiuyvlkejre ,nb ,m siu yvdyieyerkjekjfdkksd skdjh dskh kdsjhfkjsd.
1717- ... -----------------------------33938214415580350852058287477
1718- ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
1719- ...
1720- ... Add
1721- ... -----------------------------33938214415580350852058287477--
1722- ... """)
1723- HTTP/1.1 303 See Other
1724- ...
1725- Location: http://.../bounties/new-mz-bounty
1726- ...
1727-
1728-And let's view it, making sure it is linked to Firefox.
1729-
1730- >>> print http(r"""
1731- ... GET /bounties/new-mz-bounty HTTP/1.1
1732- ... """)
1733- HTTP/1.1 200 Ok
1734- ...Mozilla Project...
1735-
1736-
1737-And lastly, on a Distribution.
1738-
1739- >>> print http(r"""
1740- ... GET /ubuntu/+addbounty HTTP/1.1
1741- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1742- ... """)
1743- HTTP/1.1 200 Ok
1744- ...
1745-
1746-
1747- >>> print http(r"""
1748- ... POST /ubuntu/+addbounty HTTP/1.1
1749- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1750- ... Content-Length: 1948
1751- ... Content-Type: multipart/form-data; boundary=---------------------------33938214415580350852058287477
1752- ...
1753- ... -----------------------------33938214415580350852058287477
1754- ... Content-Disposition: form-data; name="field.name"
1755- ...
1756- ... new-ub-bounty
1757- ... -----------------------------33938214415580350852058287477
1758- ... Content-Disposition: form-data; name="field.title"
1759- ...
1760- ... fs dsdfkjhsdlkhjslkjdf sdlkjf slkjd hfsdhfsdh
1761- ... -----------------------------33938214415580350852058287477
1762- ... Content-Disposition: form-data; name="field.summary"
1763- ...
1764- ... hfs lskjdhf zlkjdshf zslkdjlkj hzdl hflz hlhvlkjc hvlkjhdsflkhdsf lskd lkjsz hlkjds flzkshflkjsz lkjsz hlkjz flkjszh lkfzhlkz lkjzs flkjsz hflksz hlkzs hflkj hdszlkjhs dlkfhsdlkjh sdlkjh slkjs hfdlkjs hfdlkjs hdlkshlkj hdlksjhdslkjh fslkjhslkdhflkds hlkjds hfslkjd hflksjhslkjh lkjd sd s.s sd fhsk s sdfs.
1765- ... -----------------------------33938214415580350852058287477
1766- ... Content-Disposition: form-data; name="field.usdvalue"
1767- ...
1768- ... 230.00
1769- ... -----------------------------33938214415580350852058287477
1770- ... Content-Disposition: form-data; name="field.difficulty"
1771- ...
1772- ... Difficult
1773- ... -----------------------------33938214415580350852058287477
1774- ... Content-Disposition: form-data; name="field.difficulty-empty-marker"
1775- ...
1776- ... 1
1777- ... -----------------------------33938214415580350852058287477
1778- ... Content-Disposition: form-data; name="field.description"
1779- ...
1780- ... kjsd hkjs hfksd hfksdj hfkjds hfskdj hskdjhf skdhf skdhf sdkj skj hfdkjsdh fksjd hfkjshd fkjshfdkshd fksksjd hfksjd hfkshfdksjdhf ksjhsd fkjhskjhsdkfh skdhfksdhfksdjhf kks hdfkjshd ksj hks ksjdhfks hks ks kjdshfksjdh fkjsh ksj hfkshf skjhd ksjh fks hdfkshd fksjhkjshd fks h.
1781- ...
1782- ... sdf lksjflskjdflks dlkfsdlkf slusdou s shd fkjshdfkjshdf kskj hfkskjs hksjhfd kshflzkjdhfkhvllkjfd vlnb belk i d f,mbd,mbelkh lv lkdjh lk jkmd,ks jhlkjh lkcj hfdkjh skjh kjds fkjdshf skdjhf lkuvcyiuyvlkejre ,nb ,m siu yvdyieyerkjekjfdkksd skdjh dskh kdsjhfkjsd.
1783- ... -----------------------------33938214415580350852058287477
1784- ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
1785- ...
1786- ... Add
1787- ... -----------------------------33938214415580350852058287477--
1788- ... """)
1789- HTTP/1.1 303 See Other
1790- ...
1791- Location: http://.../bounties/new-ub-bounty
1792- ...
1793-
1794-And let's view it, making sure it is linked to Firefox.
1795-
1796- >>> print http(r"""
1797- ... GET /bounties/new-ub-bounty HTTP/1.1
1798- ... """)
1799- HTTP/1.1 200 Ok
1800- ...ubuntu...
1801-
1802-
1803
1804=== removed file 'lib/canonical/launchpad/pagetests/bounty/xx-bounty-edit.txt'
1805--- lib/canonical/launchpad/pagetests/bounty/xx-bounty-edit.txt 2007-04-14 10:26:11 +0000
1806+++ lib/canonical/launchpad/pagetests/bounty/xx-bounty-edit.txt 1970-01-01 00:00:00 +0000
1807@@ -1,62 +0,0 @@
1808-
1809-One of the sampledata bounties is called mozilla-svg. Let's take a look at
1810-it now.
1811-
1812- >>> print http(r"""
1813- ... GET /bounties/mozilla-svg HTTP/1.1
1814- ... """)
1815- HTTP/1.1 200 Ok
1816- ...Support SVG in Mozilla...
1817-
1818-
1819-Next, let's POST the +edit form, with some updated values. Specifically, we'll
1820-change the difficulty to basic.
1821-
1822- >>> print http(r"""
1823- ... POST /bounties/mozilla-svg/+edit HTTP/1.1
1824- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1825- ... Content-Length: 2175
1826- ... Content-Type: multipart/form-data; boundary=---------------------------355648249875698224683328425
1827- ...
1828- ... -----------------------------355648249875698224683328425
1829- ... Content-Disposition: form-data; name="field.title"
1830- ...
1831- ... Support SVG in Mozilla
1832- ... -----------------------------355648249875698224683328425
1833- ... Content-Disposition: form-data; name="field.bountystatus"
1834- ...
1835- ... Open
1836- ... -----------------------------355648249875698224683328425
1837- ... Content-Disposition: form-data; name="field.bountystatus-empty-marker"
1838- ...
1839- ... 1
1840- ... -----------------------------355648249875698224683328425
1841- ... Content-Disposition: form-data; name="field.summary"
1842- ...
1843- ... SVG is emerging as a well-supported and well-defined standard for classy vector images. Mozilla should support SVG images natively, without plugins as currently required. In addition, it would be great to be able to address SVG images using the DOM, since they are made up of XML just like XHTML.
1844- ... -----------------------------355648249875698224683328425
1845- ... Content-Disposition: form-data; name="field.difficulty"
1846- ...
1847- ... Basic
1848- ... -----------------------------355648249875698224683328425
1849- ... Content-Disposition: form-data; name="field.difficulty-empty-marker"
1850- ...
1851- ... 1
1852- ... -----------------------------355648249875698224683328425
1853- ... Content-Disposition: form-data; name="field.description"
1854- ...
1855- ... Since you have come this far, you probably already know that SVG stands for Scalable Vector Graphics, and that it is an XML language for sophisticated 2-dimensional graphics. SVG is to graphics what XHTML is to text, MathML is to mathematical equations and CML is to the description of chemical molecules.
1856- ...
1857- ... SVG is similar in scope to Macromedia's proprietary Flash technology: among other things it offers anti-aliased rendering, pattern and gradient fills, sophisticated filter-effects, clipping to arbitrary paths, text and animations. What distinguishes SVG from Flash, is that it is a W3 recommendation (i.e. a standard for all intents and purposes) and that it is XML-based as opposed to a closed binary format. It is explicitly designed to work with other W3C standards such as CSS, DOM and SMIL.
1858- ...
1859- ... -----------------------------355648249875698224683328425
1860- ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
1861- ...
1862- ... Change
1863- ... -----------------------------355648249875698224683328425--
1864- ... """)
1865- HTTP/1.1 303 See Other
1866- ...
1867- Location: http://.../bounties/mozilla-svg
1868- ...
1869-
1870
1871=== removed file 'lib/canonical/launchpad/pagetests/bounty/xx-bounty-list-all.txt'
1872--- lib/canonical/launchpad/pagetests/bounty/xx-bounty-list-all.txt 2007-04-14 10:26:11 +0000
1873+++ lib/canonical/launchpad/pagetests/bounty/xx-bounty-list-all.txt 1970-01-01 00:00:00 +0000
1874@@ -1,10 +0,0 @@
1875-
1876-The /bounties/ page should show all registered bounties.
1877-
1878- >>> print http(r"""
1879- ... GET /bounties HTTP/1.1
1880- ... """)
1881- HTTP/1.1 200 Ok
1882- ...Bounties registered in Launchpad...
1883- ...
1884- ...Comprehensive support for VCARD in Evolution...
1885
1886=== removed file 'lib/canonical/launchpad/pagetests/bounty/xx-bounty-relations.txt'
1887--- lib/canonical/launchpad/pagetests/bounty/xx-bounty-relations.txt 2007-04-14 10:26:11 +0000
1888+++ lib/canonical/launchpad/pagetests/bounty/xx-bounty-relations.txt 1970-01-01 00:00:00 +0000
1889@@ -1,68 +0,0 @@
1890-
1891-Relations
1892-=========
1893-
1894-Now, let's look at how another bounty is related to a product, a
1895-distribution, and a project. We'll look at foomatic-widgets. We can see that
1896-it mentions Ubuntu, Mozilla Firefox, and the Mozilla Project.
1897-
1898- >>> print http(r"""
1899- ... GET /bounties/foomatic-widgets/ HTTP/1.1
1900- ... """)
1901- HTTP/1.1 200 Ok
1902- ...ubuntu...
1903- ...Mozilla Firefox...
1904- ...the Mozilla Project...
1905-
1906-
1907-So now let's also make sure that we have a relateds portlet for a bounty.
1908-
1909- >>> print http(r"""
1910- ... GET /bounties/foomatic-widgets/+portlet-relateds HTTP/1.1
1911- ... """)
1912- HTTP/1.1 200 Ok
1913- ...
1914-
1915-
1916-And one for details.
1917-
1918- >>> print http(r"""
1919- ... GET /bounties/foomatic-widgets/+portlet-details HTTP/1.1
1920- ... """)
1921- HTTP/1.1 200 Ok
1922- ...
1923-
1924-
1925-And a portlet for subscribers.
1926-
1927- >>> print http(r"""
1928- ... GET /bounties/foomatic-widgets/+portlet-subscribers HTTP/1.1
1929- ... """)
1930- HTTP/1.1 200 Ok
1931- ...
1932-
1933-
1934-Just for fun we will check the reverse, we will check the bounties portlets
1935-on Ubuntu, Mozilla Firefox and the Mozilla Project.
1936-
1937- >>> print http(r"""
1938- ... GET /ubuntu/+portlet-bounties HTTP/1.1
1939- ... """)
1940- HTTP/1.1 200 Ok
1941- ...foomatic-widgets...
1942-
1943-
1944- >>> print http(r"""
1945- ... GET /firefox/+portlet-bounties HTTP/1.1
1946- ... """)
1947- HTTP/1.1 200 Ok
1948- ...foomatic-widgets...
1949-
1950-
1951- >>> print http(r"""
1952- ... GET /mozilla/+portlet-bounties HTTP/1.1
1953- ... """)
1954- HTTP/1.1 200 Ok
1955- ...foomatic-widgets...
1956-
1957-
1958
1959=== removed file 'lib/canonical/launchpad/pagetests/bounty/xx-bounty-subscriptions.txt'
1960--- lib/canonical/launchpad/pagetests/bounty/xx-bounty-subscriptions.txt 2007-04-14 10:26:11 +0000
1961+++ lib/canonical/launchpad/pagetests/bounty/xx-bounty-subscriptions.txt 1970-01-01 00:00:00 +0000
1962@@ -1,25 +0,0 @@
1963-
1964-Now, let's subscribe to the Bounty. First, we want to display the
1965-"subscribe" page.
1966-
1967- >>> print http(r"""
1968- ... GET /bounties/mozilla-svg/+subscribe HTTP/1.1
1969- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1970- ... """)
1971- HTTP/1.1 200 Ok
1972- ...Subscribe to bounty...
1973-
1974-Now, let's POST our subscription. The POST should be directed to the
1975-bounty page itself, and we should see a message.
1976-
1977- >>> print http(r"""
1978- ... POST /bounties/mozilla-svg/ HTTP/1.1
1979- ... Authorization: Basic Y2FybG9zQGNhbm9uaWNhbC5jb206dGVzdA==
1980- ... Content-Length: 19
1981- ... Content-Type: application/x-www-form-urlencoded
1982- ...
1983- ... subscribe=Subscribe""")
1984- HTTP/1.1 200 Ok
1985- ...Your subscription to this bounty has been updated...
1986-
1987-
1988
1989=== modified file 'lib/canonical/launchpad/pagetitles.py'
1990--- lib/canonical/launchpad/pagetitles.py 2009-08-28 15:54:41 +0000
1991+++ lib/canonical/launchpad/pagetitles.py 2009-08-31 00:06:29 +0000
1992@@ -158,18 +158,6 @@
1993
1994 binarypackagenames_index = 'Binary package name set'
1995
1996-bounties_index = 'Bounties registered in Launchpad'
1997-
1998-bounty_add = 'Register a bounty'
1999-
2000-bounty_edit = ContextTitle(smartquote('Edit bounty "%s"'))
2001-
2002-bounty_link = ContextTitle('Link a bounty to %s')
2003-
2004-bounty_index = ContextTitle(smartquote('Bounty "%s" in Launchpad'))
2005-
2006-bounty_subscription = ContextTitle(smartquote('Subscription to bounty "%s"'))
2007-
2008 branch_bug_links = ContextDisplayName(smartquote('Bug links for %s'))
2009
2010 branch_index = ContextDisplayName(smartquote(
2011@@ -789,8 +777,6 @@
2012 person_answer_contact_for = ContextDisplayName(
2013 'Projects for which %s is an answer contact')
2014
2015-person_bounties = ContextDisplayName('Bounties for %s')
2016-
2017 person_changepassword = 'Change your password'
2018
2019 person_claim = 'Claim account'
2020@@ -1048,8 +1034,6 @@
2021
2022 registry_index = 'Project and group registration in Launchpad'
2023
2024-related_bounties = ContextDisplayName('Bounties for %s')
2025-
2026 remotebug_index = ContextTitle('%s')
2027
2028 root_featuredprojects = 'Manage featured projects in Launchpad'
2029
2030=== removed file 'lib/canonical/launchpad/templates/bounties-index.pt'
2031--- lib/canonical/launchpad/templates/bounties-index.pt 2009-07-17 17:59:07 +0000
2032+++ lib/canonical/launchpad/templates/bounties-index.pt 1970-01-01 00:00:00 +0000
2033@@ -1,65 +0,0 @@
2034-<html
2035- xmlns="http://www.w3.org/1999/xhtml"
2036- xmlns:tal="http://xml.zope.org/namespaces/tal"
2037- xmlns:metal="http://xml.zope.org/namespaces/metal"
2038- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2039- xml:lang="en"
2040- lang="en"
2041- dir="ltr"
2042- metal:use-macro="context/@@main_template/master"
2043- i18n:domain="launchpad"
2044->
2045- <body>
2046-
2047-<metal:leftportlets fill-slot="portlets_one">
2048- <div tal:replace="structure context/@@+portlet-about" />
2049- <div tal:replace="structure context/@@+portlet-details" />
2050-</metal:leftportlets>
2051-
2052-<div metal:fill-slot="main">
2053-
2054- <h1>Bounties registered in Launchpad</h1>
2055-
2056- <p>
2057- In Launchpad, a bounty is an offer of payment
2058- for development work.
2059- <tal:block condition="request/lp:person">
2060- You can register bounties
2061- or sign up for bounties offered by other people.
2062- </tal:block>
2063- <tal:block condition="not: request/lp:person">
2064- <a href="+login">Log in</a>
2065- and you&#8217;ll be able to register bounties,
2066- or sign up for bounties offered by other people.
2067- </tal:block>
2068- </p>
2069-
2070- <table class="listing sortable" width="100%" id="bountylist">
2071- <thead>
2072- <tr>
2073- <th>Date</th>
2074- <th>Title</th>
2075- <th>USD Value<sup>*</sup></th>
2076- </tr>
2077- </thead>
2078- <tbody>
2079- <tr tal:repeat="bounty context">
2080- <td tal:content="bounty/datecreated/fmt:date">
2081- date
2082- </td>
2083- <td><a tal:content="bounty/title/fmt:shorten/57"
2084- tal:attributes="href bounty/fmt:url">title</a></td>
2085- <td tal:content="bounty/usdvalue">usdvalue</td>
2086- </tr>
2087- </tbody>
2088- </table>
2089-
2090- <p><sup>*</sup> A bounty may include contributions in several currencies.
2091- This is an estimate of the bounty value in US dollars, based on recent
2092- exchange rates.
2093- </p>
2094-
2095-</div>
2096-</body>
2097-</html>
2098-<!-- 1-0 done -->
2099
2100=== removed file 'lib/canonical/launchpad/templates/bounties-portlet-about.pt'
2101--- lib/canonical/launchpad/templates/bounties-portlet-about.pt 2009-07-17 17:59:07 +0000
2102+++ lib/canonical/launchpad/templates/bounties-portlet-about.pt 1970-01-01 00:00:00 +0000
2103@@ -1,15 +0,0 @@
2104-<div
2105- xmlns:tal="http://xml.zope.org/namespaces/tal"
2106- xmlns:metal="http://xml.zope.org/namespaces/metal"
2107- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2108- class="portlet" id="portlet-about">
2109- <h2>What&#8217;s this all about?</h2>
2110- <div class="portletBody portletContent">
2111- <img src="/@@/info" />
2112- You can track bounties through The Launchpad. You can associate a bounty
2113- with an upstream project, or with a distribution. If you
2114- would like to sponsor a bounty yourself, please contact <a
2115- href="mailto:janew@canonical.com">Jane Weideman</a>.
2116- </div>
2117-</div>
2118-
2119
2120=== removed file 'lib/canonical/launchpad/templates/bounties-portlet-details.pt'
2121--- lib/canonical/launchpad/templates/bounties-portlet-details.pt 2009-07-17 17:59:07 +0000
2122+++ lib/canonical/launchpad/templates/bounties-portlet-details.pt 1970-01-01 00:00:00 +0000
2123@@ -1,20 +0,0 @@
2124-<div
2125- xmlns:tal="http://xml.zope.org/namespaces/tal"
2126- xmlns:metal="http://xml.zope.org/namespaces/metal"
2127- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2128- class="portlet" id="portlet-details">
2129-
2130- <h2>Bounty rules</h2>
2131-
2132- <div class="portletBody portletContent">
2133-
2134- <img src="/@@/info" />
2135- You can stake a claim to any unclaimed bounty, but must then begin to
2136- deliver code on a regular schedule, or forfeit the claim to someone else.
2137- The reviewer will decide when the submission is complete, and can also
2138- rule that a claimant is making no progress, which will make the bounty
2139- available again. Payments will be made by Paypal, wire transfer can also
2140- be made for bounties in excess of $500.
2141-
2142- </div>
2143-</div>
2144
2145=== removed file 'lib/canonical/launchpad/templates/bounty-add.pt'
2146--- lib/canonical/launchpad/templates/bounty-add.pt 2009-07-17 17:59:07 +0000
2147+++ lib/canonical/launchpad/templates/bounty-add.pt 1970-01-01 00:00:00 +0000
2148@@ -1,34 +0,0 @@
2149-<html
2150- xmlns="http://www.w3.org/1999/xhtml"
2151- xmlns:tal="http://xml.zope.org/namespaces/tal"
2152- xmlns:metal="http://xml.zope.org/namespaces/metal"
2153- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2154- xml:lang="en"
2155- lang="en"
2156- dir="ltr"
2157- metal:use-macro="context/@@main_template/master"
2158- i18n:domain="launchpad"
2159->
2160- <body>
2161-
2162-<div metal:fill-slot="main">
2163-
2164- <h1>Register a bounty</h1>
2165-
2166- <div metal:use-macro="context/@@launchpad_addform/addform">
2167-
2168- <p metal:fill-slot="extra_info">
2169- You will be listed forever as the creator of this bounty,
2170- so ensure you get the details correct.
2171- Most importantly, include contact details
2172- for the person issuing the bounty.
2173- Thanks!
2174- </p>
2175-
2176- </div>
2177-
2178-</div>
2179-
2180-</body>
2181-</html>
2182-<!-- 1-0 done -->
2183
2184=== removed file 'lib/canonical/launchpad/templates/bounty-edit.pt'
2185--- lib/canonical/launchpad/templates/bounty-edit.pt 2009-07-17 17:59:07 +0000
2186+++ lib/canonical/launchpad/templates/bounty-edit.pt 1970-01-01 00:00:00 +0000
2187@@ -1,36 +0,0 @@
2188-<html
2189- xmlns="http://www.w3.org/1999/xhtml"
2190- xmlns:tal="http://xml.zope.org/namespaces/tal"
2191- xmlns:metal="http://xml.zope.org/namespaces/metal"
2192- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2193- xml:lang="en"
2194- lang="en"
2195- dir="ltr"
2196- metal:use-macro="context/@@main_template/master"
2197- i18n:domain="launchpad"
2198->
2199-<tal:tag condition="view/update" />
2200- <body>
2201-
2202-<metal:leftportlets fill-slot="portlets_one">
2203- <div tal:replace="structure context/@@+portlet-details" />
2204-</metal:leftportlets>
2205-
2206- <div metal:fill-slot="main">
2207-
2208- <h1>Change bounty details</h1>
2209-
2210- <div metal:use-macro="context/@@launchpad_editform/editform">
2211-
2212- <h1 tal:condition="view/label"
2213- tal:content="view/label"
2214- metal:fill-slot="heading"
2215- >Form Label will come from ZCML label="xxx"</h1>
2216-
2217- </div>
2218-
2219- </div>
2220-
2221-</body>
2222-</html>
2223-<!-- 1-0 done -->
2224
2225=== removed file 'lib/canonical/launchpad/templates/bounty-index.pt'
2226--- lib/canonical/launchpad/templates/bounty-index.pt 2009-07-17 17:59:07 +0000
2227+++ lib/canonical/launchpad/templates/bounty-index.pt 1970-01-01 00:00:00 +0000
2228@@ -1,96 +0,0 @@
2229-<html
2230- xmlns="http://www.w3.org/1999/xhtml"
2231- xmlns:tal="http://xml.zope.org/namespaces/tal"
2232- xmlns:metal="http://xml.zope.org/namespaces/metal"
2233- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2234- xml:lang="en"
2235- lang="en"
2236- dir="ltr"
2237- metal:use-macro="context/@@main_template/master"
2238- i18n:domain="launchpad"
2239->
2240- <body>
2241-
2242-<metal:leftportlets fill-slot="portlets_one">
2243- <div tal:replace="structure context/@@+portlet-details" />
2244- <div tal:replace="structure context/@@+portlet-subscribers" />
2245-</metal:leftportlets>
2246-
2247-<metal:rightportlets fill-slot="portlets_two">
2248- <div tal:replace="structure context/@@+portlet-relateds" />
2249-</metal:rightportlets>
2250-
2251-<div metal:fill-slot="main">
2252-
2253- <h1 tal:content="context/title">Bounty name</h1>
2254-
2255- <p tal:repeat="notice view/notices"
2256- tal:content="notice"
2257- class="error message"
2258- >Error message</p>
2259-
2260- <p class="documentDescription" tal:content="context/summary">
2261- $Bounty.summary goes here. This should be quite short,
2262- just a single paragraph of text really, giving a summary of
2263- this Bounty.
2264- </p>
2265-
2266- <p tal:content="context/description">
2267- $Bounty.description goes here. It could be quite long, a few
2268- paragraphs at least, and should specify in detail the requirements
2269- of the bounty, so that both claimant and reviewer will know when the
2270- bounty has been completed.
2271- </p>
2272-
2273- <tal:message repeat="message context/messages">
2274- <div class="boardComment"
2275- tal:condition="python:context.description != message.text_contents">
2276-
2277- <div class="boardCommentDetails">
2278- <strong tal:content="message/title">$Message.title</strong>
2279-
2280- Posted
2281- <span
2282- tal:attributes="title message/datecreated/fmt:datetime"
2283- tal:content="message/datecreated/fmt:displaydate"
2284- >2 minutes ago</span>
2285- by <a href="#" tal:attributes="href message/owner/fmt:url"
2286- tal:content="message/owner/displayname|string:(nobody)">
2287- $Person.displayname</a>
2288- </div>
2289-
2290- <div class="boardCommentBody">
2291- <tal:comment
2292- content="structure message/text_contents/fmt:text-to-html"
2293- >
2294- Comment text.
2295- </tal:comment>
2296- </div>
2297-
2298- </div>
2299- </tal:message>
2300-
2301- <tal:logged-in condition="request/lp:person">
2302- <fieldset class="collapsible collapsed">
2303- <legend>Add comment to this bounty</legend>
2304- <form action="+addmessage" method="post">
2305- <b>Subject:</b>
2306- <input name="field.subject" type="text" size="50"
2307- tal:attributes="value context/followup_subject" /><br />
2308- <b>Comment:</b> <textarea name="field.content" rows="10"></textarea>
2309- <br />
2310- <input type="submit" name="UPDATE_SUBMIT" value="Post Comment" />
2311- </form>
2312- </fieldset>
2313- </tal:logged-in>
2314- <tal:not-logged-in condition="not: request/lp:person">
2315- <div align="center">
2316- To post a comment you must <a href="+login">log in</a>.
2317- </div>
2318- </tal:not-logged-in>
2319-
2320-</div>
2321-
2322-</body>
2323-</html>
2324-<!-- 1-0 done -->
2325
2326=== removed file 'lib/canonical/launchpad/templates/bounty-portlet-details.pt'
2327--- lib/canonical/launchpad/templates/bounty-portlet-details.pt 2009-07-17 17:59:07 +0000
2328+++ lib/canonical/launchpad/templates/bounty-portlet-details.pt 1970-01-01 00:00:00 +0000
2329@@ -1,15 +0,0 @@
2330-<div
2331- xmlns:tal="http://xml.zope.org/namespaces/tal"
2332- xmlns:metal="http://xml.zope.org/namespaces/metal"
2333- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2334- class="portlet" id="portlet-details">
2335-
2336- <h2>Bounty details</h2>
2337-
2338- <div class="portletBody portletContent">
2339-
2340- <b>Registered by:</b>
2341- <a tal:replace="structure context/owner/fmt:link">Foo Bar</a><br />
2342- </div>
2343-
2344-</div>
2345
2346=== removed file 'lib/canonical/launchpad/templates/bounty-portlet-subscribers.pt'
2347--- lib/canonical/launchpad/templates/bounty-portlet-subscribers.pt 2009-07-17 17:59:07 +0000
2348+++ lib/canonical/launchpad/templates/bounty-portlet-subscribers.pt 1970-01-01 00:00:00 +0000
2349@@ -1,21 +0,0 @@
2350-<div
2351- xmlns:tal="http://xml.zope.org/namespaces/tal"
2352- xmlns:metal="http://xml.zope.org/namespaces/metal"
2353- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2354- class="portlet" id="portlet-subscribers">
2355- <h2>Bounty subscribers</h2>
2356-
2357- <div class="portletBody portletContent">
2358-
2359- <ul class="person">
2360- <li tal:repeat="sub context/subscriptions">
2361- <a href="#"
2362- tal:content="sub/person/displayname"
2363- tal:attributes="href sub/person/fmt:url">Dafydd Harries</a>
2364- </li>
2365- <li class="info" tal:condition="not: context/subscriptions">
2366- <i>No subscribers</i>
2367- </li>
2368- </ul>
2369- </div>
2370-</div>
2371
2372=== removed file 'lib/canonical/launchpad/templates/bounty-subscription.pt'
2373--- lib/canonical/launchpad/templates/bounty-subscription.pt 2009-07-17 17:59:07 +0000
2374+++ lib/canonical/launchpad/templates/bounty-subscription.pt 1970-01-01 00:00:00 +0000
2375@@ -1,52 +0,0 @@
2376-<html
2377- xmlns="http://www.w3.org/1999/xhtml"
2378- xmlns:tal="http://xml.zope.org/namespaces/tal"
2379- xmlns:metal="http://xml.zope.org/namespaces/metal"
2380- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
2381- xml:lang="en"
2382- lang="en"
2383- dir="ltr"
2384- metal:use-macro="context/@@main_template/master"
2385- i18n:domain="launchpad"
2386->
2387- <body>
2388-
2389-<metal:leftportlets fill-slot="portlets_one">
2390- <div tal:replace="structure context/@@+portlet-details" />
2391- <div tal:replace="structure context/@@+portlet-subscribers" />
2392-</metal:leftportlets>
2393-
2394-<div metal:fill-slot="main">
2395-
2396- <div tal:content="context/title">Bounty name</div>
2397- <h1 tal:condition="not: view/subscription">Subscribe to bounty</h1>
2398- <h1 tal:condition="view/subscription">Unsubscribe from bounty</h1>
2399-
2400- <p>
2401- Bounty subscribers will be e-mailed copies of any comments made on
2402- this bounty. If you subscribe to a bounty it will show up on your
2403- personal pages, too.
2404- </p>
2405-
2406- <form action="." method="POST">
2407-
2408- <div class="actions">
2409- <input type="submit"
2410- name="cancel"
2411- value="Cancel" />
2412- <input tal:condition="not: view/subscription"
2413- type="submit"
2414- name="subscribe"
2415- value="Subscribe" />
2416- <input tal:condition="view/subscription"
2417- type="submit"
2418- name="subscribe"
2419- value="Unsubscribe" />
2420- </div>
2421- </form>
2422-
2423-</div>
2424-
2425-</body>
2426-</html>
2427-<!-- 1-0 done -->
2428
2429=== modified file 'lib/canonical/launchpad/vocabularies/configure.zcml'
2430--- lib/canonical/launchpad/vocabularies/configure.zcml 2009-07-19 04:41:14 +0000
2431+++ lib/canonical/launchpad/vocabularies/configure.zcml 2009-08-27 07:05:16 +0000
2432@@ -5,12 +5,6 @@
2433 <configure xmlns="http://namespaces.zope.org/zope">
2434
2435 <utility
2436- name="Bounty"
2437- component="canonical.launchpad.vocabularies.BountyVocabulary"
2438- provides="zope.schema.interfaces.IVocabularyFactory"
2439- />
2440-
2441- <utility
2442 name="Branch"
2443 component="canonical.launchpad.vocabularies.BranchVocabulary"
2444 provides="zope.schema.interfaces.IVocabularyFactory"
2445
2446=== modified file 'lib/canonical/launchpad/vocabularies/dbobjects.py'
2447--- lib/canonical/launchpad/vocabularies/dbobjects.py 2009-07-31 02:10:10 +0000
2448+++ lib/canonical/launchpad/vocabularies/dbobjects.py 2009-08-27 07:05:16 +0000
2449@@ -10,7 +10,6 @@
2450 __metaclass__ = type
2451
2452 __all__ = [
2453- 'BountyVocabulary',
2454 'HostedBranchRestrictedOnOwnerVocabulary',
2455 'BranchRestrictedOnProductVocabulary',
2456 'BranchVocabulary',
2457@@ -56,7 +55,6 @@
2458 from lp.code.model.branch import Branch
2459 from lp.bugs.model.bug import Bug
2460 from lp.bugs.model.bugtracker import BugTracker
2461-from canonical.launchpad.database.bounty import Bounty
2462 from canonical.launchpad.database import Archive, BugWatch
2463 from lp.soyuz.model.component import Component
2464 from lp.soyuz.model.distroarchseries import DistroArchSeries
2465@@ -225,12 +223,6 @@
2466 _orderBy = 'id'
2467
2468
2469-class BountyVocabulary(SQLObjectVocabularyBase):
2470-
2471- _table = Bounty
2472- # XXX kiko 2006-02-20: no _orderBy?
2473-
2474-
2475 class BugTrackerVocabulary(SQLObjectVocabularyBase):
2476
2477 _table = BugTracker
2478
2479=== modified file 'lib/canonical/launchpad/webapp/__init__.py'
2480--- lib/canonical/launchpad/webapp/__init__.py 2009-06-25 05:39:50 +0000
2481+++ lib/canonical/launchpad/webapp/__init__.py 2009-08-27 07:05:16 +0000
2482@@ -121,12 +121,6 @@
2483 summary = 'Blueprints and specifications'
2484 return Link('', text, summary)
2485
2486- def bounties(self):
2487- target = '+bounties'
2488- text = 'Bounties'
2489- summary = 'View related bounty offers'
2490- return Link(target, text, summary)
2491-
2492 def branches(self):
2493 # this is disabled by default, because relatively few objects have
2494 # branch views
2495
2496=== removed file 'lib/canonical/launchpad/zcml/bounty.zcml'
2497--- lib/canonical/launchpad/zcml/bounty.zcml 2009-07-13 18:15:02 +0000
2498+++ lib/canonical/launchpad/zcml/bounty.zcml 1970-01-01 00:00:00 +0000
2499@@ -1,156 +0,0 @@
2500-<!-- Copyright 2009 Canonical Ltd. This software is licensed under the
2501- GNU Affero General Public License version 3 (see the file LICENSE).
2502--->
2503-
2504-<configure
2505- xmlns="http://namespaces.zope.org/zope"
2506- xmlns:browser="http://namespaces.zope.org/browser"
2507- xmlns:i18n="http://namespaces.zope.org/i18n"
2508- i18n_domain="launchpad">
2509-
2510-<facet facet="bounties">
2511-
2512- <!-- Bounty -->
2513- <class class="canonical.launchpad.database.Bounty">
2514- <allow interface="canonical.launchpad.interfaces.IBounty" />
2515- <require
2516- permission="launchpad.AnyPerson"
2517- set_schema="canonical.launchpad.interfaces.IBounty" />
2518- </class>
2519-
2520- <browser:defaultView
2521- for="canonical.launchpad.interfaces.IBounty"
2522- name="+index" />
2523-
2524- <browser:url
2525- for="canonical.launchpad.interfaces.IBounty"
2526- path_expression="name"
2527- parent_utility="canonical.launchpad.interfaces.IBountySet"
2528- />
2529-
2530- <!-- The bounty system is kept maintained but not available for users.
2531- This is achieved by putting it on the PageTestLayer. -->
2532- <browser:pages
2533- for="canonical.launchpad.interfaces.IBounty"
2534- class="canonical.launchpad.browser.BountyView"
2535- layer="canonical.launchpad.layers.PageTestLayer"
2536- permission="zope.Public">
2537- <browser:page
2538- name="+index"
2539- template="../templates/bounty-index.pt"
2540- />
2541- <browser:page
2542- name="+portlet-details"
2543- template="../templates/bounty-portlet-details.pt"
2544- />
2545- <browser:page
2546- name="+portlet-relateds"
2547- template="../templates/bounty-portlet-relateds.pt"
2548- />
2549- <browser:page
2550- name="+portlet-subscribers"
2551- template="../templates/bounty-portlet-subscribers.pt"
2552- />
2553- </browser:pages>
2554-
2555- <browser:pages
2556- for="canonical.launchpad.interfaces.IBounty"
2557- class="canonical.launchpad.browser.BountyView"
2558- permission="launchpad.AnyPerson">
2559- <browser:page
2560- name="+subscribe"
2561- template="../templates/bounty-subscription.pt"
2562- />
2563- </browser:pages>
2564-
2565- <browser:editform
2566- name="+edit"
2567- schema="canonical.launchpad.interfaces.IBounty"
2568- class="canonical.launchpad.browser.BountyEditView"
2569- fields="title bountystatus summary difficulty description"
2570- permission="launchpad.Edit"
2571- template="../templates/bounty-edit.pt"
2572- />
2573-
2574- <browser:editform
2575- name="+admin"
2576- schema="canonical.launchpad.interfaces.IBounty"
2577- label="Administer bounty"
2578- fields="name owner title bountystatus summary usdvalue difficulty description"
2579- permission="launchpad.Admin"
2580- template="../templates/bounty-edit.pt"
2581- />
2582-
2583- <browser:page
2584- name="+addmessage"
2585- for="canonical.launchpad.interfaces.IBounty"
2586- class="canonical.launchpad.browser.MessageAddView"
2587- permission="launchpad.AnyPerson"
2588- template="../templates/message-add.pt"
2589- />
2590-
2591-
2592- <!-- BountySet -->
2593- <class class="canonical.launchpad.database.BountySet">
2594- <allow interface="canonical.launchpad.interfaces.IBountySet" />
2595- </class>
2596-
2597- <securedutility
2598- class="canonical.launchpad.database.BountySet"
2599- provides="canonical.launchpad.interfaces.IBountySet" >
2600- <allow interface="canonical.launchpad.interfaces.IBountySet" />
2601- </securedutility>
2602-
2603- <browser:url
2604- for="canonical.launchpad.interfaces.IBountySet"
2605- path_expression="string:bounties"
2606- parent_utility="canonical.launchpad.interfaces.ILaunchpadRoot"
2607- />
2608-
2609- <browser:navigation
2610- module="canonical.launchpad.browser"
2611- classes="BountySetNavigation"
2612- />
2613-
2614- <browser:defaultView
2615- for="canonical.launchpad.interfaces.IBountySet"
2616- name="+index" />
2617-
2618- <!-- The bounty system is kept maintained but not available for users.
2619- This is achieved by putting it on the PageTestLayer. -->
2620- <browser:addform
2621- for="canonical.launchpad.interfaces.IBountySet"
2622- layer="canonical.launchpad.layers.PageTestLayer"
2623- name="+new"
2624- schema="canonical.launchpad.interfaces.IBounty"
2625- fields="name title summary usdvalue difficulty description"
2626- class="canonical.launchpad.browser.BountyAddView"
2627- permission="launchpad.AnyPerson"
2628- template="../templates/bounty-add.pt"
2629- />
2630-
2631- <!-- The bounty system is kept maintained but is not accessible to users.
2632- This is achieved by putting it on the PageTestLayer. -->
2633- <browser:pages
2634- for="canonical.launchpad.interfaces.IBountySet"
2635- layer="canonical.launchpad.layers.PageTestLayer"
2636- permission="zope.Public">
2637- <browser:page
2638- template="../templates/bounties-index.pt"
2639- name="+index"
2640- />
2641- <browser:page
2642- template="../templates/bounties-portlet-about.pt"
2643- name="+portlet-about" />
2644- <browser:page
2645- template="../templates/bounties-portlet-details.pt"
2646- name="+portlet-details" />
2647- </browser:pages>
2648-
2649- <browser:menus
2650- module="canonical.launchpad.browser.bounty"
2651- classes="BountiesAppMenu BountyContextMenu"
2652- />
2653-
2654-</facet>
2655-</configure>
2656
2657=== removed file 'lib/canonical/launchpad/zcml/bountysubscription.zcml'
2658--- lib/canonical/launchpad/zcml/bountysubscription.zcml 2009-07-13 18:15:02 +0000
2659+++ lib/canonical/launchpad/zcml/bountysubscription.zcml 1970-01-01 00:00:00 +0000
2660@@ -1,38 +0,0 @@
2661-<!-- Copyright 2009 Canonical Ltd. This software is licensed under the
2662- GNU Affero General Public License version 3 (see the file LICENSE).
2663--->
2664-
2665-<configure
2666- xmlns="http://namespaces.zope.org/zope"
2667- xmlns:browser="http://namespaces.zope.org/browser"
2668- xmlns:i18n="http://namespaces.zope.org/i18n"
2669- i18n_domain="launchpad">
2670-
2671- <!-- BountySubscription -->
2672- <class class="canonical.launchpad.database.BountySubscription">
2673- <allow interface="canonical.launchpad.interfaces.IBountySubscription" />
2674- <require
2675- permission="zope.Public"
2676- set_schema="canonical.launchpad.interfaces.IBountySubscription"
2677- />
2678- </class>
2679-
2680- <!-- BountySubscriptionSet -->
2681- <class class="canonical.launchpad.database.BountySubscriptionSet">
2682- <allow
2683- interface="canonical.launchpad.interfaces.IBountySubscriptionSet" />
2684- </class>
2685-
2686- <securedutility
2687- class="canonical.launchpad.database.BountySubscriptionSet"
2688- provides="canonical.launchpad.interfaces.IBountySubscriptionSet">
2689- <allow interface="canonical.launchpad.interfaces.IBountySubscriptionSet"
2690- />
2691- </securedutility>
2692-
2693- <browser:navigation
2694- module="canonical.launchpad.browser"
2695- classes="BountySubscriptionNavigation"
2696- />
2697-
2698-</configure>
2699
2700=== modified file 'lib/canonical/launchpad/zcml/configure.zcml'
2701--- lib/canonical/launchpad/zcml/configure.zcml 2009-07-23 17:51:28 +0000
2702+++ lib/canonical/launchpad/zcml/configure.zcml 2009-08-27 07:05:16 +0000
2703@@ -12,8 +12,6 @@
2704 <include file="account.zcml" />
2705 <include file="batchnavigator.zcml" />
2706 <include file="binaryandsourcepackagename.zcml" />
2707- <include file="bountysubscription.zcml" />
2708- <include file="bounty.zcml" />
2709 <include file="crowd.zcml" />
2710 <include file="datetime.zcml" />
2711 <include file="decoratedresultset.zcml" />
2712
2713=== modified file 'lib/lp/registry/browser/configure.zcml'
2714--- lib/lp/registry/browser/configure.zcml 2009-08-27 11:34:14 +0000
2715+++ lib/lp/registry/browser/configure.zcml 2009-08-28 06:38:41 +0000
2716@@ -312,10 +312,6 @@
2717 <!-- Projects portlets -->
2718
2719 <browser:page
2720- name="+portlet-bounties"
2721- facet="bounties"
2722- template="../templates/object-portlet-bounties.pt"/>
2723- <browser:page
2724 name="+details"
2725 facet="overview"
2726 template="../templates/project-details.pt"/>
2727@@ -329,14 +325,6 @@
2728 template="../templates/object-portlet-milestones.pt"/>
2729 </browser:pages>
2730 <browser:page
2731- facet="bounties"
2732- for="lp.registry.interfaces.project.IProject"
2733- class="lp.registry.browser.project.ProjectView"
2734- layer="canonical.launchpad.layers.PageTestLayer"
2735- name="+bounties"
2736- permission="zope.Public"
2737- template="../templates/related-bounties.pt"/>
2738- <browser:page
2739 for="lp.registry.interfaces.project.IProject"
2740 class="lp.registry.browser.project.ProjectRdfView"
2741 facet="overview"
2742@@ -385,31 +373,6 @@
2743 class="lp.registry.browser.project.ProjectAddProductView"
2744 permission="launchpad.AnyPerson"
2745 template="../templates/product-new.pt"/>
2746- <browser:addform
2747- name="+linkbounty"
2748- for="lp.registry.interfaces.project.IProject"
2749- facet="bounties"
2750- schema="canonical.launchpad.interfaces.IProjectBounty"
2751- class="canonical.launchpad.browser.bounty.BountyLinkView"
2752- label="Link an existing bounty"
2753- fields="project bounty"
2754- keyword_arguments="project bounty"
2755- permission="launchpad.AnyPerson"
2756- template="../templates/bounty-link.pt">
2757- <browser:widget
2758- field="project"
2759- class="canonical.widgets.ContextWidget"/>
2760- </browser:addform>
2761- <browser:addform
2762- name="+addbounty"
2763- for="lp.registry.interfaces.project.IProject"
2764- facet="bounties"
2765- schema="canonical.launchpad.interfaces.IBounty"
2766- label="Register a bounty"
2767- fields="name title summary usdvalue difficulty description"
2768- class="canonical.launchpad.browser.BountyAddView"
2769- permission="launchpad.AnyPerson"
2770- template="../../../canonical/launchpad/templates/bounty-add.pt"/>
2771 <browser:defaultView
2772 for="lp.registry.interfaces.project.IProjectSet"
2773 name="+index"/>
2774@@ -458,7 +421,6 @@
2775 classes="
2776 ProjectActionMenu
2777 ProjectAnswersMenu
2778- ProjectBountiesMenu
2779 ProjectBugsMenu
2780 ProjectEditNavigationMenu
2781 ProjectFacets
2782@@ -942,14 +904,6 @@
2783 for="lp.registry.interfaces.person.IPerson"
2784 name="+projects"
2785 new_name="+related-software"/>
2786- <browser:page
2787- class="lp.registry.browser.person.PersonView"
2788- facet="bounties"
2789- for="lp.registry.interfaces.person.IPerson"
2790- layer="canonical.launchpad.layers.PageTestLayer"
2791- name="+bounties"
2792- permission="zope.Public"
2793- template="../templates/person-bounties.pt"/>
2794 <browser:pages
2795 for="lp.registry.interfaces.person.IPerson"
2796 permission="zope.Public"
2797@@ -1435,10 +1389,6 @@
2798 facet="overview"
2799 template="../templates/object-milestones.pt"/>
2800 <browser:page
2801- name="+portlet-bounties"
2802- facet="bounties"
2803- template="../templates/object-portlet-bounties.pt"/>
2804- <browser:page
2805 name="+portlet-packages"
2806 facet="overview"
2807 template="../templates/product-portlet-packages.pt"/>
2808@@ -1473,13 +1423,6 @@
2809 template="../templates/product-edit-people.pt"/>
2810 </browser:pages>
2811 <browser:page
2812- facet="bounties"
2813- for="lp.registry.interfaces.product.IProduct"
2814- layer="canonical.launchpad.layers.PageTestLayer"
2815- name="+bounties"
2816- permission="zope.Public"
2817- template="../templates/related-bounties.pt"/>
2818- <browser:page
2819 name="+edit"
2820 for="lp.registry.interfaces.product.IProduct"
2821 facet="overview"
2822@@ -1507,31 +1450,6 @@
2823 class="lp.registry.browser.product.ProductReviewLicenseView"
2824 permission="launchpad.ProjectReview"
2825 template="../templates/product-review-license.pt"/>
2826- <browser:addform
2827- name="+linkbounty"
2828- for="lp.registry.interfaces.product.IProduct"
2829- schema="canonical.launchpad.interfaces.IProductBounty"
2830- class="canonical.launchpad.browser.bounty.BountyLinkView"
2831- facet="bounties"
2832- label="Link an existing bounty"
2833- fields="product bounty"
2834- keyword_arguments="product bounty"
2835- permission="launchpad.AnyPerson"
2836- template="../templates/bounty-link.pt">
2837- <browser:widget
2838- field="product"
2839- class="canonical.widgets.ContextWidget"/>
2840- </browser:addform>
2841- <browser:addform
2842- name="+addbounty"
2843- for="lp.registry.interfaces.product.IProduct"
2844- schema="canonical.launchpad.interfaces.IBounty"
2845- label="Register a bounty"
2846- fields="name title summary usdvalue difficulty description"
2847- class="canonical.launchpad.browser.BountyAddView"
2848- facet="bounties"
2849- permission="launchpad.AnyPerson"
2850- template="../../../canonical/launchpad/templates/bounty-add.pt"/>
2851 <browser:page
2852 name="+addseries"
2853 for="lp.registry.interfaces.product.IProduct"
2854@@ -1591,7 +1509,6 @@
2855 <browser:menus
2856 classes="
2857 ProductActionNavigationMenu
2858- ProductBountiesMenu
2859 ProductBugsMenu
2860 ProductEditNavigationMenu
2861 ProductFacets
2862@@ -1870,14 +1787,6 @@
2863 <browser:page
2864 for="lp.registry.interfaces.distribution.IDistribution"
2865 class="lp.registry.browser.distribution.DistributionView"
2866- facet="bounties"
2867- layer="canonical.launchpad.layers.PageTestLayer"
2868- name="+bounties"
2869- permission="zope.Public"
2870- template="../templates/related-bounties.pt"/>
2871- <browser:page
2872- for="lp.registry.interfaces.distribution.IDistribution"
2873- class="lp.registry.browser.distribution.DistributionView"
2874 permission="zope.Public"
2875 name="+series-and-milestones"
2876 facet="overview"
2877@@ -1905,9 +1814,6 @@
2878 facet="overview"
2879 template="../templates/object-milestones.pt"/>
2880 <browser:page
2881- name="+portlet-bounties"
2882- template="../templates/object-portlet-bounties.pt"/>
2883- <browser:page
2884 name="+portlet-aboutcve"
2885 template="../templates/portlet-aboutcve.pt"/>
2886 </browser:pages>
2887@@ -1959,30 +1865,6 @@
2888 facet="overview"
2889 permission="launchpad.Edit"
2890 template="../../app/templates/generic-edit.pt"/>
2891- <browser:addform
2892- name="+linkbounty"
2893- for="lp.registry.interfaces.distribution.IDistribution"
2894- schema="canonical.launchpad.interfaces.IDistributionBounty"
2895- class="canonical.launchpad.browser.bounty.BountyLinkView"
2896- facet="bounties"
2897- fields="distribution bounty"
2898- keyword_arguments="distribution bounty"
2899- permission="launchpad.AnyPerson"
2900- template="../templates/bounty-link.pt">
2901- <browser:widget
2902- field="distribution"
2903- class="canonical.widgets.ContextWidget"/>
2904- </browser:addform>
2905- <browser:addform
2906- name="+addbounty"
2907- for="lp.registry.interfaces.distribution.IDistribution"
2908- schema="canonical.launchpad.interfaces.IBounty"
2909- label="Register a bounty"
2910- fields="name title summary usdvalue difficulty description"
2911- class="canonical.launchpad.browser.BountyAddView"
2912- facet="bounties"
2913- permission="launchpad.AnyPerson"
2914- template="../../../canonical/launchpad/templates/bounty-add.pt"/>
2915 <browser:defaultView
2916 for="lp.registry.interfaces.distribution.IDistributionSet"
2917 name="+index"/>
2918@@ -2018,7 +1900,6 @@
2919 template="../../app/templates/generic-edit.pt"/>
2920 <browser:menus
2921 classes="
2922- DistributionBountiesMenu
2923 DistributionBugsMenu
2924 DistributionFacets
2925 DistributionMirrorsNavigationMenu
2926
2927=== modified file 'lib/lp/registry/browser/distribution.py'
2928--- lib/lp/registry/browser/distribution.py 2009-08-27 10:48:44 +0000
2929+++ lib/lp/registry/browser/distribution.py 2009-08-28 06:38:41 +0000
2930@@ -452,21 +452,6 @@
2931 return Link('+subscribe', text)
2932
2933
2934-class DistributionBountiesMenu(ApplicationMenu):
2935-
2936- usedfor = IDistribution
2937- facet = 'bounties'
2938- links = ['new', 'link']
2939-
2940- def new(self):
2941- text = 'Register new bounty'
2942- return Link('+addbounty', text, icon='add')
2943-
2944- def link(self):
2945- text = 'Link existing bounty'
2946- return Link('+linkbounty', text, icon='edit')
2947-
2948-
2949 class DistributionSpecificationsMenu(ApplicationMenu):
2950
2951 usedfor = IDistribution
2952
2953=== modified file 'lib/lp/registry/browser/person.py'
2954--- lib/lp/registry/browser/person.py 2009-08-24 20:28:33 +0000
2955+++ lib/lp/registry/browser/person.py 2009-08-27 07:05:16 +0000
2956@@ -690,13 +690,6 @@
2957 self.context.displayname)
2958 return Link('', text, summary)
2959
2960- def bounties(self):
2961- text = 'Bounties'
2962- browsername = self.context.displayname
2963- summary = (
2964- 'Bounty offers that %s is involved with' % browsername)
2965- return Link('+bounties', text, summary)
2966-
2967 def branches(self):
2968 text = 'Code'
2969 summary = ('Bazaar Branches and revisions registered and authored '
2970@@ -2707,12 +2700,6 @@
2971 assert self.context.isTeam()
2972 return bool(self.openpolls) or bool(self.notyetopenedpolls)
2973
2974- def no_bounties(self):
2975- return not (self.context.ownedBounties or
2976- self.context.reviewerBounties or
2977- self.context.subscribedBounties or
2978- self.context.claimedBounties)
2979-
2980 def userIsOwner(self):
2981 """Return True if the user is the owner of this Team."""
2982 if self.user is None:
2983
2984=== modified file 'lib/lp/registry/browser/product.py'
2985--- lib/lp/registry/browser/product.py 2009-08-28 00:58:44 +0000
2986+++ lib/lp/registry/browser/product.py 2009-08-28 06:38:41 +0000
2987@@ -10,11 +10,9 @@
2988 'ProductAddView',
2989 'ProductAddViewBase',
2990 'ProductAdminView',
2991- 'ProductBountiesMenu',
2992 'ProductBrandingView',
2993 'ProductBreadcrumb',
2994 'ProductBugsMenu',
2995- 'ProductChangeTranslatorsView',
2996 'ProductDownloadFileMixin',
2997 'ProductDownloadFilesView',
2998 'ProductEditNavigationMenu',
2999@@ -274,12 +272,6 @@
3000 summary = 'Bugs reported about %s' % self.context.displayname
3001 return Link('', text, summary)
3002
3003- def bounties(self):
3004- target = '+bounties'
3005- text = 'Bounties'
3006- summary = 'Bounties related to %s' % self.context.displayname
3007- return Link(target, text, summary)
3008-
3009 def branches(self):
3010 text = 'Code'
3011 summary = 'Branches for %s' % self.context.displayname
3012@@ -516,21 +508,6 @@
3013 return Link('+addspec', text, summary, icon='add')
3014
3015
3016-class ProductBountiesMenu(ApplicationMenu):
3017-
3018- usedfor = IProduct
3019- facet = 'bounties'
3020- links = ['new', 'link']
3021-
3022- def new(self):
3023- text = 'Register bounty'
3024- return Link('+addbounty', text, icon='add')
3025-
3026- def link(self):
3027- text = 'Link existing bounty'
3028- return Link('+linkbounty', text, icon='edit')
3029-
3030-
3031 def _sort_distros(a, b):
3032 """Put Ubuntu first, otherwise in alpha order."""
3033 if a['name'] == 'ubuntu':
3034
3035=== modified file 'lib/lp/registry/browser/project.py'
3036--- lib/lp/registry/browser/project.py 2009-08-26 17:20:31 +0000
3037+++ lib/lp/registry/browser/project.py 2009-08-28 06:38:41 +0000
3038@@ -11,7 +11,6 @@
3039 'ProjectAddQuestionView',
3040 'ProjectAddView',
3041 'ProjectAnswersMenu',
3042- 'ProjectBountiesMenu',
3043 'ProjectBrandingView',
3044 'ProjectBreadcrumb',
3045 'ProjectBugsMenu',
3046@@ -285,21 +284,6 @@
3047 links = ('branding', 'reassign', 'driver', 'administer')
3048
3049
3050-class ProjectBountiesMenu(ApplicationMenu):
3051-
3052- usedfor = IProject
3053- facet = 'bounties'
3054- links = ['new', 'link']
3055-
3056- def new(self):
3057- text = 'Register a bounty'
3058- return Link('+addbounty', text, icon='add')
3059-
3060- def link(self):
3061- text = 'Link existing bounty'
3062- return Link('+linkbounty', text, icon='edit')
3063-
3064-
3065 class ProjectSpecificationsMenu(ApplicationMenu):
3066
3067 usedfor = IProject
3068
3069=== modified file 'lib/lp/registry/configure.zcml'
3070--- lib/lp/registry/configure.zcml 2009-08-25 06:25:40 +0000
3071+++ lib/lp/registry/configure.zcml 2009-08-28 06:16:06 +0000
3072@@ -321,9 +321,6 @@
3073 factory="lp.registry.browser.project.ProjectSetBreadcrumb"
3074 permission="zope.Public"/>
3075
3076- <!-- The bounty system is kept maintained but not available for users.
3077- This is achieved by putting it on the PageTestLayer. -->
3078-
3079 <facet
3080 facet="answers"/>
3081
3082@@ -824,10 +821,6 @@
3083 set_schema="lp.registry.interfaces.person.IHasStanding"/>
3084 </class>
3085
3086- <!-- The bounty system is kept maintained but not available for users.
3087- This is achieved by putting it on the PageTestLayer. -->
3088-
3089-
3090 <!-- Adding SSH keys is the only possibly harmful thing that can be done
3091 without the user's password, so we use a special permission here to make
3092 sure only the user (and not launchpad admins) will be able to edit her own
3093@@ -1205,10 +1198,6 @@
3094 ProductBugsMenu undeclared until layout bug is fixed -->
3095
3096
3097- <!-- The bounty system is kept maintained but not available for users.
3098- This is achieved by putting it on the PageTestLayer. -->
3099-
3100-
3101 <!-- ProductSet-->
3102
3103 <class
3104@@ -1228,7 +1217,6 @@
3105 featuredTranslatables
3106 count_all
3107 count_translatables
3108- count_bounties
3109 count_buggy
3110 count_featureful
3111 count_reviewed
3112@@ -1452,10 +1440,6 @@
3113 factory="lp.registry.browser.distribution.DistributionSetBreadcrumb"
3114 permission="zope.Public"/>
3115
3116- <!-- The bounty system is kept maintained but not available for users.
3117- This is achieved by putting it on the PageTestLayer. -->
3118-
3119-
3120 <!-- DistributionSet -->
3121
3122 <class
3123
3124=== modified file 'lib/lp/registry/interfaces/distribution.py'
3125--- lib/lp/registry/interfaces/distribution.py 2009-08-27 19:43:59 +0000
3126+++ lib/lp/registry/interfaces/distribution.py 2009-08-28 06:38:41 +0000
3127@@ -209,7 +209,6 @@
3128 exported_as="series")
3129 architectures = List(
3130 title=_("DistroArchSeries inside this Distribution"))
3131- bounties = Attribute(_("The bounties that are related to this distro."))
3132 bugCounter = Attribute("The distro bug counter")
3133 uploaders = Attribute(_(
3134 "ArchivePermission records for uploaders with rights to upload to "
3135@@ -345,11 +344,6 @@
3136 and the value is a `IDistributionSourcePackageRelease`.
3137 """
3138
3139- def ensureRelatedBounty(bounty):
3140- """Ensure that the bounty is linked to this distribution. Return
3141- None.
3142- """
3143-
3144 def getDistroSeriesAndPocket(distroseriesname):
3145 """Return a (distroseries,pocket) tuple which is the given textual
3146 distroseriesname in this distribution."""
3147
3148=== modified file 'lib/lp/registry/interfaces/person.py'
3149--- lib/lp/registry/interfaces/person.py 2009-08-20 08:13:15 +0000
3150+++ lib/lp/registry/interfaces/person.py 2009-08-27 07:05:16 +0000
3151@@ -592,12 +592,6 @@
3152 # which contains valid people but not teams, and we don't really need one
3153 # apart from here.
3154 registrant = Attribute('The user who created this profile.')
3155- # bounty relations
3156- ownedBounties = Attribute('Bounties issued by this person.')
3157- reviewerBounties = Attribute('Bounties reviewed by this person.')
3158- claimedBounties = Attribute('Bounties claimed by this person.')
3159- subscribedBounties = Attribute(
3160- 'Bounties to which this person subscribes.')
3161
3162 oauth_access_tokens = Attribute(_("Non-expired access tokens"))
3163
3164
3165=== modified file 'lib/lp/registry/interfaces/product.py'
3166--- lib/lp/registry/interfaces/product.py 2009-08-25 10:51:33 +0000
3167+++ lib/lp/registry/interfaces/product.py 2009-08-28 06:16:06 +0000
3168@@ -577,8 +577,6 @@
3169 readonly=True,
3170 value_type=Reference(schema=IProductRelease)))
3171
3172- bounties = Attribute(_("The bounties that are related to this product."))
3173-
3174 translatable_packages = Attribute(
3175 "A list of the source packages for this product that can be "
3176 "translated sorted by distroseries.name and sourcepackage.name.")
3177@@ -671,10 +669,6 @@
3178 def packagedInDistros():
3179 """Returns the distributions this product has been packaged in."""
3180
3181- def ensureRelatedBounty(bounty):
3182- """Ensure that the bounty is linked to this product. Return None.
3183- """
3184-
3185 def getCustomLanguageCode(language_code):
3186 """Look up `ICustomLanguageCode` for `language_code`, if any.
3187
3188@@ -886,10 +880,6 @@
3189 """Return a count of the number of products that have
3190 upstream-oriented translations configured in Rosetta."""
3191
3192- def count_bounties():
3193- """Return a number of products that have bounties registered in the
3194- Launchpad for them."""
3195-
3196 def count_buggy():
3197 """Return the number of products that have bugs associated with them
3198 in Launchpad."""
3199
3200=== modified file 'lib/lp/registry/interfaces/project.py'
3201--- lib/lp/registry/interfaces/project.py 2009-08-24 03:59:31 +0000
3202+++ lib/lp/registry/interfaces/project.py 2009-08-28 06:16:06 +0000
3203@@ -236,9 +236,6 @@
3204 description=_("Whether or not this project group has been "
3205 "reviewed.")))
3206
3207- bounties = Attribute(
3208- _("The bounties that are related to this project group."))
3209-
3210 bugtracker = exported(
3211 Choice(title=_('Bug Tracker'), required=False,
3212 vocabulary='BugTracker',
3213@@ -267,12 +264,6 @@
3214 def getProduct(name):
3215 """Get a product with name `name`."""
3216
3217- def ensureRelatedBounty(bounty):
3218- """Ensure that the bounty is linked to this project group.
3219-
3220- Return None.
3221- """
3222-
3223 def translatables():
3224 """Return an iterator over products that have resources translatables.
3225
3226
3227=== modified file 'lib/lp/registry/model/distribution.py'
3228--- lib/lp/registry/model/distribution.py 2009-08-27 19:43:59 +0000
3229+++ lib/lp/registry/model/distribution.py 2009-08-28 06:38:41 +0000
3230@@ -38,7 +38,6 @@
3231 from lp.bugs.model.bugtask import BugTask
3232 from lp.soyuz.model.build import Build
3233 from lp.translations.model.customlanguagecode import CustomLanguageCode
3234-from canonical.launchpad.database.distributionbounty import DistributionBounty
3235 from lp.registry.model.distributionmirror import DistributionMirror
3236 from lp.registry.model.distributionsourcepackage import (
3237 DistributionSourcePackage)
3238@@ -172,9 +171,6 @@
3239 schema=TranslationPermission, default=TranslationPermission.OPEN)
3240 lucilleconfig = StringCol(
3241 dbName='lucilleconfig', notNull=False, default=None)
3242- bounties = SQLRelatedJoin(
3243- 'Bounty', joinColumn='distribution', otherColumn='bounty',
3244- intermediateTable='DistributionBounty')
3245 official_answers = BoolCol(dbName='official_answers', notNull=True,
3246 default=False)
3247 official_blueprints = BoolCol(dbName='official_blueprints', notNull=True,
3248@@ -731,13 +727,6 @@
3249 search_text=search_text, owner=owner, sort=sort,
3250 distribution=self).getResults()
3251
3252- def ensureRelatedBounty(self, bounty):
3253- """See `IDistribution`."""
3254- for curr_bounty in self.bounties:
3255- if bounty.id == curr_bounty.id:
3256- return None
3257- DistributionBounty(distribution=self, bounty=bounty)
3258-
3259 def getDistroSeriesAndPocket(self, distroseries_name):
3260 """See `IDistribution`."""
3261 from lp.archivepublisher.publishing import suffixpocket
3262
3263=== modified file 'lib/lp/registry/model/person.py'
3264--- lib/lp/registry/model/person.py 2009-08-19 14:25:32 +0000
3265+++ lib/lp/registry/model/person.py 2009-08-31 00:27:24 +0000
3266@@ -383,18 +383,6 @@
3267 hide_email_addresses = BoolCol(notNull=True, default=False)
3268 verbose_bugnotifications = BoolCol(notNull=True, default=True)
3269
3270- ownedBounties = SQLMultipleJoin('Bounty', joinColumn='owner',
3271- orderBy='id')
3272- reviewerBounties = SQLMultipleJoin('Bounty', joinColumn='reviewer',
3273- orderBy='id')
3274- # XXX: matsubara 2006-03-06 bug=33935:
3275- # Is this really needed? There's no attribute 'claimant' in the Bounty
3276- # database class or interface, but the column exists in the database.
3277- claimedBounties = SQLMultipleJoin('Bounty', joinColumn='claimant',
3278- orderBy='id')
3279- subscribedBounties = SQLRelatedJoin('Bounty', joinColumn='person',
3280- otherColumn='bounty', intermediateTable='BountySubscription',
3281- orderBy='id')
3282 signedcocs = SQLMultipleJoin('SignedCodeOfConduct', joinColumn='owner')
3283 ircnicknames = SQLMultipleJoin('IrcID', joinColumn='person')
3284 jabberids = SQLMultipleJoin('JabberID', joinColumn='person')
3285@@ -1736,7 +1724,6 @@
3286
3287 # Nuke all subscriptions of this person.
3288 removals = [
3289- ('BountySubscription', 'person'),
3290 ('BranchSubscription', 'person'),
3291 ('BugSubscription', 'person'),
3292 ('QuestionSubscription', 'person'),
3293@@ -2872,6 +2859,11 @@
3294 ''' % vars())
3295
3296 def _mergeBountySubscriptions(self, cur, from_id, to_id):
3297+ # XXX: JonathanLange 2009-08-31: Even though all of the other bounty
3298+ # code has been removed from Launchpad, the merging code has to stay
3299+ # until the tables themselves are removed. Otherwise, the person
3300+ # merging code raises consistency errors (and rightly so).
3301+ #
3302 # Update only the BountySubscriptions that will not conflict.
3303 cur.execute('''
3304 UPDATE BountySubscription
3305@@ -3303,7 +3295,7 @@
3306
3307 # These rows are in a UNIQUE index, and we can only move them
3308 # to the new Person if there is not already an entry. eg. if
3309- # the destination and source persons are both subscribed to a bounty,
3310+ # the destination and source persons are both subscribed to a bug,
3311 # we cannot change the source persons subscription. We just leave them
3312 # as noise for the time being.
3313
3314@@ -3333,12 +3325,12 @@
3315 self._mergeBranchSubscription(cur, from_id, to_id)
3316 skip.append(('branchsubscription', 'person'))
3317
3318+ self._mergeBugAffectsPerson(cur, from_id, to_id)
3319+ skip.append(('bugaffectsperson', 'person'))
3320+
3321 self._mergeBountySubscriptions(cur, from_id, to_id)
3322 skip.append(('bountysubscription', 'person'))
3323
3324- self._mergeBugAffectsPerson(cur, from_id, to_id)
3325- skip.append(('bugaffectsperson', 'person'))
3326-
3327 self._mergeAnswerContact(cur, from_id, to_id)
3328 skip.append(('answercontact', 'person'))
3329
3330
3331=== modified file 'lib/lp/registry/model/product.py'
3332--- lib/lp/registry/model/product.py 2009-08-24 03:18:41 +0000
3333+++ lib/lp/registry/model/product.py 2009-08-28 06:16:06 +0000
3334@@ -60,7 +60,6 @@
3335 from canonical.launchpad.database.packaging import Packaging
3336 from lp.registry.model.pillar import HasAliasMixin
3337 from lp.registry.model.person import Person
3338-from canonical.launchpad.database.productbounty import ProductBounty
3339 from lp.registry.model.productlicense import ProductLicense
3340 from lp.registry.model.productrelease import ProductRelease
3341 from lp.registry.model.productseries import ProductSeries
3342@@ -557,10 +556,6 @@
3343 drivers.add(self.owner)
3344 return sorted(drivers, key=lambda driver: driver.displayname)
3345
3346- bounties = SQLRelatedJoin(
3347- 'Bounty', joinColumn='product', otherColumn='bounty',
3348- intermediateTable='ProductBounty')
3349-
3350 @property
3351 def sourcepackages(self):
3352 from lp.registry.model.sourcepackage import SourcePackage
3353@@ -937,14 +932,6 @@
3354 DistroSeries.distributionID == Distribution.id
3355 ).config(distinct=True).order_by(Distribution.name)
3356
3357- def ensureRelatedBounty(self, bounty):
3358- """See `IProduct`."""
3359- for curr_bounty in self.bounties:
3360- if bounty.id == curr_bounty.id:
3361- return None
3362- ProductBounty(product=self, bounty=bounty)
3363- return None
3364-
3365 def setBugSupervisor(self, bug_supervisor, user):
3366 """See `IHasBugSupervisor`."""
3367 self.bug_supervisor = bug_supervisor
3368
3369=== modified file 'lib/lp/registry/model/project.py'
3370--- lib/lp/registry/model/project.py 2009-08-24 03:59:31 +0000
3371+++ lib/lp/registry/model/project.py 2009-08-28 06:16:06 +0000
3372@@ -57,7 +57,6 @@
3373 from lp.registry.model.pillar import HasAliasMixin
3374 from lp.registry.model.product import Product
3375 from lp.registry.model.productseries import ProductSeries
3376-from canonical.launchpad.database.projectbounty import ProjectBounty
3377 from lp.blueprints.model.specification import (
3378 HasSpecificationsMixin, Specification)
3379 from lp.blueprints.model.sprint import HasSprintsMixin
3380@@ -125,10 +124,6 @@
3381
3382 # convenient joins
3383
3384- bounties = SQLRelatedJoin('Bounty', joinColumn='project',
3385- otherColumn='bounty',
3386- intermediateTable='ProjectBounty')
3387-
3388 @property
3389 def products(self):
3390 return Product.selectBy(project=self, active=True, orderBy='name')
3391@@ -136,14 +131,6 @@
3392 def getProduct(self, name):
3393 return Product.selectOneBy(project=self, name=name)
3394
3395- def ensureRelatedBounty(self, bounty):
3396- """See `IProject`."""
3397- for curr_bounty in self.bounties:
3398- if bounty.id == curr_bounty.id:
3399- return None
3400- ProjectBounty(project=self, bounty=bounty)
3401- return None
3402-
3403 @property
3404 def drivers(self):
3405 """See `IHasDrivers`."""
3406@@ -497,7 +484,7 @@
3407 """Search through the Registry database for projects that match the
3408 query terms. text is a piece of text in the title / summary /
3409 description fields of project (and possibly product). soyuz,
3410- bounties, bazaar, malone etc are hints as to whether the search
3411+ bazaar, malone etc are hints as to whether the search
3412 should be limited to projects that are active in those Launchpad
3413 applications.
3414 """
3415
3416=== removed file 'lib/lp/registry/templates/bounty-link.pt'
3417--- lib/lp/registry/templates/bounty-link.pt 2009-07-17 17:59:07 +0000
3418+++ lib/lp/registry/templates/bounty-link.pt 1970-01-01 00:00:00 +0000
3419@@ -1,35 +0,0 @@
3420-<html
3421- xmlns="http://www.w3.org/1999/xhtml"
3422- xmlns:tal="http://xml.zope.org/namespaces/tal"
3423- xmlns:metal="http://xml.zope.org/namespaces/metal"
3424- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3425- xml:lang="en"
3426- lang="en"
3427- dir="ltr"
3428- metal:use-macro="context/@@main_template/master"
3429- i18n:domain="launchpad"
3430->
3431- <body>
3432-
3433- <metal:portlets fill-slot="portlets">
3434- <div tal:replace="structure context/@@+portlet-bounties" />
3435- </metal:portlets>
3436-
3437-<div metal:fill-slot="main">
3438-
3439- <h1>Link a bounty</h1>
3440-
3441- <div metal:use-macro="context/@@launchpad_addform/addform">
3442-
3443- <p metal:fill-slot="extra_info">
3444- A bounty that has already been created can be associated with
3445- <span tal:replace="context/displayname">Ubuntu</span>.
3446- </p>
3447-
3448- </div>
3449-
3450-</div>
3451-
3452-</body>
3453-</html>
3454-<!-- 1-0 done -->
3455
3456=== removed file 'lib/lp/registry/templates/object-portlet-bounties.pt'
3457--- lib/lp/registry/templates/object-portlet-bounties.pt 2009-07-17 17:59:07 +0000
3458+++ lib/lp/registry/templates/object-portlet-bounties.pt 1970-01-01 00:00:00 +0000
3459@@ -1,28 +0,0 @@
3460-<div
3461- xmlns:tal="http://xml.zope.org/namespaces/tal"
3462- xmlns:metal="http://xml.zope.org/namespaces/metal"
3463- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3464- class="portlet" id="portlet-bounties"
3465- tal:condition="context/bounties">
3466-
3467- <h2><span tal:replace="context/displayname">Ubuntu</span> bounties</h2>
3468-
3469- <div class="portletBody portletContent">
3470-
3471- <ul>
3472- <li class="bounty" tal:repeat="bounty context/bounties">
3473- <a tal:content="bounty/title"
3474- tal:attributes="title bounty/summary;
3475- href bounty/fmt:url">bounty title</a>
3476- </li>
3477- </ul>
3478-
3479- <ul><li class="info">
3480- <a href="+bounties"
3481- title="More bounties...">
3482- More...
3483- </a>
3484- </li></ul>
3485-
3486- </div>
3487-</div>
3488
3489=== removed file 'lib/lp/registry/templates/person-bounties.pt'
3490--- lib/lp/registry/templates/person-bounties.pt 2009-07-17 17:59:07 +0000
3491+++ lib/lp/registry/templates/person-bounties.pt 1970-01-01 00:00:00 +0000
3492@@ -1,149 +0,0 @@
3493-<html
3494- xmlns="http://www.w3.org/1999/xhtml"
3495- xmlns:tal="http://xml.zope.org/namespaces/tal"
3496- xmlns:metal="http://xml.zope.org/namespaces/metal"
3497- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3498- xml:lang="en"
3499- lang="en"
3500- dir="ltr"
3501- metal:use-macro="context/@@main_template/master"
3502- i18n:domain="launchpad"
3503->
3504- <body>
3505- <metal:heading fill-slot="pageheading">
3506- <h1>Bounties issued and claimed</h1>
3507- </metal:heading>
3508-
3509-<metal:leftportlets fill-slot="portlets_one">
3510-</metal:leftportlets>
3511-
3512-<div metal:fill-slot="main">
3513-
3514- <p>
3515- These are the bounties related to
3516- <tal:person replace="context/displayname">Foo Bar</tal:person>.
3517- </p>
3518-
3519- <tal:block condition="view/no_bounties">
3520- <p>No bounties associated with <span
3521- tal:replace="context/displayname">Mark Shuttleworth</span>.</p>
3522- </tal:block>
3523-
3524- <tal:block condition="context/ownedBounties">
3525- <h2>Bounties issued</h2>
3526-
3527- <table width="100%" class="listing sortable" id="issued">
3528- <thead>
3529- <tr>
3530- <th>Date Created</th>
3531- <th>Title</th>
3532- <th>USD Value<sup>*</sup></th>
3533- </tr>
3534- </thead>
3535- <tbody>
3536- <tr tal:repeat="bounty context/ownedBounties">
3537- <td tal:content="bounty/datecreated/fmt:date">
3538- date
3539- </td>
3540- <td><a tal:content="bounty/title/fmt:shorten/45"
3541- tal:attributes="href bounty/fmt:url">title</a>
3542- </td>
3543- <td tal:content="bounty/usdvalue">usdvalue</td>
3544- </tr>
3545- </tbody>
3546- </table>
3547- </tal:block>
3548-
3549- <tal:block condition="context/claimedBounties">
3550- <h2>Bounties claimed</h2>
3551-
3552- <table width="100%" class="listing sortable" id="claimed">
3553- <thead>
3554- <tr>
3555- <th>Date Created</th>
3556- <th>Title</th>
3557- <th>USD Value<sup>*</sup></th>
3558- </tr>
3559- </thead>
3560- <tbody>
3561- <tr tal:repeat="bounty context/claimedBounties">
3562- <td tal:content="bounty/datecreated/fmt:date">
3563- date
3564- </td>
3565- <td><a tal:content="bounty/title/fmt:shorten/45"
3566- tal:attributes="href bounty/fmt:url">title</a>
3567- </td>
3568- <td tal:content="bounty/usdvalue">usdvalue</td>
3569- </tr>
3570- </tbody>
3571- </table>
3572- </tal:block>
3573-
3574- <tal:block condition="context/reviewerBounties">
3575- <h2>Bounties reviewed</h2>
3576-
3577- <table width="100%" class="listing sortable" id="reviewer">
3578- <thead>
3579- <tr>
3580- <th>Date Created</th>
3581- <th>Title</th>
3582- <th>USD Value<sup>*</sup></th>
3583- </tr>
3584- </thead>
3585- <tbody>
3586- <tr tal:repeat="bounty context/reviewerBounties">
3587- <td tal:content="bounty/datecreated/fmt:date">
3588- date
3589- </td>
3590- <td><a tal:content="bounty/title/fmt:shorten/45"
3591- tal:attributes="href bounty/fmt:url">title</a>
3592- </td>
3593- <td tal:content="bounty/usdvalue">usdvalue</td>
3594- </tr>
3595- </tbody>
3596- </table>
3597- </tal:block>
3598-
3599- <tal:block condition="context/subscribedBounties">
3600- <h2>Bounties subscribed</h2>
3601-
3602- <table width="100%" class="listing sortable" id="subscribed">
3603- <thead>
3604- <tr>
3605- <th>Date Created</th>
3606- <th>Title</th>
3607- <th>USD Value<sup>*</sup></th>
3608- </tr>
3609- </thead>
3610- <tbody>
3611- <tr tal:repeat="bounty context/subscribedBounties">
3612- <td tal:content="bounty/datecreated/fmt:date">
3613- date
3614- </td>
3615- <td><a tal:content="bounty/title/fmt:shorten/45"
3616- tal:attributes="href bounty/fmt:url">title</a>
3617- </td>
3618- <td tal:content="bounty/usdvalue">usdvalue</td>
3619- </tr>
3620- </tbody>
3621- </table>
3622- </tal:block>
3623-
3624- <tal:block condition="not: view/no_bounties">
3625- <p><sup>*</sup> A bounty may include contributions in several
3626- currencies. Values are estimates of the bounty value in US Dollars
3627- based on recent exchange rates.</p>
3628-
3629- <p>You can subscribe to
3630- a bounty to receive email updates of changes in status of the bounty, or
3631- to have the bounty show up on your personalised Launchpad overview
3632- page.</p>
3633- </tal:block>
3634-
3635- <p>For more information on bounties in the Launchpad, see the Launchpad
3636- <a href="/bounties">bounty tracker</a>.</p>
3637-
3638-</div>
3639-
3640-</body>
3641-</html>
3642
3643=== removed file 'lib/lp/registry/templates/related-bounties.pt'
3644--- lib/lp/registry/templates/related-bounties.pt 2009-07-17 17:59:07 +0000
3645+++ lib/lp/registry/templates/related-bounties.pt 1970-01-01 00:00:00 +0000
3646@@ -1,78 +0,0 @@
3647-<html
3648- xmlns="http://www.w3.org/1999/xhtml"
3649- xmlns:tal="http://xml.zope.org/namespaces/tal"
3650- xmlns:metal="http://xml.zope.org/namespaces/metal"
3651- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3652- xml:lang="en"
3653- lang="en"
3654- dir="ltr"
3655- metal:use-macro="context/@@main_template/master"
3656- i18n:domain="launchpad"
3657->
3658-
3659-<body>
3660-
3661-<tal:x replace="nothing">
3662-<!-- NB maintainer, this page is used to show bounties that are related to
3663-project, products *and* distributions. Make sure that your changes will work
3664-with all of these context objects.-->
3665-</tal:x>
3666-
3667-<metal:leftportlets fill-slot="portlets" />
3668-
3669-<div metal:fill-slot="main">
3670-
3671- <h1>Bounties related to <tal:thing replace="context/displayname" /></h1>
3672-
3673- <tal:block condition="context/bounties">
3674-
3675- <table width="100%" class="listing sortable" id="bountylist">
3676- <thead>
3677- <tr>
3678- <th>Date Created</th>
3679- <th>Title</th>
3680- <th>USD Value<sup>*</sup></th>
3681- <th>Difficulty</th>
3682- </tr>
3683- </thead>
3684- <tbody>
3685- <tr tal:repeat="bounty context/bounties">
3686- <td tal:content="bounty/datecreated/fmt:date">date</td>
3687- <td><a tal:content="bounty/title/fmt:shorten/45"
3688- tal:attributes="href bounty/fmt:url">title</a></td>
3689- <td tal:content="bounty/usdvalue">usdvalue</td>
3690- <td tal:content="bounty/difficulty/title">difficulty</td>
3691- </tr>
3692- </tbody>
3693- </table>
3694-
3695- <p><sup>*</sup> A bounty may include contributions in several currencies,
3696- this is an estimate of the bounty value in US Dollars based on recent
3697- exchange rates.</p>
3698-
3699- <p>Click on a bounty for further information. You can subscribe to
3700- a bounty to receive email updates of changes in status of the bounty, or
3701- to have the bounty show up on your personalised Launchpad overview
3702- page.</p>
3703-
3704- </tal:block>
3705-
3706- <tal:block condition="not: context/bounties">
3707-
3708- <p>
3709- No bounties are currently registered for
3710- <span tal:replace="context/displayname">Mozilla</span>.
3711- </p>
3712-
3713- <p>
3714- Know of a bounty that should be listed here?
3715- <a href="+addbounty">Register it in Launchpad</a>,
3716- so it&rsquo;s easier for people to find.
3717- </p>
3718-
3719- </tal:block>
3720-
3721-</div>
3722-
3723-</body>
3724-</html>
3725
3726=== removed file 'lib/lp/soyuz/stories/soyuz/xx-distribution-bounties.txt'
3727--- lib/lp/soyuz/stories/soyuz/xx-distribution-bounties.txt 2009-06-12 16:36:02 +0000
3728+++ lib/lp/soyuz/stories/soyuz/xx-distribution-bounties.txt 1970-01-01 00:00:00 +0000
3729@@ -1,9 +0,0 @@
3730-Check if the distribution bounties is not broken.
3731-
3732-# >>> browser.open("http://localhost/distros/ubuntu")
3733-# >>> browser.getLink("Bounties").click()
3734-# >>> browser.url
3735-# 'http://localhost/distros/ubuntu/+bounties'
3736-# >>> browser.contents
3737-# '...Bounties related to Ubuntu...'
3738-
3739
3740=== modified file 'lib/lp/translations/browser/potemplate.py'
3741--- lib/lp/translations/browser/potemplate.py 2009-07-17 00:26:05 +0000
3742+++ lib/lp/translations/browser/potemplate.py 2009-08-27 07:05:16 +0000
3743@@ -139,11 +139,6 @@
3744 specifications_link.target = self.target
3745 return specifications_link
3746
3747- def bounties(self):
3748- bounties_link = self.target_facets.bounties()
3749- bounties_link.target = self.target
3750- return bounties_link
3751-
3752 def calendar(self):
3753 calendar_link = self.target_facets.calendar()
3754 calendar_link.target = self.target
3755
3756=== modified file 'lib/sqlobject/__init__.py'
3757--- lib/sqlobject/__init__.py 2009-06-25 05:59:58 +0000
3758+++ lib/sqlobject/__init__.py 2009-08-27 07:05:16 +0000
3759@@ -17,10 +17,6 @@
3760 sys.modules['sqlobject.sqlbuilder'] = sys.modules['sqlobject']
3761 del sys
3762
3763-# This one is wrong, but CurrencyCol is only used in the bounty
3764-# tracker so it isn't important.
3765-CurrencyCol = FloatCol
3766-
3767 _sqlStringReplace = [
3768 ('\\', '\\\\'),
3769 ("'", "''"),
3770
3771=== modified file 'scripts/close-account.py'
3772--- scripts/close-account.py 2009-06-30 16:56:07 +0000
3773+++ scripts/close-account.py 2009-08-27 07:05:16 +0000
3774@@ -112,7 +112,6 @@
3775 ('GpgKey', 'owner'),
3776
3777 # Subscriptions
3778- ('BountySubscription', 'person'),
3779 ('BranchSubscription', 'person'),
3780 ('BugSubscription', 'person'),
3781 ('QuestionSubscription', 'person'),