Merge lp:~jcsackett/launchpad/convert-sql-627631 into lp:launchpad/db-devel
- convert-sql-627631
- Merge into db-devel
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Edwin Grubbs (community) | code | Approve | |
Review via email: mp+40021@code.launchpad.net |
Commit message
[r=edwin-
Description of the change
Summary
=======
There's an ongoing effort to phase out the official_* booleans which indicate how a product/
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
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
j.c.sackett (jcsackett) wrote : | # |
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/
>> --- lib/lp/
>> +++ lib/lp/
>> @@ -680,8 +681,8 @@
>> LEFT OUTER JOIN Distribution ON (
>> Question.
>> WHERE
>> - (Product.
>> - OR Distribution.
>> + (Product.
>
>
> Trailing whitespace.
>
>
>> + OR Distribution.
>> AND Question.
>> 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.
>>
>> projects = []
>> product_set = getUtility(
>>
>> === modified file 'lib/lp/
>> --- lib/lp/
>> +++ lib/lp/
>> @@ -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(
>> """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/
>> --- lib/lp/
>> +++ lib/lp/
>> @@ -67,14 +65,16 @@
>> distribution=
>> WHERE category=3 AND
>> (product IS NOT NULL OR distribution IS NOT NULL) AND
>> - (product.
>> - distribution.
>> + (product.
>> + distribution.
>> GROUP BY product.
>> distribution.
>> HAVING SUM...
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) |
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/
>--- lib/lp/
>+++ lib/lp/
>
> def has_translatabl
> """See `IProjectGroup`."""
>@@ -205,7 +201,7 @@
> # converted to use is_empty but the implementation in storm's
> # sqlobject wrapper is broken.
> # return not self.translatab
It looks like this comment can also be removed now.
>- return self.translatab
>+ return self.translatab
>
> def has_branches(self):
> """ See `IProjectGroup`."""
>
>=== modified file 'lib/lp/
>--- lib/lp/
>+++ lib/lp/
>@@ -306,15 +306,13 @@
>
> self.store = getUtility(
>
>- # 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.
> productseries = self.store.
>- ProductSeries, SQL(
>- "official_rosetta AND translations_branch IS NOT NULL"))
>-
>+ ProductSeries,
>+ AND(
>+ Product.
>+ Product.
You can't use "is not None" for a storm conditional, since python does
not allow that operator to be overridden. Instead use
and storm will be smart enough to change it to "IS NOT NULL".
Preview Diff
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 |
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' answers/ model/question. py 2010-10-03 15:30:06 +0000 answers/ model/question. py 2010-11-03 21:39:12 +0000 distribution = Distribution.id) official_ answers is True official_ answers is TRUE) answers_ usage = %s
>--- lib/lp/
>+++ lib/lp/
>@@ -680,8 +681,8 @@
> LEFT OUTER JOIN Distribution ON (
> Question.
> WHERE
>- (Product.
>- OR Distribution.
>+ (Product.
Trailing whitespace.
>+ OR Distribution. answers_ usage = %s) datecreated > ( LAUNCHPAD, ServiceUsage. LAUNCHPAD, limit)) IProductSet) registry/ model/projectgr oup.py' registry/ model/projectgr oup.py 2010-11-02 20:10:56 +0000 registry/ model/projectgr oup.py 2010-11-03 21:39:12 +0000
> AND Question.
> 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.
>
> projects = []
> product_set = getUtility(
>
>=== modified file 'lib/lp/
>--- lib/lp/
>+++ lib/lp/
>@@ -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(''' official_ rosetta = TRUE AND translations_ usage = %s AND product AND productseries = ProductSeries.id LAUNCHPAD) , ['ProductSeries ', 'POTemplate'], translations/ model/translati onsoverview. py' translations/ model/translati onsoverview. py 2010-08-31 23:03:45 +0000 translations/ model/translati onsoverview. py 2010-11-03 21:39:12 +0000 distribution. id official_ rosetta OR official_ rosetta) translations_ usage = %s OR tranlsations_ usage = %s) displayname, product.id,
> Product.project = %s AND
>- Product.
>+ Product.
> Product.id = ProductSeries.
> POTemplate.
>- ''' % sqlvalues(self),
>+ ''' % sqlvalues(self, ServiceUsage.
> clauseTables=
> distinct=True)
>
>
>=== modified file 'lib/lp/
>--- lib/lp/
>+++ lib/lp/
>@@ -67,14 +65,16 @@
> distribution=
> WHERE category=3 AND
> (product IS NOT NULL OR distribution IS NOT NULL) AND
>- (product.
>- distribution.
>+ (product.
>+ distribution.
> GROUP BY product.
...