preliminary addons loading support

bzr revid: al@openerp.com-20110307092632-e0a6rho0bvuk04ei
This commit is contained in:
Antony Lesuisse 2011-03-07 10:26:32 +01:00
parent acef7835aa
commit fc679ac8a5
3 changed files with 53 additions and 25 deletions

View File

@ -0,0 +1,6 @@
{
"name" : "OpenERP Web base",
"version" : "2.0",
"depends" : [],
'active': True,
}

View File

@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
import json, os, sys, traceback
import glob,json,os,sys,traceback
#import simplejson as json
import openerpweb
@ -64,12 +66,9 @@ class Hello(openerpweb.Controller):
class Connection(openerpweb.Controller):
_cp_path = "/base/connection"
def filesofmodulemap(self, module_file_map):
def filesofmodulemap(self, ):
# TODO root should be a global config
root = os.path.join(os.path.dirname(__file__),'..','..')
files=[]
for i in mods.split(','):
for j in cssfiles.get(i,[]):
files.append(j)
@ -79,6 +78,7 @@ class Connection(openerpweb.Controller):
concat: concatenation of file content
timestamp: max(os.path.getmtime of file_list)
"""
root = openerpweb.path_root
files_content = []
files_timestamp = 0
for i in file_list:
@ -92,7 +92,15 @@ class Connection(openerpweb.Controller):
def css(self, req):
# TODO http get argument mods is a comma seprated value of modules
mods = 'base,base_calendar'
mods = 'base,base_hello'
files = []
for i in mods.split(','):
globlist = openerpweb.addons_manifest.get(i,{})
for j in globlist:
tmp = glob.glob(os.path.join(path_addons,i,j))
print tmp
files.append(tmp)
# TODO modules should list their css and js in __openerp__
# TODO cssfiles should be a global registry of files
cssfiles = {
@ -130,6 +138,12 @@ class Session(openerpweb.Controller):
}
return res
def modules(self, req):
# TODO return the list of all modules
res={}
res["modules"] = ["base","base_hello"]
return res
class Menu(openerpweb.Controller):
_cp_path = "/base/menu"

View File

@ -135,7 +135,7 @@ def jsonrequest(f):
l.exposed=1
return l
class BasicRequest(object):
class HttpRequest(object):
""" Regular GET/POST request
"""
def __init__(self):
@ -148,10 +148,10 @@ class BasicRequest(object):
r=f(controller, self, request)
return r
def basicrequest(f):
def httprequest(f):
# check cleaner wrapping:
# functools.wraps(f)(lambda x: JsonRequest().dispatch(x, f))
l=lambda self, request: BasicRequest().dispatch(self, f, request)
l=lambda self, request: HttpRequest().dispatch(self, f, request)
l.exposed=1
return l
@ -162,17 +162,20 @@ def basicrequest(f):
path_root = os.path.dirname(os.path.dirname(os.path.normpath(__file__)))
path_addons = os.path.join(path_root,'addons')
cherrypy_root = None
openerp_addons = {}
openerp_controllers_class = {}
openerp_controllers_object = {}
openerp_controllers_path = {}
# globals might move into a pool if needed
addons_module = {}
addons_manifest = {}
controllers_class = {}
controllers_object = {}
controllers_path = {}
class ControllerType(type):
def __init__(cls, name, bases, attrs):
super(ControllerType, cls).__init__(name, bases, attrs)
# TODO forgive me this hack and find me a clean way to get the absolute name of a class
cls.fullname = re.search("'(.+)'",repr(cls)).group(1)
openerp_controllers_class[cls.fullname] = cls
controllers_class[cls.fullname] = cls
class Controller(object):
__metaclass__ = ControllerType
@ -186,15 +189,19 @@ class Root(object):
sys.path.insert(0,path_addons)
for i in os.listdir(path_addons):
if i not in sys.modules:
print "Loading",i
m = __import__(i)
openerp_addons[i] = m
for k,v in openerp_controllers_class.items():
if k not in openerp_controllers_object:
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
m = __import__(i)
addons_module[i] = m
addons_manifest[i] = manifest
for k,v in controllers_class.items():
if k not in controllers_object:
o = v()
openerp_controllers_object[k] = o
controllers_object[k] = o
if hasattr(o,'_cp_path'):
openerp_controllers_path[o._cp_path] = o
controllers_path[o._cp_path] = o
def default(self, *l, **kw):
#print "default",l,kw
@ -206,13 +213,14 @@ class Root(object):
elif len(l) > 1:
for i in range(1,len(l)+1):
ps = "/" + "/".join(l[0:i])
if ps in openerp_controllers_path:
c = openerp_controllers_path[ps]
if ps in controllers_path:
c = controllers_path[ps]
rest = l[i:] or ['index']
meth = rest[0]
m = getattr(c,meth)
print "Calling",ps,c,meth,m
return m(**kw)
if getattr(m,'exposed',0):
print "Calling",ps,c,meth,m
return m(**kw)
else:
return '<a href="/base/static/openerp/base.html">/base/static/openerp/base.html</a>'