17.0 vanilla

This commit is contained in:
Ernad Husremovic 2025-10-03 18:05:14 +02:00
parent 2e65bf056a
commit df627a6bba
328 changed files with 578149 additions and 759311 deletions

View file

@ -160,6 +160,13 @@ def _create_empty_database(name):
_logger.warning("Unable to create PostgreSQL extensions : %s", e)
_check_faketime_mode(name)
# restore legacy behaviour on pg15+
try:
db = odoo.sql_db.db_connect(name)
with db.cursor() as cr:
cr.execute("GRANT CREATE ON SCHEMA PUBLIC TO PUBLIC")
except psycopg2.Error as e:
_logger.warning("Unable to make public schema public-accessible: %s", e)
@check_db_management_enabled
def exp_create_database(db_name, demo, lang, user_password='admin', login='admin', country_code=None, phone=None):

View file

@ -83,7 +83,7 @@ def execute(db, uid, obj, method, *args, **kw):
with odoo.registry(db).cursor() as cr:
res = execute_cr(cr, uid, obj, method, *args, **kw)
if res is None:
_logger.info('The method %s of the object %s can not return `None` !', method, obj)
_logger.info('The method %s of the object %s can not return `None`!', method, obj)
return res

View file

@ -17,6 +17,7 @@ import threading
import time
import unittest
import contextlib
from email.utils import parsedate_to_datetime
from io import BytesIO
from itertools import chain
@ -120,6 +121,11 @@ class BaseWSGIServerNoBind(LoggingBaseWSGIServerMixIn, werkzeug.serving.BaseWSGI
class RequestHandler(werkzeug.serving.WSGIRequestHandler):
def __init__(self, *args, **kwargs):
self._sent_date_header = None
self._sent_server_header = None
super().__init__(*args, **kwargs)
def setup(self):
# timeout to avoid chrome headless preconnect during tests
if config['test_enable'] or config['test_file']:
@ -148,6 +154,33 @@ class RequestHandler(werkzeug.serving.WSGIRequestHandler):
# Do not keep processing requests.
self.close_connection = True
return
if keyword.casefold() == 'date':
if self._sent_date_header is None:
self._sent_date_header = value
elif self._sent_date_header == value:
return # don't send the same header twice
else:
sent_datetime = parsedate_to_datetime(self._sent_date_header)
new_datetime = parsedate_to_datetime(value)
if sent_datetime == new_datetime:
return # don't send the same date twice (differ in format)
if abs((sent_datetime - new_datetime).total_seconds()) <= 1:
return # don't send the same date twice (jitter of 1 second)
_logger.warning(
"sending two different Date response headers: %r vs %r",
self._sent_date_header, value)
if keyword.casefold() == 'server':
if self._sent_server_header is None:
self._sent_server_header = value
elif self._sent_server_header == value:
return # don't send the same header twice
else:
_logger.warning(
"sending two different Server response headers: %r vs %r",
self._sent_server_header, value)
super().send_header(keyword, value)
def end_headers(self, *a, **kw):
@ -944,7 +977,10 @@ class PreforkServer(CommonServer):
if config['http_enable']:
# listen to socket
_logger.info('HTTP service (werkzeug) running on %s:%s', self.interface, self.port)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
family = socket.AF_INET
if ':' in self.interface:
family = socket.AF_INET6
self.socket = socket.socket(family, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.setblocking(0)
self.socket.bind((self.interface, self.port))