def test_sourcepackage_context_distro_task(self): bug = self.factory.makeBug() sp = self.factory.makeSourcePackage() task = self.factory.makeBugTask(bug=bug, target=sp.distribution) tasks = list(bug.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(sp, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(filtered, Equals([task]))
def test_distro_context(self): bug = self.factory.makeBug() mint = self.factory.makeDistribution() task = self.factory.makeBugTask(bug=bug, target=mint) tasks = list(bug.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(mint, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(filtered, Equals([task]))
def test_productseries_context_with_only_product_task(self): bug = self.factory.makeBug() widget = self.factory.makeProduct() task = self.factory.makeBugTask(bug=bug, target=widget) series = widget.development_focus tasks = list(bug.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(series, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(filtered, Equals([task]))
def test_two_product_tasks_case(self): widget = self.factory.makeProduct() bug = self.factory.makeBug(target=widget) cogs = self.factory.makeProduct() task = self.factory.makeBugTask(bug=bug, target=cogs) tasks = list(bug.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(cogs, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(filtered, Equals([task]))
def test_multiple_bugs(self): bug1 = self.factory.makeBug() bug2 = self.factory.makeBug() bug3 = self.factory.makeBug() tasks = list(bug1.bugtasks) tasks.extend(bug2.bugtasks) tasks.extend(bug3.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(None, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(len(filtered), Equals(3)) self.assertThat(filtered, Equals(tasks))
def getLinkedBugTasks(self, user): """See `ISpecification`.""" params = BugTaskSearchParams(user=user, linked_blueprints=self.id) tasks = getUtility(IBugTaskSet).search(params) if self.distroseries is not None: context = self.distroseries elif self.distribution is not None: context = self.distribution elif self.productseries is not None: context = self.productseries else: context = self.product return filter_bugtasks_by_context(context, tasks)
def assertFilterBugtasksByContextNoQueries(self, bug, target, task): tasks = list(bug.bugtasks) with StormStatementRecorder() as recorder: filtered = filter_bugtasks_by_context(target, tasks) self.assertThat(recorder, HasQueryCount(Equals(0))) self.assertThat(filtered, Equals([task]))
def test_simple_case(self): bug = self.factory.makeBug() tasks = list(bug.bugtasks) self.assertThat(filter_bugtasks_by_context(None, tasks), Equals(tasks))
def test_simple_case(self): bug = self.factory.makeBug() tasks = list(bug.bugtasks) self.assertThat( filter_bugtasks_by_context(None, tasks), Equals(tasks))
def getExtendedRevisionDetails(self, user, revisions): """See `IBranchCollection`.""" if not revisions: return [] branch = revisions[0].branch def make_rev_info(branch_revision, merge_proposal_revs, linked_bugtasks): rev_info = { 'revision': branch_revision, 'linked_bugtasks': None, 'merge_proposal': None, } merge_proposal = merge_proposal_revs.get(branch_revision.sequence) rev_info['merge_proposal'] = merge_proposal if merge_proposal is not None: rev_info['linked_bugtasks'] = linked_bugtasks.get( merge_proposal.source_branch.id) return rev_info rev_nos = [revision.sequence for revision in revisions] merge_proposals = self.getMergeProposals( target_branch=branch, merged_revnos=rev_nos, statuses=[BranchMergeProposalStatus.MERGED]) merge_proposal_revs = dict([(mp.merged_revno, mp) for mp in merge_proposals]) source_branch_ids = [mp.source_branch.id for mp in merge_proposals] linked_bugtasks = defaultdict(list) if source_branch_ids: # We get the bugtasks for our merge proposal branches # First, the bug ids params = BugTaskSearchParams( user=user, status=None, linked_branches=any(*source_branch_ids)) bug_ids = getUtility(IBugTaskSet).searchBugIds(params) # Then the bug tasks and branches store = IStore(BugBranch) rs = store.using( BugBranch, Join(BugTask, BugTask.bugID == BugBranch.bugID), ).find((BugTask, BugBranch), BugBranch.bugID.is_in(bug_ids), BugBranch.branchID.is_in(source_branch_ids)) # Build up a collection of bugtasks for each branch bugtasks_for_branch = defaultdict(list) for bugtask, bugbranch in rs: bugtasks_for_branch[bugbranch.branch].append(bugtask) # Now filter those down to one bugtask per branch for branch, tasks in bugtasks_for_branch.iteritems(): linked_bugtasks[branch.id].extend( filter_bugtasks_by_context(branch.target.context, tasks)) return [ make_rev_info(rev, merge_proposal_revs, linked_bugtasks) for rev in revisions ]
def getExtendedRevisionDetails(self, user, revisions): """See `IBranchCollection`.""" if not revisions: return [] branch = revisions[0].branch def make_rev_info( branch_revision, merge_proposal_revs, linked_bugtasks): rev_info = { 'revision': branch_revision, 'linked_bugtasks': None, 'merge_proposal': None, } merge_proposal = merge_proposal_revs.get(branch_revision.sequence) rev_info['merge_proposal'] = merge_proposal if merge_proposal is not None: rev_info['linked_bugtasks'] = linked_bugtasks.get( merge_proposal.source_branch.id) return rev_info rev_nos = [revision.sequence for revision in revisions] merge_proposals = self.getMergeProposals( target_branch=branch, merged_revnos=rev_nos, statuses=[BranchMergeProposalStatus.MERGED]) merge_proposal_revs = dict( [(mp.merged_revno, mp) for mp in merge_proposals]) source_branch_ids = [mp.source_branch.id for mp in merge_proposals] linked_bugtasks = defaultdict(list) if source_branch_ids: # We get the bugtasks for our merge proposal branches # First, the bug ids params = BugTaskSearchParams( user=user, status=None, linked_branches=any(*source_branch_ids)) bug_ids = getUtility(IBugTaskSet).searchBugIds(params) # Then the bug tasks and branches store = IStore(BugBranch) rs = store.using( BugBranch, Join(BugTask, BugTask.bugID == BugBranch.bugID), ).find( (BugTask, BugBranch), BugBranch.bugID.is_in(bug_ids), BugBranch.branchID.is_in(source_branch_ids) ) # Build up a collection of bugtasks for each branch bugtasks_for_branch = defaultdict(list) for bugtask, bugbranch in rs: bugtasks_for_branch[bugbranch.branch].append(bugtask) # Now filter those down to one bugtask per branch for branch, tasks in bugtasks_for_branch.iteritems(): linked_bugtasks[branch.id].extend( filter_bugtasks_by_context(branch.target.context, tasks)) return [make_rev_info(rev, merge_proposal_revs, linked_bugtasks) for rev in revisions]