savannah-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. e


From: Sylvain Beucler
Subject: [Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. e013d40dcd0dc22d1ddab9ff7189d96b89bde3ea
Date: Fri, 23 Jul 2010 19:12:07 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Savane-cleanup framework".

The branch, master has been updated
       via  e013d40dcd0dc22d1ddab9ff7189d96b89bde3ea (commit)
       via  5ad43fea746fa1c9cae3c41a2c4f8054f747c089 (commit)
      from  5a8e0277009dfc0977c31cde7d6820191ce8cfbc (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=e013d40dcd0dc22d1ddab9ff7189d96b89bde3ea

commit e013d40dcd0dc22d1ddab9ff7189d96b89bde3ea
Author: Sylvain Beucler <address@hidden>
Date:   Fri Jul 23 21:11:00 2010 +0200

    Add script to reinitialize the application completely.

diff --git a/reset.sh b/reset.sh
new file mode 100755
index 0000000..3db02b6
--- /dev/null
+++ b/reset.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+mysql -e 'DROP DATABASE savane';
+mysql -e 'CREATE DATABASE savane DEFAULT CHARSET utf8';
+./manage.py syncdb --noinput
+./manage.py loaddata savane/svmain/fixtures/*.yaml
+./manage.py loaddata savane/svmain/fixtures/demo/*.yaml

http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=5ad43fea746fa1c9cae3c41a2c4f8054f747c089

commit 5ad43fea746fa1c9cae3c41a2c4f8054f747c089
Author: Sylvain Beucler <address@hidden>
Date:   Fri Jul 23 21:10:27 2010 +0200

    Change derived class ExtendedUser to AutoOneToOneField SvUserInfo (idem for 
groups); replicate changes across the code.  This allow to create 
Savane-specific user object automatically (e.g. after django-registration).

diff --git a/TODO b/TODO
index 93c9bbc..bf959e9 100644
--- a/TODO
+++ b/TODO
@@ -15,6 +15,10 @@ improve it.
 
     [/] User account registration
 
+        [X] Account creation
+
+        [ ] Password recovery
+
     [/] User page
 
     [/] Group page
diff --git a/savane/my/urls.py b/savane/my/urls.py
index 8ff75e5..11bf617 100644
--- a/savane/my/urls.py
+++ b/savane/my/urls.py
@@ -23,6 +23,7 @@ from django.views.generic.simple import direct_to_template
 from django.views.generic.list_detail import object_list
 import views
 import savane.svmain.models as svmain_models
+import django.contrib.auth.models as auth_models
 from savane.my.filters import *
 
 # Batch-decorator for urlpatterns
@@ -54,7 +55,8 @@ urlpatterns = decorated_patterns ('', login_required,
   url('^conf/ssh_gpg/$', views.sv_ssh_gpg),
   url('^conf/ssh_gpg/delete/$', views.sv_ssh_delete),
   url(r'^groups/$', only_mine(object_list),
-      { 'queryset' : svmain_models.ExtendedGroup.objects.all(),
-        'extra_context' : { 'title' : "My groups", }, },
+      { 'queryset' : auth_models.Group.objects.all(),
+        'extra_context' : { 'title' : "My groups", },
+        'template_name' : 'svmain/group_list.html', },
       name='savane.my.group_list'),
 )
diff --git a/savane/my/views.py b/savane/my/views.py
index bce458c..ae06630 100644
--- a/savane/my/views.py
+++ b/savane/my/views.py
@@ -24,7 +24,7 @@ from django.contrib.auth import authenticate, login, logout
 from django.contrib.auth.decorators import login_required
 from django import forms
 from django.contrib import messages
-from savane.svmain.models import ExtendedUser, SshKey
+from savane.svmain.models import SvUserInfo, SshKey
 from savane.utils import *
 from annoying.decorators import render_to
 
@@ -83,7 +83,7 @@ def sv_resume_skill( request ):
 
 @login_required()
 def sv_ssh_gpg( request ):
-    eu = get_object_or_404(ExtendedUser, pk=request.user.pk)
+    info = get_object_or_404(SvUserInfo, user=request.user)
 
     error_msg = None
     success_msg = None
@@ -97,7 +97,7 @@ def sv_ssh_gpg( request ):
         if action == 'delete_key':
             key_pk = request.GET['key_pk']
             try:
-                ssh_key = eu.sshkey_set.get(pk=key_pk)
+                ssh_key = request.user.sshkey_set.get(pk=key_pk)
                 ssh_key.delete()
             except:
                 error_msg = 'Cannot remove the selected key'
@@ -117,7 +117,7 @@ def sv_ssh_gpg( request ):
                     key = request.POST['key'].strip()
                     if len(key) > 0:
                         ssh_key = SshKey(ssh_key=key)
-                        eu.sshkey_set.add(ssh_key)
+                        request.user.sshkey_set.add(ssh_key)
                         success_msg = 'Authorized keys stored.'
 
                 if 'key_file' in request.FILES:
@@ -129,7 +129,7 @@ def sv_ssh_gpg( request ):
 
                             if len(key) > 0:
                                 ssh_key = SshKey(ssh_key=key)
-                                eu.sshkey_set.add(ssh_key)
+                                request.user.sshkey_set.add(ssh_key)
                                 success_msg = 'Authorized keys stored.'
 
                 form_ssh = SSHForm()
@@ -140,16 +140,16 @@ def sv_ssh_gpg( request ):
             elif action == 'update_gpg':
                 if 'gpg_key' in request.POST:
                     gpg_key = request.POST['gpg_key']
-                    eu.gpg_key = gpg_key
+                    info.gpg_key = gpg_key
                     success_msg = 'GPG Key stored.'
 
-    if eu.gpg_key != '':
-        gpg_data = dict({'action':'update_gpg', 'gpg_key':eu.gpg_key})
+    if info.gpg_key != '':
+        gpg_data = dict({'action':'update_gpg', 'gpg_key':info.gpg_key})
         form_gpg = GPGForm( gpg_data )
     else:
         form_gpg = GPGForm()
 
-    keys =  eu.sshkey_set.all()
+    keys =  request.user.sshkey_set.all()
     if keys is not None:
         ssh_keys = dict()
         for key in keys:
@@ -171,7 +171,7 @@ def sv_ssh_delete(request):
     eu = get_object_or_404(ExtendedUser, pk=request.user.pk)
     if request.method == 'POST':
         try:
-            ssh_key = eu.sshkey_set.get(pk=request.POST.get('key_pk', 0))
+            ssh_key = 
request.user.sshkey_set.get(pk=request.POST.get('key_pk', 0))
             ssh_key.delete()
         except SshKey.DoesNotExist:
             messages.error(request, u"Cannot remove the selected key")
diff --git a/savane/svmain/admin.py b/savane/svmain/admin.py
index 8e398c1..0b5ef4f 100644
--- a/savane/svmain/admin.py
+++ b/savane/svmain/admin.py
@@ -15,26 +15,22 @@ class SshKeyInline(admin.TabularInline):
     model = svmain_models.SshKey
     extra = 2  # to add several keys in the ExtendedUser page
 
-class ExtendedUserAdmin(admin.ModelAdmin):
+class SvUserInfoAdmin(admin.ModelAdmin):
     # Copy/pasted from django.contrib.auth.admin; inheritance fails
     # when you attempt to display extended fields..
     fieldsets = (
-        (None, {'fields': ('username', 'password')}),
-        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
-        (_('Permissions'), {'fields': ('is_staff', 'is_active', 
'is_superuser', 'user_permissions')}),
-        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
-        (_('Groups'), {'fields': ('groups',)}),
+        (None, {'fields': ('user',)}),
         (_('Savane'),
          {'fields': ('status', 'spamscore',
                      'gpg_key', 'gpg_key_count',
                      'people_view_skills', 'email_hide', 'timezone', 
'theme',)}),
         )
-    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
-    list_filter = ('is_staff', 'is_superuser', 'status')
-    search_fields = ('username', 'first_name', 'last_name', 'email')
-    ordering = ('username',)
-    filter_horizontal = ('user_permissions',)
-    inlines = [SshKeyInline]
+    list_display = ('user', 'status')
+    list_filter = ('status',)
+    search_fields = ('user',)
+    ordering = ('user__username',)
+    #filter_horizontal = ('m2m',)
+    #inlines = [SshKeyInline]
 
 class GroupConfigurationAdmin(admin.ModelAdmin):
     fieldsets = (
@@ -84,17 +80,17 @@ class GroupConfigurationAdmin(admin.ModelAdmin):
         
         )
 
-class ExtendedGroupAdmin(admin.ModelAdmin):
+class SvGroupInfoAdmin(admin.ModelAdmin):
     # Copy/pasted from django.contrib.auth.admin; inheritance fails
     # when you attempt to display extended fields..
     search_fields = ('name',)
-    ordering = ('name',)
-    filter_horizontal = ('permissions',)
-    list_display  = ('name', 'pk', 'full_name', 'type', 'license',)
+    ordering = ('group__name',)
+    #filter_horizontal = ('permissions',)
+    list_display  = ('pk', 'full_name', 'type', 'license',)
     list_filter = ('type', 'license', 'devel_status',)
 
-admin.site.register(svmain_models.ExtendedUser, ExtendedUserAdmin)
-admin.site.register(svmain_models.ExtendedGroup, ExtendedGroupAdmin)
+admin.site.register(svmain_models.SvUserInfo, SvUserInfoAdmin)
+admin.site.register(svmain_models.SvGroupInfo, SvGroupInfoAdmin)
 admin.site.register(svmain_models.GroupConfiguration, GroupConfigurationAdmin)
 admin.site.register(svmain_models.License, LicenseAdmin)
 admin.site.register(svmain_models.DevelopmentStatus, DevelopmentStatusAdmin)
diff --git a/savane/svmain/fixtures/demo/users_groups.yaml 
b/savane/svmain/fixtures/demo/users_groups.yaml
index eb82729..78b3744 100644
--- a/savane/svmain/fixtures/demo/users_groups.yaml
+++ b/savane/svmain/fixtures/demo/users_groups.yaml
@@ -6,7 +6,7 @@
   pk: 1
   fields:
     name: emacs
-- model: svmain.extendedgroup
+- model: svmain.svgroupinfo
   pk: 1
   fields:
     type: 1
@@ -20,17 +20,13 @@
     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
+- model: svmain.svuserinfo
   pk: 2
   fields:
     status: 'A'
diff --git a/savane/svmain/models.py b/savane/svmain/models.py
index 9ff1d94..45545d1 100644
--- a/savane/svmain/models.py
+++ b/savane/svmain/models.py
@@ -60,14 +60,28 @@ from django.contrib.auth import models as auth_models
 
 
 class SshKey(models.Model):
-    user = models.ForeignKey('ExtendedUser')
+    user = models.ForeignKey(auth_models.User)
     # Could a CharField with max_length=3000 or something similar, as
     # it's a single line of text, but it sounds safer to use a
     # TextField for such a long text.  Too bad for the admin/ area.
     ssh_key = models.TextField(blank=False)
 
-class ExtendedUser(auth_models.User):
-    """Django base User class + extra Savane fields"""
+from annoying.fields import AutoOneToOneField
+class SvUserInfo(models.Model):
+    """
+    Django base User class + extra Savane fields
+
+    Since it adds a field to Django's User objects, we prefix it by
+    'sv' to avoid clashes with other packages, C-style (ahem).
+
+    Using AutoOneToOneField to automatically create this extra data
+    for new users as soon as the field is accessed.
+    """
+
+    class Meta:
+        ordering = ['user__username']
+
+    user = AutoOneToOneField(auth_models.User, primary_key=True)
 
     # Migrated to 'first_name' and 'last_name' in auth.User
     #realname = models.CharField(max_length=96)
@@ -80,7 +94,7 @@ class ExtendedUser(auth_models.User):
         ('S', 'Suspended'),
         #('SQD', 'Squad'), # TODO: implement squads more cleanly
         )
-    status = models.CharField(max_length=3, choices=status_CHOICES)
+    status = models.CharField(max_length=3, choices=status_CHOICES, 
default='A')
 
     # Unix mapping, used when populating a LDAP directory
     uidNumber = models.IntegerField(default=0)
@@ -106,9 +120,6 @@ class ExtendedUser(auth_models.User):
     timezone = models.CharField(max_length=192, blank=True)
     theme = models.CharField(max_length=45, blank=True)
 
-    # Non-field link to extended groups
-    extendedgroup_set = models.ManyToManyField('ExtendedGroup', 
through='Membership')
-
     # Inherit specialized models.Manager with convenience functions
     objects = auth_models.UserManager()
 
@@ -124,32 +135,6 @@ class ExtendedUser(auth_models.User):
                           + " WHERE status = 'A'"
                           )
 
-    @models.permalink
-    def get_absolute_url(self):
-        return ('savane.svmain.user_detail', [self.username])
-
-    class Meta:
-        ordering = ['username']
-
-# FIXME
-# Let's make sure extendeduser is always created, even if somehow a
-# normal User is created (from the admin interface, e.g.)
-# This currently fails, and this doesn't support creating a model if
-# another apps creates a derived class.
-#from django.contrib.auth.models import User
-#from django.db.models.signals import post_save
-#def user_post_save_handler(sender, **kwargs):
-#    """
-#    Create an ExtendedUser when a User is directly created
-#
-#    Called when User is created
-#    (but not called when a ExtendedUser is created)
-#    """
-#    u = kwargs['instance']
-#    if kwargs['created'] == True:
-#        eu = ExtendedUser(user_ptr=u)
-#        eu.save()  # ERROR
-#post_save.connect(user_post_save_handler, sender=User)
 
 class License(models.Model):
     """
@@ -363,8 +348,17 @@ class GroupConfiguration(models.Model):
         return self.name
 
 
-class ExtendedGroup(auth_models.Group):
-    """Django base Group class + extra Savane fields"""
+class SvGroupInfo(models.Model):
+    """
+    Django base Group class + extra Savane fields
+
+    Cf. SvUserInfo for concepts.
+    """
+
+    class Meta:
+        ordering = ['group__name']
+
+    group = AutoOneToOneField(auth_models.Group, primary_key=True)
 
     type = models.ForeignKey(GroupConfiguration)
     full_name = models.CharField(max_length=255, blank=True,
@@ -488,21 +482,14 @@ class ExtendedGroup(auth_models.Group):
         """
         return conn.query("SELECT "
                           + ",".join(fields)
-                          + " FROM auth_group JOIN svmain_extendedgroup"
-                          + " ON auth_group.id = 
svmain_extendedgroup.group_ptr_id"
+                          + " FROM auth_group JOIN svmain_svgroupinfo"
+                          + " ON auth_group.id = svmain_svgroupinfo.group_id"
                           + " WHERE status = 'A'"
                           )
 
     def __unicode__(self):
         return self.name
 
-    @models.permalink
-    def get_absolute_url(self):
-        return ('savane.svmain.group_detail', [self.name])
-
-    class Meta:
-        ordering = ['name']
-
 
 class Membership(models.Model):
     """
@@ -516,8 +503,13 @@ class Membership(models.Model):
     The group membership is defined by the underlying User.groups
     relationship, not this one.
     """
-    user = models.ForeignKey(ExtendedUser)
-    group = models.ForeignKey(ExtendedGroup)
+
+    class Meta:
+        unique_together = (('user', 'group'),)
+        ordering = ('group', 'user', )
+
+    user = models.ForeignKey(auth_models.User)
+    group = models.ForeignKey(auth_models.Group)
 
     admin_flags_CHOICES = (
         ('A', 'Admin'),
@@ -559,7 +551,3 @@ class Membership(models.Model):
 
     def __unicode__(self):
         return "[%s is a member of %s]" % (self.user.username, self.group.name)
-
-    class Meta:
-        unique_together = (('user', 'group'),)
-        ordering = ('group', 'user', )
diff --git a/savane/svmain/urls.py b/savane/svmain/urls.py
index 264890e..ad690d4 100644
--- a/savane/svmain/urls.py
+++ b/savane/svmain/urls.py
@@ -19,7 +19,8 @@
 
 from django.conf.urls.defaults import *
 
-from savane.svmain import models as svmain_models
+import savane.svmain.models as svmain_models
+import django.contrib.auth.models as auth_models
 import views
 
 urlpatterns = patterns ('',
@@ -36,15 +37,17 @@ urlpatterns = patterns ('',
   # "models in 'svmain', views in 'my'" is getting messy, probably a
   # mistake from me (Beuc) :P
   url(r'^p/(?P<slug>[-\w]+)$', 
'django.views.generic.list_detail.object_detail',
-      { 'queryset' : svmain_models.ExtendedGroup.objects.all(),
-        'slug_field' : 'name' },
+      { 'queryset' : auth_models.Group.objects.all(),
+        'slug_field' : 'name',
+        'template_name' : 'svmain/group_detail.html', },
       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'^u/(?P<slug>[-\w]+)$', 
'django.views.generic.list_detail.object_detail',
-      { 'queryset' : svmain_models.ExtendedUser.objects.all(),
-        'slug_field' : 'username' },
+      { 'queryset' : auth_models.User.objects.all(),
+        'slug_field' : 'username',
+        'template_name' : 'svmain/user_detail.html', },
       name='savane.svmain.user_detail'),
   url(r'^us/(?P<slug>[-\w]+)$', views.user_redir),
   url(r'^users/(?P<slug>[-\w]+)/?$', views.user_redir),
diff --git a/savane/svmain/views.py b/savane/svmain/views.py
index b5d9973..7ad5e1f 100644
--- a/savane/svmain/views.py
+++ b/savane/svmain/views.py
@@ -18,12 +18,13 @@
 
 from django.http import HttpResponseRedirect
 from django.shortcuts import render_to_response, get_object_or_404
-import models as svmain_models
-
-def group_redir(request, slug):
-    eg = get_object_or_404(svmain_models.ExtendedGroup, name=slug)
-    return HttpResponseRedirect(eg.get_absolute_url())
+from django.core.urlresolvers import reverse
+import django.contrib.auth.models as auth_models
 
 def user_redir(request, slug):
-    ug = get_object_or_404(svmain_models.ExtendedUser, username=slug)
-    return HttpResponseRedirect(ug.get_absolute_url())
+    u = get_object_or_404(auth_models.User, username=slug)
+    return HttpResponseRedirect(reverse('savane.svmain.user_detail', 
args=(slug,)))
+
+def group_redir(request, slug):
+    g = get_object_or_404(svmain_models.ExtendedGroup, name=slug)
+    return HttpResponseRedirect(reverse('savane.svmain.group_detail', 
args=(slug,)))
diff --git a/settings_default.py b/settings_default.py
index d480013..3690749 100644
--- a/settings_default.py
+++ b/settings_default.py
@@ -91,7 +91,6 @@ INSTALLED_APPS = (
 
     'savane.svmain',
     'savane.my',
-    'savane.register',
 # Disabled: we're not using it currently, and there are issues with
 # login when no site is defined
 #    'django.contrib.sites',
diff --git a/templates/svmain/extendedgroup_detail.html 
b/templates/svmain/group_detail.html
similarity index 84%
rename from templates/svmain/extendedgroup_detail.html
rename to templates/svmain/group_detail.html
index e7538bc..9f54d69 100644
--- a/templates/svmain/extendedgroup_detail.html
+++ b/templates/svmain/group_detail.html
@@ -13,7 +13,7 @@ Development status: {{object.devel_status}}<br />
 {% if object.user_set.all %}
 <ul>
   {% for user in object.user_set.all %}
-  <li><a href="{{ user.get_absolute_url }}">{{ user.username }}</a></li>
+  <li><a href="{% url savane.svmain.user_detail user.username %}">{{ 
user.username }}</a></li>
   {% endfor %}
   </ul>
 {% else %}
diff --git a/templates/svmain/extendedgroup_list.html 
b/templates/svmain/group_list.html
similarity index 76%
rename from templates/svmain/extendedgroup_list.html
rename to templates/svmain/group_list.html
index fdc3da1..7cc235f 100644
--- a/templates/svmain/extendedgroup_list.html
+++ b/templates/svmain/group_list.html
@@ -5,7 +5,7 @@
 {% if object_list %}
     <ul>
     {% for object in object_list %}
-        <li><a href="{{ object.get_absolute_url }}">{{ object }}</a></li>
+        <li><a href="{% url savane.svmain.group_detail object.name %}">{{ 
object.name }}</a></li>
     {% endfor %}
     </ul>
 {% else %}
diff --git a/templates/svmain/extendeduser_detail.html 
b/templates/svmain/user_detail.html
similarity index 75%
rename from templates/svmain/extendeduser_detail.html
rename to templates/svmain/user_detail.html
index 0298ae3..0da454c 100644
--- a/templates/svmain/extendeduser_detail.html
+++ b/templates/svmain/user_detail.html
@@ -11,7 +11,7 @@ Real name: {{object.first_name}} {{object.last_name}}</p>
 <ul>
   {% for group in object.groups.all %}
   <li>
-    <a href="{{ group.extendedgroup.get_absolute_url }}">{{ group.name }}</a>
+    <a href="{% url savane.svmain.group_detail group.name %}">{{ group.name 
}}</a>
   </li>
   {% endfor %}
   </ul>
@@ -25,7 +25,7 @@ Real name: {{object.first_name}} {{object.last_name}}</p>
 <ul>
   {% for membership in object.membership_set.all %}
   <li>
-    <a href="{{ membership.group.get_absolute_url }}">{{ membership.group.name 
}}</a> - with flags: {{ membership.admin_flags}}
+    <a href="{% url savane.svmain.group_detail membership.group.name %}">{{ 
membership.group.name }}</a> - with flags: {{ membership.admin_flags}}
   </li>
   {% endfor %}
   </ul>

-----------------------------------------------------------------------

Summary of changes:
 TODO                                               |    4 +
 reset.sh                                           |    6 ++
 savane/my/urls.py                                  |    6 +-
 savane/my/views.py                                 |   20 ++--
 savane/svmain/admin.py                             |   32 +++----
 savane/svmain/fixtures/demo/users_groups.yaml      |    8 +--
 savane/svmain/models.py                            |   88 +++++++++-----------
 savane/svmain/urls.py                              |   13 ++-
 savane/svmain/views.py                             |   15 ++--
 settings_default.py                                |    1 -
 ...extendedgroup_detail.html => group_detail.html} |    2 +-
 .../{extendedgroup_list.html => group_list.html}   |    2 +-
 .../{extendeduser_detail.html => user_detail.html} |    4 +-
 13 files changed, 98 insertions(+), 103 deletions(-)
 create mode 100755 reset.sh
 rename templates/svmain/{extendedgroup_detail.html => group_detail.html} (84%)
 rename templates/svmain/{extendedgroup_list.html => group_list.html} (76%)
 rename templates/svmain/{extendeduser_detail.html => user_detail.html} (75%)


hooks/post-receive
-- 
Savane-cleanup framework



reply via email to

[Prev in Thread] Current Thread [Next in Thread]