blob: 87dbaab4a79a8d9d4b37de550373baf6b603cc25 [file] [log] [blame]
from xosresource import XOSResource
from core.models import User, Site, SiteRole, SliceRole, SlicePrivilege, SitePrivilege, DashboardView, UserDashboardView
class XOSUser(XOSResource):
provides = "tosca.nodes.User"
xos_model = User
name_field = "email"
copyin_props = ["password", "firstname", "lastname", "phone", "user_url", "public_key", "is_active", "is_admin", "is_readonly", "is_appuser", "login_page"]
def get_xos_args(self):
args = super(XOSUser, self).get_xos_args()
site_name = self.get_requirement("tosca.relationships.MemberOfSite")
if site_name:
args["site"] = self.get_xos_object(Site, login_base=site_name)
return args
def get_existing_objs(self):
return self.xos_model.objects.filter(email = self.obj_name)
def postprocess(self, obj):
rolemap = ( ("tosca.relationships.AdminPrivilege", "admin"), ("tosca.relationships.AccessPrivilege", "access"),
("tosca.relationships.PIPrivilege", "pi"), ("tosca.relationships.TechPrivilege", "tech") )
for (rel, role) in rolemap:
for obj_name in self.get_requirements(rel):
dest = self.engine.name_to_xos_model(self.user, obj_name)
if dest.__class__.__name__ == "Slice":
role_obj = self.get_xos_object(SliceRole, role=role)
if not Privilege.objects.filter(accessor_id=obj.id, permission='role:'+role_obj.role, object_id=dest.id, accessor_type='User', object_type='Slice'):
sp = Privilege(accessor_id=obj.id, permission='role:'+role_obj.role, object_id=dest.id, accessor_type='User', object_type='Slice')
sp.save()
self.info("Added slice privilege on %s role %s for %s" % (str(dest), str(role), str(obj)))
elif dest.__class__.__name__ == "Site":
role_obj = self.get_xos_object(SiteRole, role=role)
if not Privilege.objects.filter(accessor_id=obj.id, permission='role:'+role_obj.role, object_id=dest.id, accessor_type='User', object_type='Site'):
sp = SitePrivilege(accessor_id=obj.id, permission='role:'+role_obj.role, object_id=dest.id, accessor_type='User', object_type='Site')
sp.save()
self.info("Added site privilege on %s role %s for %s" % (str(dest), str(role), str(obj)))
dashboard_order = 10
for reqs in self.nodetemplate.requirements:
for (k,v) in reqs.items():
if (v["relationship"] == "tosca.relationships.UsesDashboard"):
dashboard_name = v["node"]
dashboard = self.get_xos_object(DashboardView, name=dashboard_name)
udvs = UserDashboardView.objects.filter(user=obj, dashboardView=dashboard)
if not udvs:
self.info("Adding UserDashboardView from %s to %s" % (obj, dashboard))
udv = UserDashboardView(user=obj, dashboardView=dashboard, order=dashboard_order)
dashboard_order += 10
udv.save()
def create(self):
xos_args = self.get_xos_args()
if not xos_args.get("site",None):
raise Exception("Site name must be specified when creating user")
if ("firstname" not in xos_args) or ("lastname" not in xos_args):
raise Exception("firstname and lastname must be specified when creating user")
user = User(**xos_args)
user.save()
self.postprocess(user)
self.info("Created User '%s'" % (str(user), ))
def update(self, obj):
xos_args = self.get_xos_args()
password = None
if "password" in xos_args:
# password needs to be set with set_password function
password = xos_args["password"]
del xos_args["password"]
for (k,v) in xos_args.items():
setattr(obj, k, v)
if password:
obj.set_password(password)
self.postprocess(obj)
obj.save()
def delete(self, obj):
if obj.slices.exists():
self.info("User %s has active slices; skipping delete" % obj.name)
return
super(XOSUser, self).delete(obj)