| Index: third_party/twisted_8_1/twisted/web/woven/input.py
|
| diff --git a/third_party/twisted_8_1/twisted/web/woven/input.py b/third_party/twisted_8_1/twisted/web/woven/input.py
|
| deleted file mode 100644
|
| index 7d7d956b8e1a5292758c16b51d8351bf9620c432..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/web/woven/input.py
|
| +++ /dev/null
|
| @@ -1,347 +0,0 @@
|
| -# -*- test-case-name: twisted.web.test.test_woven -*-
|
| -#
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -# dominput
|
| -
|
| -import os
|
| -import inspect
|
| -
|
| -from twisted.internet import defer
|
| -from twisted.python import log
|
| -from twisted.python.reflect import qual
|
| -
|
| -from twisted.web import domhelpers
|
| -from twisted.web.woven import template, controller, utils
|
| -
|
| -__version__ = "$Revision: 1.34 $"[11:-2]
|
| -
|
| -controllerFactory = controller.controllerFactory
|
| -
|
| -
|
| -class InputHandler(controller.Controller):
|
| - """
|
| - An InputHandler is like a controller, but it operates on something
|
| - contained inside of C{self.model} instead of directly on C{self.model}.
|
| - For example, a Handler whose C{model} has been set to C{"foo"} will handle
|
| - C{self.model.foo}.
|
| -
|
| - The handler's job is to interpret the request and:
|
| -
|
| - 1. Check for valid input
|
| - 2. If the input is valid, update the model
|
| - 3. Use any special API of the view widget to change the view (other
|
| - than what the view updates automatically from the model) e.g. in the
|
| - case of an error, tell the view to report an error to the user
|
| - 4. Return a success value; by default these values are simply recorded
|
| - and the page is rendered, but these values could be used to determine
|
| - what page to display next, etc.
|
| - """
|
| - invalidErrorText = "Error!"
|
| - setupStacks = 0
|
| - def __init__(self, model=None,
|
| - parent=None,
|
| - name=None,
|
| - check=None,
|
| - commit = None,
|
| - invalidErrorText = None,
|
| - submodel=None,
|
| - controllerStack=None):
|
| - self.controllerStack = controllerStack
|
| - controller.Controller.__init__(self, model)
|
| - self._check = check
|
| - self._commit = commit
|
| - self._errback = None
|
| - self._parent = parent
|
| - if invalidErrorText is not None:
|
| - self.invalidErrorText = invalidErrorText
|
| - if submodel is not None:
|
| - self.submodel = submodel
|
| - if name is not None:
|
| - self.inputName = name
|
| -
|
| - def initialize(self):
|
| - pass
|
| -
|
| - def setNode(self, node):
|
| - self.node = node
|
| -
|
| - def getInput(self, request):
|
| - """
|
| - Return the data associated with this handler from the request, if any.
|
| - """
|
| - name = getattr(self, 'inputName', self.submodel)
|
| - input = request.args.get(name, None)
|
| - if input:
|
| - return input
|
| -
|
| - def handle(self, request):
|
| - self.initialize()
|
| - data = self.getInput(request)
|
| - success = self.check(request, data)
|
| - if isinstance(success, defer.Deferred):
|
| - success.addCallback(self.dispatchCheckResult, request, data)
|
| - success.addErrback(utils.renderFailure, request)
|
| - return success
|
| - self.dispatchCheckResult(success, request, data)
|
| -
|
| - def dispatchCheckResult(self, success, request, data):
|
| - if success is not None:
|
| - if success:
|
| - result = self.handleValid(request, data)
|
| - else:
|
| - result = self.handleInvalid(request, data)
|
| - if isinstance(result, defer.Deferred):
|
| - return result
|
| -
|
| - def check(self, request, data):
|
| - """
|
| - Check whether the input in the request is valid for this handler
|
| - and return a boolean indicating validity.
|
| - """
|
| - if self._check is None:
|
| - raise NotImplementedError(qual(self.__class__)+'.check')
|
| - # self._check is probably a bound method or simple function that
|
| - # doesn't have a reference to this InputHandler; pass it
|
| - return self._check(self, request, data)
|
| -
|
| - def handleValid(self, request, data):
|
| - """
|
| - It has been determined that the input for this handler is valid;
|
| - however, that does not mean the entire form is valid.
|
| - """
|
| - self._parent.aggregateValid(request, self, data)
|
| -
|
| - def aggregateValid(self, request, inputhandler, data):
|
| - """By default we just pass the method calls all the way up to the root
|
| - Controller. However, an intelligent InputHandler could override this
|
| - and implement a state machine that waits for all data to be collected
|
| - and then fires.
|
| - """
|
| - self._parent.aggregateValid(request, inputhandler, data)
|
| -
|
| - def handleInvalid(self, request, data):
|
| - """
|
| - Once it has been determined that the input is invalid, we should
|
| - tell our view to report this fact to the user.
|
| - """
|
| - self._parent.aggregateInvalid(request, self, data)
|
| - self.view.setError(request, self.invalidErrorText)
|
| -
|
| - def aggregateInvalid(self, request, inputhandler, data):
|
| - """By default we just pass this method call all the way up to the root
|
| - Controller.
|
| - """
|
| - self._parent.aggregateInvalid(request, inputhandler, data)
|
| -
|
| - def commit(self, request, node, data):
|
| - """
|
| - It has been determined that the input for the entire form is completely
|
| - valid; it is now safe for all handlers to commit changes to the model.
|
| - """
|
| - if self._commit is None:
|
| - data = str(data)
|
| - if data != self.view.getData():
|
| - self.model.setData(data)
|
| - self.model.notify({'request': request, self.submodel: data})
|
| - else:
|
| - func = self._commit
|
| - if hasattr(func, 'im_func'):
|
| - func = func.im_func
|
| - args, varargs, varkw, defaults = inspect.getargspec(func)
|
| - if args[1] == 'request':
|
| - self._commit(request, data)
|
| - else:
|
| - self._commit(data)
|
| -
|
| -
|
| -class DefaultHandler(InputHandler):
|
| - def handle(self, request):
|
| - """
|
| - By default, we don't do anything
|
| - """
|
| - pass
|
| -
|
| -
|
| -class SingleValue(InputHandler):
|
| - def getInput(self, request):
|
| - name = getattr(self, 'inputName', self.submodel)
|
| - input = request.args.get(name, None)
|
| - if input:
|
| - return input[0]
|
| -
|
| -
|
| -class Anything(SingleValue):
|
| - """
|
| - Handle anything except for None
|
| - """
|
| - def check(self, request, data):
|
| - if data is not None:
|
| - return 1
|
| - return None
|
| -
|
| -
|
| -class Integer(SingleValue):
|
| - """
|
| - Only allow a single integer
|
| - """
|
| - def check(self, request, data):
|
| - if data is None: return None
|
| - try:
|
| - int(data)
|
| - return 1
|
| - except (TypeError, ValueError):
|
| - return 0
|
| -
|
| - def handleInvalid(self, request, data):
|
| - self.invalidErrorText = "%s is not an integer. Please enter an integer." % data
|
| - SingleValue.handleInvalid(self, request, data)
|
| -
|
| -
|
| -class Float(SingleValue):
|
| - """
|
| - Only allow a single float
|
| - """
|
| - def check(self, request, data):
|
| - if data is None: return None
|
| - try:
|
| - float(data)
|
| - return 1
|
| - except (TypeError, ValueError):
|
| - return 0
|
| -
|
| - def handleInvalid(self, request, data):
|
| - self.invalidErrorText = "%s is not an float. Please enter a float." % data
|
| - SingleValue.handleInvalid(self, request, data)
|
| -
|
| -
|
| -class List(InputHandler):
|
| - def check(self, request, data):
|
| - return None
|
| -
|
| -
|
| -class DictAggregator(Anything):
|
| - """An InputHandler for a <form> tag, for triggering a function
|
| - when all of the form's individual inputs have been validated.
|
| - Also for use gathering a dict of arguments to pass to a parent's
|
| - aggregateValid if no commit function is passed.
|
| -
|
| - Usage example::
|
| - <form controller="theForm" action="">
|
| - <input controller="Integer"
|
| - view="InputText" model="anInteger" />
|
| - <input controller="Anything"
|
| - view="InputText" model="aString" />
|
| - <input type="submit" />
|
| - </form>
|
| -
|
| - def theCommitFunction(anInteger=None, aString=None):
|
| - '''Note how the keyword arguments match up with the leaf model
|
| - names above
|
| - '''
|
| - print "Yay", anInteger, aString
|
| -
|
| - class CMyController(controller.Controller):
|
| - def wcfactory_theForm(self, request, node, m):
|
| - return input.FormAggregator(m, commit=theCommitFunction)
|
| - """
|
| - def aggregateValid(self, request, inputhandler, data):
|
| - """Aggregate valid input from inputhandlers below us, into a dictionary.
|
| - """
|
| - self._valid[inputhandler] = data
|
| -
|
| - def aggregateInvalid(self, request, inputhandler, data):
|
| - self._invalid[inputhandler] = data
|
| -
|
| - def exit(self, request):
|
| - """This is the node complete message
|
| - """
|
| - if self._commit:
|
| - # Introspect the commit function to see what
|
| - # keyword arguments it takes
|
| - func = self._commit
|
| - if hasattr(func, 'im_func'):
|
| - func = func.im_func
|
| - args, varargs, varkw, defaults = inspect.getargspec(
|
| - func)
|
| - wantsRequest = len(args) > 1 and args[1] == 'request'
|
| -
|
| - if self._invalid:
|
| - # whoops error!!!1
|
| - if self._errback:
|
| - self._errback(request, self._invalid)
|
| - elif self._valid:
|
| - # We've got all the input
|
| - # Gather it into a dict and call the commit function
|
| - results = {}
|
| - for item in self._valid:
|
| - results[item.model.name] = self._valid[item]
|
| - if self._commit:
|
| - if wantsRequest:
|
| - self._commit(request, **results)
|
| - else:
|
| - self._commit(**results)
|
| - else:
|
| - self._parent.aggregateValid(request, self, results)
|
| - return results
|
| -
|
| -
|
| -class ListAggregator(Anything):
|
| - def aggregateValid(self, request, inputhandler, data):
|
| - """Aggregate valid input from inputhandlers below us into a
|
| - list until we have all input from controllers below us to pass
|
| - to the commit function that was passed to the constructor or
|
| - our parent's aggregateValid.
|
| - """
|
| - if not hasattr(self, '_validList'):
|
| - self._validList = []
|
| - self._validList.append(data)
|
| -
|
| - def aggregateInvalid(self, request, inputhandler, data):
|
| - if not hasattr(self, '_invalidList'):
|
| - self._invalidList = []
|
| - self._invalidList.append(data)
|
| -
|
| - def exit(self, request):
|
| - if self._commit:
|
| - # Introspect the commit function to see what
|
| - #arguments it takes
|
| - func = self._commit
|
| - if hasattr(func, 'im_func'):
|
| - func = func.im_func
|
| - args, varargs, varkw, defaults = inspect.getargspec(func)
|
| - self.numArgs = len(args)
|
| - wantsRequest = args[1] == 'request'
|
| - if wantsRequest:
|
| - numArgs -= 1
|
| - else:
|
| - # Introspect the template to see if we still have
|
| - # controllers that will be giving us input
|
| -
|
| - # aggregateValid is called before the view renders the node, so
|
| - # we can count the number of controllers below us the first time
|
| - # we are called
|
| - if not hasattr(self, 'numArgs'):
|
| - self.numArgs = len(domhelpers.findElementsWithAttributeShallow(
|
| - self.view.node, "controller"))
|
| -
|
| - if self._invalidList:
|
| - self._parent.aggregateInvalid(request, self, self._invalidList)
|
| - else:
|
| - if self._commit:
|
| - if wantsRequest:
|
| - self._commit(request, *self._validList)
|
| - else:
|
| - self._commit(*self._validList)
|
| - self._parent.aggregateValid(request, self, self._invalidList)
|
| -
|
| - def commit(self, request, node, data):
|
| - """If we're using the ListAggregator, we don't want the list of items
|
| - to be rerendered
|
| - xxx Need to have a "node complete" message sent to the controller
|
| - so we can reset state, so controllers can be re-run or ignore input the second time
|
| - """
|
| - pass
|
| -
|
|
|