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))
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))
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))
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)))
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
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
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
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 _fetch_specs_visible_for_user(self, user): return Store.of(self.product).find( Specification, Specification.productID == self.product.id, *get_specification_privacy_filter(user))
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)