summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/models/__init__.py11
-rw-r--r--askbot/models/post.py11
-rw-r--r--askbot/models/user.py20
-rw-r--r--askbot/skins/default/media/style/style.less2
-rw-r--r--askbot/skins/default/templates/500.html5
-rw-r--r--askbot/skins/default/templates/macros.html2
-rw-r--r--askbot/skins/default/templates/user_inbox/base.html63
-rw-r--r--askbot/skins/default/templates/user_inbox/group_join_requests.html50
-rw-r--r--askbot/skins/default/templates/user_inbox/responses_and_flags.html43
-rw-r--r--askbot/skins/default/templates/user_profile/group_join_requests.html108
-rw-r--r--askbot/skins/default/templates/user_profile/user_inbox.html114
-rw-r--r--askbot/tests/__init__.py1
-rw-r--r--askbot/tests/page_load_tests.py2
-rw-r--r--askbot/tests/post_model_tests.py5
-rw-r--r--askbot/tests/thread_model_tests.py2
-rw-r--r--askbot/tests/view_context_tests.py30
-rw-r--r--askbot/views/commands.py32
-rw-r--r--askbot/views/context.py30
-rw-r--r--askbot/views/users.py16
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&section=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&section=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&section=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&section=forum"
- {% if inbox_section == 'forum' %}class="on"{% endif %}
- >
- {% trans %}forum responses ({{re_count}}){% endtrans -%}
- </a> |
- <a href="{{request.user.get_absolute_url()}}?sort=inbox&section=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&section=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&section=forum"
- {% if inbox_section == 'forum' %}class="on"{% endif %}
- >
- {% trans %}forum responses ({{re_count}}){% endtrans -%}
- </a> |
- <a href="{{request.user.get_absolute_url()}}?sort=inbox&section=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&section=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&section=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: