add tag filter to text share page
authorraph
Thu, 10 Dec 2009 15:07:25 +0100
changeset 42 82f6e2879e0a
parent 41 7d258f14cd7b
child 43 c13c0e78b0ca
add tag filter to text share page
src/cm/templates/site/text_share.html
src/cm/views/texts.py
src/cm/views/user.py
--- a/src/cm/templates/site/text_share.html	Thu Dec 10 14:34:50 2009 +0100
+++ b/src/cm/templates/site/text_share.html	Thu Dec 10 15:07:25 2009 +0100
@@ -23,8 +23,6 @@
 
 <div id="text_share" class="tab-meta">
 
-<form id="text_share_form" action="." method="post">
-
 <ul class="sub_list">
     <li class="active_sub">{% blocktrans %}Users' list{% endblocktrans %}</li>
     <li> / </li>
@@ -33,6 +31,38 @@
     <li><a href="{% url user-mass-add-text text.key %}">{% blocktrans %}Add users in bulk{% endblocktrans %}</a></li>
 </ul>
 
+<form id="filter_form" action="." method="get">
+<table summary="{% blocktrans %}People' list{% endblocktrans %}" class="large_table">
+	<tr>
+		<td>
+		{% if display_suspended_users %}<a href="?{% newparams 'display' '0' %}" title="{% blocktrans %}Hide suspended users{% endblocktrans %}">{% blocktrans %}Hide suspended users{% endblocktrans %}</a>{% else %}<a href="?{% newparams 'display' '1' %}" title="{% blocktrans %}Display suspended users{% endblocktrans %}">{% blocktrans %}Display suspended users{% endblocktrans %}</a>{% endif %}
+		&#183;
+		{% blocktrans %}Filter by tag:{% endblocktrans %} 
+		<select id="tag_selected" name="tag_selected">
+		<option {% if not tag_selected %}selected="selected"{% endif %} value="0">- {% blocktrans %}All{% endblocktrans %} -</option>
+		
+		{% for tag in tag_list %}
+		<option  {% ifequal tag_selected tag.name %}selected="selected"{% endifequal %} value="{{ tag.name }}">{{ tag.name }}</option>
+		{% endfor %}
+		</select>
+		</td>
+		
+	</tr>
+</table>
+</form>
+
+<form id="text_share_form" action="." method="post">
+
+<script type="text/javascript">
+<!--
+$(function() {
+    $("#tag_selected").change(function () {
+    	$("#filter_form").submit();
+      });
+}) ;
+-->
+</script>
+
 {% include "site/macros/paginator.html" %}
 
 <div style="clear:both;"></div>
--- a/src/cm/views/texts.py	Thu Dec 10 14:34:50 2009 +0100
+++ b/src/cm/views/texts.py	Thu Dec 10 15:07:25 2009 +0100
@@ -803,6 +803,9 @@
 
 @has_perm_on_text('can_manage_text')
 def text_share(request, key):
+    display_suspended_users = get_int(request.GET, 'display', 0)
+    tag_selected = request.GET.get('tag_selected', 0)
+    
     text = get_text_by_keys_or_404(key)
     order_by = get_among(request.GET,'order',('user__username',
                                               'user__email',
@@ -845,9 +848,29 @@
                'all_roles' : Role.objects.all(),
                'anon_roles' : Role.objects.filter(anon = True),
                'text' : text,
+               'display_suspended_users' : display_suspended_users,
+               'tag_list' : Tag.objects.usage_for_model(UserProfile),
+               'tag_selected': tag_selected,               
                }
 
-    return object_list(request, UserRole.objects.filter(text=text).filter(~Q(user=None)).order_by(order_by),
+    query = UserRole.objects.filter(text=text).filter(~Q(user=None)).order_by(order_by)
+    if not display_suspended_users:
+        query = query.exclude(Q(user__userprofile__is_suspended=True) & Q(user__is_active=True))
+    else:
+        # trick to include userprofile table anyway (to filter by tags)
+        query = query.filter(Q(user__userprofile__is_suspended=True) | Q(user__userprofile__is_suspended=False))
+
+    if tag_selected:     
+        tag_ids = Tag.objects.filter(name=tag_selected)
+        if tag_ids:   
+            content_type_id = ContentType.objects.get_for_model(UserProfile).pk
+            query = query.extra(where=['tagging_taggeditem.object_id = cm_userprofile.id', 
+                                       'tagging_taggeditem.content_type_id = %i' %content_type_id,
+                                       'tagging_taggeditem.tag_id = %i' %tag_ids[0].id],
+                                tables=['tagging_taggeditem'],
+                                )
+
+    return object_list(request, query,
                        template_name = 'site/text_share.html',
                        paginate_by = paginate_by,
                        extra_context = context,
--- a/src/cm/views/user.py	Thu Dec 10 14:34:50 2009 +0100
+++ b/src/cm/views/user.py	Thu Dec 10 15:07:25 2009 +0100
@@ -114,17 +114,18 @@
     query = UserRole.objects.select_related().filter(text=None).filter(~Q(user=None)).order_by(order_by)
     if not display_suspended_users:
         query = query.exclude(Q(user__userprofile__is_suspended=True) & Q(user__is_active=True))
+    else:
+        # trick to include userprofile table anyway (to filter by tags)
+        query = query.filter(Q(user__userprofile__is_suspended=True) | Q(user__userprofile__is_suspended=False))
 
     if tag_selected:     
         tag_ids = Tag.objects.filter(name=tag_selected)
         if tag_ids:   
             content_type_id = ContentType.objects.get_for_model(UserProfile).pk
-            # table cm_userprofile is not present if display_suspended_users: fix this 
-            tables = ['tagging_taggeditem', 'cm_userprofile'] if display_suspended_users else ['tagging_taggeditem']  
             query = query.extra(where=['tagging_taggeditem.object_id = cm_userprofile.id', 
                                        'tagging_taggeditem.content_type_id = %i' %content_type_id,
                                        'tagging_taggeditem.tag_id = %i' %tag_ids[0].id],
-                                tables=tables,
+                                tables=['tagging_taggeditem'],
                                 )
 
     return object_list(request, query,