Commit 1ab69cb122418c973e27210558d11bb3fba921f6
Committed by
Claude Paroz
1 parent
f41e32d7
Use get_current_site to look up the site instead of settings.SITE_ID
Showing
7 changed files
with
68 additions
and
9 deletions
| ... | ... | @@ -105,7 +105,7 @@ class CommentDetailsForm(CommentSecurityForm): |
| 105 | 105 | comment = forms.CharField(label=_('Comment'), widget=forms.Textarea, |
| 106 | 106 | max_length=COMMENT_MAX_LENGTH) |
| 107 | 107 | |
| 108 | - def get_comment_object(self): | |
| 108 | + def get_comment_object(self, site_id=None): | |
| 109 | 109 | """ |
| 110 | 110 | Return a new (unsaved) comment object based on the information in this |
| 111 | 111 | form. Assumes that the form is already validated and will throw a |
| ... | ... | @@ -118,7 +118,7 @@ class CommentDetailsForm(CommentSecurityForm): |
| 118 | 118 | raise ValueError("get_comment_object may only be called on valid forms") |
| 119 | 119 | |
| 120 | 120 | CommentModel = self.get_comment_model() |
| 121 | - new = CommentModel(**self.get_comment_create_data()) | |
| 121 | + new = CommentModel(**self.get_comment_create_data(site_id=site_id)) | |
| 122 | 122 | new = self.check_for_duplicate_comment(new) |
| 123 | 123 | |
| 124 | 124 | return new |
| ... | ... | @@ -131,7 +131,7 @@ class CommentDetailsForm(CommentSecurityForm): |
| 131 | 131 | """ |
| 132 | 132 | return get_model() |
| 133 | 133 | |
| 134 | - def get_comment_create_data(self): | |
| 134 | + def get_comment_create_data(self, site_id=None): | |
| 135 | 135 | """ |
| 136 | 136 | Returns the dict of data to be used to create a comment. Subclasses in |
| 137 | 137 | custom comment apps that override get_comment_model can override this |
| ... | ... | @@ -145,7 +145,7 @@ class CommentDetailsForm(CommentSecurityForm): |
| 145 | 145 | user_url=self.cleaned_data["url"], |
| 146 | 146 | comment=self.cleaned_data["comment"], |
| 147 | 147 | submit_date=timezone.now(), |
| 148 | - site_id=settings.SITE_ID, | |
| 148 | + site_id=site_id or getattr(settings, "SITE_ID", None), | |
| 149 | 149 | is_public=True, |
| 150 | 150 | is_removed=False, |
| 151 | 151 | ) | ... | ... |
| ... | ... | @@ -2,6 +2,7 @@ from django import template |
| 2 | 2 | from django.template.loader import render_to_string |
| 3 | 3 | from django.conf import settings |
| 4 | 4 | from django.contrib.contenttypes.models import ContentType |
| 5 | +from django.contrib.sites.shortcuts import get_current_site | |
| 5 | 6 | from django.utils.encoding import smart_text |
| 6 | 7 | |
| 7 | 8 | import django_comments |
| ... | ... | @@ -76,10 +77,16 @@ class BaseCommentNode(template.Node): |
| 76 | 77 | if not object_pk: |
| 77 | 78 | return self.comment_model.objects.none() |
| 78 | 79 | |
| 80 | + # Explicit SITE_ID takes precedence over request. This is also how | |
| 81 | + # get_current_site operates. | |
| 82 | + site_id = getattr(settings, "SITE_ID", None) | |
| 83 | + if not site_id and ('request' in context): | |
| 84 | + site_id = get_current_site(context['request']).pk | |
| 85 | + | |
| 79 | 86 | qs = self.comment_model.objects.filter( |
| 80 | 87 | content_type=ctype, |
| 81 | 88 | object_pk=smart_text(object_pk), |
| 82 | - site__pk=settings.SITE_ID, | |
| 89 | + site__pk=site_id, | |
| 83 | 90 | ) |
| 84 | 91 | |
| 85 | 92 | # The is_public and is_removed fields are implementation details of the | ... | ... |
| ... | ... | @@ -3,6 +3,7 @@ from __future__ import absolute_import |
| 3 | 3 | from django import http |
| 4 | 4 | from django.apps import apps |
| 5 | 5 | from django.conf import settings |
| 6 | +from django.contrib.sites.shortcuts import get_current_site | |
| 6 | 7 | from django.core.exceptions import ObjectDoesNotExist, ValidationError |
| 7 | 8 | from django.shortcuts import render |
| 8 | 9 | from django.template.loader import render_to_string |
| ... | ... | @@ -100,7 +101,7 @@ def post_comment(request, next=None, using=None): |
| 100 | 101 | ) |
| 101 | 102 | |
| 102 | 103 | # Otherwise create the comment |
| 103 | - comment = form.get_comment_object() | |
| 104 | + comment = form.get_comment_object(site_id=get_current_site(request).id) | |
| 104 | 105 | comment.ip_address = request.META.get("REMOTE_ADDR", None) |
| 105 | 106 | if request.user.is_authenticated(): |
| 106 | 107 | comment.user = request.user | ... | ... |
| ... | ... | @@ -2,6 +2,7 @@ from __future__ import absolute_import |
| 2 | 2 | |
| 3 | 3 | from django.conf import settings |
| 4 | 4 | from django.contrib.auth.decorators import login_required, permission_required |
| 5 | +from django.contrib.sites.shortcuts import get_current_site | |
| 5 | 6 | from django.shortcuts import get_object_or_404, render |
| 6 | 7 | from django.views.decorators.csrf import csrf_protect |
| 7 | 8 | |
| ... | ... | @@ -21,7 +22,9 @@ def flag(request, comment_id, next=None): |
| 21 | 22 | comment |
| 22 | 23 | the flagged `comments.comment` object |
| 23 | 24 | """ |
| 24 | - comment = get_object_or_404(django_comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) | |
| 25 | + comment = get_object_or_404(django_comments.get_model(), | |
| 26 | + pk=comment_id, | |
| 27 | + site__pk=get_current_site(request).pk) | |
| 25 | 28 | |
| 26 | 29 | # Flag on POST |
| 27 | 30 | if request.method == 'POST': |
| ... | ... | @@ -46,7 +49,9 @@ def delete(request, comment_id, next=None): |
| 46 | 49 | comment |
| 47 | 50 | the flagged `comments.comment` object |
| 48 | 51 | """ |
| 49 | - comment = get_object_or_404(django_comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) | |
| 52 | + comment = get_object_or_404(django_comments.get_model(), | |
| 53 | + pk=comment_id, | |
| 54 | + site__pk=get_current_site(request).pk) | |
| 50 | 55 | |
| 51 | 56 | # Delete on POST |
| 52 | 57 | if request.method == 'POST': |
| ... | ... | @@ -72,7 +77,9 @@ def approve(request, comment_id, next=None): |
| 72 | 77 | comment |
| 73 | 78 | the `comments.comment` object for approval |
| 74 | 79 | """ |
| 75 | - comment = get_object_or_404(django_comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) | |
| 80 | + comment = get_object_or_404(django_comments.get_model(), | |
| 81 | + pk=comment_id, | |
| 82 | + site__pk=get_current_site(request).pk) | |
| 76 | 83 | |
| 77 | 84 | # Delete on POST |
| 78 | 85 | if request.method == 'POST': | ... | ... |
| ... | ... | @@ -3,6 +3,7 @@ from __future__ import absolute_import |
| 3 | 3 | import time |
| 4 | 4 | |
| 5 | 5 | from django.conf import settings |
| 6 | +from django.contrib.sites.models import Site | |
| 6 | 7 | |
| 7 | 8 | from django_comments.forms import CommentForm |
| 8 | 9 | from django_comments.models import Comment |
| ... | ... | @@ -12,6 +13,12 @@ from testapp.models import Article |
| 12 | 13 | |
| 13 | 14 | |
| 14 | 15 | class CommentFormTests(CommentTestCase): |
| 16 | + | |
| 17 | + def setUp(self): | |
| 18 | + super(CommentFormTests, self).setUp() | |
| 19 | + self.site_2 = Site.objects.create(id=settings.SITE_ID + 1, | |
| 20 | + domain="testserver", name="testserver") | |
| 21 | + | |
| 15 | 22 | def testInit(self): |
| 16 | 23 | f = CommentForm(Article.objects.get(pk=1)) |
| 17 | 24 | self.assertEqual(f.initial['content_type'], str(Article._meta)) |
| ... | ... | @@ -61,6 +68,15 @@ class CommentFormTests(CommentTestCase): |
| 61 | 68 | c.save() |
| 62 | 69 | self.assertEqual(Comment.objects.count(), 1) |
| 63 | 70 | |
| 71 | + # Create a comment for the second site. We only test for site_id, not | |
| 72 | + # what has already been tested above. | |
| 73 | + a = Article.objects.get(pk=1) | |
| 74 | + d = self.getValidData(a) | |
| 75 | + d["comment"] = "testGetCommentObject with a site" | |
| 76 | + f = CommentForm(Article.objects.get(pk=1), data=d) | |
| 77 | + c = f.get_comment_object(site_id=self.site_2.id) | |
| 78 | + self.assertEqual(c.site_id, self.site_2.id) | |
| 79 | + | |
| 64 | 80 | def testProfanities(self): |
| 65 | 81 | """Test COMMENTS_ALLOW_PROFANITIES and PROFANITIES_LIST settings""" |
| 66 | 82 | a = Article.objects.get(pk=1) | ... | ... |
| 1 | 1 | from __future__ import absolute_import |
| 2 | 2 | |
| 3 | +import unittest | |
| 4 | + | |
| 5 | +from django import get_version | |
| 6 | +from django.conf import settings | |
| 3 | 7 | from django.contrib.contenttypes.models import ContentType |
| 8 | +from django.contrib.sites.models import Site | |
| 4 | 9 | from django.template import Template, Context |
| 10 | +from django.test.client import RequestFactory | |
| 11 | +from django.test.utils import override_settings | |
| 5 | 12 | |
| 6 | 13 | from django_comments.forms import CommentForm |
| 7 | 14 | from django_comments.models import Comment |
| ... | ... | @@ -12,6 +19,11 @@ from . import CommentTestCase |
| 12 | 19 | |
| 13 | 20 | class CommentTemplateTagTests(CommentTestCase): |
| 14 | 21 | |
| 22 | + def setUp(self): | |
| 23 | + super(CommentTemplateTagTests, self).setUp() | |
| 24 | + self.site_2 = Site.objects.create(id=settings.SITE_ID + 1, | |
| 25 | + domain="testserver", name="testserver") | |
| 26 | + | |
| 15 | 27 | def render(self, t, **c): |
| 16 | 28 | ctx = Context(c) |
| 17 | 29 | out = Template(t).render(ctx) |
| ... | ... | @@ -95,6 +107,21 @@ class CommentTemplateTagTests(CommentTestCase): |
| 95 | 107 | self.createSomeComments() |
| 96 | 108 | self.verifyGetCommentList("{% get_comment_list for a as cl %}") |
| 97 | 109 | |
| 110 | + @unittest.skipIf(get_version().startswith("1.7"), | |
| 111 | + "Retrieving a site from the request is not available in Django 1.7") | |
| 112 | + def testGetCommentListUsingRequest(self, tag=None): | |
| 113 | + # A request lookup should return site_2 | |
| 114 | + with override_settings(SITE_ID=self.site_2.id): | |
| 115 | + c1, c2, c3, c4 = self.createSomeComments() | |
| 116 | + | |
| 117 | + # Effectively unset SITE_ID which forces a site lookup from the | |
| 118 | + # request. Create a new comment for the second site. | |
| 119 | + with override_settings(SITE_ID=None): | |
| 120 | + t = "{% load comments %}" + (tag or "{% get_comment_list for testapp.author a.id as cl %}") | |
| 121 | + request = RequestFactory().get("/") | |
| 122 | + ctx, out = self.render(t, a=Author.objects.get(pk=1), request=request) | |
| 123 | + self.assertEqual(list(ctx["cl"]), [c2]) | |
| 124 | + | |
| 98 | 125 | def testWhitespaceInGetCommentListTag(self): |
| 99 | 126 | self.createSomeComments() |
| 100 | 127 | self.verifyGetCommentList("{% load comment_testtags %}{% get_comment_list for a|noop:'x y' as cl %}") | ... | ... |
Please
register
or
login
to post a comment