Merge branch 'master' of git://git.planet-lab.org/plstackapi
diff --git a/planetstack/apigen/api.template.py b/planetstack/apigen/api.template.py
index 89a2b18..f9d9cb8 100644
--- a/planetstack/apigen/api.template.py
+++ b/planetstack/apigen/api.template.py
@@ -4,6 +4,7 @@
 from rest_framework import serializers
 from rest_framework import generics
 from rest_framework import status
+from rest_framework.generics import GenericAPIView
 from core.models import *
 from django.forms import widgets
 from rest_framework import filters
@@ -13,7 +14,7 @@
     Schema of the generator object:
         all: Set of all Model objects
         all_if(regex): Set of Model objects that match regex
-    
+
     Model object:
         plural: English plural of object name
         camel: CamelCase version of object name
@@ -29,6 +30,7 @@
     {% for object in generator.all %}
         url(r'plstackapi/{{ object.rest_name }}/$', {{ object.camel }}List.as_view(), name='{{ object.singular }}-list'),
         url(r'plstackapi/{{ object.rest_name }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel }}Detail.as_view(), name ='{{ object.singular }}-detail'),
+#        url(r'plstackapi/{{ object.rest_name }}/!new/$', {{ object.camel }}New.as_view(), name ='{{ object.singular }}-new'),
     {% endfor %}
     )
 
@@ -145,7 +147,10 @@
         return {{ object.camel }}.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = {{ object.camel }}(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super({{ object.camel }}List, self).create(request, *args, **kwargs)
@@ -178,4 +183,29 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class {{ object.camel }}New(GenericAPIView):
+    serializer_class = {{ object.camel }}Serializer
+    id_serializer_class = {{ object.camel }}IdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = {{ object.camel }}()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 {% endfor %}
diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py
index d438bdf..24d02aa 100644
--- a/planetstack/core/models/slice.py
+++ b/planetstack/core/models/slice.py
@@ -92,7 +92,15 @@
         from core.models.network import Network
         nets = Network.objects.filter(slices=self)
         nets.delete() 
+        # delete slice deployments
+        slice_deployments = SliceDeployments.objects.filter(slice=self)
+        slice_deployments.delete()
+        # delete slice privilege
+        slice_privileges = SlicePrivilege.objects.filter(slice=self)
+        slice_privileges.delete() 
+        # continue with normal delete
         super(SliceAdmin, self).delete(*args, **kwds) 
+         
 
 class SliceRole(PlCoreBase):
     ROLE_CHOICES = (('admin','Admin'),('default','Default'))
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
index b514ff3..4b048fb 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
@@ -191,130 +191,111 @@
             },
     });
 
+    function define_model(lib, attrs) {
+        modelName = attrs.modelName;
+        modelClassName = modelName;
+        collectionClassName = modelName + "Collection";
+        collectionName = modelName + "s";
+
+        modelAttrs = {}
+        collectionAttrs = {}
+
+        for (key in attrs) {
+            value = attrs[key];
+            if ($.inArray(key, ["urlRoot", "modelName"])>=0) {
+                modelAttrs[key] = value;
+            }
+            if ($.inArray(key, ["urlRoot", "modelName", "relatedCollections", "foreignCollections"])>=0) {
+                collectionAttrs[key] = value;
+            }
+        }
+
+        if (xosdefaults && xosdefaults[modelName]) {
+            modelAttrs["defaults"] = xosdefaults[modelName];
+        }
+
+        lib[modelName] = XOSModel.extend(modelAttrs);
+
+        collectionAttrs["model"] = lib[modelName];
+
+        lib[collectionClassName] = XOSCollection.extend(collectionAttrs);
+        lib[collectionName] = new lib[collectionClassName]();
+
+        lib.allCollectionNames.push(collectionName);
+    };
+
     function xoslib() {
-        // basic REST
-        this.sliver = XOSModel.extend({ urlRoot: SLIVER_API, modelName: "sliver" });
-        this.sliverCollection = XOSCollection.extend({ urlRoot: SLIVER_API,
-                                                       relatedCollections: {"networkSlivers": "sliver"},
-                                                       foreignCollections: ["slices", "deployments", "images", "nodes", "users"],
-                                                       model: this.sliver,
-                                                       modelName: "sliver"});
-        this.slivers = new this.sliverCollection();
+        this.allCollectionNames = [];
 
-        this.slice = XOSModel.extend({ urlRoot: SLICE_API, modelName: "slice" });
-        this.sliceCollection = XOSCollection.extend({ urlRoot: SLICE_API,
-                                                       relatedCollections: {"slivers": "slice", "sliceDeployments": "slice", "slicePrivileges": "slice", "networks": "owner"},
-                                                       foreignCollections: ["services", "sites"],
-                                                       model: this.slice,
-                                                       modelName: "slice"});
-        this.slices = new this.sliceCollection();
+        define_model(this, {urlRoot: SLIVER_API,
+                            relatedCollections: {"networkSlivers": "sliver"},
+                            foreignCollections: ["slices", "deployments", "images", "nodes", "users"],
+                            modelName: "sliver"});
 
-        this.sliceDeployment = XOSModel.extend({ urlRoot: SLICEDEPLOYMENT_API, modelName: "sliceDeployment" });
-        this.sliceDeploymentCollection = XOSCollection.extend({ urlRoot: SLICEDEPLOYMENT_API,
-                                                       foreignCollections: ["slices", "deployments"],
-                                                       model: this.sliceDeployment,
-                                                       modelName: "sliceDeployment"});
-        this.sliceDeployments = new this.sliceDeploymentCollection();
+        define_model(this, {urlRoot: SLICE_API,
+                           relatedCollections: {"slivers": "slice", "sliceDeployments": "slice", "slicePrivileges": "slice", "networks": "owner"},
+                           foreignCollections: ["services", "sites"],
+                           modelName: "slice"});
 
-        this.slicePrivilege = XOSModel.extend({ urlRoot: SLICEPRIVILEGE_API, modelName: "slicePrivilege" });
-        this.slicePrivilegeCollection = XOSCollection.extend({ urlRoot: SLICEPRIVILEGE_API,
-                                                       foreignCollections: ["slices", "users", "sliceRoles"],
-                                                       model: this.slicePrivilege,
-                                                       modelName: "slicePrivilege"});
-        this.slicePrivileges = new this.slicePrivilegeCollection();
+        define_model(this, {urlRoot: SLICEDEPLOYMENT_API,
+                           foreignCollections: ["slices", "deployments"],
+                           modelName: "sliceDeployment"});
 
-        this.sliceRole = XOSModel.extend({ urlRoot: SLICEROLE_API, modelName: "sliceRole" });
-        this.sliceRoleCollection = XOSCollection.extend({ urlRoot: SLICEROLE_API,
-                                                       model: this.sliceRole,
-                                                       modelName: "sliceRole"});
-        this.sliceRoles = new this.sliceRoleCollection();
+        define_model(this, {urlRoot: SLICEPRIVILEGE_API,
+                            foreignCollections: ["slices", "users", "sliceRoles"],
+                            modelName: "slicePrivilege"});
 
-        this.node = XOSModel.extend({ urlRoot: NODE_API, modelName: "node" });
-        this.nodeCollection = XOSCollection.extend({ urlRoot: NODE_API,
-                                                       foreignCollections: ["sites", "deployments"],
-                                                       model: this.node,
-                                                       modelName: "node"});
-        this.nodes = new this.nodeCollection();
+        define_model(this, {urlRoot: SLICEROLE_API,
+                            modelName: "sliceRole"});
 
-        this.site = XOSModel.extend({ urlRoot: SITE_API, modelName: "site" });
-        this.siteCollection = XOSCollection.extend({ urlRoot: SITE_API,
-                                                       relatedCollections: {"users": "site", "slices": "site", "nodes": "site"},
-                                                       model: this.site,
-                                                       modelName: "site"});
-        this.sites = new this.siteCollection();
+        define_model(this, {urlRoot: NODE_API,
+                            foreignCollections: ["sites", "deployments"],
+                            modelName: "node"});
 
-        this.user = XOSModel.extend({ urlRoot: USER_API, modelName: "user" });
-        this.userCollection = XOSCollection.extend({ urlRoot: USER_API,
-                                                       relatedCollections: {"slicePrivileges": "user", "slices": "owner", "userDeployments": "user"},
-                                                       foreignCollections: ["sites"],
-                                                       model: this.user,
-                                                       modelName: "user"});
-        this.users = new this.userCollection();
+        define_model(this, {urlRoot: SITE_API,
+                            relatedCollections: {"users": "site", "slices": "site", "nodes": "site"},
+                            modelName: "site"});
 
-        this.userDeployment = XOSModel.extend({ urlRoot: USERDEPLOYMENT_API, modelName: "userDeployment" });
-        this.userDeploymentCollection = XOSCollection.extend({ urlRoot: USERDEPLOYMENT_API,
-                                                       foreignCollections: ["users","deployments"],
-                                                       model: this.userDeployment,
-                                                       modelName: "userDeployment"});
-        this.userDeployments = new this.userDeploymentCollection();
+        define_model(this, {urlRoot: USER_API,
+                            relatedCollections: {"slicePrivileges": "user", "slices": "owner", "userDeployments": "user"},
+                            foreignCollections: ["sites"],
+                            modelName: "user"});
 
-        this.deployment = XOSModel.extend({ urlRoot: DEPLOYMENT_API,
-                                            modelName: "deployment",
-                                            defaults: xosdefaults.deployment });
-        this.deploymentCollection = XOSCollection.extend({ urlRoot: DEPLOYMENT_API,
-                                                           relatedCollections: {"nodes": "deployment", "slivers": "deploymentNetwork", "networkDeployments": "deployment", "userDeployments": "deployment"},
-                                                           model: this.deployment,
-                                                           modelName: "deployment"});
-        this.deployments = new this.deploymentCollection();
+        define_model(this, {urlRoot: USERDEPLOYMENT_API,
+                            foreignCollections: ["users","deployments"],
+                            modelName: "userDeployment"});
 
-        this.image = XOSModel.extend({ urlRoot: IMAGE_API,
-                                       modelName: "image" });
-        this.imageCollection = XOSCollection.extend({ urlRoot: IMAGE_API,
-                                                           model: this.image,
-                                                           modelName: "image"});
-        this.images = new this.imageCollection();
+        define_model(this, { urlRoot: DEPLOYMENT_API,
+                             relatedCollections: {"nodes": "deployment", "slivers": "deploymentNetwork", "networkDeployments": "deployment", "userDeployments": "deployment"},
+                             modelName: "deployment"});
 
-        this.networkTemplate = XOSModel.extend({ urlRoot: NETWORKTEMPLATE_API, modelName: "networkTemplate" });
-        this.networkTemplateCollection = XOSCollection.extend({ urlRoot: NETWORKTEMPLATE_API,
-                                                           model: this.networkTemplate,
-                                                           modelName: "networkTemplate"});
-        this.networkTemplates = new this.networkTemplateCollection();
+        define_model(this, {urlRoot: IMAGE_API,
+                            model: this.image,
+                            modelName: "image"});
 
-        this.network = XOSModel.extend({ urlRoot: NETWORK_API, modelName: "network" });
-        this.networkCollection = XOSCollection.extend({ urlRoot: NETWORK_API,
-                                                           relatedCollections: {"networkDeployments": "network", "networkSlivers": "network"},
-                                                           foreignCollections: ["slices", "networkTemplates"],
-                                                           model: this.network,
-                                                           modelName: "network"});
-        this.networks = new this.networkCollection();
+        define_model(this, {urlRoot: NETWORKTEMPLATE_API,
+                            modelName: "networkTemplate"});
 
-        this.networkSliver = XOSModel.extend({ urlRoot: NETWORKSLIVER_API, modelName: "networkSliver" });
-        this.networkSliverCollection = XOSCollection.extend({ urlRoot: NETWORKSLIVER_API,
-                                                           model: this.networkSliver,
-                                                           modelName: "networkSliver"});
-        this.networkSlivers = new this.networkSliverCollection();
+        define_model(this, {urlRoot: NETWORK_API,
+                            relatedCollections: {"networkDeployments": "network", "networkSlivers": "network"},
+                            foreignCollections: ["slices", "networkTemplates"],
+                            modelName: "network"});
 
-        this.networkDeployment = XOSModel.extend({ urlRoot: NETWORKDEPLOYMENT_API, modelName: "networkDeployment" });
-        this.networkDeploymentCollection = XOSCollection.extend({ urlRoot: NETWORKDEPLOYMENT_API,
-                                                           model: this.networkDeployment,
-                                                           modelName: "networkDeployment"});
-        this.networkDeployments = new this.networkDeploymentCollection();
+        define_model(this, {urlRoot: NETWORKSLIVER_API,
+                            modelName: "networkSliver"});
 
-        this.service = XOSModel.extend({ urlRoot: SERVICE_API, modelName: "sliver" });
-        this.serviceCollection = XOSCollection.extend({ urlRoot: SERVICE_API,
-                                                       model: this.service,
-                                                       modelName: "service"});
-        this.services = new this.serviceCollection();
+        define_model(this, {urlRoot: NETWORKDEPLOYMENT_API,
+                            modelName: "networkDeployment"});
+
+        define_model(this, {urlRoot: SERVICE_API,
+                            modelName: "service"});
 
         // enhanced REST
-        this.slicePlus = XOSModel.extend({ urlRoot: SLICEPLUS_API, modelName: "slicePlus" });
-        this.slicePlusCollection = XOSCollection.extend({ urlRoot: SLICEPLUS_API,
-                                                          relatedCollections: {'slivers': "slice"},
-                                                          model: this.slicePlus,
-                                                          modelName: "slicePlus"});
-        this.slicesPlus = new this.slicePlusCollection();
+        define_model(this, {urlRoot: SLICEPLUS_API,
+                            relatedCollections: {'slivers': "slice"},
+                            modelName: "slicePlus"});
 
-        this.listObjects = function() { return ["slivers", "slices", "nodes", "sites", "users", "deployments"]; };
+        this.listObjects = function() { return this.allCollectionNames; };
     };
 
     xos = new xoslib();
diff --git a/planetstack/genapi.py b/planetstack/genapi.py
index b368a9a..1e1fa9f 100644
--- a/planetstack/genapi.py
+++ b/planetstack/genapi.py
@@ -4,6 +4,7 @@
 from rest_framework import serializers
 from rest_framework import generics
 from rest_framework import status
+from rest_framework.generics import GenericAPIView
 from core.models import *
 from django.forms import widgets
 from rest_framework import filters
@@ -13,7 +14,7 @@
     Schema of the generator object:
         all: Set of all Model objects
         all_if(regex): Set of Model objects that match regex
-    
+
     Model object:
         plural: English plural of object name
         camel: CamelCase version of object name
@@ -29,150 +30,199 @@
     
         url(r'plstackapi/serviceattributes/$', ServiceAttributeList.as_view(), name='serviceattribute-list'),
         url(r'plstackapi/serviceattributes/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceAttributeDetail.as_view(), name ='serviceattribute-detail'),
+#        url(r'plstackapi/serviceattributes/!new/$', ServiceAttributeNew.as_view(), name ='serviceattribute-new'),
     
         url(r'plstackapi/images/$', ImageList.as_view(), name='image-list'),
         url(r'plstackapi/images/(?P<pk>[a-zA-Z0-9\-]+)/$', ImageDetail.as_view(), name ='image-detail'),
+#        url(r'plstackapi/images/!new/$', ImageNew.as_view(), name ='image-new'),
     
         url(r'plstackapi/networkparameters/$', NetworkParameterList.as_view(), name='networkparameter-list'),
         url(r'plstackapi/networkparameters/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkParameterDetail.as_view(), name ='networkparameter-detail'),
+#        url(r'plstackapi/networkparameters/!new/$', NetworkParameterNew.as_view(), name ='networkparameter-new'),
     
         url(r'plstackapi/sites/$', SiteList.as_view(), name='site-list'),
         url(r'plstackapi/sites/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteDetail.as_view(), name ='site-detail'),
+#        url(r'plstackapi/sites/!new/$', SiteNew.as_view(), name ='site-new'),
     
         url(r'plstackapi/slice_roles/$', SliceRoleList.as_view(), name='slicerole-list'),
         url(r'plstackapi/slice_roles/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceRoleDetail.as_view(), name ='slicerole-detail'),
+#        url(r'plstackapi/slice_roles/!new/$', SliceRoleNew.as_view(), name ='slicerole-new'),
     
         url(r'plstackapi/tags/$', TagList.as_view(), name='tag-list'),
         url(r'plstackapi/tags/(?P<pk>[a-zA-Z0-9\-]+)/$', TagDetail.as_view(), name ='tag-detail'),
+#        url(r'plstackapi/tags/!new/$', TagNew.as_view(), name ='tag-new'),
     
         url(r'plstackapi/invoices/$', InvoiceList.as_view(), name='invoice-list'),
         url(r'plstackapi/invoices/(?P<pk>[a-zA-Z0-9\-]+)/$', InvoiceDetail.as_view(), name ='invoice-detail'),
+#        url(r'plstackapi/invoices/!new/$', InvoiceNew.as_view(), name ='invoice-new'),
     
         url(r'plstackapi/slice_privileges/$', SlicePrivilegeList.as_view(), name='sliceprivilege-list'),
         url(r'plstackapi/slice_privileges/(?P<pk>[a-zA-Z0-9\-]+)/$', SlicePrivilegeDetail.as_view(), name ='sliceprivilege-detail'),
+#        url(r'plstackapi/slice_privileges/!new/$', SlicePrivilegeNew.as_view(), name ='sliceprivilege-new'),
     
         url(r'plstackapi/planetstackroles/$', PlanetStackRoleList.as_view(), name='planetstackrole-list'),
         url(r'plstackapi/planetstackroles/(?P<pk>[a-zA-Z0-9\-]+)/$', PlanetStackRoleDetail.as_view(), name ='planetstackrole-detail'),
+#        url(r'plstackapi/planetstackroles/!new/$', PlanetStackRoleNew.as_view(), name ='planetstackrole-new'),
     
         url(r'plstackapi/networkslivers/$', NetworkSliverList.as_view(), name='networksliver-list'),
         url(r'plstackapi/networkslivers/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkSliverDetail.as_view(), name ='networksliver-detail'),
+#        url(r'plstackapi/networkslivers/!new/$', NetworkSliverNew.as_view(), name ='networksliver-new'),
     
         url(r'plstackapi/networkdeployments/$', NetworkDeploymentsList.as_view(), name='networkdeployments-list'),
         url(r'plstackapi/networkdeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkDeploymentsDetail.as_view(), name ='networkdeployments-detail'),
+#        url(r'plstackapi/networkdeployments/!new/$', NetworkDeploymentsNew.as_view(), name ='networkdeployments-new'),
     
         url(r'plstackapi/flavors/$', FlavorList.as_view(), name='flavor-list'),
         url(r'plstackapi/flavors/(?P<pk>[a-zA-Z0-9\-]+)/$', FlavorDetail.as_view(), name ='flavor-detail'),
+#        url(r'plstackapi/flavors/!new/$', FlavorNew.as_view(), name ='flavor-new'),
     
         url(r'plstackapi/projects/$', ProjectList.as_view(), name='project-list'),
         url(r'plstackapi/projects/(?P<pk>[a-zA-Z0-9\-]+)/$', ProjectDetail.as_view(), name ='project-detail'),
+#        url(r'plstackapi/projects/!new/$', ProjectNew.as_view(), name ='project-new'),
     
         url(r'plstackapi/slices/$', SliceList.as_view(), name='slice-list'),
         url(r'plstackapi/slices/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceDetail.as_view(), name ='slice-detail'),
+#        url(r'plstackapi/slices/!new/$', SliceNew.as_view(), name ='slice-new'),
     
         url(r'plstackapi/networks/$', NetworkList.as_view(), name='network-list'),
         url(r'plstackapi/networks/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkDetail.as_view(), name ='network-detail'),
+#        url(r'plstackapi/networks/!new/$', NetworkNew.as_view(), name ='network-new'),
     
         url(r'plstackapi/services/$', ServiceList.as_view(), name='service-list'),
         url(r'plstackapi/services/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceDetail.as_view(), name ='service-detail'),
+#        url(r'plstackapi/services/!new/$', ServiceNew.as_view(), name ='service-new'),
     
         url(r'plstackapi/serviceclasses/$', ServiceClassList.as_view(), name='serviceclass-list'),
         url(r'plstackapi/serviceclasses/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceClassDetail.as_view(), name ='serviceclass-detail'),
+#        url(r'plstackapi/serviceclasses/!new/$', ServiceClassNew.as_view(), name ='serviceclass-new'),
     
         url(r'plstackapi/payments/$', PaymentList.as_view(), name='payment-list'),
         url(r'plstackapi/payments/(?P<pk>[a-zA-Z0-9\-]+)/$', PaymentDetail.as_view(), name ='payment-detail'),
+#        url(r'plstackapi/payments/!new/$', PaymentNew.as_view(), name ='payment-new'),
     
         url(r'plstackapi/charges/$', ChargeList.as_view(), name='charge-list'),
         url(r'plstackapi/charges/(?P<pk>[a-zA-Z0-9\-]+)/$', ChargeDetail.as_view(), name ='charge-detail'),
+#        url(r'plstackapi/charges/!new/$', ChargeNew.as_view(), name ='charge-new'),
     
         url(r'plstackapi/roles/$', RoleList.as_view(), name='role-list'),
         url(r'plstackapi/roles/(?P<pk>[a-zA-Z0-9\-]+)/$', RoleDetail.as_view(), name ='role-detail'),
+#        url(r'plstackapi/roles/!new/$', RoleNew.as_view(), name ='role-new'),
     
         url(r'plstackapi/usableobjects/$', UsableObjectList.as_view(), name='usableobject-list'),
         url(r'plstackapi/usableobjects/(?P<pk>[a-zA-Z0-9\-]+)/$', UsableObjectDetail.as_view(), name ='usableobject-detail'),
+#        url(r'plstackapi/usableobjects/!new/$', UsableObjectNew.as_view(), name ='usableobject-new'),
     
         url(r'plstackapi/site_roles/$', SiteRoleList.as_view(), name='siterole-list'),
         url(r'plstackapi/site_roles/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteRoleDetail.as_view(), name ='siterole-detail'),
+#        url(r'plstackapi/site_roles/!new/$', SiteRoleNew.as_view(), name ='siterole-new'),
     
         url(r'plstackapi/slicecredentials/$', SliceCredentialList.as_view(), name='slicecredential-list'),
         url(r'plstackapi/slicecredentials/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceCredentialDetail.as_view(), name ='slicecredential-detail'),
+#        url(r'plstackapi/slicecredentials/!new/$', SliceCredentialNew.as_view(), name ='slicecredential-new'),
     
         url(r'plstackapi/slivers/$', SliverList.as_view(), name='sliver-list'),
         url(r'plstackapi/slivers/(?P<pk>[a-zA-Z0-9\-]+)/$', SliverDetail.as_view(), name ='sliver-detail'),
+#        url(r'plstackapi/slivers/!new/$', SliverNew.as_view(), name ='sliver-new'),
     
         url(r'plstackapi/nodes/$', NodeList.as_view(), name='node-list'),
         url(r'plstackapi/nodes/(?P<pk>[a-zA-Z0-9\-]+)/$', NodeDetail.as_view(), name ='node-detail'),
+#        url(r'plstackapi/nodes/!new/$', NodeNew.as_view(), name ='node-new'),
     
         url(r'plstackapi/dashboardviews/$', DashboardViewList.as_view(), name='dashboardview-list'),
         url(r'plstackapi/dashboardviews/(?P<pk>[a-zA-Z0-9\-]+)/$', DashboardViewDetail.as_view(), name ='dashboardview-detail'),
+#        url(r'plstackapi/dashboardviews/!new/$', DashboardViewNew.as_view(), name ='dashboardview-new'),
     
-        url(r'plstackapi/imagedeployments/$', ImageDeploymentList.as_view(), name='imagedeployments-list'),
-        url(r'plstackapi/imagedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', ImageDeploymentDetail.as_view(), name ='imagedeployments-detail'),
+        url(r'plstackapi/imagedeployments/$', ImageDeploymentsList.as_view(), name='imagedeployments-list'),
+        url(r'plstackapi/imagedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', ImageDeploymentsDetail.as_view(), name ='imagedeployments-detail'),
+#        url(r'plstackapi/imagedeployments/!new/$', ImageDeploymentsNew.as_view(), name ='imagedeployments-new'),
     
         url(r'plstackapi/reservedresources/$', ReservedResourceList.as_view(), name='reservedresource-list'),
         url(r'plstackapi/reservedresources/(?P<pk>[a-zA-Z0-9\-]+)/$', ReservedResourceDetail.as_view(), name ='reservedresource-detail'),
+#        url(r'plstackapi/reservedresources/!new/$', ReservedResourceNew.as_view(), name ='reservedresource-new'),
     
         url(r'plstackapi/networkslices/$', NetworkSliceList.as_view(), name='networkslice-list'),
         url(r'plstackapi/networkslices/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkSliceDetail.as_view(), name ='networkslice-detail'),
+#        url(r'plstackapi/networkslices/!new/$', NetworkSliceNew.as_view(), name ='networkslice-new'),
     
         url(r'plstackapi/userdashboardviews/$', UserDashboardViewList.as_view(), name='userdashboardview-list'),
         url(r'plstackapi/userdashboardviews/(?P<pk>[a-zA-Z0-9\-]+)/$', UserDashboardViewDetail.as_view(), name ='userdashboardview-detail'),
+#        url(r'plstackapi/userdashboardviews/!new/$', UserDashboardViewNew.as_view(), name ='userdashboardview-new'),
     
         url(r'plstackapi/planetstackprivileges/$', PlanetStackPrivilegeList.as_view(), name='planetstackprivilege-list'),
         url(r'plstackapi/planetstackprivileges/(?P<pk>[a-zA-Z0-9\-]+)/$', PlanetStackPrivilegeDetail.as_view(), name ='planetstackprivilege-detail'),
+#        url(r'plstackapi/planetstackprivileges/!new/$', PlanetStackPrivilegeNew.as_view(), name ='planetstackprivilege-new'),
     
         url(r'plstackapi/users/$', UserList.as_view(), name='user-list'),
         url(r'plstackapi/users/(?P<pk>[a-zA-Z0-9\-]+)/$', UserDetail.as_view(), name ='user-detail'),
+#        url(r'plstackapi/users/!new/$', UserNew.as_view(), name ='user-new'),
     
         url(r'plstackapi/deployments/$', DeploymentList.as_view(), name='deployment-list'),
         url(r'plstackapi/deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentDetail.as_view(), name ='deployment-detail'),
+#        url(r'plstackapi/deployments/!new/$', DeploymentNew.as_view(), name ='deployment-new'),
     
         url(r'plstackapi/reservations/$', ReservationList.as_view(), name='reservation-list'),
         url(r'plstackapi/reservations/(?P<pk>[a-zA-Z0-9\-]+)/$', ReservationDetail.as_view(), name ='reservation-detail'),
+#        url(r'plstackapi/reservations/!new/$', ReservationNew.as_view(), name ='reservation-new'),
     
-        url(r'plstackapi/slice_deployments/$', SliceDeploymentList.as_view(), name='slicedeployments-list'),
-        url(r'plstackapi/slice_deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceDeploymentDetail.as_view(), name ='slicedeployments-detail'),
+        url(r'plstackapi/slice_deployments/$', SliceDeploymentsList.as_view(), name='slicedeployments-list'),
+        url(r'plstackapi/slice_deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceDeploymentsDetail.as_view(), name ='slicedeployments-detail'),
+#        url(r'plstackapi/slice_deployments/!new/$', SliceDeploymentsNew.as_view(), name ='slicedeployments-new'),
     
         url(r'plstackapi/siteprivileges/$', SitePrivilegeList.as_view(), name='siteprivilege-list'),
         url(r'plstackapi/siteprivileges/(?P<pk>[a-zA-Z0-9\-]+)/$', SitePrivilegeDetail.as_view(), name ='siteprivilege-detail'),
+#        url(r'plstackapi/siteprivileges/!new/$', SitePrivilegeNew.as_view(), name ='siteprivilege-new'),
     
         url(r'plstackapi/planetstacks/$', PlanetStackList.as_view(), name='planetstack-list'),
         url(r'plstackapi/planetstacks/(?P<pk>[a-zA-Z0-9\-]+)/$', PlanetStackDetail.as_view(), name ='planetstack-detail'),
+#        url(r'plstackapi/planetstacks/!new/$', PlanetStackNew.as_view(), name ='planetstack-new'),
     
-        url(r'plstackapi/user_deployments/$', UserDeploymentList.as_view(), name='userdeployments-list'),
-        url(r'plstackapi/user_deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', UserDeploymentDetail.as_view(), name ='userdeployments-detail'),
+        url(r'plstackapi/user_deployments/$', UserDeploymentsList.as_view(), name='userdeployments-list'),
+        url(r'plstackapi/user_deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', UserDeploymentsDetail.as_view(), name ='userdeployments-detail'),
+#        url(r'plstackapi/user_deployments/!new/$', UserDeploymentsNew.as_view(), name ='userdeployments-new'),
     
         url(r'plstackapi/accounts/$', AccountList.as_view(), name='account-list'),
         url(r'plstackapi/accounts/(?P<pk>[a-zA-Z0-9\-]+)/$', AccountDetail.as_view(), name ='account-detail'),
+#        url(r'plstackapi/accounts/!new/$', AccountNew.as_view(), name ='account-new'),
     
         url(r'plstackapi/networkparametertypes/$', NetworkParameterTypeList.as_view(), name='networkparametertype-list'),
         url(r'plstackapi/networkparametertypes/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkParameterTypeDetail.as_view(), name ='networkparametertype-detail'),
+#        url(r'plstackapi/networkparametertypes/!new/$', NetworkParameterTypeNew.as_view(), name ='networkparametertype-new'),
     
         url(r'plstackapi/sitecredentials/$', SiteCredentialList.as_view(), name='sitecredential-list'),
         url(r'plstackapi/sitecredentials/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteCredentialDetail.as_view(), name ='sitecredential-detail'),
+#        url(r'plstackapi/sitecredentials/!new/$', SiteCredentialNew.as_view(), name ='sitecredential-new'),
     
         url(r'plstackapi/deploymentprivileges/$', DeploymentPrivilegeList.as_view(), name='deploymentprivilege-list'),
         url(r'plstackapi/deploymentprivileges/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentPrivilegeDetail.as_view(), name ='deploymentprivilege-detail'),
+#        url(r'plstackapi/deploymentprivileges/!new/$', DeploymentPrivilegeNew.as_view(), name ='deploymentprivilege-new'),
     
         url(r'plstackapi/deploymentroles/$', DeploymentRoleList.as_view(), name='deploymentrole-list'),
         url(r'plstackapi/deploymentroles/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentRoleDetail.as_view(), name ='deploymentrole-detail'),
+#        url(r'plstackapi/deploymentroles/!new/$', DeploymentRoleNew.as_view(), name ='deploymentrole-new'),
     
         url(r'plstackapi/usercredentials/$', UserCredentialList.as_view(), name='usercredential-list'),
         url(r'plstackapi/usercredentials/(?P<pk>[a-zA-Z0-9\-]+)/$', UserCredentialDetail.as_view(), name ='usercredential-detail'),
+#        url(r'plstackapi/usercredentials/!new/$', UserCredentialNew.as_view(), name ='usercredential-new'),
     
-        url(r'plstackapi/sitedeployments/$', SiteDeploymentList.as_view(), name='sitedeployments-list'),
-        url(r'plstackapi/sitedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteDeploymentDetail.as_view(), name ='sitedeployments-detail'),
+        url(r'plstackapi/sitedeployments/$', SiteDeploymentsList.as_view(), name='sitedeployments-list'),
+        url(r'plstackapi/sitedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteDeploymentsDetail.as_view(), name ='sitedeployments-detail'),
+#        url(r'plstackapi/sitedeployments/!new/$', SiteDeploymentsNew.as_view(), name ='sitedeployments-new'),
     
         url(r'plstackapi/slicetags/$', SliceTagList.as_view(), name='slicetag-list'),
         url(r'plstackapi/slicetags/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceTagDetail.as_view(), name ='slicetag-detail'),
+#        url(r'plstackapi/slicetags/!new/$', SliceTagNew.as_view(), name ='slicetag-new'),
     
         url(r'plstackapi/networktemplates/$', NetworkTemplateList.as_view(), name='networktemplate-list'),
         url(r'plstackapi/networktemplates/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkTemplateDetail.as_view(), name ='networktemplate-detail'),
+#        url(r'plstackapi/networktemplates/!new/$', NetworkTemplateNew.as_view(), name ='networktemplate-new'),
     
         url(r'plstackapi/routers/$', RouterList.as_view(), name='router-list'),
         url(r'plstackapi/routers/(?P<pk>[a-zA-Z0-9\-]+)/$', RouterDetail.as_view(), name ='router-detail'),
+#        url(r'plstackapi/routers/!new/$', RouterNew.as_view(), name ='router-new'),
     
         url(r'plstackapi/serviceresources/$', ServiceResourceList.as_view(), name='serviceresource-list'),
         url(r'plstackapi/serviceresources/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceResourceDetail.as_view(), name ='serviceresource-detail'),
+#        url(r'plstackapi/serviceresources/!new/$', ServiceResourceNew.as_view(), name ='serviceresource-new'),
     
     )
 
@@ -757,18 +807,18 @@
 
 
 
-class ImageDeploymentSerializer(serializers.HyperlinkedModelSerializer):
+class ImageDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = ImageDeployment
+        model = ImageDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','image','deployment','glance_image_id',)
 
-class ImageDeploymentIdSerializer(serializers.ModelSerializer):
+class ImageDeploymentsIdSerializer(serializers.ModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = ImageDeployment
+        model = ImageDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','image','deployment','glance_image_id',)
 
 
@@ -925,18 +975,18 @@
 
 
 
-class SliceDeploymentSerializer(serializers.HyperlinkedModelSerializer):
+class SliceDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = SliceDeployment
+        model = SliceDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','slice','deployment','tenant_id','network_id','router_id','subnet_id',)
 
-class SliceDeploymentIdSerializer(serializers.ModelSerializer):
+class SliceDeploymentsIdSerializer(serializers.ModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = SliceDeployment
+        model = SliceDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','slice','deployment','tenant_id','network_id','router_id','subnet_id',)
 
 
@@ -976,18 +1026,18 @@
 
 
 
-class UserDeploymentSerializer(serializers.HyperlinkedModelSerializer):
+class UserDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = UserDeployment
+        model = UserDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','user','deployment','kuser_id',)
 
-class UserDeploymentIdSerializer(serializers.ModelSerializer):
+class UserDeploymentsIdSerializer(serializers.ModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = UserDeployment
+        model = UserDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','user','deployment','kuser_id',)
 
 
@@ -1095,18 +1145,18 @@
 
 
 
-class SiteDeploymentSerializer(serializers.HyperlinkedModelSerializer):
+class SiteDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = SiteDeployment
+        model = SiteDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','site','deployment','tenant_id',)
 
-class SiteDeploymentIdSerializer(serializers.ModelSerializer):
+class SiteDeploymentsIdSerializer(serializers.ModelSerializer):
     id = serializers.Field()
     
     class Meta:
-        model = SiteDeployment
+        model = SiteDeployments
         fields = ('id','created','updated','enacted','backend_status','deleted','site','deployment','tenant_id',)
 
 
@@ -1234,7 +1284,7 @@
 
                  DashboardView: DashboardViewSerializer,
 
-                 ImageDeployment: ImageDeploymentSerializer,
+                 ImageDeployments: ImageDeploymentsSerializer,
 
                  ReservedResource: ReservedResourceSerializer,
 
@@ -1250,13 +1300,13 @@
 
                  Reservation: ReservationSerializer,
 
-                 SliceDeployment: SliceDeploymentSerializer,
+                 SliceDeployments: SliceDeploymentsSerializer,
 
                  SitePrivilege: SitePrivilegeSerializer,
 
                  PlanetStack: PlanetStackSerializer,
 
-                 UserDeployment: UserDeploymentSerializer,
+                 UserDeployments: UserDeploymentsSerializer,
 
                  Account: AccountSerializer,
 
@@ -1270,7 +1320,7 @@
 
                  UserCredential: UserCredentialSerializer,
 
-                 SiteDeployment: SiteDeploymentSerializer,
+                 SiteDeployments: SiteDeploymentsSerializer,
 
                  SliceTag: SliceTagSerializer,
 
@@ -1349,7 +1399,10 @@
         return ServiceAttribute.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = ServiceAttribute(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ServiceAttributeList, self).create(request, *args, **kwargs)
@@ -1382,6 +1435,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ServiceAttributeNew(GenericAPIView):
+    serializer_class = ServiceAttributeSerializer
+    id_serializer_class = ServiceAttributeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = ServiceAttribute()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ImageList(generics.ListCreateAPIView):
@@ -1402,7 +1480,10 @@
         return Image.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Image(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ImageList, self).create(request, *args, **kwargs)
@@ -1435,6 +1516,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ImageNew(GenericAPIView):
+    serializer_class = ImageSerializer
+    id_serializer_class = ImageIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Image()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkParameterList(generics.ListCreateAPIView):
@@ -1455,7 +1561,10 @@
         return NetworkParameter.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkParameter(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkParameterList, self).create(request, *args, **kwargs)
@@ -1488,6 +1597,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkParameterNew(GenericAPIView):
+    serializer_class = NetworkParameterSerializer
+    id_serializer_class = NetworkParameterIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkParameter()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SiteList(generics.ListCreateAPIView):
@@ -1508,7 +1642,10 @@
         return Site.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Site(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SiteList, self).create(request, *args, **kwargs)
@@ -1541,6 +1678,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SiteNew(GenericAPIView):
+    serializer_class = SiteSerializer
+    id_serializer_class = SiteIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Site()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SliceRoleList(generics.ListCreateAPIView):
@@ -1561,7 +1723,10 @@
         return SliceRole.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SliceRole(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SliceRoleList, self).create(request, *args, **kwargs)
@@ -1594,6 +1759,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliceRoleNew(GenericAPIView):
+    serializer_class = SliceRoleSerializer
+    id_serializer_class = SliceRoleIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SliceRole()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class TagList(generics.ListCreateAPIView):
@@ -1614,7 +1804,10 @@
         return Tag.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Tag(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(TagList, self).create(request, *args, **kwargs)
@@ -1647,6 +1840,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class TagNew(GenericAPIView):
+    serializer_class = TagSerializer
+    id_serializer_class = TagIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Tag()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class InvoiceList(generics.ListCreateAPIView):
@@ -1667,7 +1885,10 @@
         return Invoice.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Invoice(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(InvoiceList, self).create(request, *args, **kwargs)
@@ -1700,6 +1921,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class InvoiceNew(GenericAPIView):
+    serializer_class = InvoiceSerializer
+    id_serializer_class = InvoiceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Invoice()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SlicePrivilegeList(generics.ListCreateAPIView):
@@ -1720,7 +1966,10 @@
         return SlicePrivilege.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SlicePrivilege(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SlicePrivilegeList, self).create(request, *args, **kwargs)
@@ -1753,6 +2002,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SlicePrivilegeNew(GenericAPIView):
+    serializer_class = SlicePrivilegeSerializer
+    id_serializer_class = SlicePrivilegeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SlicePrivilege()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class PlanetStackRoleList(generics.ListCreateAPIView):
@@ -1773,7 +2047,10 @@
         return PlanetStackRole.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = PlanetStackRole(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(PlanetStackRoleList, self).create(request, *args, **kwargs)
@@ -1806,6 +2083,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class PlanetStackRoleNew(GenericAPIView):
+    serializer_class = PlanetStackRoleSerializer
+    id_serializer_class = PlanetStackRoleIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = PlanetStackRole()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkSliverList(generics.ListCreateAPIView):
@@ -1826,7 +2128,10 @@
         return NetworkSliver.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkSliver(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkSliverList, self).create(request, *args, **kwargs)
@@ -1859,6 +2164,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkSliverNew(GenericAPIView):
+    serializer_class = NetworkSliverSerializer
+    id_serializer_class = NetworkSliverIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkSliver()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkDeploymentsList(generics.ListCreateAPIView):
@@ -1879,7 +2209,10 @@
         return NetworkDeployments.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkDeployments(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkDeploymentsList, self).create(request, *args, **kwargs)
@@ -1912,6 +2245,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkDeploymentsNew(GenericAPIView):
+    serializer_class = NetworkDeploymentsSerializer
+    id_serializer_class = NetworkDeploymentsIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkDeployments()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class FlavorList(generics.ListCreateAPIView):
@@ -1932,7 +2290,10 @@
         return Flavor.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Flavor(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(FlavorList, self).create(request, *args, **kwargs)
@@ -1965,6 +2326,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class FlavorNew(GenericAPIView):
+    serializer_class = FlavorSerializer
+    id_serializer_class = FlavorIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Flavor()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ProjectList(generics.ListCreateAPIView):
@@ -1985,7 +2371,10 @@
         return Project.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Project(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ProjectList, self).create(request, *args, **kwargs)
@@ -2018,6 +2407,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ProjectNew(GenericAPIView):
+    serializer_class = ProjectSerializer
+    id_serializer_class = ProjectIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Project()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SliceList(generics.ListCreateAPIView):
@@ -2038,7 +2452,10 @@
         return Slice.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Slice(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SliceList, self).create(request, *args, **kwargs)
@@ -2071,6 +2488,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliceNew(GenericAPIView):
+    serializer_class = SliceSerializer
+    id_serializer_class = SliceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Slice()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkList(generics.ListCreateAPIView):
@@ -2091,7 +2533,10 @@
         return Network.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Network(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkList, self).create(request, *args, **kwargs)
@@ -2124,6 +2569,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkNew(GenericAPIView):
+    serializer_class = NetworkSerializer
+    id_serializer_class = NetworkIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Network()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ServiceList(generics.ListCreateAPIView):
@@ -2144,7 +2614,10 @@
         return Service.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Service(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ServiceList, self).create(request, *args, **kwargs)
@@ -2177,6 +2650,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ServiceNew(GenericAPIView):
+    serializer_class = ServiceSerializer
+    id_serializer_class = ServiceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Service()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ServiceClassList(generics.ListCreateAPIView):
@@ -2197,7 +2695,10 @@
         return ServiceClass.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = ServiceClass(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ServiceClassList, self).create(request, *args, **kwargs)
@@ -2230,6 +2731,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ServiceClassNew(GenericAPIView):
+    serializer_class = ServiceClassSerializer
+    id_serializer_class = ServiceClassIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = ServiceClass()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class PaymentList(generics.ListCreateAPIView):
@@ -2250,7 +2776,10 @@
         return Payment.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Payment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(PaymentList, self).create(request, *args, **kwargs)
@@ -2283,6 +2812,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class PaymentNew(GenericAPIView):
+    serializer_class = PaymentSerializer
+    id_serializer_class = PaymentIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Payment()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ChargeList(generics.ListCreateAPIView):
@@ -2303,7 +2857,10 @@
         return Charge.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Charge(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ChargeList, self).create(request, *args, **kwargs)
@@ -2336,6 +2893,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ChargeNew(GenericAPIView):
+    serializer_class = ChargeSerializer
+    id_serializer_class = ChargeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Charge()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class RoleList(generics.ListCreateAPIView):
@@ -2356,7 +2938,10 @@
         return Role.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Role(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(RoleList, self).create(request, *args, **kwargs)
@@ -2389,6 +2974,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class RoleNew(GenericAPIView):
+    serializer_class = RoleSerializer
+    id_serializer_class = RoleIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Role()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class UsableObjectList(generics.ListCreateAPIView):
@@ -2409,7 +3019,10 @@
         return UsableObject.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = UsableObject(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(UsableObjectList, self).create(request, *args, **kwargs)
@@ -2442,6 +3055,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class UsableObjectNew(GenericAPIView):
+    serializer_class = UsableObjectSerializer
+    id_serializer_class = UsableObjectIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = UsableObject()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SiteRoleList(generics.ListCreateAPIView):
@@ -2462,7 +3100,10 @@
         return SiteRole.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SiteRole(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SiteRoleList, self).create(request, *args, **kwargs)
@@ -2495,6 +3136,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SiteRoleNew(GenericAPIView):
+    serializer_class = SiteRoleSerializer
+    id_serializer_class = SiteRoleIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SiteRole()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SliceCredentialList(generics.ListCreateAPIView):
@@ -2515,7 +3181,10 @@
         return SliceCredential.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SliceCredential(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SliceCredentialList, self).create(request, *args, **kwargs)
@@ -2548,6 +3217,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliceCredentialNew(GenericAPIView):
+    serializer_class = SliceCredentialSerializer
+    id_serializer_class = SliceCredentialIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SliceCredential()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SliverList(generics.ListCreateAPIView):
@@ -2568,7 +3262,10 @@
         return Sliver.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Sliver(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SliverList, self).create(request, *args, **kwargs)
@@ -2601,6 +3298,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliverNew(GenericAPIView):
+    serializer_class = SliverSerializer
+    id_serializer_class = SliverIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Sliver()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NodeList(generics.ListCreateAPIView):
@@ -2621,7 +3343,10 @@
         return Node.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Node(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NodeList, self).create(request, *args, **kwargs)
@@ -2654,6 +3379,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NodeNew(GenericAPIView):
+    serializer_class = NodeSerializer
+    id_serializer_class = NodeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Node()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class DashboardViewList(generics.ListCreateAPIView):
@@ -2674,7 +3424,10 @@
         return DashboardView.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = DashboardView(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(DashboardViewList, self).create(request, *args, **kwargs)
@@ -2707,12 +3460,37 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class DashboardViewNew(GenericAPIView):
+    serializer_class = DashboardViewSerializer
+    id_serializer_class = DashboardViewIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = DashboardView()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
 
 
-class ImageDeploymentList(generics.ListCreateAPIView):
-    queryset = ImageDeployment.objects.select_related().all()
-    serializer_class = ImageDeploymentSerializer
-    id_serializer_class = ImageDeploymentIdSerializer
+
+class ImageDeploymentsList(generics.ListCreateAPIView):
+    queryset = ImageDeployments.objects.select_related().all()
+    serializer_class = ImageDeploymentsSerializer
+    id_serializer_class = ImageDeploymentsIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','image','deployment','glance_image_id',)
 
@@ -2724,27 +3502,30 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return ImageDeployment.select_by_user(self.request.user)
+        return ImageDeployments.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = ImageDeployment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(ImageDeploymentList, self).create(request, *args, **kwargs)
+            return super(ImageDeploymentsList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(ImageDeploymentList, self).create(request, *args, **kwargs)
+        ret = super(ImageDeploymentsList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class ImageDeploymentDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = ImageDeployment.objects.select_related().all()
-    serializer_class = ImageDeploymentSerializer
-    id_serializer_class = ImageDeploymentIdSerializer
+class ImageDeploymentsDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = ImageDeployments.objects.select_related().all()
+    serializer_class = ImageDeploymentsSerializer
+    id_serializer_class = ImageDeploymentsIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -2754,12 +3535,37 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return ImageDeployment.select_by_user(self.request.user)
+        return ImageDeployments.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ImageDeploymentsNew(GenericAPIView):
+    serializer_class = ImageDeploymentsSerializer
+    id_serializer_class = ImageDeploymentsIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = ImageDeployments()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ReservedResourceList(generics.ListCreateAPIView):
@@ -2780,7 +3586,10 @@
         return ReservedResource.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = ReservedResource(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ReservedResourceList, self).create(request, *args, **kwargs)
@@ -2813,6 +3622,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ReservedResourceNew(GenericAPIView):
+    serializer_class = ReservedResourceSerializer
+    id_serializer_class = ReservedResourceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = ReservedResource()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkSliceList(generics.ListCreateAPIView):
@@ -2833,7 +3667,10 @@
         return NetworkSlice.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkSlice(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkSliceList, self).create(request, *args, **kwargs)
@@ -2866,6 +3703,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkSliceNew(GenericAPIView):
+    serializer_class = NetworkSliceSerializer
+    id_serializer_class = NetworkSliceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkSlice()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class UserDashboardViewList(generics.ListCreateAPIView):
@@ -2886,7 +3748,10 @@
         return UserDashboardView.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = UserDashboardView(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(UserDashboardViewList, self).create(request, *args, **kwargs)
@@ -2919,6 +3784,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class UserDashboardViewNew(GenericAPIView):
+    serializer_class = UserDashboardViewSerializer
+    id_serializer_class = UserDashboardViewIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = UserDashboardView()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class PlanetStackPrivilegeList(generics.ListCreateAPIView):
@@ -2939,7 +3829,10 @@
         return PlanetStackPrivilege.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = PlanetStackPrivilege(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(PlanetStackPrivilegeList, self).create(request, *args, **kwargs)
@@ -2972,6 +3865,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class PlanetStackPrivilegeNew(GenericAPIView):
+    serializer_class = PlanetStackPrivilegeSerializer
+    id_serializer_class = PlanetStackPrivilegeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = PlanetStackPrivilege()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class UserList(generics.ListCreateAPIView):
@@ -2992,7 +3910,10 @@
         return User.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = User(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(UserList, self).create(request, *args, **kwargs)
@@ -3025,6 +3946,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class UserNew(GenericAPIView):
+    serializer_class = UserSerializer
+    id_serializer_class = UserIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = User()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class DeploymentList(generics.ListCreateAPIView):
@@ -3045,7 +3991,10 @@
         return Deployment.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Deployment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(DeploymentList, self).create(request, *args, **kwargs)
@@ -3078,6 +4027,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class DeploymentNew(GenericAPIView):
+    serializer_class = DeploymentSerializer
+    id_serializer_class = DeploymentIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Deployment()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ReservationList(generics.ListCreateAPIView):
@@ -3098,7 +4072,10 @@
         return Reservation.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Reservation(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ReservationList, self).create(request, *args, **kwargs)
@@ -3131,12 +4108,37 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ReservationNew(GenericAPIView):
+    serializer_class = ReservationSerializer
+    id_serializer_class = ReservationIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Reservation()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
 
 
-class SliceDeploymentList(generics.ListCreateAPIView):
-    queryset = SliceDeployment.objects.select_related().all()
-    serializer_class = SliceDeploymentSerializer
-    id_serializer_class = SliceDeploymentIdSerializer
+
+class SliceDeploymentsList(generics.ListCreateAPIView):
+    queryset = SliceDeployments.objects.select_related().all()
+    serializer_class = SliceDeploymentsSerializer
+    id_serializer_class = SliceDeploymentsIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','slice','deployment','tenant_id','network_id','router_id','subnet_id',)
 
@@ -3148,27 +4150,30 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return SliceDeployment.select_by_user(self.request.user)
+        return SliceDeployments.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SliceDeployment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(SliceDeploymentList, self).create(request, *args, **kwargs)
+            return super(SliceDeploymentsList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(SliceDeploymentList, self).create(request, *args, **kwargs)
+        ret = super(SliceDeploymentsList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class SliceDeploymentDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = SliceDeployment.objects.select_related().all()
-    serializer_class = SliceDeploymentSerializer
-    id_serializer_class = SliceDeploymentIdSerializer
+class SliceDeploymentsDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = SliceDeployments.objects.select_related().all()
+    serializer_class = SliceDeploymentsSerializer
+    id_serializer_class = SliceDeploymentsIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -3178,12 +4183,37 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return SliceDeployment.select_by_user(self.request.user)
+        return SliceDeployments.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliceDeploymentsNew(GenericAPIView):
+    serializer_class = SliceDeploymentsSerializer
+    id_serializer_class = SliceDeploymentsIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SliceDeployments()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SitePrivilegeList(generics.ListCreateAPIView):
@@ -3204,7 +4234,10 @@
         return SitePrivilege.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SitePrivilege(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SitePrivilegeList, self).create(request, *args, **kwargs)
@@ -3237,6 +4270,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SitePrivilegeNew(GenericAPIView):
+    serializer_class = SitePrivilegeSerializer
+    id_serializer_class = SitePrivilegeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SitePrivilege()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class PlanetStackList(generics.ListCreateAPIView):
@@ -3257,7 +4315,10 @@
         return PlanetStack.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = PlanetStack(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(PlanetStackList, self).create(request, *args, **kwargs)
@@ -3290,12 +4351,37 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class PlanetStackNew(GenericAPIView):
+    serializer_class = PlanetStackSerializer
+    id_serializer_class = PlanetStackIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = PlanetStack()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
 
 
-class UserDeploymentList(generics.ListCreateAPIView):
-    queryset = UserDeployment.objects.select_related().all()
-    serializer_class = UserDeploymentSerializer
-    id_serializer_class = UserDeploymentIdSerializer
+
+class UserDeploymentsList(generics.ListCreateAPIView):
+    queryset = UserDeployments.objects.select_related().all()
+    serializer_class = UserDeploymentsSerializer
+    id_serializer_class = UserDeploymentsIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','user','deployment','kuser_id',)
 
@@ -3307,27 +4393,30 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return UserDeployment.select_by_user(self.request.user)
+        return UserDeployments.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = UserDeployment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(UserDeploymentList, self).create(request, *args, **kwargs)
+            return super(UserDeploymentsList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(UserDeploymentList, self).create(request, *args, **kwargs)
+        ret = super(UserDeploymentsList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class UserDeploymentDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = UserDeployment.objects.select_related().all()
-    serializer_class = UserDeploymentSerializer
-    id_serializer_class = UserDeploymentIdSerializer
+class UserDeploymentsDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = UserDeployments.objects.select_related().all()
+    serializer_class = UserDeploymentsSerializer
+    id_serializer_class = UserDeploymentsIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -3337,12 +4426,37 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return UserDeployment.select_by_user(self.request.user)
+        return UserDeployments.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class UserDeploymentsNew(GenericAPIView):
+    serializer_class = UserDeploymentsSerializer
+    id_serializer_class = UserDeploymentsIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = UserDeployments()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class AccountList(generics.ListCreateAPIView):
@@ -3363,7 +4477,10 @@
         return Account.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Account(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(AccountList, self).create(request, *args, **kwargs)
@@ -3396,6 +4513,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class AccountNew(GenericAPIView):
+    serializer_class = AccountSerializer
+    id_serializer_class = AccountIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Account()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkParameterTypeList(generics.ListCreateAPIView):
@@ -3416,7 +4558,10 @@
         return NetworkParameterType.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkParameterType(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkParameterTypeList, self).create(request, *args, **kwargs)
@@ -3449,6 +4594,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkParameterTypeNew(GenericAPIView):
+    serializer_class = NetworkParameterTypeSerializer
+    id_serializer_class = NetworkParameterTypeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkParameterType()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SiteCredentialList(generics.ListCreateAPIView):
@@ -3469,7 +4639,10 @@
         return SiteCredential.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SiteCredential(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SiteCredentialList, self).create(request, *args, **kwargs)
@@ -3502,6 +4675,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SiteCredentialNew(GenericAPIView):
+    serializer_class = SiteCredentialSerializer
+    id_serializer_class = SiteCredentialIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SiteCredential()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class DeploymentPrivilegeList(generics.ListCreateAPIView):
@@ -3522,7 +4720,10 @@
         return DeploymentPrivilege.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = DeploymentPrivilege(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(DeploymentPrivilegeList, self).create(request, *args, **kwargs)
@@ -3555,6 +4756,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class DeploymentPrivilegeNew(GenericAPIView):
+    serializer_class = DeploymentPrivilegeSerializer
+    id_serializer_class = DeploymentPrivilegeIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = DeploymentPrivilege()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class DeploymentRoleList(generics.ListCreateAPIView):
@@ -3575,7 +4801,10 @@
         return DeploymentRole.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = DeploymentRole(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(DeploymentRoleList, self).create(request, *args, **kwargs)
@@ -3608,6 +4837,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class DeploymentRoleNew(GenericAPIView):
+    serializer_class = DeploymentRoleSerializer
+    id_serializer_class = DeploymentRoleIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = DeploymentRole()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class UserCredentialList(generics.ListCreateAPIView):
@@ -3628,7 +4882,10 @@
         return UserCredential.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = UserCredential(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(UserCredentialList, self).create(request, *args, **kwargs)
@@ -3661,12 +4918,37 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class UserCredentialNew(GenericAPIView):
+    serializer_class = UserCredentialSerializer
+    id_serializer_class = UserCredentialIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = UserCredential()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
 
 
-class SiteDeploymentList(generics.ListCreateAPIView):
-    queryset = SiteDeployment.objects.select_related().all()
-    serializer_class = SiteDeploymentSerializer
-    id_serializer_class = SiteDeploymentIdSerializer
+
+class SiteDeploymentsList(generics.ListCreateAPIView):
+    queryset = SiteDeployments.objects.select_related().all()
+    serializer_class = SiteDeploymentsSerializer
+    id_serializer_class = SiteDeploymentsIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','site','deployment','tenant_id',)
 
@@ -3678,27 +4960,30 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return SiteDeployment.select_by_user(self.request.user)
+        return SiteDeployments.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SiteDeployment(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(SiteDeploymentList, self).create(request, *args, **kwargs)
+            return super(SiteDeploymentsList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(SiteDeploymentList, self).create(request, *args, **kwargs)
+        ret = super(SiteDeploymentsList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class SiteDeploymentDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = SiteDeployment.objects.select_related().all()
-    serializer_class = SiteDeploymentSerializer
-    id_serializer_class = SiteDeploymentIdSerializer
+class SiteDeploymentsDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = SiteDeployments.objects.select_related().all()
+    serializer_class = SiteDeploymentsSerializer
+    id_serializer_class = SiteDeploymentsIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -3708,12 +4993,37 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return SiteDeployment.select_by_user(self.request.user)
+        return SiteDeployments.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SiteDeploymentsNew(GenericAPIView):
+    serializer_class = SiteDeploymentsSerializer
+    id_serializer_class = SiteDeploymentsIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SiteDeployments()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class SliceTagList(generics.ListCreateAPIView):
@@ -3734,7 +5044,10 @@
         return SliceTag.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = SliceTag(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(SliceTagList, self).create(request, *args, **kwargs)
@@ -3767,6 +5080,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class SliceTagNew(GenericAPIView):
+    serializer_class = SliceTagSerializer
+    id_serializer_class = SliceTagIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = SliceTag()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class NetworkTemplateList(generics.ListCreateAPIView):
@@ -3787,7 +5125,10 @@
         return NetworkTemplate.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = NetworkTemplate(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(NetworkTemplateList, self).create(request, *args, **kwargs)
@@ -3820,6 +5161,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class NetworkTemplateNew(GenericAPIView):
+    serializer_class = NetworkTemplateSerializer
+    id_serializer_class = NetworkTemplateIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = NetworkTemplate()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class RouterList(generics.ListCreateAPIView):
@@ -3840,7 +5206,10 @@
         return Router.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = Router(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(RouterList, self).create(request, *args, **kwargs)
@@ -3873,6 +5242,31 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class RouterNew(GenericAPIView):
+    serializer_class = RouterSerializer
+    id_serializer_class = RouterIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = Router()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
 class ServiceResourceList(generics.ListCreateAPIView):
@@ -3893,7 +5287,10 @@
         return ServiceResource.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
-        obj = ServiceResource(**request.DATA)
+        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
+        if not (serializer.is_valid()):
+            raise Exception("failed serializer.is_valid: " + str(serializer.errors))
+        obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
             return super(ServiceResourceList, self).create(request, *args, **kwargs)
@@ -3926,5 +5323,30 @@
 
     # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
+"""
+    XXX smbaker: my intent was to create a view that would return 'new' objects
+    filled with defaults. I solved it another way, so this code may soon be
+    abandoned.
+
+class ServiceResourceNew(GenericAPIView):
+    serializer_class = ServiceResourceSerializer
+    id_serializer_class = ServiceResourceIdSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.makenew(request, *args, **kwargs)
+
+    def get_serializer_class(self):
+        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+        if (no_hyperlinks):
+            return self.id_serializer_class
+        else:
+            return self.serializer_class
+
+    def makenew(self, request, *args, **kwargs):
+        obj = ServiceResource()
+        serializer = self.get_serializer(obj)
+        return Response(serializer.data)
+"""
+
 
 
diff --git a/planetstack/model_policies/model_policy_Slice.py b/planetstack/model_policies/model_policy_Slice.py
index 7523e3e..7b436b4 100644
--- a/planetstack/model_policies/model_policy_Slice.py
+++ b/planetstack/model_policies/model_policy_Slice.py
@@ -35,13 +35,13 @@
 			private_net = network
 	if not public_nets:
                 # ensure there is at least one public network, and default it to dedicated
-		dedicated_public_net = Network(
-          	    name = slice.name+'-public',
-             	    template = NetworkTemplate.objects.get(name='Public dedicated IPv4'),
+		nat_net = Network(
+          	    name = slice.name+'-nat',
+             	    template = NetworkTemplate.objects.get(name='Public shared IPv4'),
           	    owner = slice
       		    )
-		dedicated_public_net.save()
-                public_nets.append(dedicated_public_net)
+		nat_net.save()
+                public_nets.append(nat_net)
 
 	if not private_net:
         	private_net = Network(
diff --git a/planetstack/openstack_observer/steps/sync_networks.py b/planetstack/openstack_observer/steps/sync_networks.py
index 5174fe6..99f2c01 100644
--- a/planetstack/openstack_observer/steps/sync_networks.py
+++ b/planetstack/openstack_observer/steps/sync_networks.py
@@ -21,6 +21,6 @@
         for network_deployment in NetworkDeployments.objects.filter(network=network):
             try:
                 network_deployment_deleter(network_deployment)    
-            except Exeption,e:
+            except Exception,e:
                 logger.log_exc("Failed to delete network deployment %s" % network_deployment)
                 raise e