summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-03-20 12:10:13 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-03-20 12:10:13 -0400
commit0cb6156c843686c4fbbbe1225cfa55c4c488eb89 (patch)
treed72f57991b600c7b4b42c6282edb35825cb08c3e
parent0880dd09962294723a167dd924bedb78cc7d3660 (diff)
downloadaskbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.tar.gz
askbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.tar.bz2
askbot-0cb6156c843686c4fbbbe1225cfa55c4c488eb89.zip
assigning users to groups works
-rw-r--r--askbot/models/__init__.py2
-rw-r--r--askbot/models/tag.py29
-rw-r--r--askbot/models/user.py4
-rw-r--r--askbot/skins/common/media/js/user.js34
-rw-r--r--askbot/skins/default/templates/macros.html2
-rw-r--r--askbot/skins/default/templates/user_profile/user.html1
-rw-r--r--askbot/urls.py5
-rw-r--r--askbot/utils/decorators.py2
-rw-r--r--askbot/views/commands.py19
-rw-r--r--askbot/views/users.py2
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),
}