Browse Source

add autoadd support, and recognize config objects as arguments

Natenom/support-murmur-13-1446181288462
Michael Ziegler 15 years ago
parent
commit
e7c778ec69
  1. 41
      pyweb/extdirect.py

41
pyweb/extdirect.py

@ -40,7 +40,10 @@ class Provider( object ):
response and exceptions - if any. response and exceptions - if any.
Instantiation: Instantiation:
>>> EXT_JS_PROVIDER = Provider( [name="Ext.app.REMOTING_API"] )
>>> EXT_JS_PROVIDER = Provider( [name="Ext.app.REMOTING_API", autoadd=True] )
If autoadd is True, the api.js will include a line like such:
Ext.Direct.addProvider( Ext.app.REMOTING_API );
After instantiating the Provider, register functions to it like so: After instantiating the Provider, register functions to it like so:
@ -74,8 +77,9 @@ class Provider( object ):
You can then use this code in ExtJS to define the Provider there. You can then use this code in ExtJS to define the Provider there.
""" """
def __init__( self, name="Ext.app.REMOTING_API" ):
def __init__( self, name="Ext.app.REMOTING_API", autoadd=True ):
self.name = name self.name = name
self.autoadd = autoadd
self.classes = {} self.classes = {}
def register_method( self, cls_or_name ): def register_method( self, cls_or_name ):
@ -88,6 +92,8 @@ class Provider( object ):
def _register_method( self, cls_or_name, method ): def _register_method( self, cls_or_name, method ):
""" Actually registers the given function as a method of cls_or_name. """ """ Actually registers the given function as a method of cls_or_name. """
self.classes[ getname(cls_or_name) ][ method.__name__ ] = method self.classes[ getname(cls_or_name) ][ method.__name__ ] = method
method.EXT_argnames = inspect.getargspec( method ).args[1:]
method.EXT_len = len( method.EXT_argnames )
return method return method
@csrf_exempt @csrf_exempt
@ -99,14 +105,19 @@ class Provider( object ):
for methodname in self.classes[clsname]: for methodname in self.classes[clsname]:
actdict[clsname].append( { actdict[clsname].append( {
"name": methodname, "name": methodname,
"len": len( inspect.getargspec( self.classes[clsname][methodname] ).args ) - 1
"len": self.classes[clsname][methodname].EXT_len
} ) } )
return HttpResponse( "%s = %s;" % ( self.name, simplejson.dumps({
lines = ["%s = %s;" % ( self.name, simplejson.dumps({
"url": reverse( self.request ), "url": reverse( self.request ),
"type": "remoting", "type": "remoting",
"actions": actdict "actions": actdict
})), mimetype="text/javascript" )
}))]
if self.autoadd:
lines.append( "Ext.Direct.addProvider( %s );" % self.name )
return HttpResponse( "\n".join( lines ), mimetype="text/javascript" )
@csrf_exempt @csrf_exempt
def request( self, request ): def request( self, request ):
@ -155,11 +166,25 @@ class Provider( object ):
}) })
continue continue
func = self.classes[cls][methname]
if func.EXT_len and len(data) == 1 and type(data[0]) == dict:
# data[0] seems to contain a dict with params. check if it does, and if so, unpack
args = []
for argname in func.EXT_argnames:
if argname in data[0]:
args.append( data[0][argname] )
else:
args = None
break
if args:
data = args
try: try:
if data: if data:
result = self.classes[cls][methname]( request, *data )
result = func( request, *data )
else: else:
result = self.classes[cls][methname]( request )
result = func( request )
except Exception, err: except Exception, err:
errinfo = { errinfo = {
@ -169,7 +194,7 @@ class Provider( object ):
if settings.DEBUG: if settings.DEBUG:
traceback.print_exc( file=stderr ) traceback.print_exc( file=stderr )
errinfo['message'] = unicode(err) errinfo['message'] = unicode(err)
errinfo['where'] = '\n'.join(traceback.format_exception())
errinfo['where'] = traceback.format_exc()
else: else:
errinfo['message'] = 'Sorry, an error occurred.' errinfo['message'] = 'Sorry, an error occurred.'
errinfo['where'] = '' errinfo['where'] = ''

Loading…
Cancel
Save