From 85e7bd39b6ce04f9b5d207da2affadab3cd43b01 Mon Sep 17 00:00:00 2001 From: Dennis Sluijk Date: Tue, 20 Dec 2016 09:39:50 +0100 Subject: [PATCH] [10.0][MIG] Module Prototyper (#634) * [ADD] Updated manifest and README * [ADD] Version 10.0 template and api_version model * [ADD] Updated license header, updated api call * [FIX] Flake * [FIX] Flake * [FIX] Tests * [FIX] Flake8 * [ADD] Extra test for changed method 'set_jinja_env' * [FIX] Fixed 'Try me on runbot' button --- module_prototyper/README.rst | 25 +- module_prototyper/__init__.py | 2 +- module_prototyper/__manifest__.py | 10 +- module_prototyper/data/README.rst | 54 ++-- .../module_prototyper_api_version_data.xml | 16 ++ module_prototyper/models/__init__.py | 3 +- module_prototyper/models/ir_model_fields.py | 21 +- module_prototyper/models/licenses.py | 2 +- module_prototyper/models/module_prototyper.py | 43 +-- .../models/module_prototyper_api_version.py | 12 + .../security/ir.model.access.csv | 1 + .../templates/10.0/__init__.py.template | 7 + .../templates/10.0/__manifest__.py.template | 58 ++++ .../10.0/data/model_name.xml.template | 6 + .../10.0/demo/model_name.xml.template | 6 + .../templates/10.0/header.template | 5 + .../10.0/models/__init__.py.template | 9 + .../10.0/models/model_name.py.template | 35 +++ .../security/ir.model.access.csv.template | 4 + .../10.0/security/model_name.xml.template | 8 + .../10.0/views/model_menus.xml.template | 27 ++ .../10.0/views/model_views.xml.template | 15 + .../templates/8.0/__openerp__.py.template | 4 - .../templates/8.0/header.template | 24 +- module_prototyper/tests/__init__.py | 2 +- module_prototyper/tests/test_prototype.py | 39 +-- .../tests/test_prototype_module_export.py | 10 +- .../views/ir_model_fields_view.xml | 88 +++--- .../views/module_prototyper_view.xml | 264 +++++++++--------- module_prototyper/wizard/__init__.py | 2 +- .../wizard/module_prototyper_module_export.py | 25 +- .../module_prototyper_module_export_view.xml | 68 +++-- 32 files changed, 549 insertions(+), 346 deletions(-) create mode 100644 module_prototyper/data/module_prototyper_api_version_data.xml create mode 100644 module_prototyper/models/module_prototyper_api_version.py create mode 100644 module_prototyper/templates/10.0/__init__.py.template create mode 100644 module_prototyper/templates/10.0/__manifest__.py.template create mode 100644 module_prototyper/templates/10.0/data/model_name.xml.template create mode 100644 module_prototyper/templates/10.0/demo/model_name.xml.template create mode 100644 module_prototyper/templates/10.0/header.template create mode 100644 module_prototyper/templates/10.0/models/__init__.py.template create mode 100644 module_prototyper/templates/10.0/models/model_name.py.template create mode 100644 module_prototyper/templates/10.0/security/ir.model.access.csv.template create mode 100644 module_prototyper/templates/10.0/security/model_name.xml.template create mode 100644 module_prototyper/templates/10.0/views/model_menus.xml.template create mode 100644 module_prototyper/templates/10.0/views/model_views.xml.template diff --git a/module_prototyper/README.rst b/module_prototyper/README.rst index 2f00607ce..ba2fd4a34 100644 --- a/module_prototyper/README.rst +++ b/module_prototyper/README.rst @@ -51,7 +51,7 @@ things like default values or onchange methods. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/149/9.0 + :target: https://runbot.odoo-community.org/runbot/149/10.0 Known issues / Roadmap ====================== @@ -69,10 +69,10 @@ Known issues / Roadmap Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. Credits ======= @@ -87,6 +87,7 @@ Contributors * Savoir-faire Linux * Vincent Vinet * Nicolas JEUDY +* Dennis Sluijk Maintainer ---------- @@ -97,14 +98,8 @@ Maintainer This module is maintained by the OCA. -OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. - -Changelog -========= - -v9.0.0.1.0 ----------- - -* Initial V9 version from V8.0.3 +To contribute to this module, please visit https://odoo-community.org. diff --git a/module_prototyper/__init__.py b/module_prototyper/__init__.py index f01f7f122..113fd04ca 100644 --- a/module_prototyper/__init__.py +++ b/module_prototyper/__init__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/module_prototyper/__manifest__.py b/module_prototyper/__manifest__.py index d943c328f..0aca41551 100644 --- a/module_prototyper/__manifest__.py +++ b/module_prototyper/__manifest__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution @@ -22,8 +22,9 @@ { 'name': 'Module Prototyper', - 'version': '9.0.0.1.0', - 'author': 'Savoir-faire Linux, Odoo Community Association (OCA), Sudokeys', + 'version': '10.0.1.0.0', + 'author': 'Savoir-faire Linux, Sudokeys, Onestein, ' + 'Odoo Community Association (OCA)', 'maintainer': 'Savoir-faire Linux', 'website': 'http://www.savoirfairelinux.com', 'license': 'AGPL-3', @@ -34,11 +35,12 @@ 'python': [], }, 'data': [ + 'data/module_prototyper_api_version_data.xml', 'wizard/module_prototyper_module_export_view.xml', 'views/module_prototyper_view.xml', 'views/ir_model_fields_view.xml', 'security/ir.model.access.csv', ], - 'installable': False, + 'installable': True, 'application': True, } diff --git a/module_prototyper/data/README.rst b/module_prototyper/data/README.rst index ba37f1bfb..6b2d0e75f 100644 --- a/module_prototyper/data/README.rst +++ b/module_prototyper/data/README.rst @@ -2,33 +2,37 @@ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -=========== -Module name -=========== +============== +{module_title} +============== -This module was written to extend the functionality of ... to support ... -and allow you to ... +This module extends the functionality of ... to support ... +and to allow you to ... Installation ============ To install this module, you need to: - * do this ... +#. Do this ... Configuration ============= To configure this module, you need to: - * go to ... +#. Go to ... + +.. figure:: path/to/local/image.png + :alt: alternative description + :width: 600 px Usage ===== To use this module, you need to: - * go to ... +#. Go to ... .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -37,37 +41,47 @@ To use this module, you need to: .. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt .. branch is "8.0" for example -For further information, please visit: - - * https://www.odoo.com/forum/help-1 - Known issues / Roadmap ====================== - * ... +* Add ... Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. Credits ======= +Images +------ + +* Odoo Community Association: `Icon `_. + Contributors ------------ * Firstname Lastname +* Second Person + +Funders +------- + +The development of this module has been financially supported by: + +* Company 1 name +* Company 2 name Maintainer ---------- -.. image:: http://odoo-community.org/logo.png +.. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association - :target: http://odoo-community.org + :target: https://odoo-community.org This module is maintained by the OCA. @@ -75,4 +89,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. +To contribute to this module, please visit https://odoo-community.org. diff --git a/module_prototyper/data/module_prototyper_api_version_data.xml b/module_prototyper/data/module_prototyper_api_version_data.xml new file mode 100644 index 000000000..d9fc0f300 --- /dev/null +++ b/module_prototyper/data/module_prototyper_api_version_data.xml @@ -0,0 +1,16 @@ + + + + + + 8.0 + __openerp__ + + + + 10.0 + __manifest__ + + + diff --git a/module_prototyper/models/__init__.py b/module_prototyper/models/__init__.py index 995a20115..538c0ba79 100644 --- a/module_prototyper/models/__init__.py +++ b/module_prototyper/models/__init__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution @@ -21,5 +21,6 @@ ############################################################################## from . import ( module_prototyper, + module_prototyper_api_version, ir_model_fields ) diff --git a/module_prototyper/models/ir_model_fields.py b/module_prototyper/models/ir_model_fields.py index e67df14f8..869ff97c4 100644 --- a/module_prototyper/models/ir_model_fields.py +++ b/module_prototyper/models/ir_model_fields.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution @@ -20,11 +20,10 @@ # ############################################################################## -from openerp import fields, models -from openerp.tools.translate import _ +from odoo import fields, models -class ir_model_fields(models.Model): +class IrModelFields(models.Model): """Addition of text fields to fields.""" _inherit = "ir.model.fields" @@ -33,17 +32,17 @@ class ir_model_fields(models.Model): # TODO: Make column1 and 2 required if a model has a m2m to itself column1 = fields.Char( 'Column1', - help=_("name of the column referring to 'these' records in the " - "relation table"), + help="name of the column referring to 'these' records in the " + "relation table", ) column2 = fields.Char( 'Column2', - help=_("name of the column referring to 'those' records in the " - "relation table"), + help="name of the column referring to 'those' records in the " + "relation table", ) - limit = fields.Integer('Read limit', help=_("Read limit")) + limit = fields.Integer('Read limit', help="Read limit") client_context = fields.Char( 'Context', - help=_("Context to use on the client side when handling the field " - "(python dictionary)"), + help="Context to use on the client side when handling the field " + "(python dictionary)", ) diff --git a/module_prototyper/models/licenses.py b/module_prototyper/models/licenses.py index 075d27a59..108a5af11 100644 --- a/module_prototyper/models/licenses.py +++ b/module_prototyper/models/licenses.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- # ############################################################################# # # OpenERP, Open Source Management Solution diff --git a/module_prototyper/models/module_prototyper.py b/module_prototyper/models/module_prototyper.py index bd3aaa15d..6c4ba95cd 100644 --- a/module_prototyper/models/module_prototyper.py +++ b/module_prototyper/models/module_prototyper.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- # ############################################################################# # # OpenERP, Open Source Management Solution @@ -31,8 +31,8 @@ from datetime import date from jinja2 import Environment, FileSystemLoader -from openerp import models, api, fields -from openerp.tools.safe_eval import safe_eval +from odoo import models, api, fields +from odoo.tools.safe_eval import safe_eval from . import licenses @@ -55,7 +55,7 @@ class ModulePrototyper(models.Model): """ Extract the content of default description """ - filepath = '{}/../data/README.rst'.format(os.path.dirname(__file__)) + filepath = '%s/../data/README.rst' % (os.path.dirname(__file__),) with open(filepath, 'r') as content_file: content = content_file.read() return content @@ -108,8 +108,8 @@ class ModulePrototyper(models.Model): ) version = fields.Char( 'Version', - size=9, - default='8.0.1.0.0', + size=10, + default='10.0.1.0.0', help=('Enter the version of your module with 5 digits') ) auto_install = fields.Boolean( @@ -203,17 +203,18 @@ class ModulePrototyper(models.Model): ) _env = None + _api_version = None _data_files = () _demo_files = () _field_descriptions = None File_details = namedtuple('file_details', ['filename', 'filecontent']) - template_path = '{}/../templates/'.format(os.path.dirname(__file__)) + template_path = '%s/../templates/' % (os.path.dirname(__file__),) @api.model - def set_jinja_env(self, api_version): + def setup_env(self, api_version): """Set the Jinja2 environment. The environment will helps the system to find the templates to render. - :param api_version: string, odoo api + :param api_version: module_prototyper.api_version, odoo api :return: jinja2.Environment instance. """ if self._env is None: @@ -221,9 +222,10 @@ class ModulePrototyper(models.Model): lstrip_blocks=True, trim_blocks=True, loader=FileSystemLoader( - os.path.join(self.template_path, api_version) + os.path.join(self.template_path, api_version.name) ) ) + self._api_version = api_version return self._env def set_field_descriptions(self): @@ -267,7 +269,9 @@ class ModulePrototyper(models.Model): file_details.extend(self.generate_data_files()) # must be the last as the other generations might add information # to put in the __openerp__: additional dependencies, views files, etc. - file_details.append(self.generate_module_openerp_file_details()) + file_details.append( + self.generate_module_openerp_file_details() + ) if self.icon_image: file_details.append(self.save_icon()) @@ -293,9 +297,10 @@ class ModulePrototyper(models.Model): @api.model def generate_module_openerp_file_details(self): """Wrapper to generate the __openerp__.py file of the module.""" + fn_inc_ext = '%s.py' % (self._api_version.manifest_file_name,) return self.generate_file_details( - '__openerp__.py', - '__openerp__.py.template', + fn_inc_ext, + '%s.template' % (fn_inc_ext,), prototype=self, data_files=self._data_files, demo_fiels=self._demo_files, @@ -366,8 +371,8 @@ class ModulePrototyper(models.Model): views_details = [] for model, views in relations.iteritems(): - filepath = 'views/{}_view.xml'.format( - self.friendly_name(self.unprefix(model)) + filepath = 'views/%s_view.xml' % ( + self.friendly_name(self.unprefix(model)), ) views_details.append( self.generate_file_details( @@ -394,8 +399,8 @@ class ModulePrototyper(models.Model): menus_details = [] for model_name, menus in relations.iteritems(): model_name = self.unprefix(model_name) - filepath = 'views/{}_menus.xml'.format( - self.friendly_name(model_name) + filepath = 'views/%s_menus.xml' % ( + self.friendly_name(model_name), ) menus_details.append( self.generate_file_details( @@ -418,7 +423,7 @@ class ModulePrototyper(models.Model): """ python_friendly_name = self.friendly_name(self.unprefix(model.model)) return self.generate_file_details( - 'models/{}.py'.format(python_friendly_name), + 'models/%s.py' % (python_friendly_name,), 'models/model_name.py.template', name=python_friendly_name, model=model, @@ -449,7 +454,7 @@ class ModulePrototyper(models.Model): ('demo', demo, self._demo_files)]: for model_name, records in model_data.iteritems(): fname = self.friendly_name(self.unprefix(model_name)) - filename = '{0}/{1}.xml'.format(prefix, fname) + filename = '%s/%s.xml' % (prefix, fname) self._data_files.append(filename) res.append(self.generate_file_details( diff --git a/module_prototyper/models/module_prototyper_api_version.py b/module_prototyper/models/module_prototyper_api_version.py new file mode 100644 index 000000000..390fc6c15 --- /dev/null +++ b/module_prototyper/models/module_prototyper_api_version.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Onestein () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields + + +class ModulePrototyperApiVersion(models.Model): + _name = 'module_prototyper.api_version' + + name = fields.Char() + manifest_file_name = fields.Char() diff --git a/module_prototyper/security/ir.model.access.csv b/module_prototyper/security/ir.model.access.csv index 7250a7457..10ed4bb43 100755 --- a/module_prototyper/security/ir.model.access.csv +++ b/module_prototyper/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_prototype_admin,prototype_system,model_module_prototyper,base.group_system,1,1,1,1 +access_prototype_api_version_admin,prototype_api_version_system,model_module_prototyper_api_version,base.group_system,1,1,1,1 diff --git a/module_prototyper/templates/10.0/__init__.py.template b/module_prototyper/templates/10.0/__init__.py.template new file mode 100644 index 000000000..384a9cd45 --- /dev/null +++ b/module_prototyper/templates/10.0/__init__.py.template @@ -0,0 +1,7 @@ +{% extends "header.template" %} +{% block body %} +{% if models %} + +from . import models +{% endif %} +{% endblock %} diff --git a/module_prototyper/templates/10.0/__manifest__.py.template b/module_prototyper/templates/10.0/__manifest__.py.template new file mode 100644 index 000000000..72fa4a827 --- /dev/null +++ b/module_prototyper/templates/10.0/__manifest__.py.template @@ -0,0 +1,58 @@ +{% extends "header.template" %} +{% block body %} + +{ + 'name': '{{ prototype.human_name }}', + 'version': '{{ prototype.version }}', + 'author': '{{ prototype.author }}', + 'maintainer': '{{ prototype.maintainer }}', + 'website': '{{ prototype.website }}', + 'license': '{{ prototype.licence }}', + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/master/openerp/addons/base/module/module_data.xml # noqa + # for the full list + 'category': '{{ prototype.with_context({}).category_id.name }}',{# In english please! #} + 'summary': '{{ prototype.summary }}', + 'description': """ +{{ prototype.description }} + +* Module exported by the Module Prototyper module for version 10.0. +* If you have any questions, please contact Savoir-faire Linux +(support@savoirfairelinux.com) +""", + + # any module necessary for this one to work correctly + 'depends': [ + {% for dependency in prototype.dependency_ids %} + '{{ dependency.name }}', + {% endfor %} + ], + 'external_dependencies': { + 'python': [], + }, + + # always loaded + 'data': [ + {% for data_file in data_files %} + '{{ data_file }}', + {% endfor %} + ], + # only loaded in demonstration mode + 'demo': [ + {% for demo_file in prototype.demo_ids %} + '{{ demo_file.name }}', + {% endfor %} + ], + + 'js': [], + 'css': [], + 'qweb': [], + + 'installable': True, + # Install this module automatically if all dependency have been previously + # and independently installed. Used for synergetic or glue modules. + 'auto_install': {{ prototype.auto_install }}, + 'application': {{ prototype.application }}, +} +{% endblock %} diff --git a/module_prototyper/templates/10.0/data/model_name.xml.template b/module_prototyper/templates/10.0/data/model_name.xml.template new file mode 100644 index 000000000..9e8646b49 --- /dev/null +++ b/module_prototyper/templates/10.0/data/model_name.xml.template @@ -0,0 +1,6 @@ + + + + {{ data }} + + diff --git a/module_prototyper/templates/10.0/demo/model_name.xml.template b/module_prototyper/templates/10.0/demo/model_name.xml.template new file mode 100644 index 000000000..f45e348d1 --- /dev/null +++ b/module_prototyper/templates/10.0/demo/model_name.xml.template @@ -0,0 +1,6 @@ + + + + {{ demo }} + + diff --git a/module_prototyper/templates/10.0/header.template b/module_prototyper/templates/10.0/header.template new file mode 100644 index 000000000..61de08fd9 --- /dev/null +++ b/module_prototyper/templates/10.0/header.template @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright {{ export_year }} {% if author %}{{ author }}{% endif %} ({% if website %}({{ website }}).{% endif %}) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{% block body %} +{% endblock %} diff --git a/module_prototyper/templates/10.0/models/__init__.py.template b/module_prototyper/templates/10.0/models/__init__.py.template new file mode 100644 index 000000000..8e1a1083d --- /dev/null +++ b/module_prototyper/templates/10.0/models/__init__.py.template @@ -0,0 +1,9 @@ +{% extends "header.template" %} +{% block body %} +{% for model in models %} +{% if loop.first %} + +{% endif %} +from . import {{ model }} +{% endfor %} +{% endblock %} diff --git a/module_prototyper/templates/10.0/models/model_name.py.template b/module_prototyper/templates/10.0/models/model_name.py.template new file mode 100644 index 000000000..b1790803e --- /dev/null +++ b/module_prototyper/templates/10.0/models/model_name.py.template @@ -0,0 +1,35 @@ +{% extends "header.template" %} +{% block body %} + +from odoo import models, fields +from odoo.tools.translate import _ + + +class {{ unprefix(name) }}(models.Model): + {% if model.state == 'base' %} + _name = "{{ model.model }}" + {% else %} + _inherit = "{{ model.model }}" + {% endif %} + {% if description %} + _description = "{{ description }}" + {% endif %} + + {% for field in fields %} + {% for line in wrap(field.notes, replace_whitespace=False) %} + # {{line}} + {% endfor %} + {{ unprefix(field.name) }} = fields.{{ field.ttype|capitalize }}( + string=_("{{ field.field_description }}"), + required={{ field.required }}, + translate={{ field.translate }}, + readonly={{ field.readonly }} + {% if field.size %} + size={{ field.size }}, + {% endif %} + {% if field.helper %} + help=_("{{ field.helper }}"), + {% endif %} + ) + {% endfor %} +{% endblock %} diff --git a/module_prototyper/templates/10.0/security/ir.model.access.csv.template b/module_prototyper/templates/10.0/security/ir.model.access.csv.template new file mode 100644 index 000000000..0d2111f9d --- /dev/null +++ b/module_prototyper/templates/10.0/security/ir.model.access.csv.template @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +{% for rule in access_rules %} +{{ rule.id }},{{ rule.name }},{{ rule.model_id.id }},{{ rule.group_id.id }},{{ rule.perm_write }},{{ rule.perm_write }},{{ rule.perm_create }},{{ rule.perm_unlink }} +{% endfor %} diff --git a/module_prototyper/templates/10.0/security/model_name.xml.template b/module_prototyper/templates/10.0/security/model_name.xml.template new file mode 100644 index 000000000..eb8ededa9 --- /dev/null +++ b/module_prototyper/templates/10.0/security/model_name.xml.template @@ -0,0 +1,8 @@ + + + + {{ groups }} + + {{ rules }} + + diff --git a/module_prototyper/templates/10.0/views/model_menus.xml.template b/module_prototyper/templates/10.0/views/model_menus.xml.template new file mode 100644 index 000000000..b6119cf06 --- /dev/null +++ b/module_prototyper/templates/10.0/views/model_menus.xml.template @@ -0,0 +1,27 @@ + + + {% for menu in menus %} + + {{ unprefix(menu.action.name) }} + {{ menu.action.type }} + {{ unprefix(menu.action.res_model) }} + {{ menu.action.view_type }} + {{ menu.action.view_mode }} + {% if menu.action.help %} + {{ menu.action.help }} + + {% endif %} + + + + {% if not loop.last %} + + {% endif %} + {% endfor %} + diff --git a/module_prototyper/templates/10.0/views/model_views.xml.template b/module_prototyper/templates/10.0/views/model_views.xml.template new file mode 100644 index 000000000..fd769ff68 --- /dev/null +++ b/module_prototyper/templates/10.0/views/model_views.xml.template @@ -0,0 +1,15 @@ + + + + {% for view in views %} + + {{ unprefix(view.name) }}.view + {{ unprefix(view.model) }} + {{ view.type }} + + + {{ fixup_arch(view.arch) }} + + + {% endfor %} + diff --git a/module_prototyper/templates/8.0/__openerp__.py.template b/module_prototyper/templates/8.0/__openerp__.py.template index 5c8e687ec..12b6876c8 100644 --- a/module_prototyper/templates/8.0/__openerp__.py.template +++ b/module_prototyper/templates/8.0/__openerp__.py.template @@ -16,10 +16,6 @@ 'summary': '{{ prototype.summary }}', 'description': """ {{ prototype.description }} - -* Module exported by the Module Prototyper module for version 8.0. -* If you have any questions, please contact Savoir-faire Linux -(support@savoirfairelinux.com) """, # any module necessary for this one to work correctly diff --git a/module_prototyper/templates/8.0/header.template b/module_prototyper/templates/8.0/header.template index c09b2426b..61de08fd9 100644 --- a/module_prototyper/templates/8.0/header.template +++ b/module_prototyper/templates/8.0/header.template @@ -1,23 +1,5 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# Odoo, Open Source Management Solution -# This module copyright (C) {{ export_year }} {% if author %}{{ author }}{% endif %} -# {% if website %}({{ website }}).{% endif %} -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# Copyright {{ export_year }} {% if author %}{{ author }}{% endif %} ({% if website %}({{ website }}).{% endif %}) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). {% block body %} {% endblock %} diff --git a/module_prototyper/tests/__init__.py b/module_prototyper/tests/__init__.py index aff3c1c83..ff14dd0a5 100644 --- a/module_prototyper/tests/__init__.py +++ b/module_prototyper/tests/__init__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/module_prototyper/tests/test_prototype.py b/module_prototyper/tests/test_prototype.py index 76d3c8fdc..6351c8a8e 100644 --- a/module_prototyper/tests/test_prototype.py +++ b/module_prototyper/tests/test_prototype.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- # +# -*- coding: utf-8 -*- # OpenERP, Open Source Management Solution # This module copyright (C) 2013 Savoir-faire Linux # (). @@ -28,7 +28,7 @@ except ImportError: from jinja2 import Environment from jinja2.exceptions import TemplateNotFound -from openerp.tests import common +from odoo.tests import common class TestModulePrototyper(common.TransactionCase): @@ -49,17 +49,17 @@ class TestModulePrototyper(common.TransactionCase): 'website': 't_website', 'dependencies': [(6, 0, [1, 2, 3, 4])], }) - self.api_version = '8.0' + self.api_version = self.env['module_prototyper.api_version'].search([ + ('id', '=', self.ref('module_prototyper.api_version_80')) + ]) def test_generate_files_assert_if_no_env(self): - self.assertRaises( - AssertionError, - self.prototype.generate_files - ) + with self.assertRaises(AssertionError): + self.prototype.generate_files() def test_generate_files(self): """Test generate_files returns a tuple.""" - self.prototype.set_jinja_env(self.api_version) + self.prototype.setup_env(self.api_version) details = self.prototype.generate_files() self.assertIsInstance(details, list) # namedtuples in tuple @@ -80,9 +80,9 @@ class TestModulePrototyper(common.TransactionCase): res = checker.check_all() self.assertFalse( res, - "Python file {0} has pep8 errors:\n" - "{1}\n{2}".format(name, checker.report.messages, - repr(contents)) + "Python file %s has pep8 errors:\n" + "%s\n%s" % (name, checker.report.messages, + repr(contents)) ) elif name.endswith(".xml"): @@ -90,19 +90,24 @@ class TestModulePrototyper(common.TransactionCase): lxml.etree.fromstring(contents) def test_generate_files_raise_templatenotfound_if_not_found(self): - self.prototype.set_jinja_env('t_api_version') - self.assertRaises( - TemplateNotFound, - self.prototype.generate_files - ) + not_existing_api = self.env['module_prototyper.api_version'].create({ + 'name': 'non_existing_api' + }) + self.prototype.setup_env(not_existing_api) + with self.assertRaises(TemplateNotFound): + self.prototype.generate_files() def test_set_env(self): """test the jinja2 environment is set.""" self.assertIsNone(self.prototype._env) - self.prototype.set_jinja_env(self.api_version) + self.prototype.setup_env(self.api_version) self.assertIsInstance( self.prototype._env, Environment ) + self.assertEqual( + self.api_version, + self.prototype._api_version + ) def test_friendly_name_return(self): """Test if the returns match the pattern.""" diff --git a/module_prototyper/tests/test_prototype_module_export.py b/module_prototyper/tests/test_prototype_module_export.py index e58cd1b90..6569711d4 100644 --- a/module_prototyper/tests/test_prototype_module_export.py +++ b/module_prototyper/tests/test_prototype_module_export.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- # ############################################################################# # # OpenERP, Open Source Management Solution @@ -19,14 +19,14 @@ # along with this program. If not, see . # ############################################################################## -from openerp.tests import common +from odoo.tests import common import zipfile import StringIO -class test_prototype_module_export(common.TransactionCase): +class TestPrototypeModuleExport(common.TransactionCase): def setUp(self): - super(test_prototype_module_export, self).setUp() + super(TestPrototypeModuleExport, self).setUp() self.main_model = self.env['module_prototyper.module.export'] self.prototype_model = self.env['module_prototyper'] self.module_category_model = self.env[ @@ -65,7 +65,7 @@ class test_prototype_module_export(common.TransactionCase): ).create({}) exporter.action_export(exporter.id) self.assertEqual(exporter.state, 'get') - self.assertEqual(exporter.name, '{}.zip'.format(self.prototype.name)) + self.assertEqual(exporter.name, '%s.zip' % (self.prototype.name,)) def test_zip_files_returns_tuple(self): """Test the method return of the method that generate the zip file.""" diff --git a/module_prototyper/views/ir_model_fields_view.xml b/module_prototyper/views/ir_model_fields_view.xml index f4f55b2eb..2cfd25157 100644 --- a/module_prototyper/views/ir_model_fields_view.xml +++ b/module_prototyper/views/ir_model_fields_view.xml @@ -1,50 +1,48 @@ - - + - - view_ir_model_fields_form - ir.model.fields - - - - + + + view_ir_model_form + ir.model + + + + + + + + - - + diff --git a/module_prototyper/views/module_prototyper_view.xml b/module_prototyper/views/module_prototyper_view.xml index 25106d292..421127e27 100644 --- a/module_prototyper/views/module_prototyper_view.xml +++ b/module_prototyper/views/module_prototyper_view.xml @@ -1,146 +1,144 @@ - - + - - Base tree View for module prototypes - module_prototyper - - - - - - - - + + Base tree View for module prototypes + module_prototyper + + + + + + + + - - Base form view for module prototypes - module_prototyper - -
- - -
-

- -

-
-
+ + Base form view for module prototypes + module_prototyper + + + + +
+

+ +

+
+
+
+ - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - -
- -
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Prototypes - module_prototyper - form - tree,form - - + + Prototypes + module_prototyper + form + tree,form + + - - - + + + - + - + - + - + - - + diff --git a/module_prototyper/wizard/__init__.py b/module_prototyper/wizard/__init__.py index bb0eb2ebe..bae806517 100644 --- a/module_prototyper/wizard/__init__.py +++ b/module_prototyper/wizard/__init__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/module_prototyper/wizard/module_prototyper_module_export.py b/module_prototyper/wizard/module_prototyper_module_export.py index 560bf591c..bacd92816 100644 --- a/module_prototyper/wizard/module_prototyper_module_export.py +++ b/module_prototyper/wizard/module_prototyper_module_export.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- # ############################################################################# # # OpenERP, Open Source Management Solution @@ -26,20 +26,21 @@ import os import zipfile from collections import namedtuple -from openerp import fields, models, api +from odoo import fields, models, api class PrototypeModuleExport(models.TransientModel): _name = "module_prototyper.module.export" + def _default_api_version(self): + return self.env.ref('module_prototyper.api_version_100').id + name = fields.Char('File Name', readonly=True) - api_version = fields.Selection( - [ - ('8.0', '8.0'), - ], - 'API version', + api_version = fields.Many2one( + comodel_name='module_prototyper.api_version', + string='API version', required=True, - default='8.0' + default=_default_api_version ) data = fields.Binary('File', readonly=True) state = fields.Selection( @@ -63,8 +64,8 @@ class PrototypeModuleExport(models.TransientModel): active_model = self._context.get('active_model') # checking if the wizard was called by a prototype. - msg = '{} has to be called from a "module_prototyper" , not a "{}"' - assert active_model == 'module_prototyper', msg.format( + msg = '%s has to be called from a "module_prototyper" , not a "%s"' + assert active_model == 'module_prototyper', msg % ( self, active_model ) @@ -82,7 +83,7 @@ class PrototypeModuleExport(models.TransientModel): wizard.write( { - 'name': '{}.zip'.format(zip_name), + 'name': '%s.zip' % (zip_name,), 'state': 'get', 'data': base64.encodestring(zip_details.stringIO.getvalue()) } @@ -112,7 +113,7 @@ class PrototypeModuleExport(models.TransientModel): # setting the jinja environment. # They will help the program to find the template to render the # files with. - prototype.set_jinja_env(wizard.api_version) + prototype.setup_env(wizard.api_version) # generate_files ask the prototype to investigate the input and # to generate the file templates according to it. zip_files, diff --git a/module_prototyper/wizard/module_prototyper_module_export_view.xml b/module_prototyper/wizard/module_prototyper_module_export_view.xml index d4678ebf5..d2c695143 100644 --- a/module_prototyper/wizard/module_prototyper_module_export_view.xml +++ b/module_prototyper/wizard/module_prototyper_module_export_view.xml @@ -1,43 +1,41 @@ - - + - Export Module - module_prototyper.module.export - -
- - - - - - - - - -
-

Export Complete

-

Here is the exported module:

-
-
-
-
-
- -
+ Export Module + module_prototyper.module.export + +
+ + + + + + + + + +
+

Export Complete

+

Here is the exported module:

+
+
+
+
+
+ +
- Export Module - module_prototyper.module.export - form - - new + Export Module + module_prototyper.module.export + form + + new -
-
+