diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-05-21 00:27:10 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-05-21 00:27:10 -0400 |
commit | 4d6b009b68a7ef687406b6288161f1cc09b0262b (patch) | |
tree | 45633bceeeb4e2dc4394d113bfe361554e5e7b56 | |
parent | cbebe08a0cc993693a7a90cbd1ddc82bb89c4194 (diff) | |
download | askbot-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__.py | 35 | ||||
-rw-r--r-- | askbot/models/tag.py | 42 | ||||
-rw-r--r-- | askbot/skins/common/media/js/post.js | 11 | ||||
-rw-r--r-- | askbot/skins/common/media/js/user.js | 22 | ||||
-rw-r--r-- | askbot/skins/common/media/js/utils.js | 4 | ||||
-rw-r--r-- | askbot/skins/default/media/style/style.less | 17 | ||||
-rw-r--r-- | askbot/skins/default/templates/groups.html | 46 | ||||
-rw-r--r-- | askbot/skins/default/templates/macros.html | 54 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/user.html | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/user_stats.html | 17 | ||||
-rw-r--r-- | askbot/skins/default/templates/users.html | 72 | ||||
-rw-r--r-- | askbot/skins/default/templates/widgets/group_info.html | 24 | ||||
-rw-r--r-- | askbot/views/readers.py | 7 | ||||
-rw-r--r-- | askbot/views/users.py | 48 |
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) |