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))
示例#3
0
 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 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))
示例#5
0
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 ([], [])
示例#6
0
 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))
示例#7
0
    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)
示例#8
0
    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
示例#9
0
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 ([], [])
示例#10
0
    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
示例#11
0
    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)
示例#12
0
 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
示例#13
0
    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)
示例#14
0
    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 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
示例#17
0
 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()
示例#18
0
 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)
示例#19
0
 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)
示例#20
0
 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()
示例#21
0
 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
示例#24
0
 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))
示例#25
0
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]
示例#26
0
 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]
示例#28
0
 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.')
示例#29
0
 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)
示例#30
0
 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)
示例#31
0
 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
示例#32
0
 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
示例#33
0
 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.')
示例#34
0
 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 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()]
示例#37
0
 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)
示例#38
0
 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 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()
    ]
示例#41
0
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
示例#43
0
    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
示例#44
0
    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 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)
示例#47
0
    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)
示例#48
0
    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
示例#51
0
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
示例#52
0
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
示例#53
0
 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
示例#54
0
 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
示例#55
0
 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
示例#56
0
 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
示例#57
0
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)
示例#58
0
    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)
示例#59
0
    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