~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/registry/vocabularies.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-07-29 18:11:29 UTC
  • mfrom: (13543.7.1 bug-818032)
  • Revision ID: launchpad@pqm.canonical.com-20110729181129-zvc1nlx8jprha429
[r=bac][bug=818032] Disable Upgrade Packages button.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
    'DistributionSourcePackageVocabulary',
34
34
    'DistributionVocabulary',
35
35
    'DistroSeriesDerivationVocabulary',
36
 
    'DistroSeriesDifferencesVocabulary',
37
36
    'DistroSeriesVocabulary',
38
37
    'FeaturedProjectVocabulary',
39
38
    'FilteredDistroSeriesVocabulary',
139
138
    IDistributionSourcePackage,
140
139
    )
141
140
from lp.registry.interfaces.distroseries import IDistroSeries
142
 
from lp.registry.interfaces.distroseriesdifference import (
143
 
    IDistroSeriesDifference,
144
 
    )
145
141
from lp.registry.interfaces.mailinglist import (
146
142
    IMailingListSet,
147
143
    MailingListStatus,
171
167
from lp.registry.interfaces.sourcepackage import ISourcePackage
172
168
from lp.registry.model.distribution import Distribution
173
169
from lp.registry.model.distroseries import DistroSeries
174
 
from lp.registry.model.distroseriesdifference import DistroSeriesDifference
175
170
from lp.registry.model.distroseriesparent import DistroSeriesParent
176
171
from lp.registry.model.featuredproject import FeaturedProject
177
172
from lp.registry.model.karma import KarmaCategory
199
194
from lp.soyuz.model.binarypackagename import BinaryPackageName
200
195
from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease
201
196
from lp.soyuz.model.distroarchseries import DistroArchSeries
202
 
from lp.soyuz.model.publishing import SourcePackagePublishingHistory
 
197
from lp.soyuz.model.publishing import (
 
198
    SourcePackagePublishingHistory,
 
199
    )
203
200
from lp.soyuz.model.sourcepackagerelease import SourcePackageRelease
204
201
 
205
202
 
1869
1866
            return self.find_terms(where)
1870
1867
 
1871
1868
 
1872
 
class DistroSeriesDifferencesVocabulary:
1873
 
    """A vocabulary source for differences relating to a series.
1874
 
 
1875
 
    Specifically, all `DistroSeriesDifference`s relating to a derived series.
1876
 
    """
1877
 
 
1878
 
    implements(IHugeVocabulary)
1879
 
 
1880
 
    displayname = "Choose a difference"
1881
 
    step_title = 'Search'
1882
 
 
1883
 
    def __init__(self, context):
1884
 
        """Create a new vocabulary for the context.
1885
 
 
1886
 
        :type context: `IDistroSeries`.
1887
 
        """
1888
 
        assert IDistroSeries.providedBy(context)
1889
 
        self.distroseries = context
1890
 
 
1891
 
    def __len__(self):
1892
 
        """See `IIterableVocabulary`."""
1893
 
        return self.searchForDifferences().count()
1894
 
 
1895
 
    def __iter__(self):
1896
 
        """See `IIterableVocabulary`."""
1897
 
        for difference in self.searchForDifferences():
1898
 
            yield self.toTerm(difference)
1899
 
 
1900
 
    def __contains__(self, value):
1901
 
        """See `IVocabulary`."""
1902
 
        return (
1903
 
            IDistroSeriesDifference.providedBy(value) and
1904
 
            value.derived_series == self.distroseries)
1905
 
 
1906
 
    def getTerm(self, value):
1907
 
        """See `IVocabulary`."""
1908
 
        if value not in self:
1909
 
            raise LookupError(value)
1910
 
        return self.toTerm(value)
1911
 
 
1912
 
    def getTermByToken(self, token):
1913
 
        """See `IVocabularyTokenized`."""
1914
 
        if not token.isdigit():
1915
 
            raise LookupError(token)
1916
 
        difference = IStore(DistroSeriesDifference).get(
1917
 
            DistroSeriesDifference, int(token))
1918
 
        if difference is None:
1919
 
            raise LookupError(token)
1920
 
        elif difference.derived_series != self.distroseries:
1921
 
            raise LookupError(token)
1922
 
        else:
1923
 
            return self.toTerm(difference)
1924
 
 
1925
 
    @staticmethod
1926
 
    def toTerm(dsd):
1927
 
        """Return the term for a `DistroSeriesDifference`."""
1928
 
        return SimpleTerm(dsd, dsd.id)
1929
 
 
1930
 
    def searchForTerms(self, query=None):
1931
 
        """See `IHugeVocabulary`."""
1932
 
        results = self.searchForDifferences()
1933
 
        return CountableIterator(results.count(), results, self.toTerm)
1934
 
 
1935
 
    def searchForDifferences(self):
1936
 
        """The set of `DistroSeriesDifference`s related to the context.
1937
 
 
1938
 
        :return: `IResultSet` yielding `IDistroSeriesDifference`.
1939
 
        """
1940
 
        return DistroSeriesDifference.getForDistroSeries(self.distroseries)
1941
 
 
1942
 
 
1943
1869
class PillarVocabularyBase(NamedSQLObjectHugeVocabulary):
1944
1870
    """Active `IPillar` objects vocabulary."""
1945
1871
    displayname = 'Needs to be overridden'
1946
1872
    _table = PillarName
1947
 
    _limit = 100
 
1873
    _orderBy = 'name'
1948
1874
 
1949
1875
    def toTerm(self, obj):
1950
1876
        """See `IVocabulary`."""
1951
 
        if type(obj) == int:
1952
 
            return self.toTerm(PillarName.get(obj))
1953
1877
        if IPillarName.providedBy(obj):
1954
1878
            assert obj.active, 'Inactive object %s %d' % (
1955
1879
                    obj.__class__.__name__, obj.id)
1970
1894
    def __contains__(self, obj):
1971
1895
        raise NotImplementedError
1972
1896
 
1973
 
    def searchForTerms(self, query=None):
1974
 
        if not query:
1975
 
            return self.emptySelectResults()
1976
 
        query = ensure_unicode(query).lower()
1977
 
        store = IStore(PillarName)
1978
 
        equal_clauses = [PillarName.name == query]
1979
 
        like_clauses = [
1980
 
            PillarName.name != query, PillarName.name.contains_string(query)]
1981
 
        if self._filter:
1982
 
            equal_clauses.extend(self._filter)
1983
 
            like_clauses.extend(self._filter)
1984
 
        ranked_results = store.execute(
1985
 
            Union(
1986
 
                Select(
1987
 
                    (PillarName.id, PillarName.name, SQL('100 AS rank')),
1988
 
                    tables=[PillarName],
1989
 
                    where=And(*equal_clauses)),
1990
 
                Select(
1991
 
                    (PillarName.id, PillarName.name, SQL('50 AS rank')),
1992
 
                    tables=[PillarName],
1993
 
                    where=And(*like_clauses)),
1994
 
                limit=self._limit, order_by=(
1995
 
                    Desc(SQL('rank')), PillarName.name), all=True))
1996
 
        results = [row[0] for row in list(ranked_results)]
1997
 
        return self.iterator(len(results), results, self.toTerm)
1998
 
 
1999
1897
 
2000
1898
class DistributionOrProductVocabulary(PillarVocabularyBase):
2001
1899
    """Active `IDistribution` or `IProduct` objects vocabulary."""
2002
1900
    displayname = 'Select a project'
2003
 
    _filter = [PillarName.project == None, PillarName.active == True]
 
1901
    _filter = """
 
1902
        -- An active product/distro.
 
1903
        ((active IS TRUE
 
1904
         AND (product IS NOT NULL OR distribution IS NOT NULL)
 
1905
        )
 
1906
        OR
 
1907
        -- Or an alias for an active product/distro.
 
1908
        (alias_for IN (
 
1909
            SELECT id FROM PillarName
 
1910
            WHERE active IS TRUE AND
 
1911
                (product IS NOT NULL OR distribution IS NOT NULL))
 
1912
        ))
 
1913
        """
2004
1914
 
2005
1915
    def __contains__(self, obj):
2006
1916
        if IProduct.providedBy(obj):
2013
1923
class DistributionOrProductOrProjectGroupVocabulary(PillarVocabularyBase):
2014
1924
    """Active `IProduct`, `IProjectGroup` or `IDistribution` vocabulary."""
2015
1925
    displayname = 'Select a project'
2016
 
    _filter = [PillarName.active == True]
 
1926
    _filter = PillarName.q.active == True
2017
1927
 
2018
1928
    def __contains__(self, obj):
2019
1929
        if IProduct.providedBy(obj) or IProjectGroup.providedBy(obj):