diff options
Diffstat (limited to 'coip/apps')
-rw-r--r-- | coip/apps/auth/__init__.py | 0 | ||||
-rw-r--r-- | coip/apps/auth/views.py | 63 | ||||
-rw-r--r-- | coip/apps/invitation/views.py | 4 | ||||
-rw-r--r-- | coip/apps/membership/models.py | 9 | ||||
-rw-r--r-- | coip/apps/name/models.py | 7 | ||||
-rw-r--r-- | coip/apps/userprofile/__init__.py | 0 | ||||
-rw-r--r-- | coip/apps/userprofile/admin.py | 4 | ||||
-rw-r--r-- | coip/apps/userprofile/models.py | 30 | ||||
-rw-r--r-- | coip/apps/userprofile/utils.py | 29 | ||||
-rw-r--r-- | coip/apps/userprofile/views.py | 44 |
10 files changed, 188 insertions, 2 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}) + + |