Merge lp:~jcsackett/launchpad/convert-sql-627631 into lp:launchpad/db-devel

Proposed by j.c.sackett
Status: Merged
Approved by: j.c.sackett
Approved revision: no longer in the source branch.
Merged at revision: 9975
Proposed branch: lp:~jcsackett/launchpad/convert-sql-627631
Merge into: lp:launchpad/db-devel
Prerequisite: lp:~jcsackett/launchpad/migrate-official-bool-data-627631
Diff against target: 454 lines (+122/-74)
16 files modified
database/sampledata/current-dev.sql (+1/-1)
database/sampledata/current.sql (+4/-4)
database/schema/patch-2208-99-0.sql (+0/-36)
lib/canonical/launchpad/database/launchpadstatistic.py (+2/-1)
lib/lp/answers/doc/questionsets.txt (+18/-2)
lib/lp/answers/model/question.py (+7/-4)
lib/lp/answers/stories/questions-index.txt (+15/-0)
lib/lp/registry/doc/product.txt (+10/-0)
lib/lp/registry/doc/projectgroup.txt (+11/-0)
lib/lp/registry/model/product.py (+5/-4)
lib/lp/registry/model/projectgroup.py (+2/-7)
lib/lp/translations/doc/translationsoverview.txt (+18/-0)
lib/lp/translations/model/translationsoverview.py (+11/-8)
lib/lp/translations/model/translationsperson.py (+0/-3)
lib/lp/translations/scripts/translations_to_branch.py (+0/-3)
lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt (+18/-1)
To merge this branch: bzr merge lp:~jcsackett/launchpad/convert-sql-627631
Reviewer Review Type Date Requested Status
Edwin Grubbs (community) code Approve
Review via email: mp+40021@code.launchpad.net

Commit message

[r=edwin-grubbs][ui=none][bug=627631][incr] Updates queries in model code to use the EnumCol corresponding to the usage_enum values, rather than using the official_* BoolCol

Description of the change

Summary
=======

There's an ongoing effort to phase out the official_* booleans which indicate how a product/distribution uses the various service on Launchpad. While previous branches cleaned up a lot of model code, they didn't address queries made to the db that used the Boolean columns.

This branch rectifies that by cleaning up those sections of code to reference the EnumCol, so that we can (if we choose to) drop the official_* code completely.

Proposed fix
============

Replace locations making SqlObject or Storm queries and update them to use the EnumCol and ServiceUsage DBItem.

Preimplementation talk
======================

Spoke with Curtis Hovey (several weeks ago).

Implementation details
======================

As in proposed.

Tests
=====

Because of the number of things that end up effected, most modules need testing. Testing registry alone is a reasonable proxy, but not ideal.

bin/test -m lp.registry.tests

OR

bin/test -m lp.registry
bin/test -m lp.translations
bin/test -m lp.answers
bin/test -t update_stats

Demo & QA
=========

Operation of the various main pages (e.g. +translations, +questions) for a product or distribution shouldn't fail in anyway or appear different; b/c of prior work this change should be invisible.

Lint
====

make lint output:

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/canonical/launchpad/database/launchpadstatistic.py
  lib/lp/answers/model/question.py
  lib/lp/registry/model/product.py
  lib/lp/registry/model/projectgroup.py
  lib/lp/translations/model/translationsoverview.py
  lib/lp/translations/model/translationsperson.py
  lib/lp/translations/scripts/translations_to_branch.py

To post a comment you must log in.
Revision history for this message
Edwin Grubbs (edwin-grubbs) wrote :
Download full text (4.9 KiB)

Hi JC,

This is a nice branch. I have a few comments below. Remember, you can't go on your honeymoon until you land this branch.

-Edwin

>=== modified file 'lib/lp/answers/model/question.py'
>--- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
>+++ lib/lp/answers/model/question.py 2010-11-03 21:39:12 +0000
>@@ -680,8 +681,8 @@
> LEFT OUTER JOIN Distribution ON (
> Question.distribution = Distribution.id)
> WHERE
>- (Product.official_answers is True
>- OR Distribution.official_answers is TRUE)
>+ (Product.answers_usage = %s

Trailing whitespace.

>+ OR Distribution.answers_usage = %s)
> AND Question.datecreated > (
> current_timestamp -interval '60 days')
> LIMIT 5000
>@@ -689,7 +690,8 @@
> GROUP BY product, distribution
> ORDER BY question_count DESC
> LIMIT %s
>- """ % sqlvalues(limit))
>+ """ % sqlvalues(
>+ ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
>
> projects = []
> product_set = getUtility(IProductSet)
>
>=== modified file 'lib/lp/registry/model/projectgroup.py'
>--- lib/lp/registry/model/projectgroup.py 2010-11-02 20:10:56 +0000
>+++ lib/lp/registry/model/projectgroup.py 2010-11-03 21:39:12 +0000
>@@ -185,17 +185,12 @@

There is a bunch of trailing whitespace a little further up in this
file.

> def translatables(self):
> """See `IProjectGroup`."""
>- # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has
>- # happened for the usage enums, this sql needs to be updated to
>- # check for the translations_usage, not official_rosetta. At that
>- # time it should also be converted to a Storm query and the issue with
>- # has_translatables resolved.

Can you fix the problem with has_translatables now?

> return Product.select('''
> Product.project = %s AND
>- Product.official_rosetta = TRUE AND
>+ Product.translations_usage = %s AND
> Product.id = ProductSeries.product AND
> POTemplate.productseries = ProductSeries.id
>- ''' % sqlvalues(self),
>+ ''' % sqlvalues(self, ServiceUsage.LAUNCHPAD),
> clauseTables=['ProductSeries', 'POTemplate'],
> distinct=True)
>
>
>=== modified file 'lib/lp/translations/model/translationsoverview.py'
>--- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
>+++ lib/lp/translations/model/translationsoverview.py 2010-11-03 21:39:12 +0000
>@@ -67,14 +65,16 @@
> distribution=distribution.id
> WHERE category=3 AND
> (product IS NOT NULL OR distribution IS NOT NULL) AND
>- (product.official_rosetta OR
>- distribution.official_rosetta)
>+ (product.translations_usage = %s OR
>+ distribution.tranlsations_usage = %s)
> GROUP BY product.displayname, product.id,
...

Read more...

review: Approve (code)
Revision history for this message
j.c.sackett (jcsackett) wrote :
Download full text (4.9 KiB)

On Nov 3, 2010, at 5:56 PM, Edwin Grubbs wrote:

> Review: Approve code
> Hi JC,
>
> This is a nice branch. I have a few comments below. Remember, you can't go on your honeymoon until you land this branch.
>
> -Edwin
>
>
>> === modified file 'lib/lp/answers/model/question.py'
>> --- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
>> +++ lib/lp/answers/model/question.py 2010-11-03 21:39:12 +0000
>> @@ -680,8 +681,8 @@
>> LEFT OUTER JOIN Distribution ON (
>> Question.distribution = Distribution.id)
>> WHERE
>> - (Product.official_answers is True
>> - OR Distribution.official_answers is TRUE)
>> + (Product.answers_usage = %s
>
>
> Trailing whitespace.
>
>
>> + OR Distribution.answers_usage = %s)
>> AND Question.datecreated > (
>> current_timestamp -interval '60 days')
>> LIMIT 5000
>> @@ -689,7 +690,8 @@
>> GROUP BY product, distribution
>> ORDER BY question_count DESC
>> LIMIT %s
>> - """ % sqlvalues(limit))
>> + """ % sqlvalues(
>> + ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
>>
>> projects = []
>> product_set = getUtility(IProductSet)
>>
>> === modified file 'lib/lp/registry/model/projectgroup.py'
>> --- lib/lp/registry/model/projectgroup.py 2010-11-02 20:10:56 +0000
>> +++ lib/lp/registry/model/projectgroup.py 2010-11-03 21:39:12 +0000
>> @@ -185,17 +185,12 @@
>
>
> There is a bunch of trailing whitespace a little further up in this
> file.

Got both of these. It's odd, make lint didn't return this--is it possible for lint to be overcome by big diffs (the branch this depends on has huge sample data changes)?

>> def translatables(self):
>> """See `IProjectGroup`."""
>> - # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has
>> - # happened for the usage enums, this sql needs to be updated to
>> - # check for the translations_usage, not official_rosetta. At that
>> - # time it should also be converted to a Storm query and the issue with
>> - # has_translatables resolved.
>
>
>
> Can you fix the problem with has_translatables now?

Yes; I'm pushing up the fix for that too.

>> === modified file 'lib/lp/translations/model/translationsoverview.py'
>> --- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
>> +++ lib/lp/translations/model/translationsoverview.py 2010-11-03 21:39:12 +0000
>> @@ -67,14 +65,16 @@
>> distribution=distribution.id
>> WHERE category=3 AND
>> (product IS NOT NULL OR distribution IS NOT NULL) AND
>> - (product.official_rosetta OR
>> - distribution.official_rosetta)
>> + (product.translations_usage = %s OR
>> + distribution.tranlsations_usage = %s)
>> GROUP BY product.displayname, product.id,
>> distribution.displayname, distribution.id
>> HAVING SUM...

Read more...

Revision history for this message
j.c.sackett (jcsackett) wrote :

I had to remove the changes from the prerequisite branch, but now the diff seems huge. I've attached a smaller more clear diff.

=== modified file 'lib/canonical/launchpad/database/launchpadstatistic.py'
--- lib/canonical/launchpad/database/launchpadstatistic.py 2010-10-03 15:30:06 +0000
+++ lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-03 17:58:38 +0000
@@ -32,6 +32,7 @@
32 QuestionStatus,32 QuestionStatus,
33 )33 )
34from lp.answers.model.question import Question34from lp.answers.model.question import Question
35from lp.app.enums import ServiceUsage
35from lp.bugs.model.bug import Bug36from lp.bugs.model.bug import Bug
36from lp.bugs.model.bugtask import BugTask37from lp.bugs.model.bugtask import BugTask
37from lp.registry.model.product import Product38from lp.registry.model.product import Product
@@ -165,7 +166,7 @@
165 def _updateRosettaStatistics(self, ztm):166 def _updateRosettaStatistics(self, ztm):
166 self.update(167 self.update(
167 'products_using_rosetta',168 'products_using_rosetta',
168 Product.selectBy(official_rosetta=True).count()169 Product.selectBy(translations_usage=ServiceUsage.LAUNCHPAD).count()
169 )170 )
170 self.update('potemplate_count', POTemplate.select().count())171 self.update('potemplate_count', POTemplate.select().count())
171 ztm.commit()172 ztm.commit()
172173
=== modified file 'lib/lp/answers/model/question.py'
--- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
+++ lib/lp/answers/model/question.py 2010-11-04 00:35:23 +0000
@@ -1,4 +1,4 @@
1# Copyright 2009 Canonical Ltd. This software is licensed under the1# Copyright 2009-2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4# pylint: disable-msg=E0611,W02124# pylint: disable-msg=E0611,W0212
@@ -88,6 +88,7 @@
88from lp.answers.model.answercontact import AnswerContact88from lp.answers.model.answercontact import AnswerContact
89from lp.answers.model.questionmessage import QuestionMessage89from lp.answers.model.questionmessage import QuestionMessage
90from lp.answers.model.questionsubscription import QuestionSubscription90from lp.answers.model.questionsubscription import QuestionSubscription
91from lp.app.enums import ServiceUsage
91from lp.bugs.interfaces.buglink import IBugLinkTarget92from lp.bugs.interfaces.buglink import IBugLinkTarget
92from lp.bugs.interfaces.bugtask import BugTaskStatus93from lp.bugs.interfaces.bugtask import BugTaskStatus
93from lp.bugs.model.buglinktarget import BugLinkTargetMixin94from lp.bugs.model.buglinktarget import BugLinkTargetMixin
@@ -680,8 +681,8 @@
680 LEFT OUTER JOIN Distribution ON (681 LEFT OUTER JOIN Distribution ON (
681 Question.distribution = Distribution.id)682 Question.distribution = Distribution.id)
682 WHERE683 WHERE
683 (Product.official_answers is True684 (Product.answers_usage = %s
684 OR Distribution.official_answers is TRUE)685 OR Distribution.answers_usage = %s)
685 AND Question.datecreated > (686 AND Question.datecreated > (
686 current_timestamp -interval '60 days')687 current_timestamp -interval '60 days')
687 LIMIT 5000688 LIMIT 5000
@@ -689,7 +690,8 @@
689 GROUP BY product, distribution690 GROUP BY product, distribution
690 ORDER BY question_count DESC691 ORDER BY question_count DESC
691 LIMIT %s692 LIMIT %s
692 """ % sqlvalues(limit))693 """ % sqlvalues(
694 ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
693695
694 projects = []696 projects = []
695 product_set = getUtility(IProductSet)697 product_set = getUtility(IProductSet)
696698
=== modified file 'lib/lp/registry/model/product.py'
--- lib/lp/registry/model/product.py 2010-11-03 22:37:55 +0000
+++ lib/lp/registry/model/product.py 2010-11-04 12:54:30 +0000
@@ -1570,7 +1570,7 @@
1570 Product.active == True,1570 Product.active == True,
1571 Product.id == ProductSeries.productID,1571 Product.id == ProductSeries.productID,
1572 POTemplate.productseriesID == ProductSeries.id,1572 POTemplate.productseriesID == ProductSeries.id,
1573 Product.official_rosetta == True,1573 Product.translations_usage == ServiceUsage.LAUNCHPAD,
1574 Person.id == Product._ownerID,1574 Person.id == Product._ownerID,
1575 ).config(distinct=True).order_by(Product.title)1575 ).config(distinct=True).order_by(Product.title)
15761576
@@ -1590,12 +1590,12 @@
1590 ProductSeries.Product = Product.id1590 ProductSeries.Product = Product.id
1591 JOIN POTemplate ON1591 JOIN POTemplate ON
1592 POTemplate.productseries = ProductSeries.id1592 POTemplate.productseries = ProductSeries.id
1593 WHERE Product.active AND Product.official_rosetta1593 WHERE Product.active AND Product.translations_usage = %s
1594 ORDER BY place1594 ORDER BY place
1595 ) AS randomized_products1595 ) AS randomized_products
1596 LIMIT %s1596 LIMIT %s
1597 )1597 )
1598 ''' % quote(maximumproducts),1598 ''' % quote(ServiceUsage.LAUNCHPAD, maximumproducts),
1599 distinct=True,1599 distinct=True,
1600 orderBy='Product.title')1600 orderBy='Product.title')
16011601
16021602
=== modified file 'lib/lp/registry/model/projectgroup.py'
--- lib/lp/registry/model/projectgroup.py 2010-11-02 20:10:56 +0000
+++ lib/lp/registry/model/projectgroup.py 2010-11-04 12:54:30 +0000
@@ -175,7 +175,7 @@
175 def getConfigurableProducts(self):175 def getConfigurableProducts(self):
176 return [product for product in self.products176 return [product for product in self.products
177 if check_permission('launchpad.Edit', product)]177 if check_permission('launchpad.Edit', product)]
178 178
179 @property179 @property
180 def drivers(self):180 def drivers(self):
181 """See `IHasDrivers`."""181 """See `IHasDrivers`."""
@@ -185,19 +185,15 @@
185185
186 def translatables(self):186 def translatables(self):
187 """See `IProjectGroup`."""187 """See `IProjectGroup`."""
188 # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has188 store = Store.of(self)
189 # happened for the usage enums, this sql needs to be updated to189 results = store.find(
190 # check for the translations_usage, not official_rosetta. At that190 Product,
191 # time it should also be converted to a Storm query and the issue with191 AND(
192 # has_translatables resolved.192 Product.project == self.id,
193 return Product.select('''193 Product.translations_usage == ServiceUsage.LAUNCHPAD,
194 Product.project = %s AND194 Product == ProductSeries.product,
195 Product.official_rosetta = TRUE AND195 POTemplate.productseries == ProductSeries.id))
196 Product.id = ProductSeries.product AND196 return results.config(distinct=True)
197 POTemplate.productseries = ProductSeries.id
198 ''' % sqlvalues(self),
199 clauseTables=['ProductSeries', 'POTemplate'],
200 distinct=True)
201197
202 def has_translatable(self):198 def has_translatable(self):
203 """See `IProjectGroup`."""199 """See `IProjectGroup`."""
@@ -205,7 +201,7 @@
205 # converted to use is_empty but the implementation in storm's201 # converted to use is_empty but the implementation in storm's
206 # sqlobject wrapper is broken.202 # sqlobject wrapper is broken.
207 # return not self.translatables().is_empty()203 # return not self.translatables().is_empty()
208 return self.translatables().count() != 0204 return self.translatables().is_empty()
209205
210 def has_branches(self):206 def has_branches(self):
211 """ See `IProjectGroup`."""207 """ See `IProjectGroup`."""
212208
=== modified file 'lib/lp/translations/model/translationsoverview.py'
--- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
+++ lib/lp/translations/model/translationsoverview.py 2010-11-04 01:38:24 +0000
@@ -7,6 +7,7 @@
7from zope.interface import implements7from zope.interface import implements
88
9from canonical.database.sqlbase import cursor9from canonical.database.sqlbase import cursor
10from lp.app.enums import ServiceUsage
10from lp.registry.model.distribution import Distribution11from lp.registry.model.distribution import Distribution
11from lp.registry.model.product import Product12from lp.registry.model.product import Product
12from lp.translations.interfaces.translationsoverview import (13from lp.translations.interfaces.translationsoverview import (
@@ -45,9 +46,6 @@
45 def getMostTranslatedPillars(self, limit=50):46 def getMostTranslatedPillars(self, limit=50):
46 """See `ITranslationsOverview`."""47 """See `ITranslationsOverview`."""
4748
48 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
49 # happened for the usage enums, this sql needs to be updated
50 # to check for the translations_usage, not official_rosetta.
51 query = """49 query = """
52 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,50 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,
53 product_id,51 product_id,
@@ -67,14 +65,16 @@
67 distribution=distribution.id65 distribution=distribution.id
68 WHERE category=3 AND66 WHERE category=3 AND
69 (product IS NOT NULL OR distribution IS NOT NULL) AND67 (product IS NOT NULL OR distribution IS NOT NULL) AND
70 (product.official_rosetta OR68 (product.translations_usage = %s OR
71 distribution.official_rosetta)69 distribution.tranlsations_usage = %s)
72 GROUP BY product.displayname, product.id,70 GROUP BY product.displayname, product.id,
73 distribution.displayname, distribution.id71 distribution.displayname, distribution.id
74 HAVING SUM(karmavalue) > 072 HAVING SUM(karmavalue) > 0
75 ORDER BY total_karma DESC73 ORDER BY total_karma DESC
76 LIMIT %d) AS something74 LIMIT %d) AS something
77 ORDER BY name""" % int(limit)75 ORDER BY name""" % sqlvalues(ServiceUsage.LAUNCHPAD,
76 ServiceUsage.LAUNCHPAD,
77 int(limit))
78 cur = cursor()78 cur = cursor()
79 cur.execute(query)79 cur.execute(query)
8080
8181
=== modified file 'lib/lp/translations/model/translationsperson.py'
--- lib/lp/translations/model/translationsperson.py 2010-08-31 23:03:45 +0000
+++ lib/lp/translations/model/translationsperson.py 2010-11-03 17:56:46 +0000
@@ -262,9 +262,6 @@
262 The added joins may make the overall query non-distinct, so be262 The added joins may make the overall query non-distinct, so be
263 sure to enforce distinctness.263 sure to enforce distinctness.
264 """264 """
265 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
266 # happened for the usage enums, this query needs to be updated
267 # to check for the translations_usage, not official_rosetta.
268265
269 POTemplateJoin = Join(POTemplate, And(266 POTemplateJoin = Join(POTemplate, And(
270 POTemplate.id == POFile.potemplateID,267 POTemplate.id == POFile.potemplateID,
@@ -282,7 +279,7 @@
282 # translation focus.279 # translation focus.
283 distrojoin_conditions = And(280 distrojoin_conditions = And(
284 Distribution.id == DistroSeries.distributionID,281 Distribution.id == DistroSeries.distributionID,
285 Distribution.official_rosetta == True,282 Distribution.translations_usage == ServiceUsage.LAUNCHPAD,
286 Distribution.translation_focusID == DistroSeries.id)283 Distribution.translation_focusID == DistroSeries.id)
287284
288 DistroJoin = LeftJoin(Distribution, distrojoin_conditions)285 DistroJoin = LeftJoin(Distribution, distrojoin_conditions)
@@ -291,7 +288,7 @@
291 ProductSeries, ProductSeries.id == POTemplate.productseriesID)288 ProductSeries, ProductSeries.id == POTemplate.productseriesID)
292 ProductJoin = LeftJoin(Product, And(289 ProductJoin = LeftJoin(Product, And(
293 Product.id == ProductSeries.productID,290 Product.id == ProductSeries.productID,
294 Product.official_rosetta == True))291 Product.translations_usage == ServiceUsage.LAUNCHPAD))
295292
296 ProjectJoin = LeftJoin(293 ProjectJoin = LeftJoin(
297 ProjectGroup, ProjectGroup.id == Product.projectID)294 ProjectGroup, ProjectGroup.id == Product.projectID)
298295
=== modified file 'lib/lp/translations/scripts/translations_to_branch.py'
--- lib/lp/translations/scripts/translations_to_branch.py 2010-10-02 11:41:43 +0000
+++ lib/lp/translations/scripts/translations_to_branch.py 2010-11-04 01:48:10 +0000
@@ -306,15 +306,13 @@
306306
307 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)307 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
308308
309 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
310 # happened for the usage enums, this sql needs to be updated to
311 # check for the translations_usage, not official_rosetta.
312 product_join = Join(309 product_join = Join(
313 ProductSeries, Product, ProductSeries.product == Product.id)310 ProductSeries, Product, ProductSeries.product == Product.id)
314 productseries = self.store.using(product_join).find(311 productseries = self.store.using(product_join).find(
315 ProductSeries, SQL(312 ProductSeries,
316 "official_rosetta AND translations_branch IS NOT NULL"))313 AND(
317314 Product.translations_usage == ServiceUsage.LAUNCHPAD,
315 Product.translations_branch is not None))
318 # Anything deterministic will do, and even that is only for316 # Anything deterministic will do, and even that is only for
319 # testing.317 # testing.
320 productseries = productseries.order_by(ProductSeries.id)318 productseries = productseries.order_by(ProductSeries.id)
Revision history for this message
Edwin Grubbs (edwin-grubbs) wrote :

Hi JC,

I found a couple of things that should be changed in your incremental diff.

>=== modified file 'lib/lp/registry/model/projectgroup.py'
>--- lib/lp/registry/model/projectgroup.py 2010-11-02 20:10:56 +0000
>+++ lib/lp/registry/model/projectgroup.py 2010-11-04 12:54:30 +0000
>
> def has_translatable(self):
> """See `IProjectGroup`."""
>@@ -205,7 +201,7 @@
> # converted to use is_empty but the implementation in storm's
> # sqlobject wrapper is broken.
> # return not self.translatables().is_empty()

It looks like this comment can also be removed now.

>- return self.translatables().count() != 0
>+ return self.translatables().is_empty()
>
> def has_branches(self):
> """ See `IProjectGroup`."""
>
>=== modified file 'lib/lp/translations/scripts/translations_to_branch.py'
>--- lib/lp/translations/scripts/translations_to_branch.py 2010-10-02 11:41:43 +0000
>+++ lib/lp/translations/scripts/translations_to_branch.py 2010-11-04 01:48:10 +0000
>@@ -306,15 +306,13 @@
>
> self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
>
>- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
>- # happened for the usage enums, this sql needs to be updated to
>- # check for the translations_usage, not official_rosetta.
> product_join = Join(
> ProductSeries, Product, ProductSeries.product == Product.id)
> productseries = self.store.using(product_join).find(
>- ProductSeries, SQL(
>- "official_rosetta AND translations_branch IS NOT NULL"))
>-
>+ ProductSeries,
>+ AND(
>+ Product.translations_usage == ServiceUsage.LAUNCHPAD,
>+ Product.translations_branch is not None))

You can't use "is not None" for a storm conditional, since python does
not allow that operator to be overridden. Instead use
                Product.translations_branch != None
and storm will be smart enough to change it to "IS NOT NULL".

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'database/sampledata/current-dev.sql'
--- database/sampledata/current-dev.sql 2010-11-16 22:42:35 +0000
+++ database/sampledata/current-dev.sql 2010-11-16 22:42:37 +0000
@@ -1917,7 +1917,7 @@
1917overrideroot=/var/tmp/archive/ubuntu-overrides1917overrideroot=/var/tmp/archive/ubuntu-overrides
1918cacheroot=/var/tmp/archive/ubuntu-cache1918cacheroot=/var/tmp/archive/ubuntu-cache
1919miscroot=/var/tmp/archive/ubuntu-misc1919miscroot=/var/tmp/archive/ubuntu-misc
1920', 'Ubuntu', 'Ubuntu is a new approach to Linux Distribution that includes regular releases, and a simplified single-CD installation system.', 17, NULL, 1, NULL, true, true, NULL, NULL, 3, 59, NULL, NULL, '2006-10-16 18:31:43.415195', NULL, NULL, NULL, NULL, NULL, true, NULL, true, true, NULL, NULL, NULL, NULL, 10, 10, 10);1920', 'Ubuntu', 'Ubuntu is a new approach to Linux Distribution that includes regular releases, and a simplified single-CD installation system.', 17, NULL, 1, NULL, true, true, NULL, NULL, 3, 59, NULL, NULL, '2006-10-16 18:31:43.415195', NULL, NULL, NULL, NULL, NULL, true, NULL, true, true, NULL, NULL, NULL, NULL, 20, 20, 20);
1921INSERT INTO distribution (id, name, title, description, domainname, owner, lucilleconfig, displayname, summary, members, translationgroup, translationpermission, bug_supervisor, official_malone, official_rosetta, security_contact, driver, translation_focus, mirror_admin, upload_admin, upload_sender, date_created, homepage_content, icon, mugshot, logo, fti, official_answers, language_pack_admin, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (2, 'redhat', 'Redhat Advanced Server', 'Red Hat is a commercial distribution of the GNU/Linux Operating System.', 'redhat.com', 1, NULL, 'Red Hat', 'Red Hat is a commercial distribution of the GNU/Linux Operating System.', 1, NULL, 1, NULL, false, false, NULL, 8, NULL, 1, NULL, NULL, '2006-10-16 18:31:43.417928', NULL, NULL, NULL, NULL, NULL, false, NULL, false, false, NULL, NULL, NULL, NULL, 10, 10, 10);1921INSERT INTO distribution (id, name, title, description, domainname, owner, lucilleconfig, displayname, summary, members, translationgroup, translationpermission, bug_supervisor, official_malone, official_rosetta, security_contact, driver, translation_focus, mirror_admin, upload_admin, upload_sender, date_created, homepage_content, icon, mugshot, logo, fti, official_answers, language_pack_admin, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (2, 'redhat', 'Redhat Advanced Server', 'Red Hat is a commercial distribution of the GNU/Linux Operating System.', 'redhat.com', 1, NULL, 'Red Hat', 'Red Hat is a commercial distribution of the GNU/Linux Operating System.', 1, NULL, 1, NULL, false, false, NULL, 8, NULL, 1, NULL, NULL, '2006-10-16 18:31:43.417928', NULL, NULL, NULL, NULL, NULL, false, NULL, false, false, NULL, NULL, NULL, NULL, 10, 10, 10);
1922INSERT INTO distribution (id, name, title, description, domainname, owner, lucilleconfig, displayname, summary, members, translationgroup, translationpermission, bug_supervisor, official_malone, official_rosetta, security_contact, driver, translation_focus, mirror_admin, upload_admin, upload_sender, date_created, homepage_content, icon, mugshot, logo, fti, official_answers, language_pack_admin, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (3, 'debian', 'Debian GNU/Linux', 'Debian GNU/Linux is1922INSERT INTO distribution (id, name, title, description, domainname, owner, lucilleconfig, displayname, summary, members, translationgroup, translationpermission, bug_supervisor, official_malone, official_rosetta, security_contact, driver, translation_focus, mirror_admin, upload_admin, upload_sender, date_created, homepage_content, icon, mugshot, logo, fti, official_answers, language_pack_admin, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (3, 'debian', 'Debian GNU/Linux', 'Debian GNU/Linux is
1923a non commercial distribution of a GNU/Linux Operating System for many1923a non commercial distribution of a GNU/Linux Operating System for many
19241924
=== modified file 'database/sampledata/current.sql'
--- database/sampledata/current.sql 2010-11-16 22:42:35 +0000
+++ database/sampledata/current.sql 2010-11-09 03:12:59 +0000
@@ -1976,10 +1976,10 @@
1976INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1976INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1977INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1977INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1978INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1978INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1979INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 20, 10, 10);1979INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1980INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (5, 5, 12, 'evolution', 'Evolution', 'The Evolution Groupware Application', 'Evolution is an email client, addressbook and calendar application that is very well integrated with the Gnome desktop. Evolution is the standard mail client in the Ubuntu distribution, and supports all current mail system standards.', 'Recently, Evolution has seen significant work to make it interoperable with the proprietary Microsoft Exchange Server protocols and formats, allowing organisations to replace Outlook on Windows with Evolution and Linux.1980INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (5, 5, 12, 'evolution', 'Evolution', 'The Evolution Groupware Application', 'Evolution is an email client, addressbook and calendar application that is very well integrated with the Gnome desktop. Evolution is the standard mail client in the Ubuntu distribution, and supports all current mail system standards.', 'Recently, Evolution has seen significant work to make it interoperable with the proprietary Microsoft Exchange Server protocols and formats, allowing organisations to replace Outlook on Windows with Evolution and Linux.
19811981
1982The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 20);1982The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1983INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, NULL, 10, 10, 10);1983INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, NULL, 10, 10, 10);
1984INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1984INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1985INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1985INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
@@ -1991,11 +1991,11 @@
1991INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1991INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1992INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1992INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1993INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1993INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1994INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, NULL, 10, 10, 20);1994INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1995INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (16, NULL, 12, 'landscape', 'The Landscape Project', 'The Landscape Project', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface.', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface. The scope of the project isn''t limited, and will grow up as new features are planned.1995INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (16, NULL, 12, 'landscape', 'The Landscape Project', 'The Landscape Project', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface.', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface. The scope of the project isn''t limited, and will grow up as new features are planned.
19961996
1997The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1997The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1998INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 20, 10, 10);1998INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
1999INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialisation Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);1999INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialisation Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, NULL, 10, 10, 10);
2000INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (19, NULL, 28, 'aptoncd', 'APTonCD', 'APTonCD, Get APT Anywhere', 'A simple yet powerful tool which allows you to create one (or more) CD/DVD-Repository containing all of the packages downloaded via apt-get or aptitude.', 'A GUI-based tool that allows you to create a CD/DVD with all downloaded packages with APT-GET, creating a removable-repository.2000INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, security_contact, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, date_next_suggest_packaging, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage) VALUES (19, NULL, 28, 'aptoncd', 'APTonCD', 'APTonCD, Get APT Anywhere', 'A simple yet powerful tool which allows you to create one (or more) CD/DVD-Repository containing all of the packages downloaded via apt-get or aptitude.', 'A GUI-based tool that allows you to create a CD/DVD with all downloaded packages with APT-GET, creating a removable-repository.
20012001
20022002
=== removed file 'database/schema/patch-2208-99-0.sql'
--- database/schema/patch-2208-99-0.sql 2010-11-16 22:42:35 +0000
+++ database/schema/patch-2208-99-0.sql 1970-01-01 00:00:00 +0000
@@ -1,36 +0,0 @@
1-- migrate-official-bool-data sets the _usage enum database columns based on
2-- the values in their respective official_* columns.
3
4-- usage enums are set if their value is 10 and the corresponding bool
5-- is TRUE.
6
7-- Set error messages per the wiki.
8SET client_min_messages=ERROR;
9
10-- Some constants:
11-- ServiceUsage.UNKNOWN is 10.
12-- ServiceUsage.LAUNCHPAD is 20.
13-- See lp.app.enums for more information.
14
15-- Translations
16UPDATE Product
17 SET translations_usage = 20
18 WHERE
19 translations_usage = 10 AND
20 official_rosetta = True;
21
22-- Answers
23UPDATE Product
24 SET answers_usage = 20
25 WHERE
26 answers_usage = 10 AND
27 official_answers = True;
28
29-- Blueprints
30UPDATE Product
31 SET blueprints_usage = 20
32 WHERE
33 blueprints_usage = 10 AND
34 official_blueprints = True;
35
36INSERT INTO LaunchpadDatabaseRevision VALUES (2208, 99, 0);
370
=== modified file 'lib/canonical/launchpad/database/launchpadstatistic.py'
--- lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-08 12:52:43 +0000
+++ lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-16 22:42:37 +0000
@@ -31,6 +31,7 @@
31 )31 )
32from lp.answers.interfaces.questionenums import QuestionStatus32from lp.answers.interfaces.questionenums import QuestionStatus
33from lp.answers.model.question import Question33from lp.answers.model.question import Question
34from lp.app.enums import ServiceUsage
34from lp.bugs.model.bug import Bug35from lp.bugs.model.bug import Bug
35from lp.bugs.model.bugtask import BugTask36from lp.bugs.model.bugtask import BugTask
36from lp.registry.interfaces.person import IPersonSet37from lp.registry.interfaces.person import IPersonSet
@@ -165,7 +166,7 @@
165 def _updateRosettaStatistics(self, ztm):166 def _updateRosettaStatistics(self, ztm):
166 self.update(167 self.update(
167 'products_using_rosetta',168 'products_using_rosetta',
168 Product.selectBy(official_rosetta=True).count()169 Product.selectBy(translations_usage=ServiceUsage.LAUNCHPAD).count()
169 )170 )
170 self.update('potemplate_count', POTemplate.select().count())171 self.update('potemplate_count', POTemplate.select().count())
171 ztm.commit()172 ztm.commit()
172173
=== modified file 'lib/lp/answers/doc/questionsets.txt'
--- lib/lp/answers/doc/questionsets.txt 2010-10-18 22:24:59 +0000
+++ lib/lp/answers/doc/questionsets.txt 2010-11-16 22:42:37 +0000
@@ -164,6 +164,23 @@
164Active projects164Active projects
165===============165===============
166166
167Set Up
168------
169
170The test assume some database values have been set for usage enums, so first
171we'll set those up.
172
173 >>> import transaction
174 >>> from lp.app.enums import ServiceUsage
175 >>> from lp.registry.interfaces.distribution import IDistributionSet
176 >>> from lp.registry.interfaces.product import IProductSet
177 >>> firefox = getUtility(IProductSet).getByName('firefox')
178 >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
179 >>> login('admin@canonical.com')
180 >>> firefox.answers_usage = ServiceUsage.LAUNCHPAD
181 >>> ubuntu.answers_usage = ServiceUsage.LAUNCHPAD
182 >>> transaction.commit()
183
167This method can be used to retrieve the projects that are the most actively184This method can be used to retrieve the projects that are the most actively
168using the Answer Tracker in the last 60 days. By active, we mean that the185using the Answer Tracker in the last 60 days. By active, we mean that the
169project is registered as officially using Answers and had some questions asked186project is registered as officially using Answers and had some questions asked
@@ -178,9 +195,7 @@
178Then some recent questions are created on a number of projects.195Then some recent questions are created on a number of projects.
179196
180 >>> from lp.answers.testing import QuestionFactory197 >>> from lp.answers.testing import QuestionFactory
181 >>> from lp.registry.interfaces.distribution import IDistributionSet
182 >>> from lp.registry.interfaces.person import IPersonSet198 >>> from lp.registry.interfaces.person import IPersonSet
183 >>> from lp.registry.interfaces.product import IProductSet
184199
185 >>> firefox = getUtility(IProductSet).getByName('firefox')200 >>> firefox = getUtility(IProductSet).getByName('firefox')
186 >>> landscape = getUtility(IProductSet).getByName('landscape')201 >>> landscape = getUtility(IProductSet).getByName('landscape')
@@ -224,6 +239,7 @@
224 Ubuntu239 Ubuntu
225 Mozilla Firefox240 Mozilla Firefox
226241
242
227The method accepts an optional limit parameter limiting the number of243The method accepts an optional limit parameter limiting the number of
228project returned:244project returned:
229245
230246
=== modified file 'lib/lp/answers/model/question.py'
--- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
+++ lib/lp/answers/model/question.py 2010-11-16 22:42:37 +0000
@@ -1,4 +1,4 @@
1# Copyright 2009 Canonical Ltd. This software is licensed under the1# Copyright 2009-2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4# pylint: disable-msg=E0611,W02124# pylint: disable-msg=E0611,W0212
@@ -88,6 +88,7 @@
88from lp.answers.model.answercontact import AnswerContact88from lp.answers.model.answercontact import AnswerContact
89from lp.answers.model.questionmessage import QuestionMessage89from lp.answers.model.questionmessage import QuestionMessage
90from lp.answers.model.questionsubscription import QuestionSubscription90from lp.answers.model.questionsubscription import QuestionSubscription
91from lp.app.enums import ServiceUsage
91from lp.bugs.interfaces.buglink import IBugLinkTarget92from lp.bugs.interfaces.buglink import IBugLinkTarget
92from lp.bugs.interfaces.bugtask import BugTaskStatus93from lp.bugs.interfaces.bugtask import BugTaskStatus
93from lp.bugs.model.buglinktarget import BugLinkTargetMixin94from lp.bugs.model.buglinktarget import BugLinkTargetMixin
@@ -680,8 +681,8 @@
680 LEFT OUTER JOIN Distribution ON (681 LEFT OUTER JOIN Distribution ON (
681 Question.distribution = Distribution.id)682 Question.distribution = Distribution.id)
682 WHERE683 WHERE
683 (Product.official_answers is True684 (Product.answers_usage = %s
684 OR Distribution.official_answers is TRUE)685 OR Distribution.answers_usage = %s)
685 AND Question.datecreated > (686 AND Question.datecreated > (
686 current_timestamp -interval '60 days')687 current_timestamp -interval '60 days')
687 LIMIT 5000688 LIMIT 5000
@@ -689,7 +690,8 @@
689 GROUP BY product, distribution690 GROUP BY product, distribution
690 ORDER BY question_count DESC691 ORDER BY question_count DESC
691 LIMIT %s692 LIMIT %s
692 """ % sqlvalues(limit))693 """ % sqlvalues(
694 ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
693695
694 projects = []696 projects = []
695 product_set = getUtility(IProductSet)697 product_set = getUtility(IProductSet)
@@ -703,6 +705,7 @@
703 raise AssertionError(705 raise AssertionError(
704 'product_id and distribution_id are NULL')706 'product_id and distribution_id are NULL')
705 return projects707 return projects
708
706709
707 @staticmethod710 @staticmethod
708 def new(title=None, description=None, owner=None,711 def new(title=None, description=None, owner=None,
709712
=== modified file 'lib/lp/answers/stories/questions-index.txt'
--- lib/lp/answers/stories/questions-index.txt 2010-09-28 00:07:37 +0000
+++ lib/lp/answers/stories/questions-index.txt 2010-11-16 22:42:37 +0000
@@ -1,6 +1,21 @@
1Answer Tracker Introduction Page1Answer Tracker Introduction Page
2================================2================================
33
4First, we need to set some values for the later tests.
5
6 >>> import transaction
7 >>> from lp.app.enums import ServiceUsage
8 >>> from lp.registry.interfaces.distribution import IDistributionSet
9 >>> from lp.registry.interfaces.product import IProductSet
10 >>> from zope.component import getUtility
11 >>> login('admin@canonical.com')
12 >>> firefox = getUtility(IProductSet).getByName('firefox')
13 >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
14 >>> firefox.answers_usage = ServiceUsage.LAUNCHPAD
15 >>> ubuntu.answers_usage = ServiceUsage.LAUNCHPAD
16 >>> logout()
17 >>> transaction.commit()
18
4 >>> anon_browser.open('http://answers.launchpad.dev/')19 >>> anon_browser.open('http://answers.launchpad.dev/')
5 >>> print anon_browser.title20 >>> print anon_browser.title
6 Launchpad Answers21 Launchpad Answers
722
=== modified file 'lib/lp/registry/doc/product.txt'
--- lib/lp/registry/doc/product.txt 2010-11-02 05:48:54 +0000
+++ lib/lp/registry/doc/product.txt 2010-11-16 22:42:37 +0000
@@ -26,6 +26,16 @@
2626
27 >>> productset = getUtility(IProductSet)27 >>> productset = getUtility(IProductSet)
2828
29We also need to do some setup for other tests, which need alsa-utils
30configured for services.
31
32 >>> from lp.app.enums import ServiceUsage
33 >>> evolution = getUtility(IProductSet).getByName('evolution')
34 >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
35 >>> alsa = getUtility(IProductSet).getByName('alsa-utils')
36 >>> alsa.translations_usage = ServiceUsage.LAUNCHPAD
37 >>> transaction.commit()
38
29Verify that p (a Product object) correctly implements IProduct.39Verify that p (a Product object) correctly implements IProduct.
3040
31 >>> p = productset.get(5)41 >>> p = productset.get(5)
3242
=== modified file 'lib/lp/registry/doc/projectgroup.txt'
--- lib/lp/registry/doc/projectgroup.txt 2010-11-01 03:36:04 +0000
+++ lib/lp/registry/doc/projectgroup.txt 2010-11-16 22:42:37 +0000
@@ -13,6 +13,17 @@
13 ... )13 ... )
14 >>> projectset = getUtility(IProjectGroupSet)14 >>> projectset = getUtility(IProjectGroupSet)
1515
16 # Some setup
17 >>> import transaction
18 >>> from lp.app.enums import ServiceUsage
19 >>> from lp.registry.interfaces.product import IProductSet
20 >>> from zope.component import getUtility
21 >>> login('admin@canonical.com')
22 >>> evolution = getUtility(IProductSet).getByName('evolution')
23 >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
24 >>> logout()
25 >>> login('test@canonical.com')
26 >>> transaction.commit()
1627
17Creating new projects28Creating new projects
18---------------------29---------------------
1930
=== modified file 'lib/lp/registry/model/product.py'
--- lib/lp/registry/model/product.py 2010-11-08 01:08:15 +0000
+++ lib/lp/registry/model/product.py 2010-11-16 22:42:37 +0000
@@ -1571,8 +1571,9 @@
1571 Product.id == ProductSeries.productID,1571 Product.id == ProductSeries.productID,
1572 POTemplate.productseriesID == ProductSeries.id,1572 POTemplate.productseriesID == ProductSeries.id,
1573 Product.official_rosetta == True,1573 Product.official_rosetta == True,
1574 Person.id == Product._ownerID,1574 Person.id == Product._ownerID).config(
1575 ).config(distinct=True).order_by(Product.title)1575 distinct=True).order_by(Product.title)
1576
15761577
1577 # We only want Product - the other tables are just to populate1578 # We only want Product - the other tables are just to populate
1578 # the cache.1579 # the cache.
@@ -1590,12 +1591,12 @@
1590 ProductSeries.Product = Product.id1591 ProductSeries.Product = Product.id
1591 JOIN POTemplate ON1592 JOIN POTemplate ON
1592 POTemplate.productseries = ProductSeries.id1593 POTemplate.productseries = ProductSeries.id
1593 WHERE Product.active AND Product.official_rosetta1594 WHERE Product.active AND Product.translations_usage = %s
1594 ORDER BY place1595 ORDER BY place
1595 ) AS randomized_products1596 ) AS randomized_products
1596 LIMIT %s1597 LIMIT %s
1597 )1598 )
1598 ''' % quote(maximumproducts),1599 ''' % sqlvalues(ServiceUsage.LAUNCHPAD, maximumproducts),
1599 distinct=True,1600 distinct=True,
1600 orderBy='Product.title')1601 orderBy='Product.title')
16011602
16021603
=== modified file 'lib/lp/registry/model/projectgroup.py'
--- lib/lp/registry/model/projectgroup.py 2010-11-09 08:43:34 +0000
+++ lib/lp/registry/model/projectgroup.py 2010-11-16 22:42:37 +0000
@@ -184,17 +184,12 @@
184184
185 def translatables(self):185 def translatables(self):
186 """See `IProjectGroup`."""186 """See `IProjectGroup`."""
187 # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has
188 # happened for the usage enums, this sql needs to be updated to
189 # check for the translations_usage, not official_rosetta. At that
190 # time it should also be converted to a Storm query and the issue with
191 # has_translatables resolved.
192 return Product.select('''187 return Product.select('''
193 Product.project = %s AND188 Product.project = %s AND
194 Product.official_rosetta = TRUE AND189 Product.translations_usage = %s AND
195 Product.id = ProductSeries.product AND190 Product.id = ProductSeries.product AND
196 POTemplate.productseries = ProductSeries.id191 POTemplate.productseries = ProductSeries.id
197 ''' % sqlvalues(self),192 ''' % sqlvalues(self, ServiceUsage.LAUNCHPAD),
198 clauseTables=['ProductSeries', 'POTemplate'],193 clauseTables=['ProductSeries', 'POTemplate'],
199 distinct=True)194 distinct=True)
200195
201196
=== modified file 'lib/lp/translations/doc/translationsoverview.txt'
--- lib/lp/translations/doc/translationsoverview.txt 2010-10-18 22:24:59 +0000
+++ lib/lp/translations/doc/translationsoverview.txt 2010-11-16 22:42:37 +0000
@@ -67,6 +67,24 @@
67Getting the most translated pillars67Getting the most translated pillars
68-----------------------------------68-----------------------------------
6969
70Set Up
71......
72
73The following demo assumes the test data has official_translations set.
74Let's set that up.
75
76 >>> from lp.app.enums import ServiceUsage
77 >>> evolution = getUtility(IProductSet).getByName('evolution')
78 >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
79 >>> alsa = getUtility(IProductSet).getByName('alsa-utils')
80 >>> alsa.translations_usage = ServiceUsage.LAUNCHPAD
81 >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
82 >>> ubuntu.translations_usage = ServiceUsage.LAUNCHPAD
83 >>> transaction.commit()
84
85Using getMostTranslatedPillars
86..............................
87
70Method getMostTranslatedPillars() returns a list of dicts listing88Method getMostTranslatedPillars() returns a list of dicts listing
71pillars with most translations karma so far, along with a relative89pillars with most translations karma so far, along with a relative
72weight for each of the pillars in the range of [overview.MINIMUM_SIZE,90weight for each of the pillars in the range of [overview.MINIMUM_SIZE,
7391
=== modified file 'lib/lp/translations/model/translationsoverview.py'
--- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
+++ lib/lp/translations/model/translationsoverview.py 2010-11-16 22:42:37 +0000
@@ -6,7 +6,11 @@
66
7from zope.interface import implements7from zope.interface import implements
88
9from canonical.database.sqlbase import cursor9from canonical.database.sqlbase import (
10 cursor,
11 sqlvalues,
12 )
13from lp.app.enums import ServiceUsage
10from lp.registry.model.distribution import Distribution14from lp.registry.model.distribution import Distribution
11from lp.registry.model.product import Product15from lp.registry.model.product import Product
12from lp.translations.interfaces.translationsoverview import (16from lp.translations.interfaces.translationsoverview import (
@@ -45,9 +49,6 @@
45 def getMostTranslatedPillars(self, limit=50):49 def getMostTranslatedPillars(self, limit=50):
46 """See `ITranslationsOverview`."""50 """See `ITranslationsOverview`."""
4751
48 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
49 # happened for the usage enums, this sql needs to be updated
50 # to check for the translations_usage, not official_rosetta.
51 query = """52 query = """
52 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,53 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,
53 product_id,54 product_id,
@@ -67,14 +68,16 @@
67 distribution=distribution.id68 distribution=distribution.id
68 WHERE category=3 AND69 WHERE category=3 AND
69 (product IS NOT NULL OR distribution IS NOT NULL) AND70 (product IS NOT NULL OR distribution IS NOT NULL) AND
70 (product.official_rosetta OR71 (product.translations_usage = %s OR
71 distribution.official_rosetta)72 distribution.translations_usage = %s)
72 GROUP BY product.displayname, product.id,73 GROUP BY product.displayname, product.id,
73 distribution.displayname, distribution.id74 distribution.displayname, distribution.id
74 HAVING SUM(karmavalue) > 075 HAVING SUM(karmavalue) > 0
75 ORDER BY total_karma DESC76 ORDER BY total_karma DESC
76 LIMIT %d) AS something77 LIMIT %s) AS something
77 ORDER BY name""" % int(limit)78 ORDER BY name""" % sqlvalues(ServiceUsage.LAUNCHPAD,
79 ServiceUsage.LAUNCHPAD,
80 limit)
78 cur = cursor()81 cur = cursor()
79 cur.execute(query)82 cur.execute(query)
8083
8184
=== modified file 'lib/lp/translations/model/translationsperson.py'
--- lib/lp/translations/model/translationsperson.py 2010-11-05 14:56:34 +0000
+++ lib/lp/translations/model/translationsperson.py 2010-11-16 22:42:37 +0000
@@ -260,9 +260,6 @@
260 The added joins may make the overall query non-distinct, so be260 The added joins may make the overall query non-distinct, so be
261 sure to enforce distinctness.261 sure to enforce distinctness.
262 """262 """
263 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
264 # happened for the usage enums, this query needs to be updated
265 # to check for the translations_usage, not official_rosetta.
266263
267 POTemplateJoin = Join(POTemplate, And(264 POTemplateJoin = Join(POTemplate, And(
268 POTemplate.id == POFile.potemplateID,265 POTemplate.id == POFile.potemplateID,
269266
=== modified file 'lib/lp/translations/scripts/translations_to_branch.py'
--- lib/lp/translations/scripts/translations_to_branch.py 2010-10-02 11:41:43 +0000
+++ lib/lp/translations/scripts/translations_to_branch.py 2010-11-16 22:42:37 +0000
@@ -306,9 +306,6 @@
306306
307 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)307 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
308308
309 # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
310 # happened for the usage enums, this sql needs to be updated to
311 # check for the translations_usage, not official_rosetta.
312 product_join = Join(309 product_join = Join(
313 ProductSeries, Product, ProductSeries.product == Product.id)310 ProductSeries, Product, ProductSeries.product == Product.id)
314 productseries = self.store.using(product_join).find(311 productseries = self.store.using(product_join).find(
315312
=== modified file 'lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt'
--- lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt 2009-11-07 07:46:54 +0000
+++ lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt 2010-11-16 22:42:37 +0000
@@ -1,4 +1,21 @@
1= Translations front page =1Translations front page
2=======================
3
4Set up
5------
6
7 >>> import transaction
8 >>> from lp.app.enums import ServiceUsage
9 >>> from lp.registry.interfaces.product import IProductSet
10 >>> from zope.component import getUtility
11 >>> login('admin@canonical.com')
12 >>> evolution = getUtility(IProductSet).getByName('evolution')
13 >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
14 >>> logout()
15 >>> transaction.commit()
16
17The front page
18--------------
219
3 >>> browser.open('http://translations.launchpad.dev/')20 >>> browser.open('http://translations.launchpad.dev/')
4 >>> print browser.title21 >>> print browser.title

Subscribers

People subscribed via source and target branches

to status/vote changes: