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.

1=== modified file 'lib/canonical/launchpad/database/launchpadstatistic.py'
2--- lib/canonical/launchpad/database/launchpadstatistic.py 2010-10-03 15:30:06 +0000
3+++ lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-03 17:58:38 +0000
4@@ -32,6 +32,7 @@
5 QuestionStatus,
6 )
7 from lp.answers.model.question import Question
8+from lp.app.enums import ServiceUsage
9 from lp.bugs.model.bug import Bug
10 from lp.bugs.model.bugtask import BugTask
11 from lp.registry.model.product import Product
12@@ -165,7 +166,7 @@
13 def _updateRosettaStatistics(self, ztm):
14 self.update(
15 'products_using_rosetta',
16- Product.selectBy(official_rosetta=True).count()
17+ Product.selectBy(translations_usage=ServiceUsage.LAUNCHPAD).count()
18 )
19 self.update('potemplate_count', POTemplate.select().count())
20 ztm.commit()
21
22=== modified file 'lib/lp/answers/model/question.py'
23--- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
24+++ lib/lp/answers/model/question.py 2010-11-04 00:35:23 +0000
25@@ -1,4 +1,4 @@
26-# Copyright 2009 Canonical Ltd. This software is licensed under the
27+# Copyright 2009-2010 Canonical Ltd. This software is licensed under the
28 # GNU Affero General Public License version 3 (see the file LICENSE).
29
30 # pylint: disable-msg=E0611,W0212
31@@ -88,6 +88,7 @@
32 from lp.answers.model.answercontact import AnswerContact
33 from lp.answers.model.questionmessage import QuestionMessage
34 from lp.answers.model.questionsubscription import QuestionSubscription
35+from lp.app.enums import ServiceUsage
36 from lp.bugs.interfaces.buglink import IBugLinkTarget
37 from lp.bugs.interfaces.bugtask import BugTaskStatus
38 from lp.bugs.model.buglinktarget import BugLinkTargetMixin
39@@ -680,8 +681,8 @@
40 LEFT OUTER JOIN Distribution ON (
41 Question.distribution = Distribution.id)
42 WHERE
43- (Product.official_answers is True
44- OR Distribution.official_answers is TRUE)
45+ (Product.answers_usage = %s
46+ OR Distribution.answers_usage = %s)
47 AND Question.datecreated > (
48 current_timestamp -interval '60 days')
49 LIMIT 5000
50@@ -689,7 +690,8 @@
51 GROUP BY product, distribution
52 ORDER BY question_count DESC
53 LIMIT %s
54- """ % sqlvalues(limit))
55+ """ % sqlvalues(
56+ ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
57
58 projects = []
59 product_set = getUtility(IProductSet)
60
61=== modified file 'lib/lp/registry/model/product.py'
62--- lib/lp/registry/model/product.py 2010-11-03 22:37:55 +0000
63+++ lib/lp/registry/model/product.py 2010-11-04 12:54:30 +0000
64@@ -1570,7 +1570,7 @@
65 Product.active == True,
66 Product.id == ProductSeries.productID,
67 POTemplate.productseriesID == ProductSeries.id,
68- Product.official_rosetta == True,
69+ Product.translations_usage == ServiceUsage.LAUNCHPAD,
70 Person.id == Product._ownerID,
71 ).config(distinct=True).order_by(Product.title)
72
73@@ -1590,12 +1590,12 @@
74 ProductSeries.Product = Product.id
75 JOIN POTemplate ON
76 POTemplate.productseries = ProductSeries.id
77- WHERE Product.active AND Product.official_rosetta
78+ WHERE Product.active AND Product.translations_usage = %s
79 ORDER BY place
80 ) AS randomized_products
81 LIMIT %s
82 )
83- ''' % quote(maximumproducts),
84+ ''' % quote(ServiceUsage.LAUNCHPAD, maximumproducts),
85 distinct=True,
86 orderBy='Product.title')
87
88
89=== modified file 'lib/lp/registry/model/projectgroup.py'
90--- lib/lp/registry/model/projectgroup.py 2010-11-02 20:10:56 +0000
91+++ lib/lp/registry/model/projectgroup.py 2010-11-04 12:54:30 +0000
92@@ -175,7 +175,7 @@
93 def getConfigurableProducts(self):
94 return [product for product in self.products
95 if check_permission('launchpad.Edit', product)]
96-
97+
98 @property
99 def drivers(self):
100 """See `IHasDrivers`."""
101@@ -185,19 +185,15 @@
102
103 def translatables(self):
104 """See `IProjectGroup`."""
105- # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has
106- # happened for the usage enums, this sql needs to be updated to
107- # check for the translations_usage, not official_rosetta. At that
108- # time it should also be converted to a Storm query and the issue with
109- # has_translatables resolved.
110- return Product.select('''
111- Product.project = %s AND
112- Product.official_rosetta = TRUE AND
113- Product.id = ProductSeries.product AND
114- POTemplate.productseries = ProductSeries.id
115- ''' % sqlvalues(self),
116- clauseTables=['ProductSeries', 'POTemplate'],
117- distinct=True)
118+ store = Store.of(self)
119+ results = store.find(
120+ Product,
121+ AND(
122+ Product.project == self.id,
123+ Product.translations_usage == ServiceUsage.LAUNCHPAD,
124+ Product == ProductSeries.product,
125+ POTemplate.productseries == ProductSeries.id))
126+ return results.config(distinct=True)
127
128 def has_translatable(self):
129 """See `IProjectGroup`."""
130@@ -205,7 +201,7 @@
131 # converted to use is_empty but the implementation in storm's
132 # sqlobject wrapper is broken.
133 # return not self.translatables().is_empty()
134- return self.translatables().count() != 0
135+ return self.translatables().is_empty()
136
137 def has_branches(self):
138 """ See `IProjectGroup`."""
139
140=== modified file 'lib/lp/translations/model/translationsoverview.py'
141--- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
142+++ lib/lp/translations/model/translationsoverview.py 2010-11-04 01:38:24 +0000
143@@ -7,6 +7,7 @@
144 from zope.interface import implements
145
146 from canonical.database.sqlbase import cursor
147+from lp.app.enums import ServiceUsage
148 from lp.registry.model.distribution import Distribution
149 from lp.registry.model.product import Product
150 from lp.translations.interfaces.translationsoverview import (
151@@ -45,9 +46,6 @@
152 def getMostTranslatedPillars(self, limit=50):
153 """See `ITranslationsOverview`."""
154
155- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
156- # happened for the usage enums, this sql needs to be updated
157- # to check for the translations_usage, not official_rosetta.
158 query = """
159 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,
160 product_id,
161@@ -67,14 +65,16 @@
162 distribution=distribution.id
163 WHERE category=3 AND
164 (product IS NOT NULL OR distribution IS NOT NULL) AND
165- (product.official_rosetta OR
166- distribution.official_rosetta)
167+ (product.translations_usage = %s OR
168+ distribution.tranlsations_usage = %s)
169 GROUP BY product.displayname, product.id,
170 distribution.displayname, distribution.id
171 HAVING SUM(karmavalue) > 0
172 ORDER BY total_karma DESC
173 LIMIT %d) AS something
174- ORDER BY name""" % int(limit)
175+ ORDER BY name""" % sqlvalues(ServiceUsage.LAUNCHPAD,
176+ ServiceUsage.LAUNCHPAD,
177+ int(limit))
178 cur = cursor()
179 cur.execute(query)
180
181
182=== modified file 'lib/lp/translations/model/translationsperson.py'
183--- lib/lp/translations/model/translationsperson.py 2010-08-31 23:03:45 +0000
184+++ lib/lp/translations/model/translationsperson.py 2010-11-03 17:56:46 +0000
185@@ -262,9 +262,6 @@
186 The added joins may make the overall query non-distinct, so be
187 sure to enforce distinctness.
188 """
189- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
190- # happened for the usage enums, this query needs to be updated
191- # to check for the translations_usage, not official_rosetta.
192
193 POTemplateJoin = Join(POTemplate, And(
194 POTemplate.id == POFile.potemplateID,
195@@ -282,7 +279,7 @@
196 # translation focus.
197 distrojoin_conditions = And(
198 Distribution.id == DistroSeries.distributionID,
199- Distribution.official_rosetta == True,
200+ Distribution.translations_usage == ServiceUsage.LAUNCHPAD,
201 Distribution.translation_focusID == DistroSeries.id)
202
203 DistroJoin = LeftJoin(Distribution, distrojoin_conditions)
204@@ -291,7 +288,7 @@
205 ProductSeries, ProductSeries.id == POTemplate.productseriesID)
206 ProductJoin = LeftJoin(Product, And(
207 Product.id == ProductSeries.productID,
208- Product.official_rosetta == True))
209+ Product.translations_usage == ServiceUsage.LAUNCHPAD))
210
211 ProjectJoin = LeftJoin(
212 ProjectGroup, ProjectGroup.id == Product.projectID)
213
214=== modified file 'lib/lp/translations/scripts/translations_to_branch.py'
215--- lib/lp/translations/scripts/translations_to_branch.py 2010-10-02 11:41:43 +0000
216+++ lib/lp/translations/scripts/translations_to_branch.py 2010-11-04 01:48:10 +0000
217@@ -306,15 +306,13 @@
218
219 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
220
221- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
222- # happened for the usage enums, this sql needs to be updated to
223- # check for the translations_usage, not official_rosetta.
224 product_join = Join(
225 ProductSeries, Product, ProductSeries.product == Product.id)
226 productseries = self.store.using(product_join).find(
227- ProductSeries, SQL(
228- "official_rosetta AND translations_branch IS NOT NULL"))
229-
230+ ProductSeries,
231+ AND(
232+ Product.translations_usage == ServiceUsage.LAUNCHPAD,
233+ Product.translations_branch is not None))
234 # Anything deterministic will do, and even that is only for
235 # testing.
236 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
1=== modified file 'database/sampledata/current-dev.sql'
2--- database/sampledata/current-dev.sql 2010-11-16 22:42:35 +0000
3+++ database/sampledata/current-dev.sql 2010-11-16 22:42:37 +0000
4@@ -1917,7 +1917,7 @@
5 overrideroot=/var/tmp/archive/ubuntu-overrides
6 cacheroot=/var/tmp/archive/ubuntu-cache
7 miscroot=/var/tmp/archive/ubuntu-misc
8-', '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);
9+', '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);
10 INSERT 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);
11 INSERT 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
12 a non commercial distribution of a GNU/Linux Operating System for many
13
14=== modified file 'database/sampledata/current.sql'
15--- database/sampledata/current.sql 2010-11-16 22:42:35 +0000
16+++ database/sampledata/current.sql 2010-11-09 03:12:59 +0000
17@@ -1976,10 +1976,10 @@
18 INSERT 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);
19 INSERT 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);
20 INSERT 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);
21-INSERT 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);
22+INSERT 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);
23 INSERT 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.
24
25-The 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);
26+The 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);
27 INSERT 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);
28 INSERT 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);
29 INSERT 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);
30@@ -1991,11 +1991,11 @@
31 INSERT 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);
32 INSERT 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);
33 INSERT 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);
34-INSERT 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);
35+INSERT 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);
36 INSERT 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.
37
38 The 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);
39-INSERT 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);
40+INSERT 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);
41 INSERT 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);
42 INSERT 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.
43
44
45=== removed file 'database/schema/patch-2208-99-0.sql'
46--- database/schema/patch-2208-99-0.sql 2010-11-16 22:42:35 +0000
47+++ database/schema/patch-2208-99-0.sql 1970-01-01 00:00:00 +0000
48@@ -1,36 +0,0 @@
49--- migrate-official-bool-data sets the _usage enum database columns based on
50--- the values in their respective official_* columns.
51-
52--- usage enums are set if their value is 10 and the corresponding bool
53--- is TRUE.
54-
55--- Set error messages per the wiki.
56-SET client_min_messages=ERROR;
57-
58--- Some constants:
59--- ServiceUsage.UNKNOWN is 10.
60--- ServiceUsage.LAUNCHPAD is 20.
61--- See lp.app.enums for more information.
62-
63--- Translations
64-UPDATE Product
65- SET translations_usage = 20
66- WHERE
67- translations_usage = 10 AND
68- official_rosetta = True;
69-
70--- Answers
71-UPDATE Product
72- SET answers_usage = 20
73- WHERE
74- answers_usage = 10 AND
75- official_answers = True;
76-
77--- Blueprints
78-UPDATE Product
79- SET blueprints_usage = 20
80- WHERE
81- blueprints_usage = 10 AND
82- official_blueprints = True;
83-
84-INSERT INTO LaunchpadDatabaseRevision VALUES (2208, 99, 0);
85
86=== modified file 'lib/canonical/launchpad/database/launchpadstatistic.py'
87--- lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-08 12:52:43 +0000
88+++ lib/canonical/launchpad/database/launchpadstatistic.py 2010-11-16 22:42:37 +0000
89@@ -31,6 +31,7 @@
90 )
91 from lp.answers.interfaces.questionenums import QuestionStatus
92 from lp.answers.model.question import Question
93+from lp.app.enums import ServiceUsage
94 from lp.bugs.model.bug import Bug
95 from lp.bugs.model.bugtask import BugTask
96 from lp.registry.interfaces.person import IPersonSet
97@@ -165,7 +166,7 @@
98 def _updateRosettaStatistics(self, ztm):
99 self.update(
100 'products_using_rosetta',
101- Product.selectBy(official_rosetta=True).count()
102+ Product.selectBy(translations_usage=ServiceUsage.LAUNCHPAD).count()
103 )
104 self.update('potemplate_count', POTemplate.select().count())
105 ztm.commit()
106
107=== modified file 'lib/lp/answers/doc/questionsets.txt'
108--- lib/lp/answers/doc/questionsets.txt 2010-10-18 22:24:59 +0000
109+++ lib/lp/answers/doc/questionsets.txt 2010-11-16 22:42:37 +0000
110@@ -164,6 +164,23 @@
111 Active projects
112 ===============
113
114+Set Up
115+------
116+
117+The test assume some database values have been set for usage enums, so first
118+we'll set those up.
119+
120+ >>> import transaction
121+ >>> from lp.app.enums import ServiceUsage
122+ >>> from lp.registry.interfaces.distribution import IDistributionSet
123+ >>> from lp.registry.interfaces.product import IProductSet
124+ >>> firefox = getUtility(IProductSet).getByName('firefox')
125+ >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
126+ >>> login('admin@canonical.com')
127+ >>> firefox.answers_usage = ServiceUsage.LAUNCHPAD
128+ >>> ubuntu.answers_usage = ServiceUsage.LAUNCHPAD
129+ >>> transaction.commit()
130+
131 This method can be used to retrieve the projects that are the most actively
132 using the Answer Tracker in the last 60 days. By active, we mean that the
133 project is registered as officially using Answers and had some questions asked
134@@ -178,9 +195,7 @@
135 Then some recent questions are created on a number of projects.
136
137 >>> from lp.answers.testing import QuestionFactory
138- >>> from lp.registry.interfaces.distribution import IDistributionSet
139 >>> from lp.registry.interfaces.person import IPersonSet
140- >>> from lp.registry.interfaces.product import IProductSet
141
142 >>> firefox = getUtility(IProductSet).getByName('firefox')
143 >>> landscape = getUtility(IProductSet).getByName('landscape')
144@@ -224,6 +239,7 @@
145 Ubuntu
146 Mozilla Firefox
147
148+
149 The method accepts an optional limit parameter limiting the number of
150 project returned:
151
152
153=== modified file 'lib/lp/answers/model/question.py'
154--- lib/lp/answers/model/question.py 2010-10-03 15:30:06 +0000
155+++ lib/lp/answers/model/question.py 2010-11-16 22:42:37 +0000
156@@ -1,4 +1,4 @@
157-# Copyright 2009 Canonical Ltd. This software is licensed under the
158+# Copyright 2009-2010 Canonical Ltd. This software is licensed under the
159 # GNU Affero General Public License version 3 (see the file LICENSE).
160
161 # pylint: disable-msg=E0611,W0212
162@@ -88,6 +88,7 @@
163 from lp.answers.model.answercontact import AnswerContact
164 from lp.answers.model.questionmessage import QuestionMessage
165 from lp.answers.model.questionsubscription import QuestionSubscription
166+from lp.app.enums import ServiceUsage
167 from lp.bugs.interfaces.buglink import IBugLinkTarget
168 from lp.bugs.interfaces.bugtask import BugTaskStatus
169 from lp.bugs.model.buglinktarget import BugLinkTargetMixin
170@@ -680,8 +681,8 @@
171 LEFT OUTER JOIN Distribution ON (
172 Question.distribution = Distribution.id)
173 WHERE
174- (Product.official_answers is True
175- OR Distribution.official_answers is TRUE)
176+ (Product.answers_usage = %s
177+ OR Distribution.answers_usage = %s)
178 AND Question.datecreated > (
179 current_timestamp -interval '60 days')
180 LIMIT 5000
181@@ -689,7 +690,8 @@
182 GROUP BY product, distribution
183 ORDER BY question_count DESC
184 LIMIT %s
185- """ % sqlvalues(limit))
186+ """ % sqlvalues(
187+ ServiceUsage.LAUNCHPAD, ServiceUsage.LAUNCHPAD, limit))
188
189 projects = []
190 product_set = getUtility(IProductSet)
191@@ -703,6 +705,7 @@
192 raise AssertionError(
193 'product_id and distribution_id are NULL')
194 return projects
195+
196
197 @staticmethod
198 def new(title=None, description=None, owner=None,
199
200=== modified file 'lib/lp/answers/stories/questions-index.txt'
201--- lib/lp/answers/stories/questions-index.txt 2010-09-28 00:07:37 +0000
202+++ lib/lp/answers/stories/questions-index.txt 2010-11-16 22:42:37 +0000
203@@ -1,6 +1,21 @@
204 Answer Tracker Introduction Page
205 ================================
206
207+First, we need to set some values for the later tests.
208+
209+ >>> import transaction
210+ >>> from lp.app.enums import ServiceUsage
211+ >>> from lp.registry.interfaces.distribution import IDistributionSet
212+ >>> from lp.registry.interfaces.product import IProductSet
213+ >>> from zope.component import getUtility
214+ >>> login('admin@canonical.com')
215+ >>> firefox = getUtility(IProductSet).getByName('firefox')
216+ >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
217+ >>> firefox.answers_usage = ServiceUsage.LAUNCHPAD
218+ >>> ubuntu.answers_usage = ServiceUsage.LAUNCHPAD
219+ >>> logout()
220+ >>> transaction.commit()
221+
222 >>> anon_browser.open('http://answers.launchpad.dev/')
223 >>> print anon_browser.title
224 Launchpad Answers
225
226=== modified file 'lib/lp/registry/doc/product.txt'
227--- lib/lp/registry/doc/product.txt 2010-11-02 05:48:54 +0000
228+++ lib/lp/registry/doc/product.txt 2010-11-16 22:42:37 +0000
229@@ -26,6 +26,16 @@
230
231 >>> productset = getUtility(IProductSet)
232
233+We also need to do some setup for other tests, which need alsa-utils
234+configured for services.
235+
236+ >>> from lp.app.enums import ServiceUsage
237+ >>> evolution = getUtility(IProductSet).getByName('evolution')
238+ >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
239+ >>> alsa = getUtility(IProductSet).getByName('alsa-utils')
240+ >>> alsa.translations_usage = ServiceUsage.LAUNCHPAD
241+ >>> transaction.commit()
242+
243 Verify that p (a Product object) correctly implements IProduct.
244
245 >>> p = productset.get(5)
246
247=== modified file 'lib/lp/registry/doc/projectgroup.txt'
248--- lib/lp/registry/doc/projectgroup.txt 2010-11-01 03:36:04 +0000
249+++ lib/lp/registry/doc/projectgroup.txt 2010-11-16 22:42:37 +0000
250@@ -13,6 +13,17 @@
251 ... )
252 >>> projectset = getUtility(IProjectGroupSet)
253
254+ # Some setup
255+ >>> import transaction
256+ >>> from lp.app.enums import ServiceUsage
257+ >>> from lp.registry.interfaces.product import IProductSet
258+ >>> from zope.component import getUtility
259+ >>> login('admin@canonical.com')
260+ >>> evolution = getUtility(IProductSet).getByName('evolution')
261+ >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
262+ >>> logout()
263+ >>> login('test@canonical.com')
264+ >>> transaction.commit()
265
266 Creating new projects
267 ---------------------
268
269=== modified file 'lib/lp/registry/model/product.py'
270--- lib/lp/registry/model/product.py 2010-11-08 01:08:15 +0000
271+++ lib/lp/registry/model/product.py 2010-11-16 22:42:37 +0000
272@@ -1571,8 +1571,9 @@
273 Product.id == ProductSeries.productID,
274 POTemplate.productseriesID == ProductSeries.id,
275 Product.official_rosetta == True,
276- Person.id == Product._ownerID,
277- ).config(distinct=True).order_by(Product.title)
278+ Person.id == Product._ownerID).config(
279+ distinct=True).order_by(Product.title)
280+
281
282 # We only want Product - the other tables are just to populate
283 # the cache.
284@@ -1590,12 +1591,12 @@
285 ProductSeries.Product = Product.id
286 JOIN POTemplate ON
287 POTemplate.productseries = ProductSeries.id
288- WHERE Product.active AND Product.official_rosetta
289+ WHERE Product.active AND Product.translations_usage = %s
290 ORDER BY place
291 ) AS randomized_products
292 LIMIT %s
293 )
294- ''' % quote(maximumproducts),
295+ ''' % sqlvalues(ServiceUsage.LAUNCHPAD, maximumproducts),
296 distinct=True,
297 orderBy='Product.title')
298
299
300=== modified file 'lib/lp/registry/model/projectgroup.py'
301--- lib/lp/registry/model/projectgroup.py 2010-11-09 08:43:34 +0000
302+++ lib/lp/registry/model/projectgroup.py 2010-11-16 22:42:37 +0000
303@@ -184,17 +184,12 @@
304
305 def translatables(self):
306 """See `IProjectGroup`."""
307- # XXX j.c.sackett 2010-08-30 bug=627631: Once data migration has
308- # happened for the usage enums, this sql needs to be updated to
309- # check for the translations_usage, not official_rosetta. At that
310- # time it should also be converted to a Storm query and the issue with
311- # has_translatables resolved.
312 return Product.select('''
313 Product.project = %s AND
314- Product.official_rosetta = TRUE AND
315+ Product.translations_usage = %s AND
316 Product.id = ProductSeries.product AND
317 POTemplate.productseries = ProductSeries.id
318- ''' % sqlvalues(self),
319+ ''' % sqlvalues(self, ServiceUsage.LAUNCHPAD),
320 clauseTables=['ProductSeries', 'POTemplate'],
321 distinct=True)
322
323
324=== modified file 'lib/lp/translations/doc/translationsoverview.txt'
325--- lib/lp/translations/doc/translationsoverview.txt 2010-10-18 22:24:59 +0000
326+++ lib/lp/translations/doc/translationsoverview.txt 2010-11-16 22:42:37 +0000
327@@ -67,6 +67,24 @@
328 Getting the most translated pillars
329 -----------------------------------
330
331+Set Up
332+......
333+
334+The following demo assumes the test data has official_translations set.
335+Let's set that up.
336+
337+ >>> from lp.app.enums import ServiceUsage
338+ >>> evolution = getUtility(IProductSet).getByName('evolution')
339+ >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
340+ >>> alsa = getUtility(IProductSet).getByName('alsa-utils')
341+ >>> alsa.translations_usage = ServiceUsage.LAUNCHPAD
342+ >>> ubuntu = getUtility(IDistributionSet).getByName('ubuntu')
343+ >>> ubuntu.translations_usage = ServiceUsage.LAUNCHPAD
344+ >>> transaction.commit()
345+
346+Using getMostTranslatedPillars
347+..............................
348+
349 Method getMostTranslatedPillars() returns a list of dicts listing
350 pillars with most translations karma so far, along with a relative
351 weight for each of the pillars in the range of [overview.MINIMUM_SIZE,
352
353=== modified file 'lib/lp/translations/model/translationsoverview.py'
354--- lib/lp/translations/model/translationsoverview.py 2010-08-31 23:03:45 +0000
355+++ lib/lp/translations/model/translationsoverview.py 2010-11-16 22:42:37 +0000
356@@ -6,7 +6,11 @@
357
358 from zope.interface import implements
359
360-from canonical.database.sqlbase import cursor
361+from canonical.database.sqlbase import (
362+ cursor,
363+ sqlvalues,
364+ )
365+from lp.app.enums import ServiceUsage
366 from lp.registry.model.distribution import Distribution
367 from lp.registry.model.product import Product
368 from lp.translations.interfaces.translationsoverview import (
369@@ -45,9 +49,6 @@
370 def getMostTranslatedPillars(self, limit=50):
371 """See `ITranslationsOverview`."""
372
373- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
374- # happened for the usage enums, this sql needs to be updated
375- # to check for the translations_usage, not official_rosetta.
376 query = """
377 SELECT LOWER(COALESCE(product_name, distro_name)) AS name,
378 product_id,
379@@ -67,14 +68,16 @@
380 distribution=distribution.id
381 WHERE category=3 AND
382 (product IS NOT NULL OR distribution IS NOT NULL) AND
383- (product.official_rosetta OR
384- distribution.official_rosetta)
385+ (product.translations_usage = %s OR
386+ distribution.translations_usage = %s)
387 GROUP BY product.displayname, product.id,
388 distribution.displayname, distribution.id
389 HAVING SUM(karmavalue) > 0
390 ORDER BY total_karma DESC
391- LIMIT %d) AS something
392- ORDER BY name""" % int(limit)
393+ LIMIT %s) AS something
394+ ORDER BY name""" % sqlvalues(ServiceUsage.LAUNCHPAD,
395+ ServiceUsage.LAUNCHPAD,
396+ limit)
397 cur = cursor()
398 cur.execute(query)
399
400
401=== modified file 'lib/lp/translations/model/translationsperson.py'
402--- lib/lp/translations/model/translationsperson.py 2010-11-05 14:56:34 +0000
403+++ lib/lp/translations/model/translationsperson.py 2010-11-16 22:42:37 +0000
404@@ -260,9 +260,6 @@
405 The added joins may make the overall query non-distinct, so be
406 sure to enforce distinctness.
407 """
408- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
409- # happened for the usage enums, this query needs to be updated
410- # to check for the translations_usage, not official_rosetta.
411
412 POTemplateJoin = Join(POTemplate, And(
413 POTemplate.id == POFile.potemplateID,
414
415=== modified file 'lib/lp/translations/scripts/translations_to_branch.py'
416--- lib/lp/translations/scripts/translations_to_branch.py 2010-10-02 11:41:43 +0000
417+++ lib/lp/translations/scripts/translations_to_branch.py 2010-11-16 22:42:37 +0000
418@@ -306,9 +306,6 @@
419
420 self.store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
421
422- # XXX j.c.sackett 2010-08-30 bug=627631 Once data migration has
423- # happened for the usage enums, this sql needs to be updated to
424- # check for the translations_usage, not official_rosetta.
425 product_join = Join(
426 ProductSeries, Product, ProductSeries.product == Product.id)
427 productseries = self.store.using(product_join).find(
428
429=== modified file 'lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt'
430--- lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt 2009-11-07 07:46:54 +0000
431+++ lib/lp/translations/stories/standalone/xx-rosetta-homepage.txt 2010-11-16 22:42:37 +0000
432@@ -1,4 +1,21 @@
433-= Translations front page =
434+Translations front page
435+=======================
436+
437+Set up
438+------
439+
440+ >>> import transaction
441+ >>> from lp.app.enums import ServiceUsage
442+ >>> from lp.registry.interfaces.product import IProductSet
443+ >>> from zope.component import getUtility
444+ >>> login('admin@canonical.com')
445+ >>> evolution = getUtility(IProductSet).getByName('evolution')
446+ >>> evolution.translations_usage = ServiceUsage.LAUNCHPAD
447+ >>> logout()
448+ >>> transaction.commit()
449+
450+The front page
451+--------------
452
453 >>> browser.open('http://translations.launchpad.dev/')
454 >>> print browser.title

Subscribers

People subscribed via source and target branches

to status/vote changes: