changeset 166:e122a60f5815

Organized ExtendedUser<->ExtendedGroup relationship
author Sylvain Beucler <beuc@beuc.net>
date Thu, 15 Jul 2010 11:50:36 +0200
parents 82e2c77565bb
children ffc79e4bc251
files TODO savane/my/filters.py savane/my/urls.py savane/svmain/fixtures/demo/users_groups.yaml savane/svmain/fixtures/developmentstatus.yaml savane/svmain/models.py savane/svmain/urls.py settings_default.py templates/base.html templates/my/index.html templates/svmain/extendedgroup_detail.html templates/svmain/extendeduser_detail.html
diffstat 12 files changed, 115 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/TODO
+++ b/TODO
@@ -17,7 +17,7 @@
 
     [/] Group page
 
-    [ ] Members list + GPG keyring
+    [/] Members list + GPG keyring
 
     [/] Account conf
 
new file mode 100644
--- /dev/null
+++ b/savane/my/filters.py
@@ -0,0 +1,36 @@
+# Only select information related to the current user
+# Copyright (C) 2010  Sylvain Beucler
+#
+# This file is part of Savane.
+# 
+# Savane is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+# 
+# Savane is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+def only_mine(f):
+    """Filter a generic query_set to only display objets related to
+    the current user"""
+    def _fd(request, queryset, *args, **kwargs):
+        user = request.user
+        queryset = queryset.filter(user=user.id)
+        return f(request, queryset, *args, **kwargs)
+    return _fd
+
+#def only_my_groups(f):
+#    """
+#    Filter groups that the current user is member of
+#    """
+#    def _fd(request, queryset, *args, **kwargs):
+#        user = request.user
+#        queryset = queryset.filter(extendeduser=user.id)
+#        return f(request, queryset, *args, **kwargs)
+#    return _fd
--- a/savane/my/urls.py
+++ b/savane/my/urls.py
@@ -23,15 +23,7 @@
 from django.views.generic.list_detail import object_list
 import views
 import savane.svmain.models as svmain_models
-
-def only_mine(f):
-    """Filter a generic query_set to only display objets related to
-    the current user"""
-    def _dec(request, queryset, *args, **kwargs):
-        user = request.user
-        queryset = queryset.filter(user=user.id)
-        return f(request, queryset, *args, **kwargs)
-    return _dec
+from savane.my.filters import *
 
 # Batch-decorator for urlpatterns
 # http://www.djangosnippets.org/snippets/532/
new file mode 100644
--- /dev/null
+++ b/savane/svmain/fixtures/demo/users_groups.yaml
@@ -0,0 +1,41 @@
+- model: svmain.groupconfiguration
+  pk: 1
+  fields:
+    name: "GNU projects"
+- model: auth.group
+  pk: 1
+  fields:
+    name: emacs
+- model: svmain.extendedgroup
+  pk: 1
+  fields:
+    type: 1
+    devel_status: 6
+    register_time: 2001-02-08 15:03:48
+- model: auth.user
+  pk: 1
+  fields:
+    username: admin
+    is_staff: true
+    is_superuser: true
+    password: sha1$2c71c$92bacf9046c9d9335dc13d1b8a8d57ea87f8e37e
+- model: svmain.extendeduser
+  pk: 1
+  fields:
+    status: 'A'
+- model: auth.user
+  pk: 2
+  fields:
+    username: rms
+    password: sha1$6bde8$748d99ad2f2493225efb0e6b78914c5c9a065275
+    groups: [1, ]
+- model: svmain.extendeduser
+  pk: 2
+  fields:
+    status: 'A'
+- model: svmain.membership
+  pk: 1
+  fields:
+    user: 2
+    group: 1
+    admin_flags: 'A'
--- a/savane/svmain/fixtures/developmentstatus.yaml
+++ b/savane/svmain/fixtures/developmentstatus.yaml
@@ -1,36 +1,36 @@
-- fields:
-    name: '0 - Undefined'
-  model: svmain.developmentstatus
-  pk: 1
 - fields:
     name: '1 - Planning'
   model: svmain.developmentstatus
-  pk: 2
+  pk: 1
 - fields:
     name: '2 - Pre-Alpha'
   model: svmain.developmentstatus
+  pk: 2
+- fields:
+    name: '3 - Alpha'
+  model: svmain.developmentstatus
   pk: 3
 - fields:
-    name: '3 - Alpha'
+    name: '4 - Beta'
   model: svmain.developmentstatus
   pk: 4
 - fields:
-    name: '4 - Beta'
+    name: '5 - Production/Stable'
   model: svmain.developmentstatus
   pk: 5
 - fields:
-    name: '5 - Production/Stable'
-  model: svmain.developmentstatus
-  pk: 6
-- fields:
     name: '6 - Mature'
   model: svmain.developmentstatus
-  pk: 7
+  pk: 6
 - fields:
     name: 'N/A'
   model: svmain.developmentstatus
-  pk: 8
+  pk: 7
 - fields:
     name: '? - Orphaned/Unmaintained'
   model: svmain.developmentstatus
+  pk: 8
+- fields:
+    name: '0 - Undefined'
+  model: svmain.developmentstatus
   pk: 9
--- a/savane/svmain/models.py
+++ b/savane/svmain/models.py
@@ -508,6 +508,13 @@
     """
     Extra attributes about a User<->Group relationship
     (e.g. "is the user an admin?")
+
+    Consider this as metadata about an existing
+    django.contrib.auth.User.groups relationship; or a potential
+    relationship (e.g. pending membership waiting for admin approval).
+
+    The group membership is defined by the underlying User.groups
+    relationship, not this one.
     """
     user = models.ForeignKey(ExtendedUser)
     group = models.ForeignKey(ExtendedGroup)
--- a/savane/svmain/urls.py
+++ b/savane/svmain/urls.py
@@ -46,7 +46,7 @@
         'slug_field' : 'username' },
       name='savane.svmain.user_detail'),
   url(r'^us/(?P<slug>[-\w]+)$', views.user_redir),
-  url(r'^users/(?P<slug>[-\w]+)$', views.user_redir),
+  url(r'^users/(?P<slug>[-\w]+)/?$', views.user_redir),
 
   url(r'^license/$', 'django.views.generic.list_detail.object_list',
       { 'queryset' : svmain_models.License.objects.all(), },
--- a/settings_default.py
+++ b/settings_default.py
@@ -54,6 +54,7 @@
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
+    'django.core.context_processors.request',
     'savane.context_processors.media',
 )
 
--- a/templates/base.html
+++ b/templates/base.html
@@ -37,10 +37,12 @@
     </div>
     {% if user.is_authenticated %}
     <div class="fast_menu_user">
-      {{ user.username}} ({{ user.first_name }} {{ user.last_name }})
+      Connected as <a href="{% url savane.my.views.index %}">
+        {{ user.username}}
+        {% if user.first_name or user.last_name %}({{ user.first_name }} {{ user.last_name }}) {% endif %}
 <!--      <a href="">Items</a> -->
 <!--      <a href="">Groups</a> -->
-      <a href="{% url savane.my.views.sv_conf %}">Account Conf</a>
+      </a>
       | <a href="{% url django.contrib.auth.views.logout %}">Logout</a>
     </div>
     {% else %}
--- a/templates/my/index.html
+++ b/templates/my/index.html
@@ -2,5 +2,12 @@
 {% extends "base.html" %}
 
 {% block content %}
-My nice personal page.
+<p>My nice personal page.</p>
+
+<p>
+  <a href="{% url savane.my.views.sv_conf %}">Account configuration</a>
+| <a href="{% url savane.my.group_list %}">My groups</a>
+| <a href="{% url savane.svmain.user_detail request.user.username %}">My public page</a>
+</p>
+
 {% endblock %}
--- a/templates/svmain/extendedgroup_detail.html
+++ b/templates/svmain/extendedgroup_detail.html
@@ -12,7 +12,7 @@
 
 {% if object.user_set.all %}
 <ul>
-  {% for user in object.extendeduser_set.all %}
+  {% for user in object.user_set.all %}
   <li><a href="{{ user.get_absolute_url }}">{{ user.username }}</a></li>
   {% endfor %}
   </ul>
--- a/templates/svmain/extendeduser_detail.html
+++ b/templates/svmain/extendeduser_detail.html
@@ -25,7 +25,7 @@
 <ul>
   {% for membership in object.membership_set.all %}
   <li>
-    <a href="{{ membership.group.get_absolute_url }}">{{ membership.group.name }}</a> {{ membership.admin_flags}}
+    <a href="{{ membership.group.get_absolute_url }}">{{ membership.group.name }}</a> - with flags: {{ membership.admin_flags}}
   </li>
   {% endfor %}
   </ul>
@@ -33,22 +33,6 @@
   Not part of any group yet
 {% endif %}
 
-
-<p>Is a member of (using Membership + direct field):</p>
-
-{% if object.extendedgroup_set.all %}
-<ul>
-  {% for group in object.extendedgroup_set.all %}
-  <li>
-    <a href="{{ group.get_absolute_url }}">{{ group.name }}</a>
-  </li>
-  {% endfor %}
-  </ul>
-{% else %}
-  Not part of any group yet
-{% endif %}
-
-
 {% endblock %}
 
 {% comment %}