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!")
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
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
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
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
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
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)
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)
def test_message(self): """utility uses passed message for exception""" with self.assertRaisesMessage(PermissionDenied, "Test error message!"): clean_ids_list(None, "Test error message!")
def test_string_list(self): """string list passes validation""" self.assertEqual(clean_ids_list('1234', None), [1, 2, 3, 4])
def test_empty_list(self): """empty list passes validation""" self.assertEqual(clean_ids_list([], None), [])
def test_valid_list(self): """list of valid ids is cleaned""" self.assertEqual(clean_ids_list(['1', 3, '42'], None), [1, 3, 42])
def test_message(self): """utility uses passed message for exception""" with self.assertRaisesMessage(PermissionDenied, "Test error message!"): clean_ids_list(None, "Test error message!")
def test_string_list(self): """string list passes validation""" self.assertEqual(clean_ids_list('1234', None), [1, 2, 3, 4])
def test_empty_list(self): """empty list passes validation""" self.assertEqual(clean_ids_list([], None), [])
def test_valid_list(self): """list of valid ids is cleaned""" self.assertEqual(clean_ids_list(['1', 3, '42'], None), [1, 3, 42])