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}) + + | 
