diff --git a/muk_utils/__manifest__.py b/muk_utils/__manifest__.py index 8525a2e..3b5cea2 100644 --- a/muk_utils/__manifest__.py +++ b/muk_utils/__manifest__.py @@ -19,7 +19,7 @@ { "name": "MuK Utils", "summary": """Utility Features""", - "version": '12.0.1.4.8', + "version": '12.0.1.4.9', "category": 'Extra Tools', "license": "AGPL-3", "author": "MuK IT", diff --git a/muk_utils/models/mixins_hierarchy.py b/muk_utils/models/mixins_hierarchy.py index 0921c32..7700586 100644 --- a/muk_utils/models/mixins_hierarchy.py +++ b/muk_utils/models/mixins_hierarchy.py @@ -1,111 +1,112 @@ -################################################################################### -# -# Copyright (C) 2017 MuK IT GmbH -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -################################################################################### - -import json -import operator -import functools -import collections - -from odoo import models, fields, api - -class Hierarchy(models.AbstractModel): - - _name = 'muk_utils.mixins.hierarchy' - _description = 'Hierarchy Mixin' - - _parent_store = True - _parent_path_sudo = False - - #---------------------------------------------------------- - # Database - #---------------------------------------------------------- - - parent_path = fields.Char( - string="Parent Path", - index=True) - - @api.model - def _add_magic_fields(self): - super(Hierarchy, self)._add_magic_fields() - def add(name, field): - if name not in self._fields: - self._add_field(name, field) - add('parent_path_names', fields.Char( - _module=self._module, - compute='_compute_parent_path', - compute_sudo=self._parent_path_sudo, - string="Path Names", - readonly=True, - store=True, - automatic=True)) - add('parent_path_json', fields.Text( - _module=self._module, - compute='_compute_parent_path', - compute_sudo=self._parent_path_sudo, - string="Path Json", - readonly=True, - store=True, - automatic=True)) - - #---------------------------------------------------------- - # Read, View - #---------------------------------------------------------- - - @api.depends('parent_path') - def _compute_parent_path(self): - records = self.filtered(lambda record: record.parent_path) - paths = [list(map(int, rec.parent_path.split('/')[:-1])) for rec in records] - ids = paths and set(functools.reduce(operator.concat, paths)) or [] - data = dict(self.browse(ids)._filter_access('read').name_get()) - for record in records: - path_names = [""] - path_json = [] - for id in reversed(list(map(int, record.parent_path.split('/')[:-1]))): - if id not in data: - break - path_names.append(data[id]) - path_json.append({ - 'model': record._name, - 'name': data[id], - 'id': id, - }) - path_names.reverse() - path_json.reverse() - record.update({ - 'parent_path_names': '/'.join(path_names), - 'parent_path_json': json.dumps(path_json), - }) - - #---------------------------------------------------------- - # Create, Update, Delete - #---------------------------------------------------------- - - @api.multi - def write(self, vals): - if self._rec_name_fallback() in vals: - with self.env.norecompute(): - res = super(Hierarchy, self).write(vals) - domain = [('id', 'child_of', self.ids)] - records = self.sudo().search(domain) - records.modified(['parent_path']) - if self.env.recompute and self.env.context.get('recompute', True): - records.recompute() - return res - return super(Hierarchy, self).write(vals) +################################################################################### +# +# Copyright (C) 2017 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +import json +import operator +import functools +import collections + +from odoo import models, fields, api + +class Hierarchy(models.AbstractModel): + + _name = 'muk_utils.mixins.hierarchy' + _description = 'Hierarchy Mixin' + + _parent_store = True + _parent_path_sudo = False + _parent_path_store = False + + #---------------------------------------------------------- + # Database + #---------------------------------------------------------- + + parent_path = fields.Char( + string="Parent Path", + index=True) + + @api.model + def _add_magic_fields(self): + super(Hierarchy, self)._add_magic_fields() + def add(name, field): + if name not in self._fields: + self._add_field(name, field) + add('parent_path_names', fields.Char( + _module=self._module, + compute='_compute_parent_path', + compute_sudo=self._parent_path_sudo, + store=self._parent_path_store, + string="Path Names", + readonly=True, + automatic=True)) + add('parent_path_json', fields.Text( + _module=self._module, + compute='_compute_parent_path', + compute_sudo=self._parent_path_sudo, + store=self._parent_path_store, + string="Path Json", + readonly=True, + automatic=True)) + + #---------------------------------------------------------- + # Read, View + #---------------------------------------------------------- + + @api.depends('parent_path') + def _compute_parent_path(self): + records = self.filtered(lambda record: record.parent_path) + paths = [list(map(int, rec.parent_path.split('/')[:-1])) for rec in records] + ids = paths and set(functools.reduce(operator.concat, paths)) or [] + data = dict(self.browse(ids)._filter_access('read').name_get()) + for record in records: + path_names = [""] + path_json = [] + for id in reversed(list(map(int, record.parent_path.split('/')[:-1]))): + if id not in data: + break + path_names.append(data[id]) + path_json.append({ + 'model': record._name, + 'name': data[id], + 'id': id, + }) + path_names.reverse() + path_json.reverse() + record.update({ + 'parent_path_names': '/'.join(path_names), + 'parent_path_json': json.dumps(path_json), + }) + + #---------------------------------------------------------- + # Create, Update, Delete + #---------------------------------------------------------- + + @api.multi + def write(self, vals): + if self._rec_name_fallback() in vals: + with self.env.norecompute(): + res = super(Hierarchy, self).write(vals) + domain = [('id', 'child_of', self.ids)] + records = self.sudo().search(domain) + records.modified(['parent_path']) + if self.env.recompute and self.env.context.get('recompute', True): + records.recompute() + return res + return super(Hierarchy, self).write(vals) \ No newline at end of file