diff options
-rw-r--r-- | coip/apps/auth/views.py | 62 | ||||
-rw-r--r-- | coip/apps/invitation/models.py | 9 | ||||
-rw-r--r-- | coip/apps/invitation/views.py | 2 | ||||
-rw-r--r-- | coip/apps/name/views.py | 13 | ||||
-rw-r--r-- | coip/apps/opensocial/people.py | 16 | ||||
-rw-r--r-- | coip/apps/userprofile/admin.py | 5 | ||||
-rw-r--r-- | coip/apps/userprofile/models.py | 64 | ||||
-rw-r--r-- | coip/apps/userprofile/utils.py | 32 | ||||
-rw-r--r-- | coip/apps/userprofile/views.py | 43 | ||||
-rw-r--r-- | coip/extensions/templatetags/userdisplay.py | 29 | ||||
-rw-r--r-- | coip/middleware.py | 168 | ||||
-rw-r--r-- | coip/multiresponse.py | 6 | ||||
-rw-r--r-- | coip/settings.py | 3 | ||||
-rw-r--r-- | coip/urls.py | 4 | ||||
-rw-r--r-- | templates/base.html | 2 | ||||
-rw-r--r-- | templates/tree.html | 4 |
16 files changed, 239 insertions, 223 deletions
diff --git a/coip/apps/auth/views.py b/coip/apps/auth/views.py index 6dd311d..bab6bf8 100644 --- a/coip/apps/auth/views.py +++ b/coip/apps/auth/views.py @@ -4,71 +4,15 @@ Created on Jul 5, 2010 @author: leifj ''' from django.http import HttpResponseRedirect -from coip.apps.userprofile.models import UserProfile -from django.contrib.auth.models import User -from coip.apps.auth.utils import anonid +from coip.apps.userprofile.models import UserProfile, user_profile from coip.apps.name.models import lookup -import datetime from django.views.decorators.cache import never_cache -import logging +from coip.apps.membership.models import add_member -def meta(request,attr): - v = request.META.get(attr) - if not v: - return None - values = filter(lambda x: x != "(null)",v.split(";")) - return values; - -def meta1(request,attr): - v = meta(request,attr) - if v: - return v[0] - else: - return None def accounts_login_federated(request): if request.user.is_authenticated(): - profile,created = UserProfile.objects.get_or_create(identifier=request.user.username) - if created: - profile.identifier = request.user.username - profile.user = request.user - profile.save() - - - update = False - cn = meta1(request,'cn') - if not cn: - cn = meta1(request,'displayName') - logging.warn(cn) - if not cn: - fn = meta1(request,'givenName') - ln = meta1(request,'sn') - if fn and ln: - cn = "%s %s" % (fn,ln) - if not cn: - cn = profile.identifier - - mail = meta1(request,'mail') - - idp = meta1(request,'Shib-Identity-Provider') - - for attrib_name, meta_value in (('display_name',cn),('email',mail),('idp',idp)): - attrib_value = getattr(profile, attrib_name) - if meta_value and not attrib_value: - setattr(profile,attrib_name,meta_value) - update = True - - if request.user.password == "": - request.user.password = "(not used for federated logins)" - update = True - - if update: - request.user.save() - - # Allow auto_now to kick in for the lastupdated field - #profile.lastupdated = datetime.datetime.now() - profile.save() - + #profile,created = UserProfile.objects.get_or_create(user=request.user) next = request.session.get("after_login_redirect", None) if next is not None: return HttpResponseRedirect(next) diff --git a/coip/apps/invitation/models.py b/coip/apps/invitation/models.py index e6b7df4..64c3d5d 100644 --- a/coip/apps/invitation/models.py +++ b/coip/apps/invitation/models.py @@ -6,11 +6,7 @@ Created on Jun 23, 2010 from django.db import models from django.contrib.auth.models import User from coip.apps.name.models import Name -import datetime -from pprint import pformat from django.core.mail import send_mail -from coip.apps.userprofile.models import last_used_profile -import logging from coip.settings import PREFIX_URL, NOREPLY class Invitation(models.Model): @@ -29,8 +25,7 @@ class Invitation(models.Model): def __unicode__(self): return "%s invited to %s by %s" % (self.email,self.name,self.inviter) - def send_email(self): - pinviter = last_used_profile(self.inviter) + def send_email(self,user): send_mail('Invitation to join \'%s\'' % (self.name.shortname()), ''' %s (%s) has invited you to join \'%s\': @@ -45,7 +40,7 @@ If you want to accept the invitation open this link in your browser: To view information about \'%s\' open this link in your browser: %s -''' % (pinviter.display_name,pinviter.identifier,self.name.shortname(),self.message,PREFIX_URL,self.nonce,self.name.shortname(),self.name.url()), +''' % (user.get_full_name,user.identifier.value,self.name.shortname(),self.message,PREFIX_URL,self.nonce,self.name.shortname(),self.name.url()), NOREPLY, [self.email], fail_silently=False) diff --git a/coip/apps/invitation/views.py b/coip/apps/invitation/views.py index 542728b..b0b1fb9 100644 --- a/coip/apps/invitation/views.py +++ b/coip/apps/invitation/views.py @@ -27,7 +27,7 @@ def invite(request,id): form = InvitationForm(request.POST,instance=invitation) if form.is_valid(): invitation = form.save() - invitation.send_email() + invitation.send_email(user) return HttpResponseRedirect("/name/id/%d" % (name.id)) else: exp = datetime.datetime.now()+datetime.timedelta(days=1) diff --git a/coip/apps/name/views.py b/coip/apps/name/views.py index b50526c..31efbc8 100644 --- a/coip/apps/name/views.py +++ b/coip/apps/name/views.py @@ -5,11 +5,10 @@ Created on Jul 6, 2010 ''' from coip.apps.name.models import Name, lookup, traverse, NameLink from django.core.exceptions import ObjectDoesNotExist -from django.http import HttpResponseNotFound, HttpResponseForbidden,\ - HttpResponseRedirect, Http404 +from django.http import HttpResponseNotFound,HttpResponseRedirect, Http404 from django.contrib.auth.decorators import login_required from coip.multiresponse import respond_to, json_response, render403 -from pprint import pformat, pprint +from pprint import pformat import logging from coip.apps.name.forms import NameEditForm, NewNameForm, NameDeleteForm,\ PermissionForm @@ -29,7 +28,7 @@ def delete(request,id): if form.is_valid(): parent = name.parent if not form.cleaned_data['recursive'] and name.children.count() > 0: - return HttpResponseForbidden("Will not delete non-empty node") + return render403(request,"Will not delete non-empty node") for link in name.links.all(): link.delete() @@ -54,10 +53,10 @@ def add(request,id): if id: if not parent.has_permission(request.user,'w'): - return HttpResponseForbidden('You are not allowed to create names under '+parent) + return render403(request,'You are not allowed to create names under %s' % parent) else: if not request.user.admin: - return HttpResponseForbidden('You are not allowed to create names in the root') + return render403(request,'You are not allowed to create names in the root context') if request.method == 'POST': name = Name(parent=parent,creator=request.user) @@ -76,7 +75,7 @@ def edit(request,id): name = get_object_or_404(Name,pk=id) if not name.has_permission(request.user,'w'): - return HttpResponseForbidden() + return render403(request,"You do not have write-permission here") if request.method == 'POST': form = NameEditForm(request.POST,instance=name) diff --git a/coip/apps/opensocial/people.py b/coip/apps/opensocial/people.py index 4572829..e51949c 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 coip.apps.userprofile.models import UserProfile, last_used_profile from django.contrib.auth.models import User from coip.apps.opensocial.serializer import OpenSocialSerializer from django.conf.urls.defaults import url @@ -19,6 +18,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 _rekey = { 'objects': 'entry' @@ -122,8 +122,8 @@ class PersonResource(OpenSocialResource): #memberships = ToManyField(MembershipResource,'memberships',full=True) class Meta: - queryset = User.objects.all() - fields = ['username'] + queryset = Identifier.objects.filter(type=Identifier.FEDERATION) + fields = ['value'] resource_name = 'people' serializer = OpenSocialSerializer() @@ -138,8 +138,8 @@ class PersonResource(OpenSocialResource): def list_memberships(self, request, **kwargs): logging.debug(pformat(kwargs)) try: - user = self.cached_obj_get(request=request, username=kwargs['username']) - logging.debug(pformat(user)) + id = self.cached_obj_get(request=request, value=kwargs['username']) + logging.debug(pformat(id)) except ObjectDoesNotExist: return HttpGone() except MultipleObjectsReturned: @@ -157,8 +157,8 @@ class PersonResource(OpenSocialResource): def dehydrate(self,bundle): bundle = super(PersonResource,self).dehydrate(bundle) - bundle.data['id'] = bundle.data['username'] - bundle.data['displayName'] = last_used_profile(bundle.obj).display_name + bundle.data['id'] = bundle.data['value'] + bundle.data['displayName'] = bundle.data['display_name'] del bundle.data['resource_uri'] - del bundle.data['username'] + del bundle.data['value'] return bundle
\ No newline at end of file diff --git a/coip/apps/userprofile/admin.py b/coip/apps/userprofile/admin.py index 32c1ad8..1e5c7a0 100644 --- a/coip/apps/userprofile/admin.py +++ b/coip/apps/userprofile/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin -from coip.apps.userprofile.models import UserProfile +from coip.apps.userprofile.models import UserProfile, Identifier -admin.site.register(UserProfile)
\ No newline at end of file +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 index 40751fb..e780d81 100644 --- a/coip/apps/userprofile/models.py +++ b/coip/apps/userprofile/models.py @@ -5,39 +5,57 @@ Created on Jul 5, 2010 ''' from django.db import models from django.contrib.auth.models import User -from coip.apps.name.models import Name +from coip.apps.name.models import Name, lookup +from coip.apps.membership.models import add_member class UserProfile(models.Model): - user = models.ForeignKey(User,blank=True,null=True,related_name='profiles') - display_name = models.CharField(max_length=255,blank=True,null=True) - primary = models.BooleanField() - email = models.EmailField(blank=True,null=True) - idp = models.CharField(max_length=255,blank=True,null=True) - identifier = models.CharField(max_length=1023,unique=True) + 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) - home = models.ForeignKey(Name,blank=True,null=True,editable=False) def __unicode__(self): - return "%s [%s] - %s" % (self.identifier,self.user.username,self.display_name) - - def make_primary(self): - for p in UserProfile.objects.filter(user=self.user).all: - p.primary = False - self.primary = True - -def last_used_profile(user): - return UserProfile.objects.filter(user=user).order_by('lastupdated')[0] + return "%s" % (self.user.__unicode__()) + -def primary_profile(user): - return UserProfile.objects.filter(user=user,primary=True)[0] +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 -class PKey(models.Model): - user_profile = models.ForeignKey(UserProfile,related_name='keys') - key = models.CharField(max_length=1023,unique=True) 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 "A merge-key for "+self.user_profile + return "%s [%s]" % (self.value,self.display_name) diff --git a/coip/apps/userprofile/utils.py b/coip/apps/userprofile/utils.py deleted file mode 100644 index d3854f6..0000000 --- a/coip/apps/userprofile/utils.py +++ /dev/null @@ -1,32 +0,0 @@ -''' -Created on Jul 6, 2010 - -@author: leifj -''' -from coip.apps.userprofile.models import UserProfile, PKey -from django.core.exceptions import ObjectDoesNotExist -import logging -from pprint import pformat - -def request_profile(request): - if request.user.is_authenticated(): - logging.warn(pformat(request.META)) - if request.META.has_key('REMOTE_USER'): - return UserProfile.objects.get(identifier=request.META['REMOTE_USER']) - else: - return UserProfile.objects.get(user=request.user) - else: - return None - -def user_profile(request,key=None): - if key: - try: - k = PKey.objects.get(key=key) - return k.profile,k - except ObjectDoesNotExist: - return None - else: - return request_profile(request) - #if not request.session.has_key('_profile'): - # request.session['_profile'] = request_profile(request) - #return request.session['_profile']
\ No newline at end of file diff --git a/coip/apps/userprofile/views.py b/coip/apps/userprofile/views.py index 7ce8f74..50fe184 100644 --- a/coip/apps/userprofile/views.py +++ b/coip/apps/userprofile/views.py @@ -4,34 +4,14 @@ Created on Jul 6, 2010 @author: leifj ''' from django.contrib.auth.decorators import login_required -from coip.apps.userprofile.models import PKey -from django.http import HttpResponseRedirect from coip.multiresponse import respond_to, json_response -from coip.apps.membership.models import Membership, add_member -from coip.apps.userprofile.utils import user_profile +from coip.apps.membership.models import Membership from django.core.exceptions import ObjectDoesNotExist -from pprint import pformat -from coip.apps.auth.utils import nonce -from coip.apps.name.models import Name, NameLink, lookup +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 merge(request,pkey=None): - if pkey: - profile = user_profile(request) - merge_profile,pkey = profile(request,pkey) - if merge_profile: - merge_profile.user.delete() - merge_profile.user = request.user - merge_profile.save() - pkey.delete() - return HttpResponseRedirect("/user/home") - else: - profile = profile(request) - k = PKey(profile=profile,key=nonce()) - k.save() - return HttpResponseRedirect("/accounts/login?next=/user/merge/"+k.key) @login_required def home(request): @@ -41,22 +21,9 @@ def home(request): except ObjectDoesNotExist: pass - urn = lookup("urn",True) - anyuser = lookup("system:anyuser",True) - urn.setacl(anyuser,'rl') - - profile = user_profile(request) - home = lookup('user:'+request.user.username,autocreate=True) - home.short = "%s (%s)" % (profile.display_name,profile.identifier) - profile.home = home - 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 - names = [(link.src,link.data) for link in NameLink.objects.filter(dst__memberships__user=request.user,type=NameLink.access_control,data__contains='i').all()] - - return respond_to(request, {'text/html': 'apps/userprofile/home.html'},{'memberships': memberships,'names': names, 'name': home}) + 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): diff --git a/coip/extensions/templatetags/userdisplay.py b/coip/extensions/templatetags/userdisplay.py index de6f363..8bdd63f 100644 --- a/coip/extensions/templatetags/userdisplay.py +++ b/coip/extensions/templatetags/userdisplay.py @@ -1,8 +1,4 @@ from django import template -from django.template import defaultfilters -from coip.apps.userprofile.models import last_used_profile -from pprint import pformat -import logging register = template.Library() @@ -10,27 +6,18 @@ MOMENT = 120 # duration in seconds within which the time difference # will be rendered as 'a moment ago' def userdisplay(user): - try: - p = last_used_profile(user) - return p.display_name - except Exception,e: - logging.warning(e) - return user.username + cn = user.get_full_name() + if not cn and hasattr(user,'identifier'): + id = user.identifier + if id: + cn = user.identifier.value + if not cn: + cn = user.username + return cn userdisplay.is_safe = True register.filter(userdisplay) -def lastidentifier(user): - #try: - p = last_used_profile(user) - return p.identifier - #except Exception,e: - # pprint(e) - # return user.username - -lastidentifier.is_safe = True -register.filter(lastidentifier) - def memberdisplay(membership): if membership.user: return userdisplay(membership.user) diff --git a/coip/middleware.py b/coip/middleware.py index 82d371e..f60cd60 100644 --- a/coip/middleware.py +++ b/coip/middleware.py @@ -3,25 +3,163 @@ Created on Dec 13, 2010 @author: leifj ''' -from django.core.exceptions import ImproperlyConfigured -from coip.apps.userprofile.models import UserProfile +from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured +from coip.apps.userprofile.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 -class UserMappingMiddleware(object): - ''' - Middleware for supporting merged and mapped user identities - ''' +def meta(request,attr): + v = request.META.get(attr) + if not v: + return None + values = filter(lambda x: x != "(null)",v.split(";")) + return values; - def process_request(self,request): +def meta1(request,attr): + v = meta(request,attr) + if v: + return v[0] + else: + return None + +class MappedUserProxy(User): + + def __init__(self,user,identifier): + self.user = user + self.identifier = identifier + + def __unicode__(self): + return self.identifier.display_name + + def get_full_name(self): + return self.identifier.display_name + + def __getattr__(self,attr): + if attr == 'identifier': + return self.identifier + return getattr(self.user,attr) + +class MappedRemoteUserMiddleware(object): + """ + Middleware for utilizing Web-server-provided authentication. + + If request.user is not authenticated, then this middleware attempts to + authenticate the username passed in the ``REMOTE_USER`` request header. + If authentication is successful, the user is automatically logged in to + persist the user in the session. + + The header used is configurable and defaults to ``REMOTE_USER``. Subclass + this class and change the ``header`` attribute if you need to use a + different header. + """ + + # Name of request header to grab username from. This will be the key as + # used in the request.META dictionary, i.e. the normalization of headers to + # all uppercase and the addition of "HTTP_" prefix apply. + header = "REMOTE_USER" + + def process_request(self, request): + # AuthenticationMiddleware is required so that request.user exists. + if not hasattr(request, 'user'): + raise ImproperlyConfigured( + "The Django remote user auth middleware requires the" + " authentication middleware to be installed. Edit your" + " MIDDLEWARE_CLASSES setting to insert" + " 'django.contrib.auth.middleware.AuthenticationMiddleware'" + " before the RemoteUserMiddleware class.") + + if request.user.is_authenticated(): + # this is to make internal users work too... + if not isinstance(request.user, MappedUserProxy) and 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.user = MappedUserProxy(user,identifier) + return + try: - username = request.META['REMOTE_USER'] + username = request.META[self.header] except KeyError: + # If specified header doesn't exist then return (leaving + # request.user set to AnonymousUser by the + # AuthenticationMiddleware). return - qs = UserProfile.objects.filter(user__username=username,primary=True) - if qs: - profile = qs[0] - username = profile.identifier - - request.META['REMOTE_USER'] = username + idp = meta1(request,'Shib-Identity-Provider') + if not idp: + raise Exception("No IdP information in request") + + user = None + identifier = None + try: + # Try to find a user based on the identifier received. If we find it we turn + # around and authenticate the username as if it was received in the header. + idp = meta1(request,'Shib-Identity-Provider') + identifier = Identifier.objects.get(value=username,type=Identifier.FEDERATION,idp=idp,verified=True) + user = auth.authenticate(remote_user=id.user.username) + except ObjectDoesNotExist: + pass + + if user == None: + # We've never seen this identifier before. Create a new random uuid for the + # django username and associate the identifier with it. + user = auth.authenticate(remote_user=uuid.uuid4()); + request.user.password = UNUSABLE_PASSWORD + request.user.save() + identifier = Identifier.objects.create(user=user,value=username,type=Identifier.FEDERATION,idp=idp,verified=True) + + if not identifier: + raise Exception("Unable to create user/id mapping") + + update = False + cn = meta1(request,'cn') + if not cn: + cn = meta1(request,'displayName') + if not cn: + fn = meta1(request,'givenName') + ln = meta1(request,'sn') + if fn and ln: + cn = "%s %s" % (fn,ln) + if not cn: + cn = "%s according to %s" % (id.value,id.idp) + + if identifier.display_name != cn: + identifier.display_name = cn + identifier.save() + + mail = meta1(request,'mail') + if mail: + mail_id,created = Identifier.objects.get_or_create(user=user,value=mail,type=Identifier.EMAIL,verified=True) + user.email = mail + update = True + + if fn: + id.user.first_name = fn + update = True + if ln: + id.user.last_name = ln + update = True + + if update: + identifier.user.save() -
\ No newline at end of file + if user: + # User is valid. Set request.user and persist user in the session + # by logging the user in. + request.user = MappedUserProxy(user,identifier) + auth.login(request, user) + + + def clean_username(self, username, request): + """ + Allows the backend to clean the username, if the backend defines a + clean_username method. + """ + backend_str = request.session[auth.BACKEND_SESSION_KEY] + backend = auth.load_backend(backend_str) + try: + username = backend.clean_username(username) + except AttributeError: # Backend has no clean_username method. + pass + return username diff --git a/coip/multiresponse.py b/coip/multiresponse.py index e91e527..0c4f36c 100644 --- a/coip/multiresponse.py +++ b/coip/multiresponse.py @@ -3,11 +3,11 @@ import re from django.conf import settings from django.shortcuts import render_to_response from django.http import HttpResponse, HttpResponseForbidden -from coip.apps.userprofile.utils import user_profile 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 +30,7 @@ def make_response_dict(request,d={}): if request.user.is_authenticated(): d['user'] = request.user - d['profile'] = user_profile(request) + d['profile'] = user_profile(request.user) d['prefix_url'] = PREFIX_URL if d.has_key('name'): @@ -58,7 +58,7 @@ def render403(request,message="You don't seem to have enough rights for what you dict['message'] = message dict['user'] = request.user if request.user.is_authenticated(): - dict['profile'] = user_profile(request) + 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 2a8297f..6e2203f 100644 --- a/coip/settings.py +++ b/coip/settings.py @@ -72,8 +72,7 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'coip.middleware.UserMappingMiddleware', - 'django.contrib.auth.middleware.RemoteUserMiddleware', + 'coip.middleware.MappedRemoteUserMiddleware', #'django.middleware.cache.FetchFromCacheMiddleware' ) diff --git a/coip/urls.py b/coip/urls.py index 4b1bc6f..13c422f 100644 --- a/coip/urls.py +++ b/coip/urls.py @@ -24,8 +24,8 @@ 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<pkey>.+)$', 'coip.apps.userprofile.views.merge'), - (r'^user/merge$', 'coip.apps.userprofile.views.merge'), + #(r'^user/merge/(?P<pkey>.+)$', 'coip.apps.userprofile.views.merge'), + #(r'^user/merge$', 'coip.apps.userprofile.views.merge'), (r'^user/home$', 'coip.apps.userprofile.views.home'), (r'^user/(.+)/groups.json$', 'coip.apps.name.views.user_groups'), (r'^user/search.json$', 'coip.apps.userprofile.views.search'), diff --git a/templates/base.html b/templates/base.html index 5c4a1c3..5d1a4c1 100644 --- a/templates/base.html +++ b/templates/base.html @@ -75,7 +75,7 @@ {% if user.is_authenticated %} <ul class="menubar"> <li> - <a href="#">{{profile.display_name}}</a> + <a href="#">{{user.get_full_name}}</a> <ul> <li><a href="/user/home">Dashboard</a></li> <li><a href="/accounts/logout">Logout</a></li> diff --git a/templates/tree.html b/templates/tree.html index 01969ab..27399fc 100644 --- a/templates/tree.html +++ b/templates/tree.html @@ -38,8 +38,8 @@ $(function() { <li id="left"> <ul id="sidemenu"> {% if user.is_authenticated %} - <li><a class="gravatar" href="#" title="{{profile.email}}"></a></li> - <li><a href="/user/home"><span class="ui-icon ui-icon-home"></span>{{profile.display_name}}</a></li> + <li><a class="gravatar" href="#" title="{{user.email}}"></a></li> + <li><a href="/user/home"><span class="ui-icon ui-icon-home"></span>{{user.get_full_name}}</a></li> {% endif %} <li style="border-top: 1px solid black; width: 100%; margin-top: 5px;"> </li> {% if name %} |