diff --git a/partner_relations_in_tab/__init__.py b/partner_relations_in_tab/__init__.py index 4488d640a..620f5ebc8 100644 --- a/partner_relations_in_tab/__init__.py +++ b/partner_relations_in_tab/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- # Copyright 2014-2018 Therp BV . # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import tablib from . import model diff --git a/partner_relations_in_tab/model/res_partner.py b/partner_relations_in_tab/model/res_partner.py index 618fe0663..743f7ad37 100644 --- a/partner_relations_in_tab/model/res_partner.py +++ b/partner_relations_in_tab/model/res_partner.py @@ -4,105 +4,18 @@ import logging from lxml import etree -from openerp.osv.orm import Model, transfer_modifiers_to_node -from openerp.osv import expression, fields +from openerp.osv import orm, fields from openerp.tools.translate import _ -from openerp import SUPERUSER_ID +from ..tablib import Tab -_logger = logging.getLogger(__name__) # pylint: disable=invalid-name -NAME_PREFIX = 'relation_ids_tab' - - -class Tab(object): - - def __init__(self, source, side): - """Create tab from source. - - In this version source can be assumed to be a partner.relation.type. - """ - self.id = source.id - self.side = side - if side == 'left': - self.name = source.name - self.contact_type = source.contact_type_left - self.category_id = source.partner_category_left - self.other_contact_type = source.contact_type_right - self.other_category_id = source.partner_category_right - self.other_side = 'right' - else: - self.name = source.name_inverse - self.contact_type = source.contact_type_right - self.category_id = source.partner_category_right - self.other_contact_type = source.contact_type_left - self.other_category_id = source.partner_category_left - self.other_side = 'left' - - def get_fieldname(self): - return '%s_%s_%s' % (NAME_PREFIX, self.id, self.side) - - def get_domain(self): - return [('type_id', '=', self.id)] - - def create_page(self): - tab_page = etree.Element('page') - self._set_page_attrs(tab_page) - field = etree.Element( - 'field', - name=self.get_fieldname(), - context=( - '{"default_type_id": %s, "default_%s_partner_id": id, ' - '"active_test": False}') % (self.id, self.side)) - tab_page.append(field) - tree = etree.Element('tree', editable='bottom') - field.append(tree) - tree.append(etree.Element( - 'field', name='%s_partner_id' % self.side, invisible='True')) - tree.append(etree.Element( - 'field', - string=_('Partner'), - domain=repr(self._get_other_partner_domain()), - widget='many2one_clickable', - name='%s_partner_id' % self.other_side)) - tree.append(etree.Element('field', name='date_start')) - tree.append(etree.Element('field', name='date_end')) - tree.append(etree.Element('field', name='active')) - tree.append(etree.Element('field', name='type_id', invisible='True')) - return tab_page - - def _get_other_partner_domain(self): - partner_domain = [] - if self.other_contact_type == 'c': - partner_domain.append(('is_company', '=', True)) - if self.other_contact_type == 'p': - partner_domain.append(('is_company', '=', False)) - if self.other_category_id: - partner_domain.append( - ('category_id', 'child_of', self.other_category_id)) - return partner_domain - def _set_page_attrs(self, tab_page): - tab_page.set('string', self.name) - invisible = [('id', '=', False)] - if self.contact_type: - invisible = expression.OR([ - invisible, - [('is_company', '=', self.contact_type != 'c')]]) - if self.category_id: - invisible = expression.OR([ - invisible, - [('category_id', '!=', self.category_id)]]) - attrs = {'invisible': invisible} - tab_page.set('attrs', repr(attrs)) - transfer_modifiers_to_node(attrs, tab_page) +_logger = logging.getLogger(__name__) # pylint: disable=invalid-name -class ResPartner(Model): +class ResPartner(orm.Model): _inherit = 'res.partner' - def _make_tab(self, source, side): - return Tab(source, side) - def _register_hook(self, cr): """This function is automatically called by Odoo on all models.""" self._update_tab_fields(cr) @@ -111,54 +24,34 @@ class ResPartner(Model): """Create a field for each tab that might be shown for a partner.""" deprecated_tab_fields = [ name for name in self._columns.copy() - if name.startswith(NAME_PREFIX)] + if Tab.is_tab_fieldname(name)] tabs = self._get_tabs(cr) for tab in tabs: - fieldname = tab.get_fieldname() - if fieldname in self._columns: - self._update_tab_field(tab) - else: - self._add_tab_field(tab) + fieldname = self._add_tab_field(tab) if fieldname in deprecated_tab_fields: deprecated_tab_fields.remove(fieldname) # not deprecated for fieldname in deprecated_tab_fields: self._delete_tab_field(fieldname) def _get_tabs(self, cr): - tabs = [] relation_type_model = self.pool['res.partner.relation.type'] - relation_type_domain = [ - '|', - ('own_tab_left', '=', True), - ('own_tab_right', '=', True)] - relation_type_ids = relation_type_model.search( - cr, SUPERUSER_ID, relation_type_domain) - for relation_type in relation_type_model.browse( - cr, SUPERUSER_ID, relation_type_ids): - if relation_type.own_tab_left: - new_tab = Tab(relation_type, 'left') - tabs.append(new_tab) - if relation_type.own_tab_right: - new_tab = Tab(relation_type, 'right') - tabs.append(new_tab) - return tabs + return relation_type_model.get_tabs(cr) def _add_tab_field(self, tab): + fieldname = tab.get_fieldname() field = fields.one2many( 'res.partner.relation', '%s_partner_id' % tab.side, string=tab.name, domain=tab.get_domain()) - fieldname = tab.get_fieldname() - _logger.info(_( - "Adding field %s to res.partner model.") % fieldname) + if fieldname in self._columns: + _logger.info(_( + "Updating field %s in res.partner model.") % fieldname) + else: + _logger.info(_( + "Adding field %s to res.partner model.") % fieldname) self._columns[fieldname] = field - - def _update_tab_field(self, tab): - fieldname = tab.get_fieldname() - _logger.info(_( - "Updating field %s in res.partner model.") % fieldname) - self._columns[fieldname].string = tab.name + return fieldname def _delete_tab_field(self, fieldname): _logger.info(_( diff --git a/partner_relations_in_tab/model/res_partner_relation_type.py b/partner_relations_in_tab/model/res_partner_relation_type.py index 8ec85515f..25ecfba15 100644 --- a/partner_relations_in_tab/model/res_partner_relation_type.py +++ b/partner_relations_in_tab/model/res_partner_relation_type.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- # Copyright 2014-2018 Therp BV . # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.osv.orm import Model -from openerp.osv import fields +from openerp.osv import fields, orm +from openerp import SUPERUSER_ID +from ..tablib import Tab -class ResPartnerRelationType(Model): + +class ResPartnerRelationType(orm.Model): _inherit = 'res.partner.relation.type' _columns = { @@ -18,18 +20,34 @@ class ResPartnerRelationType(Model): 'own_tab_right': False, } + def get_tabs(self, cr): + tabs = [] + tab_domain = [ + '|', + ('own_tab_left', '=', True), + ('own_tab_right', '=', True)] + tab_type_ids = self.search(cr, SUPERUSER_ID, tab_domain) + for this in self.browse(cr, SUPERUSER_ID, tab_type_ids): + if this.own_tab_left: + new_tab = Tab(this, 'left') + tabs.append(new_tab) + if this.own_tab_right: + new_tab = Tab(this, 'right') + tabs.append(new_tab) + return tabs + def create(self, cr, uid, vals, context=None): - relation_type_id = super(ResPartnerRelationType, self).create( + new_type_id = super(ResPartnerRelationType, self).create( cr, uid, vals, context=context) - relation_type = self.browse(cr, uid, relation_type_id, context=context) + this = self.browse(cr, uid, new_type_id, context=context) partner_model = self.pool['res.partner'] - if relation_type.own_tab_left: - tab = partner_model._make_tab(relation_type, 'left') - partner_model._add_tab_field(tab) - if relation_type.own_tab_right: - tab = partner_model._make_tab(relation_type, 'right') - partner_model._add_tab_field(tab) - return relation_type_id + if this.own_tab_left: + new_tab = Tab(this, 'left') + partner_model._add_tab_field(new_tab) + if this.own_tab_right: + new_tab = Tab(this, 'right') + partner_model._add_tab_field(new_tab) + return new_type_id def write(self, cr, uid, ids, vals, context=None): result = super(ResPartnerRelationType, self).write( diff --git a/partner_relations_in_tab/tablib/__init__.py b/partner_relations_in_tab/tablib/__init__.py new file mode 100644 index 000000000..68740b22c --- /dev/null +++ b/partner_relations_in_tab/tablib/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Therp BV . +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from .tab import Tab diff --git a/partner_relations_in_tab/tablib/tab.py b/partner_relations_in_tab/tablib/tab.py new file mode 100644 index 000000000..6fb8f5299 --- /dev/null +++ b/partner_relations_in_tab/tablib/tab.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Copyright 2014-2018 Therp BV . +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from lxml import etree + +from openerp.osv import expression +from openerp.osv.orm import transfer_modifiers_to_node +from openerp.tools.translate import _ + + +NAME_PREFIX = 'relation_ids_tab' + + +class Tab(object): + + def __init__(self, source, side): + """Create tab from source. + + In this version source can be assumed to be a partner.relation.type. + """ + self.id = source.id + self.side = side + if side == 'left': + self.name = source.name + self.contact_type = source.contact_type_left + self.category_id = source.partner_category_left + self.other_contact_type = source.contact_type_right + self.other_category_id = source.partner_category_right + self.other_side = 'right' + else: + self.name = source.name_inverse + self.contact_type = source.contact_type_right + self.category_id = source.partner_category_right + self.other_contact_type = source.contact_type_left + self.other_category_id = source.partner_category_left + self.other_side = 'left' + + @staticmethod + def is_tab_fieldname(name): + return name.startswith(NAME_PREFIX) + + def get_fieldname(self): + return '%s_%s_%s' % (NAME_PREFIX, self.id, self.side) + + def get_domain(self): + return [('type_id', '=', self.id)] + + def create_page(self): + tab_page = etree.Element('page') + self._set_page_attrs(tab_page) + field = etree.Element( + 'field', + name=self.get_fieldname(), + context=( + '{"default_type_id": %s, "default_%s_partner_id": id, ' + '"active_test": False}') % (self.id, self.side)) + tab_page.append(field) + tree = etree.Element('tree', editable='bottom') + field.append(tree) + tree.append(etree.Element( + 'field', name='%s_partner_id' % self.side, invisible='True')) + tree.append(etree.Element( + 'field', + string=_('Partner'), + domain=repr(self._get_other_partner_domain()), + widget='many2one_clickable', + name='%s_partner_id' % self.other_side)) + tree.append(etree.Element('field', name='date_start')) + tree.append(etree.Element('field', name='date_end')) + tree.append(etree.Element('field', name='active')) + tree.append(etree.Element('field', name='type_id', invisible='True')) + return tab_page + + def _get_other_partner_domain(self): + partner_domain = [] + if self.other_contact_type == 'c': + partner_domain.append(('is_company', '=', True)) + if self.other_contact_type == 'p': + partner_domain.append(('is_company', '=', False)) + if self.other_category_id: + partner_domain.append( + ('category_id', 'child_of', self.other_category_id.id)) + return partner_domain + + def _set_page_attrs(self, tab_page): + tab_page.set('string', self.name) + invisible = [('id', '=', False)] + if self.contact_type: + invisible = expression.OR([ + invisible, + [('is_company', '=', self.contact_type != 'c')]]) + if self.category_id: + invisible = expression.OR([ + invisible, + [('category_id', '!=', self.category_id.id)]]) + attrs = {'invisible': invisible} + tab_page.set('attrs', repr(attrs)) + transfer_modifiers_to_node(attrs, tab_page)