diff --git a/planetstack/genapi.py b/planetstack/genapi.py
index cc7d85d..86a5dd3 100644
--- a/planetstack/genapi.py
+++ b/planetstack/genapi.py
@@ -2,6 +2,7 @@
 from rest_framework.response import Response
 from rest_framework.reverse import reverse
 from rest_framework import serializers
+from rest_framework import generics
 from core.models import *
 from django.forms import widgets
 
@@ -31,36 +32,40 @@
 		'sliceroles': reverse('slicerole-list', request=request, format=format),
 		'tags': reverse('tag-list', request=request, format=format),
 		'invoices': reverse('invoice-list', request=request, format=format),
-		'sliceprivileges': reverse('sliceprivilege-list', request=request, format=format),
 		'planetstackroles': reverse('planetstackrole-list', request=request, format=format),
+		'sliceprivileges': reverse('sliceprivilege-list', request=request, format=format),
 		'networkslivers': reverse('networksliver-list', request=request, format=format),
-		'projects': reverse('project-list', request=request, format=format),
+		'networkdeploymentses': reverse('networkdeployments-list', request=request, format=format),
 		'slices': reverse('slice-list', request=request, format=format),
 		'networks': reverse('network-list', request=request, format=format),
 		'services': reverse('service-list', request=request, format=format),
 		'serviceclasses': reverse('serviceclass-list', request=request, format=format),
-		'siteroles': reverse('siterole-list', request=request, format=format),
+		'payments': reverse('payment-list', request=request, format=format),
 		'charges': reverse('charge-list', request=request, format=format),
 		'roles': reverse('role-list', request=request, format=format),
 		'usableobjects': reverse('usableobject-list', request=request, format=format),
+		'siteroles': reverse('siterole-list', request=request, format=format),
 		'slivers': reverse('sliver-list', request=request, format=format),
 		'nodes': reverse('node-list', request=request, format=format),
+		'dashboardviews': reverse('dashboardview-list', request=request, format=format),
+		'imagedeploymentses': reverse('imagedeployments-list', request=request, format=format),
 		'reservedresources': reverse('reservedresource-list', request=request, format=format),
-		'payments': reverse('payment-list', request=request, format=format),
 		'networkslices': reverse('networkslice-list', request=request, format=format),
+		'userdashboardviews': reverse('userdashboardview-list', request=request, format=format),
 		'planetstackprivileges': reverse('planetstackprivilege-list', request=request, format=format),
 		'users': reverse('user-list', request=request, format=format),
 		'deployments': reverse('deployment-list', request=request, format=format),
 		'reservations': reverse('reservation-list', request=request, format=format),
+		'slicedeploymentses': reverse('slicedeployments-list', request=request, format=format),
 		'siteprivileges': reverse('siteprivilege-list', request=request, format=format),
-		'singletonmodels': reverse('singletonmodel-list', request=request, format=format),
 		'planetstacks': reverse('planetstack-list', request=request, format=format),
+		'userdeploymentses': reverse('userdeployments-list', request=request, format=format),
 		'accounts': reverse('account-list', request=request, format=format),
 		'networkparametertypes': reverse('networkparametertype-list', request=request, format=format),
 		'sitedeploymentses': reverse('sitedeployments-list', request=request, format=format),
 		'deploymentprivileges': reverse('deploymentprivilege-list', request=request, format=format),
 		'deploymentroles': reverse('deploymentrole-list', request=request, format=format),
-		'plcorebases': reverse('plcorebase-list', request=request, format=format),
+		'projects': reverse('project-list', request=request, format=format),
 		'slicetags': reverse('slicetag-list', request=request, format=format),
 		'networktemplates': reverse('networktemplate-list', request=request, format=format),
 		'routers': reverse('router-list', request=request, format=format),
@@ -72,29 +77,27 @@
 
 
 
-class ServiceattributeSerializer(serializers.HyperlinkedModelSerializer):
+class ServiceAttributeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	services = serializers.HyperlinkedRelatedField(view_name='service-detail')
-	
 	class Meta:
-		model = serviceattribute
-		fields = ('id','created','updated','enacted','name','value',)
+		model = ServiceAttribute
+		fields = ('id','created','updated','enacted','name','value','service',)
 
 
 class ImageSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = image
-		fields = ('id','created','updated','enacted','image_id','name','disk_format','container_format',)
+		model = Image
+		fields = ('id','created','updated','enacted','name','disk_format','container_format','path',)
 
 
-class NetworkparameterSerializer(serializers.HyperlinkedModelSerializer):
+class NetworkParameterSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = networkparameter
+		model = NetworkParameter
 		fields = ('id','created','updated','enacted','parameter','value','content_type','object_id',)
 
 
@@ -102,359 +105,387 @@
 	id = serializers.Field()
 	
 	class Meta:
-		model = site
-		fields = ('id','created','updated','enacted','tenant_id','name','site_url','enabled','location','longitude','latitude','login_base','is_public','abbreviated_name',)
+		model = Site
+		fields = ('id','created','updated','enacted','name','site_url','enabled','location','longitude','latitude','login_base','is_public','abbreviated_name',)
 
 
-class SliceroleSerializer(serializers.HyperlinkedModelSerializer):
+class SliceRoleSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = slicerole
+		model = SliceRole
 		fields = ('id','created','updated','enacted','role',)
 
 
 class TagSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	services = serializers.HyperlinkedRelatedField(view_name='service-detail')
+	
+	sites = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='site-detail')
+	
+	
+	
+	slices = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='slice-detail')
+	
+	
+	
+	slivers = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='sliver-detail')
+	
+	
+	
+	nodes = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='node-detail')
+	
 	
 	class Meta:
-		model = tag
-		fields = ('id','created','updated','enacted','name','value','content_type','object_id',)
+		model = Tag
+		fields = ('id','created','updated','enacted','service','name','value','content_type','object_id','sites','slices','slivers','nodes',)
 
 
 class InvoiceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	accounts = serializers.HyperlinkedRelatedField(view_name='account-detail')
-	
 	class Meta:
-		model = invoice
-		fields = ('id','created','updated','enacted','date',)
+		model = Invoice
+		fields = ('id','created','updated','enacted','date','account',)
 
 
-class SliceprivilegeSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	users = serializers.HyperlinkedRelatedField(view_name='user-detail')
-	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-	
-	roles = serializers.HyperlinkedRelatedField(view_name='role-detail')
-	
-	class Meta:
-		model = sliceprivilege
-		fields = ('id','created','updated','enacted',)
-
-
-class PlanetstackroleSerializer(serializers.HyperlinkedModelSerializer):
+class PlanetStackRoleSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = planetstackrole
+		model = PlanetStackRole
 		fields = ('id','created','updated','enacted','role',)
 
 
-class NetworksliverSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	networks = serializers.HyperlinkedRelatedField(view_name='network-detail')
-	
-	slivers = serializers.HyperlinkedRelatedField(view_name='sliver-detail')
-	
-	class Meta:
-		model = networksliver
-		fields = ('id','created','updated','enacted','ip','port_id',)
-
-
-class ProjectSerializer(serializers.HyperlinkedModelSerializer):
+class SlicePrivilegeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = project
-		fields = ('id','created','updated','enacted','name',)
+		model = SlicePrivilege
+		fields = ('id','created','updated','enacted','user','slice','role',)
+
+
+class NetworkSliverSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = NetworkSliver
+		fields = ('id','created','updated','enacted','network','sliver','ip','port_id',)
+
+
+class NetworkDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = NetworkDeployments
+		fields = ('id','created','updated','enacted','network','deployment','net_id','router_id','subnet_id','subnet',)
 
 
 class SliceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
 	
-	services = serializers.HyperlinkedRelatedField(view_name='service-detail')
+	networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
+	
+	
+	
+	availableNetworks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
+	
+	
+	
+	networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
+	
+	
+	
+	networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
+	
 	
 	class Meta:
-		model = slice
-		fields = ('id','created','updated','enacted','tenant_id','name','enabled','omf_friendly','description','slice_url','network_id','router_id','subnet_id','serviceClass','creator',)
+		model = Slice
+		fields = ('id','created','updated','enacted','name','enabled','omf_friendly','description','slice_url','site','max_slivers','imagePreference','service','network','mountDataSets','serviceClass','creator','networks','availableNetworks','networks','networks',)
 
 
 class NetworkSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
+	
+	routers = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='router-detail')
+	
+	
+	
+	availableRouters = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='router-detail')
+	
+	
+	
+	routers = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='router-detail')
+	
+	
+	
+	routers = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='router-detail')
+	
+	
 	class Meta:
-		model = network
-		fields = ('id','created','updated','enacted','name','template','subnet','ports','labels','owner','guaranteedBandwidth','permitAllSlices','network_id','router_id','subnet_id',)
+		model = Network
+		fields = ('id','created','updated','enacted','name','template','subnet','ports','labels','owner','guaranteedBandwidth','permitAllSlices','network_id','router_id','subnet_id','routers','availableRouters','routers','routers',)
 
 
 class ServiceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = service
+		model = Service
 		fields = ('id','created','updated','enacted','description','enabled','name','versionNumber','published',)
 
 
-class ServiceclassSerializer(serializers.HyperlinkedModelSerializer):
+class ServiceClassSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = serviceclass
+		model = ServiceClass
 		fields = ('id','created','updated','enacted','name','description','commitment','membershipFee','membershipFeeMonths','upgradeRequiresApproval',)
 
 
-class SiteroleSerializer(serializers.HyperlinkedModelSerializer):
+class PaymentSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = siterole
-		fields = ('id','created','updated','enacted','role',)
+		model = Payment
+		fields = ('id','created','updated','enacted','account','amount','date',)
 
 
 class ChargeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	accounts = serializers.HyperlinkedRelatedField(view_name='account-detail')
-	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-	
-	invoices = serializers.HyperlinkedRelatedField(view_name='invoice-detail')
-	
 	class Meta:
-		model = charge
-		fields = ('id','created','updated','enacted','kind','state','date','object','amount','coreHours',)
+		model = Charge
+		fields = ('id','created','updated','enacted','account','slice','kind','state','date','object','amount','coreHours','invoice',)
 
 
 class RoleSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = role
+		model = Role
 		fields = ('id','created','updated','enacted','role_type','role','description','content_type',)
 
 
-class UsableobjectSerializer(serializers.HyperlinkedModelSerializer):
+class UsableObjectSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = usableobject
+		model = UsableObject
 		fields = ('id','created','updated','enacted','name',)
 
 
+class SiteRoleSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = SiteRole
+		fields = ('id','created','updated','enacted','role',)
+
+
 class SliverSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	images = serializers.HyperlinkedRelatedField(view_name='image-detail')
 	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
+	networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
 	
-	nodes = serializers.HyperlinkedRelatedField(view_name='node-detail')
+	
+	
+	networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')
+	
+	
+	
+#	upgradeFrom_rel_+ = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='serviceclass-detail')
+	
 	
 	class Meta:
-		model = sliver
-		fields = ('id','created','updated','enacted','instance_id','name','instance_name','ip','creator','deploymentNetwork','numberCores',)
+		model = Sliver
+		fields = ('id','created','updated','enacted','instance_id','name','instance_name','ip','image','creator','slice','node','deploymentNetwork','numberCores','userData','networks','networks','upgradeFrom_rel_+',)
 
 
 class NodeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
-	
-	deployments = serializers.HyperlinkedRelatedField(view_name='deployment-detail')
-	
 	class Meta:
-		model = node
-		fields = ('id','created','updated','enacted','name',)
+		model = Node
+		fields = ('id','created','updated','enacted','name','site','deployment',)
 
 
-class ReservedresourceSerializer(serializers.HyperlinkedModelSerializer):
+class DashboardViewSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	slivers = serializers.HyperlinkedRelatedField(view_name='sliver-detail')
-	
 	class Meta:
-		model = reservedresource
-		fields = ('id','created','updated','enacted','resource','quantity','reservationSet',)
+		model = DashboardView
+		fields = ('id','created','updated','enacted','name','url',)
 
 
-class PaymentSerializer(serializers.HyperlinkedModelSerializer):
+class ImageDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	accounts = serializers.HyperlinkedRelatedField(view_name='account-detail')
-	
 	class Meta:
-		model = payment
-		fields = ('id','created','updated','enacted','amount','date',)
+		model = ImageDeployments
+		fields = ('id','created','updated','enacted','image','deployment','glance_image_id',)
 
 
-class NetworksliceSerializer(serializers.HyperlinkedModelSerializer):
+class ReservedResourceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	networks = serializers.HyperlinkedRelatedField(view_name='network-detail')
-	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-	
 	class Meta:
-		model = networkslice
-		fields = ('id','created','updated','enacted',)
+		model = ReservedResource
+		fields = ('id','created','updated','enacted','sliver','resource','quantity','reservationSet',)
 
 
-class PlanetstackprivilegeSerializer(serializers.HyperlinkedModelSerializer):
+class NetworkSliceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	users = serializers.HyperlinkedRelatedField(view_name='user-detail')
-	
-	planetstacks = serializers.HyperlinkedRelatedField(view_name='planetstack-detail')
-	
-	roles = serializers.HyperlinkedRelatedField(view_name='role-detail')
+	class Meta:
+		model = NetworkSlice
+		fields = ('id','created','updated','enacted','network','slice',)
+
+
+class UserDashboardViewSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
 	
 	class Meta:
-		model = planetstackprivilege
-		fields = ('id','created','updated','enacted',)
+		model = UserDashboardView
+		fields = ('id','created','updated','enacted','user','dashboardView','order',)
+
+
+class PlanetStackPrivilegeSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = PlanetStackPrivilege
+		fields = ('id','created','updated','enacted','user','planetstack','role',)
 
 
 class UserSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
-	
 	class Meta:
-		model = user
-		fields = ('id','password','last_login','email','username','kuser_id','firstname','lastname','phone','user_url','public_key','is_active','is_admin','is_staff','is_readonly','created','updated','enacted','timezone',)
+		model = User
+		fields = ('id','password','last_login','email','username','firstname','lastname','phone','user_url','site','public_key','is_active','is_admin','is_staff','is_readonly','created','updated','enacted','timezone',)
 
 
 class DeploymentSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
+	
+	sites = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='site-detail')
+	
+	
+	
+	sites = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='site-detail')
+	
+	
 	class Meta:
-		model = deployment
-		fields = ('id','created','updated','enacted','name',)
+		model = Deployment
+		fields = ('id','created','updated','enacted','name','admin_user','admin_password','admin_tenant','auth_url','accessControl','sites','sites',)
 
 
 class ReservationSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-	
 	class Meta:
-		model = reservation
-		fields = ('id','created','updated','enacted','startTime','duration',)
+		model = Reservation
+		fields = ('id','created','updated','enacted','startTime','slice','duration',)
 
 
-class SiteprivilegeSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	users = serializers.HyperlinkedRelatedField(view_name='user-detail')
-	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
-	
-	roles = serializers.HyperlinkedRelatedField(view_name='role-detail')
-	
-	class Meta:
-		model = siteprivilege
-		fields = ('id','created','updated','enacted',)
-
-
-class SingletonmodelSerializer(serializers.HyperlinkedModelSerializer):
+class SliceDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = singletonmodel
-		fields = ()
+		model = SliceDeployments
+		fields = ('id','created','updated','enacted','slice','deployment','tenant_id','network_id','router_id','subnet_id',)
 
 
-class PlanetstackSerializer(serializers.HyperlinkedModelSerializer):
+class SitePrivilegeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = planetstack
+		model = SitePrivilege
+		fields = ('id','created','updated','enacted','user','site','role',)
+
+
+class PlanetStackSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = PlanetStack
 		fields = ('id','created','updated','enacted','description',)
 
 
+class UserDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = UserDeployments
+		fields = ('id','created','updated','enacted','user','deployment','kuser_id',)
+
+
 class AccountSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
-	
 	class Meta:
-		model = account
-		fields = ('id','created','updated','enacted',)
+		model = Account
+		fields = ('id','created','updated','enacted','site',)
 
 
-class NetworkparametertypeSerializer(serializers.HyperlinkedModelSerializer):
+class NetworkParameterTypeSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = networkparametertype
+		model = NetworkParameterType
 		fields = ('id','created','updated','enacted','name','description',)
 
 
-class SitedeploymentsSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
-	
-	deployments = serializers.HyperlinkedRelatedField(view_name='deployment-detail')
-	
-	class Meta:
-		model = sitedeployments
-		fields = ('id','created','updated','enacted',)
-
-
-class DeploymentprivilegeSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	users = serializers.HyperlinkedRelatedField(view_name='user-detail')
-	
-	deployments = serializers.HyperlinkedRelatedField(view_name='deployment-detail')
-	
-	roles = serializers.HyperlinkedRelatedField(view_name='role-detail')
-	
-	class Meta:
-		model = deploymentprivilege
-		fields = ('id','created','updated','enacted',)
-
-
-class DeploymentroleSerializer(serializers.HyperlinkedModelSerializer):
+class SiteDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = deploymentrole
+		model = SiteDeployments
+		fields = ('id','created','updated','enacted','site','deployment','tenant_id',)
+
+
+class DeploymentPrivilegeSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = DeploymentPrivilege
+		fields = ('id','created','updated','enacted','user','deployment','role',)
+
+
+class DeploymentRoleSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = DeploymentRole
 		fields = ('id','created','updated','enacted','role',)
 
 
-class PlcorebaseSerializer(serializers.HyperlinkedModelSerializer):
+class ProjectSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = plcorebase
-		fields = ('created','updated','enacted',)
+		model = Project
+		fields = ('id','created','updated','enacted','name',)
 
 
-class SlicetagSerializer(serializers.HyperlinkedModelSerializer):
-	id = serializers.Field()
-	
-	slices = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-	
-	class Meta:
-		model = slicetag
-		fields = ('id','created','updated','enacted','name','value',)
-
-
-class NetworktemplateSerializer(serializers.HyperlinkedModelSerializer):
+class SliceTagSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = networktemplate
+		model = SliceTag
+		fields = ('id','created','updated','enacted','slice','name','value',)
+
+
+class NetworkTemplateSerializer(serializers.HyperlinkedModelSerializer):
+	id = serializers.Field()
+	
+	class Meta:
+		model = NetworkTemplate
 		fields = ('id','created','updated','enacted','name','description','guaranteedBandwidth','visibility','translation','sharedNetworkName','sharedNetworkId',)
 
 
@@ -462,41 +493,41 @@
 	id = serializers.Field()
 	
 	class Meta:
-		model = router
+		model = Router
 		fields = ('id','created','updated','enacted','name','owner',)
 
 
-class ServiceresourceSerializer(serializers.HyperlinkedModelSerializer):
+class ServiceResourceSerializer(serializers.HyperlinkedModelSerializer):
 	id = serializers.Field()
 	
 	class Meta:
-		model = serviceresource
+		model = ServiceResource
 		fields = ('id','created','updated','enacted','serviceClass','name','maxUnitsDeployment','maxUnitsNode','maxDuration','bucketInRate','bucketMaxSize','cost','calendarReservable',)
 
 
 serializerLookUp = { 
 
-                 Serviceattribute: ServiceattributeSerializer,
+                 ServiceAttribute: ServiceAttributeSerializer,
 
                  Image: ImageSerializer,
 
-                 Networkparameter: NetworkparameterSerializer,
+                 NetworkParameter: NetworkParameterSerializer,
 
                  Site: SiteSerializer,
 
-                 Slicerole: SliceroleSerializer,
+                 SliceRole: SliceRoleSerializer,
 
                  Tag: TagSerializer,
 
                  Invoice: InvoiceSerializer,
 
-                 Sliceprivilege: SliceprivilegeSerializer,
+                 PlanetStackRole: PlanetStackRoleSerializer,
 
-                 Planetstackrole: PlanetstackroleSerializer,
+                 SlicePrivilege: SlicePrivilegeSerializer,
 
-                 Networksliver: NetworksliverSerializer,
+                 NetworkSliver: NetworkSliverSerializer,
 
-                 Project: ProjectSerializer,
+                 NetworkDeployments: NetworkDeploymentsSerializer,
 
                  Slice: SliceSerializer,
 
@@ -504,27 +535,33 @@
 
                  Service: ServiceSerializer,
 
-                 Serviceclass: ServiceclassSerializer,
+                 ServiceClass: ServiceClassSerializer,
 
-                 Siterole: SiteroleSerializer,
+                 Payment: PaymentSerializer,
 
                  Charge: ChargeSerializer,
 
                  Role: RoleSerializer,
 
-                 Usableobject: UsableobjectSerializer,
+                 UsableObject: UsableObjectSerializer,
+
+                 SiteRole: SiteRoleSerializer,
 
                  Sliver: SliverSerializer,
 
                  Node: NodeSerializer,
 
-                 Reservedresource: ReservedresourceSerializer,
+                 DashboardView: DashboardViewSerializer,
 
-                 Payment: PaymentSerializer,
+                 ImageDeployments: ImageDeploymentsSerializer,
 
-                 Networkslice: NetworksliceSerializer,
+                 ReservedResource: ReservedResourceSerializer,
 
-                 Planetstackprivilege: PlanetstackprivilegeSerializer,
+                 NetworkSlice: NetworkSliceSerializer,
+
+                 UserDashboardView: UserDashboardViewSerializer,
+
+                 PlanetStackPrivilege: PlanetStackPrivilegeSerializer,
 
                  User: UserSerializer,
 
@@ -532,31 +569,33 @@
 
                  Reservation: ReservationSerializer,
 
-                 Siteprivilege: SiteprivilegeSerializer,
+                 SliceDeployments: SliceDeploymentsSerializer,
 
-                 Singletonmodel: SingletonmodelSerializer,
+                 SitePrivilege: SitePrivilegeSerializer,
 
-                 Planetstack: PlanetstackSerializer,
+                 PlanetStack: PlanetStackSerializer,
+
+                 UserDeployments: UserDeploymentsSerializer,
 
                  Account: AccountSerializer,
 
-                 Networkparametertype: NetworkparametertypeSerializer,
+                 NetworkParameterType: NetworkParameterTypeSerializer,
 
-                 Sitedeployments: SitedeploymentsSerializer,
+                 SiteDeployments: SiteDeploymentsSerializer,
 
-                 Deploymentprivilege: DeploymentprivilegeSerializer,
+                 DeploymentPrivilege: DeploymentPrivilegeSerializer,
 
-                 Deploymentrole: DeploymentroleSerializer,
+                 DeploymentRole: DeploymentRoleSerializer,
 
-                 Plcorebase: PlcorebaseSerializer,
+                 Project: ProjectSerializer,
 
-                 Slicetag: SlicetagSerializer,
+                 SliceTag: SliceTagSerializer,
 
-                 Networktemplate: NetworktemplateSerializer,
+                 NetworkTemplate: NetworkTemplateSerializer,
 
                  Router: RouterSerializer,
 
-                 Serviceresource: ServiceresourceSerializer,
+                 ServiceResource: ServiceResourceSerializer,
 
                  None: None,
                 }
@@ -564,411 +603,1803 @@
 # Based on core/views/*.py
 
 
-class ServiceattributeList(generics.ListCreateAPIView):
-    queryset = Serviceattribute.objects.all()
-    serializer_class = ServiceattributeSerializer
+class ServiceAttributeList(generics.ListCreateAPIView):
+    queryset = ServiceAttribute.objects.select_related().all()
+    serializer_class = ServiceAttributeSerializer
+    
+    def get_queryset(self):
+        return ServiceAttribute.select_by_user(self.request.user)
 
-class ServiceattributeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Serviceattribute.objects.all()
-    serializer_class = ServiceattributeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = ServiceAttribute().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ServiceAttributeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ServiceAttributeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = ServiceAttribute.objects.select_related().all()
+    serializer_class = ServiceAttributeSerializer
+    
+    def get_queryset(self):
+        return ServiceAttribute.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceAttributeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceAttributeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class ImageList(generics.ListCreateAPIView):
-    queryset = Image.objects.all()
+    queryset = Image.objects.select_related().all()
     serializer_class = ImageSerializer
+    
+    def get_queryset(self):
+        return Image.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Image().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ImageList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Image.objects.all()
+    queryset = Image.objects.select_related().all()
     serializer_class = ImageSerializer
+    
+    def get_queryset(self):
+        return Image.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ImageDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ImageDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class NetworkparameterList(generics.ListCreateAPIView):
-    queryset = Networkparameter.objects.all()
-    serializer_class = NetworkparameterSerializer
+class NetworkParameterList(generics.ListCreateAPIView):
+    queryset = NetworkParameter.objects.select_related().all()
+    serializer_class = NetworkParameterSerializer
+    
+    def get_queryset(self):
+        return NetworkParameter.select_by_user(self.request.user)
 
-class NetworkparameterDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Networkparameter.objects.all()
-    serializer_class = NetworkparameterSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkParameter().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkParameterList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkParameterDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkParameter.objects.select_related().all()
+    serializer_class = NetworkParameterSerializer
+    
+    def get_queryset(self):
+        return NetworkParameter.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkParameterDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkParameterDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class SiteList(generics.ListCreateAPIView):
-    queryset = Site.objects.all()
+    queryset = Site.objects.select_related().all()
     serializer_class = SiteSerializer
+    
+    def get_queryset(self):
+        return Site.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Site().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SiteList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class SiteDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Site.objects.all()
+    queryset = Site.objects.select_related().all()
     serializer_class = SiteSerializer
+    
+    def get_queryset(self):
+        return Site.select_by_user(self.request.user)
 
-class SliceroleList(generics.ListCreateAPIView):
-    queryset = Slicerole.objects.all()
-    serializer_class = SliceroleSerializer
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
-class SliceroleDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Slicerole.objects.all()
-    serializer_class = SliceroleSerializer
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class SliceRoleList(generics.ListCreateAPIView):
+    queryset = SliceRole.objects.select_related().all()
+    serializer_class = SliceRoleSerializer
+    
+    def get_queryset(self):
+        return SliceRole.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = SliceRole().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SliceRoleList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SliceRoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SliceRole.objects.select_related().all()
+    serializer_class = SliceRoleSerializer
+    
+    def get_queryset(self):
+        return SliceRole.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceRoleDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceRoleDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class TagList(generics.ListCreateAPIView):
-    queryset = Tag.objects.all()
+    queryset = Tag.objects.select_related().all()
     serializer_class = TagSerializer
+    
+    def get_queryset(self):
+        return Tag.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Tag().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(TagList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class TagDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Tag.objects.all()
+    queryset = Tag.objects.select_related().all()
     serializer_class = TagSerializer
+    
+    def get_queryset(self):
+        return Tag.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(TagDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(TagDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class InvoiceList(generics.ListCreateAPIView):
-    queryset = Invoice.objects.all()
+    queryset = Invoice.objects.select_related().all()
     serializer_class = InvoiceSerializer
+    
+    def get_queryset(self):
+        return Invoice.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Invoice().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(InvoiceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class InvoiceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Invoice.objects.all()
+    queryset = Invoice.objects.select_related().all()
     serializer_class = InvoiceSerializer
+    
+    def get_queryset(self):
+        return Invoice.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(InvoiceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(InvoiceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class SliceprivilegeList(generics.ListCreateAPIView):
-    queryset = Sliceprivilege.objects.all()
-    serializer_class = SliceprivilegeSerializer
+class PlanetStackRoleList(generics.ListCreateAPIView):
+    queryset = PlanetStackRole.objects.select_related().all()
+    serializer_class = PlanetStackRoleSerializer
+    
+    def get_queryset(self):
+        return PlanetStackRole.select_by_user(self.request.user)
 
-class SliceprivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Sliceprivilege.objects.all()
-    serializer_class = SliceprivilegeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = PlanetStackRole().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(PlanetStackRoleList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class PlanetStackRoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = PlanetStackRole.objects.select_related().all()
+    serializer_class = PlanetStackRoleSerializer
+    
+    def get_queryset(self):
+        return PlanetStackRole.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackRoleDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackRoleDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class PlanetstackroleList(generics.ListCreateAPIView):
-    queryset = Planetstackrole.objects.all()
-    serializer_class = PlanetstackroleSerializer
+class SlicePrivilegeList(generics.ListCreateAPIView):
+    queryset = SlicePrivilege.objects.select_related().all()
+    serializer_class = SlicePrivilegeSerializer
+    
+    def get_queryset(self):
+        return SlicePrivilege.select_by_user(self.request.user)
 
-class PlanetstackroleDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Planetstackrole.objects.all()
-    serializer_class = PlanetstackroleSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = SlicePrivilege().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SlicePrivilegeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SlicePrivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SlicePrivilege.objects.select_related().all()
+    serializer_class = SlicePrivilegeSerializer
+    
+    def get_queryset(self):
+        return SlicePrivilege.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SlicePrivilegeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SlicePrivilegeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class NetworksliverList(generics.ListCreateAPIView):
-    queryset = Networksliver.objects.all()
-    serializer_class = NetworksliverSerializer
+class NetworkSliverList(generics.ListCreateAPIView):
+    queryset = NetworkSliver.objects.select_related().all()
+    serializer_class = NetworkSliverSerializer
+    
+    def get_queryset(self):
+        return NetworkSliver.select_by_user(self.request.user)
 
-class NetworksliverDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Networksliver.objects.all()
-    serializer_class = NetworksliverSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkSliver().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkSliverList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkSliverDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkSliver.objects.select_related().all()
+    serializer_class = NetworkSliverSerializer
+    
+    def get_queryset(self):
+        return NetworkSliver.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkSliverDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkSliverDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class ProjectList(generics.ListCreateAPIView):
-    queryset = Project.objects.all()
-    serializer_class = ProjectSerializer
+class NetworkDeploymentsList(generics.ListCreateAPIView):
+    queryset = NetworkDeployments.objects.select_related().all()
+    serializer_class = NetworkDeploymentsSerializer
+    
+    def get_queryset(self):
+        return NetworkDeployments.select_by_user(self.request.user)
 
-class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Project.objects.all()
-    serializer_class = ProjectSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkDeployments().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkDeploymentsList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkDeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkDeployments.objects.select_related().all()
+    serializer_class = NetworkDeploymentsSerializer
+    
+    def get_queryset(self):
+        return NetworkDeployments.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkDeploymentsDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkDeploymentsDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class SliceList(generics.ListCreateAPIView):
-    queryset = Slice.objects.all()
+    queryset = Slice.objects.select_related().all()
     serializer_class = SliceSerializer
+    
+    def get_queryset(self):
+        return Slice.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Slice().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SliceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class SliceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Slice.objects.all()
+    queryset = Slice.objects.select_related().all()
     serializer_class = SliceSerializer
+    
+    def get_queryset(self):
+        return Slice.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class NetworkList(generics.ListCreateAPIView):
-    queryset = Network.objects.all()
+    queryset = Network.objects.select_related().all()
     serializer_class = NetworkSerializer
+    
+    def get_queryset(self):
+        return Network.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Network().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class NetworkDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Network.objects.all()
+    queryset = Network.objects.select_related().all()
     serializer_class = NetworkSerializer
+    
+    def get_queryset(self):
+        return Network.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class ServiceList(generics.ListCreateAPIView):
-    queryset = Service.objects.all()
+    queryset = Service.objects.select_related().all()
     serializer_class = ServiceSerializer
+    
+    def get_queryset(self):
+        return Service.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Service().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ServiceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class ServiceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Service.objects.all()
+    queryset = Service.objects.select_related().all()
     serializer_class = ServiceSerializer
+    
+    def get_queryset(self):
+        return Service.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class ServiceclassList(generics.ListCreateAPIView):
-    queryset = Serviceclass.objects.all()
-    serializer_class = ServiceclassSerializer
+class ServiceClassList(generics.ListCreateAPIView):
+    queryset = ServiceClass.objects.select_related().all()
+    serializer_class = ServiceClassSerializer
+    
+    def get_queryset(self):
+        return ServiceClass.select_by_user(self.request.user)
 
-class ServiceclassDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Serviceclass.objects.all()
-    serializer_class = ServiceclassSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = ServiceClass().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ServiceClassList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
+class ServiceClassDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = ServiceClass.objects.select_related().all()
+    serializer_class = ServiceClassSerializer
+    
+    def get_queryset(self):
+        return ServiceClass.select_by_user(self.request.user)
 
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceClassDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
-class SiteroleList(generics.ListCreateAPIView):
-    queryset = Siterole.objects.all()
-    serializer_class = SiteroleSerializer
-
-class SiteroleDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Siterole.objects.all()
-    serializer_class = SiteroleSerializer
-
-
-
-class ChargeList(generics.ListCreateAPIView):
-    queryset = Charge.objects.all()
-    serializer_class = ChargeSerializer
-
-class ChargeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Charge.objects.all()
-    serializer_class = ChargeSerializer
-
-
-
-class RoleList(generics.ListCreateAPIView):
-    queryset = Role.objects.all()
-    serializer_class = RoleSerializer
-
-class RoleDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Role.objects.all()
-    serializer_class = RoleSerializer
-
-
-
-class UsableobjectList(generics.ListCreateAPIView):
-    queryset = Usableobject.objects.all()
-    serializer_class = UsableobjectSerializer
-
-class UsableobjectDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Usableobject.objects.all()
-    serializer_class = UsableobjectSerializer
-
-
-
-class SliverList(generics.ListCreateAPIView):
-    queryset = Sliver.objects.all()
-    serializer_class = SliverSerializer
-
-class SliverDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Sliver.objects.all()
-    serializer_class = SliverSerializer
-
-
-
-class NodeList(generics.ListCreateAPIView):
-    queryset = Node.objects.all()
-    serializer_class = NodeSerializer
-
-class NodeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Node.objects.all()
-    serializer_class = NodeSerializer
-
-
-
-class ReservedresourceList(generics.ListCreateAPIView):
-    queryset = Reservedresource.objects.all()
-    serializer_class = ReservedresourceSerializer
-
-class ReservedresourceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Reservedresource.objects.all()
-    serializer_class = ReservedresourceSerializer
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceClassDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class PaymentList(generics.ListCreateAPIView):
-    queryset = Payment.objects.all()
+    queryset = Payment.objects.select_related().all()
     serializer_class = PaymentSerializer
+    
+    def get_queryset(self):
+        return Payment.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Payment().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(PaymentList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class PaymentDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Payment.objects.all()
+    queryset = Payment.objects.select_related().all()
     serializer_class = PaymentSerializer
+    
+    def get_queryset(self):
+        return Payment.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PaymentDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PaymentDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class NetworksliceList(generics.ListCreateAPIView):
-    queryset = Networkslice.objects.all()
-    serializer_class = NetworksliceSerializer
+class ChargeList(generics.ListCreateAPIView):
+    queryset = Charge.objects.select_related().all()
+    serializer_class = ChargeSerializer
+    
+    def get_queryset(self):
+        return Charge.select_by_user(self.request.user)
 
-class NetworksliceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Networkslice.objects.all()
-    serializer_class = NetworksliceSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = Charge().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ChargeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ChargeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Charge.objects.select_related().all()
+    serializer_class = ChargeSerializer
+    
+    def get_queryset(self):
+        return Charge.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ChargeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ChargeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class PlanetstackprivilegeList(generics.ListCreateAPIView):
-    queryset = Planetstackprivilege.objects.all()
-    serializer_class = PlanetstackprivilegeSerializer
+class RoleList(generics.ListCreateAPIView):
+    queryset = Role.objects.select_related().all()
+    serializer_class = RoleSerializer
+    
+    def get_queryset(self):
+        return Role.select_by_user(self.request.user)
 
-class PlanetstackprivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Planetstackprivilege.objects.all()
-    serializer_class = PlanetstackprivilegeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = Role().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(RoleList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class RoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Role.objects.select_related().all()
+    serializer_class = RoleSerializer
+    
+    def get_queryset(self):
+        return Role.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(RoleDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(RoleDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class UsableObjectList(generics.ListCreateAPIView):
+    queryset = UsableObject.objects.select_related().all()
+    serializer_class = UsableObjectSerializer
+    
+    def get_queryset(self):
+        return UsableObject.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = UsableObject().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(UsableObjectList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class UsableObjectDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = UsableObject.objects.select_related().all()
+    serializer_class = UsableObjectSerializer
+    
+    def get_queryset(self):
+        return UsableObject.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UsableObjectDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UsableObjectDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class SiteRoleList(generics.ListCreateAPIView):
+    queryset = SiteRole.objects.select_related().all()
+    serializer_class = SiteRoleSerializer
+    
+    def get_queryset(self):
+        return SiteRole.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = SiteRole().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SiteRoleList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SiteRoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SiteRole.objects.select_related().all()
+    serializer_class = SiteRoleSerializer
+    
+    def get_queryset(self):
+        return SiteRole.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteRoleDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteRoleDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class SliverList(generics.ListCreateAPIView):
+    queryset = Sliver.objects.select_related().all()
+    serializer_class = SliverSerializer
+    
+    def get_queryset(self):
+        return Sliver.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Sliver().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SliverList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SliverDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Sliver.objects.select_related().all()
+    serializer_class = SliverSerializer
+    
+    def get_queryset(self):
+        return Sliver.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliverDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliverDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class NodeList(generics.ListCreateAPIView):
+    queryset = Node.objects.select_related().all()
+    serializer_class = NodeSerializer
+    
+    def get_queryset(self):
+        return Node.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Node().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NodeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NodeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Node.objects.select_related().all()
+    serializer_class = NodeSerializer
+    
+    def get_queryset(self):
+        return Node.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NodeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NodeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class DashboardViewList(generics.ListCreateAPIView):
+    queryset = DashboardView.objects.select_related().all()
+    serializer_class = DashboardViewSerializer
+    
+    def get_queryset(self):
+        return DashboardView.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = DashboardView().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(DashboardViewList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class DashboardViewDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = DashboardView.objects.select_related().all()
+    serializer_class = DashboardViewSerializer
+    
+    def get_queryset(self):
+        return DashboardView.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DashboardViewDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DashboardViewDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class ImageDeploymentsList(generics.ListCreateAPIView):
+    queryset = ImageDeployments.objects.select_related().all()
+    serializer_class = ImageDeploymentsSerializer
+    
+    def get_queryset(self):
+        return ImageDeployments.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = ImageDeployments().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ImageDeploymentsList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ImageDeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = ImageDeployments.objects.select_related().all()
+    serializer_class = ImageDeploymentsSerializer
+    
+    def get_queryset(self):
+        return ImageDeployments.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ImageDeploymentsDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ImageDeploymentsDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class ReservedResourceList(generics.ListCreateAPIView):
+    queryset = ReservedResource.objects.select_related().all()
+    serializer_class = ReservedResourceSerializer
+    
+    def get_queryset(self):
+        return ReservedResource.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = ReservedResource().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ReservedResourceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ReservedResourceDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = ReservedResource.objects.select_related().all()
+    serializer_class = ReservedResourceSerializer
+    
+    def get_queryset(self):
+        return ReservedResource.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ReservedResourceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ReservedResourceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class NetworkSliceList(generics.ListCreateAPIView):
+    queryset = NetworkSlice.objects.select_related().all()
+    serializer_class = NetworkSliceSerializer
+    
+    def get_queryset(self):
+        return NetworkSlice.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkSlice().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkSliceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkSliceDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkSlice.objects.select_related().all()
+    serializer_class = NetworkSliceSerializer
+    
+    def get_queryset(self):
+        return NetworkSlice.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkSliceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkSliceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class UserDashboardViewList(generics.ListCreateAPIView):
+    queryset = UserDashboardView.objects.select_related().all()
+    serializer_class = UserDashboardViewSerializer
+    
+    def get_queryset(self):
+        return UserDashboardView.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = UserDashboardView().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(UserDashboardViewList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class UserDashboardViewDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = UserDashboardView.objects.select_related().all()
+    serializer_class = UserDashboardViewSerializer
+    
+    def get_queryset(self):
+        return UserDashboardView.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDashboardViewDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDashboardViewDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class PlanetStackPrivilegeList(generics.ListCreateAPIView):
+    queryset = PlanetStackPrivilege.objects.select_related().all()
+    serializer_class = PlanetStackPrivilegeSerializer
+    
+    def get_queryset(self):
+        return PlanetStackPrivilege.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = PlanetStackPrivilege().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(PlanetStackPrivilegeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class PlanetStackPrivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = PlanetStackPrivilege.objects.select_related().all()
+    serializer_class = PlanetStackPrivilegeSerializer
+    
+    def get_queryset(self):
+        return PlanetStackPrivilege.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackPrivilegeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackPrivilegeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class UserList(generics.ListCreateAPIView):
-    queryset = User.objects.all()
+    queryset = User.objects.select_related().all()
     serializer_class = UserSerializer
+    
+    def get_queryset(self):
+        return User.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = User().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(UserList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class UserDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = User.objects.all()
+    queryset = User.objects.select_related().all()
     serializer_class = UserSerializer
+    
+    def get_queryset(self):
+        return User.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class DeploymentList(generics.ListCreateAPIView):
-    queryset = Deployment.objects.all()
+    queryset = Deployment.objects.select_related().all()
     serializer_class = DeploymentSerializer
+    
+    def get_queryset(self):
+        return Deployment.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Deployment().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(DeploymentList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Deployment.objects.all()
+    queryset = Deployment.objects.select_related().all()
     serializer_class = DeploymentSerializer
+    
+    def get_queryset(self):
+        return Deployment.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class ReservationList(generics.ListCreateAPIView):
-    queryset = Reservation.objects.all()
+    queryset = Reservation.objects.select_related().all()
     serializer_class = ReservationSerializer
+    
+    def get_queryset(self):
+        return Reservation.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Reservation().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ReservationList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class ReservationDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Reservation.objects.all()
+    queryset = Reservation.objects.select_related().all()
     serializer_class = ReservationSerializer
+    
+    def get_queryset(self):
+        return Reservation.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ReservationDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ReservationDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class SiteprivilegeList(generics.ListCreateAPIView):
-    queryset = Siteprivilege.objects.all()
-    serializer_class = SiteprivilegeSerializer
+class SliceDeploymentsList(generics.ListCreateAPIView):
+    queryset = SliceDeployments.objects.select_related().all()
+    serializer_class = SliceDeploymentsSerializer
+    
+    def get_queryset(self):
+        return SliceDeployments.select_by_user(self.request.user)
 
-class SiteprivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Siteprivilege.objects.all()
-    serializer_class = SiteprivilegeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = SliceDeployments().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SliceDeploymentsList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SliceDeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SliceDeployments.objects.select_related().all()
+    serializer_class = SliceDeploymentsSerializer
+    
+    def get_queryset(self):
+        return SliceDeployments.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceDeploymentsDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceDeploymentsDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class SingletonmodelList(generics.ListCreateAPIView):
-    queryset = Singletonmodel.objects.all()
-    serializer_class = SingletonmodelSerializer
+class SitePrivilegeList(generics.ListCreateAPIView):
+    queryset = SitePrivilege.objects.select_related().all()
+    serializer_class = SitePrivilegeSerializer
+    
+    def get_queryset(self):
+        return SitePrivilege.select_by_user(self.request.user)
 
-class SingletonmodelDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Singletonmodel.objects.all()
-    serializer_class = SingletonmodelSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = SitePrivilege().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SitePrivilegeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SitePrivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SitePrivilege.objects.select_related().all()
+    serializer_class = SitePrivilegeSerializer
+    
+    def get_queryset(self):
+        return SitePrivilege.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SitePrivilegeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SitePrivilegeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class PlanetstackList(generics.ListCreateAPIView):
-    queryset = Planetstack.objects.all()
-    serializer_class = PlanetstackSerializer
+class PlanetStackList(generics.ListCreateAPIView):
+    queryset = PlanetStack.objects.select_related().all()
+    serializer_class = PlanetStackSerializer
+    
+    def get_queryset(self):
+        return PlanetStack.select_by_user(self.request.user)
 
-class PlanetstackDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Planetstack.objects.all()
-    serializer_class = PlanetstackSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = PlanetStack().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(PlanetStackList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class PlanetStackDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = PlanetStack.objects.select_related().all()
+    serializer_class = PlanetStackSerializer
+    
+    def get_queryset(self):
+        return PlanetStack.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(PlanetStackDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
+
+
+
+class UserDeploymentsList(generics.ListCreateAPIView):
+    queryset = UserDeployments.objects.select_related().all()
+    serializer_class = UserDeploymentsSerializer
+    
+    def get_queryset(self):
+        return UserDeployments.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = UserDeployments().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(UserDeploymentsList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class UserDeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = UserDeployments.objects.select_related().all()
+    serializer_class = UserDeploymentsSerializer
+    
+    def get_queryset(self):
+        return UserDeployments.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDeploymentsDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(UserDeploymentsDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class AccountList(generics.ListCreateAPIView):
-    queryset = Account.objects.all()
+    queryset = Account.objects.select_related().all()
     serializer_class = AccountSerializer
+    
+    def get_queryset(self):
+        return Account.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Account().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(AccountList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class AccountDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Account.objects.all()
+    queryset = Account.objects.select_related().all()
     serializer_class = AccountSerializer
+    
+    def get_queryset(self):
+        return Account.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(AccountDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(AccountDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class NetworkparametertypeList(generics.ListCreateAPIView):
-    queryset = Networkparametertype.objects.all()
-    serializer_class = NetworkparametertypeSerializer
+class NetworkParameterTypeList(generics.ListCreateAPIView):
+    queryset = NetworkParameterType.objects.select_related().all()
+    serializer_class = NetworkParameterTypeSerializer
+    
+    def get_queryset(self):
+        return NetworkParameterType.select_by_user(self.request.user)
 
-class NetworkparametertypeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Networkparametertype.objects.all()
-    serializer_class = NetworkparametertypeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkParameterType().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkParameterTypeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkParameterTypeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkParameterType.objects.select_related().all()
+    serializer_class = NetworkParameterTypeSerializer
+    
+    def get_queryset(self):
+        return NetworkParameterType.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkParameterTypeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkParameterTypeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class SitedeploymentsList(generics.ListCreateAPIView):
-    queryset = Sitedeployments.objects.all()
-    serializer_class = SitedeploymentsSerializer
+class SiteDeploymentsList(generics.ListCreateAPIView):
+    queryset = SiteDeployments.objects.select_related().all()
+    serializer_class = SiteDeploymentsSerializer
+    
+    def get_queryset(self):
+        return SiteDeployments.select_by_user(self.request.user)
 
-class SitedeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Sitedeployments.objects.all()
-    serializer_class = SitedeploymentsSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = SiteDeployments().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SiteDeploymentsList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SiteDeploymentsDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SiteDeployments.objects.select_related().all()
+    serializer_class = SiteDeploymentsSerializer
+    
+    def get_queryset(self):
+        return SiteDeployments.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteDeploymentsDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SiteDeploymentsDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class DeploymentprivilegeList(generics.ListCreateAPIView):
-    queryset = Deploymentprivilege.objects.all()
-    serializer_class = DeploymentprivilegeSerializer
+class DeploymentPrivilegeList(generics.ListCreateAPIView):
+    queryset = DeploymentPrivilege.objects.select_related().all()
+    serializer_class = DeploymentPrivilegeSerializer
+    
+    def get_queryset(self):
+        return DeploymentPrivilege.select_by_user(self.request.user)
 
-class DeploymentprivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Deploymentprivilege.objects.all()
-    serializer_class = DeploymentprivilegeSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = DeploymentPrivilege().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(DeploymentPrivilegeList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class DeploymentPrivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = DeploymentPrivilege.objects.select_related().all()
+    serializer_class = DeploymentPrivilegeSerializer
+    
+    def get_queryset(self):
+        return DeploymentPrivilege.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentPrivilegeDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentPrivilegeDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class DeploymentroleList(generics.ListCreateAPIView):
-    queryset = Deploymentrole.objects.all()
-    serializer_class = DeploymentroleSerializer
+class DeploymentRoleList(generics.ListCreateAPIView):
+    queryset = DeploymentRole.objects.select_related().all()
+    serializer_class = DeploymentRoleSerializer
+    
+    def get_queryset(self):
+        return DeploymentRole.select_by_user(self.request.user)
 
-class DeploymentroleDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Deploymentrole.objects.all()
-    serializer_class = DeploymentroleSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = DeploymentRole().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(DeploymentRoleList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class DeploymentRoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = DeploymentRole.objects.select_related().all()
+    serializer_class = DeploymentRoleSerializer
+    
+    def get_queryset(self):
+        return DeploymentRole.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentRoleDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(DeploymentRoleDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class PlcorebaseList(generics.ListCreateAPIView):
-    queryset = Plcorebase.objects.all()
-    serializer_class = PlcorebaseSerializer
+class ProjectList(generics.ListCreateAPIView):
+    queryset = Project.objects.select_related().all()
+    serializer_class = ProjectSerializer
+    
+    def get_queryset(self):
+        return Project.select_by_user(self.request.user)
 
-class PlcorebaseDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Plcorebase.objects.all()
-    serializer_class = PlcorebaseSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = Project().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ProjectList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Project.objects.select_related().all()
+    serializer_class = ProjectSerializer
+    
+    def get_queryset(self):
+        return Project.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ProjectDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ProjectDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class SlicetagList(generics.ListCreateAPIView):
-    queryset = Slicetag.objects.all()
-    serializer_class = SlicetagSerializer
+class SliceTagList(generics.ListCreateAPIView):
+    queryset = SliceTag.objects.select_related().all()
+    serializer_class = SliceTagSerializer
+    
+    def get_queryset(self):
+        return SliceTag.select_by_user(self.request.user)
 
-class SlicetagDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Slicetag.objects.all()
-    serializer_class = SlicetagSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = SliceTag().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(SliceTagList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class SliceTagDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SliceTag.objects.select_related().all()
+    serializer_class = SliceTagSerializer
+    
+    def get_queryset(self):
+        return SliceTag.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceTagDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(SliceTagDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class NetworktemplateList(generics.ListCreateAPIView):
-    queryset = Networktemplate.objects.all()
-    serializer_class = NetworktemplateSerializer
+class NetworkTemplateList(generics.ListCreateAPIView):
+    queryset = NetworkTemplate.objects.select_related().all()
+    serializer_class = NetworkTemplateSerializer
+    
+    def get_queryset(self):
+        return NetworkTemplate.select_by_user(self.request.user)
 
-class NetworktemplateDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Networktemplate.objects.all()
-    serializer_class = NetworktemplateSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = NetworkTemplate().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(NetworkTemplateList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class NetworkTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = NetworkTemplate.objects.select_related().all()
+    serializer_class = NetworkTemplateSerializer
+    
+    def get_queryset(self):
+        return NetworkTemplate.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkTemplateDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(NetworkTemplateDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
 class RouterList(generics.ListCreateAPIView):
-    queryset = Router.objects.all()
+    queryset = Router.objects.select_related().all()
     serializer_class = RouterSerializer
+    
+    def get_queryset(self):
+        return Router.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = Router().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(RouterList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class RouterDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Router.objects.all()
+    queryset = Router.objects.select_related().all()
     serializer_class = RouterSerializer
+    
+    def get_queryset(self):
+        return Router.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(RouterDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(RouterDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
-class ServiceresourceList(generics.ListCreateAPIView):
-    queryset = Serviceresource.objects.all()
-    serializer_class = ServiceresourceSerializer
+class ServiceResourceList(generics.ListCreateAPIView):
+    queryset = ServiceResource.objects.select_related().all()
+    serializer_class = ServiceResourceSerializer
+    
+    def get_queryset(self):
+        return ServiceResource.select_by_user(self.request.user)
 
-class ServiceresourceDetail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = Serviceresource.objects.all()
-    serializer_class = ServiceresourceSerializer
+    def create(self, request, *args, **kwargs):
+        #obj = ServiceResource().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super(ServiceResourceList, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+class ServiceResourceDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = ServiceResource.objects.select_related().all()
+    serializer_class = ServiceResourceSerializer
+    
+    def get_queryset(self):
+        return ServiceResource.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceResourceDetail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super(ServiceResourceDetail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 
 
