''' Created on Jun 23, 2010 @author: leifj ''' from django.db import models from django.contrib.auth.models import User from coip.apps.name.models import Name import datetime import tagging from django.core.mail import send_mail from coip.settings import NOREPLY from coip.extensions.templatetags.userdisplay import userdisplay from coip.apps.userprofile.models import UserProfile from actstream.signals import action from coip.apps import scim STATUS = {UserProfile.INTERNAL:'internal', UserProfile.ENTITY:'entity', UserProfile.SSHKEY:'sshkey', UserProfile.X509:'certificate', UserProfile.FEDID:'fedid'} class Membership(models.Model): ''' Membership in a namespace/group ''' user = models.ForeignKey(User,related_name='memberships') name = models.ForeignKey(Name,related_name='memberships') enabled = models.BooleanField() hidden = models.BooleanField() timecreated = models.DateTimeField(auto_now_add=True) lastupdated = models.DateTimeField(auto_now=True) expires = models.DateTimeField(blank=True,null=True) def __unicode__(self): who = self.user status = "" if not self.enabled: status = " (disabled)" hidden = "" if self.hidden: hidden = " (hidden)" return "%s in %s%s%s" % (who,self.name,status,hidden) def valid(self): return self.enabled and datetime.date.today() > self.expires def status(self): if self.valid(): return "active" else: return "inactive"; def type(self): return STATUS[self.user.get_profile().type] def send_notification(self,what): if not self.user or not self.user.email: return send_mail('%s have been %s \'%s\'' % (userdisplay(self.user),what,self.name.short), ''' You have been %s \'%s\'. To view information about \'%s\' open this link in your browser: %s ''' % (what,self.name.shortname(),self.name.shortname(),self.name.url()), NOREPLY, [self.user.email], fail_silently=False) return def add_member(name,member_name,hidden=False,actor=None): (m,created) = Membership.objects.get_or_create(user=member_name,name=name) if created or not m.enabled or m.hidden != hidden: m.enabled = True m.hidden = hidden m.save() if name.nmembers != -1: name.nmembers = -1 name.save() if not m.hidden and actor: action.send(actor,action_object=m.user,verb='added to',target=m.name) return m.send_notification("added to") def disable_member(name,member_name,actor=None): m = Membership.objects.get(name=name,user=member_name) if m: m.enabled = False m.save() m.send_notification("temporarily removed from") if not m.hidden and actor: action.send(actor,action_object=m.user,verb='temporarily removed from',target=m.name) if name.nmembers != -1: name.nmembers = -1 name.save() def remove_member(name,member_name,actor=None): m = Membership.objects.get(name=name,user=member_name) if m: m.send_notification("removed from") if not m.hidden and actor: action.send(actor,action_object=m.user,verb='removed from',target=m.name) m.delete() if name.nmembers != -1: name.nmembers = -1 name.save() def has_member(name,member_name): return Membership.objects.filter(name=name,user=member_name) tagging.register(Membership) from coip.apps.scim.schema import scim_simple_attribute, ScimAttribute from coip.apps.resource.models import object_for_uuid class GroupSchema(): URI = 'urn:scim:schemas:core:1.0' ATTRIBUTES = ('externalId','displayName','members','parentId') externalId = scim_simple_attribute('url') displayName = scim_simple_attribute('display') class MembersAttribute(ScimAttribute): def __get__(self,o,objtype=None): return [ { 'display': userdisplay(m.user), 'value': m.user.uuid } for m in o.memberships.filter(hidden=False).all() ] def __set__(self,o,v): o.memberships = [] for i in v: member = object_for_uuid(v['value']) add_member(o,member) def __delete__(self,o): o.memberships.clear() def remove(self,o,v): member = object_for_uuid(v['value']) remove_member(o,member.username,actor="scim") def add(self,o,v): member = object_for_uuid(v['value']) add_member(o,member.username,actor="scim") class ParentAttribute(ScimAttribute): def __get__(self,o,objtype=None): if o.parent: return o.parent.uuid else: return None members = MembersAttribute() parentId = ParentAttribute() class UserSchema(): URI = 'urn:scim:schemas:core:1.0' ATTRIBUTES = ('externalId','userName') externalId = scim_simple_attribute('username') userName = scim_simple_attribute('username') scim.register(Name, "Groups", [GroupSchema()]) scim.register(User,"Users",[UserSchema()])