Compare commits

...

16 Commits

Author SHA1 Message Date
default 803a089240 [UPD] refactor code with jsonify from oca server-tools 3 years ago
OCA-git-bot 4762f45fb0 [ADD] setup.py 3 years ago
OCA-git-bot 259e25a006 [ADD] icon.png 3 years ago
OCA-git-bot fa68c07e2f [UPD] README.rst 3 years ago
oca-travis 364ad2c376 [UPD] Update portal_partner_data_no_edit.pot 3 years ago
OCA-git-bot 1c13aa61da Merge PR #1052 into 12.0 3 years ago
david 04c20d4c02 [ADD] portal_partner_data_no_edit: New module 3 years ago
Yann Papouin 166ae538ef Translated using Weblate (French) 3 years ago
Yann Papouin 3744c1060e Added translation using Weblate (French) 3 years ago
OCA Transbot 8af27a68ce Update translation files 3 years ago
OCA-git-bot 1e66520143 [ADD] setup.py 3 years ago
OCA-git-bot 21b7a06442 [UPD] README.rst 3 years ago
oca-travis e28d4e4671 [UPD] Update partner_pricelist_search.pot 3 years ago
OCA-git-bot 2dd25f43d6 Merge PR #1048 into 12.0 3 years ago
Carlos Dauden 4b7aa9cde9 [ADD] partner_pricelist_search: New module 3 years ago
JonathanStein cd75f6fde2 Translated using Weblate (Danish) 3 years ago
  1. 27
      partner_contact_access_link/i18n/fr.po
  2. 1
      partner_gogocarto_export_api/README.rst
  3. 2
      partner_gogocarto_export_api/__init__.py
  4. 26
      partner_gogocarto_export_api/__manifest__.py
  5. 1
      partner_gogocarto_export_api/controllers/__init__.py
  6. 19
      partner_gogocarto_export_api/controllers/main.py
  7. 3
      partner_gogocarto_export_api/models/__init__.py
  8. 13
      partner_gogocarto_export_api/models/company.py
  9. 19
      partner_gogocarto_export_api/models/res_config_settings.py
  10. 37
      partner_gogocarto_export_api/models/res_partner.py
  11. 8
      partner_gogocarto_export_api/readme/CONFIGURE.rst
  12. 13
      partner_gogocarto_export_api/readme/CONTRIBUTORS.rst
  13. 1
      partner_gogocarto_export_api/readme/CREDITS.rst
  14. 6
      partner_gogocarto_export_api/readme/DESCRIPTION.rst
  15. BIN
      partner_gogocarto_export_api/static/description/icon.png
  16. 30
      partner_gogocarto_export_api/views/gogocarto_config_settings_view.xml
  17. 14
      partner_gogocarto_export_api/views/gogocarto_partner.xml
  18. 18
      partner_gogocarto_export_api/views/res_company_view.xml
  19. 179
      partner_multi_relation/i18n/da.po
  20. 86
      partner_pricelist_search/README.rst
  21. 1
      partner_pricelist_search/__init__.py
  22. 19
      partner_pricelist_search/__manifest__.py
  23. 51
      partner_pricelist_search/i18n/es.po
  24. 44
      partner_pricelist_search/i18n/partner_pricelist_search.pot
  25. 2
      partner_pricelist_search/models/__init__.py
  26. 21
      partner_pricelist_search/models/product_pricelist.py
  27. 33
      partner_pricelist_search/models/res_partner.py
  28. 3
      partner_pricelist_search/readme/CONTRIBUTORS.rst
  29. 4
      partner_pricelist_search/readme/DESCRIPTION.rst
  30. 4
      partner_pricelist_search/readme/ROADMAP.rst
  31. BIN
      partner_pricelist_search/static/description/icon.png
  32. 431
      partner_pricelist_search/static/description/index.html
  33. 1
      partner_pricelist_search/tests/__init__.py
  34. 77
      partner_pricelist_search/tests/test_partner_pricelist_search.py
  35. 14
      partner_pricelist_search/views/product_pricelist_views.xml
  36. 103
      portal_partner_data_no_edit/README.rst
  37. 2
      portal_partner_data_no_edit/__init__.py
  38. 20
      portal_partner_data_no_edit/__manifest__.py
  39. 1
      portal_partner_data_no_edit/controllers/__init__.py
  40. 22
      portal_partner_data_no_edit/controllers/portal.py
  41. 45
      portal_partner_data_no_edit/i18n/es.po
  42. 42
      portal_partner_data_no_edit/i18n/portal_partner_data_no_edit.pot
  43. 2
      portal_partner_data_no_edit/models/__init__.py
  44. 52
      portal_partner_data_no_edit/models/ir_ui_view.py
  45. 13
      portal_partner_data_no_edit/models/res_partner.py
  46. 7
      portal_partner_data_no_edit/readme/CONFIGURE.rst
  47. 3
      portal_partner_data_no_edit/readme/CREDITS.rst
  48. 2
      portal_partner_data_no_edit/readme/DESCRIPTION.rst
  49. 3
      portal_partner_data_no_edit/readme/ROADMAP.rst
  50. 5
      portal_partner_data_no_edit/readme/USAGE.rst
  51. BIN
      portal_partner_data_no_edit/static/description/icon.png
  52. 459
      portal_partner_data_no_edit/static/description/index.html
  53. 60
      portal_partner_data_no_edit/static/src/js/portal_partner_data_no_edit_tour.js
  54. 1
      portal_partner_data_no_edit/tests/__init__.py
  55. 38
      portal_partner_data_no_edit/tests/test_portal_partner_data_no_edit.py
  56. 9
      portal_partner_data_no_edit/views/assets.xml
  57. 11
      portal_partner_data_no_edit/views/portal_template.xml
  58. 12
      portal_partner_data_no_edit/views/res_partner_views.xml
  59. 2
      setup/_metapackage/VERSION.txt
  60. 2
      setup/_metapackage/setup.py
  61. 1
      setup/partner_pricelist_search/odoo/addons/partner_pricelist_search
  62. 6
      setup/partner_pricelist_search/setup.py
  63. 1
      setup/portal_partner_data_no_edit/odoo/addons/portal_partner_data_no_edit
  64. 6
      setup/portal_partner_data_no_edit/setup.py

27
partner_contact_access_link/i18n/fr.po

@ -0,0 +1,27 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_contact_access_link
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-01-27 13:39+0000\n"
"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: partner_contact_access_link
#: model:ir.model,name:partner_contact_access_link.model_res_partner
msgid "Contact"
msgstr "Contact"
#. module: partner_contact_access_link
#: model_terms:ir.ui.view,arch_db:partner_contact_access_link.view_partner_form
msgid "Open full form"
msgstr "Ouvrir le formulaire complet"

1
partner_gogocarto_export_api/README.rst

@ -0,0 +1 @@
This file is going to be generated by oca-gen-addon-readme.

2
partner_gogocarto_export_api/__init__.py

@ -0,0 +1,2 @@
from . import controllers
from . import models

26
partner_gogocarto_export_api/__manifest__.py

@ -0,0 +1,26 @@
{
'name': 'partner_gogocarto_export_api',
'summary': '''HTTP JSON api to send partner data for Gogocarto import''',
'license': 'AGPL-3',
'author': (
'Lokavaluto,'
'Odoo Community Association (OCA)'
),
'website': 'https://lokavaluto.fr',
'category': 'Localization',
'version': '12.0.1.0.0',
'depends': [
'base',
'contacts',
'base_geolocalize',
'base_jsonify',
],
'data': [
'views/gogocarto_partner.xml',
'views/gogocarto_config_settings_view.xml',
'views/res_company_view.xml',
],
'demo': [],
'installable': True,
'auto_install': False,
}

1
partner_gogocarto_export_api/controllers/__init__.py

@ -0,0 +1 @@
from . import main

19
partner_gogocarto_export_api/controllers/main.py

@ -0,0 +1,19 @@
import json, logging
from odoo import http, models, fields, api
from odoo.http import Response, request
_logger = logging.getLogger(__name__)
class PartnerGogocartojs(http.Controller):
@http.route('/web/<company_id>/get_http_gogocarto_elements',methods=['GET'], type='http', csrf=False, auth="public", website=True)
def get_gogocarto_elements_http(self, company_id):
data = self._jsonify_get_partner(company_id)
return Response(json.dumps(data) )
def _jsonify_get_partner(self, company_id):
PartnerSudo = request.env['res.partner'].sudo()
parser = PartnerSudo._get_gogocarto_parser(company_id)
partners = PartnerSudo.with_context(force_company=company_id).search(PartnerSudo._get_gogocarto_domain(company_id))
return partners.jsonify(parser)

3
partner_gogocarto_export_api/models/__init__.py

@ -0,0 +1,3 @@
from . import res_partner
from . import res_config_settings
from . import company

13
partner_gogocarto_export_api/models/company.py

@ -0,0 +1,13 @@
from odoo import api, models, fields
class Company(models.Model):
_inherit = "res.company"
export_gogocarto_fields = fields.Many2many(
'ir.model.fields',
domain=[
('model_id', '=', 'res.partner'),
('name', 'not in', ['id', 'name','partner_longitude','partner_latitude'])
]
)

19
partner_gogocarto_export_api/models/res_config_settings.py

@ -0,0 +1,19 @@
import logging
from ast import literal_eval
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
export_gogocarto_fields = fields.Many2many(
related='company_id.export_gogocarto_fields',
relation='ir.model.fields',
string='GogoCarto Exported fields',
readonly=False,
domain=[
('model_id', '=', 'res.partner'),
('name', 'not in', ['name','partner_longitude','partner_latitude','id'])
]
)

37
partner_gogocarto_export_api/models/res_partner.py

@ -0,0 +1,37 @@
from odoo import models, fields, api
from ast import literal_eval
from datetime import date, datetime
import logging
_logger = logging.getLogger(__name__)
class ResPartner(models.Model):
""" Inherits partner, adds Gogocarto fields in the partner form, and functions"""
_inherit = 'res.partner'
in_gogocarto = fields.Boolean('In gogocarto')
def _get_gogocarto_domain(self, company_id): # To OVERRIDE in sub_modules to customize the partner selection
return [('in_gogocarto','=',True)]
def _get_gogocarto_parser(self, company_id):
parser = []
for field in self._get_export_fields(company_id):
if field.ttype in ["boolean", "char", "integer", "monetary", "text", "selection", "float", "date_time", "date"]:
parser.append(field.name)
elif field.ttype in ["many2one", "one2many", "many2many"]:
parser.append((field.name, ['id', 'name']))
elif field.ttype == "binary":
continue
# use /web/image?model=res.partner&id=<id>&field=image_medium in gogocarto template
elif field.ttype == "html":
continue # Not developped so far
else:
continue
return parser
def _get_export_fields(self, company_id):
CompanySudo = self.env['res.company'].sudo()
default_fields = self.env['ir.model.fields'].sudo().search([('model_id', '=', 'res.partner'),('name', 'in', ['id', 'name','partner_longitude','partner_latitude'])])
export_fields = default_fields | CompanySudo.search([('id', '=', company_id)]).export_gogocarto_fields
return export_fields

8
partner_gogocarto_export_api/readme/CONFIGURE.rst

@ -0,0 +1,8 @@
Just install partner_gogocarto_export_api, all dependencies will be installed by default.
To export partners data:
#. Set the fields you want to export in Settings / Gogocarto.
#. Check the field *"In Gogocarto"* in the partner form view.
And use the link *https://yourodoo.com/web/<company_id>/get_http_gogocarto_elements* in Gogocarto server import configuration (*https://video.colibris-outilslibres.org/videos/watch/c74fc469-c822-4ab8-82a7-a2555e49e576*)

13
partner_gogocarto_export_api/readme/CONTRIBUTORS.rst

@ -0,0 +1,13 @@
* Stéphan SAINLEGER <https://github.com/stephansainleger>
* Chloé Migayrou <https://github.com/MigayrouChloe>
* Nicolas Jeudy <https://github.com/njeudy>
* Lokavaluto Teams <https://lokavaluto.fr>
Funders
-------
The development of this module has been financially supported by:
* Lokavaluto (https://lokavaluto.fr)
* Mycéliandre (https://myceliandre.fr)
* Elabore (https://elabore.coop)

1
partner_gogocarto_export_api/readme/CREDITS.rst

@ -0,0 +1 @@
* Lokavaluto: `Icon <https://lokavaluto.fr/web/image/res.company/1/logo?unique=f3db262>`

6
partner_gogocarto_export_api/readme/DESCRIPTION.rst

@ -0,0 +1,6 @@
Gogocarto Export module, to export the partner data needed for a Gogocarto map.
This module allow the users to decide:
* the partner to be exported
* the fields exported for each partner (*name*, *partner_longitude* and *partner_lattitude* automatically exported)

BIN
partner_gogocarto_export_api/static/description/icon.png

After

Width: 500  |  Height: 500  |  Size: 52 KiB

30
partner_gogocarto_export_api/views/gogocarto_config_settings_view.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_gogocarto" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.gogocarto</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="99"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Gogocarto" string="Gogocarto" data-key="gogocarto">
<h2>Gogocarto export configuration</h2>
<div class="row mt16 o_settings_container" id="gogocarto_selection_settings">
<div class="col-12 col-lg-6 o_setting_box" id="gogocarto_fields">
<div class="o_setting_right_pane">
<div class="text-muted">
Partner fields to export for Gogocarto map. Check the export on /web/get_http_gogocarto_elements.
</div>
<div class="content-group">
<div class="mt16">
<field name="export_gogocarto_fields" widget="many2many_tags" options="{'no_create': True, 'no_open': True}"/>
</div>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

14
partner_gogocarto_export_api/views/gogocarto_partner.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record model="ir.ui.view" id="partner_gogocarto_form_view">
<field name="name">partner.gogocarto.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name='priority'>99</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='function']" position="after">
<field name="in_gogocarto"/>
</xpath>
</field>
</record>
</odoo>

18
partner_gogocarto_export_api/views/res_company_view.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record model="ir.ui.view" id="res_company_gogocarto_form_view">
<field name="name">res_company.gogocarto.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name='priority'>99</field>
<field name="arch" type="xml">
<xpath expr="//notebook" posiion="inside">
<page string="GogoCarto Setup" name="gogocarto">
<group>
<field name="export_gogocarto_fields"/>
</group>
</page>
</xpath>
</field>
</record>
</odoo>

179
partner_multi_relation/i18n/da.po

@ -9,20 +9,21 @@ msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-26 15:33+0000\n"
"PO-Revision-Date: 2017-12-26 15:33+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"PO-Revision-Date: 2021-01-10 14:44+0000\n"
"Last-Translator: JonathanStein <jstein@image.dk>\n"
"Language-Team: Danish (https://www.transifex.com/oca/teams/23907/da/)\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:240
#, python-format
msgid "%s partner incompatible with relation type."
msgstr ""
msgstr "%s ugyldig partner for relationstypen."
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__active
@ -32,30 +33,30 @@ msgstr "Aktiv"
#. module: partner_multi_relation
#: model:ir.model,name:partner_multi_relation.model_res_partner_relation_all
msgid "All (non-inverse + inverse) relations between partners"
msgstr ""
msgstr "Alle (direkte og omvendte) relationer mellem partnere"
#. module: partner_multi_relation
#: model:ir.model,name:partner_multi_relation.model_res_partner_relation_type_selection
msgid "All relation types"
msgstr ""
msgstr "Alle relationstyper"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__relation_all_ids
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__relation_all_ids
msgid "All relations with current partner"
msgstr ""
msgstr "Alle relationer med den aktuelle partner"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:13
#: selection:res.partner.relation.type,handle_invalid_onchange:0
#, python-format
msgid "Allow existing relations that do not fit changed conditions"
msgstr ""
msgstr "Tillad eksisterende relationer, der ikke overholder betingelserne"
#. module: partner_multi_relation
#: model:ir.model,name:partner_multi_relation.model_res_partner
msgid "Contact"
msgstr ""
msgstr "Kontakt"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__create_uid
@ -72,24 +73,24 @@ msgstr "Oprettet den"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__partner_category_this
msgid "Current record's category"
msgstr ""
msgstr "Aktelle relations kategori"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__contact_type_this
msgid "Current record's partner type"
msgstr ""
msgstr "Aktuelle relations partnertype"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:17
#: selection:res.partner.relation.type,handle_invalid_onchange:0
#, python-format
msgid "Delete relations that do not fit changed conditions"
msgstr ""
msgstr "Slet relationer, der ikke overholder betingelserne"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__right_partner_id
msgid "Destination Partner"
msgstr ""
msgstr "Mål-partner"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__display_name
@ -104,27 +105,27 @@ msgstr "Vist navn"
#: selection:res.partner.relation.type,handle_invalid_onchange:0
#, python-format
msgid "Do not allow change that will result in invalid relations"
msgstr ""
msgstr "Tillad ikke ændringer, der vil medføre ugyldige relationer"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:15
#: selection:res.partner.relation.type,handle_invalid_onchange:0
#, python-format
msgid "End relations per today, if they do not fit changed conditions"
msgstr ""
msgstr "Afslut relationer pr. dags dato, hvis de ikker overholder betingelserne"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__date_end
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__date_end
msgid "Ending date"
msgstr "Slut dato"
msgstr "Slutdato"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:237
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:315
#, python-format
msgid "Error!"
msgstr ""
msgstr "Fejl!"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
@ -134,35 +135,35 @@ msgstr "Gruppér efter"
#. module: partner_multi_relation
#: model:res.partner.relation.type,name_inverse:partner_multi_relation.rel_type_assistant
msgid "Has assistant"
msgstr ""
msgstr "Har assistent"
#. module: partner_multi_relation
#: model:res.partner.relation.type,name_inverse:partner_multi_relation.rel_type_has_worked_for
msgid "Has former employee"
msgstr ""
msgstr "Har tidligere medarbejder"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__search_relation_type_id
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__search_relation_type_id
msgid "Has relation of type"
msgstr ""
msgstr "Har relation med typen"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__search_relation_partner_id
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__search_relation_partner_id
msgid "Has relation with"
msgstr ""
msgstr "Har relation med"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__search_relation_partner_category_id
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__search_relation_partner_category_id
msgid "Has relation with a partner in category"
msgstr ""
msgstr "Har relation med partner i kategori"
#. module: partner_multi_relation
#: model:res.partner.relation.type,name:partner_multi_relation.rel_type_has_worked_for
msgid "Has worked for"
msgstr ""
msgstr "Har arbejdet for"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__id
@ -175,40 +176,40 @@ msgstr "ID"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Include past records"
msgstr ""
msgstr "Inkludér tidligere relationer"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__handle_invalid_onchange
msgid "Invalid relation handling"
msgstr ""
msgstr "Håndtér ugyldige relationer"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__name_inverse
msgid "Inverse name"
msgstr ""
msgstr "Omvendt navn"
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_all__is_inverse
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_type_selection__is_inverse
msgid "Inverse relations are from right to left partner."
msgstr ""
msgstr "Omvendte relationer er fra højre til venstre partner."
#. module: partner_multi_relation
#: model:res.partner.relation.type,name:partner_multi_relation.rel_type_assistant
msgid "Is assistant of"
msgstr ""
msgstr "Er assistent til"
#. module: partner_multi_relation
#: model:res.partner.relation.type,name:partner_multi_relation.rel_type_competitor
#: model:res.partner.relation.type,name_inverse:partner_multi_relation.rel_type_competitor
msgid "Is competitor of"
msgstr ""
msgstr "Er konkurrent til"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__is_inverse
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__is_inverse
msgid "Is reverse type?"
msgstr ""
msgstr "Er omvendt type?"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation____last_update
@ -233,22 +234,22 @@ msgstr "Sidst opdateret den"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__partner_category_left
msgid "Left partner category"
msgstr ""
msgstr "Venstre partnerkategori"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__contact_type_left
msgid "Left partner type"
msgstr ""
msgstr "Venstre partnertype"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.form_res_partner_relation_type
msgid "Left side of relation"
msgstr ""
msgstr "Venstre side af relationen"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Left to right"
msgstr ""
msgstr "Venstre til højre"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__name
@ -260,41 +261,41 @@ msgstr "Navn"
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:244
#, python-format
msgid "No %s partner available for relation type."
msgstr ""
msgstr "Ingen %s partner tilgængelig for relationstypen."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:448
#, python-format
msgid "No relation type specified in vals: %s."
msgstr ""
msgstr "Relationstype blev ikke angivet i parametrene: %s."
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__this_partner_id
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "One Partner"
msgstr ""
msgstr "Denne partner"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:82
#, python-format
msgid "Organisation"
msgstr ""
msgstr "Organisation"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__other_partner_id
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Other Partner"
msgstr ""
msgstr "Anden partner"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__partner_category_other
msgid "Other record's category"
msgstr ""
msgstr "Anden partners kategori"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__contact_type_other
msgid "Other record's partner type"
msgstr ""
msgstr "Anden partners type"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__any_partner_id
@ -304,39 +305,39 @@ msgstr "Partner"
#. module: partner_multi_relation
#: model:ir.model,name:partner_multi_relation.model_res_partner_relation_type
msgid "Partner Relation Type"
msgstr ""
msgstr "Partnerrelationstype"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.tree_res_partner_relation_all
msgid "Partner Relations"
msgstr ""
msgstr "Partnerrelationer"
#. module: partner_multi_relation
#: model:ir.actions.act_window,name:partner_multi_relation.action_res_partner_relation_type
msgid "Partner Relations Types"
msgstr ""
msgstr "Partnerrelationstyper"
#. module: partner_multi_relation
#: model:ir.model,name:partner_multi_relation.model_res_partner_relation
msgid "Partner relation"
msgstr ""
msgstr "Partnerrelation"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation.py:115
#, python-format
msgid "Partners cannot have a relation with themselves."
msgstr ""
msgstr "Partnere kan ikke have relationer med sig selv."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:83
#, python-format
msgid "Person"
msgstr ""
msgstr "Person"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.form_res_partner_relation_type
msgid "Properties"
msgstr ""
msgstr "Egenskaber"
#. module: partner_multi_relation
#: model_terms:ir.actions.act_window,help:partner_multi_relation.action_res_partner_relation_all
@ -345,17 +346,20 @@ msgid ""
" be linked to other partners with a type either directly\n"
" or inversely."
msgstr ""
"Gem og brug dine partneres relationer. Relationer kan\n"
" knyttes til andre partnere med en type, enten direkte\n"
" eller omvendt."
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_all__active
msgid "Records with date_end in the past are inactive"
msgstr ""
msgstr "Relationer med slutdato i fortiden er inaktive"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__allow_self
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__allow_self
msgid "Reflexive"
msgstr ""
msgstr "Refleksiv"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:196
@ -365,34 +369,36 @@ msgid ""
"There are existing reflexive relations defined for the following partners: "
"{partners}"
msgstr ""
"\"Refleksiv\" kunne ikke slås fra for relationstypen {relation_type}. Der er "
"refleksive relationer defineret for følgende partnere: {partners}"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__relation_count
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__relation_count
msgid "Relation Count"
msgstr ""
msgstr "Antal relationer"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__type_selection_id
msgid "Relation Type"
msgstr ""
msgstr "Relationstype"
#. module: partner_multi_relation
#: model:ir.ui.menu,name:partner_multi_relation.menu_res_partner_relation_type
msgid "Relation Types"
msgstr ""
msgstr "Relationstyper"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:316
#, python-format
msgid "Relation type incompatible with selected partner(s)."
msgstr ""
msgstr "Relationstype ikke tilladt med valgte partner(e)."
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner__search_relation_date
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_users__search_relation_date
msgid "Relation valid"
msgstr ""
msgstr "Gyldig relation"
#. module: partner_multi_relation
#: model:ir.actions.act_window,name:partner_multi_relation.action_res_partner_relation_all
@ -400,97 +406,97 @@ msgstr ""
#: model:ir.ui.menu,name:partner_multi_relation.menu_res_partner_relation_all
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.view_partner_form
msgid "Relations"
msgstr ""
msgstr "Relationer"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Relationship Type"
msgstr ""
msgstr "Type af relation"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__res_id
msgid "Resource ID"
msgstr ""
msgstr "Database id"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__res_model
msgid "Resource Model"
msgstr ""
msgstr "Database-model"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__partner_category_right
msgid "Right partner category"
msgstr ""
msgstr "Højre partnerkategori"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__contact_type_right
msgid "Right partner type"
msgstr ""
msgstr "Højre partnertype"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.form_res_partner_relation_type
msgid "Right side of relation"
msgstr ""
msgstr "Højre side af relationen"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Right to left"
msgstr ""
msgstr "Højre til venstre"
#. module: partner_multi_relation
#: model_terms:ir.ui.view,arch_db:partner_multi_relation.search_res_partner_relation_all
msgid "Search Relations"
msgstr ""
msgstr "Søg relationer"
#. module: partner_multi_relation
#: model:ir.actions.act_window,name:partner_multi_relation.action_show_partner_multi_relation
msgid "Show partner's relations"
msgstr ""
msgstr "Vis partnerens relationer"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__left_partner_id
msgid "Source Partner"
msgstr ""
msgstr "Kilde-partner"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__date_start
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__date_start
msgid "Starting date"
msgstr ""
msgstr "Startdato"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type__is_symmetric
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_type_selection__is_symmetric
msgid "Symmetric"
msgstr ""
msgstr "Symmetrisk"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation.py:101
#, python-format
msgid "The %s partner does not have category %s."
msgstr ""
msgstr "%s partneren har ikke kategorien %s."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation.py:95
#, python-format
msgid "The %s partner is not applicable for this relation type."
msgstr ""
msgstr "%s partneren er ikke gyldig for denne relationstypen."
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_all__res_model
msgid "The database object this relation is based on."
msgstr ""
msgstr "Databaseobjektet, som denne relationer er baseret på."
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_all__res_id
msgid "The id of the object in the model this relation is based on."
msgstr ""
msgstr "Id på objektet i den model, relationen er baseret på."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation.py:62
#, python-format
msgid "The starting date cannot be after the ending date."
msgstr ""
msgstr "Startdato kan ikke være efter slutdatoen."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_type.py:165
@ -499,22 +505,24 @@ msgid ""
"There are already relations not satisfying the conditions for partner type "
"or category."
msgstr ""
"Der er allerede relationer, der ikke opfylder betingelserne for partnertype "
"eller kategori."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation.py:154
#, python-format
msgid "There is already a similar relation with overlapping dates"
msgstr ""
msgstr "Der er allerede en tilsvarende relation med overlappende datoer"
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_type__allow_self
msgid "This relation can be set up with the same partner left and right"
msgstr ""
msgstr "Denne relation kan sættes op med samme partner på venstre og højre side"
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_type__is_symmetric
msgid "This relation is the same from right to left as from left to right"
msgstr ""
msgstr "Denne relation er ens fra højre mod venstre og fra venstre mod højre"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation__type_id
@ -525,33 +533,33 @@ msgstr "Type"
#. module: partner_multi_relation
#: model:ir.model.fields,field_description:partner_multi_relation.field_res_partner_relation_all__type_id
msgid "Underlying Relation Type"
msgstr ""
msgstr "Underliggende relationstype"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner.py:79
#, python-format
msgid "Unsupported search operator \"%s\""
msgstr ""
msgstr "Ugyldig søgeparameter \"%s\""
#. module: partner_multi_relation
#: model:res.partner.category,name:partner_multi_relation.res_partner_category_pmr_0
msgid "Washing Companies"
msgstr ""
msgstr "Vaskefirmaer"
#. module: partner_multi_relation
#: model:res.partner.category,name:partner_multi_relation.res_partner_category_pmr_4
msgid "Washing Gold"
msgstr ""
msgstr "Guldvask"
#. module: partner_multi_relation
#: model:res.partner.category,name:partner_multi_relation.res_partner_category_pmr_11
msgid "Washing Services"
msgstr ""
msgstr "Vaskeservice"
#. module: partner_multi_relation
#: model:res.partner.category,name:partner_multi_relation.res_partner_category_pmr_5
msgid "Washing Silver"
msgstr ""
msgstr "Sølvvask"
#. module: partner_multi_relation
#: model:ir.model.fields,help:partner_multi_relation.field_res_partner_relation_type__handle_invalid_onchange
@ -561,15 +569,18 @@ msgid ""
"fit the new criteria.\n"
"Specify how this situation should be handled."
msgstr ""
"Når relationsindstillinger som partnertype og kategori ændres, kan der være "
"eksisterende relationer, der ikke overholder de nye betingelser.\n"
"Vælg hvordan dette skal håndteres."
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:289
#, python-format
msgid "other"
msgstr ""
msgstr "anden"
#. module: partner_multi_relation
#: code:addons/partner_multi_relation/models/res_partner_relation_all.py:286
#, python-format
msgid "this"
msgstr ""
msgstr "denne"

86
partner_pricelist_search/README.rst

@ -0,0 +1,86 @@
========================
Partner pricelist search
========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github
:target: https://github.com/OCA/partner-contact/tree/12.0/partner_pricelist_search
:alt: OCA/partner-contact
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/partner-contact-12-0/partner-contact-12-0-partner_pricelist_search
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/134/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds search by pricelist field option in partners.
Also add a new smart button called "Customers" in pricelist form view to show
partners with that pricelist.
**Table of contents**
.. contents::
:local:
Known issues / Roadmap
======================
With many partner records the search can be slow because all partners are
computed.
No grouping is allowed.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/partner-contact/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/partner-contact/issues/new?body=module:%20partner_pricelist_search%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Carlos Dauden
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/partner-contact <https://github.com/OCA/partner-contact/tree/12.0/partner_pricelist_search>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
partner_pricelist_search/__init__.py

@ -0,0 +1 @@
from . import models

19
partner_pricelist_search/__manifest__.py

@ -0,0 +1,19 @@
# Copyright 2021 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
{
"name": "Partner pricelist search",
"version": "12.0.1.0.0",
"author": "Tecnativa,"
"Odoo Community Association (OCA)",
"website": "https://github.com/OCA/partner-contact",
"category": "Partner Management",
"depends": [
"product",
],
"data": [
"views/product_pricelist_views.xml",
],
"installable": True,
"license": "AGPL-3",
}

51
partner_pricelist_search/i18n/es.po

@ -0,0 +1,51 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_pricelist_search
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 14:06+0000\n"
"PO-Revision-Date: 2021-01-15 15:07+0100\n"
"Last-Translator: Carlos Dauden <carlos.dauden@tecnativa.com>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#. module: partner_pricelist_search
#: model:ir.model,name:partner_pricelist_search.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: partner_pricelist_search
#: model_terms:ir.ui.view,arch_db:partner_pricelist_search.product_pricelist_view
msgid "Customers"
msgstr "Clientes"
#. module: partner_pricelist_search
#: model:ir.model,name:partner_pricelist_search.model_product_pricelist
#: model:ir.model.fields,field_description:partner_pricelist_search.field_res_partner__property_product_pricelist
#: model:ir.model.fields,field_description:partner_pricelist_search.field_res_users__property_product_pricelist
msgid "Pricelist"
msgstr "Tarifa"
#. module: partner_pricelist_search
#: code:addons/partner_pricelist_search/models/res_partner.py:29
#, python-format
msgid "Pricelist field do not support search with the operator '%s'."
msgstr "El campo Tarifa no soporta búsquedas con el operador '%s'."
#. module: partner_pricelist_search
#: model:ir.model.fields,help:partner_pricelist_search.field_res_partner__property_product_pricelist
#: model:ir.model.fields,help:partner_pricelist_search.field_res_users__property_product_pricelist
msgid ""
"This pricelist will be used, instead of the default one, for sales to the "
"current partner"
msgstr ""
"Esta tarifa se utilizará, en lugar de la por defecto, para las ventas de la "
"empresa actual"

44
partner_pricelist_search/i18n/partner_pricelist_search.pot

@ -0,0 +1,44 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_pricelist_search
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \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_pricelist_search
#: model:ir.model,name:partner_pricelist_search.model_res_partner
msgid "Contact"
msgstr ""
#. module: partner_pricelist_search
#: model_terms:ir.ui.view,arch_db:partner_pricelist_search.product_pricelist_view
msgid "Customers"
msgstr ""
#. module: partner_pricelist_search
#: model:ir.model,name:partner_pricelist_search.model_product_pricelist
#: model:ir.model.fields,field_description:partner_pricelist_search.field_res_partner__property_product_pricelist
#: model:ir.model.fields,field_description:partner_pricelist_search.field_res_users__property_product_pricelist
msgid "Pricelist"
msgstr ""
#. module: partner_pricelist_search
#: code:addons/partner_pricelist_search/models/res_partner.py:29
#, python-format
msgid "Pricelist field do not support search with the operator '%s'."
msgstr ""
#. module: partner_pricelist_search
#: model:ir.model.fields,help:partner_pricelist_search.field_res_partner__property_product_pricelist
#: model:ir.model.fields,help:partner_pricelist_search.field_res_users__property_product_pricelist
msgid "This pricelist will be used, instead of the default one, for sales to the current partner"
msgstr ""

2
partner_pricelist_search/models/__init__.py

@ -0,0 +1,2 @@
from . import product_pricelist
from . import res_partner

21
partner_pricelist_search/models/product_pricelist.py

@ -0,0 +1,21 @@
# Copyright 2021 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from odoo import models
class Pricelist(models.Model):
_inherit = "product.pricelist"
def show_pricelist_partners(self):
if len(self) == 1:
domain = [("property_product_pricelist", "=", self.id)]
else:
domain = [("property_product_pricelist", "in", self.ids)]
partners = self.env["res.partner"].search(domain)
action = self.env.ref("base.action_partner_form")
res = action.read()[0]
res['domain'] = [
('id', 'in', partners.ids),
]
return res

33
partner_pricelist_search/models/res_partner.py

@ -0,0 +1,33 @@
# Copyright 2021 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class Pricelist(models.Model):
_inherit = "res.partner"
property_product_pricelist = fields.Many2one(
search="_search_property_product_pricelist")
@api.model
def _search_property_product_pricelist(self, operator, value):
if operator == "=":
def filter_func(partner):
return partner.property_product_pricelist.id == value
elif operator == "!=":
def filter_func(partner):
return partner.property_product_pricelist.id != value
elif operator == "in":
def filter_func(partner):
return partner.property_product_pricelist.id in value
elif operator == "not in":
def filter_func(partner):
return partner.property_product_pricelist.id not in value
else:
raise UserError(_(
"Pricelist field do not support search with the operator '%s'."
) % operator)
partners = self.with_context(prefetch_fields=False).search([])
return [("id", "in", partners.filtered(filter_func).ids)]

3
partner_pricelist_search/readme/CONTRIBUTORS.rst

@ -0,0 +1,3 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Carlos Dauden

4
partner_pricelist_search/readme/DESCRIPTION.rst

@ -0,0 +1,4 @@
This module adds search by pricelist field option in partners.
Also add a new smart button called "Customers" in pricelist form view to show
partners with that pricelist.

4
partner_pricelist_search/readme/ROADMAP.rst

@ -0,0 +1,4 @@
With many partner records the search can be slow because all partners are
computed.
No grouping is allowed.

BIN
partner_pricelist_search/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

431
partner_pricelist_search/static/description/index.html

@ -0,0 +1,431 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Partner pricelist search</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="partner-pricelist-search">
<h1 class="title">Partner pricelist search</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/partner-contact/tree/12.0/partner_pricelist_search"><img alt="OCA/partner-contact" src="https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/partner-contact-12-0/partner-contact-12-0-partner_pricelist_search"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/134/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds search by pricelist field option in partners.</p>
<p>Also add a new smart button called “Customers” in pricelist form view to show
partners with that pricelist.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#known-issues-roadmap" id="id1">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id1">Known issues / Roadmap</a></h1>
<p>With many partner records the search can be slow because all partners are
computed.</p>
<p>No grouping is allowed.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/partner-contact/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/partner-contact/issues/new?body=module:%20partner_pricelist_search%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Carlos Dauden</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/partner-contact/tree/12.0/partner_pricelist_search">OCA/partner-contact</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

1
partner_pricelist_search/tests/__init__.py

@ -0,0 +1 @@
from . import test_partner_pricelist_search

77
partner_pricelist_search/tests/test_partner_pricelist_search.py

@ -0,0 +1,77 @@
# Copyright 2021 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from odoo.exceptions import UserError
from odoo.tests import common
class TestPartnerPricelistSearch(common.SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.pricelist_1 = cls.env["product.pricelist"].create({
"name": "Test pricelist 1",
})
cls.pricelist_2 = cls.env["product.pricelist"].create({
"name": "Test pricelist 2",
})
cls.customer_1 = cls.env["res.partner"].create({
"name": "Test customer 1",
"property_product_pricelist": cls.pricelist_1,
})
cls.customer_2 = cls.env["res.partner"].create({
"name": "Test customer 2",
"property_product_pricelist": cls.pricelist_2,
})
cls.partner_obj = cls.env["res.partner"]
def test_partner_pricelist_search_equal(self):
""" Test search '=' """
partners = self.partner_obj.search([
("property_product_pricelist", "=",
self.pricelist_1.id)
])
self.assertEqual(partners, self.customer_1)
def test_partner_pricelist_search_in(self):
""" Test search 'in' """
partners = self.partner_obj.search([
("property_product_pricelist", "in",
(self.pricelist_1 | self.pricelist_2).ids)
])
self.assertIn(self.customer_1, partners)
self.assertIn(self.customer_2, partners)
def test_partner_pricelist_search_not_equal(self):
""" Test search 'not equal' """
partners = self.partner_obj.search([
("property_product_pricelist", "!=",
self.pricelist_1.id)
])
self.assertNotIn(self.customer_1, partners)
self.assertIn(self.customer_2, partners)
def test_partner_pricelist_search_not_in(self):
""" Test search 'not in' """
partners = self.partner_obj.search([
("property_product_pricelist", "not in",
(self.pricelist_1 | self.pricelist_2).ids)
])
self.assertNotIn(self.customer_1, partners)
self.assertNotIn(self.customer_2, partners)
def test_partner_pricelist_search_not_implemented(self):
""" Test search not implemented """
with self.assertRaises(UserError):
self.partner_obj.search([
("property_product_pricelist", "ilike",
"pricelist xx")
])
def test_show_pricelist_partners(self):
res = self.pricelist_1.show_pricelist_partners()
self.assertEqual(self.partner_obj.search(res["domain"]),
self.customer_1)
res = (self.pricelist_1 | self.pricelist_2).show_pricelist_partners()
self.assertEqual(self.partner_obj.search(res["domain"]),
(self.customer_1 | self.customer_2))

14
partner_pricelist_search/views/product_pricelist_views.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="product_pricelist_view" model="ir.ui.view">
<field name="model">product.pricelist</field>
<field name="inherit_id" ref="product.product_pricelist_view"/>
<field name="arch" type="xml">
<button name="toggle_active" position="before">
<button name="show_pricelist_partners" type="object"
string="Customers"
class="oe_stat_button" icon="fa-users"/>
</button>
</field>
</record>
</odoo>

103
portal_partner_data_no_edit/README.rst

@ -0,0 +1,103 @@
==============================
Portal Partner Block Data Edit
==============================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github
:target: https://github.com/OCA/partner-contact/tree/12.0/portal_partner_data_no_edit
:alt: OCA/partner-contact
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/partner-contact-12-0/partner-contact-12-0-portal_partner_data_no_edit
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/134/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to block portal users info editing to prevent unproper
changes. We can configure it on every partner.
**Table of contents**
.. contents::
:local:
Configuration
=============
To test this module, you need to:
#. Block portal info editing for a partner:
- Go to *Contacts* and choose the partner.
- In the the *Sales and Purchases* tab, *Misc* section there is a field named
*Block Portal Info Edit*. Enable or disable at your convenience.
Usage
=====
Once configured log in with that user and:
- Go to `/my/account/`
- If the editing is blocked, you won't be able to edit any detail or submit
the form.
Known issues / Roadmap
======================
- Add the `block_portal_data_edit` flag to the invite to portal popup.
- Add a text on the page highlighted (for example with info BS class), saying for those
blocked users that they should contact the company for any modification.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/partner-contact/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/partner-contact/issues/new?body=module:%20portal_partner_data_no_edit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Other credits
~~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* David Vidal
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/partner-contact <https://github.com/OCA/partner-contact/tree/12.0/portal_partner_data_no_edit>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

2
portal_partner_data_no_edit/__init__.py

@ -0,0 +1,2 @@
from . import controllers
from . import models

20
portal_partner_data_no_edit/__manifest__.py

@ -0,0 +1,20 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Portal Partner Block Data Edit",
"version": "12.0.1.0.0",
"category": "Customer Relationship Management",
"author": "Tecnativa,"
"Odoo Community Association (OCA)",
"website": "https://www.github.com/OCA/partner-contact",
"license": "AGPL-3",
"depends": [
"portal",
],
"data": [
"views/res_partner_views.xml",
"views/portal_template.xml",
"views/assets.xml",
],
"installable": True,
}

1
portal_partner_data_no_edit/controllers/__init__.py

@ -0,0 +1 @@
from . import portal

22
portal_partner_data_no_edit/controllers/portal.py

@ -0,0 +1,22 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo.http import request, route
class PortalBlockEdit(CustomerPortal):
def _prepare_portal_layout_values(self):
"""So we can change the edit link text in the view"""
values = super()._prepare_portal_layout_values()
values["block_portal_data_edit"] = (
request.env.user.block_portal_data_edit)
return values
@route()
def account(self, redirect=None, **post):
"""Inject a context that we later we catch in the template `render`"""
if request.env.user.block_portal_data_edit:
context = dict(request.env.context, block_portal_data_edit=True)
request.env.context = context
return super().account(redirect, **post)

45
portal_partner_data_no_edit/i18n/es.po

@ -0,0 +1,45 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * portal_partner_data_no_edit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-04 10:16+0000\n"
"PO-Revision-Date: 2021-02-04 11:18+0100\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
"Language: es\n"
"X-Generator: Poedit 2.3\n"
#. module: portal_partner_data_no_edit
#: model_terms:ir.ui.view,arch_db:portal_partner_data_no_edit.o_portal_my_details
msgid "<i class=\"fa fa-eye\"/> View"
msgstr "<i class=\"fa fa-eye\"/> Ver"
#. module: portal_partner_data_no_edit
#: model:ir.model.fields,help:portal_partner_data_no_edit.field_res_partner__block_portal_data_edit
#: model:ir.model.fields,help:portal_partner_data_no_edit.field_res_users__block_portal_data_edit
msgid "Block portal info editing for the portal user linked to this partner"
msgstr "Bloquea la edición de la información al usuario de portal vinculado a este contacto"
#. module: portal_partner_data_no_edit
#: model:ir.model.fields,field_description:portal_partner_data_no_edit.field_res_partner__block_portal_data_edit
#: model:ir.model.fields,field_description:portal_partner_data_no_edit.field_res_users__block_portal_data_edit
msgid "Block Customer Info Edit"
msgstr "Bloquear edición de datos de portal"
#. module: portal_partner_data_no_edit
#: model:ir.model,name:portal_partner_data_no_edit.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: portal_partner_data_no_edit
#: model:ir.model,name:portal_partner_data_no_edit.model_ir_ui_view
msgid "View"
msgstr "Ver"

42
portal_partner_data_no_edit/i18n/portal_partner_data_no_edit.pot

@ -0,0 +1,42 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * portal_partner_data_no_edit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \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: portal_partner_data_no_edit
#: model_terms:ir.ui.view,arch_db:portal_partner_data_no_edit.o_portal_my_details
msgid "<i class=\"fa fa-eye\"/> View"
msgstr ""
#. module: portal_partner_data_no_edit
#: model:ir.model.fields,field_description:portal_partner_data_no_edit.field_res_partner__block_portal_data_edit
#: model:ir.model.fields,field_description:portal_partner_data_no_edit.field_res_users__block_portal_data_edit
msgid "Block Customer Info Edit"
msgstr ""
#. module: portal_partner_data_no_edit
#: model:ir.model.fields,help:portal_partner_data_no_edit.field_res_partner__block_portal_data_edit
#: model:ir.model.fields,help:portal_partner_data_no_edit.field_res_users__block_portal_data_edit
msgid "Block portal info editing for the portal user linked to this partner"
msgstr ""
#. module: portal_partner_data_no_edit
#: model:ir.model,name:portal_partner_data_no_edit.model_res_partner
msgid "Contact"
msgstr ""
#. module: portal_partner_data_no_edit
#: model:ir.model,name:portal_partner_data_no_edit.model_ir_ui_view
msgid "View"
msgstr ""

2
portal_partner_data_no_edit/models/__init__.py

@ -0,0 +1,2 @@
from . import ir_ui_view
from . import res_partner

52
portal_partner_data_no_edit/models/ir_ui_view.py

@ -0,0 +1,52 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import models
from lxml import html
class IrUiView(models.Model):
_inherit = "ir.ui.view"
def render(self, values=None, engine='ir.qweb', minimal_qcontext=False):
"""Disable inputs converting them into paragraphs and clear form
buttons. This way, we don't need to go input by input and we can
support any view extension without further patching"""
res = super().render(
values=values, engine=engine, minimal_qcontext=minimal_qcontext)
if not self.env.context.get("block_portal_data_edit"):
return res
fragments = html.fromstring(res.decode('utf-8'))
for fragment in fragments:
# The result is a page that looks the same way as the original form
# but with the input fields shadowed and not editable as they're
# just `<p>` paragraphs in `form-control` classes disguise.
for _input in fragment.iterfind(
".//form[@action='/my/account']//input"):
if _input.type in ["text", "tel", "email"]:
attrs = _input.attrib
text = attrs.pop("value", "")
# We don't want this attribute in the `<p>`
del(attrs["type"])
attrs["readonly"] = "1"
p_readonly = _input.makeelement("p", attrib=attrs)
p_readonly.text = text
_input.addprevious(p_readonly)
_input.getparent().remove(_input)
for _select in fragment.iterfind(
".//form[@action='/my/account']//select"):
# Maybe there's a prettier way to extract the selected value
option = [
x for x in _select.getchildren()
if x.attrib.get("value", "") == _select.value
]
text = option and option[0].text or ""
attrs = _select.attrib
attrs["readonly"] = "1"
p_readonly = _select.makeelement("p", attrib=attrs)
p_readonly.text = text
_select.addprevious(p_readonly)
_select.getparent().remove(_select)
for _button in fragment.iterfind(
".//form[@action='/my/account']//button"):
_button.getparent().remove(_button)
return b"".join(html.tostring(f) for f in fragments)

13
portal_partner_data_no_edit/models/res_partner.py

@ -0,0 +1,13 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class ResPartner(models.Model):
_inherit = "res.partner"
block_portal_data_edit = fields.Boolean(
string="Block Customer Info Edit",
help="Block portal info editing for the portal "
"user linked to this partner",
)

7
portal_partner_data_no_edit/readme/CONFIGURE.rst

@ -0,0 +1,7 @@
To test this module, you need to:
#. Block portal info editing for a partner:
- Go to *Contacts* and choose the partner.
- In the the *Sales and Purchases* tab, *Misc* section there is a field named
*Block Portal Info Edit*. Enable or disable at your convenience.

3
portal_partner_data_no_edit/readme/CREDITS.rst

@ -0,0 +1,3 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* David Vidal

2
portal_partner_data_no_edit/readme/DESCRIPTION.rst

@ -0,0 +1,2 @@
This module allows to block portal users info editing to prevent unproper
changes. We can configure it on every partner.

3
portal_partner_data_no_edit/readme/ROADMAP.rst

@ -0,0 +1,3 @@
- Add the `block_portal_data_edit` flag to the invite to portal popup.
- Add a text on the page highlighted (for example with info BS class), saying for those
blocked users that they should contact the company for any modification.

5
portal_partner_data_no_edit/readme/USAGE.rst

@ -0,0 +1,5 @@
Once configured log in with that user and:
- Go to `/my/account/`
- If the editing is blocked, you won't be able to edit any detail or submit
the form.

BIN
portal_partner_data_no_edit/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

459
portal_partner_data_no_edit/static/description/index.html

@ -0,0 +1,459 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Portal Partner Block Data Edit</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="portal-partner-block-data-edit">
<h1 class="title">Portal Partner Block Data Edit</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/partner-contact/tree/12.0/portal_partner_data_no_edit"><img alt="OCA/partner-contact" src="https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/partner-contact-12-0/partner-contact-12-0-portal_partner_data_no_edit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/134/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows to block portal users info editing to prevent unproper
changes. We can configure it on every partner.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#other-credits" id="id7">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>To test this module, you need to:</p>
<ol class="arabic simple">
<li>Block portal info editing for a partner:</li>
</ol>
<blockquote>
<ul class="simple">
<li>Go to <em>Contacts</em> and choose the partner.</li>
<li>In the the <em>Sales and Purchases</em> tab, <em>Misc</em> section there is a field named
<em>Block Portal Info Edit</em>. Enable or disable at your convenience.</li>
</ul>
</blockquote>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>Once configured log in with that user and:</p>
<blockquote>
<ul class="simple">
<li>Go to <cite>/my/account/</cite></li>
<li>If the editing is blocked, you won’t be able to edit any detail or submit
the form.</li>
</ul>
</blockquote>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Add the <cite>block_portal_data_edit</cite> flag to the invite to portal popup.</li>
<li>Add a text on the page highlighted (for example with info BS class), saying for those
blocked users that they should contact the company for any modification.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/partner-contact/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/partner-contact/issues/new?body=module:%20portal_partner_data_no_edit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#id7">Other credits</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>David Vidal</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/partner-contact/tree/12.0/portal_partner_data_no_edit">OCA/partner-contact</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

60
portal_partner_data_no_edit/static/src/js/portal_partner_data_no_edit_tour.js

@ -0,0 +1,60 @@
/* Copyright 2021 Tecnativa - David Vidal
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
odoo.define("portal_partner_data_default.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
var base = require("web_editor.base");
var steps = [
{
trigger: "div.o_portal_my_details a:contains('Edit')",
},
{
trigger: "input[name=name]",
run: 'Mr. Odoo',
},
{
trigger: "button[type=submit]",
},
];
tour.register("portal_partner_data_no_edit_default_tour",
{
url: "/my",
test: true,
wait_for: base.ready(),
},
steps
);
return {
steps: steps,
};
});
odoo.define("portal_partner_data_block.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
var base = require("web_editor.base");
var steps = [
{
trigger: "div.o_portal_my_details a:contains('View')",
},
{
trigger: "p[name=name]",
},
];
tour.register("portal_partner_data_no_edit_block_tour",
{
url: "/my",
test: true,
wait_for: base.ready(),
},
steps
);
return {
steps: steps,
};
});

1
portal_partner_data_no_edit/tests/__init__.py

@ -0,0 +1 @@
from . import test_portal_partner_data_no_edit

38
portal_partner_data_no_edit/tests/test_portal_partner_data_no_edit.py

@ -0,0 +1,38 @@
# Copyright 2020 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests import tagged, common
@tagged('post_install', '-at_install')
class PortalHttpCase(common.HttpCase):
def setUp(self):
super().setUp()
self.partner = self.env.ref("base.partner_demo_portal")
def test_portal_partner_default(self):
"""The default standard behavior"""
tour = (
"odoo.__DEBUG__.services['web_tour.tour']",
"portal_partner_data_no_edit_default_tour",
)
self.browser_js(
url_path="/my",
code="%s.run('%s')" % tour,
ready="%s.tours.%s.ready" % tour,
login="portal",
)
def test_portal_partner_blocked(self):
"""There's no form fields anymore"""
self.partner.block_portal_data_edit = True
tour = (
"odoo.__DEBUG__.services['web_tour.tour']",
"portal_partner_data_no_edit_block_tour",
)
self.browser_js(
url_path="/my",
code="%s.run('%s')" % tour,
ready="%s.tours.%s.ready" % tour,
login="portal",
)

9
portal_partner_data_no_edit/views/assets.xml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_common" inherit_id="web.assets_common">
<xpath expr=".">
<script type="text/javascript"
src="/portal_partner_data_no_edit/static/src/js/portal_partner_data_no_edit_tour.js"/>
</xpath>
</template>
</odoo>

11
portal_partner_data_no_edit/views/portal_template.xml

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<odoo>
<template id="o_portal_my_details" inherit_id="portal.portal_layout">
<xpath expr="//div[hasclass('o_portal_my_details')]//h4/a[@href='/my/account']" position="attributes">
<attribute name="t-if">not block_portal_data_edit</attribute>
</xpath>
<xpath expr="//div[hasclass('o_portal_my_details')]//h4/a[@href='/my/account']" position="after">
<a t-else="" role="button" href="/my/account" class="btn btn-sm btn-link"><i class="fa fa-eye"/> View</a>
</xpath>
</template>
</odoo>

12
portal_partner_data_no_edit/views/res_partner_views.xml

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<odoo>
<record id="view_partner_form" model="ir.ui.view">
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="ref" position="after">
<field name="block_portal_data_edit" />
</field>
</field>
</record>
</odoo>

2
setup/_metapackage/VERSION.txt

@ -1 +1 @@
12.0.20201019.0
12.0.20210204.0

2
setup/_metapackage/setup.py

@ -58,10 +58,12 @@ setuptools.setup(
'odoo12-addon-partner_phone_extension',
'odoo12-addon-partner_phonecall_schedule',
'odoo12-addon-partner_postal_address',
'odoo12-addon-partner_pricelist_search',
'odoo12-addon-partner_priority',
'odoo12-addon-partner_ref_unique',
'odoo12-addon-partner_second_lastname',
'odoo12-addon-partner_vat_unique',
'odoo12-addon-portal_partner_data_no_edit',
'odoo12-addon-portal_partner_select_all',
],
classifiers=[

1
setup/partner_pricelist_search/odoo/addons/partner_pricelist_search

@ -0,0 +1 @@
../../../../partner_pricelist_search

6
setup/partner_pricelist_search/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/portal_partner_data_no_edit/odoo/addons/portal_partner_data_no_edit

@ -0,0 +1 @@
../../../../portal_partner_data_no_edit

6
setup/portal_partner_data_no_edit/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Loading…
Cancel
Save