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
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
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)
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)
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)
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)
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)
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)
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
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)
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 = {