Browse Source

Merge PR #1052 into 12.0

Signed-off-by pedrobaeza
12.0_partner_gogocarto
OCA-git-bot 3 years ago
parent
commit
1c13aa61da
  1. 103
      portal_partner_data_no_edit/README.rst
  2. 2
      portal_partner_data_no_edit/__init__.py
  3. 20
      portal_partner_data_no_edit/__manifest__.py
  4. 1
      portal_partner_data_no_edit/controllers/__init__.py
  5. 22
      portal_partner_data_no_edit/controllers/portal.py
  6. 45
      portal_partner_data_no_edit/i18n/es.po
  7. 44
      portal_partner_data_no_edit/i18n/portal_partner_data_no_edit.pot
  8. 2
      portal_partner_data_no_edit/models/__init__.py
  9. 52
      portal_partner_data_no_edit/models/ir_ui_view.py
  10. 13
      portal_partner_data_no_edit/models/res_partner.py
  11. 7
      portal_partner_data_no_edit/readme/CONFIGURE.rst
  12. 3
      portal_partner_data_no_edit/readme/CREDITS.rst
  13. 2
      portal_partner_data_no_edit/readme/DESCRIPTION.rst
  14. 3
      portal_partner_data_no_edit/readme/ROADMAP.rst
  15. 5
      portal_partner_data_no_edit/readme/USAGE.rst
  16. 459
      portal_partner_data_no_edit/static/description/index.html
  17. 60
      portal_partner_data_no_edit/static/src/js/portal_partner_data_no_edit_tour.js
  18. 1
      portal_partner_data_no_edit/tests/__init__.py
  19. 38
      portal_partner_data_no_edit/tests/test_portal_partner_data_no_edit.py
  20. 9
      portal_partner_data_no_edit/views/assets.xml
  21. 11
      portal_partner_data_no_edit/views/portal_template.xml
  22. 12
      portal_partner_data_no_edit/views/res_partner_views.xml

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"

44
portal_partner_data_no_edit/i18n/portal_partner_data_no_edit.pot

@ -0,0 +1,44 @@
# 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:11+0000\n"
"PO-Revision-Date: 2021-02-04 10:11+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: 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,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.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,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.

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: 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>
Loading…
Cancel
Save