Author: jacob
Date: 2009-02-23 16:16:00 -0600 (Mon, 23 Feb 2009)
New Revision: 9889

Modified:
   django/trunk/django/contrib/comments/forms.py
Log:
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.

Modified: django/trunk/django/contrib/comments/forms.py
===================================================================
--- django/trunk/django/contrib/comments/forms.py       2009-02-23 14:47:59 UTC 
(rev 9888)
+++ django/trunk/django/contrib/comments/forms.py       2009-02-23 22:16:00 UTC 
(rev 9889)
@@ -33,7 +33,7 @@
             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 @@
         """
         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 @@
             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 @@
         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):


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to