19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:02 +01:00
parent 62d197ac8b
commit 184bb0e321
667 changed files with 691406 additions and 239886 deletions

View file

@ -1,63 +1,82 @@
import base64
import json
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
from odoo import Command, _, api, fields, models
from odoo.tools import file_open
class SpreadsheetDashboard(models.Model):
_name = 'spreadsheet.dashboard'
_description = 'Spreadsheet Dashboard'
_inherit = ["spreadsheet.mixin"]
_order = 'sequence'
name = fields.Char(required=True)
dashboard_group_id = fields.Many2one('spreadsheet.dashboard.group', required=True)
data = fields.Binary(required=True, default=lambda self: self._default_data())
raw = fields.Binary(compute='_compute_raw', inverse='_inverse_raw')
thumbnail = fields.Binary()
name = fields.Char(required=True, translate=True)
dashboard_group_id = fields.Many2one('spreadsheet.dashboard.group', required=True, index=True)
sequence = fields.Integer()
sample_dashboard_file_path = fields.Char(export_string_translation=False)
is_published = fields.Boolean(default=True)
company_ids = fields.Many2many('res.company', string="Companies")
group_ids = fields.Many2many('res.groups', default=lambda self: self.env.ref('base.group_user'))
favorite_user_ids = fields.Many2many(
'res.users',
domain=lambda self: [('id', '=', self.env.uid)],
string='Favorite Users',
help='Users who have favorited this dashboard'
)
is_favorite = fields.Boolean(
compute='_compute_is_favorite',
string='Is Favorite',
help='Indicates whether the dashboard is favorited by the current user'
)
main_data_model_ids = fields.Many2many('ir.model', copy=False)
def _default_data(self):
data = json.dumps(self._empty_workbook_data())
return base64.b64encode(data.encode())
def _empty_workbook_data(self):
"""Create an empty spreadsheet workbook.
The sheet name should be the same for all users to allow consistent references
in formulas. It is translated for the user creating the spreadsheet.
"""
return {
"version": 1,
"sheets": [
{
"id": "sheet1",
"name": _("Sheet1"),
}
]
}
@api.depends('data')
def _compute_raw(self):
@api.depends_context('uid')
@api.depends('favorite_user_ids')
def _compute_is_favorite(self):
for dashboard in self:
dashboard.raw = base64.decodebytes(dashboard.data)
dashboard.is_favorite = self.env.uid in dashboard.favorite_user_ids.ids
def _inverse_raw(self):
for dashboard in self:
dashboard.data = base64.encodebytes(dashboard.raw)
@api.onchange('data')
def _onchange_data_(self):
if self.data:
try:
data_str = base64.b64decode(self.data).decode('utf-8')
json.loads(data_str)
except:
raise ValidationError(_('Invalid JSON Data'))
def copy(self, default=None):
def action_toggle_favorite(self):
self.ensure_one()
if default is None:
default = {}
current_user_id = self.env.uid
if current_user_id in self.favorite_user_ids.ids:
self.sudo().favorite_user_ids = [Command.unlink(current_user_id)]
else:
self.sudo().favorite_user_ids = [Command.link(current_user_id)]
def _get_serialized_readonly_dashboard(self):
snapshot = json.loads(self.spreadsheet_data)
user_locale = self.env['res.lang']._get_user_spreadsheet_locale()
snapshot.setdefault('settings', {})['locale'] = user_locale
default_currency = self.env['res.currency'].get_company_currency_for_spreadsheet()
return json.dumps({
'snapshot': snapshot,
'revisions': [],
'default_currency': default_currency,
'translation_namespace': self._get_dashboard_translation_namespace(),
})
def _get_sample_dashboard(self):
try:
with file_open(self.sample_dashboard_file_path) as f:
return json.load(f)
except FileNotFoundError:
return
def _dashboard_is_empty(self):
return any(self.env[model].search_count([], limit=1) == 0 for model in self.sudo().main_data_model_ids.mapped("model"))
def _get_dashboard_translation_namespace(self):
data = self.env['ir.model.data'].sudo().search([
('model', '=', self._name),
('res_id', 'in', self.ids),
], limit=1)
return data.module
def copy_data(self, default=None):
default = dict(default or {})
vals_list = super().copy_data(default=default)
if 'name' not in default:
default['name'] = _("%s (copy)") % self.name
return super().copy(default=default)
for dashboard, vals in zip(self, vals_list):
vals['name'] = _("%s (copy)", dashboard.name)
return vals_list