Ejemplo n.º 1
0
    def test_invalid_inputs(self):
        """utility raises exception for invalid inputs"""
        INVALID_INPUTS = (
            None,
            'abc',
            [None],
            [1, 2, 'a', 4],
            [1, None, 3],
            {1: 2, 'a': 4},
        )

        for invalid_input in INVALID_INPUTS:
            with self.assertRaisesMessage(PermissionDenied, "Test error message!"):
                clean_ids_list(invalid_input, "Test error message!")
Ejemplo n.º 2
0
def clean_posts_for_move(request, thread):
    posts_ids = clean_ids_list(
        request.data.get('posts', []),
        _("One or more post ids received were invalid."),
    )

    if not posts_ids:
        raise PermissionDenied(
            _("You have to specify at least one post to move."))
    elif len(posts_ids) > MOVE_LIMIT:
        message = ungettext(
            "No more than %(limit)s post can be moved at single time.",
            "No more than %(limit)s posts can be moved at single time.",
            MOVE_LIMIT,
        )
        raise PermissionDenied(message % {'limit': MOVE_LIMIT})

    posts_queryset = exclude_invisible_posts(request.user, thread.category,
                                             thread.post_set)
    posts_queryset = posts_queryset.filter(id__in=posts_ids).order_by('id')

    posts = []
    for post in posts_queryset:
        post.category = thread.category
        post.thread = thread

        allow_move_post(request.user, post)
        posts.append(post)

    if len(posts) != len(posts_ids):
        raise PermissionDenied(
            _("One or more posts to move could not be found."))

    return posts
Ejemplo n.º 3
0
def clean_threads_for_merge(request):
    threads_ids = clean_ids_list(
        request.data.get('threads', []),
        _("One or more thread ids received were invalid."),
    )

    if len(threads_ids) < 2:
        raise MergeError(
            _("You have to select at least two threads to merge."))
    elif len(threads_ids) > MERGE_LIMIT:
        message = ungettext(
            "No more than %(limit)s thread can be merged at single time.",
            "No more than %(limit)s threads can be merged at single time.",
            MERGE_LIMIT,
        )
        raise MergeError(message % {'limit': MERGE_LIMIT})

    threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)

    threads_queryset = Thread.objects.filter(
        id__in=threads_ids,
        category__tree_id=threads_tree_id,
    ).select_related('category').order_by('-id')

    threads = []
    for thread in threads_queryset:
        add_acl(request.user, thread)
        if can_see_thread(request.user, thread):
            threads.append(thread)

    if len(threads) != len(threads_ids):
        raise MergeError(_("One or more threads to merge could not be found."))

    return threads
Ejemplo n.º 4
0
def clean_threads_for_merge(request):
    threads_ids = clean_ids_list(
        request.data.get('threads', []),
        _("One or more thread ids received were invalid."),
    )

    if len(threads_ids) < 2:
        raise MergeError(_("You have to select at least two threads to merge."))
    elif len(threads_ids) > MERGE_LIMIT:
        message = ungettext(
            "No more than %(limit)s thread can be merged at single time.",
            "No more than %(limit)s threads can be merged at single time.",
            MERGE_LIMIT,
        )
        raise MergeError(message % {'limit': MERGE_LIMIT})

    threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)

    threads_queryset = Thread.objects.filter(
        id__in=threads_ids,
        category__tree_id=threads_tree_id,
    ).select_related('category').order_by('-id')

    threads = []
    for thread in threads_queryset:
        add_acl(request.user, thread)
        if can_see_thread(request.user, thread):
            threads.append(thread)

    if len(threads) != len(threads_ids):
        raise MergeError(_("One or more threads to merge could not be found."))

    return threads
Ejemplo n.º 5
0
def clean_posts_for_split(request, thread):
    posts_ids = clean_ids_list(
        request.data.get('posts', []),
        _("One or more post ids received were invalid."),
    )

    if not posts_ids:
        raise PermissionDenied(_("You have to specify at least one post to split."))
    elif len(posts_ids) > SPLIT_LIMIT:
        message = ungettext(
            "No more than %(limit)s post can be split at single time.",
            "No more than %(limit)s posts can be split at single time.",
            SPLIT_LIMIT,
        )
        raise PermissionDenied(message % {'limit': SPLIT_LIMIT})

    posts_queryset = exclude_invisible_posts(request.user, thread.category, thread.post_set)
    posts_queryset = posts_queryset.filter(id__in=posts_ids).order_by('id')

    posts = []
    for post in posts_queryset:
        post.category = thread.category
        post.thread = thread

        allow_split_post(request.user, post)

        posts.append(post)

    if len(posts) != len(posts_ids):
        raise PermissionDenied(_("One or more posts to split could not be found."))

    return posts
Ejemplo n.º 6
0
def clean_posts_for_merge(request, thread):
    posts_ids = clean_ids_list(
        request.data.get('posts', []),
        _("One or more post ids received were invalid."),
    )

    if len(posts_ids) < 2:
        raise PermissionDenied(_("You have to select at least two posts to merge."))
    elif len(posts_ids) > MERGE_LIMIT:
        message = ungettext(
            "No more than %(limit)s post can be merged at single time.",
            "No more than %(limit)s posts can be merged at single time.",
            MERGE_LIMIT,
        )
        raise PermissionDenied(message % {'limit': MERGE_LIMIT})

    posts_queryset = exclude_invisible_posts(request.user, thread.category, thread.post_set)
    posts_queryset = posts_queryset.filter(id__in=posts_ids).order_by('id')

    posts = []
    for post in posts_queryset:
        post.category = thread.category
        post.thread = thread

        allow_merge_post(request.user, post)

        if not posts:
            posts.append(post)
        else:
            authorship_error = _("Posts made by different users can't be merged.")
            if posts[0].poster_id:
                if post.poster_id != posts[0].poster_id:
                    raise PermissionDenied(authorship_error)
            else:
                if post.poster_id or post.poster_name != posts[0].poster_name:
                    raise PermissionDenied(authorship_error)

            if posts[0].pk != thread.first_post_id:
                if (posts[0].is_hidden != post.is_hidden or
                        posts[0].is_unapproved != post.is_unapproved):
                    raise PermissionDenied(_("Posts with different visibility can't be merged."))

            posts.append(post)

    if len(posts) != len(posts_ids):
        raise PermissionDenied(_("One or more posts to merge could not be found."))

    return posts
Ejemplo n.º 7
0
def clean_threads_ids(request):
    threads_ids = clean_ids_list(
        request.data or [],
        _("One or more thread ids received were invalid."),
    )

    if not threads_ids:
        raise PermissionDenied(_("You have to specify at least one thread to delete."))
    elif len(threads_ids) > DELETE_LIMIT:
        message = ungettext(
            "No more than %(limit)s thread can be deleted at single time.",
            "No more than %(limit)s threads can be deleted at single time.",
            DELETE_LIMIT,
        )
        raise PermissionDenied(message % {'limit': DELETE_LIMIT})

    return sorted(set(threads_ids), reverse=True)
Ejemplo n.º 8
0
def clean_threads_ids(request):
    threads_ids = clean_ids_list(
        request.data or [],
        _("One or more thread ids received were invalid."),
    )

    if not threads_ids:
        raise PermissionDenied(
            _("You have to specify at least one thread to delete."))
    elif len(threads_ids) > DELETE_LIMIT:
        message = ungettext(
            "No more than %(limit)s thread can be deleted at single time.",
            "No more than %(limit)s threads can be deleted at single time.",
            DELETE_LIMIT,
        )
        raise PermissionDenied(message % {'limit': DELETE_LIMIT})

    return sorted(set(threads_ids), reverse=True)
Ejemplo n.º 9
0
 def test_message(self):
     """utility uses passed message for exception"""
     with self.assertRaisesMessage(PermissionDenied, "Test error message!"):
         clean_ids_list(None, "Test error message!")
Ejemplo n.º 10
0
 def test_string_list(self):
     """string list passes validation"""
     self.assertEqual(clean_ids_list('1234', None), [1, 2, 3, 4])
Ejemplo n.º 11
0
 def test_empty_list(self):
     """empty list passes validation"""
     self.assertEqual(clean_ids_list([], None), [])
Ejemplo n.º 12
0
 def test_valid_list(self):
     """list of valid ids is cleaned"""
     self.assertEqual(clean_ids_list(['1', 3, '42'], None), [1, 3, 42])
Ejemplo n.º 13
0
 def test_message(self):
     """utility uses passed message for exception"""
     with self.assertRaisesMessage(PermissionDenied, "Test error message!"):
         clean_ids_list(None, "Test error message!")
Ejemplo n.º 14
0
 def test_string_list(self):
     """string list passes validation"""
     self.assertEqual(clean_ids_list('1234', None), [1, 2, 3, 4])
Ejemplo n.º 15
0
 def test_empty_list(self):
     """empty list passes validation"""
     self.assertEqual(clean_ids_list([], None), [])
Ejemplo n.º 16
0
 def test_valid_list(self):
     """list of valid ids is cleaned"""
     self.assertEqual(clean_ids_list(['1', 3, '42'], None), [1, 3, 42])