Skip to content
Snippets Groups Projects
Commit 99f29c82 authored by Xavier Morel's avatar Xavier Morel
Browse files

[IMP] reformat python code in core and base

bzr revid: xmo@openerp.com-20110321081331-gvgb1qt6v80oq5hm
parent 77b06b59
No related branches found
No related tags found
No related merge requests found
......@@ -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 {}
#!/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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment