diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py index 7e10c32c..acc80c05 100644 --- a/base_external_system/__manifest__.py +++ b/base_external_system/__manifest__.py @@ -7,17 +7,14 @@ "version": "12.0.1.0.0", "category": "Base", "website": "https://github.com/OCA/server-backend", - "author": "LasLabs, " - "Odoo Community Association (OCA)", + "author": "LasLabs, " "Odoo Community Association (OCA)", "license": "LGPL-3", "application": False, "installable": True, - 'depends': [ - 'base', - ], - 'data': [ - 'demo/external_system_os_demo.xml', - 'security/ir.model.access.csv', - 'views/external_system_view.xml', + "depends": ["base",], + "data": [ + "demo/external_system_os_demo.xml", + "security/ir.model.access.csv", + "views/external_system_view.xml", ], } diff --git a/base_external_system/demo/external_system_os_demo.xml b/base_external_system/demo/external_system_os_demo.xml index 81727075..ff6b10fa 100755 --- a/base_external_system/demo/external_system_os_demo.xml +++ b/base_external_system/demo/external_system_os_demo.xml @@ -1,17 +1,13 @@ - - + - - Example OS Connection external.system.os /tmp - diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py index 5816a020..d3e96bd7 100644 --- a/base_external_system/models/external_system.py +++ b/base_external_system/models/external_system.py @@ -3,94 +3,89 @@ from contextlib import contextmanager -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class ExternalSystem(models.Model): - _name = 'external.system' - _description = 'External System' + _name = "external.system" + _description = "External System" name = fields.Char( - required=True, - help='This is the canonical (humanized) name for the system.', + required=True, help="This is the canonical (humanized) name for the system.", ) host = fields.Char( - help='This is the domain or IP address that the system can be reached ' - 'at.', + help="This is the domain or IP address that the system can be reached " "at.", ) port = fields.Integer( - help='This is the port number that the system is listening on.', + help="This is the port number that the system is listening on.", ) username = fields.Char( - help='This is the username that is used for authenticating to this ' - 'system, if applicable.', + help="This is the username that is used for authenticating to this " + "system, if applicable.", ) password = fields.Char( - help='This is the password that is used for authenticating to this ' - 'system, if applicable.', + help="This is the password that is used for authenticating to this " + "system, if applicable.", ) private_key = fields.Text( - help='This is the private key that is used for authenticating to ' - 'this system, if applicable.', + help="This is the private key that is used for authenticating to " + "this system, if applicable.", ) private_key_password = fields.Text( - help='This is the password to unlock the private key that was ' - 'provided for this sytem.', + help="This is the password to unlock the private key that was " + "provided for this sytem.", ) fingerprint = fields.Text( - help='This is the fingerprint that is advertised by this system in ' - 'order to validate its identity.', + help="This is the fingerprint that is advertised by this system in " + "order to validate its identity.", ) ignore_fingerprint = fields.Boolean( default=True, - help='Set this to `True` in order to ignore an invalid/unknown ' - 'fingerprint from the system.', + help="Set this to `True` in order to ignore an invalid/unknown " + "fingerprint from the system.", ) remote_path = fields.Char( - help='Restrict to this directory path on the remote, if applicable.', + help="Restrict to this directory path on the remote, if applicable.", ) company_ids = fields.Many2many( - string='Companies', - comodel_name='res.company', + string="Companies", + comodel_name="res.company", required=True, default=lambda s: [(6, 0, s.env.user.company_id.ids)], - help='Access to this system is restricted to these companies.', - ) - system_type = fields.Selection( - selection='_get_system_types', - required=True, + help="Access to this system is restricted to these companies.", ) + system_type = fields.Selection(selection="_get_system_types", required=True,) interface = fields.Reference( - selection='_get_system_types', + selection="_get_system_types", readonly=True, - help='This is the interface that this system represents. It is ' - 'created automatically upon creation of the external system.', + help="This is the interface that this system represents. It is " + "created automatically upon creation of the external system.", ) _sql_constraints = [ - ('name_uniq', 'UNIQUE(name)', 'Connection name must be unique.'), + ("name_uniq", "UNIQUE(name)", "Connection name must be unique."), ] @api.model def _get_system_types(self): """Return the adapter interface models that are installed.""" - adapter = self.env['external.system.adapter'] - return [ - (m, self.env[m]._description) for m in adapter._inherit_children - ] + adapter = self.env["external.system.adapter"] + return [(m, self.env[m]._description) for m in adapter._inherit_children] @api.multi - @api.constrains('fingerprint', 'ignore_fingerprint') + @api.constrains("fingerprint", "ignore_fingerprint") def check_fingerprint_ignore_fingerprint(self): """Do not allow a blank fingerprint if not set to ignore.""" for record in self: if not record.ignore_fingerprint and not record.fingerprint: - raise ValidationError(_( - 'Fingerprint cannot be empty when Ignore Fingerprint is ' - 'not checked.', - )) + raise ValidationError( + _( + "Fingerprint cannot be empty when Ignore Fingerprint is " + "not checked.", + ) + ) @api.multi @contextmanager @@ -111,10 +106,8 @@ class ExternalSystem(models.Model): def create(self, vals): """Create the interface for the record and assign to ``interface``.""" record = super(ExternalSystem, self).create(vals) - if not self.env.context.get('no_create_interface'): - interface = self.env[vals['system_type']].create({ - 'system_id': record.id, - }) + if not self.env.context.get("no_create_interface"): + interface = self.env[vals["system_type"]].create({"system_id": record.id,}) record.interface = interface return record diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py index 532e4a33..dc44cedf 100644 --- a/base_external_system/models/external_system_adapter.py +++ b/base_external_system/models/external_system_adapter.py @@ -3,7 +3,7 @@ from contextlib import contextmanager -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import UserError @@ -13,15 +13,15 @@ class ExternalSystemAdapter(models.AbstractModel): Methods provided are prefixed with ``external_`` in order to keep from """ - _name = 'external.system.adapter' - _description = 'External System Adapter' - _inherits = {'external.system': 'system_id'} + _name = "external.system.adapter" + _description = "External System Adapter" + _inherits = {"external.system": "system_id"} system_id = fields.Many2one( - string='System', - comodel_name='external.system', + string="System", + comodel_name="external.system", required=True, - ondelete='cascade', + ondelete="cascade", ) @api.multi @@ -67,14 +67,14 @@ class ExternalSystemAdapter(models.AbstractModel): Raises: odoo.exceptions.UserError: In the event of a good connection. """ - raise UserError(_('The connection was a success.')) + raise UserError(_("The connection was a success.")) @api.model def create(self, vals): context_self = self.with_context(no_create_interface=True) - vals.update({ - 'system_type': self._name, - }) + vals.update( + {"system_type": self._name,} + ) record = super(ExternalSystemAdapter, context_self).create(vals) record.system_id.interface = record return record diff --git a/base_external_system/models/external_system_os.py b/base_external_system/models/external_system_os.py index 93ee921d..7e644a71 100644 --- a/base_external_system/models/external_system_os.py +++ b/base_external_system/models/external_system_os.py @@ -13,9 +13,9 @@ class ExternalSystemOs(models.Model): system interface. This is still a fully usable implementation, however. """ - _name = 'external.system.os' - _inherit = 'external.system.adapter' - _description = 'External System OS' + _name = "external.system.os" + _inherit = "external.system.adapter" + _description = "External System OS" previous_dir = None diff --git a/base_external_system/tests/common.py b/base_external_system/tests/common.py index df695719..e02e6513 100644 --- a/base_external_system/tests/common.py +++ b/base_external_system/tests/common.py @@ -2,13 +2,13 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). from contextlib import contextmanager + from mock import MagicMock from odoo.tests.common import TransactionCase class Common(TransactionCase): - @contextmanager def _mock_method(self, method_name, method_obj=None): if method_obj is None: diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py index 09c2ec22..20dee9be 100644 --- a/base_external_system/tests/test_external_system.py +++ b/base_external_system/tests/test_external_system.py @@ -7,59 +7,46 @@ from .common import Common class TestExternalSystem(Common): - def setUp(self): super(TestExternalSystem, self).setUp() - self.record = self.env.ref('base_external_system.external_system_os') + self.record = self.env.ref("base_external_system.external_system_os") def test_get_system_types(self): """It should return at least the test record's interface.""" self.assertIn( (self.record._name, self.record._description), - self.env['external.system']._get_system_types(), + self.env["external.system"]._get_system_types(), ) def test_check_fingerprint_blank(self): """It should not allow blank fingerprints when checking enabled.""" with self.assertRaises(ValidationError): - self.record.write({ - 'ignore_fingerprint': False, - 'fingerprint': False, - }) + self.record.write({"ignore_fingerprint": False, "fingerprint": False}) def test_check_fingerprint_allowed(self): """It should not raise a validation error if there is a fingerprint.""" - self.record.write({ - 'ignore_fingerprint': False, - 'fingerprint': 'Data', - }) + self.record.write({"ignore_fingerprint": False, "fingerprint": "Data"}) self.assertTrue(True) def test_client(self): """It should yield the open interface client.""" - with self._mock_method('client', self.record) as magic: + with self._mock_method("client", self.record) as magic: with self.record.system_id.client() as client: self.assertEqual(client, magic().__enter__()) def test_create_creates_and_assigns_interface(self): """It should create and assign the interface on record create.""" - record = self.env['external.system'].create({ - 'name': 'Test', - 'system_type': 'external.system.os', - }) + record = self.env["external.system"].create( + {"name": "Test", "system_type": "external.system.os"} + ) self.assertEqual( - record.interface._name, 'external.system.os', + record.interface._name, "external.system.os", ) def test_create_context_override(self): """It should allow for interface create override with context.""" - model = self.env['external.system'].with_context( - no_create_interface=True, - ) - record = model.create({ - 'name': 'Test', - 'system_type': 'external.system.os', - }) + model = self.env["external.system"].with_context(no_create_interface=True,) + record = model.create({"name": "Test", "system_type": "external.system.os"}) self.assertFalse(record.interface) def test_action_test_connection(self): diff --git a/base_external_system/tests/test_external_system_adapter.py b/base_external_system/tests/test_external_system_adapter.py index 7e322fc5..f5ce4c07 100644 --- a/base_external_system/tests/test_external_system_adapter.py +++ b/base_external_system/tests/test_external_system_adapter.py @@ -7,23 +7,22 @@ from .common import Common class TestExternalSystemAdapter(Common): - def setUp(self): super(TestExternalSystemAdapter, self).setUp() - self.system = self.env.ref('base_external_system.external_system_os') - self.record = self.env['external.system.adapter'].new({ - 'system_id': self.system.id, - }) + self.system = self.env.ref("base_external_system.external_system_os") + self.record = self.env["external.system.adapter"].new( + {"system_id": self.system.id} + ) def test_client_yields_client(self): """It should yield the client.""" - with self._mock_method('external_get_client') as magic: + with self._mock_method("external_get_client") as magic: with self.record.client() as client: self.assertEqual(client, magic()) def test_client_destroys_client(self): """It should destroy the client after use.""" - with self._mock_method('external_destroy_client') as magic: + with self._mock_method("external_destroy_client") as magic: with self.record.client() as client: self.assertFalse(magic.call_count) magic.assert_called_once_with(client) @@ -31,12 +30,12 @@ class TestExternalSystemAdapter(Common): def test_external_get_client_ensure_one(self): """It should assert singletons.""" with self.assertRaises(ValueError): - self.env['external.system.adapter'].external_get_client() + self.env["external.system.adapter"].external_get_client() def test_external_destroy_client_ensure_one(self): """It should assert singletons.""" with self.assertRaises(ValueError): - self.env['external.system.adapter'].external_destroy_client(None) + self.env["external.system.adapter"].external_destroy_client(None) def test_external_test_connection(self): """It should raise a UserError.""" diff --git a/base_external_system/tests/test_external_system_os.py b/base_external_system/tests/test_external_system_os.py index 33c36717..6e4d55cb 100644 --- a/base_external_system/tests/test_external_system_os.py +++ b/base_external_system/tests/test_external_system_os.py @@ -7,7 +7,6 @@ from .common import Common class TestExternalSystemOs(Common): - @classmethod def setUpClass(cls): """Remember the working dir, just in case.""" @@ -22,7 +21,7 @@ class TestExternalSystemOs(Common): def setUp(self): super(TestExternalSystemOs, self).setUp() - self.record = self.env.ref('base_external_system.external_system_os') + self.record = self.env.ref("base_external_system.external_system_os") def test_external_get_client_returns_os(self): """It should return the Pyhton OS module.""" diff --git a/base_external_system/views/external_system_view.xml b/base_external_system/views/external_system_view.xml index 809bc4f4..bbefb00d 100755 --- a/base_external_system/views/external_system_view.xml +++ b/base_external_system/views/external_system_view.xml @@ -1,21 +1,20 @@ - - + - - external.system.view.form external.system
-
@@ -50,7 +49,6 @@
- external.system.view.tree external.system @@ -62,50 +60,51 @@ - external.system.view.search external.system - - - - - + + + - - - External Systems - external.system - ir.actions.act_window - form - tree,form - - - - + External Systems + external.system + ir.actions.act_window + form + tree,form + +
diff --git a/setup/base_external_system/odoo/addons/base_external_system b/setup/base_external_system/odoo/addons/base_external_system new file mode 120000 index 00000000..6740d6a6 --- /dev/null +++ b/setup/base_external_system/odoo/addons/base_external_system @@ -0,0 +1 @@ +../../../../base_external_system \ No newline at end of file diff --git a/setup/base_external_system/setup.py b/setup/base_external_system/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/base_external_system/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)