From 973d1160b61a8406adcc8c77481ffbc7e46b8fce Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Wed, 20 Jun 2018 13:04:59 +0200
Subject: [PATCH 01/16] [FIX] module name
[UPD] Update base_remote.pot
---
base_remote/README.rst | 58 ++++++++++++++
base_remote/__init__.py | 1 +
base_remote/__manifest__.py | 18 +++++
base_remote/i18n/base_remote.pot | 98 ++++++++++++++++++++++++
base_remote/models/__init__.py | 5 ++
base_remote/models/base.py | 17 ++++
base_remote/models/res_remote.py | 49 ++++++++++++
base_remote/models/res_users.py | 53 +++++++++++++
base_remote/security/ir.model.access.csv | 3 +
base_remote/tests/__init__.py | 1 +
base_remote/tests/test_remote.py | 66 ++++++++++++++++
base_remote/views/res_remote_views.xml | 46 +++++++++++
12 files changed, 415 insertions(+)
create mode 100644 base_remote/README.rst
create mode 100644 base_remote/__init__.py
create mode 100644 base_remote/__manifest__.py
create mode 100644 base_remote/i18n/base_remote.pot
create mode 100644 base_remote/models/__init__.py
create mode 100644 base_remote/models/base.py
create mode 100644 base_remote/models/res_remote.py
create mode 100644 base_remote/models/res_users.py
create mode 100644 base_remote/security/ir.model.access.csv
create mode 100644 base_remote/tests/__init__.py
create mode 100644 base_remote/tests/test_remote.py
create mode 100644 base_remote/views/res_remote_views.xml
diff --git a/base_remote/README.rst b/base_remote/README.rst
new file mode 100644
index 000000000..0183a3d0c
--- /dev/null
+++ b/base_remote/README.rst
@@ -0,0 +1,58 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+===========
+Remote Base
+===========
+
+This module allows to store all the connected remotes (external ip addresses) to odoo.
+It should be used with other modules in order to check remote's configurations.
+
+Usage
+=====
+
+When installed, all remotes will be stored by `hostname` on `res.remote`.
+They can be viewed on `Settings / Users & Companies / Remotes`.
+The last Ip of the remote will be stored.
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/144/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 smashing it by providing a detailed and welcomed feedback.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon `_.
+
+Contributors
+------------
+
+* Enric Tobella
+
+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_remote/__init__.py b/base_remote/__init__.py
new file mode 100644
index 000000000..0650744f6
--- /dev/null
+++ b/base_remote/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
new file mode 100644
index 000000000..27a54af17
--- /dev/null
+++ b/base_remote/__manifest__.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2018 Creu Blanca
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+{
+ 'name': "Remote Base",
+ 'version': '11.0.1.0.1',
+ 'category': 'Generic Modules/Base',
+ 'author': "Creu Blanca, Odoo Community Association (OCA)",
+ 'website': 'http://github.com/OCA/server-tools',
+ 'license': 'AGPL-3',
+ "depends": ['web', 'base'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'views/res_remote_views.xml',
+ ],
+ 'installable': True,
+ 'application': True,
+}
diff --git a/base_remote/i18n/base_remote.pot b/base_remote/i18n/base_remote.pot
new file mode 100644
index 000000000..59aa20446
--- /dev/null
+++ b/base_remote/i18n/base_remote.pot
@@ -0,0 +1,98 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_remote
+#
+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_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_date
+msgid "Created on"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_name
+msgid "Hostname"
+msgstr ""
+
+#. module: base_remote
+#: sql_constraint:res.remote:0
+msgid "Hostname must be unique"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_id
+msgid "ID"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_in_network
+msgid "In Network"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_ip
+msgid "Ip"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote___last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.ui.view,arch_db:base_remote.res_remote_form
+msgid "Remote"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.actions.act_window,name:base_remote.res_remote_action
+#: model:ir.model,name:base_remote.model_res_remote
+#: model:ir.ui.menu,name:base_remote.res_remote_menu
+#: model:ir.ui.view,arch_db:base_remote.res_remote_tree
+msgid "Remotes"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,help:base_remote.field_res_remote_in_network
+msgid "Shows if the remote can be found through the socket"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model,name:base_remote.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model,name:base_remote.model_base
+msgid "base"
+msgstr ""
+
diff --git a/base_remote/models/__init__.py b/base_remote/models/__init__.py
new file mode 100644
index 000000000..11252a793
--- /dev/null
+++ b/base_remote/models/__init__.py
@@ -0,0 +1,5 @@
+from . import base
+from . import res_remote
+from . import res_users
+
+
diff --git a/base_remote/models/base.py b/base_remote/models/base.py
new file mode 100644
index 000000000..87bf5fd42
--- /dev/null
+++ b/base_remote/models/base.py
@@ -0,0 +1,17 @@
+# Copyright 2018 Creu Blanca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import models
+from threading import current_thread
+
+
+class Base(models.AbstractModel):
+ _inherit = 'base'
+
+ @property
+ def remote(self):
+ try:
+ remote_addr = current_thread().environ["REMOTE_ADDR"]
+ except KeyError:
+ remote_addr = False
+ return self.env['res.remote']._get_remote(remote_addr)
diff --git a/base_remote/models/res_remote.py b/base_remote/models/res_remote.py
new file mode 100644
index 000000000..0abc850da
--- /dev/null
+++ b/base_remote/models/res_remote.py
@@ -0,0 +1,49 @@
+# Copyright 2018 Creu Blanca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import api, models, fields
+import socket
+import logging
+
+
+class ResRemote(models.Model):
+ _name = 'res.remote'
+ _description = 'Remotes'
+
+ name = fields.Char(
+ required=True,
+ string='Hostname',
+ index=True,
+ readonly=True
+ )
+ ip = fields.Char(required=True)
+ in_network = fields.Boolean(
+ required=True,
+ help='Shows if the remote can be found through the socket'
+ )
+
+ _sql_constraints = [
+ ('name_unique', 'unique(name)', 'Hostname must be unique')
+ ]
+
+ @api.model
+ def _create_vals(self, addr, hostname):
+ return {
+ 'name': hostname or addr,
+ 'ip': addr,
+ 'in_network': bool(hostname),
+ }
+
+ @api.model
+ def _get_remote(self, addr):
+ try:
+ hostname, alias, ips = socket.gethostbyaddr(addr)
+ except socket.herror:
+ logging.warning('Remote with ip %s could not be found' % addr)
+ hostname = False
+ remote = self.search([('name', '=', hostname or addr)])
+ if not remote:
+ remote = self.create(self._create_vals(addr, hostname))
+ if remote.ip != addr:
+ # IPs can change through time, but hostname should not change
+ remote.write({'ip': addr})
+ return remote
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
new file mode 100644
index 000000000..0cfbb4b0f
--- /dev/null
+++ b/base_remote/models/res_users.py
@@ -0,0 +1,53 @@
+# Copyright 2018 Creu Blanca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from threading import current_thread
+from odoo import api, models, SUPERUSER_ID
+from odoo.exceptions import AccessDenied
+from odoo.service import wsgi_server
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ # HACK https://github.com/odoo/odoo/issues/24183
+ # TODO Remove in v12, and use normal odoo.http.request to get details
+ @api.model_cr
+ def _register_hook(self):
+ """馃悞-patch XML-RPC controller to know remote address."""
+ original_fn = wsgi_server.application_unproxied
+
+ def _patch(environ, start_response):
+ current_thread().environ = environ
+ return original_fn(environ, start_response)
+
+ wsgi_server.application_unproxied = _patch
+
+ @classmethod
+ def _auth_check_remote(cls, login, method):
+ """Force a method to raise an AccessDenied on falsey return."""
+ with cls.pool.cursor() as cr:
+ env = api.Environment(cr, SUPERUSER_ID, {})
+ remote = env["res.users"].remote
+ remote.ensure_one()
+ result = method()
+ if not result:
+ # Force exception to record auth failure
+ raise AccessDenied()
+ return result
+
+ # Override all auth-related core methods
+ @classmethod
+ def _login(cls, db, login, password):
+ return cls._auth_check_remote(
+ login,
+ lambda: super(ResUsers, cls)._login(db, login, password),
+ )
+
+ @classmethod
+ def authenticate(cls, db, login, password, user_agent_env):
+ return cls._auth_check_remote(
+ login,
+ lambda: super(ResUsers, cls).authenticate(
+ db, login, password, user_agent_env),
+ )
diff --git a/base_remote/security/ir.model.access.csv b/base_remote/security/ir.model.access.csv
new file mode 100644
index 000000000..7642160aa
--- /dev/null
+++ b/base_remote/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_remote,access_remote,model_res_remote,base.group_user,1,0,0,0
+manage_remote,manage_remote,model_res_remote,base.group_system,1,1,0,0
diff --git a/base_remote/tests/__init__.py b/base_remote/tests/__init__.py
new file mode 100644
index 000000000..2dbcf34b1
--- /dev/null
+++ b/base_remote/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_remote
diff --git a/base_remote/tests/test_remote.py b/base_remote/tests/test_remote.py
new file mode 100644
index 000000000..056e3a00a
--- /dev/null
+++ b/base_remote/tests/test_remote.py
@@ -0,0 +1,66 @@
+# Copyright 2018 Creu Blanca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from xmlrpc.client import Fault
+
+from mock import patch
+from werkzeug.utils import redirect
+
+from odoo import http
+from odoo.tests.common import at_install, HttpCase, post_install
+
+
+@at_install(False)
+@post_install(True)
+# Skip CSRF validation on tests
+@patch(http.__name__ + ".WebRequest.validate_csrf", return_value=True)
+# Skip specific browser forgery on redirections
+@patch(http.__name__ + ".redirect_with_hash", side_effect=redirect)
+class TestRemote(HttpCase):
+ def setUp(self):
+ super().setUp()
+ # HACK https://github.com/odoo/odoo/issues/24183
+ # TODO Remove in v12
+ # Complex password to avoid conflicts with `password_security`
+ self.good_password = "Admin$%02584"
+ self.data_demo = {
+ "login": "demo",
+ "password": "Demo%&/(908409**",
+ }
+ self.remote_addr = '127.0.0.1'
+ with self.cursor() as cr:
+ env = self.env(cr)
+ # Make sure involved users have good passwords
+ env.user.password = self.good_password
+ env["res.users"].search([
+ ("login", "=", self.data_demo["login"]),
+ ]).password = self.data_demo["password"]
+ remote = self.env['res.remote'].search([
+ ('ip', '=', self.remote_addr)
+ ])
+ if remote:
+ remote.unlink()
+
+ def test_xmlrpc_login_ok(self, *args):
+ """Test Login"""
+ data1 = self.data_demo
+ self.assertTrue(self.xmlrpc_common.authenticate(
+ self.env.cr.dbname, data1["login"], data1["password"], {}))
+ with self.cursor() as cr:
+ env = self.env(cr)
+ self.assertTrue(
+ env['res.remote'].search([('ip', '=', self.remote_addr)])
+ )
+
+ def test_xmlrpc_login_failure(self, *args):
+ """Test Login Failure"""
+ data1 = self.data_demo
+ data1['password'] = 'Failure!'
+ with self.assertRaises(Fault):
+ self.assertFalse(self.xmlrpc_common.authenticate(
+ self.env.cr.dbname, data1["login"], data1["password"], {}))
+ with self.cursor() as cr:
+ env = self.env(cr)
+ self.assertTrue(
+ env['res.remote'].search([('ip', '=', self.remote_addr)])
+ )
diff --git a/base_remote/views/res_remote_views.xml b/base_remote/views/res_remote_views.xml
new file mode 100644
index 000000000..3ceda5de6
--- /dev/null
+++ b/base_remote/views/res_remote_views.xml
@@ -0,0 +1,46 @@
+
+
+
+ res.remote.form
+ res.remote
+
+
+
+
+
+ res.remote.tree
+ res.remote
+
+
+
+
+
+
+
+
+ Remotes
+ ir.actions.act_window
+ res.remote
+ form
+ tree,form
+
+
+
+
From 13e201493a34e7b16368e171fcf07a3afd7a67d3 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Wed, 20 Jun 2018 14:52:38 +0200
Subject: [PATCH 02/16] [FIX] missing super declaration
---
base_remote/models/res_users.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
index 0cfbb4b0f..da2d46a1c 100644
--- a/base_remote/models/res_users.py
+++ b/base_remote/models/res_users.py
@@ -15,6 +15,7 @@ class ResUsers(models.Model):
@api.model_cr
def _register_hook(self):
"""馃悞-patch XML-RPC controller to know remote address."""
+ super()._register_hook()
original_fn = wsgi_server.application_unproxied
def _patch(environ, start_response):
From 53b7d26979f1ef1b6cefa8e95c72b681b6453498 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Fri, 13 Jul 2018 08:32:20 +0000
Subject: [PATCH 03/16] =?UTF-8?q?Added=20translation=20using=20Weblate=20(?=
=?UTF-8?q?Espa=C3=B1ol=20(Espa=C3=B1a))?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
base_remote/i18n/es.po | 100 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
create mode 100644 base_remote/i18n/es.po
diff --git a/base_remote/i18n/es.po b/base_remote/i18n/es.po
new file mode 100644
index 000000000..900007684
--- /dev/null
+++ b/base_remote/i18n/es.po
@@ -0,0 +1,100 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_remote
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2018-07-13 08:36+0000\n"
+"Last-Translator: Enric Tobella \n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.0.1\n"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_uid
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_date
+msgid "Created on"
+msgstr "Creado el"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_display_name
+msgid "Display Name"
+msgstr "Nombre a mostrar"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_name
+msgid "Hostname"
+msgstr "Nombre del host"
+
+#. module: base_remote
+#: sql_constraint:res.remote:0
+msgid "Hostname must be unique"
+msgstr "El nombre del host debe ser 煤nico"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_id
+msgid "ID"
+msgstr "ID"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_in_network
+msgid "In Network"
+msgstr "En la Red local"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_ip
+msgid "Ip"
+msgstr "IP"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote___last_update
+msgid "Last Modified on"
+msgstr "脷ltima actualizaci贸n por"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_uid
+msgid "Last Updated by"
+msgstr "脷ltima actualizaci贸n por"
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_date
+msgid "Last Updated on"
+msgstr "脷ltima actualizaci贸n el"
+
+#. module: base_remote
+#: model:ir.ui.view,arch_db:base_remote.res_remote_form
+msgid "Remote"
+msgstr "Remoto"
+
+#. module: base_remote
+#: model:ir.actions.act_window,name:base_remote.res_remote_action
+#: model:ir.model,name:base_remote.model_res_remote
+#: model:ir.ui.menu,name:base_remote.res_remote_menu
+#: model:ir.ui.view,arch_db:base_remote.res_remote_tree
+msgid "Remotes"
+msgstr "Remotos"
+
+#. module: base_remote
+#: model:ir.model.fields,help:base_remote.field_res_remote_in_network
+msgid "Shows if the remote can be found through the socket"
+msgstr "Muestra si el remoto se pudo encontrar a trav茅s del socket"
+
+#. module: base_remote
+#: model:ir.model,name:base_remote.model_res_users
+msgid "Users"
+msgstr "Usuarios"
+
+#. module: base_remote
+#: model:ir.model,name:base_remote.model_base
+msgid "base"
+msgstr "base"
From 06c454570d2ec0e9c221a26f728de78e6e2aac1c Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Thu, 1 Nov 2018 08:58:46 +0100
Subject: [PATCH 04/16] [FIX] base_remote: Views
---
base_remote/README.rst | 2 +-
base_remote/__manifest__.py | 2 +-
base_remote/views/res_remote_views.xml | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/base_remote/README.rst b/base_remote/README.rst
index 0183a3d0c..c7f7f4525 100644
--- a/base_remote/README.rst
+++ b/base_remote/README.rst
@@ -13,7 +13,7 @@ Usage
=====
When installed, all remotes will be stored by `hostname` on `res.remote`.
-They can be viewed on `Settings / Users & Companies / Remotes`.
+They can be viewed on `Settings / Remotes`.
The last Ip of the remote will be stored.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index 27a54af17..cc4917c6b 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': "Remote Base",
- 'version': '11.0.1.0.1',
+ 'version': '11.0.1.0.2',
'category': 'Generic Modules/Base',
'author': "Creu Blanca, Odoo Community Association (OCA)",
'website': 'http://github.com/OCA/server-tools',
diff --git a/base_remote/views/res_remote_views.xml b/base_remote/views/res_remote_views.xml
index 3ceda5de6..143150afc 100644
--- a/base_remote/views/res_remote_views.xml
+++ b/base_remote/views/res_remote_views.xml
@@ -40,7 +40,7 @@
From 64ef56ae526287db5f7d7ea27ecb31a348dabaa8 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Wed, 28 Nov 2018 12:38:09 +0100
Subject: [PATCH 05/16] [IMP] name of remotes should be case insensitive
---
base_remote/__manifest__.py | 2 +-
base_remote/models/res_remote.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index cc4917c6b..f0dd4aa93 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': "Remote Base",
- 'version': '11.0.1.0.2',
+ 'version': '11.0.1.0.3',
'category': 'Generic Modules/Base',
'author': "Creu Blanca, Odoo Community Association (OCA)",
'website': 'http://github.com/OCA/server-tools',
diff --git a/base_remote/models/res_remote.py b/base_remote/models/res_remote.py
index 0abc850da..bd90ee4fe 100644
--- a/base_remote/models/res_remote.py
+++ b/base_remote/models/res_remote.py
@@ -40,7 +40,7 @@ class ResRemote(models.Model):
except socket.herror:
logging.warning('Remote with ip %s could not be found' % addr)
hostname = False
- remote = self.search([('name', '=', hostname or addr)])
+ remote = self.search([('name', '=ilike', hostname or addr)])
if not remote:
remote = self.create(self._create_vals(addr, hostname))
if remote.ip != addr:
From e21a0cbb980a0315c39fb1cfa9118adc881abeca Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Thu, 27 Dec 2018 00:30:55 +0100
Subject: [PATCH 06/16] [FIX] base_remote: Do not raise Error on login failure
[ADD] icon.png
---
base_remote/__manifest__.py | 2 +-
base_remote/models/base.py | 4 +++-
base_remote/models/res_users.py | 10 +++-------
base_remote/static/description/icon.png | Bin 0 -> 9455 bytes
base_remote/tests/test_remote.py | 7 ++-----
5 files changed, 9 insertions(+), 14 deletions(-)
create mode 100644 base_remote/static/description/icon.png
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index f0dd4aa93..f80f540cc 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': "Remote Base",
- 'version': '11.0.1.0.3',
+ 'version': '11.0.1.0.4',
'category': 'Generic Modules/Base',
'author': "Creu Blanca, Odoo Community Association (OCA)",
'website': 'http://github.com/OCA/server-tools',
diff --git a/base_remote/models/base.py b/base_remote/models/base.py
index 87bf5fd42..b7c9b2fc6 100644
--- a/base_remote/models/base.py
+++ b/base_remote/models/base.py
@@ -13,5 +13,7 @@ class Base(models.AbstractModel):
try:
remote_addr = current_thread().environ["REMOTE_ADDR"]
except KeyError:
- remote_addr = False
+ return self.env['res.remote']
+ except AttributeError:
+ return self.env['res.remote']
return self.env['res.remote']._get_remote(remote_addr)
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
index da2d46a1c..77fab1b6e 100644
--- a/base_remote/models/res_users.py
+++ b/base_remote/models/res_users.py
@@ -3,7 +3,6 @@
from threading import current_thread
from odoo import api, models, SUPERUSER_ID
-from odoo.exceptions import AccessDenied
from odoo.service import wsgi_server
@@ -30,12 +29,9 @@ class ResUsers(models.Model):
with cls.pool.cursor() as cr:
env = api.Environment(cr, SUPERUSER_ID, {})
remote = env["res.users"].remote
- remote.ensure_one()
- result = method()
- if not result:
- # Force exception to record auth failure
- raise AccessDenied()
- return result
+ if remote:
+ remote.ensure_one()
+ return method()
# Override all auth-related core methods
@classmethod
diff --git a/base_remote/static/description/icon.png b/base_remote/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/base_remote/tests/test_remote.py b/base_remote/tests/test_remote.py
index 056e3a00a..33876950d 100644
--- a/base_remote/tests/test_remote.py
+++ b/base_remote/tests/test_remote.py
@@ -1,8 +1,6 @@
# Copyright 2018 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from xmlrpc.client import Fault
-
from mock import patch
from werkzeug.utils import redirect
@@ -56,9 +54,8 @@ class TestRemote(HttpCase):
"""Test Login Failure"""
data1 = self.data_demo
data1['password'] = 'Failure!'
- with self.assertRaises(Fault):
- self.assertFalse(self.xmlrpc_common.authenticate(
- self.env.cr.dbname, data1["login"], data1["password"], {}))
+ self.assertFalse(self.xmlrpc_common.authenticate(
+ self.env.cr.dbname, data1["login"], data1["password"], {}))
with self.cursor() as cr:
env = self.env(cr)
self.assertTrue(
From 937ec7cec033daa6550676e7332bf726f0cb860f Mon Sep 17 00:00:00 2001
From: Jaime Arroyo
Date: Mon, 3 Jun 2019 12:30:21 +0200
Subject: [PATCH 07/16] [12.0][MIG] base_remote
[UPD] Update base_remote.pot
---
base_remote/README.rst | 71 ++--
base_remote/__manifest__.py | 4 +-
base_remote/i18n/base_remote.pot | 38 +-
base_remote/models/base.py | 4 +-
base_remote/models/res_remote.py | 2 +-
base_remote/models/res_users.py | 10 +-
base_remote/readme/CONTRIBUTORS.rst | 1 +
base_remote/readme/DESCRIPTION.rst | 2 +
base_remote/readme/USAGE.rst | 3 +
base_remote/static/description/index.html | 427 ++++++++++++++++++++++
base_remote/tests/test_remote.py | 3 +-
11 files changed, 512 insertions(+), 53 deletions(-)
create mode 100644 base_remote/readme/CONTRIBUTORS.rst
create mode 100644 base_remote/readme/DESCRIPTION.rst
create mode 100644 base_remote/readme/USAGE.rst
create mode 100644 base_remote/static/description/index.html
diff --git a/base_remote/README.rst b/base_remote/README.rst
index c7f7f4525..8c0ebb16e 100644
--- a/base_remote/README.rst
+++ b/base_remote/README.rst
@@ -1,58 +1,81 @@
-.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
- :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
- :alt: License: AGPL-3
-
===========
Remote Base
===========
-This module allows to store all the connected remotes (external ip addresses) to odoo.
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! 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-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
+ :target: https://github.com/OCA/server-tools/tree/12.0/base_remote
+ :alt: OCA/server-tools
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_remote
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/149/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module allows to store all the connected remotes (external ip addresses) to Odoo.
It should be used with other modules in order to check remote's configurations.
+**Table of contents**
+
+.. contents::
+ :local:
+
Usage
=====
When installed, all remotes will be stored by `hostname` on `res.remote`.
They can be viewed on `Settings / Remotes`.
-The last Ip of the remote will be stored.
-
-.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
- :alt: Try me on Runbot
- :target: https://runbot.odoo-community.org/runbot/144/11.0
-
+The last IP of the remote will be stored.
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.
+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 `_.
+* Creu Blanca
Contributors
-------------
+~~~~~~~~~~~~
* Enric Tobella
-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-tools `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index f80f540cc..16301dce3 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -3,12 +3,12 @@
{
'name': "Remote Base",
- 'version': '11.0.1.0.4',
+ 'version': '12.0.1.0.0',
'category': 'Generic Modules/Base',
'author': "Creu Blanca, Odoo Community Association (OCA)",
'website': 'http://github.com/OCA/server-tools',
'license': 'AGPL-3',
- "depends": ['web', 'base'],
+ "depends": ['web'],
'data': [
'security/ir.model.access.csv',
'views/res_remote_views.xml',
diff --git a/base_remote/i18n/base_remote.pot b/base_remote/i18n/base_remote.pot
index 59aa20446..b3395eb4a 100644
--- a/base_remote/i18n/base_remote.pot
+++ b/base_remote/i18n/base_remote.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,22 +14,27 @@ msgstr ""
"Plural-Forms: \n"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_uid
+#: model:ir.model,name:base_remote.model_base
+msgid "Base"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__create_uid
msgid "Created by"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_date
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__create_date
msgid "Created on"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_display_name
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__display_name
msgid "Display Name"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_name
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__name
msgid "Hostname"
msgstr ""
@@ -39,37 +44,37 @@ msgid "Hostname must be unique"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_id
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__id
msgid "ID"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_in_network
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__in_network
msgid "In Network"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_ip
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__ip
msgid "Ip"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote___last_update
+#: model:ir.model.fields,field_description:base_remote.field_res_remote____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_uid
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_date
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_remote
-#: model:ir.ui.view,arch_db:base_remote.res_remote_form
+#: model_terms:ir.ui.view,arch_db:base_remote.res_remote_form
msgid "Remote"
msgstr ""
@@ -77,12 +82,12 @@ msgstr ""
#: model:ir.actions.act_window,name:base_remote.res_remote_action
#: model:ir.model,name:base_remote.model_res_remote
#: model:ir.ui.menu,name:base_remote.res_remote_menu
-#: model:ir.ui.view,arch_db:base_remote.res_remote_tree
+#: model_terms:ir.ui.view,arch_db:base_remote.res_remote_tree
msgid "Remotes"
msgstr ""
#. module: base_remote
-#: model:ir.model.fields,help:base_remote.field_res_remote_in_network
+#: model:ir.model.fields,help:base_remote.field_res_remote__in_network
msgid "Shows if the remote can be found through the socket"
msgstr ""
@@ -91,8 +96,3 @@ msgstr ""
msgid "Users"
msgstr ""
-#. module: base_remote
-#: model:ir.model,name:base_remote.model_base
-msgid "base"
-msgstr ""
-
diff --git a/base_remote/models/base.py b/base_remote/models/base.py
index b7c9b2fc6..c534ad13e 100644
--- a/base_remote/models/base.py
+++ b/base_remote/models/base.py
@@ -12,8 +12,6 @@ class Base(models.AbstractModel):
def remote(self):
try:
remote_addr = current_thread().environ["REMOTE_ADDR"]
- except KeyError:
- return self.env['res.remote']
- except AttributeError:
+ except (KeyError, AttributeError):
return self.env['res.remote']
return self.env['res.remote']._get_remote(remote_addr)
diff --git a/base_remote/models/res_remote.py b/base_remote/models/res_remote.py
index bd90ee4fe..0abc850da 100644
--- a/base_remote/models/res_remote.py
+++ b/base_remote/models/res_remote.py
@@ -40,7 +40,7 @@ class ResRemote(models.Model):
except socket.herror:
logging.warning('Remote with ip %s could not be found' % addr)
hostname = False
- remote = self.search([('name', '=ilike', hostname or addr)])
+ remote = self.search([('name', '=', hostname or addr)])
if not remote:
remote = self.create(self._create_vals(addr, hostname))
if remote.ip != addr:
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
index 77fab1b6e..50996a77e 100644
--- a/base_remote/models/res_users.py
+++ b/base_remote/models/res_users.py
@@ -3,7 +3,9 @@
from threading import current_thread
from odoo import api, models, SUPERUSER_ID
+from odoo.exceptions import AccessDenied
from odoo.service import wsgi_server
+from odoo.tools import config
class ResUsers(models.Model):
@@ -29,9 +31,13 @@ class ResUsers(models.Model):
with cls.pool.cursor() as cr:
env = api.Environment(cr, SUPERUSER_ID, {})
remote = env["res.users"].remote
- if remote:
+ if not config['test_enable']:
remote.ensure_one()
- return method()
+ result = method()
+ if not result:
+ # Force exception to record auth failure
+ raise AccessDenied()
+ return result
# Override all auth-related core methods
@classmethod
diff --git a/base_remote/readme/CONTRIBUTORS.rst b/base_remote/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..93ec993e0
--- /dev/null
+++ b/base_remote/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Enric Tobella
diff --git a/base_remote/readme/DESCRIPTION.rst b/base_remote/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..01d99917a
--- /dev/null
+++ b/base_remote/readme/DESCRIPTION.rst
@@ -0,0 +1,2 @@
+This module allows to store all the connected remotes (external ip addresses) to Odoo.
+It should be used with other modules in order to check remote's configurations.
\ No newline at end of file
diff --git a/base_remote/readme/USAGE.rst b/base_remote/readme/USAGE.rst
new file mode 100644
index 000000000..52ab7c552
--- /dev/null
+++ b/base_remote/readme/USAGE.rst
@@ -0,0 +1,3 @@
+When installed, all remotes will be stored by `hostname` on `res.remote`.
+They can be viewed on `Settings / Remotes`.
+The last IP of the remote will be stored.
diff --git a/base_remote/static/description/index.html b/base_remote/static/description/index.html
new file mode 100644
index 000000000..ebdb73884
--- /dev/null
+++ b/base_remote/static/description/index.html
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+Remote Base
+
+
+
+
+
Remote Base
+
+
+

+
This module allows to store all the connected remotes (external ip addresses) to Odoo.
+It should be used with other modules in order to check remote鈥檚 configurations.
+
Table of contents
+
+
+
+
When installed, all remotes will be stored by hostname on res.remote.
+They can be viewed on Settings / Remotes.
+The last IP of the remote will be stored.
+
+
+
+
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-tools project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/base_remote/tests/test_remote.py b/base_remote/tests/test_remote.py
index 33876950d..4eaa0b08b 100644
--- a/base_remote/tests/test_remote.py
+++ b/base_remote/tests/test_remote.py
@@ -17,8 +17,7 @@ from odoo.tests.common import at_install, HttpCase, post_install
class TestRemote(HttpCase):
def setUp(self):
super().setUp()
- # HACK https://github.com/odoo/odoo/issues/24183
- # TODO Remove in v12
+
# Complex password to avoid conflicts with `password_security`
self.good_password = "Admin$%02584"
self.data_demo = {
From 92884297a9f963aae1e13320469a254137b0407b Mon Sep 17 00:00:00 2001
From: Jaime Arroyo
Date: Fri, 17 Apr 2020 08:58:57 +0200
Subject: [PATCH 08/16] [12.0][FIX] base_remote: search =ilike
base_remote 12.0.1.0.1
Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.
Translation: server-tools-12.0/server-tools-12.0-base_remote
Translate-URL: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_remote/
---
base_remote/__manifest__.py | 2 +-
base_remote/i18n/es.po | 39 +++++++++++++++++---------------
base_remote/models/res_remote.py | 2 +-
3 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index 16301dce3..1613ac032 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': "Remote Base",
- 'version': '12.0.1.0.0',
+ 'version': '12.0.1.0.1',
'category': 'Generic Modules/Base',
'author': "Creu Blanca, Odoo Community Association (OCA)",
'website': 'http://github.com/OCA/server-tools',
diff --git a/base_remote/i18n/es.po b/base_remote/i18n/es.po
index 900007684..410485323 100644
--- a/base_remote/i18n/es.po
+++ b/base_remote/i18n/es.po
@@ -1,6 +1,6 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * base_remote
+# * base_remote
#
msgid ""
msgstr ""
@@ -17,22 +17,27 @@ msgstr ""
"X-Generator: Weblate 3.0.1\n"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_uid
+#: model:ir.model,name:base_remote.model_base
+msgid "Base"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_create_date
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__create_date
msgid "Created on"
msgstr "Creado el"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_display_name
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_name
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__name
msgid "Hostname"
msgstr "Nombre del host"
@@ -42,37 +47,37 @@ msgid "Hostname must be unique"
msgstr "El nombre del host debe ser 煤nico"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_id
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__id
msgid "ID"
msgstr "ID"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_in_network
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__in_network
msgid "In Network"
msgstr "En la Red local"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_ip
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__ip
msgid "Ip"
msgstr "IP"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote___last_update
+#: model:ir.model.fields,field_description:base_remote.field_res_remote____last_update
msgid "Last Modified on"
msgstr "脷ltima actualizaci贸n por"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_uid
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__write_uid
msgid "Last Updated by"
msgstr "脷ltima actualizaci贸n por"
#. module: base_remote
-#: model:ir.model.fields,field_description:base_remote.field_res_remote_write_date
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__write_date
msgid "Last Updated on"
msgstr "脷ltima actualizaci贸n el"
#. module: base_remote
-#: model:ir.ui.view,arch_db:base_remote.res_remote_form
+#: model_terms:ir.ui.view,arch_db:base_remote.res_remote_form
msgid "Remote"
msgstr "Remoto"
@@ -80,12 +85,12 @@ msgstr "Remoto"
#: model:ir.actions.act_window,name:base_remote.res_remote_action
#: model:ir.model,name:base_remote.model_res_remote
#: model:ir.ui.menu,name:base_remote.res_remote_menu
-#: model:ir.ui.view,arch_db:base_remote.res_remote_tree
+#: model_terms:ir.ui.view,arch_db:base_remote.res_remote_tree
msgid "Remotes"
msgstr "Remotos"
#. module: base_remote
-#: model:ir.model.fields,help:base_remote.field_res_remote_in_network
+#: model:ir.model.fields,help:base_remote.field_res_remote__in_network
msgid "Shows if the remote can be found through the socket"
msgstr "Muestra si el remoto se pudo encontrar a trav茅s del socket"
@@ -94,7 +99,5 @@ msgstr "Muestra si el remoto se pudo encontrar a trav茅s del socket"
msgid "Users"
msgstr "Usuarios"
-#. module: base_remote
-#: model:ir.model,name:base_remote.model_base
-msgid "base"
-msgstr "base"
+#~ msgid "base"
+#~ msgstr "base"
diff --git a/base_remote/models/res_remote.py b/base_remote/models/res_remote.py
index 0abc850da..bd90ee4fe 100644
--- a/base_remote/models/res_remote.py
+++ b/base_remote/models/res_remote.py
@@ -40,7 +40,7 @@ class ResRemote(models.Model):
except socket.herror:
logging.warning('Remote with ip %s could not be found' % addr)
hostname = False
- remote = self.search([('name', '=', hostname or addr)])
+ remote = self.search([('name', '=ilike', hostname or addr)])
if not remote:
remote = self.create(self._create_vals(addr, hostname))
if remote.ip != addr:
From 3c22eb4eeed78f946331516458e249d95b3c4c50 Mon Sep 17 00:00:00 2001
From: Jaime Arroyo
Date: Mon, 20 Jul 2020 10:47:41 +0200
Subject: [PATCH 09/16] [IMP] base_remote: black, isort, prettier
---
base_remote/__manifest__.py | 23 +++++++---------
base_remote/models/__init__.py | 2 --
base_remote/models/base.py | 9 +++---
base_remote/models/res_remote.py | 35 ++++++++++--------------
base_remote/models/res_users.py | 11 ++++----
base_remote/readme/DESCRIPTION.rst | 2 +-
base_remote/tests/test_remote.py | 38 +++++++++++++-------------
base_remote/views/res_remote_views.xml | 27 ++++++++++--------
8 files changed, 70 insertions(+), 77 deletions(-)
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index 1613ac032..2a758f727 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -2,17 +2,14 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
- 'name': "Remote Base",
- 'version': '12.0.1.0.1',
- 'category': 'Generic Modules/Base',
- 'author': "Creu Blanca, Odoo Community Association (OCA)",
- 'website': 'http://github.com/OCA/server-tools',
- 'license': 'AGPL-3',
- "depends": ['web'],
- 'data': [
- 'security/ir.model.access.csv',
- 'views/res_remote_views.xml',
- ],
- 'installable': True,
- 'application': True,
+ "name": "Remote Base",
+ "version": "13.0.1.0.1",
+ "category": "Generic Modules/Base",
+ "author": "Creu Blanca, Odoo Community Association (OCA)",
+ "website": "http://github.com/OCA/server-tools",
+ "license": "AGPL-3",
+ "depends": ["web"],
+ "data": ["security/ir.model.access.csv", "views/res_remote_views.xml"],
+ "installable": True,
+ "application": True,
}
diff --git a/base_remote/models/__init__.py b/base_remote/models/__init__.py
index 11252a793..afa66d0dc 100644
--- a/base_remote/models/__init__.py
+++ b/base_remote/models/__init__.py
@@ -1,5 +1,3 @@
from . import base
from . import res_remote
from . import res_users
-
-
diff --git a/base_remote/models/base.py b/base_remote/models/base.py
index c534ad13e..cb128d5c0 100644
--- a/base_remote/models/base.py
+++ b/base_remote/models/base.py
@@ -1,17 +1,18 @@
# Copyright 2018 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import models
from threading import current_thread
+from odoo import models
+
class Base(models.AbstractModel):
- _inherit = 'base'
+ _inherit = "base"
@property
def remote(self):
try:
remote_addr = current_thread().environ["REMOTE_ADDR"]
except (KeyError, AttributeError):
- return self.env['res.remote']
- return self.env['res.remote']._get_remote(remote_addr)
+ return self.env["res.remote"]
+ return self.env["res.remote"]._get_remote(remote_addr)
diff --git a/base_remote/models/res_remote.py b/base_remote/models/res_remote.py
index bd90ee4fe..8e57d9bc1 100644
--- a/base_remote/models/res_remote.py
+++ b/base_remote/models/res_remote.py
@@ -1,36 +1,29 @@
# Copyright 2018 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import api, models, fields
-import socket
import logging
+import socket
+
+from odoo import api, fields, models
class ResRemote(models.Model):
- _name = 'res.remote'
- _description = 'Remotes'
+ _name = "res.remote"
+ _description = "Remotes"
- name = fields.Char(
- required=True,
- string='Hostname',
- index=True,
- readonly=True
- )
+ name = fields.Char(required=True, string="Hostname", index=True, readonly=True)
ip = fields.Char(required=True)
in_network = fields.Boolean(
- required=True,
- help='Shows if the remote can be found through the socket'
+ required=True, help="Shows if the remote can be found through the socket"
)
- _sql_constraints = [
- ('name_unique', 'unique(name)', 'Hostname must be unique')
- ]
+ _sql_constraints = [("name_unique", "unique(name)", "Hostname must be unique")]
@api.model
def _create_vals(self, addr, hostname):
return {
- 'name': hostname or addr,
- 'ip': addr,
- 'in_network': bool(hostname),
+ "name": hostname or addr,
+ "ip": addr,
+ "in_network": bool(hostname),
}
@api.model
@@ -38,12 +31,12 @@ class ResRemote(models.Model):
try:
hostname, alias, ips = socket.gethostbyaddr(addr)
except socket.herror:
- logging.warning('Remote with ip %s could not be found' % addr)
+ logging.warning("Remote with ip %s could not be found" % addr)
hostname = False
- remote = self.search([('name', '=ilike', hostname or addr)])
+ remote = self.search([("name", "=ilike", hostname or addr)])
if not remote:
remote = self.create(self._create_vals(addr, hostname))
if remote.ip != addr:
# IPs can change through time, but hostname should not change
- remote.write({'ip': addr})
+ remote.write({"ip": addr})
return remote
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
index 50996a77e..09d2c17b6 100644
--- a/base_remote/models/res_users.py
+++ b/base_remote/models/res_users.py
@@ -2,7 +2,8 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from threading import current_thread
-from odoo import api, models, SUPERUSER_ID
+
+from odoo import SUPERUSER_ID, api, models
from odoo.exceptions import AccessDenied
from odoo.service import wsgi_server
from odoo.tools import config
@@ -31,7 +32,7 @@ class ResUsers(models.Model):
with cls.pool.cursor() as cr:
env = api.Environment(cr, SUPERUSER_ID, {})
remote = env["res.users"].remote
- if not config['test_enable']:
+ if not config["test_enable"]:
remote.ensure_one()
result = method()
if not result:
@@ -43,8 +44,7 @@ class ResUsers(models.Model):
@classmethod
def _login(cls, db, login, password):
return cls._auth_check_remote(
- login,
- lambda: super(ResUsers, cls)._login(db, login, password),
+ login, lambda: super(ResUsers, cls)._login(db, login, password),
)
@classmethod
@@ -52,5 +52,6 @@ class ResUsers(models.Model):
return cls._auth_check_remote(
login,
lambda: super(ResUsers, cls).authenticate(
- db, login, password, user_agent_env),
+ db, login, password, user_agent_env
+ ),
)
diff --git a/base_remote/readme/DESCRIPTION.rst b/base_remote/readme/DESCRIPTION.rst
index 01d99917a..be5ce4d3f 100644
--- a/base_remote/readme/DESCRIPTION.rst
+++ b/base_remote/readme/DESCRIPTION.rst
@@ -1,2 +1,2 @@
This module allows to store all the connected remotes (external ip addresses) to Odoo.
-It should be used with other modules in order to check remote's configurations.
\ No newline at end of file
+It should be used with other modules in order to check remote's configurations.
diff --git a/base_remote/tests/test_remote.py b/base_remote/tests/test_remote.py
index 4eaa0b08b..85941f5cd 100644
--- a/base_remote/tests/test_remote.py
+++ b/base_remote/tests/test_remote.py
@@ -5,7 +5,7 @@ from mock import patch
from werkzeug.utils import redirect
from odoo import http
-from odoo.tests.common import at_install, HttpCase, post_install
+from odoo.tests.common import HttpCase, at_install, post_install
@at_install(False)
@@ -24,39 +24,39 @@ class TestRemote(HttpCase):
"login": "demo",
"password": "Demo%&/(908409**",
}
- self.remote_addr = '127.0.0.1'
+ self.remote_addr = "127.0.0.1"
with self.cursor() as cr:
env = self.env(cr)
# Make sure involved users have good passwords
env.user.password = self.good_password
- env["res.users"].search([
- ("login", "=", self.data_demo["login"]),
- ]).password = self.data_demo["password"]
- remote = self.env['res.remote'].search([
- ('ip', '=', self.remote_addr)
- ])
+ env["res.users"].search(
+ [("login", "=", self.data_demo["login"])]
+ ).password = self.data_demo["password"]
+ remote = self.env["res.remote"].search([("ip", "=", self.remote_addr)])
if remote:
remote.unlink()
def test_xmlrpc_login_ok(self, *args):
"""Test Login"""
data1 = self.data_demo
- self.assertTrue(self.xmlrpc_common.authenticate(
- self.env.cr.dbname, data1["login"], data1["password"], {}))
+ self.assertTrue(
+ self.xmlrpc_common.authenticate(
+ self.env.cr.dbname, data1["login"], data1["password"], {}
+ )
+ )
with self.cursor() as cr:
env = self.env(cr)
- self.assertTrue(
- env['res.remote'].search([('ip', '=', self.remote_addr)])
- )
+ self.assertTrue(env["res.remote"].search([("ip", "=", self.remote_addr)]))
def test_xmlrpc_login_failure(self, *args):
"""Test Login Failure"""
data1 = self.data_demo
- data1['password'] = 'Failure!'
- self.assertFalse(self.xmlrpc_common.authenticate(
- self.env.cr.dbname, data1["login"], data1["password"], {}))
+ data1["password"] = "Failure!"
+ self.assertFalse(
+ self.xmlrpc_common.authenticate(
+ self.env.cr.dbname, data1["login"], data1["password"], {}
+ )
+ )
with self.cursor() as cr:
env = self.env(cr)
- self.assertTrue(
- env['res.remote'].search([('ip', '=', self.remote_addr)])
- )
+ self.assertTrue(env["res.remote"].search([("ip", "=", self.remote_addr)]))
diff --git a/base_remote/views/res_remote_views.xml b/base_remote/views/res_remote_views.xml
index 143150afc..582ab9c24 100644
--- a/base_remote/views/res_remote_views.xml
+++ b/base_remote/views/res_remote_views.xml
@@ -7,15 +7,17 @@
@@ -25,8 +27,8 @@
res.remote
-
-
+
+
@@ -37,10 +39,11 @@
form
tree,form
-
-
+
From 4efa9ec5e0834bb1c57efd974961d9277a03dc4f Mon Sep 17 00:00:00 2001
From: Jaime Arroyo
Date: Mon, 20 Jul 2020 10:52:44 +0200
Subject: [PATCH 10/16] [13.0][MIG] base_remote
[UPD] Update base_remote.pot
---
base_remote/README.rst | 10 +++----
base_remote/__manifest__.py | 1 -
base_remote/i18n/base_remote.pot | 34 +++++++++++++++++++----
base_remote/models/res_users.py | 3 --
base_remote/static/description/index.html | 6 ++--
base_remote/views/res_remote_views.xml | 1 -
6 files changed, 37 insertions(+), 18 deletions(-)
diff --git a/base_remote/README.rst b/base_remote/README.rst
index 8c0ebb16e..564507bee 100644
--- a/base_remote/README.rst
+++ b/base_remote/README.rst
@@ -14,13 +14,13 @@ Remote Base
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
- :target: https://github.com/OCA/server-tools/tree/12.0/base_remote
+ :target: https://github.com/OCA/server-tools/tree/13.0/base_remote
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_remote
+ :target: https://translation.odoo-community.org/projects/server-tools-13-0/server-tools-13-0-base_remote
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/149/12.0
+ :target: https://runbot.odoo-community.org/runbot/149/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -46,7 +46,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.
@@ -76,6 +76,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-tools `_ project on GitHub.
+This module is part of the `OCA/server-tools `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_remote/__manifest__.py b/base_remote/__manifest__.py
index 2a758f727..ed66ae0e1 100644
--- a/base_remote/__manifest__.py
+++ b/base_remote/__manifest__.py
@@ -11,5 +11,4 @@
"depends": ["web"],
"data": ["security/ir.model.access.csv", "views/res_remote_views.xml"],
"installable": True,
- "application": True,
}
diff --git a/base_remote/i18n/base_remote.pot b/base_remote/i18n/base_remote.pot
index b3395eb4a..e889d8fc4 100644
--- a/base_remote/i18n/base_remote.pot
+++ b/base_remote/i18n/base_remote.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * base_remote
+# * base_remote
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"Last-Translator: <>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,6 +18,26 @@ msgstr ""
msgid "Base"
msgstr ""
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__changeset_change_ids
+msgid "Changeset Changes"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__changeset_ids
+msgid "Changesets"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__count_pending_changeset_changes
+msgid "Count Pending Changeset Changes"
+msgstr ""
+
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__count_pending_changesets
+msgid "Count Pending Changesets"
+msgstr ""
+
#. module: base_remote
#: model:ir.model.fields,field_description:base_remote.field_res_remote__create_uid
msgid "Created by"
@@ -39,7 +59,7 @@ msgid "Hostname"
msgstr ""
#. module: base_remote
-#: sql_constraint:res.remote:0
+#: model:ir.model.constraint,message:base_remote.constraint_res_remote_name_unique
msgid "Hostname must be unique"
msgstr ""
@@ -91,8 +111,12 @@ msgstr ""
msgid "Shows if the remote can be found through the socket"
msgstr ""
+#. module: base_remote
+#: model:ir.model.fields,field_description:base_remote.field_res_remote__user_can_see_changeset
+msgid "User Can See Changeset"
+msgstr ""
+
#. module: base_remote
#: model:ir.model,name:base_remote.model_res_users
msgid "Users"
msgstr ""
-
diff --git a/base_remote/models/res_users.py b/base_remote/models/res_users.py
index 09d2c17b6..7b04c6d25 100644
--- a/base_remote/models/res_users.py
+++ b/base_remote/models/res_users.py
@@ -12,9 +12,6 @@ from odoo.tools import config
class ResUsers(models.Model):
_inherit = "res.users"
- # HACK https://github.com/odoo/odoo/issues/24183
- # TODO Remove in v12, and use normal odoo.http.request to get details
- @api.model_cr
def _register_hook(self):
"""馃悞-patch XML-RPC controller to know remote address."""
super()._register_hook()
diff --git a/base_remote/static/description/index.html b/base_remote/static/description/index.html
index ebdb73884..82d763099 100644
--- a/base_remote/static/description/index.html
+++ b/base_remote/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module allows to store all the connected remotes (external ip addresses) to Odoo.
It should be used with other modules in order to check remote鈥檚 configurations.
Table of contents
@@ -394,7 +394,7 @@ The last IP of the remote will be stored.
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.
@@ -418,7 +418,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
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-tools project on GitHub.
+
This module is part of the OCA/server-tools project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_remote/views/res_remote_views.xml b/base_remote/views/res_remote_views.xml
index 582ab9c24..4eb9f75bd 100644
--- a/base_remote/views/res_remote_views.xml
+++ b/base_remote/views/res_remote_views.xml
@@ -36,7 +36,6 @@
Remotes
ir.actions.act_window
res.remote
- form
tree,form