From 2ad60725b712e1fcea5c79bb085edb7c89f38a19 Mon Sep 17 00:00:00 2001 From: Leif Johansson Date: Tue, 16 Aug 2011 13:30:51 +0200 Subject: switch back to profile but more std --- coip/apps/auth/views.py | 3 -- coip/apps/opensocial/people.py | 3 +- coip/apps/user/__init__.py | 0 coip/apps/user/admin.py | 5 +++ coip/apps/user/models.py | 65 +++++++++++++++++++++++++++++ coip/apps/user/views.py | 38 +++++++++++++++++ coip/apps/userprofile/__init__.py | 0 coip/apps/userprofile/admin.py | 5 --- coip/apps/userprofile/models.py | 61 --------------------------- coip/apps/userprofile/views.py | 39 ----------------- coip/extensions/templatetags/userdisplay.py | 9 ++-- coip/middleware.py | 11 +++-- coip/multiresponse.py | 4 -- coip/settings.py | 6 ++- coip/urls.py | 10 ++--- templates/base.html | 3 +- templates/tree.html | 3 +- 17 files changed, 133 insertions(+), 132 deletions(-) create mode 100644 coip/apps/user/__init__.py create mode 100644 coip/apps/user/admin.py create mode 100644 coip/apps/user/models.py create mode 100644 coip/apps/user/views.py delete mode 100644 coip/apps/userprofile/__init__.py delete mode 100644 coip/apps/userprofile/admin.py delete mode 100644 coip/apps/userprofile/models.py delete mode 100644 coip/apps/userprofile/views.py diff --git a/coip/apps/auth/views.py b/coip/apps/auth/views.py index bab6bf8..a7c29d6 100644 --- a/coip/apps/auth/views.py +++ b/coip/apps/auth/views.py @@ -4,10 +4,7 @@ Created on Jul 5, 2010 @author: leifj ''' from django.http import HttpResponseRedirect -from coip.apps.userprofile.models import UserProfile, user_profile -from coip.apps.name.models import lookup from django.views.decorators.cache import never_cache -from coip.apps.membership.models import add_member def accounts_login_federated(request): diff --git a/coip/apps/opensocial/people.py b/coip/apps/opensocial/people.py index e51949c..6572e06 100644 --- a/coip/apps/opensocial/people.py +++ b/coip/apps/opensocial/people.py @@ -4,7 +4,6 @@ Created on Jun 19, 2011 @author: leifj ''' from tastypie.resources import ModelResource -from django.contrib.auth.models import User from coip.apps.opensocial.serializer import OpenSocialSerializer from django.conf.urls.defaults import url from coip.apps.membership.models import Membership @@ -18,7 +17,7 @@ from django.shortcuts import get_object_or_404 import logging from pprint import pformat from tastypie.bundle import Bundle -from coip.apps.userprofile.models import Identifier +from coip.apps.user.models import Identifier _rekey = { 'objects': 'entry' diff --git a/coip/apps/user/__init__.py b/coip/apps/user/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/coip/apps/user/admin.py b/coip/apps/user/admin.py new file mode 100644 index 0000000..c0e5ff4 --- /dev/null +++ b/coip/apps/user/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from coip.apps.user.models import Identifier, UserProfile + +admin.site.register(Identifier) +admin.site.register(UserProfile) diff --git a/coip/apps/user/models.py b/coip/apps/user/models.py new file mode 100644 index 0000000..9521d89 --- /dev/null +++ b/coip/apps/user/models.py @@ -0,0 +1,65 @@ +''' +Created on Jul 5, 2010 + +@author: leifj +''' +from django.db import models +from django.contrib.auth.models import User +from coip.apps.name.models import Name, lookup +from coip.apps.membership.models import add_member +from django.dispatch.dispatcher import receiver +from django.db.models.signals import post_save + +class Identifier(models.Model): + + FEDERATION=0 + EMAIL=1 + SSHKEY=2 + GRIDCERT=3 + INTERNAL=4 + + timecreated = models.DateTimeField(auto_now_add=True) + lastupdated = models.DateTimeField(auto_now=True) + + user = models.ForeignKey(User,related_name='identifiers') + display_name = models.CharField(max_length=255,blank=True,null=True) + type = models.SmallIntegerField(default=0,choices=((0,'Federation Identifier'),(1,'Email Address'),(2,'SSH Key'),(3,'eScience Certificate'),(4,'Internal User'))) + idp = models.CharField(max_length=255,blank=True,null=True) + verified = models.BooleanField() + value = models.CharField(max_length=1023) + verification_code = models.CharField(max_length=1023,blank=True,null=True) + + #class Meta: + # unique_together = ('value','idp') + + def __unicode__(self): + return "%s [%s]" % (self.value,self.display_name) + +class UserProfile(models.Model): + user = models.OneToOneField(User) + home = models.ForeignKey(Name,blank=True,null=True,editable=False) + identifier = models.ForeignKey(Identifier,editable=False,blank=True,null=True) + timecreated = models.DateTimeField(auto_now_add=True) + lastupdated = models.DateTimeField(auto_now=True) + + def __unicode__(self): + return "%s" % (self.user.__unicode__()) + +@receiver(post_save,sender=User) +def _create_profile(sender,**kwargs): + user = kwargs['instance'] + created = kwargs['created'] + if created: + profile,profile_created = UserProfile.objects.get_or_create(user=user) + urn = lookup("urn",True) + anyuser = lookup("system:anyuser",True) + urn.setacl(anyuser,'rl') + profile.home = lookup('user:'+user.username,autocreate=True) + add_member(profile.home,user,hidden=True) + profile.home.setpacl(profile.home, "rwlida") + profile.home.setacl(profile.home,"rwla") #don't allow users to delete or reset acls on their home, nor invite members - that would be confusing as hell + profile.home.short = user.get_full_name() + profile.home.save() + profile.save() + + diff --git a/coip/apps/user/views.py b/coip/apps/user/views.py new file mode 100644 index 0000000..f204e21 --- /dev/null +++ b/coip/apps/user/views.py @@ -0,0 +1,38 @@ +''' +Created on Jul 6, 2010 + +@author: leifj +''' +from django.contrib.auth.decorators import login_required +from coip.multiresponse import respond_to, json_response +from coip.apps.membership.models import Membership +from django.core.exceptions import ObjectDoesNotExist +from coip.apps.name.models import NameLink +from django.contrib.auth.models import User +from django.shortcuts import get_object_or_404 +from coip.apps.user.models import Identifier + +@login_required +def home(request): + memberships = [] + try: + memberships = Membership.objects.filter(user=request.user,hidden=False) + except ObjectDoesNotExist: + pass + + names = [(link.src,link.data) for link in NameLink.objects.filter(dst__memberships__user=request.user,type=NameLink.access_control,data__contains='i').all()] + identifiers = Identifier.objects.filter(user=request.user) + return respond_to(request, {'text/html': 'apps/userprofile/home.html'},{'memberships': memberships,'names': names,'identifiers': identifiers}) + +@login_required +def search(request): + list = [] + if request.REQUEST.has_key('term'): + term = request.REQUEST['term'] + list = [{'label': user.username,'value': user.id} for user in User.objects.filter(username__contains=term)] + return json_response(list) + +@login_required +def info(request,username): + user = get_object_or_404(User,username=username) + return json_response({'username': user.username}); \ No newline at end of file diff --git a/coip/apps/userprofile/__init__.py b/coip/apps/userprofile/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/coip/apps/userprofile/admin.py b/coip/apps/userprofile/admin.py deleted file mode 100644 index 1e5c7a0..0000000 --- a/coip/apps/userprofile/admin.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.contrib import admin -from coip.apps.userprofile.models import UserProfile, Identifier - -admin.site.register(UserProfile) -admin.site.register(Identifier) \ No newline at end of file diff --git a/coip/apps/userprofile/models.py b/coip/apps/userprofile/models.py deleted file mode 100644 index e780d81..0000000 --- a/coip/apps/userprofile/models.py +++ /dev/null @@ -1,61 +0,0 @@ -''' -Created on Jul 5, 2010 - -@author: leifj -''' -from django.db import models -from django.contrib.auth.models import User -from coip.apps.name.models import Name, lookup -from coip.apps.membership.models import add_member - -class UserProfile(models.Model): - user = models.ForeignKey(User) - home = models.ForeignKey(Name,blank=True,null=True,editable=False) - timecreated = models.DateTimeField(auto_now_add=True) - lastupdated = models.DateTimeField(auto_now=True) - - def __unicode__(self): - return "%s" % (self.user.__unicode__()) - - -def user_profile(user): - profile,created = UserProfile.objects.get_or_create(user=user) - if created: - urn = lookup("urn",True) - anyuser = lookup("system:anyuser",True) - urn.setacl(anyuser,'rl') - home = lookup('user:'+user.username,autocreate=True) - home.short = user.get_full_name() - profile.home = home - profile.save() - home.save() - add_member(home,profile.user,hidden=True) - home.setpacl(home, "rwlida") - home.setacl(home,"rwla") #don't allow users to delete or reset acls on their home, nor invite members - that would be confusing as hell - - return profile - -class Identifier(models.Model): - - FEDERATION=0 - EMAIL=1 - SSHKEY=2 - GRIDCERT=3 - INTERNAL=4 - - timecreated = models.DateTimeField(auto_now_add=True) - lastupdated = models.DateTimeField(auto_now=True) - - user = models.ForeignKey(User,related_name='identifiers') - display_name = models.CharField(max_length=255,blank=True,null=True) - type = models.SmallIntegerField(default=0,choices=((0,'Federation Identifier'),(1,'Email Address'),(2,'SSH Key'),(3,'eScience Certificate'),(4,'Internal User'))) - idp = models.CharField(max_length=255,blank=True,null=True) - verified = models.BooleanField() - value = models.CharField(max_length=1023) - verification_code = models.CharField(max_length=1023,blank=True,null=True) - - #class Meta: - # unique_together = ('value','idp') - - def __unicode__(self): - return "%s [%s]" % (self.value,self.display_name) diff --git a/coip/apps/userprofile/views.py b/coip/apps/userprofile/views.py deleted file mode 100644 index 50fe184..0000000 --- a/coip/apps/userprofile/views.py +++ /dev/null @@ -1,39 +0,0 @@ -''' -Created on Jul 6, 2010 - -@author: leifj -''' -from django.contrib.auth.decorators import login_required -from coip.multiresponse import respond_to, json_response -from coip.apps.membership.models import Membership -from django.core.exceptions import ObjectDoesNotExist -from coip.apps.name.models import NameLink -from django.contrib.auth.models import User -from django.shortcuts import get_object_or_404 -from coip.apps.userprofile.models import Identifier - - -@login_required -def home(request): - memberships = [] - try: - memberships = Membership.objects.filter(user=request.user,hidden=False) - except ObjectDoesNotExist: - pass - - names = [(link.src,link.data) for link in NameLink.objects.filter(dst__memberships__user=request.user,type=NameLink.access_control,data__contains='i').all()] - identifiers = Identifier.objects.filter(user=request.user) - return respond_to(request, {'text/html': 'apps/userprofile/home.html'},{'memberships': memberships,'names': names,'identifiers': identifiers}) - -@login_required -def search(request): - list = [] - if request.REQUEST.has_key('term'): - term = request.REQUEST['term'] - list = [{'label': user.username,'value': user.id} for user in User.objects.filter(username__contains=term)] - return json_response(list) - -@login_required -def info(request,username): - user = get_object_or_404(User,username=username) - return json_response({'username': user.username}); \ No newline at end of file diff --git a/coip/extensions/templatetags/userdisplay.py b/coip/extensions/templatetags/userdisplay.py index 8bdd63f..e7d3852 100644 --- a/coip/extensions/templatetags/userdisplay.py +++ b/coip/extensions/templatetags/userdisplay.py @@ -7,10 +7,13 @@ MOMENT = 120 # duration in seconds within which the time difference def userdisplay(user): cn = user.get_full_name() - if not cn and hasattr(user,'identifier'): - id = user.identifier + if not cn: + id = user.get_profile().identifier if id: - cn = user.identifier.value + if id.display_name: + cn = id.display_name + else: + cn = "%s according to %s" % (id.value,id.idp) if not cn: cn = user.username return cn diff --git a/coip/middleware.py b/coip/middleware.py index 093b5a0..ce5e1e8 100644 --- a/coip/middleware.py +++ b/coip/middleware.py @@ -4,11 +4,10 @@ Created on Dec 13, 2010 @author: leifj ''' from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured -from coip.apps.userprofile.models import Identifier +from coip.apps.user.models import Identifier from django_extensions.utils import uuid from django.contrib import auth -from django.contrib.auth.models import UNUSABLE_PASSWORD, User -import logging +from django.contrib.auth.models import UNUSABLE_PASSWORD def _headers(request,attr): v = request.META.get(attr) @@ -24,7 +23,7 @@ def meta1(request,attr): else: return None -class MappedRemoteUserMiddleware(object): +class COIPRemoteUserMiddleware(object): """ Middleware for utilizing Web-server-provided authentication. @@ -58,7 +57,7 @@ class MappedRemoteUserMiddleware(object): if not request.user.is_anonymous(): user = request.user identifier,created = Identifier.objects.get_or_create(user=user,value=user.username,type=Identifier.INTERNAL,verified=True) - request.identifier = identifier + user.get_profile().identifier = identifier return try: @@ -130,8 +129,8 @@ class MappedRemoteUserMiddleware(object): if user: # User is valid. Set request.user and persist user in the session # by logging the user in. + user.get_profile().identifier = identifier auth.login(request, user) - request.identifier = identifier def clean_username(self, username, request): diff --git a/coip/multiresponse.py b/coip/multiresponse.py index 0c4f36c..0b6875e 100644 --- a/coip/multiresponse.py +++ b/coip/multiresponse.py @@ -7,7 +7,6 @@ from django.utils import simplejson from django.template import loader from coip.settings import PREFIX_URL from coip.apps.membership.models import has_member -from coip.apps.userprofile.models import user_profile, Identifier default_suffix_mapping = {"\.htm(l?)$": "text/html", "\.json$": "application/json", @@ -30,7 +29,6 @@ def make_response_dict(request,d={}): if request.user.is_authenticated(): d['user'] = request.user - d['profile'] = user_profile(request.user) d['prefix_url'] = PREFIX_URL if d.has_key('name'): @@ -57,8 +55,6 @@ def json_response(data): def render403(request,message="You don't seem to have enough rights for what you are trying to do....",dict={}): dict['message'] = message dict['user'] = request.user - if request.user.is_authenticated(): - dict['profile'] = user_profile(request.user) return HttpResponseForbidden(loader.render_to_string("403.html",dict)) def respond_to(request, template_mapping, dict={}, suffix_mapping=default_suffix_mapping): diff --git a/coip/settings.py b/coip/settings.py index 6e2203f..e7f1fb6 100644 --- a/coip/settings.py +++ b/coip/settings.py @@ -72,7 +72,7 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'coip.middleware.MappedRemoteUserMiddleware', + 'coip.middleware.COIPRemoteUserMiddleware', #'django.middleware.cache.FetchFromCacheMiddleware' ) @@ -81,6 +81,8 @@ AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', ) +AUTH_PROFILE_MODULE = 'user.UserProfile' + ROOT_URLCONF = 'coip.urls' TEMPLATE_DIRS = ( @@ -105,7 +107,7 @@ INSTALLED_APPS = ( 'coip.apps.name', 'coip.apps.membership', 'coip.apps.invitation', - 'coip.apps.userprofile', + 'coip.apps.user', 'coip.apps.link', 'coip.apps.entity' ) diff --git a/coip/urls.py b/coip/urls.py index 13c422f..ace059e 100644 --- a/coip/urls.py +++ b/coip/urls.py @@ -24,12 +24,12 @@ urlpatterns = patterns('', (r'^accounts/login-federated/$', 'coip.apps.auth.views.accounts_login_federated'), (r'^accounts/logout/$', 'coip.apps.auth.views.logout'), # Profiles and user information - #(r'^user/merge/(?P.+)$', 'coip.apps.userprofile.views.merge'), - #(r'^user/merge$', 'coip.apps.userprofile.views.merge'), - (r'^user/home$', 'coip.apps.userprofile.views.home'), + #(r'^user/merge/(?P.+)$', 'coip.apps.user.views.merge'), + #(r'^user/merge$', 'coip.apps.user.views.merge'), + (r'^user/home$', 'coip.apps.user.views.home'), (r'^user/(.+)/groups.json$', 'coip.apps.name.views.user_groups'), - (r'^user/search.json$', 'coip.apps.userprofile.views.search'), - (r'^user/info/(.+).json$', 'coip.apps.userprofile.views.info'), + (r'^user/search.json$', 'coip.apps.user.views.search'), + (r'^user/info/(.+).json$', 'coip.apps.user.views.info'), # Invitations (r'^name/(?P[0-9]+)/invite$', 'coip.apps.invitation.views.invite'), (r'^invitation/(?P[0-9]+)/cancel$', 'coip.apps.invitation.views.cancel'), diff --git a/templates/base.html b/templates/base.html index 5d1a4c1..110d7b8 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,3 +1,4 @@ +{% load userdisplay %} @@ -75,7 +76,7 @@ {% if user.is_authenticated %}