38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import models, api
|
|
|
|
class AnalyticMixin(models.AbstractModel):
|
|
_inherit = 'analytic.mixin'
|
|
|
|
def _sanitize_values(self, vals, decimal_precision):
|
|
if 'analytic_distribution' in vals:
|
|
dist = vals.get('analytic_distribution')
|
|
if dist:
|
|
if isinstance(dist, str):
|
|
import json
|
|
try:
|
|
dist = json.loads(dist)
|
|
except Exception:
|
|
dist = {}
|
|
vals['analytic_distribution'] = self._clean_analytic_distribution(dist) or False
|
|
else:
|
|
vals['analytic_distribution'] = False
|
|
return super()._sanitize_values(vals, decimal_precision)
|
|
|
|
@api.model
|
|
def _clean_analytic_distribution(self, dist):
|
|
if not dist or not isinstance(dist, dict):
|
|
return {}
|
|
clean_dist = {}
|
|
for key, val in dist.items():
|
|
str_key = str(key)
|
|
if str_key == '__update__':
|
|
clean_dist[str_key] = val
|
|
elif str_key:
|
|
if all(part.isdigit() for part in str_key.split(',')):
|
|
try:
|
|
clean_dist[str_key] = float(val)
|
|
except (TypeError, ValueError):
|
|
pass
|
|
return clean_dist
|