X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethod.py;h=e2250ea84bca3247e045c0b1bd87a1c84dfaee2a;hb=f9abd41a98993c5f4f18c0ecb7aa34eb86d58c64;hp=31f365de8064a432899a0d5afe1e9249df7dfd8b;hpb=286e4963a987e2478baca5050e805516e2b7fbd0;p=plcapi.git diff --git a/PLC/Method.py b/PLC/Method.py index 31f365d..e2250ea 100644 --- a/PLC/Method.py +++ b/PLC/Method.py @@ -4,7 +4,7 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id: Method.py,v 1.15 2006/11/02 18:32:55 mlhuang Exp $ +# $Id: Method.py,v 1.20 2006/12/20 14:08:40 tmack Exp $ # import xmlrpclib @@ -17,7 +17,7 @@ import pprint from types import StringTypes from PLC.Faults import * -from PLC.Parameter import Parameter, Mixed +from PLC.Parameter import Parameter, Mixed, python_type, xmlrpc_type from PLC.Auth import Auth from PLC.Debug import profile, log from PLC.Events import Event, Events @@ -92,7 +92,7 @@ class Method: result = self.call(*args, **kwds) runtime = time.time() - start - if self.api.config.PLC_API_DEBUG: + if self.api.config.PLC_API_DEBUG or hasattr(self, 'message'): self.log(0, runtime, *args) return result @@ -129,6 +129,7 @@ class Method: # Log call representation # XXX Truncate to avoid DoS event['call'] = self.name + pprint.saferepr(args) + event['call_name'] = self.name # Both users and nodes can call some methods if isinstance(self.caller, Person): @@ -138,13 +139,16 @@ class Method: event.sync(commit = False) - # XXX object_ids is currently defined as a class variable if hasattr(self, 'object_ids'): for object_id in self.object_ids: event.add_object(object_id, commit = False) + # Set the message for this event + if hasattr(self, 'message'): + event['message'] = self.message + # Commit - event.sync(commit = True) + event.sync() def help(self, indent = " "): """ @@ -201,7 +205,7 @@ class Method: elif isinstance(param, Mixed): for subparam in param: text += param_text(name, subparam, indent + step, step) - elif isinstance(param, (list, tuple)): + elif isinstance(param, (list, tuple, set)): for subparam in param: text += param_text("", subparam, indent + step, step) @@ -263,11 +267,7 @@ class Method: return except PLCInvalidArgument, fault: pass - xmlrpc_types = [xmlrpc_type(item) for item in expected] - raise PLCInvalidArgument("expected %s, got %s" % \ - (" or ".join(xmlrpc_types), - xmlrpc_type(type(value))), - name) + raise fault # If an authentication structure is expected, save it and # authenticate after basic type checking is done. @@ -317,6 +317,11 @@ class Method: if max is not None and \ len(value.encode(self.api.encoding)) > max: raise PLCInvalidArgument, "%s must be at most %d bytes long" % (name, max) + elif expected_type in (list, tuple, set): + if min is not None and len(value) < min: + raise PLCInvalidArgument, "%s must contain at least %d items" % (name, min) + if max is not None and len(value) > max: + raise PLCInvalidArgument, "%s must contain at most %d items" % (name, max) else: if min is not None and value < min: raise PLCInvalidArgument, "%s must be > %s" % (name, str(min)) @@ -324,7 +329,7 @@ class Method: raise PLCInvalidArgument, "%s must be < %s" % (name, str(max)) # If a list with particular types of items is expected - if isinstance(expected, (list, tuple)): + if isinstance(expected, (list, tuple, set)): for i in range(len(value)): if i >= len(expected): j = len(expected) - 1 @@ -346,46 +351,3 @@ class Method: if auth is not None: auth.check(self, *args) - -def python_type(arg): - """ - Returns the Python type of the specified argument, which may be a - Python type, a typed value, or a Parameter. - """ - - if isinstance(arg, Parameter): - arg = arg.type - - if isinstance(arg, type): - return arg - else: - return type(arg) - -def xmlrpc_type(arg): - """ - Returns the XML-RPC type of the specified argument, which may be a - Python type, a typed value, or a Parameter. - """ - - arg_type = python_type(arg) - - if arg_type == NoneType: - return "nil" - elif arg_type == IntType or arg_type == LongType: - return "int" - elif arg_type == bool: - return "boolean" - elif arg_type == FloatType: - return "double" - elif arg_type in StringTypes: - return "string" - elif arg_type == ListType or arg_type == TupleType: - return "array" - elif arg_type == DictType: - return "struct" - elif arg_type == Mixed: - # Not really an XML-RPC type but return "mixed" for - # documentation purposes. - return "mixed" - else: - raise PLCAPIError, "XML-RPC cannot marshal %s objects" % arg_type