Exemplo n.º 1
0
 def validate_reply_to(self, value):
     if value != 0:
         try:
             parent = get_model().objects.get(pk=value)
         except get_model().DoesNotExist:
             raise serializers.ValidationError(
                 "reply_to comment does not exist")
         else:
             max = max_thread_level_for_content_type(parent.content_type)
             if parent.level == max:
                 raise serializers.ValidationError(
                     "Max thread level reached")
     return value
Exemplo n.º 2
0
def edit_my_comment(request, comment_id):
    comment = get_object_or_404(get_model(),
                                pk=comment_id,
                                site__pk=settings.SITE_ID)
    redirect_to = request.GET.get('next', '/all/')
    if comment.user == request.user:
        if request.method == 'POST':
            form = CommentForm(request.POST, instance=comment)
            if form.is_valid():
                # Form fields passed validation
                comment_value = form.cleaned_data['comment']
                comment.comment = comment_value
                comment.submit_date = timezone.now()
                comment.save()
                messages.info(request, 'Comment updated successfully.')
                if is_safe_url(url=redirect_to, host=request.get_host()):
                    return HttpResponseRedirect(redirect_to)
        else:
            form = CommentForm(instance=comment)
        template_arg = 'edit_comment.html'
        return render(request, template_arg, {
            "comment": comment,
            "form": form,
            "cid": comment_id,
            "next": next
        })
    else:
        raise Http404
Exemplo n.º 3
0
    def ready(self):
        from django_comments_xtd import get_model
        from django_comments_xtd.models import publish_or_unpublish_on_pre_save

        model_app_label = get_model()._meta.label
        pre_save.connect(publish_or_unpublish_on_pre_save,
                         sender=model_app_label)
Exemplo n.º 4
0
def publish_or_unpublish_nested_comments(comment_id, are_public=False):
    qs = get_model().objects.filter(~Q(pk=comment_id), parent_id=comment_id)
    nested = [cm.id for cm in qs]
    qs.update(is_public=are_public)
    while len(nested):
        cm_id = nested.pop()
        qs = XtdComment.objects.filter(~Q(pk=cm_id), parent_id=cm_id)
        nested.extend([cm.id for cm in qs])
        qs.update(is_public=are_public)
Exemplo n.º 5
0
    def test_removing_c1_unpublishes_c3_and_c4(self):
        # Register the receiver again. It was registered in apps.py, but we have
        # patched the COMMENTS_XTD_MODEL, however we won't fake the ready. It's
        # easier to just register again the receiver, to test only what depends
        # on django-comments-xtd.
        model_app_label = get_model()._meta.label
        pre_save.connect(publish_or_unpublish_on_pre_save, sender=model_app_label)

        cm1 = MyComment.objects.get(pk=1)
        cm1.is_removed = True
        cm1.save()
        self.assertTrue(cm1.is_public)
        self.assertTrue(cm1.is_removed)

        cm3 = MyComment.objects.get(pk=3)
        self.assertFalse(cm3.is_public)
        self.assertFalse(cm3.is_removed)

        cm4 = MyComment.objects.get(pk=4)
        self.assertFalse(cm4.is_public)
        self.assertFalse(cm4.is_removed)
Exemplo n.º 6
0
def thread_test_step_1(article, model=get_model(), **kwargs):
    article_ct = ContentType.objects.get(app_label="tests", model="article")
    site = Site.objects.get(pk=1)

    # post Comment 1 with parent_id 0
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         site=site,
                         comment="comment 1 to article",
                         submit_date=datetime.now(),
                         **kwargs)

    # post Comment 2 with parent_id 0
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         site=site,
                         comment="comment 2 to article",
                         submit_date=datetime.now(),
                         **kwargs)
Exemplo n.º 7
0
def publish_or_unpublish_nested_comments(comment, are_public=False):
    qs = get_model().objects.filter(~Q(pk=comment.id), parent_id=comment.id)
    nested = [cm.id for cm in qs]
    qs.update(is_public=are_public)
    while len(nested):
        cm_id = nested.pop()
        qs = XtdComment.objects.filter(~Q(pk=cm_id), parent_id=cm_id)
        nested.extend([cm.id for cm in qs])
        qs.update(is_public=are_public)
    # Update nested_count in parents comments in the same thread.
    # The comment.nested_count doesn't change because the comment's is_public
    # attribute is not changing, only its nested comments change, and it will
    # help to re-populate nested_count should it be published again.
    if are_public:
        op = F('nested_count') + comment.nested_count
    else:
        op = F('nested_count') - comment.nested_count
    XtdComment.objects.filter(thread_id=comment.thread_id,
                              level__lt=comment.level,
                              order__lt=comment.order)\
                      .update(nested_count=op)
Exemplo n.º 8
0
def thread_test_step_6(article, model=get_model(), **kwargs):
    article_ct = ContentType.objects.get(app_label="tests", model="article")
    if not "site" in kwargs:
        kwargs["site"] = Site.objects.get(pk=1)

    # post Comment 10 to parent_id 7
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         comment="c10.c7.c4.c1",
                         submit_date=datetime.now(),
                         parent_id=7,
                         **kwargs)

    # post Comment 11 to parent_id 8
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         comment="c11.c8.c3.c1",
                         submit_date=datetime.now(),
                         parent_id=8,
                         **kwargs)
Exemplo n.º 9
0
def remove_my_comment(request, comment_id, next=None):
    comment = get_object_or_404(get_model(),
                                pk=comment_id,
                                site__pk=settings.SITE_ID)
    if comment.user == request.user:
        if request.method == "POST":
            comment.is_removed = True
            comment.save()
            post_id = comment.object_pk
            post_model = comment.content_type.model
            return redirect(comment.content_object.get_absolute_url())
        else:
            return render(
                request,
                'comments/delete.html',
                {
                    'comment': comment,
                    'next': next,
                    'meta': meta
                },
            )
    else:
        raise Http404
Exemplo n.º 10
0
def thread_test_step_2(article, model=get_model(), **kwargs):
    article_ct = ContentType.objects.get(app_label="tests", model="article")
    site = Site.objects.get(pk=1)

    # post Comment 3 to parent_id 1
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         site=site,
                         comment="c3.c1",
                         submit_date=datetime.now(),
                         parent_id=1,
                         **kwargs)

    # post Comment 4 to parent_id 1
    model.objects.create(content_type=article_ct,
                         object_pk=article.id,
                         content_object=article,
                         site=site,
                         comment="c4.c1",
                         submit_date=datetime.now(),
                         parent_id=1,
                         **kwargs)
Exemplo n.º 11
0
from unittest.mock import patch

from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site
from django.test import TestCase

from django_comments_xtd import django_comments
from django_comments_xtd import get_model
from django_comments_xtd.conf import settings
from django_comments_xtd.tests.models import Article
from django_comments_xtd.tests.utils import post_comment

app_model_options_mock = {'tests.article': {'who_can_post': 'users'}}

XtdComment = get_model()


class CommentCreateTestCase(TestCase):
    def setUp(self):
        patcher = patch('django_comments_xtd.views.send_mail')
        self.mock_mailer = patcher.start()
        self.article = Article.objects.create(title="October",
                                              slug="october",
                                              body="What I did on October...")
        self.form = django_comments.get_form()(self.article)

    @patch.multiple('django_comments_xtd.conf.settings',
                    COMMENTS_XTD_CONFIRM_EMAIL=False)
    def test_post_returns_201_response(self):
        data = {