Django-suit, add in Roles for specific classes site, slice, deployment, planetstack, change admin to leverage suit options
diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py
index 2280822..1cc4d07 100644
--- a/planetstack/core/models/__init__.py
+++ b/planetstack/core/models/__init__.py
@@ -1,17 +1,25 @@
from .plcorebase import PlCoreBase
-from .deployment import Deployment
+from .planetstack import PlanetStack
from .project import Project
from .tag import Tag
+from .role import Role
+from .deployment import Deployment
from .site import Site
+from .user import User
+from .serviceclass import ServiceClass
+from .slice import Slice
from .site import SitePrivilege
from .image import Image
-from .user import User
-from .role import Role
from .node import Node
-from .serviceclass import ServiceClass
from .serviceresource import ServiceResource
-from .slice import Slice
-from .slice import SliceMembership
+from .slice import SliceRole
+from .slice import SlicePrivilege
+from .site import SiteRole
+from .site import SitePrivilege
+from .deployment import DeploymentRole
+from .deployment import DeploymentPrivilege
+from .planetstack import PlanetStackRole
+from .planetstack import PlanetStackPrivilege
from .slicetag import SliceTag
from .sliver import Sliver
from .reservation import ReservedResource
diff --git a/planetstack/core/models/deployment.py b/planetstack/core/models/deployment.py
index d38115f..4e835d0 100644
--- a/planetstack/core/models/deployment.py
+++ b/planetstack/core/models/deployment.py
@@ -1,11 +1,30 @@
import os
from django.db import models
from core.models import PlCoreBase
+from core.models import Member
+from django.contrib.contenttypes import generic
# Create your models here.
class Deployment(PlCoreBase):
name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
+ members = generic.GenericRelation(Member)
def __unicode__(self): return u'%s' % (self.name)
+
+class DeploymentRole(PlCoreBase):
+
+ ROLE_CHOICES = (('admin','Admin'),)
+ role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
+
+ def __unicode__(self): return u'%s' % (self.role)
+
+class DeploymentPrivilege(PlCoreBase):
+
+ user = models.ForeignKey('User', related_name='deployment_privileges')
+ deployment = models.ForeignKey('Deployment', related_name='deployment_privileges')
+ role = models.ForeignKey('DeploymentRole')
+
+ def __unicode__(self): return u'%s %s %s' % (self.deployment, self.user, self.role)
+
diff --git a/planetstack/core/models/planetstack.py b/planetstack/core/models/planetstack.py
new file mode 100644
index 0000000..9007a51
--- /dev/null
+++ b/planetstack/core/models/planetstack.py
@@ -0,0 +1,30 @@
+import os
+from django.db import models
+from core.models import PlCoreBase
+
+# Create your models here.
+
+class PlanetStack(PlCoreBase):
+ description = models.CharField(max_length=200, unique=True, default="PlanetStack", help_text="Used for scoping of roles at the PlanetStack Application level")
+
+ class Meta:
+ verbose_name_plural = "PlanetStack"
+ app_label = "core"
+
+ def __unicode__(self): return u'%s' % (self.description)
+
+class PlanetStackRole(PlCoreBase):
+ ROLE_CHOICES = (('admin','Admin'),)
+ role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
+
+ def __unicode__(self): return u'%s' % (self.role)
+
+class PlanetStackPrivilege(PlCoreBase):
+ user = models.ForeignKey('User', related_name='planetstack_privileges')
+ planetstack = models.ForeignKey('PlanetStack', related_name='planetstack_privileges', default=1)
+ role = models.ForeignKey('PlanetStackRole')
+
+ def __unicode__(self): return u'%s %s %s' % (self.planetstack, self.user, self.role)
+
+
+
diff --git a/planetstack/core/models/role.py b/planetstack/core/models/role.py
index fd29848..234868e 100644
--- a/planetstack/core/models/role.py
+++ b/planetstack/core/models/role.py
@@ -2,14 +2,16 @@
import datetime
from django.db import models
from core.models import PlCoreBase
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.contenttypes import generic
class Role(PlCoreBase):
- ROLE_CHOICES = (('admin', 'Admin'), ('pi', 'Principle Investigator'), ('tech', 'Technician'), ('user','User'))
- role = models.CharField(null=True, blank=True,max_length=256, unique=True, choices=ROLE_CHOICES)
- role_type = models.CharField(max_length=80, unique=True)
+ role_type = models.CharField(max_length=80, verbose_name="Name")
+ description = models.CharField(max_length=120, verbose_name="Description")
+ content_type = models.ForeignKey(ContentType, verbose_name="Role Scope")
- def __unicode__(self): return u'%s' % (self.role_type)
+ def __unicode__(self): return u'%s:%s' % (self.content_type,self.role_type)
def save(self, *args, **kwds):
diff --git a/planetstack/core/models/site.py b/planetstack/core/models/site.py
index 8a6d7c4..aee3843 100644
--- a/planetstack/core/models/site.py
+++ b/planetstack/core/models/site.py
@@ -24,11 +24,18 @@
def __unicode__(self): return u'%s' % (self.name)
+class SiteRole(PlCoreBase):
+
+ ROLE_CHOICES = (('admin','Admin'),('pi','PI'),('tech','Tech'),('billing','Billing'))
+ role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
+
+ def __unicode__(self): return u'%s' % (self.role)
+
class SitePrivilege(PlCoreBase):
user = models.ForeignKey('User', related_name='site_privileges')
site = models.ForeignKey('Site', related_name='site_privileges')
- role = models.ForeignKey('Role')
+ role = models.ForeignKey('SiteRole')
def __unicode__(self): return u'%s %s %s' % (self.site, self.user, self.role)
diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py
index 74815b2..e584c07 100644
--- a/planetstack/core/models/slice.py
+++ b/planetstack/core/models/slice.py
@@ -40,15 +40,16 @@
self.creator = self.caller
super(Slice, self).save(*args, **kwds)
-class SliceMembership(PlCoreBase):
- user = models.ForeignKey('User', related_name='slice_memberships')
- slice = models.ForeignKey('Slice', related_name='slice_memberships')
- role = models.ForeignKey('Role')
+class SliceRole(PlCoreBase):
+ ROLE_CHOICES = (('admin','Admin'),('default','Default'))
+
+ role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
+
+ def __unicode__(self): return u'%s' % (self.role)
+
+class SlicePrivilege(PlCoreBase):
+ user = models.ForeignKey('User', related_name='slice_privileges')
+ slice = models.ForeignKey('Slice', related_name='slice_privileges')
+ role = models.ForeignKey('SliceRole')
def __unicode__(self): return u'%s %s %s' % (self.slice, self.user, self.role)
-
- def save(self, *args, **kwds):
- super(SliceMembership, self).save(*args, **kwds)
-
- def delete(self, *args, **kwds):
- super(SliceMembership, self).delete(*args, **kwds)
diff --git a/planetstack/core/models/user.py b/planetstack/core/models/user.py
index 758bcbf..2b63dda 100644
--- a/planetstack/core/models/user.py
+++ b/planetstack/core/models/user.py
@@ -2,11 +2,11 @@
import datetime
from collections import defaultdict
from django.db import models
-from core.models import PlCoreBase
-from core.models import Site
+from core.models import PlCoreBase,Site
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from timezones.fields import TimeZoneField
+
# Create your models here.
class UserManager(BaseUserManager):
def create_user(self, email, firstname, lastname, password=None):
@@ -54,6 +54,7 @@
unique=True,
db_index=True,
)
+ username = models.CharField(max_length=200, default="Something" )
kuser_id = models.CharField(null=True, blank=True, help_text="keystone user id", max_length=200)
firstname = models.CharField(help_text="person's given name", max_length=200)
@@ -61,7 +62,7 @@
phone = models.CharField(null=True, blank=True, help_text="phone number contact", max_length=100)
user_url = models.URLField(null=True, blank=True)
- site = models.ForeignKey(Site, related_name='users', verbose_name="Site this user will be homed too", null=True)
+ site = models.ForeignKey(Site, related_name='users', help_text="Site this user will be homed too", null=True)
public_key = models.TextField(null=True, blank=True, max_length=1024, help_text="Public key string")
is_active = models.BooleanField(default=True)
@@ -104,18 +105,21 @@
# Simplest possible answer: Yes, always
return True
- def get_roles(self):
- from core.models.site import SitePrivilege
- from core.models.slice import SliceMembership
+ def is_superuser(self):
+ return False
- site_privileges = SitePrivilege.objects.filter(user=self)
- slice_memberships = SliceMembership.objects.filter(user=self)
- roles = defaultdict(list)
- for site_privilege in site_privileges:
- roles[site_privilege.role.role_type].append(site_privilege.site.login_base)
- for slice_membership in slice_memberships:
- roles[slice_membership.role.role_type].append(slice_membership.slice.name)
- return roles
+# def get_roles(self):
+# from core.models.site import SitePrivilege
+# from core.models.slice import SliceMembership
+#
+# site_privileges = SitePrivilege.objects.filter(user=self)
+# slice_memberships = SliceMembership.objects.filter(user=self)
+# roles = defaultdict(list)
+# for site_privilege in site_privileges:
+# roles[site_privilege.role.role_type].append(site_privilege.site.login_base)
+# for slice_membership in slice_memberships:
+# roles[slice_membership.role.role_type].append(slice_membership.slice.name)
+# return roles
def save(self, *args, **kwds):
if not self.id: