This commit is contained in:
2026-07-25 09:13:12 +02:00
parent 9fa91f1255
commit 99763f10f2
5 changed files with 103 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ import base64
import csv
import datetime
import decimal
import json
import random
import time
import warnings
@@ -193,6 +194,33 @@ class ModelStorage(Model):
resource=record, event=event, target=target, user=user,
**extra))
@staticmethod
def _json_log_value(value):
if isinstance(value, (datetime.date, datetime.datetime, datetime.time)):
return value.isoformat()
if isinstance(value, decimal.Decimal):
return str(value)
if isinstance(value, bytes):
return '<binary>'
if isinstance(value, Model):
return str(value)
if isinstance(value, (list, tuple)):
return [ModelStorage._json_log_value(v) for v in value]
if isinstance(value, dict):
return {
str(k): ModelStorage._json_log_value(v)
for k, v in value.items()
}
return value
@classmethod
def _log_value_text(cls, values):
values = {
name: cls._json_log_value(value)
for name, value in values.items()
}
return json.dumps(values, sort_keys=True, ensure_ascii=False)
@classmethod
def create(cls, vlist):
'''
@@ -267,7 +295,20 @@ class ModelStorage(Model):
all_records += records
all_fields.update(values.keys())
if transaction.check_access and values:
cls.log(records, 'write', ','.join(sorted(values.keys())))
fields_names = list(sorted(values.keys()))
with without_check_access():
old_values = {
row['id']: {
name: row.get(name)
for name in fields_names
}
for row in cls.read(
[r.id for r in records], fields_names)}
for record in records:
cls.log([record], 'write', ','.join(fields_names),
old_values=cls._log_value_text(
old_values.get(record.id, {})),
new_values=cls._log_value_text(values))
ModelAccess.check(cls.__name__, 'write')
ModelFieldAccess.check(cls.__name__, all_fields, 'write')