コード例 #1
0
    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}
コード例 #2
0
 def test_should_return_matches_as_slugs(self):
     result = get_appropriate_categories(['Press Release'], 'newsroom')
     self.assertEqual(result, ['press-release'])
コード例 #3
0
 def test_should_return_all_matches(self):
     result = get_appropriate_categories(
         ['Op-Ed', 'Testimony', 'Speech', 'Press Release'], 'newsroom')
     self.assertEqual(len(result), 4)
コード例 #4
0
 def test_related_post_category_should_not_return_matches_if_wrong_page_type(
         self):
     result = get_appropriate_categories(['Press Release'], 'blog')
     self.assertEqual(result, [])
コード例 #5
0
 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)
コード例 #6
0
ファイル: organisms.py プロジェクト: chosak/cfgov-refresh
    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}
コード例 #7
0
 def test_non_related_post_category_should_not_return_matches(self):
     result = get_appropriate_categories(['Administrative adjudication'],
                                         'blog')
     self.assertEqual(result, [])
コード例 #8
0
ファイル: test_ref.py プロジェクト: OrlandoSoto/cfgov-refresh
 def test_should_return_all_matches(self):
     result = get_appropriate_categories(['Op-Ed', 'Testimony', 'Speech', 'Press Release'], 'newsroom')
     self.assertEqual(len(result), 4)
コード例 #9
0
ファイル: test_ref.py プロジェクト: OrlandoSoto/cfgov-refresh
 def test_should_return_matches_as_slugs(self):
     result = get_appropriate_categories(['Press Release'], 'newsroom')
     self.assertEqual(result, ['press-release'])
コード例 #10
0
ファイル: test_ref.py プロジェクト: OrlandoSoto/cfgov-refresh
 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)
コード例 #11
0
ファイル: test_ref.py プロジェクト: OrlandoSoto/cfgov-refresh
 def test_related_post_category_should_not_return_matches_if_wrong_page_type(self):
     result = get_appropriate_categories(['Press Release'], 'blog')
     self.assertEqual(result, [])
コード例 #12
0
ファイル: test_ref.py プロジェクト: OrlandoSoto/cfgov-refresh
 def test_non_related_post_category_should_not_return_matches(self):
     result = get_appropriate_categories(['Administrative adjudication'], 'blog')
     self.assertEqual(result, [])