diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-06-20 04:22:39 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-06-20 04:22:39 -0400 |
commit | 9ed91904582efbd55d2b9547cf0e4ec8733b681d (patch) | |
tree | d52eed6d3eab7d6c67e0daf5e6ffe51e548854b9 | |
parent | 52f8503a23ada55ec7da4bd241d3fa1bb480508f (diff) | |
download | askbot-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__.py | 12 | ||||
-rw-r--r-- | askbot/models/post.py | 86 | ||||
-rw-r--r-- | askbot/models/question.py | 5 | ||||
-rw-r--r-- | askbot/tests/thread_model_tests.py | 23 | ||||
-rw-r--r-- | askbot/views/users.py | 2 |
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 = \ |