Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Syncing from upstream OCA/server-tools (17.0) #1615

Merged
merged 33 commits into from
Sep 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ca3cc34
Translated using Weblate (Spanish (Argentina))
ibuioli Sep 16, 2024
b653a41
Translated using Weblate (Spanish (Argentina))
ibuioli Sep 16, 2024
4060a18
Translated using Weblate (Spanish (Argentina))
ibuioli Sep 16, 2024
4a8dea0
session_db : store sessions in a database rather than in filestore
nseinlet Oct 3, 2017
c53859a
[MIG] session_db to 16.0
sbidoul Oct 29, 2022
87be2ec
session_db: use SESSION_LIFETIME constant
sbidoul Oct 29, 2022
5109801
session_db: do not update write_date on get
sbidoul Oct 29, 2022
249f488
session_db: declare maintainer
sbidoul Oct 29, 2022
5486d86
session_db: explain why such as module is useful
sbidoul Jan 17, 2023
3a75405
[UPD] Update session_db.pot
Jan 19, 2023
74fba61
[UPD] README.rst
OCA-git-bot Jan 19, 2023
c898568
[ADD] icon.png
OCA-git-bot Jan 19, 2023
35b8dbe
session_db 16.0.1.0.1
OCA-git-bot Jan 19, 2023
d49c691
session_db: improve resiliency to database errors
sbidoul Jan 21, 2023
894613b
session_db 16.0.1.0.2
OCA-git-bot Jan 23, 2023
182d44f
session_db: gevent and thread support
sbidoul Feb 10, 2023
71352e0
session_db: cosmetics
sbidoul Feb 10, 2023
69868a8
session_db: improve cursor release
sbidoul Feb 10, 2023
c7af2bd
session_db 16.0.1.0.3
OCA-git-bot Feb 21, 2023
6c241ea
session_db: reconnect if needed
sbidoul Mar 23, 2023
87ba744
session_db: add a few tests
sbidoul Mar 23, 2023
41264b9
session_db: refactor retry handling
sbidoul Mar 24, 2023
0349038
session_db: fix tests for v16 compatibility
sbidoul Mar 27, 2023
52b3973
session_db 16.0.1.0.4
OCA-git-bot Apr 11, 2023
bc2a383
Fixes the issue "PGSessionStore.vacuum() got an unexpected keyword ar…
Aug 16, 2023
8e08a55
session_db 16.0.1.0.5
OCA-git-bot Sep 1, 2023
c9a8c69
[UPD] README.rst
OCA-git-bot Sep 3, 2023
eeda231
[IMP] session_db: pre-commit auto fixes
sbidoul Nov 12, 2023
53586c9
[MIG] session_db: from 16.0 to 17.0
sbidoul Nov 12, 2023
93ab4d8
[IMP] session_db: remove roadmap
sbidoul Jul 22, 2024
95ed5f3
Merge PR #2754 into 17.0
OCA-git-bot Sep 17, 2024
633b320
[UPD] Update session_db.pot
Sep 17, 2024
5d11b9b
[BOT] post-merge updates
OCA-git-bot Sep 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ addon | version | maintainers | summary
[scheduler_error_mailer](scheduler_error_mailer/) | 17.0.1.0.0 | | Scheduler Error Mailer
[sentry](sentry/) | 17.0.1.0.0 | [![barsi](https://github.com/barsi.png?size=30px)](https://github.com/barsi) [![naglis](https://github.com/naglis.png?size=30px)](https://github.com/naglis) [![versada](https://github.com/versada.png?size=30px)](https://github.com/versada) [![moylop260](https://github.com/moylop260.png?size=30px)](https://github.com/moylop260) [![fernandahf](https://github.com/fernandahf.png?size=30px)](https://github.com/fernandahf) | Report Odoo errors to Sentry
[server_action_logging](server_action_logging/) | 17.0.1.0.0 | | Module that provides a logging mechanism for server actions
[session_db](session_db/) | 17.0.1.0.0 | [![sbidoul](https://github.com/sbidoul.png?size=30px)](https://github.com/sbidoul) | Store sessions in DB
[tracking_manager](tracking_manager/) | 17.0.1.0.3 | [![Kev-Roche](https://github.com/Kev-Roche.png?size=30px)](https://github.com/Kev-Roche) [![sebastienbeau](https://github.com/sebastienbeau.png?size=30px)](https://github.com/sebastienbeau) | This module tracks all fields of a model, including one2many and many2many ones.
[upgrade_analysis](upgrade_analysis/) | 17.0.1.0.0 | [![StefanRijnhart](https://github.com/StefanRijnhart.png?size=30px)](https://github.com/StefanRijnhart) [![legalsylvain](https://github.com/legalsylvain.png?size=30px)](https://github.com/legalsylvain) | Performs a difference analysis between modules installed on two different Odoo instances

Expand Down
10 changes: 5 additions & 5 deletions auditlog/i18n/es_AR.po
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-26 01:45+0000\n"
"PO-Revision-Date: 2023-01-01 21:45+0000\n"
"PO-Revision-Date: 2024-09-17 02:06+0000\n"
"Last-Translator: Ignacio Buioli <[email protected]>\n"
"Language-Team: Spanish (Argentina) (https://www.transifex.com/oca/"
"teams/23907/es_AR/)\n"
"Language-Team: Spanish (Argentina) (https://www.transifex.com/oca/teams/"
"23907/es_AR/)\n"
"Language: es_AR\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 4.14.1\n"
"X-Generator: Weblate 5.6.2\n"

#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__action_id
Expand Down Expand Up @@ -602,7 +602,7 @@ msgstr "Ver registros"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__user_ids
msgid "if no user is added then it will applicable for all users"
msgstr ""
msgstr "si no se agrega ningún usuario, se aplicará a todos los usuarios"

#~ msgid "Last Modified on"
#~ msgstr "Última modificación en"
Expand Down
10 changes: 5 additions & 5 deletions base_exception/i18n/es_AR.po
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-01 10:38+0000\n"
"PO-Revision-Date: 2023-01-16 03:17+0000\n"
"PO-Revision-Date: 2024-09-17 02:06+0000\n"
"Last-Translator: Ignacio Buioli <[email protected]>\n"
"Language-Team: Spanish (Argentina) (https://www.transifex.com/oca/"
"teams/23907/es_AR/)\n"
"Language-Team: Spanish (Argentina) (https://www.transifex.com/oca/teams/"
"23907/es_AR/)\n"
"Language: es_AR\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 4.14.1\n"
"X-Generator: Weblate 5.6.2\n"

#. module: base_exception
#: model_terms:ir.ui.view,arch_db:base_exception.view_exception_rule_form
Expand Down Expand Up @@ -78,7 +78,7 @@ msgstr ""
#. module: base_exception
#: model_terms:ir.ui.view,arch_db:base_exception.view_exception_rule_confirm
msgid "Close"
msgstr ""
msgstr "Cerrar"

#. module: base_exception
#: model:ir.model.fields,field_description:base_exception.field_exception_rule__create_uid
Expand Down
93 changes: 93 additions & 0 deletions session_db/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
====================
Store sessions in DB
====================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7f625ad3c63b7ad41974310cc447302e517eb7fe62290a60ceec8f0325b80853
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/17.0/session_db
: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-17-0/server-tools-17-0-session_db
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Store sessions in a database instead of the filesystem. This simplifies
the configuration of horizontally scalable deployments, by avoiding the
need for a distributed filesystem to store the Odoo sessions.

**Table of contents**

.. contents::
:local:

Usage
=====

Set this module in the server wide modules.

Set a ``SESSION_DB_URI`` environment variable as a full postgresql
connection string, like ``postgres://user:passwd@server/db`` or ``db``.

It is recommended to use a dedicated database for this module, and
possibly a dedicated postgres user for additional security.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/server-tools/issues/new?body=module:%20session_db%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Odoo SA
* ACSONE SA/NV

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

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.

.. |maintainer-sbidoul| image:: https://github.com/sbidoul.png?size=40px
:target: https://github.com/sbidoul
:alt: sbidoul

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-sbidoul|

This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/17.0/session_db>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions session_db/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import pg_session_store
8 changes: 8 additions & 0 deletions session_db/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "Store sessions in DB",
"version": "17.0.1.0.0",
"author": "Odoo SA,ACSONE SA/NV,Odoo Community Association (OCA)",
"license": "LGPL-3",
"website": "https://github.com/OCA/server-tools",
"maintainers": ["sbidoul"],
}
13 changes: 13 additions & 0 deletions session_db/i18n/session_db.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.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"
169 changes: 169 additions & 0 deletions session_db/pg_session_store.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Copyright (c) Odoo SA 2017
# @author Nicolas Seinlet
# Copyright (c) ACSONE SA 2022
# @author Stéphane Bidoul
import json
import logging
import os

import psycopg2

import odoo
from odoo import http
from odoo.tools._vendor import sessions
from odoo.tools.func import lazy_property

_logger = logging.getLogger(__name__)

lock = None
if odoo.evented:
import gevent.lock

lock = gevent.lock.RLock()
elif odoo.tools.config["workers"] == 0:
import threading

lock = threading.RLock()


def with_lock(func):
def wrapper(*args, **kwargs):
try:
if lock is not None:
lock.acquire()
return func(*args, **kwargs)
finally:
if lock is not None:
lock.release()

return wrapper


def with_cursor(func):
def wrapper(self, *args, **kwargs):
tries = 0
while True:
tries += 1
try:
self._ensure_connection()
return func(self, *args, **kwargs)
except (psycopg2.InterfaceError, psycopg2.OperationalError):
self._close_connection()
if tries > 4:
_logger.warning(
"session_db operation try %s/5 failed, aborting", tries
)
raise
_logger.info("session_db operation try %s/5 failed, retrying", tries)

return wrapper


class PGSessionStore(sessions.SessionStore):
def __init__(self, uri, session_class=None):
super().__init__(session_class)
self._uri = uri
self._cr = None
self._open_connection()
self._setup_db()

def __del__(self):
self._close_connection()

@with_lock
def _ensure_connection(self):
if self._cr is None:
self._open_connection()

@with_lock
def _open_connection(self):
self._close_connection()
cnx = odoo.sql_db.db_connect(self._uri, allow_uri=True)
self._cr = cnx.cursor()
self._cr._cnx.autocommit = True

@with_lock
def _close_connection(self):
"""Return cursor to the pool."""
if self._cr is not None:
try:
self._cr.close()
except Exception: # pylint: disable=except-pass
pass
self._cr = None

@with_lock
@with_cursor
def _setup_db(self):
self._cr.execute(
"""
CREATE TABLE IF NOT EXISTS http_sessions (
sid varchar PRIMARY KEY,
write_date timestamp without time zone NOT NULL,
payload text NOT NULL
)
"""
)

@with_lock
@with_cursor
def save(self, session):
payload = json.dumps(dict(session))
self._cr.execute(
"""
INSERT INTO http_sessions(sid, write_date, payload)
VALUES (%(sid)s, now() at time zone 'UTC', %(payload)s)
ON CONFLICT (sid)
DO UPDATE SET payload = %(payload)s,
write_date = now() at time zone 'UTC'
""",
dict(sid=session.sid, payload=payload),
)

@with_lock
@with_cursor
def delete(self, session):
self._cr.execute("DELETE FROM http_sessions WHERE sid=%s", (session.sid,))

@with_lock
@with_cursor
def get(self, sid):
self._cr.execute("SELECT payload FROM http_sessions WHERE sid=%s", (sid,))
try:
data = json.loads(self._cr.fetchone()[0])
except Exception:
return self.new()

return self.session_class(data, sid, False)

# This method is not part of the Session interface but is called nevertheless,
# so let's get it from FilesystemSessionStore.
rotate = http.FilesystemSessionStore.rotate

@with_lock
@with_cursor
def vacuum(self, max_lifetime=http.SESSION_LIFETIME):
self._cr.execute(
"DELETE FROM http_sessions "
"WHERE now() at time zone 'UTC' - write_date > %s",
(f"{max_lifetime} seconds",),
)


_original_session_store = http.root.__class__.session_store


@lazy_property
def session_store(self):
session_db_uri = os.environ.get("SESSION_DB_URI")
if session_db_uri:
_logger.debug("HTTP sessions stored in: db")
return PGSessionStore(session_db_uri, session_class=http.Session)
return _original_session_store.__get__(self, self.__class__)


# Monkey patch of standard methods
_logger.debug("Monkey patching session store")
http.root.__class__.session_store = session_store
# Reset the lazy property cache
vars(http.root).pop("session_store", None)
3 changes: 3 additions & 0 deletions session_db/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
3 changes: 3 additions & 0 deletions session_db/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Store sessions in a database instead of the filesystem. This simplifies
the configuration of horizontally scalable deployments, by avoiding the
need for a distributed filesystem to store the Odoo sessions.
7 changes: 7 additions & 0 deletions session_db/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Set this module in the server wide modules.

Set a `SESSION_DB_URI` environment variable as a full postgresql
connection string, like `postgres://user:passwd@server/db` or `db`.

It is recommended to use a dedicated database for this module, and
possibly a dedicated postgres user for additional security.
Binary file added session_db/static/description/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading