[WIP] models and controllers for scaffolding
This commit is contained in:
parent
ba85b80f32
commit
ce764477e6
|
@ -20,32 +20,69 @@ class Scaffold(Command):
|
||||||
'openerp.cli', 'scaffold'))
|
'openerp.cli', 'scaffold'))
|
||||||
env.filters['snake'] = snake
|
env.filters['snake'] = snake
|
||||||
self.env = env
|
self.env = env
|
||||||
|
self.manifest = '__openerp__'
|
||||||
|
|
||||||
def scaffold(self, args):
|
def scaffold(self, args):
|
||||||
# TODO: make this function callable even if the module already
|
|
||||||
# exists. (update mode for scaffolding)
|
|
||||||
from pudb import set_trace;set_trace() ############################## Breakpoint ##############################
|
|
||||||
args.dependency = 'base'
|
args.dependency = 'base'
|
||||||
if args.web:
|
# TODO: update dependencies according to --web and --theme
|
||||||
args.dependency = 'web'
|
# if args.web:
|
||||||
elif args.theme:
|
# args.dependency = 'web'
|
||||||
args.dependency = 'website'
|
# elif args.theme:
|
||||||
dest = os.path.abspath(os.path.expanduser(args.dest))
|
# args.dependency = 'website'
|
||||||
|
|
||||||
module_name = snake(args.module)
|
dest = directory(args.dest)
|
||||||
module = functools.partial(os.path.join, dest, module_name)
|
if args.init:
|
||||||
|
module_name = snake(args.init)
|
||||||
|
module = functools.partial(os.path.join, dest, module_name)
|
||||||
|
if os.path.exists(module()):
|
||||||
|
die("Can't initialize module in `%s`: Directory already exists." % module())
|
||||||
|
else:
|
||||||
|
module_name = dest.split(os.path.sep)[-1]
|
||||||
|
# find the module's root directory
|
||||||
|
while not os.path.exists(os.path.join(dest, '%s.py' % self.manifest)):
|
||||||
|
new_dest = os.path.abspath(os.path.join(dest, os.pardir))
|
||||||
|
if dest == new_dest:
|
||||||
|
die("Can't find module directory. Please `cd` to it's path or use --dest")
|
||||||
|
module_name = dest.split(os.path.sep)[-1]
|
||||||
|
dest = new_dest
|
||||||
|
module = functools.partial(os.path.join, dest)
|
||||||
|
args.module = module_name
|
||||||
|
|
||||||
if os.path.exists(module()):
|
if args.init:
|
||||||
message = "The path `%s` already exists." % module()
|
self.dump('%s.jinja2' % self.manifest, module('%s.py' % self.manifest), config=args)
|
||||||
die(message)
|
|
||||||
|
|
||||||
self.dump('__openerp__.jinja2', module('__openerp__.py'), config=args)
|
if args.model:
|
||||||
self.dump('__init__.jinja2', module('__init__.py'), modules=[
|
model_module = snake(args.model)
|
||||||
args.controller and 'controllers',
|
model_file = module('models', '%s.py' % model_module)
|
||||||
args.model and 'models'
|
if os.path.exists(model_file):
|
||||||
])
|
die("Model `%s` already exists !" % model_file)
|
||||||
self.dump('ir.model.access.jinja2', module('security', 'ir.model.access.csv'), config=args)
|
self.add_init_import(module('__init__.py'), 'models')
|
||||||
|
self.add_init_import(module('models', '__init__.py'), model_module)
|
||||||
|
self.dump('models.jinja2', model_file, config=args)
|
||||||
|
|
||||||
|
if args.controller:
|
||||||
|
controller_module = snake(args.controller)
|
||||||
|
controller_file = module('controllers', '%s.py' % controller_module)
|
||||||
|
if os.path.exists(controller_file):
|
||||||
|
die("Controller `%s` already exists !" % controller_file)
|
||||||
|
self.add_init_import(module('__init__.py'), 'controllers')
|
||||||
|
self.add_init_import(module('controllers', '__init__.py'), controller_module)
|
||||||
|
self.dump('controllers.jinja2', module('controllers', controller_file), config=args)
|
||||||
|
|
||||||
|
# self.dump('ir.model.access.jinja2', module('security', 'ir.model.access.csv'), config=args)
|
||||||
|
return
|
||||||
|
|
||||||
|
def add_init_import(self, path, module):
|
||||||
|
if not os.path.exists(path):
|
||||||
|
self.dump('__init__.jinja2', path, modules=[module])
|
||||||
|
else:
|
||||||
|
with open(path, "r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
# TODO: regex
|
||||||
|
if ('import %s' % module) in lines:
|
||||||
|
return
|
||||||
|
with open(path, "a") as f:
|
||||||
|
f.write('\nimport %s' % module)
|
||||||
|
|
||||||
def dump(self, template, dest, **kwargs):
|
def dump(self, template, dest, **kwargs):
|
||||||
outdir = os.path.dirname(dest)
|
outdir = os.path.dirname(dest)
|
||||||
|
@ -61,15 +98,24 @@ class Scaffold(Command):
|
||||||
prog="%s scaffold" % sys.argv[0].split(os.path.sep)[-1],
|
prog="%s scaffold" % sys.argv[0].split(os.path.sep)[-1],
|
||||||
description=self.__doc__
|
description=self.__doc__
|
||||||
)
|
)
|
||||||
parser.add_argument('module', help="Name of the module to generate")
|
parser.add_argument('--init', type=identifier, help='Initialize a new Odoo module')
|
||||||
parser.add_argument('dest', nargs='?', help='Directory where the module should be created (default to current directory)', default=".")
|
|
||||||
|
|
||||||
|
parser.add_argument('--dest', default=".",
|
||||||
|
help='Directory where the module should be created/updated (default to current directory)')
|
||||||
|
|
||||||
|
parser.add_argument('--model', type=identifier, help="Name of the model to add")
|
||||||
|
|
||||||
|
parser.add_argument('--controller', type=identifier, help="Name of the controller to add")
|
||||||
|
|
||||||
|
parser.add_argument('--web', action='store_true', default=False,
|
||||||
|
help="Generate structure for a webclient module")
|
||||||
|
|
||||||
|
parser.add_argument('--theme', action='store_true', default=False,
|
||||||
|
help="Generate structure for a Website theme")
|
||||||
|
|
||||||
if not args:
|
if not args:
|
||||||
sys.exit(parser.print_help())
|
sys.exit(parser.print_help())
|
||||||
|
|
||||||
args = parser.parse_args(args=args)
|
args = parser.parse_args(args=args)
|
||||||
|
|
||||||
self.scaffold(args)
|
self.scaffold(args)
|
||||||
|
|
||||||
def snake(s):
|
def snake(s):
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
{% for module in modules if module -%}
|
{% for module in modules if module -%}
|
||||||
import {{ module }}
|
import {{ module }}{% endfor %}
|
||||||
{% endfor %}
|
|
||||||
|
|
|
@ -1,26 +1,32 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
{
|
{
|
||||||
'name': "{{ config.module }}",
|
'name': "{{ config.module }}",
|
||||||
# short description, used as subtitles on modules listings
|
|
||||||
'summary': """
|
'summary': """
|
||||||
Short (1 phrase/line) summary of the module's purpose, used as
|
Short (1 phrase/line) summary of the module's purpose, used as
|
||||||
subtitle on modules listing or apps.openerp.com""",
|
subtitle on modules listing or apps.openerp.com""",
|
||||||
# long description of module purpose
|
|
||||||
'description': """
|
|
||||||
""",
|
|
||||||
# Who you are
|
|
||||||
'author': "Acme Corp.",
|
|
||||||
'website': "http://www.example.com",
|
|
||||||
|
|
||||||
# categories can be used to filter modules in modules listing
|
'description': """
|
||||||
|
Long description of module's purpose
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "Your Company",
|
||||||
|
'website': "http://www.yourcompany.com",
|
||||||
|
|
||||||
|
# Categories can be used to filter modules in modules listing
|
||||||
|
# Check <odoo>/addons/base/module/module_data.xml of the full list
|
||||||
'category': 'Uncategorized',
|
'category': 'Uncategorized',
|
||||||
'version': '0.1',
|
'version': '0.1',
|
||||||
|
|
||||||
# any module necessary for this one to work correctly
|
# any module necessary for this one to work correctly
|
||||||
'depends': ['{{ config.dependency }}'],
|
'depends': ['base'],
|
||||||
'data': [
|
'data': [
|
||||||
{{- "'security/ir.model.access.csv'" if config.model -}}
|
# {{- "'security/ir.model.access.csv'" if config.model -}}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'demo': [
|
||||||
|
],
|
||||||
|
|
||||||
'tests': [
|
'tests': [
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from openerp import http
|
from openerp import http
|
||||||
from openerp.addons.web.controllers import main
|
from openerp.addons.web.controllers import main
|
||||||
|
|
||||||
class {{ config.controller }}(main.Home):
|
class {{ config.controller }}(main.Home):
|
||||||
@http.route('/', auth='none')
|
@http.route('/{{ config.module }}/{{ config.controller }}', auth='public')
|
||||||
def index(self):
|
def index(self):
|
||||||
return "Hello, world!"
|
return "Hello, world!"
|
||||||
|
{% if config.model %}
|
||||||
|
@http.route('/{{ config.module }}/{{ config.controller }}/{{ config.model }}/<model("{{ config.module }}.{{ config.model }}"):{{ config.model }}>'], type='http', auth='public')
|
||||||
|
def {{ config.model }}(self, {{ config.model }}, **kw):
|
||||||
|
return "Hello, %r!" % {{ config.model }}
|
||||||
|
{% endif %}
|
||||||
|
|
Loading…
Reference in New Issue