diff options
-rw-r--r-- | askbot/models/__init__.py | 9 | ||||
-rw-r--r-- | askbot/startup_procedures.py | 32 | ||||
-rw-r--r-- | askbot/templates/email/base_mail.html | 8 | ||||
-rw-r--r-- | askbot/templates/group_messaging/email_alert.html | 21 | ||||
-rw-r--r-- | askbot/templates/group_messaging/home_thread_details.html | 14 | ||||
-rw-r--r-- | askbot/templates/user_inbox/messages.html | 2 | ||||
-rw-r--r-- | askbot/views/users.py | 23 | ||||
-rw-r--r-- | group_messaging/models.py | 46 | ||||
-rw-r--r-- | group_messaging/tests.py | 12 |
9 files changed, 139 insertions, 28 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index 83e67bb9..134de008 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -2228,7 +2228,7 @@ def delete_messages(self): self.message_set.all().delete() #todo: find where this is used and replace with get_absolute_url -def get_profile_url(self): +def user_get_profile_url(self): """Returns the URL for this User's profile.""" return reverse( 'user_profile', @@ -2781,7 +2781,7 @@ User.add_to_class( user_get_flag_count_posted_today ) User.add_to_class('get_flags_for_post', user_get_flags_for_post) -User.add_to_class('get_profile_url', get_profile_url) +User.add_to_class('get_profile_url', user_get_profile_url) User.add_to_class('get_profile_link', get_profile_link) User.add_to_class('get_tag_filtered_questions', user_get_tag_filtered_questions) User.add_to_class('get_messages', get_messages) @@ -2964,8 +2964,9 @@ def format_instant_notification_email( else: raise ValueError('unrecognized post type') - post_url = strip_path(site_url) + post.get_absolute_url() - user_url = strip_path(site_url) + from_user.get_absolute_url() + base_url = strip_path(site_url) + post_url = base_url + post.get_absolute_url() + user_url = base_url + from_user.get_absolute_url() user_action = user_action % { 'user': '<a href="%s">%s</a>' % (user_url, from_user.username), 'post_link': '<a href="%s">%s</a>' % (post_url, _(post.post_type)) diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 736397fb..acac0223 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -672,6 +672,37 @@ def test_longerusername(): errors.append('run "python manage.py migrate longerusername"') print_errors(errors) +def test_group_messaging(): + """tests correctness of the "group_messaging" app configuration""" + errors = list() + if 'group_messaging' not in django_settings.INSTALLED_APPS: + errors.append("add to the INSTALLED_APPS:\n'group_messaging'") + + settings_sample = ("GROUP_MESSAGING = {\n" + " 'base_url_getter_function': 'askbot.models.user_get_profile_url',\n" + " 'base_url_params': {'section': 'messages', 'sort': 'inbox'}\n" + "}") + + settings = getattr(django_settings, 'GROUP_MESSAGING', {}) + if settings: + url_params = settings.get('base_url_params', {}) + have_wrong_params = not ( + url_params.get('section', None) == 'messages' and \ + url_params.get('sort', None) == 'inbox' + ) + url_getter = settings.get('base_url_getter_function', None) + if url_getter != 'askbot.models.user_get_profile_url' or have_wrong_params: + errors.append( + "make setting 'GROUP_MESSAGING to be exactly:\n" + settings_sample + ) + + url_params = settings.get('base_url_params', None) + else: + errors.append('add this to your settings.py:\n' + settings_sample) + + if errors: + print_errors(errors) + def run_startup_tests(): """function that runs all startup tests, mainly checking settings config so far @@ -691,6 +722,7 @@ def run_startup_tests(): test_new_skins() test_longerusername() test_avatar() + test_group_messaging() settings_tester = SettingsTester({ 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY': { 'value': True, diff --git a/askbot/templates/email/base_mail.html b/askbot/templates/email/base_mail.html index eacbf87d..adf6d268 100644 --- a/askbot/templates/email/base_mail.html +++ b/askbot/templates/email/base_mail.html @@ -154,15 +154,15 @@ </tr> <tr> <td valign="top"> - {%block content%} - {%endblock%} + {% block content %} + {% endblock %} </td> </tr> <tr> <td valign="top" class="footer"> <hr> - {%block footer%} - {%endblock%} + {% block footer %} + {% endblock %} </td> </tr> </table> diff --git a/askbot/templates/group_messaging/email_alert.html b/askbot/templates/group_messaging/email_alert.html index 90fea52b..bb97f6f6 100644 --- a/askbot/templates/group_messaging/email_alert.html +++ b/askbot/templates/group_messaging/email_alert.html @@ -1,13 +1,18 @@ {% extends "email/base_mail.html"%} {% from "email/macros.html" import start_quote, end_quote %} -{% set level = 0 %} -{% for message in messages %} - {{ start_quote(level) }} - <p>{% trans author=message.sender %}{{ author }} wrote:{% endtrans %}</p> - {{ message.html|escape }} - {{ end_quote(level) }} - {% set level = level + 1 %} -{% endfor %} +{% block content %} + {% set level = 0 %} + {% for message in messages %} + {{ start_quote(level) }} + <p>{% trans author=message.sender %}{{ author }} wrote:{% endtrans %}</p> + {{ message.html|escape }} + {{ end_quote(level) }} + {% if loop.index == 1 %} + <p>{% trans %}To reply please <a class="thread-link" href="THREAD_URL_HOLE">visit your message inbox</a>{% endtrans %}</p> + {% endif %} + {% set level = level + 1 %} + {% endfor %} +{% endblock %} {% block footer %} {% include "email/footer.html" %} {% endblock %} diff --git a/askbot/templates/group_messaging/home_thread_details.html b/askbot/templates/group_messaging/home_thread_details.html new file mode 100644 index 00000000..5ece9f91 --- /dev/null +++ b/askbot/templates/group_messaging/home_thread_details.html @@ -0,0 +1,14 @@ +<div class="group-messaging" + data-create-thread-url="{% url create_thread %}" + data-get-threads-url="{% url get_threads %}" + data-reply-url="{% url post_reply %}" +> + <div class="first-col"> + <button class="submit compose">{% trans %}compose{% endtrans %}</button> + {% include "group_messaging/senders_list.html" %} + </div> + <div class="second-col"> + {% include "group_messaging/thread_details.html" %} + </div> + <div class="clear-fix"></div> +</div> diff --git a/askbot/templates/user_inbox/messages.html b/askbot/templates/user_inbox/messages.html index 8c731401..a620bf66 100644 --- a/askbot/templates/user_inbox/messages.html +++ b/askbot/templates/user_inbox/messages.html @@ -104,7 +104,7 @@ {% trans %}inbox - messages{% endtrans %} {% endblock %} {% block inbox_content %} - {% include "group_messaging/home.html" %} + {% include group_messaging_template_name %} {% endblock %} {% block userjs %} <script type="text/javascript" src="{{ 'js/group_messaging.js'|media }}"></script> diff --git a/askbot/views/users.py b/askbot/views/users.py index 895b28ab..23fa8ade 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -749,8 +749,7 @@ def user_responses(request, user, context): elif section == 'messages': if request.user != user: raise Http404 - #here we take shortcut, because we don't care about - #all the extra context loaded below + from group_messaging.views import SendersList, ThreadsList context.update(SendersList().get_context(request)) context.update(ThreadsList().get_context(request)) @@ -764,9 +763,23 @@ def user_responses(request, user, context): 'page_title' : _('profile - messages') } context.update(data) - return render_into_skin( - 'user_inbox/messages.html', context, request - ) + import pdb + pdb.set_trace() + if 'thread_id' in request.GET: + from group_messaging.models import Message + from group_messaging.views import ThreadDetails + try: + thread_id = request.GET['thread_id'] + context.update(ThreadDetails().get_context(request, thread_id)) + context['group_messaging_template_name'] = \ + 'group_messaging/home_thread_details.html' + except Message.DoesNotExist: + raise Http404 + else: + context['group_messaging_template_name'] = 'group_messaging/home.html' + #here we take shortcut, because we don't care about + #all the extra context loaded below + return render_into_skin('user_inbox/messages.html', context, request) else: raise Http404 diff --git a/group_messaging/models.py b/group_messaging/models.py index a34e4690..91e4a52e 100644 --- a/group_messaging/models.py +++ b/group_messaging/models.py @@ -1,11 +1,17 @@ """models for the ``group_messaging`` app """ +import copy import datetime +import urllib +from askbot.mail import send_mail #todo: remove dependency? from coffin.template.loader import get_template from django.db import models from django.db.models import signals +from django.conf import settings as django_settings from django.contrib.auth.models import Group from django.contrib.auth.models import User +from django.contrib.sites.models import Site +from django.utils.importlib import import_module from django.utils.translation import ugettext as _ MAX_HEADLINE_LENGTH = 80 @@ -321,6 +327,24 @@ class Message(models.Model): sender_list, created = SenderList.objects.get_or_create(recipient=recipient) sender_list.senders.add(self.sender) + def get_absolute_url(self, user=None, include_domain_name=False): + """returns absolute url to the thread""" + assert(user != None) + settings = django_settings.GROUP_MESSAGING + func_path = settings['base_url_getter_function'] + path_bits = func_path.split('.') + url_getter = getattr( + import_module('.'.join(path_bits[:-1])), + path_bits[-1] + ) + params = copy.copy(settings['base_url_params']) + params['thread_id'] = self.id + url = url_getter(user) + '?' + urllib.urlencode(params) + if include_domain_name: + site = Site.objects.get_current() + url = 'http://' + site.domain + url + return url + def get_email_subject_line(self): """forms subject line based on the root message and prepends 'Re': if message is non-root @@ -355,13 +379,25 @@ class Message(models.Model): def send_email_alert(self): """signal handler for the message post-save""" - subject = self.get_email_subject_line() - template = get_template('group_messaging/email_alert.html') + root_message = self.get_root_message() data = {'messages': self.get_timeline()} + template = get_template('group_messaging/email_alert.html') body_text = template.render(data) - recipients = map(lambda v: v.email, self.get_recipients_users()) - from askbot.mail import send_mail - send_mail(recipient_list=recipients, subject_line=subject, body_text=body_text) + subject = self.get_email_subject_line() + for user in self.get_recipients_users(): + #todo change url scheme so that all users have the same + #urls within their personal areas of the user profile + #so that we don't need to have loops like this one + thread_url = root_message.get_absolute_url( + user, include_domain_name=True + ).replace('&', '&') + #in the template we have a placeholder to be replaced like this: + body_text = body_text.replace('THREAD_URL_HOLE', thread_url) + send_mail( + recipient_list=[user.email,], + subject_line=subject, + body_text=body_text + ) def update_senders_info(self): diff --git a/group_messaging/tests.py b/group_messaging/tests.py index f0a2dc5c..61b2dbbf 100644 --- a/group_messaging/tests.py +++ b/group_messaging/tests.py @@ -1,3 +1,6 @@ +import time +import urlparse +from bs4 import BeautifulSoup from django.test import TestCase from django.contrib.auth.models import User, Group from group_messaging.models import Message @@ -8,7 +11,6 @@ from group_messaging.models import get_personal_group from group_messaging.models import create_personal_group from group_messaging.views import ThreadsList from mock import Mock -import time MESSAGE_TEXT = 'test message text' @@ -282,6 +284,14 @@ class ModelsTests(GroupMessagingTests): self.assertEqual(len(outbox), 1) self.assertEqual(len(outbox[0].recipients()), 1) self.assertEqual(outbox[0].recipients()[0], self.recipient.email) + html_message = outbox[0].alternatives[0][0] + self.assertTrue(root.text in html_message) + soup = BeautifulSoup(html_message) + links = soup.find_all('a', attrs={'class': 'thread-link'}) + self.assertEqual(len(links), 1) + parse_result = urlparse.urlparse(links[0]['href']) + query = urlparse.parse_qs(parse_result.query.replace('&', '&')) + self.assertEqual(query['thread_id'][0], str(root.id)) def test_get_sent_threads(self): root1, re11, re12 = self.setup_three_message_thread() |