~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/registry/model/distribution.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-07-22 05:56:29 UTC
  • mfrom: (13492.1.1 revert-r13485)
  • Revision ID: launchpad@pqm.canonical.com-20110722055629-0y8ss6zvhjcoo12r
[r=wgrant][rollback=13485] Revert r13485. It prevents form pickers
 from being attached to their text widgets.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
 
1
# Copyright 2009-2010 Canonical Ltd.  This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
3
 
4
4
# pylint: disable-msg=E0611,W0212
157
157
    DistributionSourcePackage,
158
158
    )
159
159
from lp.registry.model.distroseries import DistroSeries
160
 
from lp.registry.model.distroseriesparent import DistroSeriesParent
161
160
from lp.registry.model.hasdrivers import HasDriversMixin
162
161
from lp.registry.model.karma import KarmaContextMixin
163
162
from lp.registry.model.milestone import (
656
655
        """See `IBugTarget`."""
657
656
        return get_bug_tags("BugTask.distribution = %s" % sqlvalues(self))
658
657
 
659
 
    def getBranchTips(self, user=None, since=None):
 
658
    def getBranchTips(self, since=None):
660
659
        """See `IDistribution`."""
661
 
        # This, ignoring privacy issues, is what we want.
662
 
        base_query = """
663
 
        SELECT Branch.unique_name,
664
 
               Branch.last_scanned_id,
665
 
               SPBDS.name AS distro_series_name,
666
 
               Branch.id,
667
 
               Branch.private,
668
 
               Branch.owner
669
 
        FROM Branch
670
 
        JOIN DistroSeries
671
 
            ON Branch.distroseries = DistroSeries.id
672
 
        LEFT OUTER JOIN SeriesSourcePackageBranch
673
 
            ON Branch.id = SeriesSourcePackageBranch.branch
674
 
        LEFT OUTER JOIN DistroSeries SPBDS
675
 
            -- (SPDBS stands for Source Package Branch Distro Series)
676
 
            ON SeriesSourcePackageBranch.distroseries = SPBDS.id
677
 
        WHERE DistroSeries.distribution = %s
678
 
        """ % sqlvalues(self.id)
 
660
        query = """
 
661
            SELECT unique_name, last_scanned_id, SPBDS.name FROM Branch
 
662
            JOIN DistroSeries
 
663
                ON Branch.distroseries = DistroSeries.id
 
664
            LEFT OUTER JOIN SeriesSourcePackageBranch
 
665
                ON Branch.id = SeriesSourcePackageBranch.branch
 
666
            LEFT OUTER JOIN DistroSeries SPBDS
 
667
                -- (SPDBS stands for Source Package Branch Distro Series)
 
668
                ON SeriesSourcePackageBranch.distroseries = SPBDS.id
 
669
            WHERE DistroSeries.distribution = %s""" % sqlvalues(self.id)
 
670
 
679
671
        if since is not None:
680
 
            # If "since" was provided, take into account.
681
 
            base_query += (
682
 
                '      AND branch.last_scanned > %s\n' % sqlvalues(since))
683
 
        if user is None:
684
 
            # Now we see just a touch of privacy concerns.
685
 
            # If the current user is anonymous, they cannot see any private
686
 
            # branches.
687
 
            base_query += ('      AND NOT Branch.private\n')
688
 
        # We want to order the results, in part for easier grouping at the
689
 
        # end.
690
 
        base_query += 'ORDER BY unique_name, last_scanned_id'
691
 
        if (user is None or
692
 
            user.inTeam(getUtility(ILaunchpadCelebrities).admin)):
693
 
            # Anonymous is already handled above; admins can see everything.
694
 
            # In both cases, we can just use the query as it already stands.
695
 
            query = base_query
696
 
        else:
697
 
            # Otherwise (an authenticated, non-admin user), we need to do some
698
 
            # more sophisticated privacy dances.  Note that the one thing we
699
 
            # are ignoring here is stacking.  See the discussion in comment 1
700
 
            # of https://bugs.launchpad.net/launchpad/+bug/812335 . Often, we
701
 
            # use unions for this kind of work.  The WITH statement can give
702
 
            # us a similar approach with more flexibility. In both cases,
703
 
            # we're essentially declaring that we have a better idea of a good
704
 
            # high-level query plan than Postgres will.
705
 
            query = """
706
 
            WITH principals AS (
707
 
                    SELECT team AS id
708
 
                        FROM TeamParticipation
709
 
                        WHERE TeamParticipation.person = %(user)s
710
 
                    UNION
711
 
                    SELECT %(user)s
712
 
                ), all_branches AS (
713
 
            %(base_query)s
714
 
                ), private_branches AS (
715
 
                    SELECT unique_name,
716
 
                           last_scanned_id,
717
 
                           distro_series_name,
718
 
                           id,
719
 
                           owner
720
 
                    FROM all_branches
721
 
                    WHERE private
722
 
                ), owned_branch_ids AS (
723
 
                    SELECT private_branches.id
724
 
                    FROM private_branches
725
 
                    JOIN principals ON private_branches.owner = principals.id
726
 
                ), subscribed_branch_ids AS (
727
 
                    SELECT private_branches.id
728
 
                    FROM private_branches
729
 
                    JOIN BranchSubscription
730
 
                        ON BranchSubscription.branch = private_branches.id
731
 
                    JOIN principals
732
 
                        ON BranchSubscription.person = principals.id
733
 
                )
734
 
            SELECT unique_name, last_scanned_id, distro_series_name
735
 
            FROM all_branches
736
 
            WHERE NOT private OR
737
 
                  id IN (SELECT id FROM owned_branch_ids) OR
738
 
                  id IN (SELECT id FROM subscribed_branch_ids)
739
 
            """ % dict(base_query=base_query, user=quote(user.id))
740
 
 
741
 
        data = Store.of(self).execute(query + ';')
 
672
            query += (
 
673
                ' AND branch.last_scanned > %s' % sqlvalues(since))
 
674
 
 
675
        query += ' ORDER BY unique_name, last_scanned_id;'
 
676
 
 
677
        data = Store.of(self).execute(query)
742
678
 
743
679
        result = []
744
680
        # Group on location (unique_name) and revision (last_scanned_id).
746
682
            result.append(list(key))
747
683
            # Pull out all the official series names and append them as a list
748
684
            # to the end of the current record, removing Nones from the list.
749
 
            result[-1].append(filter(None, map(itemgetter(2), group)))
 
685
            result[-1].append(filter(None, map(itemgetter(-1), group)))
750
686
        return result
751
687
 
752
688
    def getMirrorByName(self, name):
2057
1993
            result[sourcepackage] = DistributionSourcePackageRelease(
2058
1994
                distro, sp_release)
2059
1995
        return result
2060
 
 
2061
 
    def getDerivedDistributions(self):
2062
 
        """See `IDistributionSet`."""
2063
 
        ubuntu_id = getUtility(ILaunchpadCelebrities).ubuntu.id
2064
 
        return IStore(DistroSeries).find(
2065
 
            Distribution,
2066
 
            Distribution.id == DistroSeries.distributionID,
2067
 
            DistroSeries.id == DistroSeriesParent.derived_series_id,
2068
 
            DistroSeries.distributionID != ubuntu_id).config(distinct=True)