diff options
Diffstat (limited to 'coip/apps/userprofile/models.py')
-rw-r--r-- | coip/apps/userprofile/models.py | 79 |
1 files changed, 55 insertions, 24 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 |