]> git.parisson.com Git - django-postman.git/commitdiff
Added a setting: POSTMAN_QUICKREPLY_QUOTE_BODY
authorPatrick Samson <pk.samson@gmail.com>
Thu, 16 Jan 2014 20:59:30 +0000 (21:59 +0100)
committerPatrick Samson <pk.samson@gmail.com>
Thu, 16 Jan 2014 20:59:30 +0000 (21:59 +0100)
docs/api.rst
docs/conf.py
docs/quickstart.rst
docs/views.rst
postman/__init__.py
postman/models.py
postman/tests.py
postman/views.py

index 7027ff81f92f5a6c5906b968474483ae19967800..cc2864b2e157561d0b68b8afca300eb2e390f75b 100644 (file)
@@ -4,6 +4,9 @@ API
 For an easier usage of the application from other applications in the project,\r
 an API is provided.\r
 \r
+Note: The "sites" framework is optional but you need it if you want the ``site`` context variable\r
+to provide a *Site* instance (not *None*) in the notification templates.\r
+\r
 pm_broadcast()\r
 --------------\r
 Broadcast a message to multiple Users.\r
index 0a3aff1c34ecd49f34b56a3b3046ce90a58d70f6..4e6295f801e032d3b1be5e60985e89b599efd26b 100644 (file)
@@ -45,9 +45,9 @@ copyright = u'2010, Patrick Samson'
 # built documents.\r
 #\r
 # The short X.Y version.\r
-version = '3.0'\r
+version = '3.2'\r
 # The full version, including alpha/beta/rc tags.\r
-release = '3.1.0'\r
+release = '3.2.0a1'\r
 \r
 # The language for content autogenerated by Sphinx. Refer to documentation\r
 # for a list of supported languages.\r
index a5a0c5e6fe7ee2d3a49c26b2e1489a237526b225..eea5a0e9df76d391a3e6437a87deac2a865194a9 100644 (file)
@@ -110,6 +110,14 @@ You may specify some additional configuration options in your :file:`settings.py
     (misspelled attribute name, empty result, ...), or the value is a function and an exception is raised\r
     (but any result, even empty, is valid).\r
 \r
+``POSTMAN_QUICKREPLY_QUOTE_BODY``\r
+    *New in version 3.2.0.*\r
+\r
+    Set it to True if you want the original message to be quoted when replying directly from the display view.\r
+    This setting does not apply to the reply view in which quote is the basic behaviour.\r
+\r
+    *Defaults to*: False.\r
+\r
 ``POSTMAN_NOTIFIER_APP``\r
     A notifier application name, used in preference to the basic emailing,\r
     to notify users of their rejected or received messages.\r
@@ -230,6 +238,7 @@ Examples
     # POSTMAN_DISABLE_USER_EMAILING = True  # default is False\r
     # POSTMAN_AUTO_MODERATE_AS = True  # default is None\r
     # POSTMAN_SHOW_USER_AS = 'get_full_name'  # default is None\r
+    # POSTMAN_QUICKREPLY_QUOTE_BODY = True  # default is False\r
     # POSTMAN_NOTIFIER_APP = None  # default is 'notification'\r
     # POSTMAN_MAILER_APP = None  # default is 'mailer'\r
     # POSTMAN_AUTOCOMPLETER_APP = {\r
index 5364199dd66fc27989448590d2e6c5a7331be68a..05772f59494994a4694a10dc16127dc70febcc7e 100644 (file)
@@ -109,3 +109,7 @@ Examples::
             name='postman_view'),\r
         # ...\r
     )\r
+\r
+See also:\r
+\r
+* the ``POSTMAN_QUICKREPLY_QUOTE_BODY`` setting in :ref:`optional_settings`\r
index 087d63018808fbbcb62b584119156c0d6e4966e0..094a25417ac7a067feb801b6b51c84f6d0f651c3 100644 (file)
@@ -4,8 +4,8 @@ A messaging application for Django
 from __future__ import unicode_literals
 
 # following PEP 386: N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]
-VERSION = (3, 1, 0)
-PREREL = ()
+VERSION = (3, 2, 0)
+PREREL = ('a', 1)
 POST = 0
 DEV = 0
 
index 6b3fc488bd1571fe190ca9839ef6988f7572d6d4..eb58dcb8df3e4d4cb8113cc931b0f55d2786d766 100644 (file)
@@ -359,12 +359,12 @@ class Message(models.Model):
         """Return the number of accepted responses."""
         return self.next_messages.filter(moderation_status=STATUS_ACCEPTED).count()
 
-    def quote(self, format_subject, format_body):
+    def quote(self, format_subject, format_body=None):
         """Return a dictionary of quote values to initiate a reply."""
-        return {
-            'subject': format_subject(self.subject)[:self.SUBJECT_MAX_LENGTH],
-            'body': format_body(self.obfuscated_sender, self.body),
-        }
+        values = {'subject': format_subject(self.subject)[:self.SUBJECT_MAX_LENGTH]}
+        if format_body:
+            values['body'] = format_body(self.obfuscated_sender, self.body)
+        return values
 
     def clean(self):
         """Check some validity constraints."""
index 5cfc744d6ede306c7ebd86c197fa89162f499bda..75f36665aed0a38230fc4386df9b2cc8b898a3f1 100644 (file)
@@ -79,7 +79,7 @@ class GenericTest(TestCase):
     Usual generic tests.
     """
     def test_version(self):
-        self.assertEqual(sys.modules['postman'].__version__, "3.1.0")
+        self.assertEqual(sys.modules['postman'].__version__, "3.2.0a1")
 
 
 class BaseTest(TestCase):
@@ -97,7 +97,9 @@ class BaseTest(TestCase):
             'POSTMAN_DISALLOW_COPIES_ON_REPLY',
             'POSTMAN_DISABLE_USER_EMAILING',
             'POSTMAN_AUTO_MODERATE_AS',
+            'POSTMAN_NOTIFIER_APP',
             'POSTMAN_SHOW_USER_AS',
+            'POSTMAN_QUICKREPLY_QUOTE_BODY',
         ):
             if hasattr(settings, a):
                 delattr(settings, a)
@@ -477,6 +479,12 @@ class ViewTest(BaseTest):
         self.assertContains(response, '\n\nbar wrote:\n&gt; this is my body\n</textarea>')
         self.assertEqual(response.context['recipient'], 'bar')
 
+        settings.POSTMAN_QUICKREPLY_QUOTE_BODY = True  # no influence here, acts only for Quick Reply
+        self.reload_modules()
+        response = self.client.get(url)
+        self.assertContains(response, 'value="Re: s"')
+        self.assertContains(response, '\n\nbar wrote:\n&gt; this is my body\n</textarea>')
+
     def test_reply_formatters(self):
         "Test the 'formatters' parameter."
         template = "postman/reply.html"
@@ -486,7 +494,7 @@ class ViewTest(BaseTest):
         response = self.client.get(url)
         self.assertTemplateUsed(response, template)
         self.assertContains(response, 'value="Re_ s"')
-        self.assertContains(response, 'bar _ this is my body</textarea>')
+        self.assertContains(response, 'bar _ this is my body</textarea>')  # POSTMAN_QUICKREPLY_QUOTE_BODY setting is not involved
 
     def test_reply_auto_complete(self):
         "Test the 'autocomplete_channel' parameter."
@@ -629,7 +637,7 @@ class ViewTest(BaseTest):
         "Test permission, what template and form are used, set-as-read."
         template = "postman/view.html"
         pk1 = self.c12().pk
-        pk2 = self.c21().pk
+        pk2 = self.c21(body="this is my body").pk
         url = reverse('postman_view', args=[pk1])
         # anonymous
         response = self.client.get(url)
@@ -649,8 +657,15 @@ class ViewTest(BaseTest):
         self.assertEqual(response.context['reply_to_pk'], pk2)
         from postman.forms import QuickReplyForm
         self.assertTrue(isinstance(response.context['form'], QuickReplyForm))
+        self.assertNotContains(response, 'value="Re: s"')
+        self.assertContains(response, '>\r\n</textarea>')  # as in django\forms\widgets.py\Textarea
         self.check_status(Message.objects.get(pk=pk2), status=STATUS_ACCEPTED, is_new=False)
 
+        settings.POSTMAN_QUICKREPLY_QUOTE_BODY = True
+        self.reload_modules()
+        response = self.client.get(url)
+        self.assertContains(response, '\n\nbar wrote:\n&gt; this is my body\n</textarea>')
+
     def test_view_formatters(self):
         "Test the 'formatters' parameter."
         template = "postman/view.html"
@@ -660,7 +675,7 @@ class ViewTest(BaseTest):
         response = self.client.get(url)
         self.assertTemplateUsed(response, template)
         self.assertNotContains(response, 'value="Re_ s"')
-        self.assertContains(response, 'bar _ this is my body</textarea>')
+        self.assertContains(response, 'bar _ this is my body</textarea>')  # POSTMAN_QUICKREPLY_QUOTE_BODY setting is not involved
 
     def check_view_404(self, pk):
         self.check_404('postman_view', pk)
@@ -680,7 +695,7 @@ class ViewTest(BaseTest):
         template = "postman/view.html"
         m1 = self.c12()
         m1.read_at, m1.thread = now(), m1
-        m2 = self.c21(parent=m1, thread=m1.thread)
+        m2 = self.c21(parent=m1, thread=m1.thread, body="this is my body")
         m1.replied_at = m2.sent_at; m1.save()
         url = reverse('postman_view_conversation', args=[m1.pk])
         self.check_status(Message.objects.get(pk=m1.pk), status=STATUS_ACCEPTED, is_new=False, is_replied=True, thread=m1)
@@ -695,9 +710,16 @@ class ViewTest(BaseTest):
         self.assertEqual(response.context['reply_to_pk'], m2.pk)
         from postman.forms import QuickReplyForm
         self.assertTrue(isinstance(response.context['form'], QuickReplyForm))
+        self.assertNotContains(response, 'value="Re: s"')
+        self.assertContains(response, '>\r\n</textarea>')  # as in django\forms\widgets.py\Textarea
         self.assertEqual(len(response.context['pm_messages']), 2)
         self.check_status(Message.objects.get(pk=m2.pk), status=STATUS_ACCEPTED, is_new=False, parent=m1, thread=m1)
 
+        settings.POSTMAN_QUICKREPLY_QUOTE_BODY = True
+        self.reload_modules()
+        response = self.client.get(url)
+        self.assertContains(response, '\n\nbar wrote:\n&gt; this is my body\n</textarea>')
+
     def check_view_conversation_404(self, thread_id):
         self.check_404('postman_view_conversation', thread_id)
 
index 8d3a1b9956edea3e181ec12a4c09880afbff4ad5..2d4938192aa940bcfce6620b73f59c1ce5938146 100644 (file)
@@ -306,7 +306,7 @@ class DisplayMixin(object):
     """
     http_method_names = ['get']
     form_class = QuickReplyForm
-    formatters = (format_subject, format_body)
+    formatters = (format_subject, format_body if getattr(settings, 'POSTMAN_QUICKREPLY_QUOTE_BODY', False) else None)
     template_name = 'postman/view.html'
 
     @login_required_m