Write handler for create form, and consolidate code to require POST into a CherryPy...
authorQuentin Smith <quentin@mit.edu>
Mon, 10 Aug 2009 03:38:06 +0000 (23:38 -0400)
committerQuentin Smith <quentin@mit.edu>
Mon, 10 Aug 2009 03:38:06 +0000 (23:38 -0400)
svn path=/package_branches/invirt-web/cherrypy-rebased/; revision=2685

code/main.py
code/view.py

index ba892bf..e068e48 100755 (executable)
@@ -146,6 +146,36 @@ console will suffer artifacts.
                     mapping=help_mapping)
     help._cp_config['tools.require_login.on'] = False
 
+    def parseCreate(self, fields):
+        kws = dict([(kw, fields.get(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()])
+        validate = validation.Validate(cherrypy.request.login, cherrypy.request.state, strict=True, **kws)
+        return dict(contact=cherrypy.request.login, name=validate.name, description=validate.description, memory=validate.memory,
+                    disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type),
+                    cdrom=getattr(validate, 'cdrom', None),
+                    autoinstall=getattr(validate, 'autoinstall', None))
+
+    @cherrypy.expose
+    @cherrypy.tools.mako(filename="/list.mako")
+    @cherrypy.tools.require_POST()
+    def create(self, **fields):
+        """Handler for create requests."""
+        try:
+            parsed_fields = self.parseCreate(fields)
+            machine = controls.createVm(cherrypy.request.login, cherrypy.request.state, **parsed_fields)
+        except InvalidInput, err:
+            pass
+        else:
+            err = None
+        cherrypy.request.state.clear() #Changed global state
+        d = getListDict(cherrypy.request.login, cherrypy.request.state)
+        d['err'] = err
+        if err:
+            for field in fields.keys():
+                setattr(d['defaults'], field, fields.get(field))
+        else:
+            d['new_machine'] = parsed_fields['name']
+        return d
+
     @cherrypy.expose
     @cherrypy.tools.mako(filename="/helloworld.mako")
     def helloworld(self, **kwargs):
@@ -218,10 +248,9 @@ console will suffer artifacts.
             return d
         @cherrypy.expose
         @cherrypy.tools.mako(filename="/command.mako")
+        @cherrypy.tools.require_POST()
         def command(self, command_name, machine_id, **kwargs):
             """Handler for running commands like boot and delete on a VM."""
-            if cherrypy.request.method != "POST":
-                raise InvalidInput("request.method", command_name, "You must execute commands via POST")
             back = kwargs.get('back', None)
             try:
                 d = controls.commandResult(cherrypy.request.login, cherrypy.request.state, command_name, machine_id, kwargs)
@@ -337,33 +366,6 @@ def hasVnc(status):
             return 'location' in d
     return False
 
-def parseCreate(username, state, fields):
-    kws = dict([(kw, fields.getfirst(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()])
-    validate = validation.Validate(username, state, strict=True, **kws)
-    return dict(contact=username, name=validate.name, description=validate.description, memory=validate.memory,
-                disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type),
-                cdrom=getattr(validate, 'cdrom', None),
-                autoinstall=getattr(validate, 'autoinstall', None))
-
-def create(username, state, path, fields):
-    """Handler for create requests."""
-    try:
-        parsed_fields = parseCreate(username, state, fields)
-        machine = controls.createVm(username, state, **parsed_fields)
-    except InvalidInput, err:
-        pass
-    else:
-        err = None
-    state.clear() #Changed global state
-    d = getListDict(username, state)
-    d['err'] = err
-    if err:
-        for field in fields.keys():
-            setattr(d['defaults'], field, fields.getfirst(field))
-    else:
-        d['new_machine'] = parsed_fields['name']
-    return templates.list(searchList=[d])
-
 
 def getListDict(username, state):
     """Gets the list of local variables used by list.tmpl."""
@@ -652,7 +654,6 @@ def throwError(_, __, ___, ____):
 
 mapping = dict(
                modify=modify,
-               create=create,
                unauth=unauthFront,
                admin=admin,
                overlord=admin,
index 87a527b..e1ba854 100644 (file)
@@ -82,6 +82,14 @@ def require_login():
 
 cherrypy.tools.require_login = cherrypy.Tool('on_start_resource', require_login, priority=150)
 
+def require_POST():
+    """If the request isn't a POST request, raise 405 Method Not Allowed"""
+    if cherrypy.request.method != "POST":
+        raise cherrypy.HTTPError(405,
+                                 "You must submit this request with POST")
+
+cherrypy.tools.require_POST = cherrypy.Tool('on_start_resource', require_POST, priority=150)
+
 def remote_user_login():
     """Get the current user based on the SSL or GSSAPI environment variables"""
     environ = cherrypy.request.wsgi_environ