From e725455c9f6ce499f9cf9ab8d7c67b846ccccdd9 Mon Sep 17 00:00:00 2001 From: Vasil Vangelovski Date: Tue, 17 Jan 2012 02:53:24 +0100 Subject: Added basic handler for processing replies by email --- askbot/models/reply_by_email.py | 15 +++++++++- askbot/tests/reply_by_email_tests.py | 55 ++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 3 deletions(-) (limited to 'askbot') diff --git a/askbot/models/reply_by_email.py b/askbot/models/reply_by_email.py index 124fce4b..0d187b46 100644 --- a/askbot/models/reply_by_email.py +++ b/askbot/models/reply_by_email.py @@ -4,19 +4,25 @@ import string from django.db import models from django.contrib.auth.models import User +from django.utils.translation import ugettext as _ from askbot.models.post import Post from askbot.models.base import BaseQuerySetManager from askbot.conf import settings as askbot_settings + + class ReplyAddressManager(BaseQuerySetManager): + + def get_unused(self, address): + return self.get(address = address, used_at__isnull = True) def create_new(self, post, user): reply_address = ReplyAddress(post = post, user = user, allowed_from_email = user.email) while True: reply_address.address = ''.join(random.choice(string.letters + string.digits) for i in xrange(random.randint(12, 25))) - if ReplyAddress.objects.filter(address = reply_address.address).count() == 0: + if self.filter(address = reply_address.address).count() == 0: break reply_address.save() return reply_address @@ -50,3 +56,10 @@ class ReplyAddress(models.Model): self.save() return result + +#TODO move this function to a more appropriate module +def process_reply_email(message, address, host): + reply_address = ReplyAddress.objects.get_unused(address) + separator = _("======= Reply above this line. ====-=-=") + reply_part = message.body().split(separator)[0] + reply_address.create_reply(reply_part) diff --git a/askbot/tests/reply_by_email_tests.py b/askbot/tests/reply_by_email_tests.py index c4d70c0b..f391827b 100644 --- a/askbot/tests/reply_by_email_tests.py +++ b/askbot/tests/reply_by_email_tests.py @@ -1,8 +1,54 @@ +from django.utils.translation import ugettext as _ from askbot.models import ReplyAddress +from askbot.models.reply_by_email import process_reply_email + from askbot.tests.utils import AskbotTestCase from askbot.models import Post, PostRevision +class MockMessage(object): + + def __init__(self, body, from_email): + self._body = body + self.from_email = from_email + + def body(self): + return self._body + +class EmailProcessingTests(AskbotTestCase): + + def setUp(self): + self.u1 = self.create_user(username='user1') + self.u1.set_status('a') + self.u1.email = "user1@domain.com" + self.u1.save() + + self.u1.moderate_user_reputation(self.u1, reputation_change = 100, comment= "no comment") + self.u2 = self.create_user(username='user2') + self.u1.moderate_user_reputation(self.u2, reputation_change = 100, comment= "no comment") + self.u3 = self.create_user(username='user3') + self.u1.moderate_user_reputation(self.u3, reputation_change = 100, comment= "no comment") + + self.question = self.post_question( + user = self.u1, + follow = True, + ) + self.answer = self.post_answer( + user = self.u2, + question = self.question + ) + + self.comment = self.post_comment(user = self.u2, parent_post = self.answer) + + def test_process_correct_answer_comment(self): + addr = ReplyAddress.objects.create_new( self.answer, self.u1).address + separator = _("======= Reply above this line. ====-=-=") + msg = MockMessage("This is a test reply \n%s\nlorem ipsum"%(separator), "user1@domain.com") + process_reply_email(msg, addr, '') + self.assertEquals(self.answer.comments.count(), 2) + self.assertEquals(self.answer.comments.all().order_by('-timestamp')[0].text, "This is a test reply") + + class ReplyAddressModelTests(AskbotTestCase): @@ -32,12 +78,13 @@ class ReplyAddressModelTests(AskbotTestCase): self.assertTrue(len(result.address) >= 12 and len(result.address) <= 25) self.assertEquals(ReplyAddress.objects.all().count(), 1) + def test_create_answer_reply(self): result = ReplyAddress.objects.create_new( self.answer, self.u1) post = result.create_reply("A test post") self.assertEquals(post.post_type, "comment") self.assertEquals(post.text, "A test post") - + self.assertEquals(self.answer.comments.count(), 2) def test_create_comment_reply(self): result = ReplyAddress.objects.create_new( self.comment, self.u1) @@ -56,4 +103,8 @@ class ReplyAddressModelTests(AskbotTestCase): result = ReplyAddress.objects.create_new( self.question, self.u3) post = result.create_reply("A test post "* 10) self.assertEquals(post.post_type, "answer") - self.assertEquals(post.text, "A test post "* 10) \ No newline at end of file + self.assertEquals(post.text, "A test post "* 10) + + + + -- cgit v1.2.3-1-g7c22