changeset 38bd66006727 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=38bd66006727
description:
Reset less often the user sessions
issue10202
review341741060
diffstat:
CHANGELOG | 1 +
trytond/ir/session.py | 42 +++++++++++++++++++++++++++++-------------
2 files changed, 30 insertions(+), 13 deletions(-)
diffs (101 lines):
diff -r 15ef08043b65 -r 38bd66006727 CHANGELOG
--- a/CHANGELOG Sun Oct 02 00:22:56 2022 +0200
+++ b/CHANGELOG Mon Oct 03 00:06:41 2022 +0200
@@ -1,3 +1,4 @@
+* Reset the user sessions less often
* Add straight values to wizard state view
* Add strip option to Char fields
* Strip only one wildcard
diff -r 15ef08043b65 -r 38bd66006727 trytond/ir/session.py
--- a/trytond/ir/session.py Sun Oct 02 00:22:56 2022 +0200
+++ b/trytond/ir/session.py Mon Oct 03 00:06:41 2022 +0200
@@ -4,9 +4,14 @@
import json
from secrets import token_hex
+from trytond.cache import Cache
from trytond.config import config
from trytond.model import ModelSQL, fields
+_session_timeout = datetime.timedelta(
+ seconds=config.getint('session', 'timeout'))
+_reset_interval = _session_timeout // 10
+
class Session(ModelSQL):
"Session"
@@ -14,6 +19,7 @@
_rec_name = 'key'
key = fields.Char('Key', required=True, select=True, strip=False)
+ _session_reset_cache = Cache('ir_session.session_reset', context=False)
@classmethod
def __setup__(cls):
@@ -32,6 +38,13 @@
return token_hex(nbytes)
@classmethod
+ def write(cls, *args):
+ super().write(*args)
+ for sessions in args[0:None:2]:
+ for session in sessions:
+ cls._session_reset_cache.set(session.key, session.write_date)
+
+ @classmethod
def new(cls, values=None):
"Create a new session for the transaction user and return the key."
if values is None:
@@ -68,17 +81,20 @@
('create_uid', '=', user),
domain or [],
])
- find = None
+ find, last_reset = None, None
to_delete = []
for session in sessions:
if abs(session.create_date - now) < timeout:
if session.key == key:
find = True
+ last_reset = session.write_date or session.create_date
else:
if find is None and session.key == key:
find = False
to_delete.append(session)
cls.delete(to_delete)
+ if find:
+ cls._session_reset_cache.set(key, last_reset)
return find
@classmethod
@@ -105,18 +121,18 @@
def reset(cls, key, domain=None):
"Reset key session timestamp"
now = datetime.datetime.now()
- timeout = datetime.timedelta(
- seconds=config.getint('session', 'timeout'))
- timestamp = now - timeout
- sessions = cls.search([
- ('key', '=', key),
- ['OR',
- ('create_date', '>=', timestamp),
- ('write_date', '>=', timestamp),
- ],
- domain or [],
- ])
- cls.write(sessions, {})
+ last_reset = cls._session_reset_cache.get(key)
+ if last_reset is None or (now - _reset_interval) > last_reset:
+ timestamp = now - _session_timeout
+ sessions = cls.search([
+ ('key', '=', key),
+ ['OR',
+ ('create_date', '>=', timestamp),
+ ('write_date', '>=', timestamp),
+ ],
+ domain or [],
+ ])
+ cls.write(sessions, {})
@classmethod
def clear(cls, users, domain=None):