changeset 191:d112c8a7a07b

Add separate project memberlist page
author Sylvain Beucler <beuc@beuc.net>
date Sun, 25 Jul 2010 19:18:28 +0200
parents 215aef9e9393
children 82f0f3f73b0b
files savane/svmain/models.py savane/svmain/templatetags/svtopmenu.py savane/svmain/urls.py static_media/savane/css/Savannah.css templates/svmain/group_detail.html templates/svmain/group_memberlist.html templates/svmain/svtopmenu.html
diffstat 7 files changed, 90 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/savane/svmain/models.py
+++ b/savane/svmain/models.py
@@ -493,8 +493,11 @@
         else:
             return self.group.name
 
-    def get_admins(self):
-        return auth_models.User.objects.filter(membership__admin_flags='A')
+    def get_admin_memberships(self):
+        return self.group.membership_set.filter(admin_flags='A')
+
+    def get_active_memberships(self):
+        return self.group.membership_set.exclude(admin_flags='P')
 
     @staticmethod
     def query_active_groups_raw(conn, fields):
--- a/savane/svmain/templatetags/svtopmenu.py
+++ b/savane/svmain/templatetags/svtopmenu.py
@@ -18,8 +18,9 @@
 
 from django import template
 from django.core.urlresolvers import reverse
+from django.conf import settings
+from django.utils.translation import ugettext as _
 import savane.svmain.models as svmain_models
-from django.conf import settings
 
 register = template.Library()
 
@@ -35,20 +36,21 @@
     """
     icon = 'main'
     entries = []
+    group = context['group']
 
     if menu_name == 'group':
         entry_home = { 'text' : 'Home',
-                   'href' : reverse('savane.svmain.group_detail', args=[context['group'].name]),
+                   'href' : reverse('savane.svmain.group_detail', args=[group.name]),
                    'title': "Project Main Page at %s" % 'this website'}
         entry_home['children'] = []
-        entry_home['children'].append({'text' : 1.1, 'href' : 1.1, 'title': 1.1 })
-        if (context['user'].groups.filter(name=context['group']).count()):
+        entry_home['children'].append({'text' : _("Main"), 'href' : reverse('savane.svmain.group_detail', args=[group.name]) })
+        entry_home['children'].append({'text' : _("View Members"), 'href' : reverse('savane.svmain.group_memberlist', args=[group.name]) })
+        if (svmain_models.Membership.is_admin(context['user'], group)):
             entry_home['children'].append({'separator' : True })
-            entry_home['children'].append({'text' : "I'm a member", 'href' : 1.2, 'title': 1.2 })
-        if (svmain_models.Membership.objects.filter(user=context['user'], group=context['group'], admin_flags='A').count()):
-            entry_home['children'].append({'separator' : True })
-            entry_home['children'].append({'text' : "I'm an admin",
-                                           'href' : reverse('savane.svmain.group_admin', args=[context['group'].name]) })
+            entry_home['children'].append({'text' : _("Administer:"), 'strong': True,
+                                           'href' : reverse('savane.svmain.group_admin', args=[group.name]) })
+            entry_home['children'].append({'text' : _("Manage Members"),
+                                           'href' : reverse('savane.svmain.group_admin_members', args=[group.name]) })
 
         entry_test = {
                     'text' : 2, 'href' : 2, 'title': 2, 'children':
--- a/savane/svmain/urls.py
+++ b/savane/svmain/urls.py
@@ -84,6 +84,15 @@
       name='savane.svmain.group_detail'),
   url(r'^pr/(?P<slug>[-\w]+)/$', views.group_redir),
   url(r'^projects/(?P<slug>[-\w]+)/$', views.group_redir),
+  url(r'^p/(?P<slug>[-\w]+)/memberlist/$', object_detail,
+      { 'queryset' : auth_models.Group.objects.all(),
+        'slug_field' : 'name',
+        'extra_context' : { 'title' : 'Summary: Project Memberlist' },
+        'template_name' : 'svmain/group_memberlist.html',
+        'template_object_name' : 'group', },
+      name='savane.svmain.group_memberlist'),
+)
+urlpatterns += decorated_patterns ('', login_required,
   url(r'^p/(?P<slug>[-\w]+)/join/$', views.group_join),
 )
 urlpatterns += decorated_patterns ('', only_project_admin,
--- a/static_media/savane/css/Savannah.css
+++ b/static_media/savane/css/Savannah.css
@@ -569,7 +569,7 @@
 
 
 
-.boxtitle {
+.box th, .boxtitle {
 	font-weight: bold;
 	text-align: center;
 	text-transform: capitalize;
@@ -1077,7 +1077,7 @@
   	margin-right: 1%; 
 }
 
-.boxtitle  {	
+.box th, .boxtitle  {
 	background-image: url("../images/leopard.png");
 	background-color: #eddb5a;
 	border: thin outset #641212;
--- a/templates/svmain/group_detail.html
+++ b/templates/svmain/group_detail.html
@@ -11,24 +11,24 @@
 <div class="indexright">
   <div class="box">
     <div class="boxtitle">{% trans "Membership Info" %}</div>
-    {% if group.svgroupinfo.get_admins %}
-    <div class="boxitem"><span class="smaller">{% trans "Project Admins:" %}</span></div>
-    {% for user in group.svgroupinfo.get_admins %}
-    <div class="{% cycle 'boxitemalt' 'boxitem' %}"><span class="smaller">&nbsp;
-	- <a href="{% url savane.svmain.user_detail user.username %}">{{ user.svuserinfo.get_full_name_display }}</a></span></div>
+    {% if group.svgroupinfo.get_admin_memberships %}
+    <div class="boxitem smaller">{% trans "Project Admins:" %}</div>
+    {% for membership in group.svgroupinfo.get_admin_memberships %}
+    <div class="{% cycle 'boxitemalt' 'boxitem' %} smaller">&nbsp;
+	- <a href="{% url savane.svmain.user_detail membership.user.username %}">{{ membership.user.svuserinfo.get_full_name_display }}</a></div>
     {% endfor %}
     {% else %}
-    <div class="boxitem"><span class="smaller">{% trans "No members!" %}</span></div>
+    <div class="boxitem smaller">{% trans "No members!" %}</div>
     {% endif %}
-    <div class="boxitem"><span class="smaller">{% blocktrans count group.user_set.count as count %}{{count}} active member{% plural %}{{count}} active members{% endblocktrans %}</span></div>
-    <div class="boxitemalt"><span class="smaller">[<a href="memberlist/">{% trans "View Members" %}</a>]</span></div>
+    <div class="boxitem smaller">{% blocktrans count group.user_set.count as count %}{{count}} active member{% plural %}{{count}} active members{% endblocktrans %}</div>
+    <div class="boxitemalt smaller">[<a href="memberlist/">{% trans "View Members" %}</a>]</div>
   </div>
   <div class="box">
     <div class="boxtitle">{% trans "Group identification" %}</div>
-    <div class="boxitem"><span class="smaller">{% trans "Id:" %} <strong>#{{group.pk}}</strong></span></div>
-    <div class="boxitemalt"><span class="smaller">{% trans "System Name:" %} <strong>{{group.name}}</strong></span></div>
-    <div class="boxitem"><span class="smaller">{% trans "Name:" %} <strong>{{group.svgroupinfo.full_name}}</strong></span></div>
-    <div class="boxitemalt"><span class="smaller">{% trans "Group Type:" %} <strong>{{group.svgroupinfo.type.name}}</strong></span></div>
+    <div class="boxitem smaller">{% trans "Id:" %} <strong>#{{group.pk}}</strong></div>
+    <div class="boxitemalt smaller">{% trans "System Name:" %} <strong>{{group.name}}</strong></div>
+    <div class="boxitem smaller">{% trans "Name:" %} <strong>{{group.svgroupinfo.full_name}}</strong></div>
+    <div class="boxitemalt smaller">{% trans "Group Type:" %} <strong>{{group.svgroupinfo.type.name}}</strong></div>
   </div>
 </div>
 
new file mode 100644
--- /dev/null
+++ b/templates/svmain/group_memberlist.html
@@ -0,0 +1,45 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% load svtopmenu %}
+
+{% block title %}
+{{group.svgroupinfo.get_full_name_display}} - {{title}}
+{% endblock %}
+
+{% block icon %}people{% endblock %}
+
+{% block topmenu %}
+  {% svtopmenu "group" %}
+{% endblock %}
+
+{% block content %}
+
+<table class="box">
+<tr><th></th><th>Member</th><th>Resume and skills</th></tr>
+{% for membership in group.svgroupinfo.get_active_memberships %}
+<tr class="{% cycle 'boxitemalt' 'boxitem' %}">
+  <td>
+    {% ifequal membership.admin_flags 'A' %}
+    <img class="icon"
+      alt="{% trans "Project Administrator" %}"
+      src="{{STATIC_MEDIA_URL}}savane/images/common/roles1/project-admin.orig.png" />
+    {% else %}
+    <img class="icon"
+      alt="{% trans "Project Member" %}"
+      src="{{STATIC_MEDIA_URL}}savane/images/common/roles1/project-member.orig.png" />
+    {% endifequal %}
+  </td>
+  <td><a href="{% url savane.svmain.user_detail membership.user.username %}">{{ membership.user.svuserinfo.get_full_name_display }}</a></td>
+  <td>TODO</td>
+{% endfor %}
+</table>
+
+{% endblock %}
+
+{% comment %}
+Local Variables: **
+mode: django-html **
+tab-width: 4 **
+indent-tabs-mode: nil **
+End: **
+{% endcomment %}
--- a/templates/svmain/svtopmenu.html
+++ b/templates/svmain/svtopmenu.html
@@ -5,10 +5,12 @@
     <ul id="submenu{{forloop.counter}}" class="topmenuitemsubmenu">
     {% for l2 in l1.children %}
       {% if l2.separator %}
-	  <li class="topmenuitemsubmenuseparator">&nbsp;</li>
-	  {% else %}
-      <li class="topmenuitemsubmenu"><a href="{{l2.href}}" title="{{l2.title}}">{{ l2.text }}</a></li>
-	  {% endif %}
+      <li class="topmenuitemsubmenuseparator">&nbsp;</li>
+      {% else %}
+      <li class="topmenuitemsubmenu"><a href="{{l2.href}}" title="{{l2.title}}">
+	  {% if l2.strong %}<strong>{{ l2.text }}</strong>{% else %}{{ l2.text }}{% endif %}
+      </a></li>
+      {% endif %}
     {% endfor %}
     </ul>
   </li>