summaryrefslogtreecommitdiff
path: root/coip/apps/userprofile
diff options
context:
space:
mode:
authorLeif Johansson <leifj@sunet.se>2011-08-18 10:41:41 +0200
committerLeif Johansson <leifj@sunet.se>2011-08-18 10:41:41 +0200
commit8b62502983ca646104f22ecb56cf97ff8922756a (patch)
tree6dea14dea1b13a8fdb919d9ada7f10a816876131 /coip/apps/userprofile
parent9d4561febd0489eb8cab1fc3654614b1a5ed17ac (diff)
new profile-model
Diffstat (limited to 'coip/apps/userprofile')
-rw-r--r--coip/apps/userprofile/models.py79
-rw-r--r--coip/apps/userprofile/utils.py32
-rw-r--r--coip/apps/userprofile/views.py41
3 files changed, 58 insertions, 94 deletions
diff --git a/coip/apps/userprofile/models.py b/coip/apps/userprofile/models.py
index 40751fb..6e2364a 100644
--- a/coip/apps/userprofile/models.py
+++ b/coip/apps/userprofile/models.py
@@ -5,39 +5,70 @@ 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 django.dispatch.dispatcher import receiver
+from django.db.models.signals import post_save
+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')
+
+ INTERNAL = 0
+ ENTITY = 1
+ SSHKEY = 2
+ GRIDCERT = 3
+ FEDID = 4
+
+ #
+ # User content
+ # 0 (internal) - normal
+ # 1 (entity) - username=entity:sha1(entityID), profile.display_name = display or entityID, profile.identifier = ssh key
+ # 2 (sshkey) - username=sshkey:fingerprint, profile.display_name = key alias or "SSH Key with fingerprint ..."
+ # 3 (gridcert) - username=x509:sha1-fingerprint, profile.display_name = dn, profile.identifier = PEM
+ # 4 (fedid) - username=eppn or equiv (REMOTE_USER),profile.display_name = display or eppn, profile.identifier = eppn, profile.authority = idp
+ #
+
+ user = models.OneToOneField(User)
+ home = models.ForeignKey(Name,blank=True,null=True)
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)
+ type = models.SmallIntegerField(choices=((ENTITY,"Connected Service"),
+ (INTERNAL,"System User"),
+ (SSHKEY,"SSH Key"),
+ (GRIDCERT,"eScience Certificate"),
+ (FEDID,"User Identity")))
+
+ authority = models.CharField(max_length=255,blank=True,null=True)
+ identifier = models.CharField(max_length=1023,blank=True,null=True)
+
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]
-
-def primary_profile(user):
- return UserProfile.objects.filter(user=user,primary=True)[0]
+def import_sshkey(keyfile):
+ fingerprint = "xxx"
+ user = User.objects.get_or_create(username="sshkey:%s" % fingerprint)
+def home_name(user,short=None,autocreate=False):
+ if short == None:
+ short = user.username
+ urn = lookup("urn",True)
+ anyuser = lookup("system:anyuser",True)
+ urn.setacl(anyuser,'rl')
-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)
+ home = lookup('user:'+user.username,autocreate=autocreate)
+ add_member(home,user,hidden=True)
+ home.setpacl(home, "rwlida")
+ home.setacl(home,"rwlia") #don't allow users to delete or reset acls on their home, nor invite members - that would be confusing as hell
+ home.short = short
+ home.save()
- def __unicode__(self):
- return "A merge-key for "+self.user_profile
+ return home
+
+@receiver(post_save,sender=User)
+def _create_profile(sender,**kwargs):
+ user = kwargs['instance']
+ profile,created = UserProfile.objects.get_or_create(user=user)
+ if profile.home == None:
+ profile.home = home_name(user,autocreate=True)
+ profile.save() \ No newline at end of file
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..a7b15e8 100644
--- a/coip/apps/userprofile/views.py
+++ b/coip/apps/userprofile/views.py
@@ -4,36 +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
@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):
memberships = []
try:
@@ -41,22 +19,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})
+ return respond_to(request, {'text/html': 'apps/userprofile/home.html'},{'memberships': memberships,'names': names})
@login_required
def search(request):