1
# Copyright 2009-2011 Canonical Ltd. This software is licensed under the GNU
2
# Affero General Public License version 3 (see the file LICENSE).
4
"""Soyuz vocabularies."""
10
'FilteredDistroArchSeriesVocabulary',
11
'PackageReleaseVocabulary',
13
'ProcessorFamilyVocabulary',
14
'ProcessorVocabulary',
17
from sqlobject import AND
18
from storm.expr import SQL
19
from zope.component import getUtility
20
from zope.interface import implements
21
from zope.schema.vocabulary import SimpleTerm
23
from canonical.database.sqlbase import (
27
from canonical.launchpad.webapp.interfaces import ILaunchBag
28
from canonical.launchpad.webapp.vocabulary import (
30
NamedSQLObjectVocabulary,
31
SQLObjectVocabularyBase,
33
from lp.registry.model.person import Person
34
from lp.soyuz.enums import ArchivePurpose
35
from lp.soyuz.model.archive import Archive
36
from lp.soyuz.model.component import Component
37
from lp.soyuz.model.distroarchseries import DistroArchSeries
38
from lp.soyuz.model.processor import (
42
from lp.soyuz.model.sourcepackagerelease import SourcePackageRelease
45
class ComponentVocabulary(SQLObjectVocabularyBase):
50
def toTerm(self, obj):
51
return SimpleTerm(obj, obj.id, obj.name)
54
class FilteredDistroArchSeriesVocabulary(SQLObjectVocabularyBase):
55
"""All arch series of a particular distribution."""
57
_table = DistroArchSeries
58
_orderBy = ['DistroSeries.version', 'architecturetag', 'id']
59
_clauseTables = ['DistroSeries']
61
def toTerm(self, obj):
62
name = "%s %s (%s)" % (obj.distroseries.distribution.name,
63
obj.distroseries.name, obj.architecturetag)
64
return SimpleTerm(obj, obj.id, name)
67
distribution = getUtility(ILaunchBag).distribution
70
DistroSeries.id = DistroArchSeries.distroseries AND
71
DistroSeries.distribution = %s
72
""" % sqlvalues(distribution.id)
73
results = self._table.select(
74
query, orderBy=self._orderBy, clauseTables=self._clauseTables)
75
for distroarchseries in results:
76
yield self.toTerm(distroarchseries)
79
class PackageReleaseVocabulary(SQLObjectVocabularyBase):
80
_table = SourcePackageRelease
83
def toTerm(self, obj):
85
obj, obj.id, obj.name + " " + obj.version)
88
class PPAVocabulary(SQLObjectVocabularyBase):
90
implements(IHugeVocabulary)
93
_orderBy = ['Person.name, Archive.name']
94
_clauseTables = ['Person']
96
Person.q.id == Archive.q.ownerID,
97
Archive.q.purpose == ArchivePurpose.PPA)
98
displayname = 'Select a PPA'
101
def toTerm(self, archive):
102
"""See `IVocabulary`."""
103
description = archive.description
104
if description is not None:
105
summary = description.splitlines()[0]
107
summary = "No description available"
109
token = '%s/%s' % (archive.owner.name, archive.name)
111
return SimpleTerm(archive, token, summary)
113
def getTermByToken(self, token):
114
"""See `IVocabularyTokenized`."""
116
owner_name, archive_name = token.split('/')
118
raise LookupError(token)
122
Person.name == owner_name,
123
Archive.name == archive_name)
125
obj = self._table.selectOne(
126
clause, clauseTables=self._clauseTables)
129
raise LookupError(token)
131
return self.toTerm(obj)
133
def search(self, query, vocab_filter=None):
134
"""Return a resultset of archives.
136
This is a helper required by `SQLObjectVocabularyBase.searchForTerms`.
139
return self.emptySelectResults()
141
query = query.lower()
144
owner_name, archive_name = query.split('/')
148
SQL("(Archive.fti @@ ftq(%s) OR Person.fti @@ ftq(%s))"
149
% (quote(query), quote(query))))
153
Person.name == owner_name,
154
Archive.name == archive_name)
156
return self._table.select(
157
clause, orderBy=self._orderBy, clauseTables=self._clauseTables)
160
class ProcessorVocabulary(NamedSQLObjectVocabulary):
162
displayname = 'Select a processor'
167
class ProcessorFamilyVocabulary(NamedSQLObjectVocabulary):
168
displayname = 'Select a processor family'
169
_table = ProcessorFamily