def create_other_threads(self): for page in LessonPage.objects.all(): if not page.has_own_topic: new_topic, topic_created = Topic.objects.get_or_create( forum=Forum.objects.get(name='Lessons Forum'), name='Урок-' + str(page.lesson_number), user=User.objects.get(username='******'), slug='lecon' + str(page.lesson_number), ) if topic_created: page.topic_id = new_topic.id self.stdout.write( str(page.lesson_number) + ' thread created') body = 'Не стесняйтесь задавать вопросы и комментировать.' new_post = Post( body=body, topic_id=new_topic.id, user_id=new_topic.user_id, user_ip='1.1.1.1', created=datetime.now(), ) new_post.save() self.stdout.write(str(lesson_number) + ' post created') else: self.stdout.write( str(lesson_number) + ' thread not created') page.save()
def create_other_threads(self): for page in LessonPage.objects.all(): if not page.has_own_topic: new_topic, topic_created = Topic.objects.get_or_create( forum=Forum.objects.get(name='Lessons Forum'), name='Урок-' + str(page.lesson_number), user=User.objects.get(username='******'), slug='lecon' + str(page.lesson_number), ) if topic_created: page.topic_id = new_topic.id self.stdout.write(str(page.lesson_number) + ' thread created') body = 'Не стесняйтесь задавать вопросы и комментировать.' new_post = Post( body=body, topic_id=new_topic.id, user_id=new_topic.user_id, user_ip='1.1.1.1', created=datetime.now(), ) new_post.save() self.stdout.write(str(lesson_number) + ' post created') else: self.stdout.write(str(lesson_number) + ' thread not created') page.save()
def test_topics_delete_view(self): topic2 = Topic.objects.create(name='Topic 2', forum=self.forum, user=self.superuser) post2 = Post(topic=topic2, user=self.superuser, body='post on topic2') post2.save() topics_delete_url = reverse('pybb:topics_delete') self.login_as(self.staff) response = self.client.post(topics_delete_url, data={ 'topic_ids': [self.topic.pk, topic2.pk], 'topic': topic2, 'confirm': True }) topic2 = Topic.objects.get(pk=topic2.pk) self.assertTrue(topic2.delete) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['form'].forms), 2) self.assertTemplateUsed(response, 'pybb/topic/delete.html')
def test_topic_merge_form(self): topic = Topic.objects.create(name='merged_topic', forum=self.forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='merged post') post.save() form = TopicMergeForm(topic=topic, data={ 'topic': topic.pk }) self.assertFalse(form.is_valid()) self.assertIn('topic', form.errors) form = TopicMergeForm(topic=topic, data={ 'topic': self.topic.pk }) self.assertTrue(form.is_valid()) new_topic = form.save() topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.assertEqual(new_topic.redirections.count(), 1) self.assertEqual(Post.objects.get(pk=post.pk).topic, self.topic) self.assertEqual(topic.posts.count(), 0)
def test_topic_merge_formset(self): topic = Topic.objects.create(name='merged_topic', forum=self.forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='merged post') post.save() topics = [topic] FormSet = get_topic_merge_formset(topics=topics) formset = FormSet() for i in range(len(topics)): self.assertEqual(formset.forms[i].topic, topics[i]) formset = FormSet(data={ 'form-TOTAL_FORMS': 1, 'form-INITIAL_FORMS': 0, 'form-0-topic': self.topic.pk }) self.assertTrue(formset.is_valid()) for form in formset: new_topic = form.save() topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.assertEqual(new_topic.redirections.count(), 1) self.assertEqual(Post.objects.get(pk=post.pk).topic, self.topic) self.assertEqual(topic.posts.count(), 0)
def test_topics_delete_complete(self): topic2 = Topic.objects.create(name='Topic 2', forum=self.forum, user=self.superuser) post2 = Post(topic=topic2, user=self.superuser, body='post on topic2') post2.save() topics_delete_url = reverse('pybb:topics_delete') self.login_as(self.staff) response = self.client.post(topics_delete_url, data={ 'topic_ids': [self.topic.pk, topic2.pk], 'form-TOTAL_FORMS': 2, 'form-INITIAL_FORMS': 0, 'form-0-topic': self.topic.pk, 'form-0-confirm': True, 'form-1-topic': topic2.pk, 'form-1-confirm': True, 'submit': 1 }) topic2 = Topic.objects.get(pk=topic2.pk) self.assertTrue(self.topic.delete) self.assertTrue(topic2.delete) self.assertRedirects(response, reverse('pybb:index'))
def test_multiple_quote_add(self): self.user self.login_as(self.staff) self.post post = Post(topic=self.topic, user=self.superuser, body='[b]do you want my pere nowel?[/b]') post.save() response = self.client.post(reverse('quote'), data={ 'topic_id': self.topic.pk, 'post_id': post.pk }) self.assertEqual(response.status_code, 302) response = self.client.get(reverse('pybb:post_create', kwargs={'topic_id': self.topic.id}) + '?quote_id=%d' % self.post.id) self.assertEqual(response.context['form'].initial['body'], u'[quote="zeus;{}"]bbcode [b]test[/b][/quote]\n\n[quote="oleiade;{}"][b]do you want my pere nowel?[/b][/quote]\n\n'.format(self.post.pk, post.pk)) self.assertEqual(response.status_code, 200) response = self.client.post(reverse('quote'), data={ 'topic_id': self.topic.pk, 'post_id': post.pk }) self.assertEqual(response.status_code, 302) response = self.client.get(reverse('pybb:post_create', kwargs={'topic_id': self.topic.id})) self.assertTrue('body' not in response.context['form'].initial) self.assertEqual(response.status_code, 200)
def test_topic_delete_formset(self): topic2 = Topic.objects.create(name='Topic 2', forum=self.forum, user=self.superuser) post2 = Post(topic=topic2, user=self.superuser, body='post on topic2') post2.save() topics = Topic.objects.filter(pk__in=[self.topic.pk, topic2.pk]) FormSet = get_topic_delete_formset(topics=topics) formset = FormSet(data={ 'form-TOTAL_FORMS': 2, 'form-INITIAL_FORMS': 0, 'form-0-topic': self.topic.pk, 'form-0-confirm': True, 'form-1-topic': topic2.pk, 'form-1-confirm': True, }) self.assertTrue(formset.is_valid()) for form in formset: topic = form.save() self.assertTrue(topic.deleted)
def test_topic_move_form_with_new_forum(self): forum = Forum.objects.create(name='temporary forum') topic = Topic.objects.create(name='move_topic', forum=forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='move post') post.save() name = 'new name for temporary topic' form = TopicMoveForm(topic=topic, data={ 'name': name, 'forum': self.forum.pk, 'redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT }) self.assertTrue(form.is_valid()) new_topic = form.save() topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.failUnless(new_topic.slug is not None) self.assertEqual(new_topic.redirections.count(), 1) self.assertEqual(Post.objects.get(pk=post.pk).topic, new_topic) self.assertEqual(topic.posts.count(), 0)
def test_topic_move_complete(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() topic_merge_url = reverse('pybb:topic_move') self.login_as(self.staff) name = 'new name for a topic' response = self.client.post(topic_merge_url, data={ 'topic_ids': [topic.pk], 'form-TOTAL_FORMS': 1, 'form-INITIAL_FORMS': 0, 'form-0-name': name, 'form-0-forum': self.forum.pk, 'form-0-redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT, 'submit': 1 }) self.assertRedirects(response, reverse('pybb:index')) topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.failUnless(topic.redirection is not None) redirection = topic.redirection new_topic = redirection.to_topic self.assertEqual(new_topic.name, name) self.assertEqual(new_topic.post_count, 1)
def test_topic_tracker_redirect_view(self): self.login_as(self.staff) self.post response = self.client.get(reverse('pybb:topic_tracker_redirect', kwargs={ 'topic_id': self.topic.pk })) self.assertRedirects(response, self.topic.get_absolute_url(), status_code=301) TopicReadTracker.objects.create(topic=self.topic, user=self.staff) response = self.client.get(reverse('pybb:topic_tracker_redirect', kwargs={ 'topic_id': self.topic.pk })) self.client.get(self.topic.get_absolute_url()) post = Post(topic=self.topic, user=self.user, body='test') post.save() response = self.client.get(reverse('pybb:topic_tracker_redirect', kwargs={ 'topic_id': self.topic.pk })) self.assertRedirects(response, post.get_absolute_url(), status_code=301)
def test_topic_move_form_errors(self): forum = Forum.objects.create(name='temporary forum') topic = Topic.objects.create(name='move_topic', forum=forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='move post') post.save() form = TopicMoveForm(topic=topic, data={ 'name': topic.name, 'forum': forum.pk, 'redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT }) self.assertFalse(form.is_valid()) self.assertIn('name', form.errors) Topic.objects.create(name='move_topic', forum=self.forum, user=self.superuser) form = TopicMoveForm(topic=topic, data={ 'forum': self.forum.pk, 'redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT }) self.assertFalse(form.is_valid()) self.assertIn('name', form.errors) form = TopicMoveForm(topic=topic, data={ 'forum': self.forum.pk, 'redirection_type': TopicRedirection.TYPE_EXPIRING_REDIRECT }) self.assertFalse(form.is_valid()) self.assertIn('expired', form.errors)
def save(self, commit=True): if self.instance.pk: post = super(PostForm, self).save(commit=False) if self.user: post.user = self.user if post.topic.head == post: post.topic.name = self.cleaned_data['name'] post.topic.updated = datetime.now() post.topic.save() post.save() return post allow_post = True if defaults.PYBB_PREMODERATION: allow_post = defaults.PYBB_PREMODERATION(self.user, self.cleaned_data['body']) if self.forum: topic = Topic(forum=self.forum, user=self.user, name=self.cleaned_data['name']) if not allow_post: topic.on_moderation = True topic.save() else: topic = self.topic post = Post(topic=topic, user=self.user, user_ip=self.ip, body=self.cleaned_data['body']) if not allow_post: post.on_moderation = True post.save() return post
def test_topic_delete_formset(self): topic2 = Topic.objects.create(name='Topic 2', forum=self.forum, user=self.superuser) post2 = Post(topic=topic2, user=self.superuser, body='post on topic2') post2.save() topics = Topic.objects.filter(pk__in=[self.topic.pk, topic2.pk]) FormSet = get_topic_delete_formset(topics=topics) formset = FormSet( data={ 'form-TOTAL_FORMS': 2, 'form-INITIAL_FORMS': 0, 'form-0-topic': self.topic.pk, 'form-0-confirm': True, 'form-1-topic': topic2.pk, 'form-1-confirm': True, }) self.assertTrue(formset.is_valid()) for form in formset: topic = form.save() self.assertTrue(topic.deleted)
def test_topic_move_form_with_new_forum(self): forum = Forum.objects.create(name='temporary forum') topic = Topic.objects.create(name='move_topic', forum=forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='move post') post.save() name = 'new name for temporary topic' form = TopicMoveForm(topic=topic, data={ 'name': name, 'forum': self.forum.pk, 'redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT }) self.assertTrue(form.is_valid()) new_topic = form.save() topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.assertTrue(new_topic.slug is not None) self.assertEqual(new_topic.redirections.count(), 1) self.assertEqual(Post.objects.get(pk=post.pk).topic, new_topic) self.assertEqual(topic.posts.count(), 0)
def test_subscription(self): user = get_user_model().objects.create_user(username='******', password='******', email='*****@*****.**') client = Client() client.login(username='******', password='******') response = client.post(reverse('pybb:subscription_create'), data={ 'topic_id': self.topic.pk, 'type': Subscription.TYPE_INSTANT_ALERT }) self.assertEqual(response.status_code, 302) self.assertRedirects(response, self.topic.get_absolute_url()) self.assertTrue(user in list(self.topic.subscribers.all())) new_post = Post(topic=self.topic, user=self.user, body='test subscribtion юникод') new_post.save() self.assertTrue([ msg for msg in mail.outbox if new_post.get_absolute_url() in msg.body ]) response = client.post(reverse('pybb:subscription_delete'), data={'topic_id': self.topic.pk}) self.assertEqual(response.status_code, 302) self.assertRedirects(response, self.topic.get_absolute_url()) self.assertTrue(user not in list(self.topic.subscribers.all()))
def test_topic_merge_form(self): topic = Topic.objects.create(name='merged_topic', forum=self.forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='merged post') post.save() form = TopicMergeForm(topic=topic, data={'topic': topic.pk}) self.assertFalse(form.is_valid()) self.assertIn('topic', form.errors) form = TopicMergeForm(topic=topic, data={'topic': self.topic.pk}) self.assertTrue(form.is_valid()) new_topic = form.save() topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.assertEqual(new_topic.redirections.count(), 1) self.assertEqual(Post.objects.get(pk=post.pk).topic, self.topic) self.assertEqual(topic.posts.count(), 0)
def test_simple_quote(self): post = Post(user=self.staff, body='[quote="zeus;%d"]Super quote[/quote]' % self.post.pk, topic=self.topic) post.save() self.assertHTMLEqual(minify_html(post.body_html), u'<blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/zeus/">zeus</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"> Super quote </div></blockquote>'.format(self.post.topic_id, self.post.id)) self.assertEqual(Quote.objects.filter(from_post=post).count(), 1)
def test_undelete_post_topic_view(self): post = Post(topic=self.topic, user=self.user, body='test to delete', deleted=True) post.save() post.mark_as_deleted(user=self.user) self.login() self.post.mark_as_deleted(user=self.user) response = self.client.post( reverse('pybb:post_delete', args=[self.post.id])) self.assertEqual(response.status_code, 302) self.post = Post.objects.get(pk=self.post.pk) self.assertRaises(PostDeletion.DoesNotExist, lambda: self.post.deletion) self.assertFalse(self.post.deleted) self.assertTrue(Post.objects.get(pk=post.pk).deleted)
def test_forum_updated(self): time.sleep(1) topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() post = Post.objects.get(id=post.id) self.assertTrue(self.forum.updated == post.created)
def test_hidden(self): client = Client() parent = Forum(name='hcat', hidden=True) parent.save() forum_in_hidden = Forum(name='in_hidden', forum=parent) forum_in_hidden.save() topic_in_hidden = Topic(forum=forum_in_hidden, name='in_hidden', user=self.user) topic_in_hidden.save() forum_hidden = Forum(name='hidden', forum=self.parent_forum, hidden=True) forum_hidden.save() topic_hidden = Topic(forum=forum_hidden, name='hidden', user=self.user) topic_hidden.save() post_hidden = Post(topic=topic_hidden, user=self.user, body='hidden') post_hidden.save() post_in_hidden = Post(topic=topic_in_hidden, user=self.user, body='hidden') post_in_hidden.save() self.assertFalse(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 302) self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 302) self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 302) self.assertNotContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url()) self.assertNotContains(client.get(reverse('pybb:feed_topics')), topic_hidden.get_absolute_url()) self.assertNotContains(client.get(reverse('pybb:feed_topics')), topic_in_hidden.get_absolute_url()) self.assertNotContains(client.get(reverse('pybb:feed_posts')), post_hidden.get_absolute_url()) self.assertNotContains(client.get(reverse('pybb:feed_posts')), post_in_hidden.get_absolute_url()) self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 302) self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 302) client.login(username='******', password='******') self.assertTrue(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url()) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 200) self.user.is_staff = True self.user.save() self.assertTrue(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url()) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 200)
def test_topic_deletion(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() post = Post(topic=topic, user=self.user, body='two') post.save() post.delete() Topic.objects.get(id=topic.id) Forum.objects.get(id=self.forum.id) topic.delete() Forum.objects.get(id=self.forum.id)
def test_delete_post_view_own_user(self): post = Post(topic=self.topic, user=self.user, body='test to delete') post.save() self.login() response = self.client.post(reverse('pybb:post_delete', args=[post.id])) self.assertEqual(response.status_code, 302) self.assertRaises(Post.DoesNotExist, lambda: Post.objects.get(pk=post.pk, deleted=False)) self.assertNotEqual(post.deletion, None)
def test_simple_quote(self): post = Post(user=self.staff, body='[quote="zeus;%d"]Super quote[/quote]' % self.post.pk, topic=self.topic) post.save() self.assertHTMLEqual( minify_html(post.body_html), u'<blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/zeus/">zeus</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"> Super quote </div></blockquote>' .format(self.post.topic_id, self.post.id)) self.assertEqual(Quote.objects.filter(from_post=post).count(), 1)
def test_staff(self): client = Client() parent = Forum(name='hcat', staff=True) parent.save() forum_in_staff = Forum(name='in_staff', forum=parent) forum_in_staff.save() topic_in_staff = Topic(forum=forum_in_staff, name='in_staff', user=self.user) topic_in_staff.save() forum_staff = Forum(name='staff', forum=self.parent_forum, staff=True) forum_staff.save() topic_staff = Topic(forum=forum_staff, name='staff', user=self.user) topic_staff.save() post_staff = Post(topic=topic_staff, user=self.user, body='staff') post_staff.save() post_in_staff = Post(topic=topic_in_staff, user=self.user, body='staff') post_in_staff.save() self.assertFalse(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 404) self.assertEqual(client.get(forum_in_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(topic_in_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(forum_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(topic_staff.get_absolute_url()).status_code, 404) client.login(username='******', password='******') self.assertFalse(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertNotContains(client.get(reverse('pybb:index')), forum_staff.get_absolute_url()) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 404) self.assertEqual(client.get(forum_in_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(topic_in_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(forum_staff.get_absolute_url()).status_code, 404) self.assertEqual(client.get(topic_staff.get_absolute_url()).status_code, 404) self.user.is_staff = True self.user.save() self.assertTrue(parent.id in [c.id for c in client.get(reverse('pybb:index')).context['forums']]) self.assertEqual(client.get(parent.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_in_staff.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_in_staff.get_absolute_url()).status_code, 200) self.assertEqual(client.get(forum_staff.get_absolute_url()).status_code, 200) self.assertEqual(client.get(topic_staff.get_absolute_url()).status_code, 200)
def save(self, commit=True): if self.instance.pk: post = super(PostForm, self).save(commit=False) if self.user: post.user = self.user if post.topic.head == post: post.topic.name = self.cleaned_data['name'] if self.may_create_poll: post.topic.poll_type = self.cleaned_data['poll_type'] post.topic.poll_question = self.cleaned_data[ 'poll_question'] post.topic.updated = tznow() if commit: post.topic.save() post.updated = tznow() if commit: post.save() # Subscribe to topic if self.cleaned_data['subscribe']: post.topic.subscribers.add(self.user) else: post.topic.subscribers.remove(self.user) return post, post.topic allow_post = True if defaults.PYBB_PREMODERATION: allow_post = defaults.PYBB_PREMODERATION(self.user, self.cleaned_data['body']) if self.forum: topic = Topic( forum=self.forum, user=self.user, name=self.cleaned_data['name'], poll_type=self.cleaned_data.get('poll_type', Topic.POLL_TYPE_NONE), poll_question=self.cleaned_data.get('poll_question', None), slug=self.cleaned_data.get('slug', None), ) if not allow_post: topic.on_moderation = True else: topic = self.topic post = Post(user=self.user, user_ip=self.ip, body=self.cleaned_data['body']) if not allow_post: post.on_moderation = True if commit: topic.save() post.topic = topic post.save() return post, topic
def test_compute(self): # initials self.assertEqual(self.forum.forum_count, 0) self.assertEqual(self.parent_forum.forum_count, 1) self.topic self.post parent_forum = Forum.objects.get(pk=self.parent_forum.pk) self.assertEqual(parent_forum.topic_count, 1) self.assertEqual(parent_forum.post_count, 1) self.assertEqual(self.forum.topic_count, 1) self.assertEqual(self.forum.post_count, 1) forum = Forum.objects.create(name='bar', description='bar', forum=self.forum) topic = Topic(name='bar', forum=forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='my new post') post.save() self.assertEqual(topic.post_count, 1) self.assertEqual(forum.topic_count, 1) self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 2) self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 2) new_topic = Topic(name='foo', forum=self.forum, user=self.user) new_topic.save() new_post = Post(topic=topic, user=self.user, body='my new post') new_post.save() self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 3) self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 3) post.mark_as_deleted(commit=True) self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 2) self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 2) self.assertTrue(Topic.objects.get(pk=topic.pk).deleted) self.assertEqual(Forum.objects.get(pk=forum.pk).topic_count, 0) self.assertEqual(Forum.objects.get(pk=forum.pk).post_count, 0) new_topic.mark_as_deleted() self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 1) self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 1)
def test_double_quote(self): post_1 = Post(user=self.staff, body='[quote="%s;%d"]%s[/quote]' % (self.post.user.username, self.post.pk, self.post.body), topic=self.topic) post_1.save() post_2 = Post(user=self.superuser, body='[quote="%s;%d"]%s[/quote]' % (post_1.user.username, post_1.pk, post_1.body), topic=self.topic) post_2.save() self.assertHTMLEqual(minify_html(post_2.body_html), u'<blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/thoas/">thoas</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"><blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/zeus/">zeus</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"> bbcode <strong>test</strong></div></blockquote></div></blockquote>'.format(post_1.topic_id, post_1.id, self.post.topic_id, self.post.id)) self.assertEqual(Quote.objects.filter(from_post=post_2).count(), 2)
def test_topic_updated(self): topic = Topic(name='etopic', forum=self.forum, user=self.user) topic.save() time.sleep(1) post = Post(topic=topic, user=self.user, body='bbcode [b]test[b]') post.save() client = Client() response = client.get(self.forum.get_absolute_url()) self.assertEqual(response.context['topic_list'][0], topic) time.sleep(1) post = Post(topic=self.topic, user=self.user, body='bbcode [b]test[b]') post.save() client = Client() response = client.get(self.forum.get_absolute_url()) self.assertEqual(response.context['topic_list'][0], self.topic)
def test_topic_merge_view(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() topic_merge_url = reverse('pybb:topic_merge') self.login_as(self.staff) response = self.client.post(topic_merge_url, data={'topic_ids': [topic.pk]}) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['form'].forms), 1) self.assertTemplateUsed(response, 'pybb/topic/merge.html')
def test_undelete_post_view_own_user(self): post = Post(topic=self.topic, user=self.user, body='test to delete', deleted=True) post.save() PostDeletion.objects.create(post=post, user=self.user) self.login() response = self.client.post(reverse('pybb:post_delete', args=[post.id])) self.assertEqual(response.status_code, 302) post = Post.objects.get(pk=post.pk) self.assertRaises(PostDeletion.DoesNotExist, lambda: post.deletion) self.assertFalse(post.deleted)
def test_multiple_mentions(self): self.user self.staff self.superuser multiple_mentions = Post(topic=self.topic, user=self.user, body='@thoas is right and @oleiade or @zeus!') processor = MentionProcessor(multiple_mentions.body, obj=multiple_mentions) self.assertEqual(processor.render(), u'[mention=%d]thoas[/mention] is right and [mention=%d]oleiade[/mention] or [mention=%d]zeus[/mention]!' % ( self.staff.pk, self.superuser.pk, self.user.pk )) multiple_mentions.save() self.assertEqual(Mention.objects.filter(post=multiple_mentions).count(), 3)
def test_topic_merge_view(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() topic_merge_url = reverse('pybb:topic_merge') self.login_as(self.staff) response = self.client.post(topic_merge_url, data={ 'topic_ids': [topic.pk] }) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['form'].forms), 1) self.assertTemplateUsed(response, 'pybb/topic/merge.html')
def handle(self, *args, **options): _parser = Markdown( extensions=[ 'forum.mdownx.nofollowlinks', 'markdown.extensions.nl2br', 'pymdownx.extra', 'pymdownx.emoji', 'pymdownx.tasklist', 'pymdownx.details', 'pymdownx.superfences', 'pymdownx.details', ], safe_mode='escape', ) table = self.import_from_csv('narodny_konspekt.csv') for lesson_number in table: table[lesson_number] = self.rewrite(table[lesson_number]) if isinstance(table[lesson_number], float): pass else: try: page = LessonPage.objects.get(lesson_number=lesson_number) except: self.stdout.write("Lesson page doesn't exist") break page.has_own_topic = True new_topic, topic_created = Topic.objects.get_or_create( forum=Forum.objects.get(name='Lessons Forum'), name='Урок-' + str(page.lesson_number), user=User.objects.get(username='******'), slug='lecon' + str(page.lesson_number), ) page.topic_id = new_topic.id self.stdout.write(str(lesson_number) + ' thread created') body = table[lesson_number] new_post = Post( body=body, topic_id=new_topic.id, user_id=new_topic.user_id, user_ip='1.1.1.1', created=datetime.now(tz=pytz.timezone(settings.TIME_ZONE)), ) new_post.save() self.stdout.write(str(lesson_number) + ' post created') page.save()
def test_topic_merge_complete(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() topic_merge_url = reverse('pybb:topic_merge') self.login_as(self.staff) response = self.client.post(topic_merge_url, data={ 'topic_ids': [topic.pk], 'form-TOTAL_FORMS': 1, 'form-INITIAL_FORMS': 0, 'form-0-topic': self.topic.pk, 'submit': 1 }) self.assertRedirects(response, reverse('pybb:index'))
def test_delete_post_view_superuser(self): post = Post(topic=self.topic, user=self.user, body='test to delete') post.save() self.user.is_superuser = True self.user.save() self.login() response = self.client.post(reverse('pybb:post_delete', args=[post.id]), follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Topic.objects.filter(id=self.topic.id).count(), 1) self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1) response = self.client.post(reverse('pybb:post_delete', args=[self.post.id]), follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Post.objects.filter(id=self.post.id, deleted=False).count(), 0) self.assertEqual(Topic.objects.filter(id=self.topic.id, deleted=False).count(), 0) self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1)
def test_double_quote(self): post_1 = Post(user=self.staff, body='[quote="%s;%d"]%s[/quote]' % (self.post.user.username, self.post.pk, self.post.body), topic=self.topic) post_1.save() post_2 = Post(user=self.superuser, body='[quote="%s;%d"]%s[/quote]' % (post_1.user.username, post_1.pk, post_1.body), topic=self.topic) post_2.save() self.assertHTMLEqual( minify_html(post_2.body_html), u'<blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/thoas/">thoas</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"><blockquote><div class="quote-author"> Posted by <a class="quote-author-name" href="/users/zeus/">zeus</a><a rel="nofollow" class="quote-message-link" href="/xfoo/{}-etopic#post{}"></a></div><div class="quote-message"> bbcode <strong>test</strong></div></blockquote></div></blockquote>' .format(post_1.topic_id, post_1.id, self.post.topic_id, self.post.id)) self.assertEqual(Quote.objects.filter(from_post=post_2).count(), 2)
def save(self, commit=True): topic = super(MoveTopicForm, self).save(commit=False) if 'target_forums' in self.changed_data: forum_id = int(self.cleaned_data['target_forums']) target_forum = Forum.objects.get(pk=forum_id) if not pybb_can_administer_forum(self.user, target_forum): raise PermissionDenied topic.forum = target_forum topic.save() # Unsubscribe all users that aren't allowed to read the target # forum list_subscribers = list(topic.subscribers.all()) for subscriber in list_subscribers: if not pybb_can_view_forum(subscriber, target_forum): topic.subscribers.remove(subscriber) if self.cleaned_data['leave_placeholder']: t = template.loader.get_template( 'pybb/messages/topic_moved.html') post_body = mark_safe( t.render(Context({ 'topic': topic, 'domain': self.domain }))) placeholder_topic = Topic(forum=self.original_forum, user=self.user, name=topic.name, status=2, topic_after_move=topic, hidden=topic.hidden) placeholder_topic.save() post = Post(topic=placeholder_topic, user=self.user, user_ip=self.ip, body=post_body) post.save() return self.instance
def test_multiple_quote_add(self): self.user self.login_as(self.staff) self.post post = Post(topic=self.topic, user=self.superuser, body='[b]do you want my pere nowel?[/b]') post.save() response = self.client.post(reverse('quote'), data={ 'topic_id': self.topic.pk, 'post_id': post.pk }) self.assertEqual(response.status_code, 302) response = self.client.get( reverse('pybb:post_create', kwargs={'topic_id': self.topic.id}) + '?quote_id=%d' % self.post.id) self.assertEqual( response.context['form'].initial['body'], u'[quote="zeus;{}"]bbcode [b]test[/b][/quote]\n\n[quote="oleiade;{}"][b]do you want my pere nowel?[/b][/quote]\n\n' .format(self.post.pk, post.pk)) self.assertEqual(response.status_code, 200) response = self.client.post(reverse('quote'), data={ 'topic_id': self.topic.pk, 'post_id': post.pk }) self.assertEqual(response.status_code, 302) response = self.client.get( reverse('pybb:post_create', kwargs={'topic_id': self.topic.id})) self.assertTrue('body' not in response.context['form'].initial) self.assertEqual(response.status_code, 200)
def save(self, commit=True): if self.instance.pk: post = super(PostForm, self).save(commit=False) if self.user: post.user = self.user if post.topic.head == post: post.topic.name = self.cleaned_data['name'] if self.may_create_poll: post.topic.poll_type = self.cleaned_data['poll_type'] post.topic.poll_question = self.cleaned_data['poll_question'] post.topic.updated = tznow() if commit: post.topic.save() post.updated = tznow() if commit: post.save() return post, post.topic allow_post = True if defaults.PYBB_PREMODERATION: allow_post = defaults.PYBB_PREMODERATION(self.user, self.cleaned_data['body']) if self.forum: topic = Topic( forum=self.forum, user=self.user, name=self.cleaned_data['name'], poll_type=self.cleaned_data.get('poll_type', Topic.POLL_TYPE_NONE), poll_question=self.cleaned_data.get('poll_question', None), slug=self.cleaned_data.get('slug', None), ) if not allow_post: topic.on_moderation = True else: topic = self.topic post = Post(user=self.user, user_ip=self.ip, body=self.cleaned_data['body']) if not allow_post: post.on_moderation = True if commit: topic.save() post.topic = topic post.save() return post, topic
def test_subscription(self): user = get_user_model().objects.create_user(username='******', password='******', email='*****@*****.**') client = Client() client.login(username='******', password='******') response = client.post(reverse('pybb:subscription_create'), data={ 'topic_id': self.topic.pk, 'type': Subscription.TYPE_INSTANT_ALERT }) self.assertEqual(response.status_code, 302) self.assertRedirects(response, self.topic.get_absolute_url()) self.assertTrue(user in list(self.topic.subscribers.all())) new_post = Post(topic=self.topic, user=self.user, body='test subscribtion юникод') new_post.save() self.assertTrue([msg for msg in mail.outbox if new_post.get_absolute_url() in msg.body]) response = client.post(reverse('pybb:subscription_delete'), data={ 'topic_id': self.topic.pk }) self.assertEqual(response.status_code, 302) self.assertRedirects(response, self.topic.get_absolute_url()) self.assertTrue(user not in list(self.topic.subscribers.all()))
def test_undelete_post_topic_view(self): post = Post(topic=self.topic, user=self.user, body='test to delete', deleted=True) post.save() post.mark_as_deleted(user=self.user) self.login() self.post.mark_as_deleted(user=self.user) response = self.client.post(reverse('pybb:post_delete', args=[self.post.id])) self.assertEqual(response.status_code, 302) self.post = Post.objects.get(pk=self.post.pk) self.assertRaises(PostDeletion.DoesNotExist, lambda: self.post.deletion) self.assertFalse(self.post.deleted) self.assertTrue(Post.objects.get(pk=post.pk).deleted)
def test_posts_move_new_topic_form(self): forum = Forum.objects.create(name='temporary forum') topic = Topic.objects.create(name='move_topic', forum=forum, user=self.superuser) post = Post(topic=topic, user=self.superuser, body='move post') post.save() posts = Post.objects.filter(id__in=[self.post.pk, post.pk]) form = PostsMoveNewTopicForm(posts=posts, user=self.superuser, data={ 'name': 'New topic name', 'forum': self.forum.pk, }) self.assertTrue(form.is_valid()) new_topic = form.save() self.assertEqual(new_topic.posts.count(), 2)
def save(self, *args, **kwargs): if self.forum: topic_is_new = True topic = Topic(forum=self.forum, user=self.user, name=self.cleaned_data['name']) topic.save(*args, **kwargs) else: topic_is_new = False topic = self.topic post = Post(topic=topic, user=self.user, markup=self.cleaned_data['markup'], body=self.cleaned_data['body']) post.save(*args, **kwargs) if pybb_settings.ATTACHMENT_ENABLE: self.save_attachment(post, self.cleaned_data['attachment']) return post
def save(self): if self.forum: topic = Topic(forum=self.forum, user=self.user, name=self.cleaned_data['name']) topic.save() else: topic = self.topic post = Post(topic=topic, user=self.user, user_ip=self.ip, markup=self.user.pybb_profile.markup, body=self.cleaned_data['body']) post.save() if settings.PYBB_ATTACHMENT_ENABLE: for f in self.files: self.save_attachment(post, self.files[f]) return post
def test_topic_move_complete(self): topic = Topic(name='xtopic', forum=self.forum, user=self.user) topic.save() post = Post(topic=topic, user=self.user, body='one') post.save() topic_merge_url = reverse('pybb:topic_move') self.login_as(self.staff) name = 'new name for a topic' response = self.client.post( topic_merge_url, data={ 'topic_ids': [topic.pk], 'form-TOTAL_FORMS': 1, 'form-INITIAL_FORMS': 0, 'form-0-name': name, 'form-0-forum': self.forum.pk, 'form-0-redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT, 'submit': 1 }) self.assertRedirects(response, reverse('pybb:index')) topic = Topic.objects.get(pk=topic.pk) self.assertTrue(topic.redirect) self.failUnless(topic.redirection is not None) redirection = topic.redirection new_topic = redirection.to_topic self.assertEqual(new_topic.name, name) self.assertEqual(new_topic.post_count, 1)
def test_delete_post_view_superuser(self): post = Post(topic=self.topic, user=self.user, body='test to delete') post.save() self.user.is_superuser = True self.user.save() self.login() response = self.client.post(reverse('pybb:post_delete', args=[post.id]), follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Topic.objects.filter(id=self.topic.id).count(), 1) self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1) response = self.client.post(reverse('pybb:post_delete', args=[self.post.id]), follow=True) self.assertEqual(response.status_code, 200) self.assertEqual( Post.objects.filter(id=self.post.id, deleted=False).count(), 0) self.assertEqual( Topic.objects.filter(id=self.topic.id, deleted=False).count(), 0) self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1)
def test_compute_active_members(self): # Initials self.assertEquals(self.parent_forum.member_count, 0) self.assertEquals(self.forum.member_count, 0) self.assertEquals(self.topic.member_count, 0) # Add first post by self.user (count += 1) user_post_1 = self.post self.assertEquals(self.parent_forum.member_count, 1) self.assertEquals(self.forum.member_count, 1) self.assertEquals(self.topic.member_count, 1) # Add first post by self.staff (count += 1) staff_post_1 = Post(topic=self.topic, user=self.staff, body='my new post') staff_post_1.save() self.assertEquals(self.parent_forum.member_count, 2) self.assertEquals(self.forum.member_count, 2) self.assertEquals(self.topic.member_count, 2) # Add second post by self.user (count += 0) user_post_2 = Post(topic=self.topic, user=self.user, body='my new post') user_post_2.save() self.assertEquals(self.parent_forum.member_count, 2) self.assertEquals(self.forum.member_count, 2) self.assertEquals(self.topic.member_count, 2) # Delete staff_post_1 (count -= 1) staff_post_1.mark_as_deleted(commit=True) self.assertEquals(self.parent_forum.member_count, 1) self.assertEquals(self.forum.member_count, 1) self.assertEquals(self.topic.member_count, 1) # Restore staff_post_1 (count += 1) staff_post_1.mark_as_undeleted(commit=True) self.assertEquals(self.parent_forum.member_count, 2) self.assertEquals(self.forum.member_count, 2) self.assertEquals(self.topic.member_count, 2) # Delete user_post_2 (count -= 0) user_post_2.mark_as_deleted(commit=True) self.assertEquals(self.parent_forum.member_count, 2) self.assertEquals(self.forum.member_count, 2) self.assertEquals(self.topic.member_count, 2) # Add third post by self.user in parent_forum (count += 0) new_topic = Topic(name='foo2', forum=self.parent_forum, user=self.user) new_topic.save() user_post_3 = Post(topic=new_topic, user=self.user, body='my new post') user_post_3.save() self.assertEquals(self.parent_forum.member_count, 2) self.assertEquals(new_topic.member_count, 1) self.assertEquals(self.forum.member_count, 2) self.assertEquals(self.topic.member_count, 2)