summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/models/__init__.py9
-rw-r--r--askbot/startup_procedures.py32
-rw-r--r--askbot/templates/email/base_mail.html8
-rw-r--r--askbot/templates/group_messaging/email_alert.html21
-rw-r--r--askbot/templates/group_messaging/home_thread_details.html14
-rw-r--r--askbot/templates/user_inbox/messages.html2
-rw-r--r--askbot/views/users.py23
-rw-r--r--group_messaging/models.py46
-rw-r--r--group_messaging/tests.py12
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('&', '&amp;')
+ #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('&amp;', '&'))
+ self.assertEqual(query['thread_id'][0], str(root.id))
def test_get_sent_threads(self):
root1, re11, re12 = self.setup_three_message_thread()