1
# Copyright 2011 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""BugSummary Storm database classes."""
9
'CombineBugSummaryConstraint',
12
from storm.locals import (
20
from zope.interface import implements
21
from zope.security.proxy import removeSecurityProxy
23
from canonical.database.enumcol import EnumCol
24
from lp.bugs.interfaces.bugsummary import (
28
from lp.bugs.interfaces.bugtask import (
33
from lp.registry.model.distribution import Distribution
34
from lp.registry.model.distroseries import DistroSeries
35
from lp.registry.model.milestone import Milestone
36
from lp.registry.model.person import Person
37
from lp.registry.model.product import Product
38
from lp.registry.model.productseries import ProductSeries
39
from lp.registry.model.sourcepackagename import SourcePackageName
42
class BugSummary(Storm):
43
"""BugSummary Storm database class."""
45
implements(IBugSummary)
47
__storm_table__ = 'combinedbugsummary'
49
id = Int(primary=True)
52
product_id = Int(name='product')
53
product = Reference(product_id, Product.id)
55
productseries_id = Int(name='productseries')
56
productseries = Reference(productseries_id, ProductSeries.id)
58
distribution_id = Int(name='distribution')
59
distribution = Reference(distribution_id, Distribution.id)
61
distroseries_id = Int(name='distroseries')
62
distroseries = Reference(distroseries_id, DistroSeries.id)
64
sourcepackagename_id = Int(name='sourcepackagename')
65
sourcepackagename = Reference(sourcepackagename_id, SourcePackageName.id)
67
milestone_id = Int(name='milestone')
68
milestone = Reference(milestone_id, Milestone.id)
71
dbName='status', schema=(BugTaskStatus, BugTaskStatusSearch))
73
importance = EnumCol(dbName='importance', schema=BugTaskImportance)
77
viewed_by_id = Int(name='viewed_by')
78
viewed_by = Reference(viewed_by_id, Person.id)
81
fixed_upstream = Bool()
84
class CombineBugSummaryConstraint:
85
"""A class to combine two separate bug summary constraints.
87
This is useful for querying on multiple related dimensions (e.g. milestone
88
+ sourcepackage) - and essential when a dimension is not unique to a
92
implements(IBugSummaryDimension)
94
def __init__(self, *dimensions):
95
self.dimensions = map(
97
removeSecurityProxy(x.getBugSummaryContextWhereClause()),
100
def getBugSummaryContextWhereClause(self):
101
"""See `IBugSummaryDimension`."""
102
return And(*self.dimensions)