1
# Copyright 2010 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""The implementation of the branch cloud."""
12
from datetime import datetime, timedelta
15
from storm.expr import (
19
from storm.locals import (
25
from zope.interface import classProvides
28
from canonical.launchpad.interfaces.lpstorm import ISlaveStore
30
from lp.code.interfaces.branch import IBranchCloud
31
from lp.code.model.revision import RevisionCache
32
from lp.registry.model.product import Product
36
"""See `IBranchCloud`."""
38
classProvides(IBranchCloud)
41
def getProductsWithInfo(num_products=None, store=None):
42
"""See `IBranchCloud`."""
43
# It doesn't matter if this query is even a whole day out of date, so
44
# use the slave store by default.
46
store = ISlaveStore(RevisionCache)
47
distinct_revision_author = Func(
48
"distinct", RevisionCache.revision_author_id)
49
commits = Alias(Count(RevisionCache.revision_id))
50
epoch = datetime.now(pytz.UTC) - timedelta(days=30)
54
Count(distinct_revision_author),
55
Max(RevisionCache.revision_date)),
56
RevisionCache.product == Product.id,
57
Not(RevisionCache.private),
58
RevisionCache.revision_date >= epoch)
59
result = result.group_by(Product.name)
60
result = result.order_by(Desc(commits))
62
result.config(limit=num_products)