summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-05-21 00:27:10 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-05-21 00:27:10 -0400
commit4d6b009b68a7ef687406b6288161f1cc09b0262b (patch)
tree45633bceeeb4e2dc4394d113bfe361554e5e7b56
parentcbebe08a0cc993693a7a90cbd1ddc82bb89c4194 (diff)
downloadaskbot-4d6b009b68a7ef687406b6288161f1cc09b0262b.tar.gz
askbot-4d6b009b68a7ef687406b6288161f1cc09b0262b.tar.bz2
askbot-4d6b009b68a7ef687406b6288161f1cc09b0262b.zip
reformatted groups list everywhere, added "my groups" and "all groups" sections on the groups page, also users are now able to join and leave groups on the groups page
-rw-r--r--askbot/models/__init__.py35
-rw-r--r--askbot/models/tag.py42
-rw-r--r--askbot/skins/common/media/js/post.js11
-rw-r--r--askbot/skins/common/media/js/user.js22
-rw-r--r--askbot/skins/common/media/js/utils.js4
-rw-r--r--askbot/skins/default/media/style/style.less17
-rw-r--r--askbot/skins/default/templates/groups.html46
-rw-r--r--askbot/skins/default/templates/macros.html54
-rw-r--r--askbot/skins/default/templates/user_profile/user.html2
-rw-r--r--askbot/skins/default/templates/user_profile/user_stats.html17
-rw-r--r--askbot/skins/default/templates/users.html72
-rw-r--r--askbot/skins/default/templates/widgets/group_info.html24
-rw-r--r--askbot/views/readers.py7
-rw-r--r--askbot/views/users.py48
14 files changed, 260 insertions, 141 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index 5e41a07a..a0b41dba 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -1,9 +1,10 @@
from askbot import startup_procedures
startup_procedures.run()
-import logging
-import hashlib
+import collections
import datetime
+import hashlib
+import logging
import urllib
from django.core.urlresolvers import reverse, NoReverseMatch
from django.db.models import signals as django_signals
@@ -2015,6 +2016,35 @@ def get_profile_link(self):
return mark_safe(profile_link)
+def user_get_groups_membership_info(self, groups):
+ """returts a defaultdict with values that are
+ dictionaries with the following keys and values:
+ * key: can_join, value: True if user can join group
+ * key: is_member, value: True if user is member of group
+
+ ``groups`` is a group tag query set
+ """
+ groups = groups.select_related('group_profile')
+
+ group_ids = groups.values_list('id', flat = True)
+ memberships = GroupMembership.objects.filter(
+ user__id = self.id,
+ group__id__in = group_ids
+ )
+
+ info = collections.defaultdict(
+ lambda: {'can_join': False, 'is_member': False}
+ )
+ for membership in memberships:
+ info[membership.group_id]['is_member'] = True
+
+ for group in groups:
+ info[group.id]['can_join'] = group.group_profile.can_accept_user(self)
+
+ return info
+
+
+
def user_get_karma_summary(self):
"""returns human readable sentence about
status of user's karma"""
@@ -2396,6 +2426,7 @@ User.add_to_class('get_absolute_url', user_get_absolute_url)
User.add_to_class('get_avatar_url', user_get_avatar_url)
User.add_to_class('get_default_avatar_url', user_get_default_avatar_url)
User.add_to_class('get_gravatar_url', user_get_gravatar_url)
+User.add_to_class('get_groups_membership_info', user_get_groups_membership_info)
User.add_to_class('get_anonymous_name', user_get_anonymous_name)
User.add_to_class('update_avatar_type', user_update_avatar_type)
User.add_to_class('post_question', user_post_question)
diff --git a/askbot/models/tag.py b/askbot/models/tag.py
index 779c0b68..5a83c67c 100644
--- a/askbot/models/tag.py
+++ b/askbot/models/tag.py
@@ -82,21 +82,34 @@ class TagManager(BaseQuerySetManager):
def get_query_set(self):
return TagQuerySet(self.model)
-#todo: implement this
-#class GroupTagQuerySet(models.query.QuerySet):
-# """Custom query set for the group"""
-# def __init__(self, model):
+class GroupTagQuerySet(TagQuerySet):
+ """Custom query set for the group"""
+
+ def get_for_user(self, user = None):
+ return self.filter(user_memberships__user = user)
+
+ def get_all(self):
+ return self.annotate(
+ member_count = models.Count('user_memberships')
+ ).filter(
+ member_count__gt = 0
+ )
+
+ def get_by_name(self, group_name = None):
+ return self.get(name = clean_group_name(group_name))
+
+
def clean_group_name(name):
"""group names allow spaces,
tag names do not, so we use this method
to replace spaces with dashes"""
return re.sub('\s+', '-', name.strip())
-class GroupTagManager(TagManager):
+class GroupTagManager(BaseQuerySetManager):
"""manager for group tags"""
-# def get_query_set(self):
-# return GroupTagQuerySet(self.model)
+ def get_query_set(self):
+ return GroupTagQuerySet(self.model)
def get_or_create(self, group_name = None, user = None):
"""creates a group tag or finds one, if exists"""
@@ -114,21 +127,6 @@ class GroupTagManager(TagManager):
group_profile.save()
return tag
- #todo: maybe move this to query set
- def get_for_user(self, user = None):
- return self.filter(user_memberships__user = user)
-
- #todo: remove this when the custom query set is done
- def get_all(self):
- return self.annotate(
- member_count = models.Count('user_memberships')
- ).filter(
- member_count__gt = 0
- )
-
- def get_by_name(self, group_name = None):
- return self.get(name = clean_group_name(group_name))
-
class Tag(models.Model):
name = models.CharField(max_length=255, unique=True)
created_by = models.ForeignKey(User, related_name='created_tags')
diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js
index 294c5f41..7df01c83 100644
--- a/askbot/skins/common/media/js/post.js
+++ b/askbot/skins/common/media/js/post.js
@@ -2354,9 +2354,8 @@ UserGroupProfileEditor.prototype.decorate = function(element){
logo_changer.decorate(change_logo_btn);
};
-var GroupJoinButton = function(group_id){
+var GroupJoinButton = function(){
TwoStateToggle.call(this);
- this._group_id = group_id;
};
inherits(GroupJoinButton, TwoStateToggle);
@@ -2375,7 +2374,8 @@ GroupJoinButton.prototype.getHandler = function(){
url: askbot['urls']['join_or_leave_group'],
success: function(data){
if (data['success']){
- me.setOn(data['is_member']);
+ var new_state = data['is_member'] ? 'on-state':'off-state';
+ me.setState(new_state);
} else {
showMessage(me.getElement(), data['message']);
}
@@ -2384,6 +2384,11 @@ GroupJoinButton.prototype.getHandler = function(){
};
};
+GroupJoinButton.prototype.decorate = function(elem) {
+ GroupJoinButton.superClass_.decorate.call(this, elem);
+ this._group_id = this._element.data('groupId');
+};
+
$(document).ready(function() {
$('[id^="comments-for-"]').each(function(index, element){
var comments = new PostCommentsWidget();
diff --git a/askbot/skins/common/media/js/user.js b/askbot/skins/common/media/js/user.js
index b7dc0951..ad0b8365 100644
--- a/askbot/skins/common/media/js/user.js
+++ b/askbot/skins/common/media/js/user.js
@@ -644,13 +644,13 @@ UserGroup.prototype.decorate = function(element){
this._name = $.trim(element.find('a').html());
var deleter = new DeleteIcon();
deleter.setHandler(this.getDeleteHandler());
- deleter.setContent('x');
- this._element.find('.group-name').append(deleter.getElement());
+ deleter.setContent(gettext('Remove'));
+ this._element.find('td:last').append(deleter.getElement());
this._delete_icon = deleter;
};
UserGroup.prototype.createDom = function(){
- var element = this.makeElement('li');
+ var element = this.makeElement('tr');
element.html(this._content);
this._element = element;
this.decorate(element);
@@ -675,7 +675,7 @@ GroupsContainer.prototype.decorate = function(element){
var group_names = [];
var me = this;
//collect list of groups
- $.each(element.find('li'), function(idx, li){
+ $.each(element.find('tr'), function(idx, li){
var group = new UserGroup();
group.setGroupsContainer(me);
group.decorate($(li));
@@ -829,21 +829,25 @@ UserGroupsEditor.prototype.decorate = function(element){
adder.decorate(add_link);
var groups_container = new GroupsContainer();
- groups_container.decorate(element.find('ul'));
+ groups_container.decorate(element.find('#groups-list'));
adder.setGroupsContainer(groups_container);
//todo - add group deleters
};
(function(){
- var fbtn = $('.follow-toggle');
+ var fbtn = $('.follow-user-toggle');
if (fbtn.length === 1){
var follow_user = new FollowUser();
follow_user.decorate(fbtn);
follow_user.setUserName(askbot['data']['viewUserName']);
}
- if (askbot['data']['userIsAdminOrMod']){
- var group_editor = new UserGroupsEditor();
- group_editor.decorate($('#user-groups'));
+ if (askbot['data']['userId'] !== askbot['data']['viewUserId']) {
+ if (askbot['data']['userIsAdminOrMod']){
+ var group_editor = new UserGroupsEditor();
+ group_editor.decorate($('#user-groups'));
+ } else {
+ $('#add-group').remove();
+ }
} else {
$('#add-group').remove();
}
diff --git a/askbot/skins/common/media/js/utils.js b/askbot/skins/common/media/js/utils.js
index 297e3f9a..8c2a478e 100644
--- a/askbot/skins/common/media/js/utils.js
+++ b/askbot/skins/common/media/js/utils.js
@@ -786,9 +786,7 @@ TwoStateToggle.prototype.decorate = function(element){
this.toggleUrl = element.attr('data-toggle-url');
//detect state and save it
- if (
- element.attr('nodeName') === 'INPUT' && element.attr('type', 'checkbox')
- ) {
+ if (this.isCheckBox()) {
this._state = element.attr('checked') ? 'state-on' : 'state-off';
} else {
var text = $.trim(element.html());
diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less
index c3423418..f015ae0c 100644
--- a/askbot/skins/default/media/style/style.less
+++ b/askbot/skins/default/media/style/style.less
@@ -1216,7 +1216,9 @@ ul#related-tags li {
color: #1A1A1A;
}
-.users-page h1, .tags-page h1 {
+.users-page h1,
+.tags-page h1,
+.groups-page h1 {
float: left;
}
@@ -3425,19 +3427,14 @@ img.group-logo {
#groups-list {
margin-left: 0px;
- li {
- display: inline;
- list-style-type: none;
- list-style-position: inside;
- float: left;
- text-align: center;
+ .group-name {
+ padding-right: 20px;
}
- .group-logo, .group-name {
- display: block;
+ td {
+ padding-bottom: 5px;
}
}
-
#reject-edit-modal {
input, textarea {
width: 514px;
diff --git a/askbot/skins/default/templates/groups.html b/askbot/skins/default/templates/groups.html
index eda0c3ff..2499ac9f 100644
--- a/askbot/skins/default/templates/groups.html
+++ b/askbot/skins/default/templates/groups.html
@@ -1,18 +1,48 @@
{% import "macros.html" as macros %}
-{% extends 'one_column_body.html' %}
+{% extends 'two_column_body.html' %}
{% block title %}{% trans %}Groups{% endtrans %}{% endblock %}
{% block content %}
- <h1 class="section-title">{% trans %}Groups{% endtrans %}</h1>
- {% if can_edit %}
+ <div id="content-header">
+ <h1 class="section-title">{% trans %}Groups{% endtrans %}</h1>
+ {% if request.user.is_authenticated() %}
+ <div class="tabBar">
+ <div class="tabsC">
+ <a id="all-groups" class="first{% if tab_name=="all-groups" %} on{% endif %}"
+ title="{% trans %}All groups{% endtrans %}"
+ href="{% url groups %}?sort=all-groups"
+ ><span>{% trans %}all groups{% endtrans %}</span></a>
+ <a id="my-groups" {% if tab_name=="my-groups" %}class="on"{% endif %}
+ title="{% trans %}My groups{% endtrans %}"
+ href="{% url groups %}?sort=my-groups"
+ ><span>{% trans %}my groups{% endtrans %}</span></a>
+ </div>
+ </div>
+ {% endif %}
+ <div class="clearfix"></div>
+ </div>
+ {% if user_can_add_groups %}
<p id="group-add-tip">
{% trans %}Tip: to create a new group - please go to some user profile and add the new group there. That user will be the first member of the group{% endtrans %}
</p>
{% endif %}
- <ul id="groups-list">
+ <table id="groups-list">
{% for group in groups %}
- <li>
- {{ macros.user_group(group) }}
- </li>
+ <tr>
+ {{ macros.user_group(group, groups_membership_info[group.id]) }}
+ </tr>
{% endfor %}
- </ul>
+ </table>
+{% endblock %}
+{% block endjs %}
+ <script type='text/javascript' src='{{"/js/jquery.validate.min.js"|media}}'></script>
+ <script src='{{"/js/post.js"|media}}' type='text/javascript'></script>
+ {% if request.user.is_authenticated() %}
+ <script type="text/javascript">
+ askbot['urls']['join_or_leave_group'] = '{% url join_or_leave_group %}';
+ $.each($('.group-join-btn'), function(idx, elem){
+ var group_join_btn = new GroupJoinButton();
+ group_join_btn.decorate($(elem));
+ });
+ </script>
+ {% endif %}
{% endblock %}
diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html
index 4bae1e45..6ba15373 100644
--- a/askbot/skins/default/templates/macros.html
+++ b/askbot/skins/default/templates/macros.html
@@ -9,7 +9,7 @@
{%- macro follow_toggle(follow, name, alias, id) -%}
{# follow - boolean; name - object type name; alias - e.g. users name; id - object id #}
<div
- class="follow-toggle"
+ class="follow-toggle follow-user-toggle"
id="follow-{{ name }}-{{ id }}"
>
{% if follow %}
@@ -221,22 +221,50 @@ poor design of the data or methods on data objects #}
</ul>
{%- endmacro -%}
-{%- macro user_group(group) -%}
- {% if group.group_profile.logo_url %}
- <a href="{% url users_by_group group.id, group.name|replace('-', ' ')|slugify %}">
- <img class="group-logo" src="{{group.group_profile.logo_url}}" alt='{% trans name=group.name|escape %}logo for user group "{{name}}"{% endtrans %}' />
- </a>
- {% endif %}
- <div class="group-name">
- <a
+{%- macro user_group(group, membership_info) -%}
+ <td>
+ <a class="group-name"
href="{% url users_by_group group.id, group.name|replace('-', ' ')|slugify %}"
>{{ group.name|escape }}</a>
- </div>
- <!--div id="group-{{group.id}}-description">
+ </td>
+ <td>
+ <span class="group-description">
{% if group.tag_wiki %}
- {{ group.tag_wiki.html }}
+ {{ group.tag_wiki.summary }}
+ {% endif %}
+ </span>
+ </td>
+ <td>
+ {% if membership_info %}
+ {{ group_join_button(
+ group_id = group.id,
+ can_join = membership_info['can_join'],
+ is_member = membership_info['is_member']
+ )
+ }}
+ {% endif %}
+ </td>
+{%- endmacro -%}
+
+{%- macro group_join_button(group_id = None, can_join = False, is_member = False) -%}
+ {% if can_join or is_member %}
+ <button
+ class="group-join-btn follow-toggle {% if is_member %}on on-state{% endif %}"
+ data-group-id="{{group_id}}"
+ data-off-prompt-text="{% trans %}Leave this group{% endtrans %}"
+ data-on-prompt-text="{% trans %}Join this group{% endtrans %}"
+ data-on-state-text="{% trans %}You are a member{% endtrans %}"
+ data-off-state-text="{% trans %}Join this group{% endtrans %}"
+ >
+ {% if is_member %}
+ {% trans %}You are a member{% endtrans %}
+ {% else %}
+ {% if can_join %}
+ {% trans %}Join this group{% endtrans %}
+ {% endif %}
+ {% endif %}
+ </button>
{% endif %}
- </div-->
{%- endmacro -%}
{# todo: remove the extra content argument to make its usage more explicit #}
diff --git a/askbot/skins/default/templates/user_profile/user.html b/askbot/skins/default/templates/user_profile/user.html
index 15e0622a..bb293b9b 100644
--- a/askbot/skins/default/templates/user_profile/user.html
+++ b/askbot/skins/default/templates/user_profile/user.html
@@ -30,6 +30,8 @@
<script type='text/javascript' src='{{"/js/jquery.form.js"|media}}'></script>
{% endif %}
<script type="text/javascript" src='{{"/js/user.js"|media}}'></script>
+ <script type='text/javascript' src='{{"/js/jquery.validate.min.js"|media}}'></script>
+ <script type="text/javascript" src='{{"/js/post.js"|media}}'></script>
{% block userjs %}
{% endblock %}
{% endblock %}
diff --git a/askbot/skins/default/templates/user_profile/user_stats.html b/askbot/skins/default/templates/user_profile/user_stats.html
index 43b7f4fa..b125589c 100644
--- a/askbot/skins/default/templates/user_profile/user_stats.html
+++ b/askbot/skins/default/templates/user_profile/user_stats.html
@@ -12,15 +12,13 @@
username = view_user.username
%}{{username}}'s groups{% endtrans %}
</h2>
- <ul id="groups-list">
- {% if user_groups %}
+ <table id="groups-list">
{% for group in user_groups %}
- <li>
- {{ macros.user_group(group) }}
- </li>
+ <tr>
+ {{ macros.user_group(group, groups_membership_info[group.id]) }}
+ </tr>
{% endfor %}
- {% endif %}
- </ul>
+ </table>
<div class="clearfix"></div>
<a id="add-group">{% trans %}add group{% endtrans %}</a>
</div>
@@ -156,8 +154,13 @@
{% block endjs %}
{{ super() }}
<script type="text/javascript">
+ askbot['urls']['join_or_leave_group'] = '{% url join_or_leave_group %}';
$(document).ready(function(){
setup_badge_details_toggle();
+ $.each($('.group-join-btn'), function(idx, elem){
+ var group_join_btn = new GroupJoinButton();
+ group_join_btn.decorate($(elem));
+ });
});
</script>
{% endblock %}
diff --git a/askbot/skins/default/templates/users.html b/askbot/skins/default/templates/users.html
index 3fa35643..b926b428 100644
--- a/askbot/skins/default/templates/users.html
+++ b/askbot/skins/default/templates/users.html
@@ -95,45 +95,45 @@
{% else %}
var codeFriendlyMarkdown = false;
{% endif %}
- $().ready(function(){
- {% if group and request.user.is_authenticated() %}
- var group_join_btn = new GroupJoinButton({{ group.id }});
+ {% if group and request.user.is_authenticated() %}
+ $().ready(function(){
+ var group_join_btn = new GroupJoinButton();
group_join_btn.decorate($('.group-join-btn'));
- {% endif %}
- //setup WMD editor
- if (askbot['data']['userIsAdminOrMod'] === true){
- //todo: this is kind of Attacklab.init ... should not be here
- Attacklab.wmd = function(){
- Attacklab.loadEnv = function(){
- var mergeEnv = function(env){
- if(!env){
- return;
- }
-
- for(var key in env){
- Attacklab.wmd_env[key] = env[key];
- }
+ //setup WMD editor
+ if (askbot['data']['userIsAdminOrMod'] === true){
+ //todo: this is kind of Attacklab.init ... should not be here
+ Attacklab.wmd = function(){
+ Attacklab.loadEnv = function(){
+ var mergeEnv = function(env){
+ if(!env){
+ return;
+ }
+
+ for(var key in env){
+ Attacklab.wmd_env[key] = env[key];
+ }
+ };
+
+ mergeEnv(Attacklab.wmd_defaults);
+ mergeEnv(Attacklab.account_options);
+ mergeEnv(top["wmd_options"]);
+ Attacklab.full = true;
+
+ var defaultButtons = "bold italic link blockquote code image ol ul heading hr";
+ Attacklab.wmd_env.buttons = Attacklab.wmd_env.buttons || defaultButtons;
};
-
- mergeEnv(Attacklab.wmd_defaults);
- mergeEnv(Attacklab.account_options);
- mergeEnv(top["wmd_options"]);
- Attacklab.full = true;
-
- var defaultButtons = "bold italic link blockquote code image ol ul heading hr";
- Attacklab.wmd_env.buttons = Attacklab.wmd_env.buttons || defaultButtons;
+ Attacklab.loadEnv();
};
- Attacklab.loadEnv();
- };
- Attacklab.wmd();
- Attacklab.wmdBase();
- var group_editor = new UserGroupProfileEditor();
- group_editor.decorate($('#group-wiki-{{group.id}}'));
- }
- Hilite.exact = false;
- Hilite.elementid = "main-body";
- Hilite.debug_referrer = location.href;
- });
+ Attacklab.wmd();
+ Attacklab.wmdBase();
+ var group_editor = new UserGroupProfileEditor();
+ group_editor.decorate($('#group-wiki-{{group.id}}'));
+ }
+ Hilite.exact = false;
+ Hilite.elementid = "main-body";
+ Hilite.debug_referrer = location.href;
+ });
+ {% endif %}
</script>
{% endblock %}
<!-- end users.html -->
diff --git a/askbot/skins/default/templates/widgets/group_info.html b/askbot/skins/default/templates/widgets/group_info.html
index 601930af..5d3a4c7f 100644
--- a/askbot/skins/default/templates/widgets/group_info.html
+++ b/askbot/skins/default/templates/widgets/group_info.html
@@ -1,3 +1,4 @@
+{% import "macros.html" as macros %}
<div id="group-wiki-{{group.id}}" class="box group-wiki">
<h2>{% trans %}Group info{% endtrans %}</h2>
<img class="group-logo"
@@ -13,23 +14,12 @@
{% endif %}
</div>
<div class="clearfix"></div>
- {% if user_can_join_group or user_is_group_member %}
- <button
- class="group-join-btn follow-toggle {% if user_is_group_member %}on on-state{% endif %}"
- data-off-prompt-text="{% trans %}Leave this group{% endtrans %}"
- data-on-prompt-text="{% trans %}Join this group{% endtrans %}"
- data-on-state-text="{% trans %}You are a member{% endtrans %}"
- data-off-state-text="{% trans %}Join this group{% endtrans %}"
- >
- {% if user_is_group_member %}
- {% trans %}You are a member{% endtrans %}
- {% else %}
- {% if user_can_join_group %}
- {% trans %}Join this group{% endtrans %}
- {% endif %}
- {% endif %}
- </button>
- {% endif %}
+ {{ macros.group_join_button(
+ group_id = group.id,
+ can_join = user_can_join_group,
+ is_member = user_is_group_member
+ )
+ }}
{% if request.user.is_authenticated() and request.user.is_administrator() %}
<div class="controls">
<a class="edit-description"
diff --git a/askbot/views/readers.py b/askbot/views/readers.py
index 3259cddd..97cf04df 100644
--- a/askbot/views/readers.py
+++ b/askbot/views/readers.py
@@ -68,6 +68,7 @@ def questions(request, **kwargs):
List of Questions, Tagged questions, and Unanswered questions.
matching search query or user selection
"""
+ #before = datetime.datetime.now()
if request.method != 'GET':
return HttpResponseNotAllowed(['GET'])
@@ -311,7 +312,7 @@ def question(request, id):#refactor - long subroutine. display question body, an
"""
#process url parameters
#todo: fix inheritance of sort method from questions
- before = datetime.datetime.now()
+ #before = datetime.datetime.now()
default_sort_method = request.session.get('questions_sort_method', 'votes')
form = ShowQuestionForm(request.GET, default_sort_method)
form.full_clean()#always valid
@@ -551,9 +552,7 @@ def question(request, id):#refactor - long subroutine. display question body, an
'show_comment_position': show_comment_position,
}
- result = render_into_skin('question.html', data, request)
- #print datetime.datetime.now() - before
- return result
+ print render_into_skin('question.html', data, request)
def revisions(request, id, post_type = None):
assert post_type in ('question', 'answer')
diff --git a/askbot/views/users.py b/askbot/views/users.py
index ef0aea57..6c1743ca 100644
--- a/askbot/views/users.py
+++ b/askbot/views/users.py
@@ -13,7 +13,7 @@ import datetime
import logging
import operator
-from django.db.models import Count, Q
+from django.db.models import Count
from django.conf import settings as django_settings
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, InvalidPage
@@ -422,6 +422,13 @@ def user_stats(request, user, context):
badges = badges_dict.items()
badges.sort(key=operator.itemgetter(1), reverse=True)
+ user_groups = models.Tag.group_tags.get_for_user(user = user)
+
+ if request.user == user:
+ groups_membership_info = user.get_groups_membership_info(user_groups)
+ else:
+ groups_membership_info = collections.defaultdict()
+
data = {
'active_tab':'users',
'page_class': 'user-profile-page',
@@ -443,7 +450,8 @@ def user_stats(request, user, context):
'votes_total_per_day': votes_total,
'user_tags' : user_tags,
- 'user_groups': models.Tag.group_tags.get_for_user(user = user),
+ 'user_groups': user_groups,
+ 'groups_membership_info': groups_membership_info,
'badges': badges,
'total_badges' : len(badges),
}
@@ -689,7 +697,7 @@ def user_responses(request, user, context):
#6) sort responses by time
filtered_response_list.sort(lambda x,y: cmp(y['timestamp'], x['timestamp']))
- reject_reasons = models.PostFlagReason.objects.all().order_by('title');
+ reject_reasons = models.PostFlagReason.objects.all().order_by('title')
data = {
'active_tab':'users',
'page_class': 'user-profile-page',
@@ -915,12 +923,38 @@ def groups(request, id = None, slug = None):
"""
if askbot_settings.GROUPS_ENABLED == False:
raise Http404
- groups = models.Tag.group_tags.get_all()
- can_edit = request.user.is_authenticated() and \
+
+ #6 lines of input cleaning code
+ if request.user.is_authenticated():
+ scope = request.GET.get('sort', 'all-groups')
+ if scope not in ('all-groups', 'my-groups'):
+ scope = 'all-groups'
+ else:
+ scope = 'all-groups'
+
+ if scope == 'all-groups':
+ groups = models.Tag.group_tags.get_all()
+ else:
+ groups = models.Tag.group_tags.get_for_user(
+ user = request.user
+ )
+
+ groups = groups.select_related('group_profile')
+
+ user_can_add_groups = request.user.is_authenticated() and \
request.user.is_administrator_or_moderator()
+
+ groups_membership_info = collections.defaultdict()
+ if request.user.is_authenticated():
+ #collect group memberhship information
+ groups_membership_info = request.user.get_groups_membership_info(groups)
+
data = {
'groups': groups,
- 'can_edit': can_edit,
- 'active_tab': 'users'
+ 'groups_membership_info': groups_membership_info,
+ 'user_can_add_groups': user_can_add_groups,
+ 'active_tab': 'groups',#todo vars active_tab and tab_name are too similar
+ 'tab_name': scope,
+ 'page_class': 'groups-page'
}
return render_into_skin('groups.html', data, request)