def test_threads_no_subscription(self):
        """make mulitple threads sub aware for authenticated"""
        threads = []
        for i in range(10):
            threads.append(self.post_thread(timezone.now() - timedelta(days=10)))

            if i % 3 == 0:
                self.user.subscription_set.create(
                    thread=threads[-1],
                    category=self.category,
                    last_read_on=timezone.now(),
                    send_email=False,
                )
            elif i % 2 == 0:
                self.user.subscription_set.create(
                    thread=threads[-1],
                    category=self.category,
                    last_read_on=timezone.now(),
                    send_email=True,
                )

        make_subscription_aware(self.user, threads)

        for i in range(10):
            if i % 3 == 0:
                self.assertFalse(threads[i].subscription.send_email)
            elif i % 2 == 0:
                self.assertTrue(threads[i].subscription.send_email)
            else:
                self.assertIsNone(threads[i].subscription)
示例#2
0
文件: thread.py 项目: vprime/Misago
    def __init__(self,
                 request,
                 pk,
                 slug=None,
                 read_aware=False,
                 subscription_aware=False,
                 poll_votes_aware=False,
                 select_for_update=False):
        model = self.get_thread(request, pk, slug, select_for_update)

        model.path = self.get_thread_path(model.category)

        add_acl(request.user, model.category)
        add_acl(request.user, model)

        if read_aware:
            make_read_aware(request.user, model)
        if subscription_aware:
            make_subscription_aware(request.user, model)

        self._model = model

        try:
            self._poll = model.poll
            add_acl(request.user, self._poll)

            if poll_votes_aware:
                self._poll.make_choices_votes_aware(request.user)
        except Poll.DoesNotExist:
            self._poll = None
示例#3
0
    def test_threads_no_subscription(self):
        """make mulitple threads sub aware for authenticated"""
        threads = []
        for i in range(10):
            threads.append(
                self.post_thread(timezone.now() - timedelta(days=10)))

            if i % 3 == 0:
                self.user.subscription_set.create(
                    thread=threads[-1],
                    category=self.category,
                    last_read_on=timezone.now(),
                    send_email=False,
                )
            elif i % 2 == 0:
                self.user.subscription_set.create(
                    thread=threads[-1],
                    category=self.category,
                    last_read_on=timezone.now(),
                    send_email=True,
                )

        make_subscription_aware(self.user, threads)

        for i in range(10):
            if i % 3 == 0:
                self.assertFalse(threads[i].subscription.send_email)
            elif i % 2 == 0:
                self.assertTrue(threads[i].subscription.send_email)
            else:
                self.assertIsNone(threads[i].subscription)
    def test_anon_threads_subscription(self):
        """make multiple threads list sub aware for anon"""
        threads = []
        for _ in range(10):
            threads.append(self.post_thread(timezone.now() - timedelta(days=10)))

        make_subscription_aware(self.anon, threads)

        for thread in threads:
            self.assertIsNone(thread.subscription)
示例#5
0
    def test_subscribed_thread(self):
        """make thread sub aware for authenticated"""
        self.user.subscription_set.create(
            thread=self.thread,
            category=self.category,
            last_read_on=timezone.now(),
            send_email=True,
        )

        make_subscription_aware(self.user, self.thread)
        self.assertTrue(self.thread.subscription.send_email)
示例#6
0
    def test_anon_threads_subscription(self):
        """make multiple threads list sub aware for anon"""
        threads = []
        for _ in range(10):
            threads.append(
                self.post_thread(timezone.now() - timedelta(days=10)))

        make_subscription_aware(self.anon, threads)

        for thread in threads:
            self.assertIsNone(thread.subscription)
    def test_subscribed_thread(self):
        """make thread sub aware for authenticated"""
        self.user.subscription_set.create(
            thread=self.thread,
            category=self.category,
            last_read_on=timezone.now(),
            send_email=True,
        )

        make_subscription_aware(self.user, self.thread)
        self.assertTrue(self.thread.subscription.send_email)
示例#8
0
    def test_threads_no_subscription(self):
        """make mulitple threads sub aware for authenticated"""
        threads = []
        for i in xrange(10):
            threads.append(
                self.post_thread(timezone.now() - timedelta(days=10)))

        make_subscription_aware(self.user, threads)

        for thread in threads:
            self.assertIsNone(thread.subscription)
示例#9
0
    def test_threads_no_subscription(self):
        """make mulitple threads sub aware for authenticated"""
        threads = []
        for i in xrange(10):
            threads.append(
                self.post_thread(timezone.now() - timedelta(days=10)))

        make_subscription_aware(self.user, threads)

        for thread in threads:
            self.assertIsNone(thread.subscription)
示例#10
0
    def __init__(self, request, category, list_type, page):
        self.allow_see_list(request, category, list_type)

        category_model = category.unwrap()

        base_queryset = self.get_base_queryset(request, category.categories,
                                               list_type)
        base_queryset = base_queryset.select_related('starter', 'last_poster')

        threads_categories = [category_model] + category.subcategories

        threads_queryset = self.get_remaining_threads_queryset(
            base_queryset, category_model, threads_categories)

        list_page = paginate(threads_queryset, page,
                             settings.MISAGO_THREADS_PER_PAGE,
                             settings.MISAGO_THREADS_TAIL)
        paginator = pagination_dict(list_page)

        if list_page.number > 1:
            threads = list(list_page.object_list)
        else:
            pinned_threads = list(
                self.get_pinned_threads(base_queryset, category_model,
                                        threads_categories))
            threads = list(pinned_threads) + list(list_page.object_list)

        add_categories_to_items(category_model, category.categories, threads)
        add_acl(request.user, threads)
        make_subscription_aware(request.user, threads)

        if list_type in ('new', 'unread'):
            # we already know all threads on list are unread
            for thread in threads:
                thread.is_read = False
                thread.is_new = True
        else:
            threadstracker.make_read_aware(request.user, threads)

        self.filter_threads(request, threads)

        # set state on object for easy access from hooks
        self.category = category
        self.threads = threads
        self.list_type = list_type
        self.paginator = paginator
示例#11
0
    def __init__(self, request, category, list_type, page):
        self.allow_see_list(request, category, list_type)

        category_model = category.unwrap()

        base_queryset = self.get_base_queryset(request, category.categories, list_type)
        base_queryset = base_queryset.select_related('starter', 'last_poster')

        threads_categories = [category_model] + category.subcategories

        threads_queryset = self.get_remaining_threads_queryset(
            base_queryset, category_model, threads_categories
        )

        list_page = paginate(
            threads_queryset, page, settings.MISAGO_THREADS_PER_PAGE, settings.MISAGO_THREADS_TAIL
        )
        paginator = pagination_dict(list_page)

        if list_page.number > 1:
            threads = list(list_page.object_list)
        else:
            pinned_threads = list(
                self.get_pinned_threads(base_queryset, category_model, threads_categories)
            )
            threads = list(pinned_threads) + list(list_page.object_list)

        if list_type in ('new', 'unread'):
            # we already know all threads on list are unread
            threadstracker.make_unread(threads)
        else:
            threadstracker.make_threads_read_aware(request.user, threads)

        add_categories_to_items(category_model, category.categories, threads)

        add_acl(request.user, threads)
        make_subscription_aware(request.user, threads)

        self.filter_threads(request, threads)

        # set state on object for easy access from hooks
        self.category = category
        self.threads = threads
        self.list_type = list_type
        self.paginator = paginator
示例#12
0
 def test_no_subscription(self):
     """make thread sub aware for authenticated"""
     make_subscription_aware(self.user, self.thread)
     self.assertIsNone(self.thread.subscription)
示例#13
0
 def test_anon_subscription(self):
     """make single thread sub aware for anon"""
     make_subscription_aware(self.anon, self.thread)
     self.assertIsNone(self.thread.subscription)
示例#14
0
    def get(self, request, **kwargs):
        try:
            page = int(request.GET.get('page', 0))
            if page == 1:
                page = None
        except ValueError:
            raise Http404()

        list_type = kwargs['list_type']

        categories = self.get_categories(request)
        category = self.get_category(request, categories, **kwargs)

        self.allow_see_list(request, category, list_type)
        subcategories = self.get_subcategories(category, categories)

        queryset = self.get_queryset(request, categories, list_type)

        threads_categories = [category] + subcategories
        rest_queryset = self.get_rest_queryset(queryset, threads_categories)

        page = paginate(rest_queryset, page, 24, 6)
        paginator = pagination_dict(page, include_page_range=False)

        if page.number > 1:
            threads = list(page.object_list)
        else:
            pinned_threads = self.get_pinned_threads(
                queryset, threads_categories)
            threads = list(pinned_threads) + list(page.object_list)

        if list_type in ('new', 'unread'):
            """we already know all threads on list are unread"""
            threadstracker.make_unread(threads)
        else:
            threadstracker.make_threads_read_aware(
                request.user, threads)

        add_categories_to_threads(category, categories, threads)

        visible_subcategories = []
        for thread in threads:
            if (thread.top_category and
                    thread.category in threads_categories and
                    thread.top_category.pk not in visible_subcategories):
                visible_subcategories.append(thread.top_category.pk)

        category.subcategories = []
        for subcategory in subcategories:
            if subcategory.pk in visible_subcategories:
                category.subcategories.append(subcategory)

        add_acl(request.user, threads)
        make_subscription_aware(request.user, threads)

        request.frontend_context.update({
            'THREADS': dict(
                results=ThreadListSerializer(threads, many=True).data,
                subcategories=[c.pk for c in category.subcategories],
                **paginator),
            'CATEGORIES': IndexCategorySerializer(categories, many=True).data,
        })

        if categories[0].special_role:
            request.frontend_context['CATEGORIES'][0]['special_role'] = True

        self.set_frontend_context(request)

        return render(request, self.template_name, dict(
            category=category,

            list_type=list_type,
            list_name=LISTS_NAMES[list_type],

            threads=threads,
            paginator=paginator,
            count=paginator['count'],

            **self.get_extra_context(request)
        ))
示例#15
0
文件: threads.py 项目: Didan/Misago
 def retrieve(self, request, pk=None):
     thread = self.get_thread(request.user, pk)
     make_subscription_aware(request.user, thread)
     return Response(ThreadSerializer(thread).data)
示例#16
0
    def get(self, request, **kwargs):
        try:
            page = int(request.GET.get('page', 0))
            if page == 1:
                page = None
        except ValueError:
            raise Http404()

        list_type = kwargs['list_type']

        categories = self.get_categories(request)
        category = self.get_category(request, categories, **kwargs)

        self.allow_see_list(request, category, list_type)
        subcategories = self.get_subcategories(category, categories)

        queryset = self.get_queryset(request, categories, list_type)

        threads_categories = [category] + subcategories
        rest_queryset = self.get_rest_queryset(queryset, threads_categories)

        page = paginate(rest_queryset, page, 24, 6)
        paginator = pagination_dict(page, include_page_range=False)

        if page.number > 1:
            threads = list(page.object_list)
        else:
            pinned_threads = self.get_pinned_threads(queryset,
                                                     threads_categories)
            threads = list(pinned_threads) + list(page.object_list)

        if list_type in ('new', 'unread'):
            """we already know all threads on list are unread"""
            threadstracker.make_unread(threads)
        else:
            threadstracker.make_threads_read_aware(request.user, threads)

        add_categories_to_threads(category, categories, threads)

        visible_subcategories = []
        for thread in threads:
            if (thread.top_category and thread.category in threads_categories
                    and thread.top_category.pk not in visible_subcategories):
                visible_subcategories.append(thread.top_category.pk)

        category.subcategories = []
        for subcategory in subcategories:
            if subcategory.pk in visible_subcategories:
                category.subcategories.append(subcategory)

        add_acl(request.user, threads)
        make_subscription_aware(request.user, threads)

        request.frontend_context.update({
            'THREADS':
            dict(results=ThreadListSerializer(threads, many=True).data,
                 subcategories=[c.pk for c in category.subcategories],
                 **paginator),
            'CATEGORIES':
            IndexCategorySerializer(categories, many=True).data,
        })

        if categories[0].special_role:
            request.frontend_context['CATEGORIES'][0]['special_role'] = True

        self.set_frontend_context(request)

        return render(
            request, self.template_name,
            dict(category=category,
                 list_type=list_type,
                 list_name=LISTS_NAMES[list_type],
                 threads=threads,
                 paginator=paginator,
                 count=paginator['count'],
                 **self.get_extra_context(request)))
 def test_no_subscription(self):
     """make thread sub aware for authenticated"""
     make_subscription_aware(self.user, self.thread)
     self.assertIsNone(self.thread.subscription)
 def test_anon_subscription(self):
     """make single thread sub aware for anon"""
     make_subscription_aware(self.anon, self.thread)
     self.assertIsNone(self.thread.subscription)
示例#19
0
    def __call__(self, request):
        try:
            page = int(request.query_params.get('page', 0))
        except ValueError:
            raise Http404()

        list_type = request.query_params.get('list') or 'all'
        if list_type not in LIST_TYPES:
            raise Http404()

        categories = self.get_categories(request)
        category = self.get_category(request, categories)

        self.allow_see_list(request, category, list_type)
        subcategories = self.get_subcategories(category, categories)

        queryset = self.get_queryset(request, categories, list_type)

        threads_categories = [category] + subcategories
        rest_queryset = self.get_rest_queryset(
            category, queryset, threads_categories)

        page = paginate(rest_queryset, page, 24, 6,
            allow_explicit_first_page=True
        )
        response_dict = pagination_dict(page, include_page_range=False)

        if page.number > 1:
            threads = list(page.object_list)
        else:
            pinned_threads = self.get_pinned_threads(
                category, queryset, threads_categories)
            threads = list(pinned_threads) + list(page.object_list)

        if list_type in ('new', 'unread'):
            """we already know all threads on list are unread"""
            threadstracker.make_unread(threads)
        else:
            threadstracker.make_threads_read_aware(
                request.user, threads)
        add_categories_to_threads(category, categories, threads)

        visible_subcategories = []
        for thread in threads:
            if (thread.top_category and
                    thread.category in threads_categories and
                    thread.top_category not in visible_subcategories):
                visible_subcategories.append(thread.top_category.pk)

        if self.serialize_subcategories:
            response_dict['subcategories'] = []
            for subcategory in subcategories:
                if subcategory.pk in visible_subcategories:
                    response_dict['subcategories'].append(subcategory.pk)

        add_acl(request.user, threads)
        make_subscription_aware(request.user, threads)

        return Response(dict(
            results=ThreadListSerializer(threads, many=True).data,
            **response_dict))
示例#20
0
文件: threads.py 项目: pylixm/Misago
 def retrieve(self, request, pk=None):
     thread = self.get_thread(request.user, pk)
     make_subscription_aware(request.user, thread)
     return Response(ThreadSerializer(thread).data)