summaryrefslogtreecommitdiff
path: root/coip
diff options
context:
space:
mode:
Diffstat (limited to 'coip')
-rw-r--r--coip/apps/auth/__init__.py0
-rw-r--r--coip/apps/auth/views.py63
-rw-r--r--coip/apps/invitation/views.py4
-rw-r--r--coip/apps/membership/models.py9
-rw-r--r--coip/apps/name/models.py7
-rw-r--r--coip/apps/userprofile/__init__.py0
-rw-r--r--coip/apps/userprofile/admin.py4
-rw-r--r--coip/apps/userprofile/models.py30
-rw-r--r--coip/apps/userprofile/utils.py29
-rw-r--r--coip/apps/userprofile/views.py44
-rw-r--r--coip/multiresponse.py20
-rw-r--r--coip/urls.py23
12 files changed, 205 insertions, 28 deletions
diff --git a/coip/apps/auth/__init__.py b/coip/apps/auth/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/coip/apps/auth/__init__.py
diff --git a/coip/apps/auth/views.py b/coip/apps/auth/views.py
new file mode 100644
index 0000000..3e54e9c
--- /dev/null
+++ b/coip/apps/auth/views.py
@@ -0,0 +1,63 @@
+'''
+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 uuid import uuid4
+
+def meta(request,attr):
+ v = request.META.get(attr)
+ values = v.split(";")
+ return values[0]
+
+def accounts_login_federated(request):
+ if request.user.is_authenticated():
+ profile = UserProfile.objects.get_or_create(identifier=request.user.username)
+ if profile.user:
+ request.user = profile.user
+ else:
+ profile.identifier = request.user.username
+ request.user = User(username=uuid4().urn)
+ request.user.save()
+ profile.user = request.user
+
+ update = False
+ cn = meta(request,'HTTP_CN')
+ if not cn:
+ cn = meta(request,'HTTP_DISPLAYNAME')
+ if not cn:
+ fn = meta(request,'HTTP_GIVENNAME')
+ ln = meta(request,'HTTP_SN')
+ cn = "%s %s" % (fn,ln)
+ if not cn:
+ cn = profile.identifier
+
+ mail = meta(request,'HTTP_MAIL')
+
+ for attrib_name, meta_value in (('display_name',cn),('email',mail)):
+ 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()
+ profile.save()
+ next = request.session.get("after_login_redirect", None)
+ if next is not None:
+ return HttpResponseRedirect(next)
+ else:
+ pass
+ return HttpResponseRedirect("/")
+
+def logout(request):
+ from django.contrib.auth import logout
+ logout(request)
+ return HttpResponseRedirect("/Shibboleth.sso/Logout") \ No newline at end of file
diff --git a/coip/apps/invitation/views.py b/coip/apps/invitation/views.py
index fe1c6af..63f017f 100644
--- a/coip/apps/invitation/views.py
+++ b/coip/apps/invitation/views.py
@@ -4,8 +4,8 @@ Created on Jun 23, 2010
@author: leifj
'''
from django.contrib.auth.decorators import login_required
-from apps.invitation.forms import InvitationForm
-from apps.invitation.models import Invitation
+from coip.apps.invitation.forms import InvitationForm
+from coip.apps.invitation.models import Invitation
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
diff --git a/coip/apps/membership/models.py b/coip/apps/membership/models.py
index df6e796..a86f2e5 100644
--- a/coip/apps/membership/models.py
+++ b/coip/apps/membership/models.py
@@ -19,5 +19,14 @@ class Membership(models.Model):
expires = models.DateTimeField(blank=True)
name = models.ForeignKey(Name)
+ def __unicode__(self):
+ return "%s in %s" % (self.user,self.name)
+
def valid(self):
return self.enabled and datetime.date.today() > self.expires
+
+ def status(self):
+ if self.valid():
+ return "active"
+ else:
+ return "inactive";
diff --git a/coip/apps/name/models.py b/coip/apps/name/models.py
index ec86769..7801a0d 100644
--- a/coip/apps/name/models.py
+++ b/coip/apps/name/models.py
@@ -25,11 +25,18 @@ class Name(models.Model):
parent = models.ForeignKey('self', blank=True, null=True,related_name='children')
partof = models.ForeignKey('self', blank=True, null=True,related_name='parts')
acl = models.TextField(blank=True) # fully-qualified-name '#' rights
+ short = models.CharField(max_length=64,blank=True)
description = models.TextField(blank=True)
creator = models.ForeignKey(User)
timecreated = models.DateTimeField(auto_now_add=True)
lastupdated = models.DateTimeField(auto_now=True)
+ def shortname(self):
+ if self.short:
+ return self.short
+ else:
+ return self.__unicode__()
+
def relative_name(self):
if self.type:
return "%s=%s" % (self.type.name,self.value)
diff --git a/coip/apps/userprofile/__init__.py b/coip/apps/userprofile/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/coip/apps/userprofile/__init__.py
diff --git a/coip/apps/userprofile/admin.py b/coip/apps/userprofile/admin.py
new file mode 100644
index 0000000..32c1ad8
--- /dev/null
+++ b/coip/apps/userprofile/admin.py
@@ -0,0 +1,4 @@
+from django.contrib import admin
+from coip.apps.userprofile.models import UserProfile
+
+admin.site.register(UserProfile) \ No newline at end of file
diff --git a/coip/apps/userprofile/models.py b/coip/apps/userprofile/models.py
new file mode 100644
index 0000000..2387e36
--- /dev/null
+++ b/coip/apps/userprofile/models.py
@@ -0,0 +1,30 @@
+'''
+Created on Jul 5, 2010
+
+@author: leifj
+'''
+from django.db import models
+from django.contrib.auth.models import User
+
+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)
+ 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)
+ timecreated = models.DateTimeField(auto_now_add=True)
+ lastupdated = models.DateTimeField(auto_now=True)
+
+ def __unicode__(self):
+ return "%s [%s] - %s" % (self.identifier,self.user.username,self.display_name)
+
+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)
+
+ def __unicode__(self):
+ return "A merge-key for "+self.user_profile
+
+ \ No newline at end of file
diff --git a/coip/apps/userprofile/utils.py b/coip/apps/userprofile/utils.py
new file mode 100644
index 0000000..ecbc21a
--- /dev/null
+++ b/coip/apps/userprofile/utils.py
@@ -0,0 +1,29 @@
+'''
+Created on Jul 6, 2010
+
+@author: leifj
+'''
+from coip.apps.userprofile.models import UserProfile, PKey
+from django.core.exceptions import ObjectDoesNotExist
+
+def request_profile(request):
+ if request.user.is_authenticated():
+ if request.META.has_key('REMOTE_USER'):
+ return UserProfile.objects.get(identifier=request.META['REMOTE_USER'])
+ else:
+ return UserProfile.objects.get(user=request.user.id)
+ 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
new file mode 100644
index 0000000..36f6a48
--- /dev/null
+++ b/coip/apps/userprofile/views.py
@@ -0,0 +1,44 @@
+'''
+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 uuid import uuid4
+from coip.multiresponse import respond_to
+from coip.apps.membership.models import Membership
+from coip.apps.userprofile.utils import user_profile
+from django.core.exceptions import ObjectDoesNotExist
+from pprint import pprint
+
+@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=uuid4().hex)
+ k.save()
+ return HttpResponseRedirect("/accounts/login?next=/user/merge/"+k.key)
+
+@login_required
+def home(request):
+ memberships = []
+ try:
+ memberships = Membership.objects.filter(user=request.user)
+ except ObjectDoesNotExist:
+ pass
+
+ pprint(memberships)
+ return respond_to(request, {'text/html': 'apps/userprofile/home.html'},{'memberships': memberships})
+
+
diff --git a/coip/multiresponse.py b/coip/multiresponse.py
index 9a3d965..2e6dc5a 100644
--- a/coip/multiresponse.py
+++ b/coip/multiresponse.py
@@ -2,11 +2,10 @@ import coip.mimeparse as mimeparse
import re
from django.conf import settings
from django.shortcuts import render_to_response
-from django.core.exceptions import ObjectDoesNotExist
-from datetime import datetime
-from pprint import pprint
from django.http import HttpResponse
from django.core import serializers
+from coip.apps.userprofile.utils import user_profile
+from pprint import pprint
default_suffix_mapping = {"\.htm(l?)$": "text/html",
"\.json$": "application/json",
@@ -29,20 +28,7 @@ def make_response_dict(request,d={}):
if request.user.is_authenticated():
d['user'] = request.user
- profile = None
- try:
- profile = request.user.profile.get();
- except ObjectDoesNotExist:
- profile = UserProfile()
- d['profile'] = profile
-
- #d['stomp_host'] = STOMP_HOST
- #d['stomp_port'] = STOMP_PORT
- #d['orbited_prefix'] = ORBITED_PREFIX
- #d['announce_url'] = ANNOUNCE_URL
- #d['date'] = timeAsrfc822(datetime.now())
- #if DEBUG is not None:
- # d['debug'] = True
+ d['profile'] = user_profile(request)
return d
diff --git a/coip/urls.py b/coip/urls.py
index d24cc15..eda9440 100644
--- a/coip/urls.py
+++ b/coip/urls.py
@@ -2,16 +2,21 @@ from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
+from django.contrib.auth.views import login
+from settings import ADMIN_MEDIA_ROOT
+from settings import MEDIA_ROOT
admin.autodiscover()
urlpatterns = patterns('',
- # Example:
- # (r'^coip/', include('coip.foo.urls')),
-
- # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
- # to INSTALLED_APPS to enable admin documentation:
- # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
- # Uncomment the next line to enable the admin:
- (r'^admin/', include(admin.site.urls)),
+ (r'^admin-media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': ADMIN_MEDIA_ROOT}),
+ (r'^site-media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': MEDIA_ROOT}),
+ (r'^admin/', include(admin.site.urls)),
+ # Login/Logout
+ (r'^accounts/login/$', login,{'template_name': "login.html"}),
+ (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/home$', 'coip.apps.userprofile.views.home'),
)