From 4dd67ada40dcaa3f8b249637f8678b32c6f78c21 Mon Sep 17 00:00:00 2001
From: Andrew Williams
Date: Tue, 14 Aug 2012 21:33:19 +0100
Subject: [PATCH] Add category support to groups, Fixes #281
---
app/groups/admin.py | 3 ++-
app/groups/models.py | 11 +++++++++
app/groups/templates/groups/group_list.html | 25 +++++++++++++++------
app/groups/views.py | 17 ++++++++++----
4 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/app/groups/admin.py b/app/groups/admin.py
index 904fa53..8fb7f2f 100644
--- a/app/groups/admin.py
+++ b/app/groups/admin.py
@@ -1,7 +1,7 @@
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import GroupAdmin
-from groups.models import GroupInformation, GroupRequest
+from groups.models import GroupInformation, GroupRequest, GroupCategory
class GroupRequestAdmin(admin.ModelAdmin):
list_display = ('group', 'user', 'status', 'created_date', 'changed_by', 'changed_date')
@@ -9,6 +9,7 @@ class GroupRequestAdmin(admin.ModelAdmin):
list_filter = ('status',)
admin.site.register(GroupRequest, GroupRequestAdmin)
+admin.site.register(GroupCategory, admin.ModelAdmin)
class SSOGroupInformationInline(admin.StackedInline):
model = GroupInformation
diff --git a/app/groups/models.py b/app/groups/models.py
index e59e3ef..f6022bc 100644
--- a/app/groups/models.py
+++ b/app/groups/models.py
@@ -4,11 +4,22 @@ from django.contrib.auth.models import Group, User
from groups.app_defines import *
+
+class GroupCategory(models.Model):
+ """Category to put groups into"""
+
+ name = models.CharField('Category Name', max_length="250")
+
+ def __unicode__(self):
+ return self.name
+
+
class GroupInformation(models.Model):
""" Extended group information """
group = models.OneToOneField(Group)
+ category = models.ForeignKey(GroupCategory, related_name='groups', null=True)
type = models.IntegerField("Group Type", choices=GROUP_TYPE_CHOICES, default=GROUP_TYPE_PERMISSION)
admins = models.ManyToManyField(User, blank=True)
public = models.BooleanField("Public", default=False, help_text="Indicates if the group is visible to all")
diff --git a/app/groups/templates/groups/group_list.html b/app/groups/templates/groups/group_list.html
index 2d7aa75..9a24042 100644
--- a/app/groups/templates/groups/group_list.html
+++ b/app/groups/templates/groups/group_list.html
@@ -9,22 +9,33 @@
This is the list of your current groups, and groups you can request to be a member of.
{% if group_list %}
+{% regroup group_list by category as groups_by_category %}
+
+{% for category in groups_by_category %}
+
+{% if category.grouper %}
+
+
{{ category.grouper }}
+
+{% endif %}
+
| Group Name | Description | Status | Actions |
- {% for id, group, description, status, requestable, fixed, pending, moderated in group_list %}
- | {{ group }} |
- {{ description }} |
- {% if pending %}Request Pending{% else %}{% if status %}{{ status }}{% endif %}{% endif %} |
- {% ifequal status None %}{% if requestable %}{% if moderated %}Request Membership{% else %}Join{% endif %}{% endif %}{% endifequal %}
- {% if not fixed and status %}Leave {% endif %}
- {% if status == 'Admin' or request.user.is_superuser %}{% if not fixed %}Admin{% endif %}{% endif %} |
+ {% for group in category.list %}
+
| {{ group.group }} |
+ {{ group.description }} |
+ {% if group.pending %}Request Pending{% else %}{% if group.status %}{{ group.status }}{% endif %}{% endif %} |
+ {% ifequal group.status None %}{% if requestable %}{% if group.moderated %}Request Membership{% else %}Join{% endif %}{% endif %}{% endifequal %}
+ {% if not group.fixed and group.status %}Leave {% endif %}
+ {% if group.status == 'Admin' or request.user.is_superuser %}{% if not group.fixed %}Admin{% endif %}{% endif %} |
{% endfor %}
+{% endfor %}
{% else %}
No groups are available.
{% endif %}
diff --git a/app/groups/views.py b/app/groups/views.py
index d549c56..69631b9 100644
--- a/app/groups/views.py
+++ b/app/groups/views.py
@@ -53,12 +53,21 @@ def group_list(request):
continue
fixed = not group.groupinformation.type == GROUP_TYPE_PERMISSION
- pending = group.requests.filter(status=REQUEST_PENDING,user=request.user).count()
+ pending = group.requests.filter(status=REQUEST_PENDING,user=request.user).count()
- group_list.append((group.id, group.name, group.groupinformation.description, status, requestable, fixed, pending, group.groupinformation.moderated))
-
- group_list = sorted(group_list, key=lambda name: name[1].lower())
+ group_list.append({
+ 'id': group.id,
+ 'group': group.name,
+ 'category': group.groupinformation.category or 'Other',
+ 'description': group.groupinformation.description,
+ 'status': status,
+ 'requestable': requestable,
+ 'fixed': fixed,
+ 'pending': pending,
+ 'moderated': group.groupinformation.moderated,
+ })
+ group_list = sorted(group_list, key=lambda k: "%s-%s" % (k['category'], k['group']))
return render_to_response('groups/group_list.html', locals(), context_instance=RequestContext(request))