def related_posts(page, value): from v1.models.learn_page import AbstractFilterPage def tag_set(related_page): return set([tag.pk for tag in related_page.tags.all()]) def match_all_topic_tags(queryset, page_tags): """Return pages that share every one of the current page's tags.""" current_tag_set = set([tag.pk for tag in page_tags]) return [page for page in queryset if current_tag_set.issubset(tag_set(page))] related_types = [] related_items = {} if value.get('relate_posts'): related_types.append('blog') if value.get('relate_newsroom'): related_types.append('newsroom') if value.get('relate_events'): related_types.append('events') if not related_types: return related_items tags = page.tags.all() and_filtering = value['and_filtering'] specific_categories = value['specific_categories'] limit = int(value['limit']) queryset = AbstractFilterPage.objects.live().exclude( id=page.id).order_by('-date_published').distinct().specific() for parent in related_types: # blog, newsroom or events # Include children of this slug that match at least 1 tag children = Page.objects.child_of_q(Page.objects.get(slug=parent)) filters = children & Q(('tags__in', tags)) if parent == 'events': # Include archived events matches archive = Page.objects.get(slug='archive-past-events') children = Page.objects.child_of_q(archive) filters |= children & Q(('tags__in', tags)) if specific_categories: # Filter by any additional categories specified categories = ref.get_appropriate_categories( specific_categories=specific_categories, page_type=parent ) if categories: filters &= Q(('categories__name__in', categories)) related_queryset = queryset.filter(filters) if and_filtering: # By default, we need to match at least one tag # If specified in the admin, change this to match ALL tags related_queryset = match_all_topic_tags(related_queryset, tags) related_items[parent.title()] = related_queryset[:limit] # Return items in the dictionary that have non-empty querysets return {key: value for key, value in related_items.items() if value}
def test_should_return_matches_as_slugs(self): result = get_appropriate_categories(['Press Release'], 'newsroom') self.assertEqual(result, ['press-release'])
def test_should_return_all_matches(self): result = get_appropriate_categories( ['Op-Ed', 'Testimony', 'Speech', 'Press Release'], 'newsroom') self.assertEqual(len(result), 4)
def test_related_post_category_should_not_return_matches_if_wrong_page_type( self): result = get_appropriate_categories(['Press Release'], 'blog') self.assertEqual(result, [])
def test_should_return_matches_only_for_relevant_page_type(self): result = get_appropriate_categories(['Press Release', 'At the CFPB'], 'blog') self.assertEqual(len(result), 1)
def related_posts(page, value): from v1.models.learn_page import AbstractFilterPage def tag_set(related_page): return set([tag.pk for tag in related_page.tags.all()]) def match_all_topic_tags(queryset, page_tags): """Return pages that share every one of the current page's tags.""" current_tag_set = set([tag.pk for tag in page_tags]) return [page for page in queryset if current_tag_set.issubset(tag_set(page))] related_types = [] related_items = {} if value.get('relate_posts'): related_types.append('blog') if value.get('relate_newsroom'): related_types.append('newsroom') if value.get('relate_events'): related_types.append('events') if not related_types: return related_items tags = page.tags.all() and_filtering = value['and_filtering'] specific_categories = value['specific_categories'] limit = int(value['limit']) queryset = AbstractFilterPage.objects.live().exclude( id=page.id).order_by('-date_published').distinct() for parent in related_types: # blog, newsroom or events # Include children of this slug that match at least 1 tag children = Page.objects.child_of_q(Page.objects.get(slug=parent)) filters = children & Q(('tags__in', tags)) if parent == 'events': # Include archived events matches archive = Page.objects.get(slug='archive-past-events') children = Page.objects.child_of_q(archive) filters |= children & Q(('tags__in', tags)) if specific_categories: # Filter by any additional categories specified categories = ref.get_appropriate_categories( specific_categories=specific_categories, page_type=parent ) if categories: filters &= Q(('categories__name__in', categories)) related_queryset = queryset.filter(filters) if and_filtering: # By default, we need to match at least one tag # If specified in the admin, change this to match ALL tags related_queryset = match_all_topic_tags(related_queryset, tags) related_items[parent.title()] = related_queryset[:limit] # Return items in the dictionary that have non-empty querysets return {key: value for key, value in related_items.items() if value}
def test_non_related_post_category_should_not_return_matches(self): result = get_appropriate_categories(['Administrative adjudication'], 'blog') self.assertEqual(result, [])
def test_should_return_all_matches(self): result = get_appropriate_categories(['Op-Ed', 'Testimony', 'Speech', 'Press Release'], 'newsroom') self.assertEqual(len(result), 4)
def test_should_return_matches_as_slugs(self): result = get_appropriate_categories(['Press Release'], 'newsroom') self.assertEqual(result, ['press-release'])
def test_should_return_matches_only_for_relevant_page_type(self): result = get_appropriate_categories(['Press Release', 'At the CFPB'], 'blog') self.assertEqual(len(result), 1)
def test_related_post_category_should_not_return_matches_if_wrong_page_type(self): result = get_appropriate_categories(['Press Release'], 'blog') self.assertEqual(result, [])
def test_non_related_post_category_should_not_return_matches(self): result = get_appropriate_categories(['Administrative adjudication'], 'blog') self.assertEqual(result, [])