예제 #1
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)
예제 #2
0
파일: forms.py 프로젝트: makinacorpus/pybbm
 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
예제 #3
0
파일: base.py 프로젝트: thoas/pybbm
    def get_or_create_topic(self, allow_post):
        if self._forum:
            topic = Topic(
                forum=self._forum,
                user=self.user,
                name=self.cleaned_data['name'],
            )

            if not allow_post:
                topic.on_moderation = topic.MODERATION_IS_IN_MODERATION
            topic.save()

            if not defaults.PYBB_DISABLE_POLLS:
                if 'poll_type' in self.cleaned_data and self.cleaned_data['poll_type'] != Poll.TYPE_NONE:
                    poll = Poll(
                        type=self.cleaned_data['poll_type'],
                        question=self.cleaned_data['poll_question']
                    )
                    poll.save()

                    topic.poll = poll
        else:
            topic = self._topic

        return topic
예제 #4
0
 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
예제 #5
0
 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)
예제 #6
0
 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)
예제 #7
0
    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)
예제 #8
0
 def test_pagination_and_topic_addition(self):
     for i in range(0, defaults.PYBB_FORUM_PAGE_SIZE + 3):
         topic = Topic(name='topic_%s_' % i, forum=self.forum, user=self.user)
         topic.save()
     response = self.client.get(self.forum.get_absolute_url())
     self.assertEqual(len(response.context['topic_list']), defaults.PYBB_FORUM_PAGE_SIZE)
     self.assertTrue(response.context['is_paginated'])
     self.assertEqual(response.context['paginator'].num_pages,
                      (int((defaults.PYBB_FORUM_PAGE_SIZE + 3) / defaults.PYBB_FORUM_PAGE_SIZE) + 1))
예제 #9
0
파일: test_models.py 프로젝트: thoas/pybbm
    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)
예제 #10
0
 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)
예제 #11
0
    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
예제 #12
0
 def test_pagination_and_topic_addition(self):
     for i in range(0, defaults.PYBB_FORUM_PAGE_SIZE + 3):
         topic = Topic(name='topic_%s_' % i,
                       forum=self.forum,
                       user=self.user)
         topic.save()
     response = self.client.get(self.forum.get_absolute_url())
     self.assertEqual(len(response.context['topic_list']),
                      defaults.PYBB_FORUM_PAGE_SIZE)
     self.assertTrue(response.context['is_paginated'])
     self.assertEqual(response.context['paginator'].num_pages,
                      (int((defaults.PYBB_FORUM_PAGE_SIZE + 3) /
                           defaults.PYBB_FORUM_PAGE_SIZE) + 1))
예제 #13
0
    def test_topic_redirect_one_page(self):
        topic = Topic(name='to-etopic', forum=self.forum, user=self.user)
        topic.save()

        response = self.client.get(
            reverse('pybb:topic_detail',
                    kwargs={
                        'forum_slug': self.forum.slug,
                        'pk': topic.pk,
                        'slug': topic.slug,
                        'page': 1
                    }))

        self.assertRedirects(response, topic.get_absolute_url(), 301)
예제 #14
0
    def test_topic_redirect_one_page(self):
        topic = Topic(name='to-etopic', forum=self.forum, user=self.user)
        topic.save()

        response = self.client.get(reverse('pybb:topic_detail', kwargs={
            'forum_slug': self.forum.slug,
            'pk': topic.pk,
            'slug': topic.slug,
            'page': 1
        }))

        self.assertRedirects(response,
                             topic.get_absolute_url(),
                             301)
예제 #15
0
 def create(cls, primary_claim, linked_claim, link_type, user):
     print("ClaimLink:create")
     my_topic = Topic(name = linked_claim.title + " " +
                      link_type.reverse_name.upper() + " " +
                      primary_claim.title,
                      forum = primary_claim.forum,
                      user = user)
     my_topic.save()
     link = cls(primary_claim = primary_claim,
                linked_claim = linked_claim,
                link_type = link_type,
                topic = my_topic,
                user = user
                )
     return link
예제 #16
0
 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)
예제 #17
0
 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)
예제 #18
0
    def clean(self):
        """Checks if user isn't still on his 'add topic cooldown'."""
        cooldown_remaining = Topic.get_user_cooldown(self.user)

        if not self.instance or not getattr(self.instance, 'pk', None):
            # Adding a new topic: check cooldown
            if cooldown_remaining > 0:
                raise ValidationError(
                    _n(
                        'You have to wait %(seconds)d more second before you can place another topic',
                        'You have to wait %(seconds)d more seconds before you can place another topic',
                        cooldown_remaining) % {'seconds': cooldown_remaining})

        # Validate post-section of the form when editing the topic. We can only
        # do this when editing because PostForm needs a topic object to
        # function and there is none during the topic add process.
        if self.instance:
            post_instance = self.instance.head
            self.post_form = PostForm(
                user=self.user,
                ip=self.ip,
                instance=post_instance,
                topic=self.instance,
                data={'body': self.cleaned_data.get('body', '')})
            post_form_result = self.post_form.is_valid()

            if not post_form_result:
                self.errors.update(self.post_form.errors)

        return super(TopicForm, self).clean()
예제 #19
0
    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')
예제 #20
0
    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')
예제 #21
0
    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'))
예제 #22
0
파일: tests.py 프로젝트: magatz/pybbm-1
    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)
예제 #23
0
파일: forms.py 프로젝트: DylannCordel/pybbm
    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
예제 #24
0
    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
예제 #25
0
 def _get_post_form(self):
     topic = Topic(forum=self.forum, name="Test topic", user=self.user)
     post = Post(topic=topic, user=self.user)
     form = PostForm(instance=post, user=self.user, topic=topic)
     form.cleaned_data = {
         'name': "Test topic",
         'body': "Test",
         'poll_type': 0,
         'poll_question': None,
     }
     return form
예제 #26
0
    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'))
예제 #27
0
    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
예제 #28
0
    def test_read_tracking_multi_forum(self):
        self.post

        topic_1 = self.topic
        topic_2 = Topic(name='topic_2', forum=self.forum, user=self.user)
        topic_2.save()

        Post(topic=topic_2, user=self.user, body='one').save()

        forum_2 = Forum(name='forum_2', description='bar', forum=self.parent_forum)
        forum_2.save()

        Topic(name='garbage', forum=forum_2, user=self.user).save()

        self.login_as(self.user)

        #  everything starts unread
        self.assertEqual(ForumReadTracker.objects.count(), 0)
        self.assertEqual(TopicReadTracker.objects.count(), 0)

        #  user reads topic_1, they should get one topic read tracker, there should be no forum read trackers
        self.client.get(topic_1.get_absolute_url())
        self.assertEqual(TopicReadTracker.objects.count(), 1)
        self.assertEqual(TopicReadTracker.objects.filter(user=self.user).count(), 1)
        self.assertEqual(TopicReadTracker.objects.filter(user=self.user, topic=topic_1).count(), 1)

        #  user reads topic_2, they should get a forum read tracker,
        #  there should be no topic read trackers for the user
        self.client.get(topic_2.get_absolute_url())
        self.assertEqual(TopicReadTracker.objects.count(), 0)
        self.assertEqual(ForumReadTracker.objects.count(), 1)
        self.assertEqual(ForumReadTracker.objects.filter(user=self.user).count(), 1)
        self.assertEqual(ForumReadTracker.objects.filter(user=self.user, forum=self.forum).count(), 1)
예제 #29
0
파일: forms.py 프로젝트: gpetukhov/pybb
    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
예제 #30
0
파일: forms.py 프로젝트: xq2537/pybb
    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
예제 #31
0
    def get_new_topic(self):
        if hasattr(self, '_new_topic'):
            return self._new_topic
        if self.post.is_topic_head:
            topic = self.topic
        else:
            topic = Topic(user=self.post.user)

        if topic.name != self.cleaned_data['name']:
            topic.name = self.cleaned_data['name']
            # force slug auto-rebuild if slug is not speficied and topic is renamed
            topic.slug = self.cleaned_data.get('slug', None)
        elif self.cleaned_data.get('slug', None):
            topic.slug = self.cleaned_data['slug']

        topic.forum = Forum.objects.get(pk=self.cleaned_data['move_to'])
        topic.slug = create_or_check_slug(topic, Topic, forum=topic.forum)
        topic.save()
        return topic
예제 #32
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)
예제 #33
0
    def test_topic_redirect(self):
        response = self.client.get(self.topic.get_absolute_url())
        self.assertEqual(response.status_code, 200)

        topic = Topic(name='to-etopic', forum=self.forum, user=self.user)
        topic.save()

        self.topic.redirect = True
        self.topic.save()

        redirection = TopicRedirection.objects.create(from_topic=self.topic, to_topic=topic)

        response = self.client.get(self.topic.get_absolute_url())

        self.assertRedirects(response, topic.get_absolute_url(), status_code=301)

        redirection.type = TopicRedirection.TYPE_NO_REDIRECT
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertEqual(response.status_code, 404)

        redirection.type = TopicRedirection.TYPE_EXPIRING_REDIRECT
        redirection.expired = date.today() + timedelta(days=1)
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertRedirects(response, topic.get_absolute_url())

        redirection.expired = date.today() - timedelta(days=1)
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertEqual(response.status_code, 404)
예제 #34
0
 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)
예제 #35
0
파일: forms.py 프로젝트: chrisv2/pybbm
    def get_new_topic(self):
        if hasattr(self, '_new_topic'):
            return self._new_topic
        if self.post.is_topic_head:
            topic = self.topic
        else:
            topic = Topic(user=self.post.user)

        if topic.name != self.cleaned_data['name']:
            topic.name = self.cleaned_data['name']
            # force slug auto-rebuild if slug is not speficied and topic is renamed
            topic.slug = self.cleaned_data.get('slug', None)
        elif self.cleaned_data.get('slug', None):
            topic.slug = self.cleaned_data['slug']

        topic.forum = Forum.objects.get(pk=self.cleaned_data['move_to'])
        topic.slug = create_or_check_slug(topic, Topic, forum=topic.forum)
        topic.save()
        return topic
예제 #36
0
    def __init__(self, *args, **kwargs):
        #Move args to kwargs
        if args:
            kwargs.update(
                dict(
                    zip(
                        inspect.getargspec(super(TopicForm,
                                                 self).__init__)[0][1:],
                        args)))

        self.instance = kwargs.get('instance', None)
        self.forum = kwargs.pop('forum', None)
        if not self.forum and kwargs.get('instance', None):
            self.forum = self.instance.forum
        if not (self.forum or ('instance' in kwargs)):
            raise ValueError('You should provide forum or instance')

        self.user = kwargs.pop('user', None)
        self.ip = kwargs.pop('ip', None)
        self.preview = kwargs.pop('preview', False)

        self.related_object_type, self.related_object_choices = Topic.get_related_object_info(
        )

        if self.related_object_choices:
            self.declared_fields[
                'related_object'].choices = self.related_object_choices

        self.post_form = None

        super(TopicForm, self).__init__(**kwargs)

        self.fields.keyOrder = ['name']
        if self.related_object_choices:
            self.fields.keyOrder.append('related_object')
        self.fields.keyOrder.append('body')
        self.fields.keyOrder.append('subscribe')
        if self.forum.can_be_administered_by_user(self.user):
            self.fields.keyOrder.append('importance')

        self.aviable_smiles = defaults.PYBB_SMILES
        self.smiles_prefix = defaults.PYBB_SMILES_PREFIX
예제 #37
0
    def test_topic_redirect(self):
        response = self.client.get(self.topic.get_absolute_url())
        self.assertEqual(response.status_code, 200)

        topic = Topic(name='to-etopic', forum=self.forum, user=self.user)
        topic.save()

        self.topic.redirect = True
        self.topic.save()

        redirection = TopicRedirection.objects.create(from_topic=self.topic,
                                                      to_topic=topic)

        response = self.client.get(self.topic.get_absolute_url())

        self.assertRedirects(response,
                             topic.get_absolute_url(),
                             status_code=301)

        redirection.type = TopicRedirection.TYPE_NO_REDIRECT
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertEqual(response.status_code, 404)

        redirection.type = TopicRedirection.TYPE_EXPIRING_REDIRECT
        redirection.expired = date.today() + timedelta(days=1)
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertRedirects(response, topic.get_absolute_url())

        redirection.expired = date.today() - timedelta(days=1)
        redirection.save()

        response = self.client.get(self.topic.get_absolute_url())

        self.assertEqual(response.status_code, 404)
예제 #38
0
    def get_or_create_topic(self, allow_post):
        if self._forum:
            topic = Topic(
                forum=self._forum,
                user=self.user,
                name=self.cleaned_data['name'],
            )

            if not allow_post:
                topic.on_moderation = topic.MODERATION_IS_IN_MODERATION
            topic.save()

            if not defaults.PYBB_DISABLE_POLLS:
                if 'poll_type' in self.cleaned_data and self.cleaned_data[
                        'poll_type'] != Poll.TYPE_NONE:
                    poll = Poll(type=self.cleaned_data['poll_type'],
                                question=self.cleaned_data['poll_question'])
                    poll.save()

                    topic.poll = poll
        else:
            topic = self._topic

        return topic
예제 #39
0
    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)
예제 #40
0
파일: test_models.py 프로젝트: thoas/pybbm
    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)

        # Add (forum --> topic --> post) in self.forum
        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.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertEqual(topic.post_count, 1)
        self.assertEqual(forum.topic_count, 1)

        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 2)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 2)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).post_count, 2)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 2)

        # Add (topic --> post) in self.forum
        new_topic = Topic(name='foo', forum=self.forum, user=self.user)
        new_topic.save()

        new_post = Post(topic=new_topic, user=self.user, body='my new post')
        new_post.save()
        self.assertEquals(Topic.objects.get(pk=new_topic.pk).first_post, new_post)

        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 3)

        # delete post in (self.parent_forum --> self.forum --> forum --> topic)
        post.mark_as_deleted(commit=True)

        self.assertTrue(Topic.objects.get(pk=topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertTrue(Topic.objects.get(pk=topic.pk).first_post.deleted)

        self.assertEqual(Forum.objects.get(pk=forum.pk).topic_count, 0)
        self.assertEqual(Forum.objects.get(pk=forum.pk).post_count, 0)

        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)

        # delete new_topic in (self.parent_forum --> self.forum)
        new_topic.mark_as_deleted()

        self.assertTrue(Topic.objects.get(pk=new_topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=new_topic.pk).first_post, new_post)
        self.assertTrue(Topic.objects.get(pk=new_topic.pk).first_post.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)

        # undelete new_topic in (self.parent_forum --> self.forum)
        new_topic.mark_as_undeleted()

        self.assertFalse(Topic.objects.get(pk=new_topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=new_topic.pk).first_post, new_post)
        self.assertFalse(Topic.objects.get(pk=new_topic.pk).first_post.deleted)

        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)

        # undelete post in (self.parent_forum --> self.forum --> forum --> topic)
        post.mark_as_undeleted(commit=True)

        self.assertFalse(Topic.objects.get(pk=topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertFalse(Topic.objects.get(pk=topic.pk).first_post.deleted)

        self.assertEqual(Forum.objects.get(pk=forum.pk).post_count, 1)
        self.assertEqual(Forum.objects.get(pk=forum.pk).topic_count, 1)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.parent_forum.pk).topic_count, 3)
예제 #41
0
    def test_read_tracking_multi_user(self):
        self.post

        topic_1 = self.topic
        topic_2 = Topic(name='topic_2', forum=self.forum, user=self.user)
        topic_2.save()

        Post(topic=topic_2, user=self.user, body='one').save()

        user_ann = get_user_model().objects.create_user('ann', 'ann@localhost', 'ann')
        client_ann = Client()
        client_ann.login(username='******', password='******')

        user_bob = get_user_model().objects.create_user('bob', 'bob@localhost', 'bob')
        client_bob = Client()
        client_bob.login(username='******', password='******')

        #  Two topics, each with one post. everything is unread, so the db should reflect that:
        self.assertEqual(TopicReadTracker.objects.all().count(), 0)
        self.assertEqual(ForumReadTracker.objects.all().count(), 0)

        #  user_ann reads topic_1, she should get one topic read tracker, there should be no forum read trackers
        client_ann.get(topic_1.get_absolute_url())
        self.assertEqual(TopicReadTracker.objects.all().count(), 1)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 1)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann, topic=topic_1).count(), 1)
        self.assertEqual(ForumReadTracker.objects.all().count(), 0)

        #  user_bob reads topic_1, he should get one topic read tracker, there should be no forum read trackers
        client_bob.get(topic_1.get_absolute_url())
        self.assertEqual(TopicReadTracker.objects.all().count(), 2)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 1)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob, topic=topic_1).count(), 1)
        self.assertEqual(ForumReadTracker.objects.all().count(), 0)

        #  user_bob reads topic_2, he should get a forum read tracker,
        #  there should be no topic read trackers for user_bob
        client_bob.get(topic_2.get_absolute_url())
        self.assertEqual(TopicReadTracker.objects.all().count(), 1)
        self.assertEqual(ForumReadTracker.objects.all().count(), 1)
        self.assertEqual(ForumReadTracker.objects.filter(user=user_bob).count(), 1)
        self.assertEqual(ForumReadTracker.objects.filter(user=user_bob, forum=self.forum).count(), 1)

        #  user_ann creates topic_3, there should be a new topic read tracker in the db
        topic_create_url = reverse('pybb:topic_create', kwargs={'forum_id': self.forum.id})
        response = client_ann.get(topic_create_url)
        values = self.get_form_values(response)
        values['body'] = 'topic_3'
        values['name'] = 'topic_3'
        values['poll_type'] = 0
        response = client_ann.post(topic_create_url, data=values, follow=True)

        self.assertEqual(TopicReadTracker.objects.all().count(), 2)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 2)
        self.assertEqual(ForumReadTracker.objects.all().count(), 1)

        topic_3 = Topic.objects.order_by('-updated')[0]
        self.assertEqual(topic_3.name, 'topic_3')

        #  user_ann posts to topic_1, a topic they've already read, no new trackers should be created (existing one is updated)
        post_create_url = reverse('pybb:post_create', kwargs={'topic_id': topic_1.id})
        response = client_ann.get(post_create_url)
        values = self.get_form_values(response)
        values['body'] = 'test tracking'
        response = client_ann.post(post_create_url, values, follow=True)
        self.assertEqual(TopicReadTracker.objects.all().count(), 2)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 2)
        self.assertEqual(ForumReadTracker.objects.all().count(), 1)

        self.assertEqual(ForumReadTracker.objects.all().count(), 1)
        previous_time = ForumReadTracker.objects.all()[0].time_stamp

        # user bob reads topic 1 which he already read, topic tracker recreated, forum tracker untouched (topic 3 still unread)
        client_bob.get(topic_1.get_absolute_url())
        self.assertEqual(ForumReadTracker.objects.all().count(), 1)
        self.assertEqual(ForumReadTracker.objects.all()[0].time_stamp, previous_time)
        self.assertEqual(TopicReadTracker.objects.all().count(), 3)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 1)

        self.assertEqual(ForumReadTracker.objects.all().count(), 1)
        previous_time = ForumReadTracker.objects.all()[0].time_stamp

        # user bob reads topic 3, topic tracker purged, forum tracker updated
        client_bob.get(topic_3.get_absolute_url())
        self.assertEqual(ForumReadTracker.objects.all().count(), 1)
        self.assertGreater(ForumReadTracker.objects.all()[0].time_stamp, previous_time)
        self.assertEqual(TopicReadTracker.objects.all().count(), 2)
        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 0)
예제 #42
0
    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)
예제 #43
0
    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)
예제 #44
0
    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)
예제 #45
0
    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)

        # Add (forum --> topic --> post) in self.forum
        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.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertEqual(topic.post_count, 1)
        self.assertEqual(forum.topic_count, 1)

        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 2)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 2)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).post_count, 2)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).topic_count, 2)

        # Add (topic --> post) in self.forum
        new_topic = Topic(name='foo', forum=self.forum, user=self.user)
        new_topic.save()

        new_post = Post(topic=new_topic, user=self.user, body='my new post')
        new_post.save()
        self.assertEquals(
            Topic.objects.get(pk=new_topic.pk).first_post, new_post)

        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 3)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).post_count, 3)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).topic_count, 3)

        # delete post in (self.parent_forum --> self.forum --> forum --> topic)
        post.mark_as_deleted(commit=True)

        self.assertTrue(Topic.objects.get(pk=topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertTrue(Topic.objects.get(pk=topic.pk).first_post.deleted)

        self.assertEqual(Forum.objects.get(pk=forum.pk).topic_count, 0)
        self.assertEqual(Forum.objects.get(pk=forum.pk).post_count, 0)

        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)

        # delete new_topic in (self.parent_forum --> self.forum)
        new_topic.mark_as_deleted()

        self.assertTrue(Topic.objects.get(pk=new_topic.pk).deleted)
        self.assertEquals(
            Topic.objects.get(pk=new_topic.pk).first_post, new_post)
        self.assertTrue(Topic.objects.get(pk=new_topic.pk).first_post.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)

        # undelete new_topic in (self.parent_forum --> self.forum)
        new_topic.mark_as_undeleted()

        self.assertFalse(Topic.objects.get(pk=new_topic.pk).deleted)
        self.assertEquals(
            Topic.objects.get(pk=new_topic.pk).first_post, new_post)
        self.assertFalse(Topic.objects.get(pk=new_topic.pk).first_post.deleted)

        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)

        # undelete post in (self.parent_forum --> self.forum --> forum --> topic)
        post.mark_as_undeleted(commit=True)

        self.assertFalse(Topic.objects.get(pk=topic.pk).deleted)
        self.assertEquals(Topic.objects.get(pk=topic.pk).first_post, post)
        self.assertFalse(Topic.objects.get(pk=topic.pk).first_post.deleted)

        self.assertEqual(Forum.objects.get(pk=forum.pk).post_count, 1)
        self.assertEqual(Forum.objects.get(pk=forum.pk).topic_count, 1)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).post_count, 3)
        self.assertEqual(Forum.objects.get(pk=self.forum.pk).topic_count, 3)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).post_count, 3)
        self.assertEqual(
            Forum.objects.get(pk=self.parent_forum.pk).topic_count, 3)
예제 #46
0
    def save(self, commit=True):
        related_object = None
        if self.cleaned_data.get('related_object', None):
            try:
                related_object_pk = int(self.cleaned_data['related_object'].pk)
            except ValueError:
                pass
            else:
                related_object = self.related_object_type.get_object_for_this_type(
                    pk=related_object_pk)

        if self.instance.pk:
            now = datetime.now()
            topic = super(TopicForm, self).save(commit=False)
            topic.related_object = related_object
            if 'name' in self.fields.keys():
                topic.name = self.cleaned_data['name']
            if 'importance' in self.fields.keys():
                topic.importance = self.cleaned_data['importance']
            topic.updated = now

            if self.cleaned_data.get('subscribe', False):
                topic.subscribers.add(self.user)
            else:
                topic.subscribers.remove(self.user)

            if commit:
                topic.save()

            post = topic.head
            post.body = self.cleaned_data['body']
            post.updated = now

            if commit:
                if self.post_form:
                    # Post form has some additional save logic (add edit user,
                    # topic subscription)
                    post = self.post_form.save(commit=True)
                else:
                    post.save()

            return post

        topic = Topic(forum=self.forum,
                      user=self.user,
                      name=self.cleaned_data['name'])
        if self.cleaned_data.has_key('importance'):
            topic.importance = self.cleaned_data['importance']
        topic.related_object = related_object
        if commit:
            topic.save()
            if self.cleaned_data['subscribe']:
                topic.subscribers.add(self.user)
                topic.save()

        post = Post(topic=topic,
                    user=self.user,
                    user_ip=self.ip,
                    body=self.cleaned_data['body'])
        if commit:
            post.save()
        return post
예제 #47
0
    def save(self, commit=True):
        if self.instance.pk:
            post = super(PostForm, self).save(commit=False)
            if self.user:
                post.user = self.user

            if self.actor and post.user_id == self.actor.pk:
                if post.is_updatable():
                    post.updated = tznow()

            if post.topic.head == post:
                topic = post.topic

                topic.name = self.cleaned_data['name']
                topic.updated = tznow()
                topic.save()

                if not defaults.PYBB_DISABLE_POLLS:
                    if self.cleaned_data['poll_type'] != Poll.TYPE_NONE:
                        poll = topic.poll or Poll()
                        poll.type = self.cleaned_data['poll_type']
                        poll.question = self.cleaned_data['poll_question']

                        is_new = poll.pk is None

                        poll.save()

                        if is_new:
                            topic.poll = poll
                            topic.save()
                    else:
                        if topic.poll:
                            topic.poll.answers.all().delete()
                            topic.poll = None
                            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 'forum' in self.cleaned_data and not self._forum:
            self._forum = self.cleaned_data['forum']

        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()

            if not defaults.PYBB_DISABLE_POLLS:
                if 'poll_type' in self.cleaned_data and self.cleaned_data['poll_type'] != Poll.TYPE_NONE:
                    poll = Poll(
                        type=self.cleaned_data['poll_type'],
                        question=self.cleaned_data['poll_question']
                    )
                    poll.save()

                    topic.poll = poll
        else:
            topic = self._topic

        post = Post(topic=topic, user=self.user, user_ip=self.ip,
                    body=self.cleaned_data['body'], hash=self.cleaned_data['hash'])

        if not allow_post:
            post.on_moderation = True

        post.save()

        return post