diff --git a/partner_relations_in_tab/__init__.py b/partner_relations_in_tab/__init__.py new file mode 100644 index 000000000..fcf92314d --- /dev/null +++ b/partner_relations_in_tab/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# 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 . +# +############################################################################## +from . import model diff --git a/partner_relations_in_tab/__openerp__.py b/partner_relations_in_tab/__openerp__.py new file mode 100644 index 000000000..44c2baa30 --- /dev/null +++ b/partner_relations_in_tab/__openerp__.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# 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 . +# +############################################################################## +{ + "name": "Show partner relations in own tab", + "version": "1.0", + "author": "Therp BV", + "license": "AGPL-3", + "complexity": "normal", + "description": """ +This module adds the possibility to show certain partner relations in its own +tab instead of the list of all relations. This can be useful if certain +relation types are regularly used and should be overseeable at a glace. + """, + "category": "Customer Relationship Management", + "depends": [ + 'partner_relations', + 'web_compute_domain_x2many', + ], + "data": [ + "view/res_partner_relation_type.xml", + ], + "js": [ + ], + "css": [ + ], + "qweb": [ + ], + "auto_install": False, + "installable": True, + "application": False, + "external_dependencies": { + 'python': [], + }, +} diff --git a/partner_relations_in_tab/i18n/nl.po b/partner_relations_in_tab/i18n/nl.po new file mode 100644 index 000000000..3382c1442 --- /dev/null +++ b/partner_relations_in_tab/i18n/nl.po @@ -0,0 +1,43 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * partner_relations_in_tab +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-25 09:08+0000\n" +"PO-Revision-Date: 2014-11-25 09:08+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: partner_relations_in_tab +#: field:res.partner,id:0 +msgid "Id" +msgstr "Id" + +#. module: partner_relations_in_tab +#: code:_description:0 +#: model:ir.model,name:partner_relations_in_tab.model_res_partner_relation_type +#, python-format +msgid "Parter relation type" +msgstr "Type relatiekoppeling" + +#. module: partner_relations_in_tab +#: code:_description:0 +#: code:addons/partner_relations_in_tab/model/res_partner.py:99 +#: model:ir.model,name:partner_relations_in_tab.model_res_partner +#, python-format +msgid "Partner" +msgstr "Relatie" + +#. module: partner_relations_in_tab +#: field:res.partner.relation.type,own_tab_left:0 +#: field:res.partner.relation.type,own_tab_right:0 +msgid "Show in own tab" +msgstr "Toon in eigen tabblad" + diff --git a/partner_relations_in_tab/i18n/partner_relations_in_tab.pot b/partner_relations_in_tab/i18n/partner_relations_in_tab.pot new file mode 100644 index 000000000..0d1815e3c --- /dev/null +++ b/partner_relations_in_tab/i18n/partner_relations_in_tab.pot @@ -0,0 +1,43 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * partner_relations_in_tab +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-25 09:08+0000\n" +"PO-Revision-Date: 2014-11-25 09:08+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: partner_relations_in_tab +#: field:res.partner,id:0 +msgid "Id" +msgstr "" + +#. module: partner_relations_in_tab +#: code:_description:0 +#: model:ir.model,name:partner_relations_in_tab.model_res_partner_relation_type +#, python-format +msgid "Parter relation type" +msgstr "" + +#. module: partner_relations_in_tab +#: code:_description:0 +#: code:addons/partner_relations_in_tab/model/res_partner.py:99 +#: model:ir.model,name:partner_relations_in_tab.model_res_partner +#, python-format +msgid "Partner" +msgstr "" + +#. module: partner_relations_in_tab +#: field:res.partner.relation.type,own_tab_left:0 +#: field:res.partner.relation.type,own_tab_right:0 +msgid "Show in own tab" +msgstr "" + diff --git a/partner_relations_in_tab/model/__init__.py b/partner_relations_in_tab/model/__init__.py new file mode 100644 index 000000000..45db75c31 --- /dev/null +++ b/partner_relations_in_tab/model/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# 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 . +# +############################################################################## +from . import res_partner_relation_type +from . import res_partner diff --git a/partner_relations_in_tab/model/res_partner.py b/partner_relations_in_tab/model/res_partner.py new file mode 100644 index 000000000..ab7b3e57a --- /dev/null +++ b/partner_relations_in_tab/model/res_partner.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# 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 . +# +############################################################################## +from lxml import etree +from openerp.osv.orm import Model, transfer_modifiers_to_node +from openerp.osv import expression +from openerp.tools.translate import _ + + +class ResPartner(Model): + _inherit = 'res.partner' + + def _get_relation_ids_select(self, cr, uid, ids, field_name, arg, + context=None): + cr.execute( + '''select r.id, left_partner_id, right_partner_id + from res_partner_relation r + join res_partner_relation_type t + on r.type_id = t.id + where ((left_partner_id in %s and own_tab_left=False) + or (right_partner_id in %s and own_tab_right=False))''' + + ' order by ' + self.pool['res.partner.relation']._order, + (tuple(ids), tuple(ids)) + ) + return cr.fetchall() + + def _create_relation_type_tab( + self, cr, uid, rel_type, inverse, field_names, context=None): + '''Create an xml node containing the relation's tab to be added to the + view. Add the field(s) created on the form to field_names.''' + name = rel_type.name if not inverse else rel_type.name_inverse + contact_type = rel_type['contact_type_' + + ('left' if not inverse else 'right')] + partner_category = rel_type['partner_category_' + + ('left' if not inverse + else 'right')] + tab = etree.Element('page') + tab.set('string', name) + + invisible = [('id', '=', False)] + if contact_type: + invisible = expression.OR([ + invisible, + [('is_company', '=', contact_type != 'c')]]) + if partner_category: + invisible = expression.OR([ + invisible, + [('category_id', '!=', partner_category.id)]]) + attrs = { + 'invisible': invisible, + } + tab.set('attrs', repr(attrs)) + transfer_modifiers_to_node(attrs, tab) + + field_name = 'relation_ids_own_tab_%s_%s' % ( + rel_type.id, + 'left' if not inverse else 'right') + field_names.append(field_name) + this_partner_name = '%s_partner_id' % ( + 'left' if not inverse else 'right') + other_partner_name = '%s_partner_id' % ( + 'left' if inverse else 'right') + + field = etree.Element( + 'field', + name=field_name, + context=('{"default_type_id": %s, "default_%s": id, ' + '"active_test": False}') % ( + rel_type.id, + this_partner_name)) + tab.append(field) + tree = etree.Element('tree', editable='bottom') + field.append(tree) + + onchange_type_values = self.pool['res.partner.relation']\ + .on_change_type_selection_id(cr, uid, None, + rel_type.id * 10 + + (1 if inverse else 0), + context=context) + tree.append(etree.Element( + 'field', + string=_('Partner'), + domain=repr( + onchange_type_values['domain']['partner_id_display']), + widget='many2one_clickable', + name=other_partner_name)) + 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')) + tree.append(etree.Element('field', name=this_partner_name, + invisible='True')) + return tab + + def _add_relation_type_tab( + self, cr, uid, rel_type, inverse, field_names, relation_tab, + context=None): + '''add the xml node to the view''' + tab = self._create_relation_type_tab( + cr, uid, rel_type, inverse, field_names, context=context) + relation_tab.addnext(tab) + + def fields_view_get(self, cr, uid, view_id=None, view_type='form', + context=None, toolbar=False, submenu=False): + if context is None: + context = {} + result = super(ResPartner, self).fields_view_get( + cr, uid, view_id=view_id, view_type=view_type, context=context, + toolbar=toolbar, submenu=submenu) + if view_type == 'form' and not context.get('check_view_ids'): + res_partner_relation_type = self.pool['res.partner.relation.type'] + own_tab_types = res_partner_relation_type.browse( + cr, uid, + res_partner_relation_type.search( + cr, uid, + [ + '|', + ('own_tab_left', '=', True), + ('own_tab_right', '=', True) + ], + context=context), + context=context) + view = etree.fromstring(result['arch']) + + relation_tab = view.xpath( + '//field[@name="relation_ids"]/ancestor::page') + if not relation_tab: + return result + relation_tab = relation_tab[0] + + field_names = [] + + if not view.xpath('//field[@name="id"]'): + view.append(etree.Element('field', name='id', + invisible='True')) + field_names.append('id') + + for rel_type in own_tab_types: + if rel_type.own_tab_left: + self._add_relation_type_tab( + cr, uid, rel_type, False, field_names, relation_tab, + context=context) + if rel_type.own_tab_right: + self._add_relation_type_tab( + cr, uid, rel_type, True, field_names, relation_tab, + context=context) + + result['arch'], fields = self\ + ._BaseModel__view_look_dom_arch( + cr, uid, view, result['view_id'], context=context) + + for field_name in field_names: + result['fields'][field_name] = fields[field_name] + + return result diff --git a/partner_relations_in_tab/model/res_partner_relation_type.py b/partner_relations_in_tab/model/res_partner_relation_type.py new file mode 100644 index 000000000..6a04d33f8 --- /dev/null +++ b/partner_relations_in_tab/model/res_partner_relation_type.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# 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 . +# +############################################################################## +from openerp.osv.orm import Model +from openerp.osv import fields +from openerp import SUPERUSER_ID + + +class ResPartnerRelationType(Model): + _inherit = 'res.partner.relation.type' + + _columns = { + 'own_tab_left': fields.boolean('Show in own tab'), + 'own_tab_right': fields.boolean('Show in own tab'), + } + + _defaults = { + 'own_tab_left': False, + 'own_tab_right': False, + } + + def _update_res_partner_fields(self, cr): + field_name_prefix = 'relation_ids_own_tab_' + field_name_format = field_name_prefix + '%s_%s' + res_partner = self.pool['res.partner'] + for field_name in res_partner._columns.copy(): + if field_name.startswith(field_name_prefix): + del res_partner._columns[field_name] + + def add_field(relation, inverse): + field = fields.one2many( + 'res.partner.relation', + '%s_partner_id' % ('left' if not inverse else 'right'), + string=relation['name' if not inverse else 'name_inverse'], + domain=[('type_id', '=', relation.id), + '|', + ('active', '=', True), + ('active', '=', False)]) + field_name = field_name_format % ( + relation.id, + 'left' if not inverse else 'right') + res_partner._columns[field_name] = field + + for relation in self.browse( + cr, SUPERUSER_ID, + self.search( + cr, SUPERUSER_ID, + [ + '|', + ('own_tab_left', '=', True), + ('own_tab_right', '=', True), + ])): + if relation.own_tab_left: + add_field(relation, False) + if relation.own_tab_right: + add_field(relation, True) + + def _register_hook(self, cr): + self._update_res_partner_fields(cr) + + def create(self, cr, uid, vals, context=None): + result = super(ResPartnerRelationType, self).create( + cr, uid, vals, context=context) + if vals.get('own_tab_left') or vals.get('own_tab_right'): + self._update_res_partner_fields(cr) + return result + + def write(self, cr, uid, ids, vals, context=None): + result = super(ResPartnerRelationType, self).write( + cr, uid, ids, vals, context=context) + if 'own_tab_left' in vals or 'own_tab_right' in vals: + self._update_res_partner_fields(cr) + return result diff --git a/partner_relations_in_tab/static/src/img/icon.png b/partner_relations_in_tab/static/src/img/icon.png new file mode 100644 index 000000000..b219b220e Binary files /dev/null and b/partner_relations_in_tab/static/src/img/icon.png differ diff --git a/partner_relations_in_tab/view/res_partner_relation_type.xml b/partner_relations_in_tab/view/res_partner_relation_type.xml new file mode 100644 index 000000000..117911258 --- /dev/null +++ b/partner_relations_in_tab/view/res_partner_relation_type.xml @@ -0,0 +1,20 @@ + + + + + res.partner.relation.type + form + + + + + + + + + + + + + +