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: