diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-03-20 12:10:13 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-03-20 12:10:13 -0400 |
commit | 0cb6156c843686c4fbbbe1225cfa55c4c488eb89 (patch) | |
tree | d72f57991b600c7b4b42c6282edb35825cb08c3e | |
parent | 0880dd09962294723a167dd924bedb78cc7d3660 (diff) | |
download | askbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.tar.gz askbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.tar.bz2 askbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.zip |
assigning users to groups works
-rw-r--r-- | askbot/models/__init__.py | 2 | ||||
-rw-r--r-- | askbot/models/tag.py | 29 | ||||
-rw-r--r-- | askbot/models/user.py | 4 | ||||
-rw-r--r-- | askbot/skins/common/media/js/user.js | 34 | ||||
-rw-r--r-- | askbot/skins/default/templates/macros.html | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/user.html | 1 | ||||
-rw-r--r-- | askbot/urls.py | 5 | ||||
-rw-r--r-- | askbot/utils/decorators.py | 2 | ||||
-rw-r--r-- | askbot/views/commands.py | 19 | ||||
-rw-r--r-- | askbot/views/users.py | 2 |
10 files changed, 89 insertions, 11 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index 19c1c559..bbda51bc 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -2176,7 +2176,7 @@ def user_update_wildcard_tag_selections( def user_add_user_to_group(self, user = None, group = None): """allows one user to add another to a pre-existing group""" - GroupMembership.objects.get_or_create(user, group) + GroupMembership.objects.get_or_create(user = user, group = group) User.add_to_class( diff --git a/askbot/models/tag.py b/askbot/models/tag.py index 1cfb1573..097c2df9 100644 --- a/askbot/models/tag.py +++ b/askbot/models/tag.py @@ -82,9 +82,23 @@ class TagManager(BaseQuerySetManager): def get_query_set(self): return TagQuerySet(self.model) - def get_or_create_group_tag(self, group_name = None, user = None): +#todo: implement this +#class GroupTagQuerySet(models.query.QuerySet): +# """Custom query set for the group""" +# def __init__(self, model): + +class GroupTagManager(TagManager): + """manager for group tags""" + +# 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""" #todo: here we might fill out the group profile + + #replace spaces with dashes + group_name = re.sub('\s+', '-', group_name.strip()) try: tag = self.get(name = group_name) except self.model.DoesNotExist: @@ -92,6 +106,18 @@ class TagManager(BaseQuerySetManager): tag.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 + ) + class Tag(models.Model): name = models.CharField(max_length=255, unique=True) created_by = models.ForeignKey(User, related_name='created_tags') @@ -109,6 +135,7 @@ class Tag(models.Model): ) objects = TagManager() + group_tags = GroupTagManager() class Meta: app_label = 'askbot' diff --git a/askbot/models/user.py b/askbot/models/user.py index c9a4e1e5..20861a2a 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -341,8 +341,8 @@ class GroupMembership(models.Model): that by being recorded with this relation automatically become group tags """ - group = models.ForeignKey(Tag) - user = models.ForeignKey(User) + group = models.ForeignKey(Tag, related_name = 'user_memberships') + user = models.ForeignKey(User, related_name = 'group_memberships') class Meta: app_label = 'askbot' diff --git a/askbot/skins/common/media/js/user.js b/askbot/skins/common/media/js/user.js index 8a8a7f50..aed926d1 100644 --- a/askbot/skins/common/media/js/user.js +++ b/askbot/skins/common/media/js/user.js @@ -26,7 +26,7 @@ $(document).ready(function(){ data: JSON.stringify({memo_list: id_list, action_type: action_type}), url: askbot['urls']['manageInbox'], success: function(response_data){ - if (response_data['success'] === true){ + if (response_data['success'] == true){ if (action_type == 'delete' || action_type == 'remove_flag' || action_type == 'close' || action_type == 'delete_post'){ elements.remove(); } @@ -220,6 +220,9 @@ FollowUser.prototype.toggleState = function(){ } }; +/** + * @constructor + */ GroupsContainer = function(){ WrappedElement.call(this); }; @@ -227,9 +230,22 @@ inherits(GroupsContainer, WrappedElement); GroupsContainer.prototype.decorate = function(element){ this._element = element; + var groups = {}; + //collect list of groups + $.each(element.find('li'), function(idx, li){ + groups[$(li).html()] = 1; + //var str = $(li).html(); + //var bytes = []; + //for (var i = 0; i<str.length; i++){ + //} + }); + this._groups = groups; }; GroupsContainer.prototype.addGroup = function(group_name){ + if (group_name in this._groups){ + return; + } var group = this.makeElement('li'); group.html(group_name); this._element.append(group); @@ -248,10 +264,12 @@ GroupAdderWidget.prototype.setState = function(state){ if (state === 'display'){ this._element.html(gettext('add group')); this._input.hide(); + this._input.val(''); this._button.hide(); } else if (state === 'edit'){ this._element.html(gettext('cancel')); this._input.show(); + this._input.focus(); this._button.show(); } else { return; @@ -282,7 +300,7 @@ GroupAdderWidget.prototype.getAddGroupHandler = function(){ cache: false, url: askbot['urls']['add_user_to_group'], success: function(data){ - if (data['success'] === true){ + if (data['success'] == true){ me.addGroup(group_name); me.setState('display'); } else { @@ -310,6 +328,18 @@ GroupAdderWidget.prototype.decorate = function(element){ this._element = element; var input = this.makeElement('input'); this._input = input; + + var groupsAc = new AutoCompleter({ + url: askbot['urls']['get_groups_list'], + preloadData: true, + minChars: 1, + useCache: true, + matchInside: false, + maxCacheLength: 100, + delay: 10 + }); + groupsAc.decorate(input); + var button = this.makeElement('button'); button.html(gettext('add')); this._button = button; diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index 71db477f..40293ac5 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -175,7 +175,7 @@ poor design of the data or methods on data objects #} {%- endmacro -%} {%- macro user_group(group) -%} - {{ group.name }} + {{ group.name|replace('-', ' ') }} {%- 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 a6fe614a..f204d338 100644 --- a/askbot/skins/default/templates/user_profile/user.html +++ b/askbot/skins/default/templates/user_profile/user.html @@ -24,6 +24,7 @@ askbot['data']['viewUserName'] = '{{ view_user.username }}'; askbot['data']['viewUserId'] = {{view_user.id}}; askbot['urls']['add_user_to_group'] = '{% url add_user_to_group %}'; + askbot['urls']['get_groups_list'] = '{% url get_groups_list %}'; </script> {% if request.user|can_moderate_user(view_user) %} <script type='text/javascript' src='{{"/js/jquery.form.js"|media}}'></script> diff --git a/askbot/urls.py b/askbot/urls.py index 4cf00313..1cc51be3 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -193,6 +193,11 @@ urlpatterns = patterns('', name = 'get_tag_list' ), url( + r'^get-groups-list/', + views.commands.get_groups_list, + name = 'get_groups_list' + ), + url( r'^swap-question-with-answer/', views.commands.swap_question_with_answer, name = 'swap_question_with_answer' diff --git a/askbot/utils/decorators.py b/askbot/utils/decorators.py index 29e92645..c20b92e2 100644 --- a/askbot/utils/decorators.py +++ b/askbot/utils/decorators.py @@ -84,6 +84,8 @@ def ajax_only(view_func): raise Http404 try: data = view_func(request, *args, **kwargs) + if data is None: + data = {} except Exception, e: message = unicode(e) if message == '': diff --git a/askbot/views/commands.py b/askbot/views/commands.py index c534d87a..2a7f9a0a 100644 --- a/askbot/views/commands.py +++ b/askbot/views/commands.py @@ -436,7 +436,20 @@ def get_tag_list(request): 'name', flat = True ) output = '\n'.join(tag_names) - return HttpResponse(output, mimetype = "text/plain") + return HttpResponse(output, mimetype = 'text/plain') + +@decorators.get_only +def get_groups_list(request): + """returns names of group tags + for the autocomplete function""" + group_names = models.Tag.group_tags.get_all().filter( + deleted = False + ).values_list( + 'name', flat = True + ) + group_names = map(lambda v: v.replace('-', ' '), group_names) + output = '\n'.join(group_names) + return HttpResponse(output, mimetype = 'text/plain') @csrf.csrf_protect def subscribe_for_tags(request): @@ -656,8 +669,6 @@ def add_user_to_group(request): if form.is_valid(): group_name = form.cleaned_data['group_name'] user_id = form.cleaned_data['user_id'] - - group = models.Tag.get_or_create_group_tag(group_name) try: user = models.User.objects.get(id = user_id) except models.User.DoesNotExist: @@ -665,6 +676,8 @@ def add_user_to_group(request): 'user with id %d not found' % user_id ) + group_params = {'group_name': group_name, 'user': user} + group = models.Tag.group_tags.get_or_create(**group_params) request.user.add_user_to_group(user, group) else: raise exceptions.PermissionDenied() diff --git a/askbot/views/users.py b/askbot/views/users.py index c625aeab..9858b872 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -394,7 +394,7 @@ 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), 'badges': badges, 'total_badges' : len(badges), } |