Exemplo n.º 1
0
    def getSpecifications(self, user):
        """See `IMilestoneData`"""
        from lp.registry.model.person import Person
        origin = [Specification]
        product_origin, clauses = get_specification_active_product_filter(
            self)
        origin.extend(product_origin)
        clauses.extend(get_specification_privacy_filter(user))
        origin.append(LeftJoin(Person, Specification._assigneeID == Person.id))
        milestones = self._milestone_ids_expr(user)

        results = Store.of(self.target).using(*origin).find(
            (Specification, Person),
            Specification.id.is_in(
                Union(
                    Select(
                        Specification.id, tables=[Specification],
                        where=(Specification.milestoneID.is_in(milestones))),
                    Select(
                        SpecificationWorkItem.specification_id,
                        tables=[SpecificationWorkItem],
                        where=And(
                            SpecificationWorkItem.milestone_id.is_in(
                                milestones),
                            SpecificationWorkItem.deleted == False)),
                    all=True)),
            *clauses)
        ordered_results = results.order_by(
            Desc(Specification.priority), Specification.definition_status,
            Specification.implementation_status, Specification.title)
        ordered_results.config(distinct=True)
        return DecoratedResultSet(ordered_results, itemgetter(0))
Exemplo n.º 2
0
    def getSpecifications(self, user):
        """See `IMilestoneData`"""
        from lp.registry.model.person import Person
        origin = [Specification]
        product_origin, clauses = get_specification_active_product_filter(self)
        origin.extend(product_origin)
        clauses.extend(get_specification_privacy_filter(user))
        origin.append(LeftJoin(Person, Specification._assigneeID == Person.id))
        milestones = self._milestone_ids_expr(user)

        results = Store.of(self.target).using(*origin).find(
            (Specification, Person),
            Specification.id.is_in(
                Union(Select(
                    Specification.id,
                    tables=[Specification],
                    where=(Specification.milestoneID.is_in(milestones))),
                      Select(SpecificationWorkItem.specification_id,
                             tables=[SpecificationWorkItem],
                             where=And(
                                 SpecificationWorkItem.milestone_id.is_in(
                                     milestones),
                                 SpecificationWorkItem.deleted == False)),
                      all=True)), *clauses)
        ordered_results = results.order_by(Desc(Specification.priority),
                                           Specification.definition_status,
                                           Specification.implementation_status,
                                           Specification.title)
        ordered_results.config(distinct=True)
        return DecoratedResultSet(ordered_results, itemgetter(0))
Exemplo n.º 3
0
 def _fetch_children_or_parents(self, join_cond, cond, user):
     from lp.blueprints.model.specificationsearch import (
         get_specification_privacy_filter)
     return list(Store.of(self).using(
         Specification,
         Join(SpecificationDependency, join_cond == self.id)).find(
         Specification,
         cond == Specification.id, *get_specification_privacy_filter(user)
         ).order_by(Specification.title))
Exemplo n.º 4
0
 def _fetch_children_or_parents(self, join_cond, cond, user):
     from lp.blueprints.model.specificationsearch import (
         get_specification_privacy_filter)
     return list(Store.of(self).using(
         Specification,
         Join(SpecificationDependency, join_cond == self.id)).find(
         Specification,
         cond == Specification.id, *get_specification_privacy_filter(user)
         ).order_by(Specification.title))
Exemplo n.º 5
0
def recursive_dependent_query(user):
    from lp.blueprints.model.specificationsearch import (
        get_specification_privacy_filter)
    return """
        RECURSIVE dependencies(id) AS (
            SELECT ?
        UNION
            SELECT sd.dependency
            FROM dependencies d, specificationdependency sd
            JOIN specification ON sd.dependency = specification.id
            WHERE sd.specification = d.id AND (%s))""" % (
        convert_storm_clause_to_string(
            *get_specification_privacy_filter(user)))
Exemplo n.º 6
0
def recursive_dependent_query(user):
    from lp.blueprints.model.specificationsearch import (
        get_specification_privacy_filter)
    return """
        RECURSIVE dependencies(id) AS (
            SELECT ?
        UNION
            SELECT sd.dependency
            FROM dependencies d, specificationdependency sd
            JOIN specification ON sd.dependency = specification.id
            WHERE sd.specification = d.id AND (%s))""" % (
                convert_storm_clause_to_string(
                    *get_specification_privacy_filter(user)))
Exemplo n.º 7
0
    def spec_filter_clause(self, user, filter=None):
        """Figure out the appropriate query for specifications on a sprint.

        We separate out the query generation from the normal
        specifications() method because we want to reuse this query in the
        specificationLinks() method.
        """
        # Avoid circular imports.
        from lp.blueprints.model.specification import Specification
        tables, query = get_specification_active_product_filter(self)
        tables.insert(0, Specification)
        query.append(get_specification_privacy_filter(user))
        tables.append(
            Join(SprintSpecification,
                 SprintSpecification.specification == Specification.id))
        query.append(SprintSpecification.sprintID == self.id)

        if not filter:
            # filter could be None or [] then we decide the default
            # which for a sprint is to show everything approved
            filter = [SpecificationFilter.ACCEPTED]

        # figure out what set of specifications we are interested in. for
        # sprint, we need to be able to filter on the basis of:
        #
        #  - completeness.
        #  - acceptance for sprint agenda.
        #  - informational.
        #

        sprint_status = []
        # look for specs that have a particular SprintSpecification
        # status (proposed, accepted or declined)
        if SpecificationFilter.ACCEPTED in filter:
            sprint_status.append(SprintSpecificationStatus.ACCEPTED)
        if SpecificationFilter.PROPOSED in filter:
            sprint_status.append(SprintSpecificationStatus.PROPOSED)
        if SpecificationFilter.DECLINED in filter:
            sprint_status.append(SprintSpecificationStatus.DECLINED)
        statuses = [
            SprintSpecification.status == status for status in sprint_status
        ]
        if len(statuses) > 0:
            query.append(Or(*statuses))
        # Filter for specification text
        query.extend(get_specification_filters(filter, goalstatus=False))
        return tables, query
Exemplo n.º 8
0
    def spec_filter_clause(self, user, filter=None):
        """Figure out the appropriate query for specifications on a sprint.

        We separate out the query generation from the normal
        specifications() method because we want to reuse this query in the
        specificationLinks() method.
        """
        # Avoid circular imports.
        from lp.blueprints.model.specification import Specification
        tables, query = get_specification_active_product_filter(self)
        tables.insert(0, Specification)
        query.append(get_specification_privacy_filter(user))
        tables.append(Join(
            SprintSpecification,
            SprintSpecification.specification == Specification.id))
        query.append(SprintSpecification.sprintID == self.id)

        if not filter:
            # filter could be None or [] then we decide the default
            # which for a sprint is to show everything approved
            filter = [SpecificationFilter.ACCEPTED]

        # figure out what set of specifications we are interested in. for
        # sprint, we need to be able to filter on the basis of:
        #
        #  - completeness.
        #  - acceptance for sprint agenda.
        #  - informational.
        #

        sprint_status = []
        # look for specs that have a particular SprintSpecification
        # status (proposed, accepted or declined)
        if SpecificationFilter.ACCEPTED in filter:
            sprint_status.append(SprintSpecificationStatus.ACCEPTED)
        if SpecificationFilter.PROPOSED in filter:
            sprint_status.append(SprintSpecificationStatus.PROPOSED)
        if SpecificationFilter.DECLINED in filter:
            sprint_status.append(SprintSpecificationStatus.DECLINED)
        statuses = [SprintSpecification.status == status for status in
                    sprint_status]
        if len(statuses) > 0:
            query.append(Or(*statuses))
        # Filter for specification text
        query.extend(get_specification_filters(filter, goalstatus=False))
        return tables, query
Exemplo n.º 9
0
    def userCanView(self, user):
        """See `ISpecification`."""
        # Avoid circular imports.
        from lp.blueprints.model.specificationsearch import (
            get_specification_privacy_filter)
        if self.information_type in PUBLIC_INFORMATION_TYPES:
            return True
        if user is None:
            return False
        if user.id in self._known_viewers:
            return True

        if not Store.of(self).find(
                Specification, Specification.id == self.id,
                *get_specification_privacy_filter(user)).is_empty():
            self._known_viewers.add(user.id)
            return True
        return False
Exemplo n.º 10
0
    def userCanView(self, user):
        """See `ISpecification`."""
        # Avoid circular imports.
        from lp.blueprints.model.specificationsearch import (
            get_specification_privacy_filter)
        if self.information_type in PUBLIC_INFORMATION_TYPES:
            return True
        if user is None:
            return False
        if user.id in self._known_viewers:
            return True

        if not Store.of(self).find(
            Specification, Specification.id == self.id,
            *get_specification_privacy_filter(user)).is_empty():
            self._known_viewers.add(user.id)
            return True
        return False
Exemplo n.º 11
0
    def run(self):
        """See `IRemoveArtifactSubscriptionsJob`."""
        logger = logging.getLogger()
        logger.info(self.getOperationDescription())

        bug_filters = []
        branch_filters = []
        specification_filters = []

        if self.branch_ids:
            branch_filters.append(Branch.id.is_in(self.branch_ids))
        if self.specification_ids:
            specification_filters.append(Specification.id.is_in(self.specification_ids))
        if self.bug_ids:
            bug_filters.append(BugTaskFlat.bug_id.is_in(self.bug_ids))
        else:
            if self.information_types:
                bug_filters.append(BugTaskFlat.information_type.is_in(self.information_types))
                branch_filters.append(Branch.information_type.is_in(self.information_types))
                specification_filters.append(Specification.information_type.is_in(self.information_types))
            if self.product:
                bug_filters.append(BugTaskFlat.product == self.product)
                branch_filters.append(Branch.product == self.product)
                specification_filters.append(Specification.product == self.product)
            if self.distro:
                bug_filters.append(BugTaskFlat.distribution == self.distro)
                branch_filters.append(Branch.distribution == self.distro)
                specification_filters.append(Specification.distribution == self.distro)

        if self.grantee:
            bug_filters.append(
                In(
                    BugSubscription.person_id,
                    Select(TeamParticipation.personID, where=TeamParticipation.team == self.grantee),
                )
            )
            branch_filters.append(
                In(
                    BranchSubscription.personID,
                    Select(TeamParticipation.personID, where=TeamParticipation.team == self.grantee),
                )
            )
            specification_filters.append(
                In(
                    SpecificationSubscription.personID,
                    Select(TeamParticipation.personID, where=TeamParticipation.team == self.grantee),
                )
            )

        if bug_filters:
            bug_filters.append(Not(Or(*get_bug_privacy_filter_terms(BugSubscription.person_id))))
            bug_subscriptions = (
                IStore(BugSubscription)
                .using(BugSubscription, Join(BugTaskFlat, BugTaskFlat.bug_id == BugSubscription.bug_id))
                .find(BugSubscription, *bug_filters)
                .config(distinct=True)
            )
            for sub in bug_subscriptions:
                sub.bug.unsubscribe(sub.person, self.requestor, ignore_permissions=True)
        if branch_filters:
            branch_filters.append(Not(Or(*get_branch_privacy_filter(BranchSubscription.personID))))
            branch_subscriptions = (
                IStore(BranchSubscription)
                .using(BranchSubscription, Join(Branch, Branch.id == BranchSubscription.branchID))
                .find(BranchSubscription, *branch_filters)
                .config(distinct=True)
            )
            for sub in branch_subscriptions:
                sub.branch.unsubscribe(sub.person, self.requestor, ignore_permissions=True)
        if specification_filters:
            specification_filters.append(Not(*get_specification_privacy_filter(SpecificationSubscription.personID)))
            tables = (
                SpecificationSubscription,
                Join(Specification, Specification.id == SpecificationSubscription.specificationID),
            )
            specifications_subscriptions = (
                IStore(SpecificationSubscription)
                .using(*tables)
                .find(SpecificationSubscription, *specification_filters)
                .config(distinct=True)
            )
            for sub in specifications_subscriptions:
                sub.specification.unsubscribe(sub.person, self.requestor, ignore_permissions=True)
 def _filter(self):
     user = getattr(getUtility(ILaunchBag), 'user', None)
     return And(
         SpecificationDependency.specificationID == self.context.id,
         SpecificationDependency.dependencyID == Specification.id,
         *get_specification_privacy_filter(user))
 def _filter(self):
     user = getattr(getUtility(ILaunchBag), 'user', None)
     return And(
         SpecificationDependency.specificationID == self.context.id,
         SpecificationDependency.dependencyID == Specification.id,
         *get_specification_privacy_filter(user))
Exemplo n.º 14
0
 def _fetch_specs_visible_for_user(self, user):
     return Store.of(self.product).find(
         Specification, Specification.productID == self.product.id,
         *get_specification_privacy_filter(user))
Exemplo n.º 15
0
    def run(self):
        """See `IRemoveArtifactSubscriptionsJob`."""
        logger = logging.getLogger()
        logger.info(self.getOperationDescription())

        bug_filters = []
        branch_filters = []
        specification_filters = []

        if self.branch_ids:
            branch_filters.append(Branch.id.is_in(self.branch_ids))
        if self.specification_ids:
            specification_filters.append(
                Specification.id.is_in(self.specification_ids))
        if self.bug_ids:
            bug_filters.append(BugTaskFlat.bug_id.is_in(self.bug_ids))
        else:
            if self.information_types:
                bug_filters.append(
                    BugTaskFlat.information_type.is_in(self.information_types))
                branch_filters.append(
                    Branch.information_type.is_in(self.information_types))
                specification_filters.append(
                    Specification.information_type.is_in(
                        self.information_types))
            if self.product:
                bug_filters.append(BugTaskFlat.product == self.product)
                branch_filters.append(Branch.product == self.product)
                specification_filters.append(
                    Specification.product == self.product)
            if self.distro:
                bug_filters.append(BugTaskFlat.distribution == self.distro)
                branch_filters.append(Branch.distribution == self.distro)
                specification_filters.append(
                    Specification.distribution == self.distro)

        if self.grantee:
            bug_filters.append(
                In(
                    BugSubscription.person_id,
                    Select(TeamParticipation.personID,
                           where=TeamParticipation.team == self.grantee)))
            branch_filters.append(
                In(
                    BranchSubscription.personID,
                    Select(TeamParticipation.personID,
                           where=TeamParticipation.team == self.grantee)))
            specification_filters.append(
                In(
                    SpecificationSubscription.personID,
                    Select(TeamParticipation.personID,
                           where=TeamParticipation.team == self.grantee)))

        if bug_filters:
            bug_filters.append(
                Not(
                    Or(*get_bug_privacy_filter_terms(
                        BugSubscription.person_id))))
            bug_subscriptions = IStore(BugSubscription).using(
                BugSubscription,
                Join(BugTaskFlat,
                     BugTaskFlat.bug_id == BugSubscription.bug_id)).find(
                         BugSubscription, *bug_filters).config(distinct=True)
            for sub in bug_subscriptions:
                sub.bug.unsubscribe(sub.person,
                                    self.requestor,
                                    ignore_permissions=True)
        if branch_filters:
            branch_filters.append(
                Not(Or(
                    *get_branch_privacy_filter(BranchSubscription.personID))))
            branch_subscriptions = IStore(BranchSubscription).using(
                BranchSubscription,
                Join(Branch, Branch.id == BranchSubscription.branchID)).find(
                    BranchSubscription, *branch_filters).config(distinct=True)
            for sub in branch_subscriptions:
                sub.branch.unsubscribe(sub.person,
                                       self.requestor,
                                       ignore_permissions=True)
        if specification_filters:
            specification_filters.append(
                Not(*get_specification_privacy_filter(
                    SpecificationSubscription.personID)))
            tables = (SpecificationSubscription,
                      Join(
                          Specification, Specification.id ==
                          SpecificationSubscription.specificationID))
            specifications_subscriptions = IStore(
                SpecificationSubscription).using(*tables).find(
                    SpecificationSubscription,
                    *specification_filters).config(distinct=True)
            for sub in specifications_subscriptions:
                sub.specification.unsubscribe(sub.person,
                                              self.requestor,
                                              ignore_permissions=True)
 def _fetch_specs_visible_for_user(self, user):
     return Store.of(self.product).find(
         Specification,
         Specification.productID == self.product.id,
         *get_specification_privacy_filter(user))