From c6b750c5f78b2670268ab53a0f3cf1c20c115dae Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Fri, 20 Oct 2017 13:30:44 -0700
Subject: [PATCH 01/17] [ADD] base_external_system: Implement interface/adapter
(#993)
* [ADD] base_external_system: Implement interface/adapter for external systems
* base_external_system: Fix OS model, add inherits, add validate
* base_external_system: Usability and private key pass
* base_external_system: Use contextmanager in adapter client
* base_external_system: Move contextmanager to interface
* base_external_system: Include contextmanager on adapter and system
* base_external_system: Unify client
* Use password widget for password field
* Add tests & security
* Fix lint
* Add plaintext note
---
base_external_system/README.rst | 96 ++++++++++++++
base_external_system/__init__.py | 5 +
base_external_system/__manifest__.py | 23 ++++
.../demo/external_system_os_demo.xml | 17 +++
base_external_system/models/__init__.py | 4 +
.../models/external_system.py | 125 ++++++++++++++++++
.../models/external_system_adapter.py | 71 ++++++++++
.../models/external_system_os.py | 43 ++++++
.../security/ir.model.access.csv | 3 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
base_external_system/tests/__init__.py | 5 +
base_external_system/tests/common.py | 22 +++
.../tests/test_external_system.py | 54 ++++++++
.../tests/test_external_system_adapter.py | 45 +++++++
.../tests/test_external_system_os.py | 40 ++++++
.../views/external_system_view.xml | 108 +++++++++++++++
16 files changed, 661 insertions(+)
create mode 100755 base_external_system/README.rst
create mode 100644 base_external_system/__init__.py
create mode 100644 base_external_system/__manifest__.py
create mode 100755 base_external_system/demo/external_system_os_demo.xml
create mode 100644 base_external_system/models/__init__.py
create mode 100644 base_external_system/models/external_system.py
create mode 100644 base_external_system/models/external_system_adapter.py
create mode 100644 base_external_system/models/external_system_os.py
create mode 100644 base_external_system/security/ir.model.access.csv
create mode 100644 base_external_system/static/description/icon.png
create mode 100644 base_external_system/tests/__init__.py
create mode 100644 base_external_system/tests/common.py
create mode 100644 base_external_system/tests/test_external_system.py
create mode 100644 base_external_system/tests/test_external_system_adapter.py
create mode 100644 base_external_system/tests/test_external_system_os.py
create mode 100755 base_external_system/views/external_system_view.xml
diff --git a/base_external_system/README.rst b/base_external_system/README.rst
new file mode 100755
index 000000000..4c7ee4cf6
--- /dev/null
+++ b/base_external_system/README.rst
@@ -0,0 +1,96 @@
+.. image:: https://img.shields.io/badge/license-LGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/lgpl.html
+ :alt: License: LGPL-3
+
+======================
+Base - External System
+======================
+
+This module provides an interface/adapter mechanism for the definition of remote
+systems.
+
+Note that this module stores everything in plain text. In the interest of security,
+it is recommended you use another module (such as `keychain` or `red_october` to
+encrypt things like the password and private key). This is not done here in order
+to not force a specific security method.
+
+Implementation
+==============
+
+The credentials for systems are stored in the ``external.system`` model, and are to
+be configured by the user. This model is the unified interface for the underlying
+adapters.
+
+Using the Interface
+-------------------
+
+Given an ``external.system`` singleton called ``external_system``, you would do the
+following to get the underlying system client:
+
+.. code-block:: python
+
+ with external_system.client() as client:
+ client.do_something()
+
+The client will be destroyed once the context has completed. Destruction takes place
+in the adapter's ``external_destroy_client`` method.
+
+The only unified aspect of this interface is the client connection itself. Other more
+opinionated interface/adapter mechanisms can be implemented in other modules, such as
+the file system interface in `OCA/server-tools/external_file_location
+`_.
+
+Creating an Adapter
+-------------------
+
+Modules looking to add an external system adapter should inherit the
+``external.system.adapter`` model and override the following methods:
+
+* ``external_get_client``: Returns a usable client for the system
+* ``external_destroy_client``: Destroy the connection, if applicable. Does not need
+ to be defined if the connection destroys itself.
+
+Configuration
+=============
+
+Configure external systems in Settings => Technical => External Systems
+
+.. 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/10.0
+
+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 smash it by providing detailed and welcomed feedback.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon `_.
+
+Contributors
+------------
+
+* Dave Lasley
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+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.
+
+To contribute to this module, please visit https://odoo-community.org.
diff --git a/base_external_system/__init__.py b/base_external_system/__init__.py
new file mode 100644
index 000000000..fd02263ce
--- /dev/null
+++ b/base_external_system/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+from . import models
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
new file mode 100644
index 000000000..13486c283
--- /dev/null
+++ b/base_external_system/__manifest__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+{
+ "name": "Base External System",
+ "summary": "Data models allowing for connection to external systems.",
+ "version": "10.0.1.0.0",
+ "category": "Base",
+ "website": "https://laslabs.com/",
+ "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',
+ ],
+}
diff --git a/base_external_system/demo/external_system_os_demo.xml b/base_external_system/demo/external_system_os_demo.xml
new file mode 100755
index 000000000..817270753
--- /dev/null
+++ b/base_external_system/demo/external_system_os_demo.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ Example OS Connection
+ external.system.os
+ /tmp
+
+
+
+
diff --git a/base_external_system/models/__init__.py b/base_external_system/models/__init__.py
new file mode 100644
index 000000000..3e2b372f2
--- /dev/null
+++ b/base_external_system/models/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from . import external_system
+from . import external_system_adapter
+from . import external_system_os
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
new file mode 100644
index 000000000..57a171421
--- /dev/null
+++ b/base_external_system/models/external_system.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+from contextlib import contextmanager
+
+from odoo import api, fields, models, _
+from odoo.exceptions import ValidationError
+
+
+class ExternalSystem(models.Model):
+
+ _name = 'external.system'
+ _description = 'External System'
+
+ name = fields.Char(
+ 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.',
+ )
+ port = fields.Integer(
+ 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.',
+ )
+ password = fields.Char(
+ 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.',
+ )
+ private_key_password = fields.Text(
+ 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.',
+ )
+ ignore_fingerprint = fields.Boolean(
+ default=True,
+ 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.',
+ )
+ company_ids = fields.Many2many(
+ 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,
+ )
+ interface = fields.Reference(
+ 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.',
+ )
+
+ _sql_constraints = [
+ ('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
+ ]
+
+ @api.multi
+ @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.',
+ ))
+
+ @api.multi
+ @contextmanager
+ def client(self):
+ """Client object usable as a context manager to include destruction.
+
+ Yields the result from ``external_get_client``, then calls
+ ``external_destroy_client`` to cleanup the client.
+
+ Yields:
+ mixed: An object representing the client connection to the remote
+ system.
+ """
+ with self.interface.client() as client:
+ yield client
+
+ @api.model
+ def create(self, vals):
+ """Create the interface for the record and assign to ``interface``."""
+ record = super(ExternalSystem, self).create(vals)
+ interface = self.env[vals['system_type']].create({
+ 'system_id': record.id,
+ })
+ record.interface = interface
+ return record
+
+ @api.multi
+ def action_test_connection(self):
+ """Test the connection to the external system."""
+ self.ensure_one()
+ self.interface.external_test_connection()
diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py
new file mode 100644
index 000000000..b44c3d4c2
--- /dev/null
+++ b/base_external_system/models/external_system_adapter.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+from contextlib import contextmanager
+
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+
+
+class ExternalSystemAdapter(models.AbstractModel):
+ """This is the model that should be inherited for new external systems.
+
+ Methods provided are prefixed with ``external_`` in order to keep from
+ """
+
+ _name = 'external.system.adapter'
+ _description = 'External System Adapter'
+ _inherits = {'external.system': 'system_id'}
+
+ system_id = fields.Many2one(
+ string='System',
+ comodel_name='external.system',
+ required=True,
+ ondelete='cascade',
+ )
+
+ @api.multi
+ @contextmanager
+ def client(self):
+ """Client object usable as a context manager to include destruction.
+
+ Yields the result from ``external_get_client``, then calls
+ ``external_destroy_client`` to cleanup the client.
+
+ Yields:
+ mixed: An object representing the client connection to the remote
+ system.
+ """
+ client = self.external_get_client()
+ try:
+ yield client
+ finally:
+ self.external_destroy_client(client)
+
+ @api.multi
+ def external_get_client(self):
+ """Return a usable client representing the remote system."""
+ self.ensure_one()
+
+ @api.multi
+ def external_destroy_client(self, client):
+ """Perform any logic necessary to destroy the client connection.
+
+ Args:
+ client (mixed): The client that was returned by
+ ``external_get_client``.
+ """
+ self.ensure_one()
+
+ @api.multi
+ def external_test_connection(self):
+ """Adapters should override this method, then call super if valid.
+
+ If the connection is invalid, adapters should raise an instance of
+ ``odoo.ValidationError``.
+
+ Raises:
+ odoo.exceptions.UserError: In the event of a good connection.
+ """
+ raise UserError(_('The connection was a success.'))
diff --git a/base_external_system/models/external_system_os.py b/base_external_system/models/external_system_os.py
new file mode 100644
index 000000000..1e89d3600
--- /dev/null
+++ b/base_external_system/models/external_system_os.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+import os
+
+from odoo import api, models
+
+
+class ExternalSystemOs(models.Model):
+ """This is an Interface implementing the OS module.
+
+ For the most part, this is just a sample of how to implement an external
+ system interface. This is still a fully usable implementation, however.
+ """
+
+ _name = 'external.system.os'
+ _inherit = 'external.system.adapter'
+ _description = 'External System OS'
+
+ previous_dir = None
+
+ @api.multi
+ def external_get_client(self):
+ """Return a usable client representing the remote system."""
+ super(ExternalSystemOs, self).external_get_client()
+ if self.system_id.remote_path:
+ self.previous_dir = os.getcwd()
+ os.chdir(self.system_id.remote_path)
+ return os
+
+ @api.multi
+ def external_destroy_client(self, client):
+ """Perform any logic necessary to destroy the client connection.
+
+ Args:
+ client (mixed): The client that was returned by
+ ``external_get_client``.
+ """
+ super(ExternalSystemOs, self).external_destroy_client(client)
+ if self.previous_dir:
+ os.chdir(self.previous_dir)
+ self.previous_dir = None
diff --git a/base_external_system/security/ir.model.access.csv b/base_external_system/security/ir.model.access.csv
new file mode 100644
index 000000000..f3fafd3ef
--- /dev/null
+++ b/base_external_system/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_external_system_os_admin,access_external_system_os_admin,model_external_system_os,base.group_system,1,1,1,1
+access_external_system_admin,access_external_system_admin,model_external_system,base.group_system,1,1,1,1
diff --git a/base_external_system/static/description/icon.png b/base_external_system/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp
zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zls4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6#
z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f#
zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC
zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv!
zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG
z-wfS
zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9
z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE#
z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz
zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t
z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN
zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q
ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k
zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG
z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff
z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1
zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO
zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$
zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV(
z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb
zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4
z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{
zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx}
z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov
zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22
zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq
zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t<
z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k
z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp
z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{}
zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/base_external_system/tests/__init__.py b/base_external_system/tests/__init__.py
new file mode 100644
index 000000000..d7cd63b5c
--- /dev/null
+++ b/base_external_system/tests/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+
+from . import test_external_system
+from . import test_external_system_adapter
+from . import test_external_system_os
diff --git a/base_external_system/tests/common.py b/base_external_system/tests/common.py
new file mode 100644
index 000000000..0c212359e
--- /dev/null
+++ b/base_external_system/tests/common.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# 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:
+ method_obj = self.record
+ magic = MagicMock()
+ method_obj._patch_method(method_name, magic)
+ try:
+ yield magic
+ finally:
+ method_obj._revert_method(method_name)
diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py
new file mode 100644
index 000000000..6d7862704
--- /dev/null
+++ b/base_external_system/tests/test_external_system.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.exceptions import UserError, ValidationError
+
+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')
+
+ 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(),
+ )
+
+ 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,
+ })
+
+ 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.assertTrue(True)
+
+ def test_client(self):
+ """It should yield the open interface client."""
+ 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."""
+ self.assertEqual(
+ self.record.interface._name, 'external.system.os',
+ )
+
+ def test_action_test_connection(self):
+ """It should proxy to the interface connection tester."""
+ with self.assertRaises(UserError):
+ self.record.system_id.action_test_connection()
diff --git a/base_external_system/tests/test_external_system_adapter.py b/base_external_system/tests/test_external_system_adapter.py
new file mode 100644
index 000000000..d084cf142
--- /dev/null
+++ b/base_external_system/tests/test_external_system_adapter.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.exceptions import UserError
+
+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,
+ })
+
+ def test_client_yields_client(self):
+ """It should yield the client."""
+ 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.record.client() as client:
+ self.assertFalse(magic.call_count)
+ magic.assert_called_once_with(client)
+
+ def test_external_get_client_ensure_one(self):
+ """It should assert singletons."""
+ with self.assertRaises(ValueError):
+ 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)
+
+ def test_external_test_connection(self):
+ """It should raise a UserError."""
+ with self.assertRaises(UserError):
+ self.record.external_test_connection()
diff --git a/base_external_system/tests/test_external_system_os.py b/base_external_system/tests/test_external_system_os.py
new file mode 100644
index 000000000..150a3bdbd
--- /dev/null
+++ b/base_external_system/tests/test_external_system_os.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Copyright 2017 LasLabs Inc.
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+import os
+
+from .common import Common
+
+
+class TestExternalSystemOs(Common):
+
+ @classmethod
+ def setUpClass(cls):
+ """Remember the working dir, just in case."""
+ super(TestExternalSystemOs, cls).setUpClass()
+ cls.working_dir = os.getcwd()
+
+ @classmethod
+ def tearDownClass(cls):
+ """Set the working dir back to origin, just in case."""
+ super(TestExternalSystemOs, cls).tearDownClass()
+ os.chdir(cls.working_dir)
+
+ def setUp(self):
+ super(TestExternalSystemOs, self).setUp()
+ 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."""
+ self.assertEqual(self.record.external_get_client(), os)
+
+ def test_external_get_client_changes_directories(self):
+ """It should change to the proper directory."""
+ self.record.external_get_client()
+ self.assertEqual(os.getcwd(), self.record.remote_path)
+
+ def test_external_destroy_client_changes_directory(self):
+ """It should change back to the previous working directory."""
+ self.record.external_destroy_client(None)
+ self.assertEqual(os.getcwd(), self.working_dir)
diff --git a/base_external_system/views/external_system_view.xml b/base_external_system/views/external_system_view.xml
new file mode 100755
index 000000000..e1ed17cbe
--- /dev/null
+++ b/base_external_system/views/external_system_view.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+ external.system.view.form
+ external.system
+
+
+
+
+
+
+ external.system.view.tree
+ external.system
+
+
+
+
+
+
+
+
+
+
+ external.system.view.search
+ external.system
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ External Systems
+ external.system
+ ir.actions.act_window
+ form
+ tree,form
+
+
+
+
+
From f3e3a2d6fa80f16c03234ceaa591fb07ff158a72 Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Fri, 20 Oct 2017 14:17:13 -0700
Subject: [PATCH 02/17] [IMP] base_external_system: Add create bypass * In
cases of deep inheritance, it may be required to create an adapter directly.
Add an override in the create via the env context to support this. * Add
default system type if creating from an interface * Fix interface assignment
during creation in adapter
---
base_external_system/__manifest__.py | 2 +-
.../models/external_system.py | 9 +++----
.../models/external_system_adapter.py | 10 ++++++++
.../tests/test_external_system.py | 24 ++++++++++++++++++-
4 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index 13486c283..2f70b5625 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "10.0.1.0.0",
+ "version": "10.0.1.0.1",
"category": "Base",
"website": "https://laslabs.com/",
"author": "LasLabs, Odoo Community Association (OCA)",
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
index 57a171421..75918c22d 100644
--- a/base_external_system/models/external_system.py
+++ b/base_external_system/models/external_system.py
@@ -112,10 +112,11 @@ def client(self):
def create(self, vals):
"""Create the interface for the record and assign to ``interface``."""
record = super(ExternalSystem, self).create(vals)
- interface = self.env[vals['system_type']].create({
- 'system_id': record.id,
- })
- record.interface = interface
+ 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
@api.multi
diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py
index b44c3d4c2..605eabd6f 100644
--- a/base_external_system/models/external_system_adapter.py
+++ b/base_external_system/models/external_system_adapter.py
@@ -69,3 +69,13 @@ def external_test_connection(self):
odoo.exceptions.UserError: In the event of a good connection.
"""
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,
+ })
+ record = super(ExternalSystemAdapter, context_self).create(vals)
+ record.system_id.interface = record
+ return record
diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py
index 6d7862704..e996b3021 100644
--- a/base_external_system/tests/test_external_system.py
+++ b/base_external_system/tests/test_external_system.py
@@ -44,11 +44,33 @@ def test_client(self):
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',
+ })
self.assertEqual(
- self.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',
+ })
+ self.assertFalse(record.interface)
+
def test_action_test_connection(self):
"""It should proxy to the interface connection tester."""
with self.assertRaises(UserError):
self.record.system_id.action_test_connection()
+
+ def test_unlink_deletes_interface(self):
+ """It should delete the interface when the system is deleted."""
+ interface = self.record.interface
+ self.assertTrue(interface.exists())
+ self.record.unlink()
+ self.assertFalse(interface.exists())
From c3f9c89ff6569baf7f2c1e0a1c4591204c6acda3 Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Fri, 15 Dec 2017 15:42:32 -0800
Subject: [PATCH 03/17] [MIG] base_external_system: Upgrade to v11 * Perform
standard v11 migration
---
base_external_system/README.rst | 2 +-
base_external_system/__init__.py | 1 -
base_external_system/__manifest__.py | 3 +-
.../i18n/base_external_system.pot | 304 ++++++++++++++++++
base_external_system/models/__init__.py | 1 -
.../models/external_system.py | 1 -
.../models/external_system_adapter.py | 1 -
.../models/external_system_os.py | 1 -
base_external_system/tests/__init__.py | 2 -
base_external_system/tests/common.py | 1 -
.../tests/test_external_system.py | 1 -
.../tests/test_external_system_adapter.py | 1 -
.../tests/test_external_system_os.py | 1 -
13 files changed, 306 insertions(+), 14 deletions(-)
create mode 100644 base_external_system/i18n/base_external_system.pot
diff --git a/base_external_system/README.rst b/base_external_system/README.rst
index 4c7ee4cf6..174de9fd6 100755
--- a/base_external_system/README.rst
+++ b/base_external_system/README.rst
@@ -57,7 +57,7 @@ Configure external systems in Settings => Technical => External Systems
.. 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/10.0
+ :target: https://runbot.odoo-community.org/runbot/149/11.0
Bug Tracker
===========
diff --git a/base_external_system/__init__.py b/base_external_system/__init__.py
index fd02263ce..0639de1b6 100644
--- a/base_external_system/__init__.py
+++ b/base_external_system/__init__.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index 2f70b5625..b1bcf8527 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -1,11 +1,10 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "10.0.1.0.1",
+ "version": "11.0.1.0.0",
"category": "Base",
"website": "https://laslabs.com/",
"author": "LasLabs, Odoo Community Association (OCA)",
diff --git a/base_external_system/i18n/base_external_system.pot b/base_external_system/i18n/base_external_system.pot
new file mode 100644
index 000000000..d448cb462
--- /dev/null
+++ b/base_external_system/i18n/base_external_system.pot
@@ -0,0 +1,304 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_external_system
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_company_ids
+#: model:ir.model.fields,help:base_external_system.field_external_system_company_ids
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_company_ids
+msgid "Access to this system is restricted to these companies."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_company_ids
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_company_ids
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_company_ids
+msgid "Companies"
+msgstr ""
+
+#. module: base_external_system
+#: sql_constraint:external.system:0
+msgid "Connection name must be unique."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_create_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_create_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_create_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_create_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_create_date
+msgid "Created on"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_display_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_display_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model,name:base_external_system.model_external_system
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+msgid "External System"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model,name:base_external_system.model_external_system_adapter
+msgid "External System Adapter"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model,name:base_external_system.model_external_system_os
+msgid "External System OS"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.actions.act_window,name:base_external_system.external_system_action
+#: model:ir.ui.menu,name:base_external_system.menu_external_system
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_tree
+msgid "External Systems"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_fingerprint
+msgid "Fingerprint"
+msgstr ""
+
+#. module: base_external_system
+#: code:addons/base_external_system/models/external_system.py:90
+#, python-format
+msgid "Fingerprint cannot be empty when Ignore Fingerprint is not checked."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_host
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_host
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_host
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+msgid "Host"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_id
+msgid "ID"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_ignore_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_ignore_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_ignore_fingerprint
+msgid "Ignore Fingerprint"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_interface
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_interface
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_interface
+msgid "Interface"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+msgid "Keys"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system___last_update
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter___last_update
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os___last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_write_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_write_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_write_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_write_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_name
+msgid "Name"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_password
+msgid "Password"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_port
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_port
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_port
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+msgid "Port"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_private_key
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_private_key
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_private_key
+msgid "Private Key"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_private_key_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_private_key_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_private_key_password
+msgid "Private Key Password"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_remote_path
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_remote_path
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_remote_path
+msgid "Remote Path"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_remote_path
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_remote_path
+#: model:ir.model.fields,help:base_external_system.field_external_system_remote_path
+msgid "Restrict to this directory path on the remote, if applicable."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_ignore_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_ignore_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_ignore_fingerprint
+msgid "Set this to `True` in order to ignore an invalid/unknown fingerprint from the system."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_system_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_system_id
+msgid "System"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_system_type
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_system_type
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_system_type
+msgid "System Type"
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+msgid "Test Connection"
+msgstr ""
+
+#. module: base_external_system
+#: code:addons/base_external_system/models/external_system_adapter.py:70
+#, python-format
+msgid "The connection was a success."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_name
+#: model:ir.model.fields,help:base_external_system.field_external_system_name
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_name
+msgid "This is the canonical (humanized) name for the system."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_host
+#: model:ir.model.fields,help:base_external_system.field_external_system_host
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_host
+msgid "This is the domain or IP address that the system can be reached at."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_fingerprint
+msgid "This is the fingerprint that is advertised by this system in order to validate its identity."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_interface
+#: model:ir.model.fields,help:base_external_system.field_external_system_interface
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_interface
+msgid "This is the interface that this system represents. It is created automatically upon creation of the external system."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_password
+msgid "This is the password that is used for authenticating to this system, if applicable."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_private_key_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_private_key_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_private_key_password
+msgid "This is the password to unlock the private key that was provided for this sytem."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_port
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_port
+#: model:ir.model.fields,help:base_external_system.field_external_system_port
+msgid "This is the port number that the system is listening on."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_private_key
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_private_key
+#: model:ir.model.fields,help:base_external_system.field_external_system_private_key
+msgid "This is the private key that is used for authenticating to this system, if applicable."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_username
+#: model:ir.model.fields,help:base_external_system.field_external_system_os_username
+#: model:ir.model.fields,help:base_external_system.field_external_system_username
+msgid "This is the username that is used for authenticating to this system, if applicable."
+msgstr ""
+
+#. module: base_external_system
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_username
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_username
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_username
+#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+msgid "Username"
+msgstr ""
+
diff --git a/base_external_system/models/__init__.py b/base_external_system/models/__init__.py
index 3e2b372f2..84d6fa273 100644
--- a/base_external_system/models/__init__.py
+++ b/base_external_system/models/__init__.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from . import external_system
from . import external_system_adapter
from . import external_system_os
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
index 75918c22d..5816a0207 100644
--- a/base_external_system/models/external_system.py
+++ b/base_external_system/models/external_system.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py
index 605eabd6f..532e4a33b 100644
--- a/base_external_system/models/external_system_adapter.py
+++ b/base_external_system/models/external_system_adapter.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
diff --git a/base_external_system/models/external_system_os.py b/base_external_system/models/external_system_os.py
index 1e89d3600..93ee921d3 100644
--- a/base_external_system/models/external_system_os.py
+++ b/base_external_system/models/external_system_os.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
diff --git a/base_external_system/tests/__init__.py b/base_external_system/tests/__init__.py
index d7cd63b5c..c91c801ac 100644
--- a/base_external_system/tests/__init__.py
+++ b/base_external_system/tests/__init__.py
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-
from . import test_external_system
from . import test_external_system_adapter
from . import test_external_system_os
diff --git a/base_external_system/tests/common.py b/base_external_system/tests/common.py
index 0c212359e..df695719e 100644
--- a/base_external_system/tests/common.py
+++ b/base_external_system/tests/common.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py
index e996b3021..09c2ec226 100644
--- a/base_external_system/tests/test_external_system.py
+++ b/base_external_system/tests/test_external_system.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
diff --git a/base_external_system/tests/test_external_system_adapter.py b/base_external_system/tests/test_external_system_adapter.py
index d084cf142..7e322fc59 100644
--- a/base_external_system/tests/test_external_system_adapter.py
+++ b/base_external_system/tests/test_external_system_adapter.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
diff --git a/base_external_system/tests/test_external_system_os.py b/base_external_system/tests/test_external_system_os.py
index 150a3bdbd..33c367171 100644
--- a/base_external_system/tests/test_external_system_os.py
+++ b/base_external_system/tests/test_external_system_os.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
From e9296fe02c05c65f58ed0fe4db21e6f59465c1a6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandre=20D=C3=ADaz?=
Date: Thu, 20 Jun 2019 18:20:31 +0200
Subject: [PATCH 04/17] [MIG] base_external_system: Migration to 12.0
---
base_external_system/README.rst | 91 ++--
base_external_system/__manifest__.py | 7 +-
.../i18n/base_external_system.pot | 216 ++++----
base_external_system/readme/CONFIGURE.rst | 1 +
base_external_system/readme/CONTRIBUTORS.rst | 2 +
base_external_system/readme/DESCRIPTION.rst | 7 +
base_external_system/readme/USAGE.rst | 32 ++
.../static/description/index.html | 465 ++++++++++++++++++
.../views/external_system_view.xml | 3 +
9 files changed, 680 insertions(+), 144 deletions(-)
create mode 100644 base_external_system/readme/CONFIGURE.rst
create mode 100644 base_external_system/readme/CONTRIBUTORS.rst
create mode 100644 base_external_system/readme/DESCRIPTION.rst
create mode 100644 base_external_system/readme/USAGE.rst
create mode 100644 base_external_system/static/description/index.html
diff --git a/base_external_system/README.rst b/base_external_system/README.rst
index 174de9fd6..6874e904c 100755
--- a/base_external_system/README.rst
+++ b/base_external_system/README.rst
@@ -1,10 +1,29 @@
-.. image:: https://img.shields.io/badge/license-LGPL--3-blue.svg
- :target: http://www.gnu.org/licenses/lgpl.html
- :alt: License: LGPL-3
-
-======================
-Base - External System
-======================
+====================
+Base External System
+====================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
+ :alt: License: LGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github
+ :target: https://github.com/OCA/server-backend/tree/12.0/base_external_system
+ :alt: OCA/server-backend
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/server-backend-12-0/server-backend-12-0-base_external_system
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/253/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module provides an interface/adapter mechanism for the definition of remote
systems.
@@ -14,15 +33,25 @@ it is recommended you use another module (such as `keychain` or `red_october` to
encrypt things like the password and private key). This is not done here in order
to not force a specific security method.
-Implementation
-==============
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+Configure external systems in Settings => Technical => External Systems
+
+Usage
+=====
The credentials for systems are stored in the ``external.system`` model, and are to
be configured by the user. This model is the unified interface for the underlying
adapters.
Using the Interface
--------------------
+~~~~~~~~~~~~~~~~~~~
Given an ``external.system`` singleton called ``external_system``, you would do the
following to get the underlying system client:
@@ -41,7 +70,7 @@ the file system interface in `OCA/server-tools/external_file_location
`_.
Creating an Adapter
--------------------
+~~~~~~~~~~~~~~~~~~~
Modules looking to add an external system adapter should inherit the
``external.system.adapter`` model and override the following methods:
@@ -50,47 +79,43 @@ Modules looking to add an external system adapter should inherit the
* ``external_destroy_client``: Destroy the connection, if applicable. Does not need
to be defined if the connection destroys itself.
-Configuration
-=============
-
-Configure external systems in Settings => Technical => External Systems
-
-.. 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/11.0
-
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 smash it by providing detailed and welcomed feedback.
+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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
Credits
=======
-Images
-------
+Authors
+~~~~~~~
-* Odoo Community Association: `Icon `_.
+* LasLabs
Contributors
-------------
+~~~~~~~~~~~~
* Dave Lasley
+* Alexandre Díaz
-Maintainer
-----------
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
-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.
-To contribute to this module, please visit https://odoo-community.org.
+This module is part of the `OCA/server-backend `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index b1bcf8527..7e10c32cd 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -4,10 +4,11 @@
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "11.0.1.0.0",
+ "version": "12.0.1.0.0",
"category": "Base",
- "website": "https://laslabs.com/",
- "author": "LasLabs, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/server-backend",
+ "author": "LasLabs, "
+ "Odoo Community Association (OCA)",
"license": "LGPL-3",
"application": False,
"installable": True,
diff --git a/base_external_system/i18n/base_external_system.pot b/base_external_system/i18n/base_external_system.pot
index d448cb462..774c41d32 100644
--- a/base_external_system/i18n/base_external_system.pot
+++ b/base_external_system/i18n/base_external_system.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 11.0\n"
+"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
@@ -14,16 +14,16 @@ msgstr ""
"Plural-Forms: \n"
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_company_ids
-#: model:ir.model.fields,help:base_external_system.field_external_system_company_ids
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_company_ids
+#: model:ir.model.fields,help:base_external_system.field_external_system__company_ids
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__company_ids
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__company_ids
msgid "Access to this system is restricted to these companies."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_company_ids
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_company_ids
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_company_ids
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__company_ids
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__company_ids
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__company_ids
msgid "Companies"
msgstr ""
@@ -33,29 +33,29 @@ msgid "Connection name must be unique."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_create_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_create_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_create_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__create_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__create_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__create_uid
msgid "Created by"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_create_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_create_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_create_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__create_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__create_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__create_date
msgid "Created on"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_display_name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_display_name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_display_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__display_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__display_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__display_name
msgid "Display Name"
msgstr ""
#. module: base_external_system
#: model:ir.model,name:base_external_system.model_external_system
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_form
msgid "External System"
msgstr ""
@@ -72,15 +72,15 @@ msgstr ""
#. module: base_external_system
#: model:ir.actions.act_window,name:base_external_system.external_system_action
#: model:ir.ui.menu,name:base_external_system.menu_external_system
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_tree
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_tree
msgid "External Systems"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__fingerprint
msgid "Fingerprint"
msgstr ""
@@ -91,137 +91,137 @@ msgid "Fingerprint cannot be empty when Ignore Fingerprint is not checked."
msgstr ""
#. module: base_external_system
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Group By"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_host
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_host
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_host
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__host
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__host
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__host
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Host"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_id
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_id
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__id
msgid "ID"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_ignore_fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_ignore_fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_ignore_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__ignore_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__ignore_fingerprint
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__ignore_fingerprint
msgid "Ignore Fingerprint"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_interface
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_interface
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_interface
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__interface
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__interface
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__interface
msgid "Interface"
msgstr ""
#. module: base_external_system
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_form
msgid "Keys"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system___last_update
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter___last_update
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os___last_update
+#: model:ir.model.fields,field_description:base_external_system.field_external_system____last_update
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter____last_update
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_write_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_write_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_write_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__write_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__write_uid
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_write_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_write_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_write_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__write_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__write_date
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__name
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__name
msgid "Name"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__password
msgid "Password"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_port
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_port
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_port
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__port
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__port
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__port
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Port"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_private_key
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_private_key
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_private_key
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__private_key
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__private_key
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__private_key
msgid "Private Key"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_private_key_password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_private_key_password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_private_key_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__private_key_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__private_key_password
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__private_key_password
msgid "Private Key Password"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_remote_path
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_remote_path
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_remote_path
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__remote_path
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__remote_path
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__remote_path
msgid "Remote Path"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_remote_path
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_remote_path
-#: model:ir.model.fields,help:base_external_system.field_external_system_remote_path
+#: model:ir.model.fields,help:base_external_system.field_external_system__remote_path
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__remote_path
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__remote_path
msgid "Restrict to this directory path on the remote, if applicable."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_ignore_fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_ignore_fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_ignore_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system__ignore_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__ignore_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__ignore_fingerprint
msgid "Set this to `True` in order to ignore an invalid/unknown fingerprint from the system."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_system_id
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_system_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__system_id
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__system_id
msgid "System"
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_system_type
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_system_type
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_system_type
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__system_type
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__system_type
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__system_type
msgid "System Type"
msgstr ""
#. module: base_external_system
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_form
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_form
msgid "Test Connection"
msgstr ""
@@ -232,73 +232,73 @@ msgid "The connection was a success."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_name
-#: model:ir.model.fields,help:base_external_system.field_external_system_name
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_name
+#: model:ir.model.fields,help:base_external_system.field_external_system__name
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__name
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__name
msgid "This is the canonical (humanized) name for the system."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_host
-#: model:ir.model.fields,help:base_external_system.field_external_system_host
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_host
+#: model:ir.model.fields,help:base_external_system.field_external_system__host
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__host
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__host
msgid "This is the domain or IP address that the system can be reached at."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system__fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__fingerprint
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__fingerprint
msgid "This is the fingerprint that is advertised by this system in order to validate its identity."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_interface
-#: model:ir.model.fields,help:base_external_system.field_external_system_interface
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_interface
+#: model:ir.model.fields,help:base_external_system.field_external_system__interface
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__interface
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__interface
msgid "This is the interface that this system represents. It is created automatically upon creation of the external system."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_password
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_password
-#: model:ir.model.fields,help:base_external_system.field_external_system_password
+#: model:ir.model.fields,help:base_external_system.field_external_system__password
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__password
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__password
msgid "This is the password that is used for authenticating to this system, if applicable."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_private_key_password
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_private_key_password
-#: model:ir.model.fields,help:base_external_system.field_external_system_private_key_password
+#: model:ir.model.fields,help:base_external_system.field_external_system__private_key_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__private_key_password
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__private_key_password
msgid "This is the password to unlock the private key that was provided for this sytem."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_port
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_port
-#: model:ir.model.fields,help:base_external_system.field_external_system_port
+#: model:ir.model.fields,help:base_external_system.field_external_system__port
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__port
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__port
msgid "This is the port number that the system is listening on."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_private_key
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_private_key
-#: model:ir.model.fields,help:base_external_system.field_external_system_private_key
+#: model:ir.model.fields,help:base_external_system.field_external_system__private_key
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__private_key
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__private_key
msgid "This is the private key that is used for authenticating to this system, if applicable."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter_username
-#: model:ir.model.fields,help:base_external_system.field_external_system_os_username
-#: model:ir.model.fields,help:base_external_system.field_external_system_username
+#: model:ir.model.fields,help:base_external_system.field_external_system__username
+#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__username
+#: model:ir.model.fields,help:base_external_system.field_external_system_os__username
msgid "This is the username that is used for authenticating to this system, if applicable."
msgstr ""
#. module: base_external_system
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter_username
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_os_username
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_username
-#: model:ir.ui.view,arch_db:base_external_system.external_system_view_search
+#: model:ir.model.fields,field_description:base_external_system.field_external_system__username
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__username
+#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__username
+#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Username"
msgstr ""
diff --git a/base_external_system/readme/CONFIGURE.rst b/base_external_system/readme/CONFIGURE.rst
new file mode 100644
index 000000000..0efcd8672
--- /dev/null
+++ b/base_external_system/readme/CONFIGURE.rst
@@ -0,0 +1 @@
+Configure external systems in Settings => Technical => External Systems
diff --git a/base_external_system/readme/CONTRIBUTORS.rst b/base_external_system/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..2a95bd4b3
--- /dev/null
+++ b/base_external_system/readme/CONTRIBUTORS.rst
@@ -0,0 +1,2 @@
+* Dave Lasley
+* Alexandre Díaz
diff --git a/base_external_system/readme/DESCRIPTION.rst b/base_external_system/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..c06b08180
--- /dev/null
+++ b/base_external_system/readme/DESCRIPTION.rst
@@ -0,0 +1,7 @@
+This module provides an interface/adapter mechanism for the definition of remote
+systems.
+
+Note that this module stores everything in plain text. In the interest of security,
+it is recommended you use another module (such as `keychain` or `red_october` to
+encrypt things like the password and private key). This is not done here in order
+to not force a specific security method.
diff --git a/base_external_system/readme/USAGE.rst b/base_external_system/readme/USAGE.rst
new file mode 100644
index 000000000..7f358b53d
--- /dev/null
+++ b/base_external_system/readme/USAGE.rst
@@ -0,0 +1,32 @@
+The credentials for systems are stored in the ``external.system`` model, and are to
+be configured by the user. This model is the unified interface for the underlying
+adapters.
+
+Using the Interface
+~~~~~~~~~~~~~~~~~~~
+
+Given an ``external.system`` singleton called ``external_system``, you would do the
+following to get the underlying system client:
+
+.. code-block:: python
+
+ with external_system.client() as client:
+ client.do_something()
+
+The client will be destroyed once the context has completed. Destruction takes place
+in the adapter's ``external_destroy_client`` method.
+
+The only unified aspect of this interface is the client connection itself. Other more
+opinionated interface/adapter mechanisms can be implemented in other modules, such as
+the file system interface in `OCA/server-tools/external_file_location
+`_.
+
+Creating an Adapter
+~~~~~~~~~~~~~~~~~~~
+
+Modules looking to add an external system adapter should inherit the
+``external.system.adapter`` model and override the following methods:
+
+* ``external_get_client``: Returns a usable client for the system
+* ``external_destroy_client``: Destroy the connection, if applicable. Does not need
+ to be defined if the connection destroys itself.
diff --git a/base_external_system/static/description/index.html b/base_external_system/static/description/index.html
new file mode 100644
index 000000000..4bada30ac
--- /dev/null
+++ b/base_external_system/static/description/index.html
@@ -0,0 +1,465 @@
+
+
+
+
+
+
+Base External System
+
+
+
+
+
Base External System
+
+
+
+
This module provides an interface/adapter mechanism for the definition of remote
+systems.
+
Note that this module stores everything in plain text. In the interest of security,
+it is recommended you use another module (such as keychain or red_october to
+encrypt things like the password and private key). This is not done here in order
+to not force a specific security method.
+
Table of contents
+
+
+
+
Configure external systems in Settings => Technical => External Systems
+
+
+
+
The credentials for systems are stored in the external.system model, and are to
+be configured by the user. This model is the unified interface for the underlying
+adapters.
+
+
+
Given an external.system singleton called external_system, you would do the
+following to get the underlying system client:
+
+with external_system.client() as client:
+ client.do_something()
+
+
The client will be destroyed once the context has completed. Destruction takes place
+in the adapter’s external_destroy_client method.
+
The only unified aspect of this interface is the client connection itself. Other more
+opinionated interface/adapter mechanisms can be implemented in other modules, such as
+the file system interface in OCA/server-tools/external_file_location.
+
+
+
+
Modules looking to add an external system adapter should inherit the
+external.system.adapter model and override the following methods:
+
+- external_get_client: Returns a usable client for the system
+- external_destroy_client: Destroy the connection, if applicable. Does not need
+to be defined if the connection destroys itself.
+
+
+
+
+
+
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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
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.
+
This module is part of the OCA/server-backend project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/base_external_system/views/external_system_view.xml b/base_external_system/views/external_system_view.xml
index e1ed17cbe..809bc4f4d 100755
--- a/base_external_system/views/external_system_view.xml
+++ b/base_external_system/views/external_system_view.xml
@@ -77,12 +77,15 @@
From 9297e48691067b82c713a677bb95eeaeddddb917 Mon Sep 17 00:00:00 2001
From: Ronald Portier
Date: Thu, 20 Aug 2020 14:01:02 +0200
Subject: [PATCH 05/17] [IMP] : black, isort, prettier
---
base_external_system/__manifest__.py | 15 ++--
.../demo/external_system_os_demo.xml | 6 +-
.../models/external_system.py | 83 +++++++++----------
.../models/external_system_adapter.py | 22 ++---
.../models/external_system_os.py | 6 +-
base_external_system/tests/common.py | 2 +-
.../tests/test_external_system.py | 35 +++-----
.../tests/test_external_system_adapter.py | 17 ++--
.../tests/test_external_system_os.py | 3 +-
.../views/external_system_view.xml | 75 +++++++++--------
10 files changed, 117 insertions(+), 147 deletions(-)
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index 7e10c32cd..acc80c05c 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 817270753..ff6b10fa1 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 5816a0207..d3e96bd76 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 @@ def client(self):
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 532e4a33b..dc44cedf8 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 @@ def external_test_connection(self):
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 93ee921d3..7e644a715 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 df695719e..e02e65132 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 09c2ec226..20dee9be5 100644
--- a/base_external_system/tests/test_external_system.py
+++ b/base_external_system/tests/test_external_system.py
@@ -7,59 +7,46 @@
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 7e322fc59..f5ce4c07c 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 @@
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 @@ def test_client_destroys_client(self):
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 33c367171..6e4d55cb1 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 @@
class TestExternalSystemOs(Common):
-
@classmethod
def setUpClass(cls):
"""Remember the working dir, just in case."""
@@ -22,7 +21,7 @@ def tearDownClass(cls):
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 809bc4f4d..bbefb00da 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
-
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
+
+
From fcd6afbc9d4bc5802e70c0ddbf3117d88900d92a Mon Sep 17 00:00:00 2001
From: Ronald Portier
Date: Thu, 20 Aug 2020 14:19:38 +0200
Subject: [PATCH 06/17] [MIG] base_external_system Migration to 13.0
---
base_external_system/__manifest__.py | 4 ++--
base_external_system/models/external_system.py | 5 +----
base_external_system/models/external_system_adapter.py | 8 +-------
base_external_system/models/external_system_os.py | 4 +---
base_external_system/readme/CONTRIBUTORS.rst | 1 +
base_external_system/views/external_system_view.xml | 1 -
6 files changed, 6 insertions(+), 17 deletions(-)
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index acc80c05c..ca837198f 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -4,14 +4,14 @@
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "12.0.1.0.0",
+ "version": "13.0.1.0.0",
"category": "Base",
"website": "https://github.com/OCA/server-backend",
"author": "LasLabs, " "Odoo Community Association (OCA)",
"license": "LGPL-3",
"application": False,
"installable": True,
- "depends": ["base",],
+ "depends": ["base"],
"data": [
"demo/external_system_os_demo.xml",
"security/ir.model.access.csv",
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
index d3e96bd76..7b7acd8a7 100644
--- a/base_external_system/models/external_system.py
+++ b/base_external_system/models/external_system.py
@@ -74,7 +74,6 @@ def _get_system_types(self):
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")
def check_fingerprint_ignore_fingerprint(self):
"""Do not allow a blank fingerprint if not set to ignore."""
@@ -87,7 +86,6 @@ def check_fingerprint_ignore_fingerprint(self):
)
)
- @api.multi
@contextmanager
def client(self):
"""Client object usable as a context manager to include destruction.
@@ -107,11 +105,10 @@ 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,})
+ interface = self.env[vals["system_type"]].create({"system_id": record.id})
record.interface = interface
return record
- @api.multi
def action_test_connection(self):
"""Test the connection to the external system."""
self.ensure_one()
diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py
index dc44cedf8..a17812676 100644
--- a/base_external_system/models/external_system_adapter.py
+++ b/base_external_system/models/external_system_adapter.py
@@ -24,7 +24,6 @@ class ExternalSystemAdapter(models.AbstractModel):
ondelete="cascade",
)
- @api.multi
@contextmanager
def client(self):
"""Client object usable as a context manager to include destruction.
@@ -42,12 +41,10 @@ def client(self):
finally:
self.external_destroy_client(client)
- @api.multi
def external_get_client(self):
"""Return a usable client representing the remote system."""
self.ensure_one()
- @api.multi
def external_destroy_client(self, client):
"""Perform any logic necessary to destroy the client connection.
@@ -57,7 +54,6 @@ def external_destroy_client(self, client):
"""
self.ensure_one()
- @api.multi
def external_test_connection(self):
"""Adapters should override this method, then call super if valid.
@@ -72,9 +68,7 @@ def external_test_connection(self):
@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 7e644a715..8ff2a5018 100644
--- a/base_external_system/models/external_system_os.py
+++ b/base_external_system/models/external_system_os.py
@@ -3,7 +3,7 @@
import os
-from odoo import api, models
+from odoo import models
class ExternalSystemOs(models.Model):
@@ -19,7 +19,6 @@ class ExternalSystemOs(models.Model):
previous_dir = None
- @api.multi
def external_get_client(self):
"""Return a usable client representing the remote system."""
super(ExternalSystemOs, self).external_get_client()
@@ -28,7 +27,6 @@ def external_get_client(self):
os.chdir(self.system_id.remote_path)
return os
- @api.multi
def external_destroy_client(self, client):
"""Perform any logic necessary to destroy the client connection.
diff --git a/base_external_system/readme/CONTRIBUTORS.rst b/base_external_system/readme/CONTRIBUTORS.rst
index 2a95bd4b3..5a5904896 100644
--- a/base_external_system/readme/CONTRIBUTORS.rst
+++ b/base_external_system/readme/CONTRIBUTORS.rst
@@ -1,2 +1,3 @@
* Dave Lasley
* Alexandre Díaz
+* Ronald Portier
diff --git a/base_external_system/views/external_system_view.xml b/base_external_system/views/external_system_view.xml
index bbefb00da..ada662a25 100755
--- a/base_external_system/views/external_system_view.xml
+++ b/base_external_system/views/external_system_view.xml
@@ -97,7 +97,6 @@
External Systems
external.system
ir.actions.act_window
- form
tree,form
Do not contact contributors directly about support or help with technical issues.
@@ -456,7 +457,7 @@
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.
-
This module is part of the OCA/server-backend project on GitHub.
+
This module is part of the OCA/server-backend project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py
index 20dee9be5..ab264728d 100644
--- a/base_external_system/tests/test_external_system.py
+++ b/base_external_system/tests/test_external_system.py
@@ -25,7 +25,10 @@ def test_check_fingerprint_blank(self):
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"})
+ # In Odoo 13.0, due to the way inverse records (models inherited from)
+ # are handled, setting both fields at the same time causes an error.
+ self.record.write({"fingerprint": "Data"})
+ self.record.write({"ignore_fingerprint": False})
self.assertTrue(True)
def test_client(self):
From f7012c457610942b8e153675115021b412c844c6 Mon Sep 17 00:00:00 2001
From: Cesar Andres Sanchez
Date: Tue, 12 Jul 2022 11:37:10 +0200
Subject: [PATCH 09/17] [IMP] base_external_system: black, isort, prettier
---
base_external_system/models/external_system.py | 8 ++++++--
base_external_system/tests/test_external_system.py | 7 +++++--
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
index 7b7acd8a7..d0a1b5e1e 100644
--- a/base_external_system/models/external_system.py
+++ b/base_external_system/models/external_system.py
@@ -13,7 +13,8 @@ class ExternalSystem(models.Model):
_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.",
@@ -56,7 +57,10 @@ class ExternalSystem(models.Model):
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,)
+ system_type = fields.Selection(
+ selection="_get_system_types",
+ required=True,
+ )
interface = fields.Reference(
selection="_get_system_types",
readonly=True,
diff --git a/base_external_system/tests/test_external_system.py b/base_external_system/tests/test_external_system.py
index ab264728d..b1f212baf 100644
--- a/base_external_system/tests/test_external_system.py
+++ b/base_external_system/tests/test_external_system.py
@@ -43,12 +43,15 @@ def test_create_creates_and_assigns_interface(self):
{"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,)
+ 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)
From 4c7a0f91846f984e8246421e35d11ed8e1bb641b Mon Sep 17 00:00:00 2001
From: Cesar Andres Sanchez
Date: Thu, 14 Jul 2022 00:00:17 +0200
Subject: [PATCH 10/17] [MIG] base_external_system: Migration to 15.0
---
base_external_system/__manifest__.py | 2 +-
base_external_system/models/external_system_os.py | 11 ++++++-----
base_external_system/readme/CONTRIBUTORS.rst | 5 ++++-
base_external_system/tests/test_external_system_os.py | 3 ++-
base_external_system/views/external_system_view.xml | 2 +-
5 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index ca837198f..90081ec1b 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -4,7 +4,7 @@
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "13.0.1.0.0",
+ "version": "15.0.1.0.0",
"category": "Base",
"website": "https://github.com/OCA/server-backend",
"author": "LasLabs, " "Odoo Community Association (OCA)",
diff --git a/base_external_system/models/external_system_os.py b/base_external_system/models/external_system_os.py
index 8ff2a5018..19850c6a7 100644
--- a/base_external_system/models/external_system_os.py
+++ b/base_external_system/models/external_system_os.py
@@ -23,7 +23,7 @@ def external_get_client(self):
"""Return a usable client representing the remote system."""
super(ExternalSystemOs, self).external_get_client()
if self.system_id.remote_path:
- self.previous_dir = os.getcwd()
+ ExternalSystemOs.previous_dir = os.getcwd()
os.chdir(self.system_id.remote_path)
return os
@@ -34,7 +34,8 @@ def external_destroy_client(self, client):
client (mixed): The client that was returned by
``external_get_client``.
"""
- super(ExternalSystemOs, self).external_destroy_client(client)
- if self.previous_dir:
- os.chdir(self.previous_dir)
- self.previous_dir = None
+ result = super(ExternalSystemOs, self).external_destroy_client(client)
+ if ExternalSystemOs.previous_dir:
+ os.chdir(ExternalSystemOs.previous_dir)
+ ExternalSystemOs.previous_dir = None
+ return result
diff --git a/base_external_system/readme/CONTRIBUTORS.rst b/base_external_system/readme/CONTRIBUTORS.rst
index 5a5904896..f484d8b9c 100644
--- a/base_external_system/readme/CONTRIBUTORS.rst
+++ b/base_external_system/readme/CONTRIBUTORS.rst
@@ -1,3 +1,6 @@
* Dave Lasley
-* Alexandre Díaz
* Ronald Portier
+* `Tecnativa `__:
+
+ * Alexandre Díaz
+ * César A. Sánchez
diff --git a/base_external_system/tests/test_external_system_os.py b/base_external_system/tests/test_external_system_os.py
index 6e4d55cb1..130082b11 100644
--- a/base_external_system/tests/test_external_system_os.py
+++ b/base_external_system/tests/test_external_system_os.py
@@ -16,8 +16,9 @@ def setUpClass(cls):
@classmethod
def tearDownClass(cls):
"""Set the working dir back to origin, just in case."""
- super(TestExternalSystemOs, cls).tearDownClass()
+ result = super(TestExternalSystemOs, cls).tearDownClass()
os.chdir(cls.working_dir)
+ return result
def setUp(self):
super(TestExternalSystemOs, self).setUp()
diff --git a/base_external_system/views/external_system_view.xml b/base_external_system/views/external_system_view.xml
index ada662a25..ec0ee2546 100644
--- a/base_external_system/views/external_system_view.xml
+++ b/base_external_system/views/external_system_view.xml
@@ -53,7 +53,7 @@
external.system.view.tree
external.system
-
+
From 209dc609b4fd79a466b87edfb84b6951e10511b0 Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Sun, 27 Nov 2022 15:56:51 +0000
Subject: [PATCH 11/17] [UPD] Update base_external_system.pot
---
.../i18n/base_external_system.pot | 35 +------------------
1 file changed, 1 insertion(+), 34 deletions(-)
diff --git a/base_external_system/i18n/base_external_system.pot b/base_external_system/i18n/base_external_system.pot
index 905e061f6..c6cd5d340 100644
--- a/base_external_system/i18n/base_external_system.pot
+++ b/base_external_system/i18n/base_external_system.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -15,14 +15,12 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__company_ids
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__company_ids
#: model:ir.model.fields,help:base_external_system.field_external_system_os__company_ids
msgid "Access to this system is restricted to these companies."
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__company_ids
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__company_ids
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__company_ids
msgid "Companies"
msgstr ""
@@ -34,21 +32,18 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__create_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__create_uid
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__create_uid
msgid "Created by"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__create_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__create_date
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__create_date
msgid "Created on"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__display_name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__display_name
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__display_name
msgid "Display Name"
msgstr ""
@@ -73,13 +68,11 @@ msgstr ""
#: model:ir.actions.act_window,name:base_external_system.external_system_action
#: model:ir.ui.menu,name:base_external_system.menu_external_system
#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
-#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_tree
msgid "External Systems"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__fingerprint
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__fingerprint
msgid "Fingerprint"
msgstr ""
@@ -97,7 +90,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__host
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__host
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__host
#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Host"
@@ -105,21 +97,18 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__id
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__id
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__id
msgid "ID"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__ignore_fingerprint
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__ignore_fingerprint
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__ignore_fingerprint
msgid "Ignore Fingerprint"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__interface
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__interface
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__interface
msgid "Interface"
msgstr ""
@@ -131,42 +120,36 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system____last_update
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter____last_update
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__write_uid
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__write_uid
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__write_date
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__write_date
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__name
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__name
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__name
msgid "Name"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__password
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__password
msgid "Password"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__port
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__port
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__port
#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Port"
@@ -174,35 +157,30 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__private_key
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__private_key
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__private_key
msgid "Private Key"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__private_key_password
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__private_key_password
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__private_key_password
msgid "Private Key Password"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__remote_path
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__remote_path
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__remote_path
msgid "Remote Path"
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__remote_path
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__remote_path
#: model:ir.model.fields,help:base_external_system.field_external_system_os__remote_path
msgid "Restrict to this directory path on the remote, if applicable."
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__ignore_fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__ignore_fingerprint
#: model:ir.model.fields,help:base_external_system.field_external_system_os__ignore_fingerprint
msgid ""
"Set this to `True` in order to ignore an invalid/unknown fingerprint from "
@@ -217,7 +195,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__system_type
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__system_type
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__system_type
msgid "System Type"
msgstr ""
@@ -235,21 +212,18 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__name
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__name
#: model:ir.model.fields,help:base_external_system.field_external_system_os__name
msgid "This is the canonical (humanized) name for the system."
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__host
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__host
#: model:ir.model.fields,help:base_external_system.field_external_system_os__host
msgid "This is the domain or IP address that the system can be reached at."
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__fingerprint
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__fingerprint
#: model:ir.model.fields,help:base_external_system.field_external_system_os__fingerprint
msgid ""
"This is the fingerprint that is advertised by this system in order to "
@@ -258,7 +232,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__interface
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__interface
#: model:ir.model.fields,help:base_external_system.field_external_system_os__interface
msgid ""
"This is the interface that this system represents. It is created "
@@ -267,7 +240,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__password
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__password
#: model:ir.model.fields,help:base_external_system.field_external_system_os__password
msgid ""
"This is the password that is used for authenticating to this system, if "
@@ -276,7 +248,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__private_key_password
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__private_key_password
#: model:ir.model.fields,help:base_external_system.field_external_system_os__private_key_password
msgid ""
"This is the password to unlock the private key that was provided for this "
@@ -285,14 +256,12 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__port
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__port
#: model:ir.model.fields,help:base_external_system.field_external_system_os__port
msgid "This is the port number that the system is listening on."
msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__private_key
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__private_key
#: model:ir.model.fields,help:base_external_system.field_external_system_os__private_key
msgid ""
"This is the private key that is used for authenticating to this system, if "
@@ -301,7 +270,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,help:base_external_system.field_external_system__username
-#: model:ir.model.fields,help:base_external_system.field_external_system_adapter__username
#: model:ir.model.fields,help:base_external_system.field_external_system_os__username
msgid ""
"This is the username that is used for authenticating to this system, if "
@@ -310,7 +278,6 @@ msgstr ""
#. module: base_external_system
#: model:ir.model.fields,field_description:base_external_system.field_external_system__username
-#: model:ir.model.fields,field_description:base_external_system.field_external_system_adapter__username
#: model:ir.model.fields,field_description:base_external_system.field_external_system_os__username
#: model_terms:ir.ui.view,arch_db:base_external_system.external_system_view_search
msgid "Username"
From b330ddba766f265600664872d3077b452ddb128a Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Sun, 27 Nov 2022 15:59:18 +0000
Subject: [PATCH 12/17] [UPD] README.rst
---
base_external_system/README.rst | 15 +++++++++------
.../static/description/index.html | 12 ++++++++----
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/base_external_system/README.rst b/base_external_system/README.rst
index 8e8271b8d..e168268cb 100644
--- a/base_external_system/README.rst
+++ b/base_external_system/README.rst
@@ -14,13 +14,13 @@ Base External System
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github
- :target: https://github.com/OCA/server-backend/tree/13.0/base_external_system
+ :target: https://github.com/OCA/server-backend/tree/15.0/base_external_system
:alt: OCA/server-backend
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/server-backend-13-0/server-backend-13-0-base_external_system
+ :target: https://translation.odoo-community.org/projects/server-backend-15-0/server-backend-15-0-base_external_system
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/253/13.0
+ :target: https://runbot.odoo-community.org/runbot/253/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -85,7 +85,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -101,8 +101,11 @@ Contributors
~~~~~~~~~~~~
* Dave Lasley
-* Alexandre Díaz
* Ronald Portier
+* `Tecnativa `__:
+
+ * Alexandre Díaz
+ * César A. Sánchez
Maintainers
~~~~~~~~~~~
@@ -117,6 +120,6 @@ 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.
-This module is part of the `OCA/server-backend `_ project on GitHub.
+This module is part of the `OCA/server-backend `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_external_system/static/description/index.html b/base_external_system/static/description/index.html
index ba65825fd..355225ba0 100644
--- a/base_external_system/static/description/index.html
+++ b/base_external_system/static/description/index.html
@@ -367,7 +367,7 @@ Base External System
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module provides an interface/adapter mechanism for the definition of remote
systems.
Note that this module stores everything in plain text. In the interest of security,
@@ -431,7 +431,7 @@
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.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -457,7 +461,7 @@
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.
-
This module is part of the OCA/server-backend project on GitHub.
+
This module is part of the OCA/server-backend project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 14666c8c5bfda3aefa57fdc2c53d1c2890b657d0 Mon Sep 17 00:00:00 2001
From: ntsirintanis
Date: Mon, 6 Feb 2023 16:34:30 +0100
Subject: [PATCH 13/17] [MIG] base_external_system: Migration to 16.0
---
.pre-commit-config.yaml | 2 +-
base_external_system/__manifest__.py | 2 +-
.../models/external_system.py | 19 ++++++++++++-------
.../models/external_system_adapter.py | 15 +++++++++------
base_external_system/tests/common.py | 3 +--
.../odoo/addons/base_external_system | 1 +
setup/base_external_system/setup.py | 6 ++++++
7 files changed, 31 insertions(+), 17 deletions(-)
create mode 120000 setup/base_external_system/odoo/addons/base_external_system
create mode 100644 setup/base_external_system/setup.py
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c62ce9e56..4d07ee61b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -101,7 +101,7 @@ repos:
- id: pyupgrade
args: ["--keep-percent-format"]
- repo: https://github.com/PyCQA/isort
- rev: 5.10.1
+ rev: 5.12.0
hooks:
- id: isort
name: isort except __init__.py
diff --git a/base_external_system/__manifest__.py b/base_external_system/__manifest__.py
index 90081ec1b..b51d6e7c2 100644
--- a/base_external_system/__manifest__.py
+++ b/base_external_system/__manifest__.py
@@ -4,7 +4,7 @@
{
"name": "Base External System",
"summary": "Data models allowing for connection to external systems.",
- "version": "15.0.1.0.0",
+ "version": "16.0.1.0.0",
"category": "Base",
"website": "https://github.com/OCA/server-backend",
"author": "LasLabs, " "Odoo Community Association (OCA)",
diff --git a/base_external_system/models/external_system.py b/base_external_system/models/external_system.py
index d0a1b5e1e..e2d79435a 100644
--- a/base_external_system/models/external_system.py
+++ b/base_external_system/models/external_system.py
@@ -104,14 +104,19 @@ def client(self):
with self.interface.client() as client:
yield client
- @api.model
- def create(self, vals):
+ @api.model_create_multi
+ def create(self, vals_list):
"""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})
- record.interface = interface
- return record
+ records = self.browse([])
+ for vals in vals_list:
+ 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}
+ )
+ record.interface = interface
+ records += record
+ return records
def action_test_connection(self):
"""Test the connection to the external system."""
diff --git a/base_external_system/models/external_system_adapter.py b/base_external_system/models/external_system_adapter.py
index a17812676..8bf09958a 100644
--- a/base_external_system/models/external_system_adapter.py
+++ b/base_external_system/models/external_system_adapter.py
@@ -65,10 +65,13 @@ def external_test_connection(self):
"""
raise UserError(_("The connection was a success."))
- @api.model
- def create(self, vals):
+ @api.model_create_multi
+ def create(self, vals_list):
context_self = self.with_context(no_create_interface=True)
- vals.update({"system_type": self._name})
- record = super(ExternalSystemAdapter, context_self).create(vals)
- record.system_id.interface = record
- return record
+ records = self.browse([])
+ for vals in vals_list:
+ vals.update({"system_type": self._name})
+ record = super(ExternalSystemAdapter, context_self).create(vals)
+ record.system_id.interface = record
+ records += record
+ return records
diff --git a/base_external_system/tests/common.py b/base_external_system/tests/common.py
index e02e65132..e56d2ed83 100644
--- a/base_external_system/tests/common.py
+++ b/base_external_system/tests/common.py
@@ -2,8 +2,7 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from contextlib import contextmanager
-
-from mock import MagicMock
+from unittest.mock import MagicMock
from odoo.tests.common import TransactionCase
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 000000000..6740d6a6a
--- /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 000000000..28c57bb64
--- /dev/null
+++ b/setup/base_external_system/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)
From 2221e81a7798dd208348484de304fc524cf07530 Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Mon, 21 Aug 2023 14:54:39 +0000
Subject: [PATCH 14/17] [UPD] Update base_external_system.pot
---
base_external_system/i18n/base_external_system.pot | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/base_external_system/i18n/base_external_system.pot b/base_external_system/i18n/base_external_system.pot
index c6cd5d340..805b719fd 100644
--- a/base_external_system/i18n/base_external_system.pot
+++ b/base_external_system/i18n/base_external_system.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 15.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -78,6 +78,7 @@ msgid "Fingerprint"
msgstr ""
#. module: base_external_system
+#. odoo-python
#: code:addons/base_external_system/models/external_system.py:0
#, python-format
msgid "Fingerprint cannot be empty when Ignore Fingerprint is not checked."
@@ -205,6 +206,7 @@ msgid "Test Connection"
msgstr ""
#. module: base_external_system
+#. odoo-python
#: code:addons/base_external_system/models/external_system_adapter.py:0
#, python-format
msgid "The connection was a success."
From 6bd0420d1f3350c4e9f420a774d85cef888e4cf3 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 21 Aug 2023 14:57:40 +0000
Subject: [PATCH 15/17] [UPD] addons table in README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 7cafc6f57..f0505ddfc 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ addon | version | maintainers | summary
[base_external_dbsource](base_external_dbsource/) | 16.0.1.0.1 | | External Database Sources
[base_external_dbsource_mssql](base_external_dbsource_mssql/) | 16.0.1.0.1 | [![anddago78](https://github.com/anddago78.png?size=30px)](https://github.com/anddago78) | External Database Source - MSSQL
[base_external_dbsource_sqlite](base_external_dbsource_sqlite/) | 16.0.1.0.1 | [![anddago78](https://github.com/anddago78.png?size=30px)](https://github.com/anddago78) | External Database Source - SQLite
+[base_external_system](base_external_system/) | 16.0.1.0.0 | | Data models allowing for connection to external systems.
[base_global_discount](base_global_discount/) | 16.0.1.0.0 | | Base Global Discount
[base_import_match](base_import_match/) | 16.0.1.0.0 | | Try to avoid duplicates before importing
[base_portal_type](base_portal_type/) | 16.0.1.0.0 | [![hbrunn](https://github.com/hbrunn.png?size=30px)](https://github.com/hbrunn) | Base module to allow different types of portals
From ec96e7c242194deadbcd11ec48e44cdf51f7e907 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 21 Aug 2023 14:57:42 +0000
Subject: [PATCH 16/17] [UPD] README.rst
---
base_external_system/README.rst | 10 +++++-----
base_external_system/static/description/index.html | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/base_external_system/README.rst b/base_external_system/README.rst
index e168268cb..0f1b5ac32 100644
--- a/base_external_system/README.rst
+++ b/base_external_system/README.rst
@@ -14,13 +14,13 @@ Base External System
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github
- :target: https://github.com/OCA/server-backend/tree/15.0/base_external_system
+ :target: https://github.com/OCA/server-backend/tree/16.0/base_external_system
:alt: OCA/server-backend
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/server-backend-15-0/server-backend-15-0-base_external_system
+ :target: https://translation.odoo-community.org/projects/server-backend-16-0/server-backend-16-0-base_external_system
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/253/15.0
+ :target: https://runbot.odoo-community.org/runbot/253/16.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -85,7 +85,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -120,6 +120,6 @@ 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.
-This module is part of the `OCA/server-backend `_ project on GitHub.
+This module is part of the `OCA/server-backend `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_external_system/static/description/index.html b/base_external_system/static/description/index.html
index 355225ba0..342ccca71 100644
--- a/base_external_system/static/description/index.html
+++ b/base_external_system/static/description/index.html
@@ -367,7 +367,7 @@ Base External System
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module provides an interface/adapter mechanism for the definition of remote
systems.
Note that this module stores everything in plain text. In the interest of security,
@@ -431,7 +431,7 @@
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.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -461,7 +461,7 @@
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.
-
This module is part of the OCA/server-backend project on GitHub.
+
This module is part of the OCA/server-backend project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 8292cc6aab19cc1ce5b4fd10836438ad0b230323 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 21 Aug 2023 14:57:42 +0000
Subject: [PATCH 17/17] [ADD] setup.py
---
setup/_metapackage/VERSION.txt | 2 +-
setup/_metapackage/setup.py | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/setup/_metapackage/VERSION.txt b/setup/_metapackage/VERSION.txt
index 0a641ff22..5aaaf2459 100644
--- a/setup/_metapackage/VERSION.txt
+++ b/setup/_metapackage/VERSION.txt
@@ -1 +1 @@
-16.0.20230807.0
\ No newline at end of file
+16.0.20230821.0
\ No newline at end of file
diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py
index a7a471cf9..8a4da23d3 100644
--- a/setup/_metapackage/setup.py
+++ b/setup/_metapackage/setup.py
@@ -11,6 +11,7 @@
'odoo-addon-base_external_dbsource>=16.0dev,<16.1dev',
'odoo-addon-base_external_dbsource_mssql>=16.0dev,<16.1dev',
'odoo-addon-base_external_dbsource_sqlite>=16.0dev,<16.1dev',
+ 'odoo-addon-base_external_system>=16.0dev,<16.1dev',
'odoo-addon-base_global_discount>=16.0dev,<16.1dev',
'odoo-addon-base_import_match>=16.0dev,<16.1dev',
'odoo-addon-base_portal_type>=16.0dev,<16.1dev',