Skip to content

Commit b13361c

Browse files
committed
add interchangable object keys support
1 parent ef74319 commit b13361c

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

django_comments/forms.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django.utils.translation import pgettext_lazy, ngettext, gettext, gettext_lazy as _
1212

1313
from . import get_model
14+
from .utils import get_key_value
1415

1516
COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000)
1617
DEFAULT_COMMENTS_TIMEOUT = getattr(settings, 'COMMENTS_TIMEOUT', (2 * 60 * 60)) # 2h
@@ -65,7 +66,7 @@ def generate_security_data(self):
6566
timestamp = int(time.time())
6667
security_dict = {
6768
'content_type': str(self.target_object._meta),
68-
'object_pk': str(self.target_object._get_pk_val()),
69+
'object_pk': get_key_value(self.target_object),
6970
'timestamp': str(timestamp),
7071
'security_hash': self.initial_security_hash(timestamp),
7172
}
@@ -79,7 +80,7 @@ def initial_security_hash(self, timestamp):
7980

8081
initial_security_dict = {
8182
'content_type': str(self.target_object._meta),
82-
'object_pk': str(self.target_object._get_pk_val()),
83+
'object_pk': get_key_value(self.target_object),
8384
'timestamp': str(timestamp),
8485
}
8586
return self.generate_security_hash(**initial_security_dict)
@@ -139,7 +140,7 @@ def get_comment_create_data(self, site_id=None):
139140
"""
140141
return dict(
141142
content_type=ContentType.objects.get_for_model(self.target_object),
142-
object_pk=force_str(self.target_object._get_pk_val()),
143+
object_pk=get_key_value(self.target_object),
143144
user_name=self.cleaned_data["name"],
144145
user_email=self.cleaned_data["email"],
145146
user_url=self.cleaned_data["url"],

django_comments/utils.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from django.conf import settings
2+
from django.utils.encoding import force_str
3+
4+
5+
def get_key(model):
6+
"""
7+
Get key of the model.
8+
9+
By default returns 'pk', but if COMMENTS_ID_OVERRIDES is defined,
10+
returns the key defined by user.
11+
"""
12+
COMMENTS_ID_OVERRIDES = getattr(settings, 'COMMENTS_ID_OVERRIDES', {})
13+
class_identifier = f"{model._meta.app_label}.{model.__name__}"
14+
if class_identifier in COMMENTS_ID_OVERRIDES:
15+
return COMMENTS_ID_OVERRIDES[class_identifier]
16+
else:
17+
return 'pk'
18+
19+
20+
def get_key_value(target_object):
21+
"""
22+
Get key of the model.
23+
24+
By default returns 'pk', but if COMMENTS_ID_OVERRIDES is defined,
25+
returns the key defined by user.
26+
"""
27+
key = get_key(target_object.__class__)
28+
if key == 'pk':
29+
return force_str(target_object._get_pk_val())
30+
else:
31+
return force_str(getattr(target_object, key))

django_comments/views/comments.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import django_comments
1313
from django_comments import signals
1414
from django_comments.views.utils import next_redirect, confirmation_view
15+
from django_comments.utils import get_key
1516

1617

1718
class CommentPostBadRequest(http.HttpResponseBadRequest):
@@ -51,7 +52,7 @@ def post_comment(request, next=None, using=None):
5152
return CommentPostBadRequest("Missing content_type or object_pk field.")
5253
try:
5354
model = apps.get_model(*ctype.split(".", 1))
54-
target = model._default_manager.using(using).get(pk=object_pk)
55+
target = model._default_manager.using(using).get(**{get_key(model): object_pk})
5556
except (LookupError, TypeError):
5657
return CommentPostBadRequest(
5758
"Invalid content_type value: %r" % escape(ctype))

0 commit comments

Comments
 (0)