summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-06-20 04:22:39 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-06-20 04:22:39 -0400
commit9ed91904582efbd55d2b9547cf0e4ec8733b681d (patch)
treed52eed6d3eab7d6c67e0daf5e6ffe51e548854b9
parent52f8503a23ada55ec7da4bd241d3fa1bb480508f (diff)
downloadaskbot-9ed91904582efbd55d2b9547cf0e4ec8733b681d.tar.gz
askbot-9ed91904582efbd55d2b9547cf0e4ec8733b681d.tar.bz2
askbot-9ed91904582efbd55d2b9547cf0e4ec8733b681d.zip
made email alerts and on-screen notifications to be filtered for private posts
-rw-r--r--askbot/models/__init__.py12
-rw-r--r--askbot/models/post.py86
-rw-r--r--askbot/models/question.py5
-rw-r--r--askbot/tests/thread_model_tests.py23
-rw-r--r--askbot/views/users.py2
5 files changed, 104 insertions, 24 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index 6fc7eef5..379b3825 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -190,9 +190,6 @@ def user_get_avatar_url(self, size):
else:
return self.get_default_avatar_url(size)
-def user_get_user_groups(self):
- """returns query set of groups to which user belongs"""
-
def user_update_avatar_type(self):
"""counts number of custom avatars
and if zero, sets avatar_type to False,
@@ -1583,8 +1580,10 @@ def user_edit_answer(
text = body_text,
comment = revision_comment,
wiki = wiki,
+ is_private = is_private,
by_email = by_email
)
+
answer.thread.invalidate_cached_data()
award_badges_signal.send(None,
event = 'edit_answer',
@@ -1707,15 +1706,10 @@ def user_post_answer(
added_at = timestamp,
email_notify = follow,
wiki = wiki,
+ is_private = is_private,
by_email = by_email
)
- if self.can_make_group_private_posts():
- if is_private:
- answer_post.make_private(self)
- else:
- answer_post.make_public(self)
-
answer_post.thread.invalidate_cached_data()
award_badges_signal.send(None,
event = 'post_answer',
diff --git a/askbot/models/post.py b/askbot/models/post.py
index c895084d..f1c3840e 100644
--- a/askbot/models/post.py
+++ b/askbot/models/post.py
@@ -180,6 +180,7 @@ class PostManager(BaseQuerySetManager):
text,
parent = None,
wiki = False,
+ is_private = False,
email_notify = False,
post_type = None,
by_email = False
@@ -204,7 +205,7 @@ class PostManager(BaseQuerySetManager):
post.last_edited_at = added_at
post.wikified_at = added_at
- post.parse_and_save(author=author)
+ post.parse_and_save(author=author, is_private = is_private)
post.add_revision(
author = author,
@@ -224,6 +225,7 @@ class PostManager(BaseQuerySetManager):
added_at,
text,
wiki = False,
+ is_private = False,
email_notify = False,
by_email = False
):
@@ -233,6 +235,7 @@ class PostManager(BaseQuerySetManager):
added_at,
text,
wiki = wiki,
+ is_private = is_private,
post_type = 'answer',
by_email = by_email
)
@@ -481,9 +484,19 @@ class Post(models.Model):
created = self.pk is None
+ is_private = kwargs.pop('is_private', False)
+
#this save must precede saving the mention activity
+ #as well as assigning groups to the post
#because generic relation needs primary key of the related object
super(self.__class__, self).save(**kwargs)
+
+ if author.can_make_group_private_posts():
+ if is_private:
+ self.make_private(author)
+ else:
+ self.make_public(author)
+
if last_revision:
diff = htmldiff(last_revision, self.html)
else:
@@ -575,6 +588,15 @@ class Post(models.Model):
raise NotImplementedError
+ def get_authorized_group_ids(self):
+ """returns values list query set for the group id's of the post"""
+ if self.is_comment():
+ return self.parent.get_authorized_group_ids()
+ elif self.is_answer() or self.is_question():
+ return self.groups.values_list('id', flat = True)
+ else:
+ raise NotImplementedError()
+
def delete(self, **kwargs):
"""deletes comment and concomitant response activity
records, as well as mention records, while preserving
@@ -637,6 +659,27 @@ class Post(models.Model):
"""
return html_utils.strip_tags(self.html)[:max_length] + ' ...'
+ def filter_authorized_users(self, candidates):
+ """returns list of users who are allowed to see this post"""
+ if askbot_settings.GROUPS_ENABLED == False:
+ return candidates
+ else:
+ #here we filter candidates against the post authorized groups
+ authorized_group_ids = list(self.get_authorized_group_ids())
+
+ if len(authorized_group_ids) == 0:#if there are no groups - all ok
+ return candidates
+
+ #and filter the users by those groups
+ filtered_candidates = list()
+ for candidate in candidates:
+ c_groups = candidate.get_groups()
+ if c_groups.filter(id__in = authorized_group_ids).count():
+ filtered_candidates.append(candidate)
+
+ return filtered_candidates
+
+
def format_for_email(
self, quote_level = 0, is_leaf_post = False, format = None
):
@@ -870,6 +913,7 @@ class Post(models.Model):
):
"""get list of users who have subscribed to
receive instant notifications for a given post
+
this method works for questions and answers
Arguments:
@@ -1035,22 +1079,30 @@ class Post(models.Model):
return list(subscriber_set)
- def get_instant_notification_subscribers(self, potential_subscribers = None, mentioned_users = None, exclude_list = None):
+ def get_instant_notification_subscribers(
+ self, potential_subscribers = None,
+ mentioned_users = None, exclude_list = None
+ ):
if self.is_question() or self.is_answer():
- return self._qa__get_instant_notification_subscribers(
+ subscribers = self._qa__get_instant_notification_subscribers(
potential_subscribers=potential_subscribers,
mentioned_users=mentioned_users,
exclude_list=exclude_list
)
elif self.is_comment():
- return self._comment__get_instant_notification_subscribers(
+ subscribers = self._comment__get_instant_notification_subscribers(
potential_subscribers=potential_subscribers,
mentioned_users=mentioned_users,
exclude_list=exclude_list
)
elif self.is_tag_wiki() or self.is_reject_reason():
return list()
- raise NotImplementedError
+ else:
+ raise NotImplementedError
+
+ #if askbot_settings.GROUPS_ENABLED and self.is_effectively_private():
+ # for subscriber in subscribers:
+ return self.filter_authorized_users(subscribers)
def get_latest_revision(self):
return self.revisions.order_by('-revised_at')[0]
@@ -1415,9 +1467,17 @@ class Post(models.Model):
text = None,
comment = None,
wiki = False,
+ is_private = False,
by_email = False
):
+ #it is important to do this before __apply_edit b/c of signals!!!
+ if self.is_private() != is_private:
+ if is_private:
+ self.make_private(self.author)
+ else:
+ self.make_public(self.author)
+
self.__apply_edit(
edited_at = edited_at,
edited_by = edited_by,
@@ -1426,6 +1486,7 @@ class Post(models.Model):
wiki = wiki,
by_email = by_email
)
+
if edited_at is None:
edited_at = datetime.datetime.now()
self.thread.set_last_activity(last_activity_at=edited_at, last_activity_by=edited_by)
@@ -1625,16 +1686,21 @@ class Post(models.Model):
def get_response_receivers(self, exclude_list = None):
- """returns a list of response receiving users"""
+ """returns a list of response receiving users
+ who see the on-screen notifications
+ """
if self.is_answer():
- return self._answer__get_response_receivers(exclude_list)
+ receivers = self._answer__get_response_receivers(exclude_list)
elif self.is_question():
- return self._question__get_response_receivers(exclude_list)
+ receivers = self._question__get_response_receivers(exclude_list)
elif self.is_comment():
- return self._comment__get_response_receivers(exclude_list)
+ receivers = self._comment__get_response_receivers(exclude_list)
elif self.is_tag_wiki() or self.is_reject_reason():
return list()#todo: who should get these?
- raise NotImplementedError
+ else:
+ raise NotImplementedError
+
+ return self.filter_authorized_users(receivers)
def get_question_title(self):
if self.is_question():
diff --git a/askbot/models/question.py b/askbot/models/question.py
index 4b3318b3..f3a971e9 100644
--- a/askbot/models/question.py
+++ b/askbot/models/question.py
@@ -125,7 +125,8 @@ class ThreadManager(BaseQuerySetManager):
question.last_edited_at = added_at
question.wikified_at = added_at
- question.parse_and_save(author = author)
+ #this is kind of bad, but we save assign privacy groups to posts and thread
+ question.parse_and_save(author = author, is_private = is_private)
question.add_revision(
author = author,
@@ -624,7 +625,7 @@ class Thread(models.Model):
"""
thread_posts = self.posts.all()
if askbot_settings.GROUPS_ENABLED:
- if user.is_anonymous():
+ if user is None or user.is_anonymous():
exclude_groups = get_groups()
else:
exclude_groups = user.get_foreign_groups()
diff --git a/askbot/tests/thread_model_tests.py b/askbot/tests/thread_model_tests.py
index 634a4b0a..3f313ff3 100644
--- a/askbot/tests/thread_model_tests.py
+++ b/askbot/tests/thread_model_tests.py
@@ -1,6 +1,7 @@
from askbot.tests.utils import AskbotTestCase
from askbot.conf import settings as askbot_settings
from askbot import models
+import django.core.mail
class ThreadModelTestsWithGroupsEnabled(AskbotTestCase):
@@ -8,7 +9,16 @@ class ThreadModelTestsWithGroupsEnabled(AskbotTestCase):
self.groups_enabled_backup = askbot_settings.GROUPS_ENABLED
askbot_settings.update('GROUPS_ENABLED', True)
self.admin = self.create_user('admin', status = 'd')
- self.user = self.create_user('user')
+ self.user = self.create_user(
+ 'user',
+ notification_schedule = {
+ 'q_ask': 'i',
+ 'q_all': 'i',
+ 'q_ans': 'i',
+ 'q_sel': 'i',
+ 'm_and_c': 'i'
+ }
+ )
self.group = models.Tag.group_tags.get_or_create(
group_name = 'jockeys', user = self.admin
)
@@ -38,3 +48,14 @@ class ThreadModelTestsWithGroupsEnabled(AskbotTestCase):
self.assertEqual(thread.get_answer_count(self.admin), 1)
#test mail outbox
+ self.assertEqual(len(django.core.mail.outbox), 0)
+ user = self.reload_object(self.user)
+ self.assertEqual(user.new_response_count, 0)
+
+ self.admin.edit_answer(
+ self.answer,
+ is_private = False
+ )
+ self.assertEqual(len(django.core.mail.outbox), 1)
+ user = self.reload_object(self.user)
+ self.assertEqual(user.new_response_count, 1)
diff --git a/askbot/views/users.py b/askbot/views/users.py
index a536b79e..50a00e6f 100644
--- a/askbot/views/users.py
+++ b/askbot/views/users.py
@@ -70,8 +70,6 @@ def users(request, by_group = False, group_id = None, group_slug = None):
if all((group_id, group_slug)) == False:
return HttpResponseRedirect('groups')
else:
- import pdb
- pdb.set_trace()
try:
group = models.Tag.group_tags.get(id = group_id)
group_email_moderation_enabled = \