diff options
-rw-r--r-- | askbot/models/__init__.py | 11 | ||||
-rw-r--r-- | askbot/models/post.py | 11 | ||||
-rw-r--r-- | askbot/models/user.py | 20 | ||||
-rw-r--r-- | askbot/skins/default/media/style/style.less | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/500.html | 5 | ||||
-rw-r--r-- | askbot/skins/default/templates/macros.html | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_inbox/base.html | 63 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_inbox/group_join_requests.html | 50 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_inbox/responses_and_flags.html | 43 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/group_join_requests.html | 108 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/user_inbox.html | 114 | ||||
-rw-r--r-- | askbot/tests/__init__.py | 1 | ||||
-rw-r--r-- | askbot/tests/page_load_tests.py | 2 | ||||
-rw-r--r-- | askbot/tests/post_model_tests.py | 5 | ||||
-rw-r--r-- | askbot/tests/thread_model_tests.py | 2 | ||||
-rw-r--r-- | askbot/tests/view_context_tests.py | 30 | ||||
-rw-r--r-- | askbot/views/commands.py | 32 | ||||
-rw-r--r-- | askbot/views/context.py | 30 | ||||
-rw-r--r-- | askbot/views/users.py | 16 |
19 files changed, 286 insertions, 261 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index ee0d4269..9a4121c1 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -422,6 +422,14 @@ def user_notify_users( activity.save() activity.add_recipients(recipients) +def user_get_notifications(self, notification_types=None, **kwargs): + """returns query set of activity audit status objects""" + return ActivityAuditStatus.objects.filter( + user=self, + activity__activity_type__in=notification_types, + **kwargs + ) + def _assert_user_can( user = None, post = None, #related post (may be parent) @@ -2713,6 +2721,7 @@ User.add_to_class('get_foreign_groups', user_get_foreign_groups) User.add_to_class('get_group_membership', user_get_group_membership) User.add_to_class('get_personal_group', user_get_personal_group) User.add_to_class('get_primary_group', user_get_primary_group) +User.add_to_class('get_notifications', user_get_notifications) User.add_to_class('strip_email_signature', user_strip_email_signature) User.add_to_class('get_groups_membership_info', user_get_groups_membership_info) User.add_to_class('get_anonymous_name', user_get_anonymous_name) @@ -3422,7 +3431,7 @@ def add_user_to_personal_group(sender, instance, created, **kwargs): #identical group names!!! group_name = format_personal_group_name(instance) group = Group.objects.get_or_create( - group_name=group_name, user=instance + name=group_name, user=instance ) instance.edit_group_membership( group=group, user=instance, action='add' diff --git a/askbot/models/post.py b/askbot/models/post.py index 8afc3bba..25e51b50 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -601,15 +601,10 @@ class Post(models.Model): * sends email alerts to all subscribers to the post """ assert(activity_type is not None) - if self.is_comment(): - #it's just a comment! - summary = self.text + if diff: + summary = diff else: - #summary = post.get_latest_revision().summary - if diff: - summary = diff - else: - summary = self.text + summary = self.get_snippet() update_activity = Activity( user = updated_by, diff --git a/askbot/models/user.py b/askbot/models/user.py index 77e181d3..7f384870 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -210,10 +210,7 @@ class Activity(models.Model): return user_qs[0] def get_snippet(self, max_length = 120): - if self.summary == '': - return self.content_object.get_snippet(max_length) - else: - return self.summary + return self.content_object.get_snippet(max_length) def get_absolute_url(self): return self.content_object.get_absolute_url() @@ -419,18 +416,18 @@ class GroupManager(BaseQuerySetManager): pass return super(GroupManager, self).create(**kwargs) - def get_or_create(self, group_name = None, user = None, openness=None): + def get_or_create(self, name = None, user = None, openness=None): """creates a group tag or finds one, if exists""" #todo: here we might fill out the group profile try: #iexact is important!!! b/c we don't want case variants #of tags - group = self.get(name__iexact = group_name) + group = self.get(name__iexact = name) except self.model.DoesNotExist: - if openness: - group = self.create(name=group_name, openness=openness) + if openness is None: + group = self.create(name=name) else: - group = self.create(name=group_name) + group = self.create(name=name, openness=openness) return group @@ -469,6 +466,11 @@ class Group(AuthGroup): user_filter = user_filter & models.Q(groups__in=[self]) return User.objects.filter(user_filter) + def has_moderator(self, user): + """true, if user is a group moderator""" + mod_ids = self.get_moderators().values_list('id', flat=True) + return user.id in mod_ids + def get_openness_choices(self): """gives answers to question "How can users join this group?" diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less index d64bd6c8..e7f219b2 100644 --- a/askbot/skins/default/media/style/style.less +++ b/askbot/skins/default/media/style/style.less @@ -194,7 +194,7 @@ body.user-messages { .notification { margin-top: 6px; - margin-bottom: 6px; + /*margin-bottom: 6px;*/ font-size: 16px; color:#424242 } diff --git a/askbot/skins/default/templates/500.html b/askbot/skins/default/templates/500.html deleted file mode 100644 index 8ec1bce4..00000000 --- a/askbot/skins/default/templates/500.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load extra_tags %} -{% include_jinja "500.jinja.html" request %} -{% comment %}this template must be django -because of the use of default handler500 -{% endcomment %} diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index b810cada..afdde6b6 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -17,7 +17,7 @@ {{ response.response_type }} ({{ timeago(response.timestamp) }}):<br/> {% if inbox_section != 'flags' %} - {{ response.response_snippet|escape }} + {{ response.response_snippet }} {% endif %} </a> {% if inbox_section == 'flags' %} diff --git a/askbot/skins/default/templates/user_inbox/base.html b/askbot/skins/default/templates/user_inbox/base.html new file mode 100644 index 00000000..4d74f8bc --- /dev/null +++ b/askbot/skins/default/templates/user_inbox/base.html @@ -0,0 +1,63 @@ +{% extends "user_profile/user.html" %} +{% block before_css %} + <link href="{{'/bootstrap/css/bootstrap.css'|media}}" rel="stylesheet" type="text/css" /> +{% endblock %} +{% block profilesection %} + {% trans %}inbox{% endtrans %} +{% endblock %} +{% block usercontent %} +<div style="padding-top:5px;font-size:13px;"> + {% set re_count = request.user.new_response_count + + request.user.seen_response_count + %} + {% if re_count + flags_count + group_join_requests_count > 0 %} + <div id="re_sections"> + {% trans %}Sections:{% endtrans %} + {% set sep = joiner('|') %} + {% if re_count > 0 %}{{ sep() }} + <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=forum" + {% if inbox_section == 'forum' %}class="on"{% endif %} + > + {% trans %}forum responses ({{re_count}}){% endtrans -%} + </a> + {% endif %} + {% if flags_count > 0 %}{{ sep() }} + <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=flags" + {% if inbox_section == 'flags' %}class="on"{% endif %} + > + {% trans %}flagged items ({{flags_count}}){% endtrans %} + </a> + {% endif %} + {% if group_join_requests_count %}{{ sep() }} + <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=join_requests" + {% if inbox_section == 'join_requests' %}class="on"{% endif %} + > + {% trans %}group join requests{% endtrans %} + </a> + {% endif %} + </div> + {% endif %} + {% block inbox_content %} + {% endblock %} +</div> +{% endblock %} +{% block userjs %} + <script type="text/javascript"> + var askbot = askbot || {}; + askbot['urls'] = askbot['urls'] || {}; + askbot['urls']['manageInbox'] = '{% url manage_inbox %}'; + askbot['urls']['save_post_reject_reason'] = '{% url save_post_reject_reason %}'; + askbot['urls']['delete_post_reject_reason'] = '{% url delete_post_reject_reason %}'; + {% if request.user.is_administrator_or_moderator() %} + askbot['data']['postRejectReasons'] = [ + {% for reason in post_reject_reasons %} + {'id': {{reason.id}}, 'title': '{{reason.title|escapejs}}'}, + {% endfor %} + ]; + {% endif %} + $(document).ready(function(){ + $('body').addClass('inbox-{{ inbox_section }}'); + setup_inbox(); + }); + </script> +{% endblock %} diff --git a/askbot/skins/default/templates/user_inbox/group_join_requests.html b/askbot/skins/default/templates/user_inbox/group_join_requests.html new file mode 100644 index 00000000..2defe5e1 --- /dev/null +++ b/askbot/skins/default/templates/user_inbox/group_join_requests.html @@ -0,0 +1,50 @@ +{% extends "user_inbox/base.html" %} +{% import "macros.html" as macros %} +{% block profilesection %} + {% trans %}inbox - group join requests{% endtrans %} +{% endblock %} +{% block inbox_content %} + <table> + {% for join_request in join_requests %} + <tr> + <td>{% trans + user=join_request.user, + group=groups_dict[join_request.object_id].name + %}{{ user }} wants to join group {{ group }}{% endtrans %} + </td> + <td>{# forms with accept and reject buttons #} + <form action="{% url moderate_group_join_request %}" method="post" + >{% csrf_token %} + <input + type="hidden" + name="request_id" + value="{{join_request.id}}" + /> + <input type="hidden" name="action" value="approve"/> + <input + class="btn" + type="submit" + value="{% trans %}Approve{% endtrans %}" + /> + </form> + </td> + <td> + <form action="{% url moderate_group_join_request %}" method="post"> + {% csrf_token %} + <input + type="hidden" + name="request_id" + value="{{join_request.id}}" + /> + <input type="hidden" name="action" value="deny"/> + <input + class="btn" + type="submit" + value="{% trans %}Deny{% endtrans %}" + /> + </form> + </td> + </tr> + {% endfor %} + </table> +{% endblock %} diff --git a/askbot/skins/default/templates/user_inbox/responses_and_flags.html b/askbot/skins/default/templates/user_inbox/responses_and_flags.html new file mode 100644 index 00000000..c889bb0a --- /dev/null +++ b/askbot/skins/default/templates/user_inbox/responses_and_flags.html @@ -0,0 +1,43 @@ +{% extends "user_inbox/base.html" %} +{% import "macros.html" as macros %} +{% block profilesection %} + {% trans %}inbox - responses{% endtrans %} +{% endblock %} +{% block inbox_content %} + <div id="re_tools"> + <strong>{% trans %}select:{% endtrans %}</strong> + <a id="sel_all">{% trans %}all{% endtrans %}</a> | + <a id="sel_seen">{% trans %}seen{% endtrans %}</a> | + <a id="sel_new">{% trans %}new{% endtrans %}</a> | + <a id="sel_none">{% trans %}none{% endtrans %}</a><br /> + <div class="btn-group"> + {% if inbox_section == 'forum' %} + <a class="btn" id="re_mark_seen">{% trans %}mark as seen{% endtrans %}</a> + <a class="btn" id="re_mark_new">{% trans %}mark as new{% endtrans %}</a> + <a class="btn" id="re_dismiss">{% trans %}dismiss{% endtrans %}</a> + {% else %} + <a class="btn" id="re_remove_flag">{% trans %}remove flags/approve{% endtrans %}</a> + <a + class="btn" + id="re_delete_post" + >{% trans %}delete post{% endtrans %}</a> + {% endif %} + </div> + </div> + {% include "user_profile/reject_post_dialog.html" %} + <div id="responses"> + {% for response in responses %} + <div class="response-parent" data-response-id="{{response.id}}"> + <p class="headline"> + <strong>"{{ response.response_title.strip()|escape}}"</strong> + </p> + {{ macros.inbox_post_snippet(response, inbox_section) }} + {% for nested_response in response.nested_responses %} + {{ macros.inbox_post_snippet(nested_response, inbox_section) }} + {%endfor%} + </div> + <div class="clearfix"></div> + {% endfor %} + </div> + </div> +{% endblock %} diff --git a/askbot/skins/default/templates/user_profile/group_join_requests.html b/askbot/skins/default/templates/user_profile/group_join_requests.html deleted file mode 100644 index 6d484b88..00000000 --- a/askbot/skins/default/templates/user_profile/group_join_requests.html +++ /dev/null @@ -1,108 +0,0 @@ -{% extends "user_profile/user.html" %} -{% import "macros.html" as macros %} -{% block before_css %} - <link href="{{'/bootstrap/css/bootstrap.css'|media}}" rel="stylesheet" type="text/css" /> -{% endblock %} -<!-- user_responses.html --> -{# -This template accepts a list of response list -they are a generalized form of any response and - -The following properties of response object are used: -timestamp - when it happened -user - user who gave response (database object) -response_type - type of response -response_url - link to the question -response_title - title of the question -response_snippet - abbreviated content of the response -inbox_section - forum|flags -#} -{% block profilesection %} - {% trans %}inbox{% endtrans %} -{% endblock %} -{% block usercontent %} - <div style="padding-top:5px;font-size:13px;"> - {% set re_count = request.user.new_response_count + - request.user.seen_response_count - %} - {% if moderation_items %} - {% set flag_count = moderation_items['new_count'] + - moderation_items['seen_count'] - %} - {% else %} - {% set flag_count = 0 %} - {% endif %} - {% if re_count > 0 and flag_count > 0 %} - <div id="re_sections"> - {% trans %}Sections:{% endtrans %} - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=forum" - {% if inbox_section == 'forum' %}class="on"{% endif %} - > - {% trans %}forum responses ({{re_count}}){% endtrans -%} - </a> | - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=flags" - {% if inbox_section == 'flags' %}class="on"{% endif %} - > - {% trans %}flagged items ({{flag_count}}){% endtrans %} - </a> - {% if join_requests_count %} | - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=join_requests" - {% if inbox_section == 'join_requests' %}class="on"{% endif %} - > - {% trans %}group join requests{% endtrans %} - </a> - {% endif %} - </div> - {% endif %} - {# content #} - <table> - {% for join_request in join_requests %} - <tr> - <td>{% trans - user=join_request.user - group=groups_dict[join_request.object_id].name - %}{{ user }} wants to join group {{ group }}{% endtrans %} - </td> - <td>{# forms with accept and reject buttons #} - <form action="{% url moderate_group_join_request %}" method="post"> - <input - type="hidden" - name="request_id" - value="{{join_request.id}}" - /> - <input type="hidden" name="action" value="approve"/> - <input - class="btn" - type="submit" - value="{% trans %}Approve{% endtrans %}" - /> - </form> - <form action="{% url moderate_group_join_request %}" method="post"> - <input - type="hidden" - name="request_id" - value="{{join_request.id}}" - /> - <input type="hidden" name="action" value="deny"/> - <input - class="btn" - type="submit" - value="{% trans %}Deny{% endtrans %}" - /> - </form> - </td> - </tr> - {% endfor %} - <table> - data = { - 'active_tab':'users', - 'page_class': 'user-profile-page', - 'tab_name' : 'join_requests', - 'tab_description' : _('group joining requests'), - 'page_title' : _('profile - moderation'), - 'groups_dict': groups_dict, - 'join_requests': join_requests - } -{% endblock %} -{% block userjs %} -{% endblock %} diff --git a/askbot/skins/default/templates/user_profile/user_inbox.html b/askbot/skins/default/templates/user_profile/user_inbox.html deleted file mode 100644 index 076f957c..00000000 --- a/askbot/skins/default/templates/user_profile/user_inbox.html +++ /dev/null @@ -1,114 +0,0 @@ -{% extends "user_profile/user.html" %} -{% import "macros.html" as macros %} -{% block before_css %} - <link href="{{'/bootstrap/css/bootstrap.css'|media}}" rel="stylesheet" type="text/css" /> -{% endblock %} -<!-- user_responses.html --> -{# -This template accepts a list of response list -they are a generalized form of any response and - -The following properties of response object are used: -timestamp - when it happened -user - user who gave response (database object) -response_type - type of response -response_url - link to the question -response_title - title of the question -response_snippet - abbreviated content of the response -inbox_section - forum|flags -#} -{% block profilesection %} - {% trans %}inbox{% endtrans %} -{% endblock %} -{% block usercontent %} - <div style="padding-top:5px;font-size:13px;"> - {% set re_count = request.user.new_response_count + - request.user.seen_response_count - %} - {% if moderation_items %} - {% set flag_count = moderation_items['new_count'] + - moderation_items['seen_count'] - %} - {% else %} - {% set flag_count = 0 %} - {% endif %} - {% if re_count > 0 and flag_count > 0 %} - <div id="re_sections"> - {% trans %}Sections:{% endtrans %} - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=forum" - {% if inbox_section == 'forum' %}class="on"{% endif %} - > - {% trans %}forum responses ({{re_count}}){% endtrans -%} - </a> | - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=flags" - {% if inbox_section == 'flags' %}class="on"{% endif %} - > - {% trans %}flagged items ({{flag_count}}){% endtrans %} - </a> - {% if join_requests_count %} | - <a href="{{request.user.get_absolute_url()}}?sort=inbox§ion=join_requests" - {% if inbox_section == 'join_requests' %}class="on"{% endif %} - > - {% trans %}group join requests{% endtrans %} - </a> - {% endif %} - </div> - {% endif %} - <div id="re_tools"> - <strong>{% trans %}select:{% endtrans %}</strong> - <a id="sel_all">{% trans %}all{% endtrans %}</a> | - <a id="sel_seen">{% trans %}seen{% endtrans %}</a> | - <a id="sel_new">{% trans %}new{% endtrans %}</a> | - <a id="sel_none">{% trans %}none{% endtrans %}</a><br /> - <div class="btn-group"> - {% if inbox_section == 'forum' %} - <a class="btn" id="re_mark_seen">{% trans %}mark as seen{% endtrans %}</a> - <a class="btn" id="re_mark_new">{% trans %}mark as new{% endtrans %}</a> - <a class="btn" id="re_dismiss">{% trans %}dismiss{% endtrans %}</a> - {% else %} - <a class="btn" id="re_remove_flag">{% trans %}remove flags/approve{% endtrans %}</a> - <a - class="btn" - id="re_delete_post" - >{% trans %}delete post{% endtrans %}</a> - {% endif %} - </div> - </div> - {% include "user_profile/reject_post_dialog.html" %} - <div id="responses"> - {% for response in responses %} - <div class="response-parent" data-response-id="{{response.id}}"> - <p class="headline"> - <strong>"{{ response.response_title.strip()|escape}}"</strong> - </p> - {{ macros.inbox_post_snippet(response, inbox_section) }} - {% for nested_response in response.nested_responses %} - {{ macros.inbox_post_snippet(nested_response, inbox_section) }} - {%endfor%} - </div> - <div class="clearfix"></div> - {% endfor %} - </div> - </div> -{% endblock %} -{% block userjs %} - <script type="text/javascript"> - var askbot = askbot || {}; - askbot['urls'] = askbot['urls'] || {}; - askbot['urls']['manageInbox'] = '{% url manage_inbox %}'; - askbot['urls']['save_post_reject_reason'] = '{% url save_post_reject_reason %}'; - askbot['urls']['delete_post_reject_reason'] = '{% url delete_post_reject_reason %}'; - {% if request.user.is_administrator_or_moderator() %} - askbot['data']['postRejectReasons'] = [ - {% for reason in post_reject_reasons %} - {'id': {{reason.id}}, 'title': '{{reason.title|escapejs}}'}, - {% endfor %} - ]; - {% endif %} - $(document).ready(function(){ - $('body').addClass('inbox-{{ inbox_section }}'); - setup_inbox(); - }); - </script> -<!-- end user_responses.html --> -{% endblock %} diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index 6e43940e..4cecf930 100644 --- a/askbot/tests/__init__.py +++ b/askbot/tests/__init__.py @@ -19,3 +19,4 @@ from askbot.tests.widget_tests import * from askbot.tests.category_tree_tests import CategoryTreeTests from askbot.tests.user_model_tests import UserModelTests from askbot.tests.utils_tests import * +from askbot.tests.view_context_tests import * diff --git a/askbot/tests/page_load_tests.py b/askbot/tests/page_load_tests.py index a3f36e80..6a42e6f0 100644 --- a/askbot/tests/page_load_tests.py +++ b/askbot/tests/page_load_tests.py @@ -516,7 +516,7 @@ class PageLoadTestCase(AskbotTestCase): 'user_profile', kwargs={'id': asker.id, 'slug': slugify(asker.username)}, data={'sort':'inbox'}, - template='user_profile/user_inbox.html', + template='user_inbox/responses_and_flags.html', ) def test_user_page_with_groups_enabled(self): diff --git a/askbot/tests/post_model_tests.py b/askbot/tests/post_model_tests.py index c5ad153f..1a3a9c49 100644 --- a/askbot/tests/post_model_tests.py +++ b/askbot/tests/post_model_tests.py @@ -142,7 +142,7 @@ class PostModelTests(AskbotTestCase): groups_enabled_backup = askbot_settings.GROUPS_ENABLED askbot_settings.update('GROUPS_ENABLED', True) #create group - group = Group(name='testers') + group = Group(name='testers', openness=Group.OPEN) group.save() #create one admin and one moderator, and one reg user @@ -320,6 +320,7 @@ class ThreadRenderLowLevelCachingTests(AskbotTestCase): 'thread': thread, 'question': thread._question_post(), 'search_state': ss, + 'visitor': None } proper_html = get_template('widgets/question_summary.html').render(context) self.assertEqual(test_html, proper_html) @@ -596,8 +597,6 @@ class ThreadRenderCacheUpdateTests(AskbotTestCase): self.assertEqual(html, thread.get_cached_summary_html()) def test_view_count(self): - import pdb - pdb.set_trace() question = self.post_question() self.assertEqual(0, question.thread.view_count) self.assertEqual(0, Thread.objects.all()[0].view_count) diff --git a/askbot/tests/thread_model_tests.py b/askbot/tests/thread_model_tests.py index 45a704c0..13b32547 100644 --- a/askbot/tests/thread_model_tests.py +++ b/askbot/tests/thread_model_tests.py @@ -19,7 +19,7 @@ class ThreadModelTestsWithGroupsEnabled(AskbotTestCase): 'm_and_c': 'i' } ) - self.group = models.Group.objects.get_or_create(group_name = 'jockeys') + self.group = models.Group.objects.get_or_create(name='jockeys') self.admin.edit_group_membership( group = self.group, user = self.admin, diff --git a/askbot/tests/view_context_tests.py b/askbot/tests/view_context_tests.py new file mode 100644 index 00000000..4c3713d0 --- /dev/null +++ b/askbot/tests/view_context_tests.py @@ -0,0 +1,30 @@ +from django.contrib.auth.models import AnonymousUser +from askbot.tests.utils import AskbotTestCase +from askbot.models import Group +from askbot.views import context + +class ViewContextTests(AskbotTestCase): + def test_get_for_inbox_anonymous(self): + anon = AnonymousUser() + inbox_context = context.get_for_inbox(anon) + self.assertEqual(inbox_context, None) + + def test_get_for_inbox_group_join(self): + mod = self.create_user('mod', status='d') + group = Group(name='grp', openness=Group.MODERATED) + group.save() + mod.join_group(group) + + simple = self.create_user('simple') + simple.join_group(group) + + inbox_context = context.get_for_inbox(mod) + + self.assertEqual(inbox_context['re_count'], 0) + self.assertEqual(inbox_context['flags_count'], 0) + self.assertEqual(inbox_context['group_join_requests_count'], 1) + + inbox_context = context.get_for_inbox(simple) + values = set(inbox_context.values()) + self.assertEqual(values, set([0, 0, 0])) + diff --git a/askbot/views/commands.py b/askbot/views/commands.py index 4bd5a3b7..a49104a0 100644 --- a/askbot/views/commands.py +++ b/askbot/views/commands.py @@ -901,7 +901,7 @@ def edit_group_membership(request): action = form.cleaned_data['action'] #warning: possible race condition if action == 'add': - group_params = {'group_name': group_name, 'user': user} + group_params = {'name': group_name, 'user': user} group = models.Group.objects.get_or_create(**group_params) request.user.edit_group_membership(user, group, 'add') template = get_template('widgets/group_snippet.html') @@ -946,7 +946,7 @@ def add_group(request): group_name = request.POST.get('group') if group_name: group = models.Group.objects.get_or_create( - group_name=group_name, + name=group_name, openness=models.Group.OPEN, user=request.user, ) @@ -1312,4 +1312,30 @@ def share_question_with_user(request): @csrf.csrf_protect def moderate_group_join_request(request): """moderator of the group can accept or reject a new user""" - pass + request_id = IntegerField().clean(request.POST['request_id']) + action = request.POST['action'] + assert(action in ('approve', 'deny')) + + activity = get_object_or_404(models.Activity, pk=request_id) + group = activity.content_object + applicant = activity.user + + if group.has_moderator(request.user): + group_membership = models.GroupMembership.objects.get( + user=applicant, group=group + ) + if action == 'approve': + group_membership.level = models.GroupMembership.FULL + group_membership.save() + msg_data = {'user': applicant.username, 'group': group.name} + message = _('%(user)s, welcome to group %(group)s!') % msg_data + applicant.message_set.create(message=message) + else: + group_membership.delete() + + activity.delete() + url = request.user.get_absolute_url() + '?sort=inbox§ion=join_requests' + return HttpResponseRedirect(url) + else: + raise Http404 + diff --git a/askbot/views/context.py b/askbot/views/context.py index 12b77bd9..eeaf6002 100644 --- a/askbot/views/context.py +++ b/askbot/views/context.py @@ -5,6 +5,7 @@ from django.utils.translation import ugettext as _ from askbot.conf import settings as askbot_settings from askbot import const from askbot.const import message_keys as msg +from askbot.models import GroupMembership def get_for_tag_editor(): #data for the tag editor @@ -20,3 +21,32 @@ def get_for_tag_editor(): } } return {'tag_editor_settings': simplejson.dumps(data)} + +def get_for_inbox(user): + """adds response counts of various types""" + if user.is_anonymous(): + return None + + #get flags count + flag_activity_types = (const.TYPE_ACTIVITY_MARK_OFFENSIVE,) + if askbot_settings.ENABLE_CONTENT_MODERATION: + flag_activity_types += ( + const.TYPE_ACTIVITY_MODERATED_NEW_POST, + const.TYPE_ACTIVITY_MODERATED_POST_EDIT + ) + + #get group_join_requests_count + group_join_requests_count = 0 + if user.is_administrator_or_moderator(): + pending_memberships = GroupMembership.objects.filter( + group__in=user.get_groups(), + level=GroupMembership.PENDING + ) + group_join_requests_count = pending_memberships.count() + + return { + 're_count': user.new_response_count + user.seen_response_count, + 'flags_count': user.get_notifications(flag_activity_types).count(), + 'group_join_requests_count': group_join_requests_count + } + diff --git a/askbot/views/users.py b/askbot/views/users.py index 357ec4f5..5bfece8b 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -33,6 +33,7 @@ from askbot.utils.http import get_request_info from askbot.utils import functions from askbot import forms from askbot import const +from askbot.views import context as view_context from askbot.conf import settings as askbot_settings from askbot import models from askbot import exceptions @@ -672,6 +673,7 @@ def user_recent(request, user, context): return render_into_skin('user_profile/user_recent.html', context, request) #not a view - no direct url route here, called by `user_responses` +@csrf.csrf_protect def show_group_join_requests(request, user, context): """show group join requests to admins who belong to the group""" if request.user.is_administrator_or_moderator() is False: @@ -700,7 +702,7 @@ def show_group_join_requests(request, user, context): 'join_requests': join_requests } context.update(data) - return render_into_skin('user_profile/group_join_requests.html', context, request) + return render_into_skin('user_inbox/group_join_requests.html', context, request) @owner_or_moderator_required @@ -716,6 +718,10 @@ def user_responses(request, user, context): and "flags" - moderation items for mods only """ + #0) temporary, till urls are fixed: update context + # to contain response counts for all sub-sections + context.update(view_context.get_for_inbox(request.user)) + #1) select activity types according to section section = request.GET.get('section', 'forum') if section == 'flags' and not\ @@ -739,10 +745,8 @@ def user_responses(request, user, context): #2) load the activity notifications according to activity types #todo: insert pagination code here - memo_set = models.ActivityAuditStatus.objects.filter( - user = request.user, - activity__activity_type__in = activity_types - ).select_related( + memo_set = request.user.get_notifications(activity_types) + memo_set = memo_set.select_related( 'activity', 'activity__content_type', 'activity__question__thread', @@ -803,7 +807,7 @@ def user_responses(request, user, context): 'responses' : filtered_response_list, } context.update(data) - return render_into_skin('user_profile/user_inbox.html', context, request) + return render_into_skin('user_inbox/responses_and_flags.html', context, request) def user_network(request, user, context): if 'followit' not in django_settings.INSTALLED_APPS: |