diff --git a/module_prototyper/__init__.py b/module_prototyper/__init__.py index 113fd04ca..a06dff275 100644 --- a/module_prototyper/__init__.py +++ b/module_prototyper/__init__.py @@ -19,7 +19,4 @@ # along with this program. If not, see . # ############################################################################## -from . import ( - models, - wizard -) +from . import models, wizard diff --git a/module_prototyper/__manifest__.py b/module_prototyper/__manifest__.py index 0aca41551..e838c1437 100644 --- a/module_prototyper/__manifest__.py +++ b/module_prototyper/__manifest__.py @@ -21,26 +21,24 @@ ############################################################################## { - 'name': 'Module Prototyper', - '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', - 'category': 'Others', - 'summary': 'Prototype your module.', - 'depends': [], - 'external_dependencies': { - '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', + "name": "Module Prototyper", + "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", + "category": "Others", + "summary": "Prototype your module.", + "depends": [], + "external_dependencies": {"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': True, - 'application': True, + "installable": True, + "application": True, } diff --git a/module_prototyper/models/__init__.py b/module_prototyper/models/__init__.py index 538c0ba79..3b872d764 100644 --- a/module_prototyper/models/__init__.py +++ b/module_prototyper/models/__init__.py @@ -19,8 +19,4 @@ # along with this program. If not, see . # ############################################################################## -from . import ( - module_prototyper, - module_prototyper_api_version, - ir_model_fields -) +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 869ff97c4..41ec7bd64 100644 --- a/module_prototyper/models/ir_model_fields.py +++ b/module_prototyper/models/ir_model_fields.py @@ -25,24 +25,25 @@ from odoo import fields, models class IrModelFields(models.Model): """Addition of text fields to fields.""" + _inherit = "ir.model.fields" - notes = fields.Text('Notes to developers.') - helper = fields.Text('Helper') + notes = fields.Text("Notes to developers.") + helper = fields.Text("Helper") # TODO: Make column1 and 2 required if a model has a m2m to itself column1 = fields.Char( - 'Column1', + "Column1", help="name of the column referring to 'these' records in the " - "relation table", + "relation table", ) column2 = fields.Char( - 'Column2', + "Column2", help="name of the column referring to 'those' records in the " - "relation table", + "relation table", ) - limit = fields.Integer('Read limit', help="Read limit") + limit = fields.Integer("Read limit", help="Read limit") client_context = fields.Char( - 'Context', + "Context", help="Context to use on the client side when handling the field " - "(python dictionary)", + "(python dictionary)", ) diff --git a/module_prototyper/models/module_prototyper.py b/module_prototyper/models/module_prototyper.py index 6c4ba95cd..b432f12fe 100644 --- a/module_prototyper/models/module_prototyper.py +++ b/module_prototyper/models/module_prototyper.py @@ -48,6 +48,7 @@ class ModulePrototyper(models.Model): by a developer to fix glitch that would sneak it during the generation of files but also to add not supported features. """ + _name = "module_prototyper" _description = "Module Prototyper" @@ -55,151 +56,214 @@ class ModulePrototyper(models.Model): """ Extract the content of default description """ - filepath = '%s/../data/README.rst' % (os.path.dirname(__file__),) - with open(filepath, 'r') as content_file: + filepath = "%s/../data/README.rst" % (os.path.dirname(__file__),) + with open(filepath, "r") as content_file: content = content_file.read() return content license = fields.Selection( [ - (licenses.GPL3, 'GPL Version 3'), - (licenses.GPL3_L, 'GPL-3 or later version'), - (licenses.LGPL3, 'LGPL-3'), - (licenses.LGPL3_L, 'LGPL-3 or later version'), - (licenses.AGPL3, 'Affero GPL-3'), - (licenses.OSI, 'Other OSI Approved Licence'), - ('Other proprietary', 'Other Proprietary') + (licenses.GPL3, "GPL Version 3"), + (licenses.GPL3_L, "GPL-3 or later version"), + (licenses.LGPL3, "LGPL-3"), + (licenses.LGPL3_L, "LGPL-3 or later version"), + (licenses.AGPL3, "Affero GPL-3"), + (licenses.OSI, "Other OSI Approved Licence"), + ("Other proprietary", "Other Proprietary"), ], - string='License', + string="License", default=licenses.AGPL3, ) name = fields.Char( - 'Technical Name', required=True, - help=('The technical name will be used to define the name of ' - 'the exported module, the name of the model.') + "Technical Name", + required=True, + help=( + "The technical name will be used to define the name of " + "the exported module, the name of the model." + ), ) - category_id = fields.Many2one('ir.module.category', 'Category') + category_id = fields.Many2one("ir.module.category", "Category") human_name = fields.Char( - 'Module Name', required=True, - help=('The Module Name will be used as the displayed name of the ' - 'exported module.') + "Module Name", + required=True, + help=( + "The Module Name will be used as the displayed name of the " + "exported module." + ), + ) + summary = fields.Char( + "Summary", required=True, help=("Enter a summary of your module") ) - summary = fields.Char('Summary', required=True, - help=('Enter a summary of your module')) description = fields.Text( - 'Description', + "Description", required=True, - help=('Enter the description of your module, what it does, how to ' - 'install, configure and use it, the roadmap or known issues. ' - 'The description will be exported in README.rst'), - default=get_default_description + help=( + "Enter the description of your module, what it does, how to " + "install, configure and use it, the roadmap or known issues. " + "The description will be exported in README.rst" + ), + default=get_default_description, ) - author = fields.Char('Author', required=True, help=('Enter your name')) + author = fields.Char("Author", required=True, help=("Enter your name")) maintainer = fields.Char( - 'Maintainer', - help=('Enter the name of the person or organization who will ' - 'maintain this module') + "Maintainer", + help=( + "Enter the name of the person or organization who will " + "maintain this module" + ), ) - website = fields.Char('Website', help=('Enter the URL of your website')) + website = fields.Char("Website", help=("Enter the URL of your website")) icon_image = fields.Binary( - 'Icon', - help=('The icon set up here will be used as the icon ' - 'for the exported module also') + "Icon", + help=( + "The icon set up here will be used as the icon " + "for the exported module also" + ), ) version = fields.Char( - 'Version', + "Version", size=10, - default='10.0.1.0.0', - help=('Enter the version of your module with 5 digits') + default="10.0.1.0.0", + help=("Enter the version of your module with 5 digits"), ) auto_install = fields.Boolean( - 'Auto Install', + "Auto Install", default=False, - help='Check if the module should be install by default.' + help="Check if the module should be install by default.", ) application = fields.Boolean( - 'Application', + "Application", default=False, - help='Check if the module is an Odoo application.' + help="Check if the module is an Odoo application.", ) # Relations dependency_ids = fields.Many2many( - 'ir.module.module', 'module_prototyper_module_rel', - 'module_prototyper_id', 'module_id', - 'Dependencies', - help=('Enter the list of required modules that need to be installed ' - 'for your module to work properly') + "ir.module.module", + "module_prototyper_module_rel", + "module_prototyper_id", + "module_id", + "Dependencies", + help=( + "Enter the list of required modules that need to be installed " + "for your module to work properly" + ), ) data_ids = fields.Many2many( - 'ir.filters', - 'prototype_data_rel', - 'module_prototyper_id', 'filter_id', - 'Data filters', - help="The records matching the filters will be added as data." + "ir.filters", + "prototype_data_rel", + "module_prototyper_id", + "filter_id", + "Data filters", + help="The records matching the filters will be added as data.", ) demo_ids = fields.Many2many( - 'ir.filters', - 'prototype_demo_rel', - 'module_prototyper_id', 'filter_id', - 'Demo filters', - help="The records matching the filters will be added as demo data." + "ir.filters", + "prototype_demo_rel", + "module_prototyper_id", + "filter_id", + "Demo filters", + help="The records matching the filters will be added as demo data.", ) field_ids = fields.Many2many( - 'ir.model.fields', 'prototype_fields_rel', - 'module_prototyper_id', 'field_id', 'Fields', - help=('Enter the list of fields that you have created or modified ' - 'and want to export in this module. New models will be ' - 'exported as long as you choose one of his fields.') + "ir.model.fields", + "prototype_fields_rel", + "module_prototyper_id", + "field_id", + "Fields", + help=( + "Enter the list of fields that you have created or modified " + "and want to export in this module. New models will be " + "exported as long as you choose one of his fields." + ), ) menu_ids = fields.Many2many( - 'ir.ui.menu', 'prototype_menu_rel', - 'module_prototyper_id', 'menu_id', 'Menu Items', - help=('Enter the list of menu items that you have created and want ' - 'to export in this module. Related windows actions will be ' - 'exported as well.') + "ir.ui.menu", + "prototype_menu_rel", + "module_prototyper_id", + "menu_id", + "Menu Items", + help=( + "Enter the list of menu items that you have created and want " + "to export in this module. Related windows actions will be " + "exported as well." + ), ) view_ids = fields.Many2many( - 'ir.ui.view', 'prototype_view_rel', - 'module_prototyper_id', 'view_id', 'Views', - help=('Enter the list of views that you have created and want to ' - 'export in this module.') + "ir.ui.view", + "prototype_view_rel", + "module_prototyper_id", + "view_id", + "Views", + help=( + "Enter the list of views that you have created and want to " + "export in this module." + ), ) group_ids = fields.Many2many( - 'res.groups', 'prototype_groups_rel', - 'module_prototyper_id', 'group_id', 'Groups', - help=('Enter the list of groups that you have created and want to ' - 'export in this module.') + "res.groups", + "prototype_groups_rel", + "module_prototyper_id", + "group_id", + "Groups", + help=( + "Enter the list of groups that you have created and want to " + "export in this module." + ), ) right_ids = fields.Many2many( - 'ir.model.access', 'prototype_rights_rel', - 'module_prototyper_id', 'right_id', - 'Access Rights', - help=('Enter the list of access rights that you have created and ' - 'want to export in this module.') + "ir.model.access", + "prototype_rights_rel", + "module_prototyper_id", + "right_id", + "Access Rights", + help=( + "Enter the list of access rights that you have created and " + "want to export in this module." + ), ) rule_ids = fields.Many2many( - 'ir.rule', 'prototype_rule_rel', - 'module_prototyper_id', 'rule_id', 'Record Rules', - help=('Enter the list of record rules that you have created and ' - 'want to export in this module.') + "ir.rule", + "prototype_rule_rel", + "module_prototyper_id", + "rule_id", + "Record Rules", + help=( + "Enter the list of record rules that you have created and " + "want to export in this module." + ), ) report_ids = fields.Many2many( - 'ir.actions.report.xml', 'prototype_report_rel', - 'module_prototyper_id', 'report_id', 'Reports', - help=('Enter the list of reports that you have created and ' - 'want to export in this module.') + "ir.actions.report.xml", + "prototype_report_rel", + "module_prototyper_id", + "report_id", + "Reports", + help=( + "Enter the list of reports that you have created and " + "want to export in this module." + ), ) activity_ids = fields.Many2many( - 'workflow.activity', 'prototype_wf_activity_rel', - 'module_prototyper_id', 'activity_id', 'Activities', - help=('Enter the list of workflow activities that you have created ' - 'and want to export in this module') + "workflow.activity", + "prototype_wf_activity_rel", + "module_prototyper_id", + "activity_id", + "Activities", + help=( + "Enter the list of workflow activities that you have created " + "and want to export in this module" + ), ) transition_ids = fields.Many2many( - 'workflow.transition', 'prototype_wf_transition_rel', - 'module_prototyper_id', 'transition_id', 'Transitions', - help=('Enter the list of workflow transitions that you have created ' - 'and want to export in this module') + "workflow.transition", + "prototype_wf_transition_rel", + "module_prototyper_id", + "transition_id", + "Transitions", + help=( + "Enter the list of workflow transitions that you have created " + "and want to export in this module" + ), ) _env = None @@ -207,8 +271,8 @@ class ModulePrototyper(models.Model): _data_files = () _demo_files = () _field_descriptions = None - File_details = namedtuple('file_details', ['filename', 'filecontent']) - template_path = '%s/../templates/' % (os.path.dirname(__file__),) + File_details = namedtuple("file_details", ["filename", "filecontent"]) + template_path = "%s/../templates/" % (os.path.dirname(__file__),) @api.model def setup_env(self, api_version): @@ -223,7 +287,7 @@ class ModulePrototyper(models.Model): trim_blocks=True, loader=FileSystemLoader( os.path.join(self.template_path, api_version.name) - ) + ), ) self._api_version = api_version return self._env @@ -240,12 +304,14 @@ class ModulePrototyper(models.Model): # the mock will allow us to add data or modify the data # of the field (like for the name) with keeping all the # attributes of the record. - field_description.update({ - attr_name: getattr(field, attr_name) - for attr_name in dir(field) - if not attr_name[0] == '_' - }) - field_description['name'] = self.unprefix(field.name) + field_description.update( + { + attr_name: getattr(field, attr_name) + for attr_name in dir(field) + if not attr_name[0] == "_" + } + ) + field_description["name"] = self.unprefix(field.name) self._field_descriptions[field] = field_description @api.model @@ -253,8 +319,9 @@ class ModulePrototyper(models.Model): """ Generates the files from the details of the prototype. :return: tuple """ - assert self._env is not None, \ - 'Run set_env(api_version) before to generate files.' + assert ( + self._env is not None + ), "Run set_env(api_version) before to generate files." # Avoid sharing these across instances self._data_files = [] @@ -269,9 +336,7 @@ 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()) @@ -290,17 +355,17 @@ class ModulePrototyper(models.Model): # * add document as a dependency. # The second options seems to be better, as Document is a base module. return self.File_details( - os.path.join('static', 'description', 'icon.jpg'), - base64.b64decode(self.icon_image) + os.path.join("static", "description", "icon.jpg"), + base64.b64decode(self.icon_image), ) @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,) + fn_inc_ext = "%s.py" % (self._api_version.manifest_file_name,) return self.generate_file_details( fn_inc_ext, - '%s.template' % (fn_inc_ext,), + "%s.template" % (fn_inc_ext,), prototype=self, data_files=self._data_files, demo_fiels=self._demo_files, @@ -310,11 +375,11 @@ class ModulePrototyper(models.Model): def generate_module_init_file_details(self): """Wrapper to generate the __init__.py file of the module.""" return self.generate_file_details( - '__init__.py', - '__init__.py.template', + "__init__.py", + "__init__.py.template", # no import models if no work of fields in # the prototype - models=bool(self.field_ids) + models=bool(self.field_ids), ) @api.model @@ -335,7 +400,7 @@ class ModulePrototyper(models.Model): relations = {} field_descriptions = self._field_descriptions or {} for field in field_descriptions.itervalues(): - model = field.get('model_id') + model = field.get("model_id") relations.setdefault(model, []).append(field) # dependencies.add(model.id) @@ -354,12 +419,11 @@ class ModulePrototyper(models.Model): def generate_models_init_details(self, ir_models): """Wrapper to generate the __init__.py file in models folder.""" return self.generate_file_details( - 'models/__init__.py', - 'models/__init__.py.template', + "models/__init__.py", + "models/__init__.py.template", models=[ - self.friendly_name(ir_model.model) - for ir_model in ir_models - ] + self.friendly_name(ir_model.model) for ir_model in ir_models + ], ) @api.model @@ -371,14 +435,12 @@ class ModulePrototyper(models.Model): views_details = [] for model, views in relations.iteritems(): - filepath = 'views/%s_view.xml' % ( + filepath = "views/%s_view.xml" % ( self.friendly_name(self.unprefix(model)), ) views_details.append( self.generate_file_details( - filepath, - 'views/model_views.xml.template', - views=views + filepath, "views/model_views.xml.template", views=views ) ) self._data_files.append(filepath) @@ -393,20 +455,16 @@ class ModulePrototyper(models.Model): if menu.action and menu.action.res_model: model = self.unprefix(menu.action.res_model) else: - model = 'ir_ui' + model = "ir_ui" relations.setdefault(model, []).append(menu) menus_details = [] for model_name, menus in relations.iteritems(): model_name = self.unprefix(model_name) - filepath = 'views/%s_menus.xml' % ( - self.friendly_name(model_name), - ) + filepath = "views/%s_menus.xml" % (self.friendly_name(model_name),) menus_details.append( self.generate_file_details( - filepath, - 'views/model_menus.xml.template', - menus=menus, + filepath, "views/model_menus.xml.template", menus=menus ) ) self._data_files.append(filepath) @@ -423,8 +481,8 @@ class ModulePrototyper(models.Model): """ python_friendly_name = self.friendly_name(self.unprefix(model.model)) return self.generate_file_details( - 'models/%s.py' % (python_friendly_name,), - 'models/model_name.py.template', + "models/%s.py" % (python_friendly_name,), + "models/model_name.py.template", name=python_friendly_name, model=model, fields=field_descriptions, @@ -434,12 +492,8 @@ class ModulePrototyper(models.Model): def generate_data_files(self): """ Generate data and demo files """ data, demo = {}, {} - filters = [ - (data, ir_filter) - for ir_filter in self.data_ids - ] + [ - (demo, ir_filter) - for ir_filter in self.demo_ids + filters = [(data, ir_filter) for ir_filter in self.data_ids] + [ + (demo, ir_filter) for ir_filter in self.demo_ids ] for target, ir_filter in filters: @@ -450,19 +504,22 @@ class ModulePrototyper(models.Model): res = [] for prefix, model_data, file_list in [ - ('data', data, self._data_files), - ('demo', demo, self._demo_files)]: + ("data", data, self._data_files), + ("demo", demo, self._demo_files), + ]: for model_name, records in model_data.iteritems(): fname = self.friendly_name(self.unprefix(model_name)) - filename = '%s/%s.xml' % (prefix, fname) + filename = "%s/%s.xml" % (prefix, fname) self._data_files.append(filename) - res.append(self.generate_file_details( - filename, - 'data/model_name.xml.template', - model=model_name, - records=records, - )) + res.append( + self.generate_file_details( + filename, + "data/model_name.xml.template", + model=model_name, + records=records, + ) + ) return res @@ -470,15 +527,15 @@ class ModulePrototyper(models.Model): def unprefix(cls, name): if not name: return name - return re.sub('^x_', '', name) + return re.sub("^x_", "", name) @classmethod def is_prefixed(cls, name): - return bool(re.match('^x_', name)) + return bool(re.match("^x_", name)) @classmethod def friendly_name(cls, name): - return name.replace('.', '_') + return name.replace(".", "_") @classmethod def fixup_domain(cls, domain): @@ -501,8 +558,10 @@ class ModulePrototyper(models.Model): try: attrs = safe_eval(elem.attrib["attrs"]) except Exception: - _logger.error("Unable to eval attribute: %s, skipping", - elem.attrib["attrs"]) + _logger.error( + "Unable to eval attribute: %s, skipping", + elem.attrib["attrs"], + ) continue if isinstance(attrs, dict): @@ -530,17 +589,16 @@ class ModulePrototyper(models.Model): # keywords used in several templates. kwargs.update( { - 'export_year': date.today().year, - 'author': self.author, - 'website': self.website, - 'license_text': licenses.get_license_text(self.license), - 'cr': self._cr, + "export_year": date.today().year, + "author": self.author, + "website": self.website, + "license_text": licenses.get_license_text(self.license), + "cr": self._cr, # Utility functions - 'fixup_arch': self.fixup_arch, - 'is_prefixed': self.is_prefixed, - 'unprefix': self.unprefix, - 'wrap': wrap, - + "fixup_arch": self.fixup_arch, + "is_prefixed": self.is_prefixed, + "unprefix": self.unprefix, + "wrap": wrap, } ) return self.File_details(filename, template.render(kwargs)) diff --git a/module_prototyper/models/module_prototyper_api_version.py b/module_prototyper/models/module_prototyper_api_version.py index 390fc6c15..1b3084deb 100644 --- a/module_prototyper/models/module_prototyper_api_version.py +++ b/module_prototyper/models/module_prototyper_api_version.py @@ -6,7 +6,7 @@ from odoo import models, fields class ModulePrototyperApiVersion(models.Model): - _name = 'module_prototyper.api_version' + _name = "module_prototyper.api_version" name = fields.Char() manifest_file_name = fields.Char() diff --git a/module_prototyper/tests/__init__.py b/module_prototyper/tests/__init__.py index ff14dd0a5..f0ed5aa45 100644 --- a/module_prototyper/tests/__init__.py +++ b/module_prototyper/tests/__init__.py @@ -19,7 +19,4 @@ # along with this program. If not, see . # ############################################################################## -from . import ( - test_prototype_module_export, - test_prototype -) +from . import test_prototype_module_export, test_prototype diff --git a/module_prototyper/tests/test_prototype.py b/module_prototyper/tests/test_prototype.py index 6351c8a8e..81d0351bc 100644 --- a/module_prototyper/tests/test_prototype.py +++ b/module_prototyper/tests/test_prototype.py @@ -34,24 +34,26 @@ from odoo.tests import common class TestModulePrototyper(common.TransactionCase): def setUp(self): super(TestModulePrototyper, self).setUp() - self.main_model = self.env['module_prototyper'] - self.module_category_model = self.env['ir.module.category'] - self.module_module_model = self.env['ir.module.module'] + self.main_model = self.env["module_prototyper"] + self.module_category_model = self.env["ir.module.category"] + self.module_module_model = self.env["ir.module.module"] - self.prototype = self.main_model.create({ - 'name': 't_name', - 'category_id': self.module_category_model.browse(1).id, - 'human_name': 't_human_name', - 'summary': 't_summary', - 'description': 't_description', - 'author': 't_author', - 'maintainer': 't_maintainer', - 'website': 't_website', - 'dependencies': [(6, 0, [1, 2, 3, 4])], - }) - self.api_version = self.env['module_prototyper.api_version'].search([ - ('id', '=', self.ref('module_prototyper.api_version_80')) - ]) + self.prototype = self.main_model.create( + { + "name": "t_name", + "category_id": self.module_category_model.browse(1).id, + "human_name": "t_human_name", + "summary": "t_summary", + "description": "t_description", + "author": "t_author", + "maintainer": "t_maintainer", + "website": "t_website", + "dependencies": [(6, 0, [1, 2, 3, 4])], + } + ) + 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): with self.assertRaises(AssertionError): @@ -74,15 +76,13 @@ class TestModulePrototyper(common.TransactionCase): contents = contents.encode("utf-8") ast.parse(contents) if pep8: - checker = pep8.Checker( - name, - contents.splitlines(True)) + checker = pep8.Checker(name, contents.splitlines(True)) res = checker.check_all() self.assertFalse( res, "Python file %s has pep8 errors:\n" - "%s\n%s" % (name, checker.report.messages, - repr(contents)) + "%s\n%s" + % (name, checker.report.messages, repr(contents)), ) elif name.endswith(".xml"): @@ -90,9 +90,9 @@ class TestModulePrototyper(common.TransactionCase): lxml.etree.fromstring(contents) def test_generate_files_raise_templatenotfound_if_not_found(self): - not_existing_api = self.env['module_prototyper.api_version'].create({ - 'name': 'non_existing_api' - }) + 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() @@ -101,18 +101,12 @@ class TestModulePrototyper(common.TransactionCase): """test the jinja2 environment is set.""" self.assertIsNone(self.prototype._env) self.prototype.setup_env(self.api_version) - self.assertIsInstance( - self.prototype._env, Environment - ) - self.assertEqual( - self.api_version, - self.prototype._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.""" - name = 'res.partner' + name = "res.partner" self.assertEqual( - self.prototype.friendly_name(name), - name.replace('.', '_') + self.prototype.friendly_name(name), name.replace(".", "_") ) diff --git a/module_prototyper/tests/test_prototype_module_export.py b/module_prototyper/tests/test_prototype_module_export.py index 6569711d4..c88b27b89 100644 --- a/module_prototyper/tests/test_prototype_module_export.py +++ b/module_prototyper/tests/test_prototype_module_export.py @@ -27,54 +27,48 @@ import StringIO class TestPrototypeModuleExport(common.TransactionCase): def setUp(self): 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[ - 'ir.module.category' - ] + self.main_model = self.env["module_prototyper.module.export"] + self.prototype_model = self.env["module_prototyper"] + self.module_category_model = self.env["ir.module.category"] - self.prototype = self.prototype_model.create({ - 'name': 't_name', - 'category_id': self.module_category_model.browse(1).id, - 'human_name': 't_human_name', - 'summary': 't_summary', - 'description': 't_description', - 'author': 't_author', - 'maintainer': 't_maintainer', - 'website': 't_website', - }) + self.prototype = self.prototype_model.create( + { + "name": "t_name", + "category_id": self.module_category_model.browse(1).id, + "human_name": "t_human_name", + "summary": "t_summary", + "description": "t_description", + "author": "t_author", + "maintainer": "t_maintainer", + "website": "t_website", + } + ) - self.exporter = self.main_model.create({'name': 't_name'}) + self.exporter = self.main_model.create({"name": "t_name"}) def test_action_export_assert_for_wrong_active_model(self): """Test if the assertion raises.""" exporter = self.main_model.with_context( - active_model='t_active_model' + active_model="t_active_model" ).create({}) self.assertRaises( - AssertionError, - exporter.action_export, - [exporter.id], + AssertionError, exporter.action_export, [exporter.id] ) def test_action_export_update_wizard(self): """Test if the wizard is updated during the process.""" exporter = self.main_model.with_context( active_model=self.prototype_model._name, - active_id=self.prototype.id + active_id=self.prototype.id, ).create({}) exporter.action_export(exporter.id) - self.assertEqual(exporter.state, 'get') - self.assertEqual(exporter.name, '%s.zip' % (self.prototype.name,)) + self.assertEqual(exporter.state, "get") + 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.""" ret = self.main_model.zip_files(self.exporter, [self.prototype]) self.assertIsInstance(ret, tuple) - self.assertIsInstance( - ret.zip_file, zipfile.ZipFile - ) + self.assertIsInstance(ret.zip_file, zipfile.ZipFile) - self.assertIsInstance( - ret.stringIO, StringIO.StringIO - ) + self.assertIsInstance(ret.stringIO, StringIO.StringIO) diff --git a/module_prototyper/wizard/module_prototyper_module_export.py b/module_prototyper/wizard/module_prototyper_module_export.py index bacd92816..a5fb1d981 100644 --- a/module_prototyper/wizard/module_prototyper_module_export.py +++ b/module_prototyper/wizard/module_prototyper_module_export.py @@ -33,22 +33,19 @@ class PrototypeModuleExport(models.TransientModel): _name = "module_prototyper.module.export" def _default_api_version(self): - return self.env.ref('module_prototyper.api_version_100').id + return self.env.ref("module_prototyper.api_version_100").id - name = fields.Char('File Name', readonly=True) + name = fields.Char("File Name", readonly=True) api_version = fields.Many2one( - comodel_name='module_prototyper.api_version', - string='API version', + comodel_name="module_prototyper.api_version", + string="API version", required=True, - default=_default_api_version + default=_default_api_version, ) - data = fields.Binary('File', readonly=True) + data = fields.Binary("File", readonly=True) state = fields.Selection( - [ - ('choose', 'choose'), # choose version - ('get', 'get') # get module - ], - default='choose' + [("choose", "choose"), ("get", "get")], # choose version # get module + default="choose", ) @api.model @@ -61,17 +58,15 @@ class PrototypeModuleExport(models.TransientModel): ids = [ids] wizard = self.browse(ids) - active_model = self._context.get('active_model') + active_model = self._context.get("active_model") # checking if the wizard was called by a prototype. msg = '%s has to be called from a "module_prototyper" , not a "%s"' - assert active_model == 'module_prototyper', msg % ( - self, active_model - ) + assert active_model == "module_prototyper", msg % (self, active_model) # getting the prototype of the wizard prototypes = self.env[active_model].browse( - [self._context.get('active_id')] + [self._context.get("active_id")] ) zip_details = self.zip_files(wizard, prototypes) @@ -83,20 +78,20 @@ class PrototypeModuleExport(models.TransientModel): wizard.write( { - 'name': '%s.zip' % (zip_name,), - 'state': 'get', - 'data': base64.encodestring(zip_details.stringIO.getvalue()) + "name": "%s.zip" % (zip_name,), + "state": "get", + "data": base64.encodestring(zip_details.stringIO.getvalue()), } ) return { - 'type': 'ir.actions.act_window', - 'res_model': 'module_prototyper.module.export', - 'view_mode': 'form', - 'view_type': 'form', - 'res_id': wizard.id, - 'views': [(False, 'form')], - 'target': 'new', + "type": "ir.actions.act_window", + "res_model": "module_prototyper.module.export", + "view_mode": "form", + "view_type": "form", + "res_id": wizard.id, + "views": [(False, "form")], + "target": "new", } @staticmethod @@ -105,10 +100,10 @@ class PrototypeModuleExport(models.TransientModel): :param file_details: tuple (filename, file_content) :return: tuple (zip_file, stringIO) """ - zip_details = namedtuple('Zip_details', ['zip_file', 'stringIO']) + zip_details = namedtuple("Zip_details", ["zip_file", "stringIO"]) out = StringIO.StringIO() - with zipfile.ZipFile(out, 'w') as target: + with zipfile.ZipFile(out, "w") as target: for prototype in prototypes: # setting the jinja environment. # They will help the program to find the template to render the @@ -122,7 +117,7 @@ class PrototypeModuleExport(models.TransientModel): file_details = prototype.generate_files() for filename, file_content in file_details: if isinstance(file_content, unicode): - file_content = file_content.encode('utf-8') + file_content = file_content.encode("utf-8") # Prefix all names with module technical name filename = os.path.join(prototype.name, filename) info = zipfile.ZipInfo(filename)