From 7d4a954836069d740d24101078cfadb4580533c2 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Mon, 23 Feb 2009 22:16:00 +0000 Subject: [PATCH] Refactored CommentForm.get_comment_object into a handful of separete methods to make it easier for subclasses to provide custom models and data. Refs #8630. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9889 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/comments/forms.py | 39 +++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/django/contrib/comments/forms.py b/django/contrib/comments/forms.py index 5d71a3909b..f358b8132b 100644 --- a/django/contrib/comments/forms.py +++ b/django/contrib/comments/forms.py @@ -33,7 +33,7 @@ class CommentForm(forms.Form): initial = {} initial.update(self.generate_security_data()) super(CommentForm, self).__init__(data=data, initial=initial) - + def get_comment_object(self): """ Return a new (unsaved) comment object based on the information in this @@ -45,8 +45,28 @@ class CommentForm(forms.Form): """ if not self.is_valid(): raise ValueError("get_comment_object may only be called on valid forms") - - new = Comment( + + CommentModel = self.get_comment_model() + new = CommentModel(**self.get_comment_create_data()) + new = self.check_for_duplicate_comment(new) + + return new + + def get_comment_model(self): + """ + Get the comment model to create with this form. Subclasses in custom + comment apps should override this, get_comment_create_data, and perhaps + check_for_duplicate_comment to provide custom comment models. + """ + return Comment + + def get_comment_create_data(self): + """ + Returns the dict of data to be used to create a comment. Subclasses in + custom comment apps that override get_comment_model can override this + method to add extra fields onto a custom comment model. + """ + return dict( content_type = ContentType.objects.get_for_model(self.target_object), object_pk = force_unicode(self.target_object._get_pk_val()), user_name = self.cleaned_data["name"], @@ -58,10 +78,13 @@ class CommentForm(forms.Form): is_public = True, is_removed = False, ) - - # Check that this comment isn't duplicate. (Sometimes people post comments - # twice by mistake.) If it is, fail silently by returning the old comment. - possible_duplicates = Comment.objects.filter( + + def check_for_duplicate_comment(self, new): + """ + Check that a submitted comment isn't a duplicate. This might be caused + by someone posting a comment twice. If it is a dup, silently return the *previous* comment. + """ + possible_duplicates = self.get_comment_model()._default_manager.filter( content_type = new.content_type, object_pk = new.object_pk, user_name = new.user_name, @@ -71,7 +94,7 @@ class CommentForm(forms.Form): for old in possible_duplicates: if old.submit_date.date() == new.submit_date.date() and old.comment == new.comment: return old - + return new def security_errors(self):