def test_sourcepackage_to_distribution_dsp(self): # A distribution can be retrieved from a dsp. package = self.factory.makeDistributionSourcePackage() distribution = sourcepackage_to_distribution(package) self.assertTrue(IDistribution.providedBy(distribution)) self.assertEqual(package.distribution, distribution) self.assertEqual(package.distribution, IDistribution(package))
def test_distroseries_to_distribution(self): # distroseries_to_distribution() returns an IDistribution given an # IDistroSeries. distro_series = self.factory.makeDistroSeries() distribution = distroseries_to_distribution(distro_series) self.assertTrue(IDistribution.providedBy(distribution)) self.assertEqual(distro_series.distribution, distribution) self.assertEqual(distro_series.distribution, IDistribution(distro_series))
def can_configure_answers(self): """Can the user configure answers for the `IQuestionTarget`.""" target = self.context if IProduct.providedBy(target) or IDistribution.providedBy(target): return check_permission('launchpad.Edit', self.context) else: return False
def make_distro_target_clause(distro_target): """Create a where expression and a table list to limit results to a distro target. """ if distro_target is not None: if IDistroArchSeries.providedBy(distro_target): return ( [HWSubmission], [HWSubmission.distroarchseries == distro_target.id]) elif IDistroSeries.providedBy(distro_target): return ( [DistroArchSeries, HWSubmission], [ HWSubmission.distroarchseries == DistroArchSeries.id, DistroArchSeries.distroseries == distro_target.id, ]) elif IDistribution.providedBy(distro_target): return ( [DistroArchSeries, DistroSeries, HWSubmission], [ HWSubmission.distroarchseries == DistroArchSeries.id, DistroArchSeries.distroseries == DistroSeries.id, DistroSeries.distribution == distro_target.id, ]) else: raise ValueError( 'Parameter distro_target must be an IDistribution, ' 'IDistroSeries or IDistroArchSeries') return ([], [])
def test_bugsubscriptionfilter_to_distribution_with_distribution(self): distribution = self.factory.makeDistribution() subscription_filter = self.makeBugSubscriptionFilter(distribution) self.assertEqual( distribution, bugsubscriptionfilter_to_distribution(subscription_filter)) self.assertEqual(distribution, IDistribution(subscription_filter))
def getAnnouncements(self, limit=5, published_only=True): """See IHasAnnouncements.""" # Create the SQL query. query = '1=1 ' # Filter for published news items if necessary. if published_only: query += """ AND Announcement.date_announced <= timezone('UTC'::text, now()) AND Announcement.active IS TRUE """ if IProduct.providedBy(self): if self.projectgroup is None: query += """ AND Announcement.product = %s""" % sqlvalues(self.id) else: query += """ AND (Announcement.product = %s OR Announcement.project = %s) """ % sqlvalues(self.id, self.projectgroup) elif IProjectGroup.providedBy(self): query += """ AND (Announcement.project = %s OR Announcement.product IN (SELECT id FROM Product WHERE project = %s)) """ % sqlvalues(self.id, self.id) elif IDistribution.providedBy(self): query += (' AND Announcement.distribution = %s' % sqlvalues(self.id)) elif IAnnouncementSet.providedBy(self): # There is no need to filter for pillar if we are looking for # all announcements. pass else: raise AssertionError('Unsupported announcement target') return Announcement.select(query, limit=limit)
def announce(self, user, title, summary=None, url=None, publication_date=None): """See IHasAnnouncements.""" # We establish the appropriate target property. projectgroup = product = distribution = None if IProduct.providedBy(self): product = self elif IProjectGroup.providedBy(self): projectgroup = self elif IDistribution.providedBy(self): distribution = self else: raise AssertionError('Unsupported announcement target') # Create the announcement in the database. announcement = Announcement( registrant=user, title=title, summary=summary, url=url, product=product, projectgroup=projectgroup, distribution=distribution, ) announcement.setPublicationDate(publication_date) return announcement
def make_distro_target_clause(distro_target): """Create a where expression and a table list to limit results to a distro target. """ if distro_target is not None: if IDistroArchSeries.providedBy(distro_target): return ([HWSubmission], [HWSubmission.distroarchseries == distro_target.id]) elif IDistroSeries.providedBy(distro_target): return ( [DistroArchSeries, HWSubmission], [ HWSubmission.distroarchseries == DistroArchSeries.id, DistroArchSeries.distroseries == distro_target.id, ], ) elif IDistribution.providedBy(distro_target): return ( [DistroArchSeries, DistroSeries, HWSubmission], [ HWSubmission.distroarchseries == DistroArchSeries.id, DistroArchSeries.distroseries == DistroSeries.id, DistroSeries.distribution == distro_target.id, ], ) else: raise ValueError("Parameter distro_target must be an IDistribution, " "IDistroSeries or IDistroArchSeries") return ([], [])
def announce(self, user, title, summary=None, url=None, publication_date=None): """See IHasAnnouncements.""" # We establish the appropriate target property. project = product = distribution = None if IProduct.providedBy(self): product = self elif IProjectGroup.providedBy(self): project = self elif IDistribution.providedBy(self): distribution = self else: raise AssertionError, 'Unsupported announcement target' # Create the announcement in the database. announcement = Announcement( registrant = user, title = title, summary = summary, url = url, product = product, project = project, distribution = distribution ) announcement.setPublicationDate(publication_date) return announcement
def getAnnouncements(self, limit=5, published_only=True): """See IHasAnnouncements.""" # Create the SQL query. query = '1=1 ' # Filter for published news items if necessary. if published_only: query += """ AND Announcement.date_announced <= timezone('UTC'::text, now()) AND Announcement.active IS TRUE """ if IProduct.providedBy(self): if self.project is None: query += """ AND Announcement.product = %s""" % sqlvalues(self.id) else: query += """ AND (Announcement.product = %s OR Announcement.project = %s) """ % sqlvalues(self.id, self.project) elif IProjectGroup.providedBy(self): query += """ AND (Announcement.project = %s OR Announcement.product IN (SELECT id FROM Product WHERE project = %s)) """ % sqlvalues (self.id, self.id) elif IDistribution.providedBy(self): query += (' AND Announcement.distribution = %s' % sqlvalues(self.id)) elif IAnnouncementSet.providedBy(self): # There is no need to filter for pillar if we are looking for # all announcements. pass else: raise AssertionError, 'Unsupported announcement target' return Announcement.select(query, limit=limit)
def can_configure_answers(self): """Can the user configure answers for the `IQuestionTarget`.""" target = self.context if IProduct.providedBy(target) or IDistribution.providedBy(target): return check_permission("launchpad.Edit", self.context) else: return False
def _validate(self, input): """Make sure all the aliases are valid for the field's pillar. An alias is valid if it can be used as the name of a pillar and is not identical to the pillar's existing name. """ context = self.context from lp.registry.interfaces.product import IProduct from lp.registry.interfaces.projectgroup import IProjectGroup from lp.registry.interfaces.distribution import IDistribution if IProduct.providedBy(context): name_field = IProduct['name'] elif IProjectGroup.providedBy(context): name_field = IProjectGroup['name'] elif IDistribution.providedBy(context): name_field = IDistribution['name'] else: raise AssertionError("Unexpected context type.") name_field.bind(context) existing_aliases = context.aliases for name in self._split_input(input): if name == context.name: raise LaunchpadValidationError('This is your name: %s' % name) elif name in existing_aliases: # This is already an alias to this pillar, so there's no need # to validate it. pass else: name_field._validate(name)
def can_configure_blueprints(self): """Can the user configure blueprints for the `ISpecificationTarget`. """ target = self.context if IProduct.providedBy(target) or IDistribution.providedBy(target): return check_permission('launchpad.Edit', self.context) else: return False
def getByName(self, pillar, name): """See ISpecificationSet.""" clauses = [Specification.name == name] if IDistribution.providedBy(pillar): clauses.append(Specification.distributionID == pillar.id) elif IProduct.providedBy(pillar): clauses.append(Specification.productID == pillar.id) return IStore(Specification).find(Specification, *clauses).one()
def _getOfficialTagClause(self): if IDistribution.providedBy(self): return (OfficialBugTag.distribution == self) elif IProduct.providedBy(self): return (OfficialBugTag.product == self) else: raise AssertionError('%s is not a valid official bug target' % self)
def _getOfficialTagClause(self): if IDistribution.providedBy(self): return (OfficialBugTag.distribution == self) elif IProduct.providedBy(self): return (OfficialBugTag.product == self) else: raise AssertionError( '%s is not a valid official bug target' % self)
def getDistribution(self): """See `SourcePackageNameWidgetBase`.""" field = self.context pillar = field.context.pillar assert IDistribution.providedBy(pillar), ( "FileBugSourcePackageNameWidget should be used only for" " distribution bug targets.") return pillar
def sourcepackage_filebug_for_question(source_package, summary, status=None): """Setup a bug with only one BugTask that can provide a QuestionTarget.""" bug = sourcepackage_filebug(source_package, summary, status=status) # The distribution bugtask interferes with bugtarget-questiontarget.txt. for bugtask in bug.bugtasks: if IDistribution.providedBy(bugtask.target): bugtask.transitionToStatus( BugTaskStatus.INVALID, getUtility(ILaunchBag).user) return bug
def sourcepackage_filebug_for_question(source_package, summary, status=None): """Setup a bug with only one BugTask that can provide a QuestionTarget.""" bug = sourcepackage_filebug(source_package, summary, status=status) # The distribution bugtask interferes with bugtarget-questiontarget.txt. for bugtask in bug.bugtasks: if IDistribution.providedBy(bugtask.target): bugtask.transitionToStatus(BugTaskStatus.INVALID, getUtility(ILaunchBag).user) return bug
def test_distroseries_to_distribution(self): # distroseries_to_distribution() returns an IDistribution given an # IDistroSeries. distro_series = self.factory.makeDistroSeries() distribution = distroseries_to_distribution(distro_series) self.assertTrue(IDistribution.providedBy(distribution)) self.assertEqual(distro_series.distribution, distribution) self.assertEqual( distro_series.distribution, IDistribution(distro_series))
def get_specification_active_product_filter(context): if (IDistribution.providedBy(context) or IDistroSeries.providedBy(context) or IProduct.providedBy(context) or IProductSeries.providedBy(context)): return [], [] from lp.registry.model.product import Product tables = [LeftJoin(Product, Specification.productID == Product.id)] active_products = (Or(Specification.product == None, Product.active == True)) return tables, [active_products]
def initialize(self): context = self.context if IProduct.providedBy(context): self.context_name = "Project" elif IDistribution.providedBy(context): self.context_name = "Distribution" elif IProjectGroup.providedBy(context): self.context_name = "Project Group" else: raise AssertionError("Context is not a Product, Project group or Distribution: %r" % context)
def get_specification_active_product_filter(context): if (IDistribution.providedBy(context) or IDistroSeries.providedBy(context) or IProduct.providedBy(context) or IProductSeries.providedBy(context)): return [], [] from lp.registry.model.product import Product tables = [ LeftJoin(Product, Specification.productID == Product.id)] active_products = ( Or(Specification.product == None, Product.active == True)) return tables, [active_products]
def _settarget(self, target): """See `IOfficialBugTag`.""" if IDistribution.providedBy(target): self.distribution = target elif IProduct.providedBy(target): self.product = target else: raise ValueError( 'The target of an OfficialBugTag must be either an ' 'IDistribution instance or an IProduct instance.')
def official_tags_js(self): """Return the JavaScript of bug tags used by the bug tag completer.""" bug_target = self.context.context pillar_target = ( IProduct(bug_target, None) or IDistribution(bug_target, None)) if pillar_target is not None: official_tags = list(pillar_target.official_bug_tags) else: official_tags = [] return 'var official_tags = %s;' % dumps(official_tags)
def setTarget(self, target): """See ISpecification.""" if IProduct.providedBy(target): self.product = target self.distribution = None elif IDistribution.providedBy(target): self.product = None self.distribution = target else: raise AssertionError("Unknown target: %s" % target)
def _constraintForPillar(cls, pillar): from lp.registry.interfaces.distribution import IDistribution from lp.registry.interfaces.product import IProduct if IProduct.providedBy(pillar): col = cls.product elif IDistribution.providedBy(pillar): col = cls.distribution else: raise ValueError("%r is not a supported pillar" % pillar) return col == pillar
def expose_user_administered_teams_to_js(request, user, context, absoluteURL=absoluteURL): """Make the list of teams the user administers available to JavaScript.""" # XXX: Robert Collins workaround multiple calls making this cause # timeouts: see bug 788510. objects = IJSONRequestCache(request).objects if 'administratedTeams' in objects: return info = [] api_request = IWebServiceClientRequest(request) is_distro = IDistribution.providedBy(context) if is_distro: # If the context is a distro AND a bug supervisor is set then we only # allow subscriptions from members of the bug supervisor team. bug_supervisor = context.bug_supervisor else: bug_supervisor = None if user is not None: administrated_teams = set(user.administrated_teams) if administrated_teams: # Get this only if we need to. membership = set(user.teams_participated_in) # Only consider teams the user is both in and administers: # If the user is not a member of the team itself, then # skip it, because structural subscriptions and their # filters can only be edited by the subscriber. # This can happen if the user is an owner but not a member. administers_and_in = membership.intersection(administrated_teams) list( getUtility(IPersonSet).getPrecachedPersonsFromIDs( [team.id for team in administers_and_in], need_preferred_email=True)) # If the requester is the user, they're at least an admin in # all of these teams. Precache launchpad.(Limited)View so we # can see the necessary attributes. current_user = IPerson(get_current_principal(), None) if current_user is not None and user == current_user: for perm in ('launchpad.View', 'launchpad.LimitedView'): precache_permission_for_objects(None, perm, administers_and_in) for team in sorted(administers_and_in, key=attrgetter('name')): if (bug_supervisor is not None and not team.inTeam(bug_supervisor)): continue info.append({ 'has_preferredemail': team.preferredemail is not None, 'link': absoluteURL(team, api_request), 'title': team.unique_displayname, 'url': canonical_url(team), }) objects['administratedTeams'] = info
def get_bugtaskflat_constraint(target): """Convert an `IBugTarget` to a list of constraints on BugTaskFlat.""" raw_key = bug_target_to_key(target) # For the purposes of BugSummary, DSP/SP tasks count for their # distro(series). if IDistribution.providedBy(target) or IDistroSeries.providedBy(target): del raw_key['sourcepackagename'] # Map to ID columns to work around Storm bug #682989. return [ getattr(BugTaskFlat, '%s_id' % k) == (v.id if v else None) for (k, v) in raw_key.items()]
def initialize(self): context = self.context if IProduct.providedBy(context): self.context_name = 'Project' elif IDistribution.providedBy(context): self.context_name = 'Distribution' elif IProjectGroup.providedBy(context): self.context_name = 'Project Group' else: raise AssertionError( "Context is not a Product, Project group or Distribution: %r" % context)
def getIconUrl(self, pillar): if (IHasIcon.providedBy(self.context) and self.context.icon is not None): icon_url = self.context.icon.getURL() return icon_url if IHasIcon.providedBy(pillar) and pillar.icon is not None: icon_url = pillar.icon.getURL() return icon_url if IDistribution.providedBy(pillar): return "/@@/distribution-badge" else: return "/@@/product-badge"
def get_bugtaskflat_constraint(target): """Convert an `IBugTarget` to a list of constraints on BugTaskFlat.""" raw_key = bug_target_to_key(target) # For the purposes of BugSummary, DSP/SP tasks count for their # distro(series). if IDistribution.providedBy(target) or IDistroSeries.providedBy(target): del raw_key['sourcepackagename'] # Map to ID columns to work around Storm bug #682989. return [ getattr(BugTaskFlat, '%s_id' % k) == (v.id if v else None) for (k, v) in raw_key.items() ]
def get_karma_context_parameters(context): """Return the proper karma context parameters based on the object.""" # XXX flacoste 2007-07-13 bug=125849: # This should go away once bug #125849 is fixed. params = dict(product=None, distribution=None) if IProduct.providedBy(context): params['product'] = context elif IDistribution.providedBy(context): params['distribution'] = context else: raise AssertionError('Unknown karma context: %r' % context) return params
def expose_user_administered_teams_to_js(request, user, context, absoluteURL=absoluteURL): """Make the list of teams the user administers available to JavaScript.""" # XXX: Robert Collins workaround multiple calls making this cause # timeouts: see bug 788510. objects = IJSONRequestCache(request).objects if 'administratedTeams' in objects: return info = [] api_request = IWebServiceClientRequest(request) is_distro = IDistribution.providedBy(context) if is_distro: # If the context is a distro AND a bug supervisor is set then we only # allow subscriptions from members of the bug supervisor team. bug_supervisor = context.bug_supervisor else: bug_supervisor = None if user is not None: administrated_teams = set(user.administrated_teams) if administrated_teams: # Get this only if we need to. membership = set(user.teams_participated_in) # Only consider teams the user is both in and administers: # If the user is not a member of the team itself, then # skip it, because structural subscriptions and their # filters can only be edited by the subscriber. # This can happen if the user is an owner but not a member. administers_and_in = membership.intersection(administrated_teams) list(getUtility(IPersonSet).getPrecachedPersonsFromIDs( [team.id for team in administers_and_in], need_preferred_email=True)) # If the requester is the user, they're at least an admin in # all of these teams. Precache launchpad.(Limited)View so we # can see the necessary attributes. current_user = IPerson(get_current_principal(), None) if current_user is not None and user == current_user: for perm in ('launchpad.View', 'launchpad.LimitedView'): precache_permission_for_objects( None, perm, administers_and_in) for team in administers_and_in: if (bug_supervisor is not None and not team.inTeam(bug_supervisor)): continue info.append({ 'has_preferredemail': team.preferredemail is not None, 'link': absoluteURL(team, api_request), 'title': team.title, 'url': canonical_url(team), }) objects['administratedTeams'] = info
def importBug(self, external_bugtracker, bugtracker, bug_target, remote_bug): """Import a remote bug into Launchpad. :param external_bugtracker: An ISupportsBugImport, which talks to the external bug tracker. :param bugtracker: An IBugTracker, to which the created bug watch will be linked. :param bug_target: An IBugTarget, to which the created bug will be linked. :param remote_bug: The remote bug id as a string. :return: The created Launchpad bug. """ assert IDistribution.providedBy(bug_target), ( 'Only imports of bugs for a distribution is implemented.') reporter_name, reporter_email = ( external_bugtracker.getBugReporter(remote_bug)) reporter = getUtility(IPersonSet).ensurePerson( reporter_email, reporter_name, PersonCreationRationale.BUGIMPORT, comment='when importing bug #%s from %s' % ( remote_bug, external_bugtracker.baseurl)) package_name = external_bugtracker.getBugTargetName(remote_bug) package = bug_target.getSourcePackage(package_name) if package is not None: bug_target = package else: self.warning( 'Unknown %s package (#%s at %s): %s' % ( bug_target.name, remote_bug, external_bugtracker.baseurl, package_name)) summary, description = ( external_bugtracker.getBugSummaryAndDescription(remote_bug)) bug = bug_target.createBug( CreateBugParams( reporter, summary, description, subscribe_owner=False, filed_by=getUtility(ILaunchpadCelebrities).bug_watch_updater)) [added_task] = bug.bugtasks bug_watch = getUtility(IBugWatchSet).createBugWatch( bug=bug, owner=getUtility(ILaunchpadCelebrities).bug_watch_updater, bugtracker=bugtracker, remotebug=remote_bug) added_task.bugwatch = bug_watch # Need to flush databse updates, so that the bug watch knows it # is linked from a bug task. flush_database_updates() return bug
def setRenderedValue(self, value): """See IWidget.""" self.setUpSubWidgets() if IProduct.providedBy(value): self.default_option = 'product' self.product_widget.setRenderedValue(value) elif IDistribution.providedBy(value): self.default_option = 'package' self.distribution_widget.setRenderedValue(value) elif IDistributionSourcePackage.providedBy(value): self.default_option = 'package' self.distribution_widget.setRenderedValue(value.distribution) self.package_widget.setRenderedValue(value.sourcepackagename) else: raise AssertionError('Not a valid value: %r' % value)
def create(cls, policies): from lp.registry.interfaces.distribution import IDistribution from lp.registry.interfaces.product import IProduct insert_values = [] for pillar, type in policies: if IProduct.providedBy(pillar): insert_values.append((pillar, None, type)) elif IDistribution.providedBy(pillar): insert_values.append((None, pillar, type)) else: raise ValueError("%r is not a supported pillar" % pillar) return create((cls.product, cls.distribution, cls.type), insert_values, get_objects=True)
def create(cls, policies): from lp.registry.interfaces.distribution import IDistribution from lp.registry.interfaces.product import IProduct insert_values = [] for pillar, type in policies: if IProduct.providedBy(pillar): insert_values.append((pillar, None, type)) elif IDistribution.providedBy(pillar): insert_values.append((None, pillar, type)) else: raise ValueError("%r is not a supported pillar" % pillar) return create( (cls.product, cls.distribution, cls.type), insert_values, get_objects=True)
def getEntriesFilteringOptions(self): """Return the selected filtering.""" target = None file_extension = None status = None target_widget = self.widgets.get('filter_target') if target_widget is not None and target_widget.hasValidInput(): target = target_widget.getInputValue() pillar_name_set = getUtility(IPillarNameSet) if target == 'all': target = None elif target.startswith('[') and target.endswith(']'): # This is a SpecialTranslationImportTargetFilter. target_code = target[1:-1] target = None for enum_item in SpecialTranslationImportTargetFilter.items: if enum_item.name == target_code: target = enum_item if target is None: raise UnexpectedFormData( "Got a bad special target option: %s" % target) elif '/' in target: # It's a distroseries, for them we have # 'distribution.name/distroseries.name' to identify it. distribution_name, distroseries_name = target.split('/', 1) pillar = pillar_name_set.getByName(distribution_name) if IDistribution.providedBy(pillar): target = pillar.getSeries(distroseries_name) else: raise UnexpectedFormData( "Got a bad target option %s" % target) else: target = pillar_name_set.getByName(target) filter_extension_widget = self.widgets.get('filter_extension') if filter_extension_widget.hasValidInput(): file_extension = filter_extension_widget.getInputValue() if file_extension == 'all': file_extension = None filter_status_widget = self.widgets.get('filter_status') if filter_status_widget.hasValidInput(): status = filter_status_widget.getInputValue() if status == 'all': status = None else: status = RosettaImportStatus.items[status] return target, file_extension, status
def getEntriesFilteringOptions(self): """Return the selected filtering.""" target = None file_extension = None status = None target_widget = self.widgets.get('filter_target') if target_widget is not None and target_widget.hasValidInput(): target = target_widget.getInputValue() pillar_name_set = getUtility(IPillarNameSet) if target == 'all': target = None elif target.startswith('[') and target.endswith(']'): # This is a SpecialTranslationImportTargetFilter. target_code = target[1:-1] target = None for enum_item in SpecialTranslationImportTargetFilter.items: if enum_item.name == target_code: target = enum_item if target is None: raise UnexpectedFormData( "Got a bad special target option: %s" % target) elif '/' in target: # It's a distroseries, for them we have # 'distribution.name/distroseries.name' to identify it. distribution_name, distroseries_name = target.split('/', 1) pillar = pillar_name_set.getByName(distribution_name) if IDistribution.providedBy(pillar): target = pillar.getSeries(distroseries_name) else: raise UnexpectedFormData("Got a bad target option %s" % target) else: target = pillar_name_set.getByName(target) filter_extension_widget = self.widgets.get('filter_extension') if filter_extension_widget.hasValidInput(): file_extension = filter_extension_widget.getInputValue() if file_extension == 'all': file_extension = None filter_status_widget = self.widgets.get('filter_status') if filter_status_widget.hasValidInput(): status = filter_status_widget.getInputValue() if status == 'all': status = None else: status = RosettaImportStatus.items[status] return target, file_extension, status
def milestone_matches_bugtask(milestone, bugtask): """ Return True if the milestone can be set against this bugtask.""" bug_target = bugtask.target naked_milestone = removeSecurityProxy(milestone) if IProduct.providedBy(bug_target): return bugtask.product.id == naked_milestone.productID elif IProductSeries.providedBy(bug_target): return bugtask.productseries.product.id == naked_milestone.productID elif (IDistribution.providedBy(bug_target) or IDistributionSourcePackage.providedBy(bug_target)): return bugtask.distribution.id == naked_milestone.distributionID elif (IDistroSeries.providedBy(bug_target) or ISourcePackage.providedBy(bug_target)): return bugtask.distroseries.id == naked_milestone.distroseriesID return False
def icon(self): """See `IFeed`.""" # The icon is customized based upon the context. if self.context.icon is not None: return self.context.icon.getURL() elif IProjectGroup.providedBy(self.context): url = '/@@/project' elif IProduct.providedBy(self.context): url = '/@@/product' elif IDistribution.providedBy(self.context): url = '/@@/distribution' else: raise AssertionError( "Context for TargetsAnnouncementsFeed does not provide an " "expected interface.") return self.site_url + url
def logo(self): """See `IFeed`.""" # The logo is different depending upon the context we are displaying. if self.context.logo is not None: return self.context.logo.getURL() elif IProjectGroup.providedBy(self.context): url = '/@@/project-logo' elif IProduct.providedBy(self.context): url = '/@@/product-logo' elif IDistribution.providedBy(self.context): url = '/@@/distribution-logo' else: raise AssertionError( "Context for TargetsAnnouncementsFeed does not provide an " "expected interface.") return self.site_url + url
def pillar_sort_key(pillar): """A sort key for a set of pillars. We want: - products first, alphabetically - distributions, with ubuntu first and the rest alphabetically """ product_name = None distribution_name = None if IProduct.providedBy(pillar): product_name = pillar.name elif IDistribution.providedBy(pillar): distribution_name = pillar.name # Move ubuntu to the top. if distribution_name == 'ubuntu': distribution_name = '-' return (distribution_name, product_name)
def setTarget(self, target): """Constrain the search to only return items in target. This is equivalent to calling setProduct etc but the type of target does not need to be known to the caller. :param target: A `IHasBug`, or some search term like all/any/none on `IHasBug`. If using all/any all the targets must be of the same type due to implementation limitations. Currently only distroseries and productseries `IHasBug` implementations are supported. """ # Yay circular deps. from lp.registry.interfaces.distribution import IDistribution from lp.registry.interfaces.distroseries import IDistroSeries from lp.registry.interfaces.product import IProduct from lp.registry.interfaces.productseries import IProductSeries from lp.registry.interfaces.milestone import IMilestone from lp.registry.interfaces.projectgroup import IProjectGroup from lp.registry.interfaces.sourcepackage import ISourcePackage from lp.registry.interfaces.distributionsourcepackage import \ IDistributionSourcePackage if isinstance(target, (any, all)): assert len(target.query_values), \ 'cannot determine target with no targets' instance = target.query_values[0] else: instance = target if IDistribution.providedBy(instance): self.setDistribution(target) elif IDistroSeries.providedBy(instance): self.setDistroSeries(target) elif IProduct.providedBy(instance): self.setProduct(target) elif IProductSeries.providedBy(instance): self.setProductSeries(target) elif IMilestone.providedBy(instance): self.milestone = target elif ISourcePackage.providedBy(instance): self.setSourcePackage(target) elif IDistributionSourcePackage.providedBy(instance): self.setSourcePackage(target) elif IProjectGroup.providedBy(instance): self.setProject(target) else: raise AssertionError("unknown target type %r" % target)
def __init__(self, search_text=None, owner=None, sort=None, product=None, distribution=None, project=None): """Initialize a new FAQ search. See `IFAQCollection`.searchFAQs for the basic parameters description. Additional parameters: :param product: The product in which to search for FAQs. :param distribution: The distribution in which to search for FAQs. :param project: The project in which to search for FAQs. """ if search_text is not None: assert isinstance(search_text, basestring), ( 'search_text should be a string, not %s' % type(search_text)) self.search_text = search_text if owner is not None: assert IPerson.providedBy(owner), ( 'owner should be an IPerson, not %s' % type(owner)) self.owner = owner if sort is not None: assert sort in FAQSort.items, ( 'sort should be an item from FAQSort, not %s' % type(sort)) self.sort = sort if product is not None: assert IProduct.providedBy(product), ( 'product should be an IProduct, not %s' % type(product)) assert distribution is None and project is None, ( 'can only use one of product, distribution, or project') self.product = product if distribution is not None: assert IDistribution.providedBy(distribution), ( 'distribution should be an IDistribution, %s' % type(distribution)) assert product is None and project is None, ( 'can only use one of product, distribution, or project') self.distribution = distribution if project is not None: assert IProjectGroup.providedBy(project), ( 'project should be an IProjectGroup, not %s' % type(project)) assert product is None and distribution is None, ( 'can only use one of product, distribution, or project') self.project = project