[IMP] reformat python code in core and base
bzr revid: xmo@openerp.com-20110321081331-gvgb1qt6v80oq5hm
This commit is contained in:
parent
77b06b59a4
commit
99f29c8202
|
@ -25,14 +25,14 @@ class Xml2Json:
|
|||
@staticmethod
|
||||
def convert_element(el, skip_whitespaces=True):
|
||||
res = {}
|
||||
if el.tag[0]=="{":
|
||||
ns, name = el.tag.rsplit("}",1)
|
||||
if el.tag[0] == "{":
|
||||
ns, name = el.tag.rsplit("}", 1)
|
||||
res["tag"] = name
|
||||
res["namespace"] = ns[1:]
|
||||
else:
|
||||
res["tag"] = el.tag
|
||||
res["attrs"] = {}
|
||||
for k,v in el.items():
|
||||
for k, v in el.items():
|
||||
res["attrs"][k] = v
|
||||
kids = []
|
||||
if el.text and (not skip_whitespaces or el.text.strip() != ''):
|
||||
|
@ -55,13 +55,14 @@ class Hello(openerpweb.Controller):
|
|||
return "hello world"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def ajax_hello_world(self,req):
|
||||
return {"welcome":"hello world"}
|
||||
def ajax_hello_world(self, req):
|
||||
return {"welcome": "hello world"}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def ajax_hello_error(self,req):
|
||||
def ajax_hello_error(self, req):
|
||||
raise Exception("You suck")
|
||||
|
||||
|
||||
class Session(openerpweb.Controller):
|
||||
_cp_path = "/base/session"
|
||||
|
||||
|
@ -84,7 +85,7 @@ class Session(openerpweb.Controller):
|
|||
files_content = []
|
||||
files_timestamp = 0
|
||||
for i in file_list:
|
||||
fname = os.path.join(root,i)
|
||||
fname = os.path.join(root, i)
|
||||
ftime = os.path.getmtime(fname)
|
||||
if ftime > files_timestamp:
|
||||
files_timestamp = ftime
|
||||
|
@ -96,7 +97,7 @@ class Session(openerpweb.Controller):
|
|||
def login(self, req, db, login, password):
|
||||
req.session.login(db, login, password)
|
||||
return {
|
||||
"session_id" : req.session_id,
|
||||
"session_id": req.session_id,
|
||||
"uid": req.session._uid,
|
||||
}
|
||||
|
||||
|
@ -117,31 +118,32 @@ class Session(openerpweb.Controller):
|
|||
concat = self.concat_files(files)[0]
|
||||
# TODO request set the Date of last modif and Etag
|
||||
return concat
|
||||
css.exposed=1
|
||||
css.exposed = True
|
||||
|
||||
def js(self, req, mods='base,base_hello'):
|
||||
files = self.manifest_glob(mods.split(','), 'js')
|
||||
concat = self.concat_files(files)[0]
|
||||
# TODO request set the Date of last modif and Etag
|
||||
return concat
|
||||
js.exposed=1
|
||||
js.exposed = True
|
||||
|
||||
|
||||
class Menu(openerpweb.Controller):
|
||||
_cp_path = "/base/menu"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req):
|
||||
def load(self, req):
|
||||
m = req.session.model('ir.ui.menu')
|
||||
# menus are loaded fully unlike a regular tree view, cause there are
|
||||
# less than 512 items
|
||||
menu_ids = m.search([])
|
||||
menu_items = m.read(menu_ids,['name','sequence','parent_id'])
|
||||
menu_root = {'id':False, 'name':'root', 'parent_id':[-1,'']}
|
||||
menu_items = m.read(menu_ids, ['name', 'sequence', 'parent_id'])
|
||||
menu_root = {'id': False, 'name': 'root', 'parent_id': [-1, '']}
|
||||
menu_items.append(menu_root)
|
||||
# make a tree using parent_id
|
||||
for i in menu_items:
|
||||
i['children'] = []
|
||||
d = dict([(i["id"],i) for i in menu_items])
|
||||
d = dict([(i["id"], i) for i in menu_items])
|
||||
for i in menu_items:
|
||||
if not i['parent_id']:
|
||||
pid = False
|
||||
|
@ -151,35 +153,38 @@ class Menu(openerpweb.Controller):
|
|||
d[pid]['children'].append(i)
|
||||
# sort by sequence a tree using parent_id
|
||||
for i in menu_items:
|
||||
i['children'].sort(key = lambda x:x["sequence"])
|
||||
i['children'].sort(key=lambda x:x["sequence"])
|
||||
|
||||
return {'data': menu_root}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def action(self,req,menu_id):
|
||||
def action(self, req, menu_id):
|
||||
m = req.session.model('ir.values')
|
||||
r = m.get('action', 'tree_but_open', [('ir.ui.menu', menu_id)], False, {})
|
||||
res={"action":r}
|
||||
res = {"action": r}
|
||||
return res
|
||||
|
||||
|
||||
class DataSet(openerpweb.Controller):
|
||||
_cp_path = "/base/dataset"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def fields(self,req,model):
|
||||
def fields(self, req, model):
|
||||
return {'fields': req.session.model(model).fields_get(False)}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,model,domain=[],fields=['id']):
|
||||
def load(self, req, model, domain=[], fields=['id']):
|
||||
m = req.session.model(model)
|
||||
ids = m.search(domain)
|
||||
values = m.read(ids, fields)
|
||||
return {'ids': ids, 'values': values}
|
||||
|
||||
|
||||
class DataRecord(openerpweb.Controller):
|
||||
_cp_path = "/base/datarecord"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,model,id,fields):
|
||||
def load(self, req, model, id, fields):
|
||||
m = req.session.model(model)
|
||||
value = {}
|
||||
r = m.read([id])
|
||||
|
@ -187,36 +192,43 @@ class DataRecord(openerpweb.Controller):
|
|||
value = r[0]
|
||||
return {'value': value}
|
||||
|
||||
|
||||
class FormView(openerpweb.Controller):
|
||||
_cp_path = "/base/formview"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,model,view_id):
|
||||
def load(self, req, model, view_id):
|
||||
m = req.session.model(model)
|
||||
r = m.fields_view_get(view_id,'form')
|
||||
r["arch"]=Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view':r}
|
||||
r = m.fields_view_get(view_id, 'form')
|
||||
r["arch"] = Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view': r}
|
||||
|
||||
|
||||
class ListView(openerpweb.Controller):
|
||||
_cp_path = "/base/listview"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,model,view_id):
|
||||
def load(self, req, model, view_id):
|
||||
m = req.session.model(model)
|
||||
r = m.fields_view_get(view_id,'tree')
|
||||
r["arch"]=Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view':r}
|
||||
r = m.fields_view_get(view_id, 'tree')
|
||||
r["arch"] = Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view': r}
|
||||
|
||||
|
||||
class SearchView(openerpweb.Controller):
|
||||
_cp_path = "/base/searchview"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,model,view_id):
|
||||
def load(self, req, model, view_id):
|
||||
m = req.session.model(model)
|
||||
r = m.fields_view_get(view_id,'search')
|
||||
r["arch"]=Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view':r}
|
||||
r = m.fields_view_get(view_id, 'search')
|
||||
r["arch"] = Xml2Json.convert_to_structure(r["arch"])
|
||||
return {'fields_view': r}
|
||||
|
||||
|
||||
class Action(openerpweb.Controller):
|
||||
_cp_path = "/base/action"
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self,req,action_id):
|
||||
def load(self, req, action_id):
|
||||
return {}
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
#!/usr/bin/python
|
||||
import functools
|
||||
|
||||
import optparse, os, re, sys, tempfile, traceback, uuid, xmlrpclib
|
||||
import optparse
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import traceback
|
||||
import uuid
|
||||
import xmlrpclib
|
||||
|
||||
import cherrypy
|
||||
import cherrypy.lib.static
|
||||
|
@ -15,18 +20,23 @@ import xmlrpctimeout
|
|||
class OpenERPUnboundException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class OpenERPConnector(object):
|
||||
pass
|
||||
|
||||
|
||||
class OpenERPAuth(object):
|
||||
pass
|
||||
|
||||
|
||||
class OpenERPModel(object):
|
||||
def __init__(self,session,model):
|
||||
def __init__(self, session, model):
|
||||
self._session = session
|
||||
self._model = model
|
||||
def __getattr__(self,name):
|
||||
return lambda *l:self._session.execute(self._model,name,*l)
|
||||
|
||||
def __getattr__(self, name):
|
||||
return lambda *l:self._session.execute(self._model, name, *l)
|
||||
|
||||
|
||||
class OpenERPSession(object):
|
||||
def __init__(self, server='127.0.0.1', port=8069):
|
||||
|
@ -38,7 +48,7 @@ class OpenERPSession(object):
|
|||
self._password = False
|
||||
|
||||
def proxy(self, service):
|
||||
s = xmlrpctimeout.TimeoutServerProxy('http://%s:%s/xmlrpc/%s'%(self._server, self._port, service), timeout=5)
|
||||
s = xmlrpctimeout.TimeoutServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service), timeout=5)
|
||||
return s
|
||||
|
||||
def bind(self, db, uid, password):
|
||||
|
@ -52,14 +62,14 @@ class OpenERPSession(object):
|
|||
self._login = login
|
||||
return uid
|
||||
|
||||
def execute(self,model,func,*l,**d):
|
||||
def execute(self, model, func, *l, **d):
|
||||
if not (self._db and self._uid and self._password):
|
||||
raise OpenERPUnboundException()
|
||||
r = self.proxy('object').execute(self._db, self._uid, self._password, model, func, *l, **d)
|
||||
return r
|
||||
|
||||
def model(self,model):
|
||||
return OpenERPModel(self,model)
|
||||
def model(self, model):
|
||||
return OpenERPModel(self, model)
|
||||
|
||||
#----------------------------------------------------------
|
||||
# OpenERP Web RequestHandler
|
||||
|
@ -82,7 +92,7 @@ class JsonRequest(object):
|
|||
"""
|
||||
|
||||
def parse(self, request):
|
||||
self.params = request.get("params",{})
|
||||
self.params = request.get("params", {})
|
||||
self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex
|
||||
self.session = cherrypy.session.setdefault(self.session_id, OpenERPSession())
|
||||
self.context = self.params.pop('context', None)
|
||||
|
@ -108,7 +118,7 @@ class JsonRequest(object):
|
|||
else:
|
||||
request = simplejson.loads(request)
|
||||
try:
|
||||
print "--> %s.%s %s"%(controller.__class__.__name__,method.__name__,request)
|
||||
print "--> %s.%s %s" % (controller.__class__.__name__, method.__name__, request)
|
||||
error = None
|
||||
result = method(controller, self, **self.parse(request))
|
||||
except OpenERPUnboundException:
|
||||
|
@ -127,7 +137,8 @@ class JsonRequest(object):
|
|||
'data': {
|
||||
'type': 'server_exception',
|
||||
'fault_code': e.faultCode,
|
||||
'debug': "Client %s\nServer %s" % ("".join(traceback.format_exception("", None, sys.exc_traceback)), e.faultString)
|
||||
'debug': "Client %s\nServer %s" % (
|
||||
"".join(traceback.format_exception("", None, sys.exc_traceback)), e.faultString)
|
||||
}
|
||||
}
|
||||
except Exception:
|
||||
|
@ -139,13 +150,13 @@ class JsonRequest(object):
|
|||
'debug': "Client %s" % traceback.format_exc()
|
||||
}
|
||||
}
|
||||
response = {"jsonrpc": "2.0", "id": request.get('id')}
|
||||
response = {"jsonrpc": "2.0", "id": request.get('id')}
|
||||
if error:
|
||||
response["error"] = error
|
||||
else:
|
||||
response["result"] = result
|
||||
|
||||
print "<--", response
|
||||
print "<--", response
|
||||
print
|
||||
|
||||
content = simplejson.dumps(response)
|
||||
|
@ -153,31 +164,36 @@ class JsonRequest(object):
|
|||
cherrypy.response.headers['Content-Length'] = len(content)
|
||||
return content
|
||||
|
||||
|
||||
def jsonrequest(f):
|
||||
@cherrypy.expose
|
||||
@functools.wraps(f)
|
||||
def json_handler(self):
|
||||
return JsonRequest().dispatch(self, f, requestf=cherrypy.request.body)
|
||||
|
||||
return json_handler
|
||||
|
||||
|
||||
class HttpRequest(object):
|
||||
""" Regular GET/POST request
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
# result may be filled, it's content will be updated by the return
|
||||
# value of the dispatched function if it's a dict
|
||||
self.result = ""
|
||||
|
||||
def dispatch(self, controller, f, request):
|
||||
print "GET/POST --> %s.%s %s"%(controller.__class__.__name__,f.__name__,request)
|
||||
r=f(controller, self, request)
|
||||
print "GET/POST --> %s.%s %s" % (controller.__class__.__name__, f.__name__, request)
|
||||
r = f(controller, self, request)
|
||||
return r
|
||||
|
||||
|
||||
def httprequest(f):
|
||||
# check cleaner wrapping:
|
||||
# functools.wraps(f)(lambda x: JsonRequest().dispatch(x, f))
|
||||
l=lambda self, request: HttpRequest().dispatch(self, f, request)
|
||||
l.exposed=1
|
||||
l = lambda self, request: HttpRequest().dispatch(self, f, request)
|
||||
l.exposed = 1
|
||||
return l
|
||||
|
||||
#-----------------------------------------------------------
|
||||
|
@ -185,7 +201,7 @@ def httprequest(f):
|
|||
#-----------------------------------------------------------
|
||||
|
||||
path_root = os.path.dirname(os.path.dirname(os.path.normpath(__file__)))
|
||||
path_addons = os.path.join(path_root,'addons')
|
||||
path_addons = os.path.join(path_root, 'addons')
|
||||
cherrypy_root = None
|
||||
|
||||
# globals might move into a pool if needed
|
||||
|
@ -200,60 +216,66 @@ class ControllerType(type):
|
|||
super(ControllerType, cls).__init__(name, bases, attrs)
|
||||
controllers_class["%s.%s" % (cls.__module__, cls.__name__)] = cls
|
||||
|
||||
|
||||
class Controller(object):
|
||||
__metaclass__ = ControllerType
|
||||
|
||||
|
||||
class Root(object):
|
||||
def __init__(self):
|
||||
self.addons = {}
|
||||
self._load_addons()
|
||||
|
||||
def _load_addons(self):
|
||||
if path_addons not in sys.path:
|
||||
sys.path.insert(0,path_addons)
|
||||
sys.path.insert(0, path_addons)
|
||||
for i in os.listdir(path_addons):
|
||||
if i not in sys.modules:
|
||||
manifest_path = os.path.join(path_addons,i,'__openerp__.py')
|
||||
manifest_path = os.path.join(path_addons, i, '__openerp__.py')
|
||||
if os.path.isfile(manifest_path):
|
||||
manifest = eval(open(manifest_path).read())
|
||||
print "Loading",i
|
||||
print "Loading", i
|
||||
m = __import__(i)
|
||||
addons_module[i] = m
|
||||
addons_manifest[i] = manifest
|
||||
for k,v in controllers_class.items():
|
||||
for k, v in controllers_class.items():
|
||||
if k not in controllers_object:
|
||||
o = v()
|
||||
controllers_object[k] = o
|
||||
if hasattr(o,'_cp_path'):
|
||||
if hasattr(o, '_cp_path'):
|
||||
controllers_path[o._cp_path] = o
|
||||
|
||||
def default(self, *l, **kw):
|
||||
#print "default",l,kw
|
||||
# handle static files
|
||||
if len(l) > 2 and l[1]=='static':
|
||||
if len(l) > 2 and l[1] == 'static':
|
||||
# sanitize path
|
||||
p = os.path.normpath(os.path.join(*l))
|
||||
return cherrypy.lib.static.serve_file(os.path.join(path_addons,p))
|
||||
return cherrypy.lib.static.serve_file(os.path.join(path_addons, p))
|
||||
elif len(l) > 1:
|
||||
for i in range(1,len(l)+1):
|
||||
for i in range(1, len(l) + 1):
|
||||
ps = "/" + "/".join(l[0:i])
|
||||
if ps in controllers_path:
|
||||
c = controllers_path[ps]
|
||||
rest = l[i:] or ['index']
|
||||
meth = rest[0]
|
||||
m = getattr(c,meth)
|
||||
if getattr(m,'exposed',0):
|
||||
print "Calling",ps,c,meth,m
|
||||
m = getattr(c, meth)
|
||||
if getattr(m, 'exposed', 0):
|
||||
print "Calling", ps, c, meth, m
|
||||
return m(**kw)
|
||||
|
||||
else:
|
||||
raise cherrypy.HTTPRedirect('/base/static/openerp/base.html', 301)
|
||||
default.exposed = True
|
||||
|
||||
|
||||
def main(argv):
|
||||
# Parse config
|
||||
op = optparse.OptionParser()
|
||||
op.add_option("-p", "--port", dest="socket_port", help="listening port", metavar="NUMBER", default=8002)
|
||||
op.add_option("-s", "--session-path", dest="storage_path", help="directory used for session storage", metavar="DIR", default=os.path.join(tempfile.gettempdir(),"cpsessions"))
|
||||
op.add_option("-s", "--session-path", dest="storage_path",
|
||||
help="directory used for session storage", metavar="DIR",
|
||||
default=os.path.join(tempfile.gettempdir(), "cpsessions"))
|
||||
(o, args) = op.parse_args(argv[1:])
|
||||
|
||||
# Prepare cherrypy config from options
|
||||
|
|
Loading…
Reference in New Issue