Repository
odoo/odoo · module folder
Module version
0.1.0
Category
Hidden
Folder size
3.0 MB
License
LGPL-3
Application
No
Auto-installable
No
Website
None
Last tracking update
2026-08-15 22:44:21
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, Josse Colpaert, Odoo Translation Bot, David Monjoie, Nicolas Martinelli, Aaron Bohy, Géry Debongnie, Jeremy Kersten, qsm-odoo, Alexandre Kühn, Julien Castiaux, Victor Feyens, Sébastien Theys, std-odoo, Achraf (abz), Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, Kishan Gajjar, Benoit Socias, Miquel Raïch, Didier (did), Florian Vranckx, luvi, Alexandre D. Díaz, tsm-odoo, Louis Wicket (wil), Thomas Lefebvre (thle), alsh-odoo, Robin Lejeune (role), Dylan Kiss (dyki), Valeriya(vchu), Mayurrajsinh Rathod, bram1000, Zelong Lin, Walid (wasa), stefanorigano (SRI), aktr-odoo, Youssef Bashandy, Maryam Kia, Louis (loti), Serge Bayet (seba), kcv-odoo, Alex Kühn, Chrysanthe (chgo), Junqi Wu, mano-odoo, thle-odoo, Xavier Luyckx (xlu), Ryan Cen, gteboul, Manushi Shah, Rahil Ghanchi, Sébastien (blse), paan-odoo, sben-odoo, Anton Romanova (roan), Bastien PIERRE, Sherif Gabr, pish-odoo, Krzysztof Magusiak (krma), Hadi El Yakhni, Elier Ayala Bernal, Gurpreet Singh, pajo, defl, Giorgio Tocco (gito), adip-odoo, Alessandro Lupo, Nisarg (nipl), Lionel Piraux (lipi), Kevin Gerard (kege), mibav-odoo, Mazen, Romain (roto), Atovange, Julien (jdeh), ibo-odoo, raja prasad, Haja Ram, Francesco Calicchio (frca), qucol-odoo
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
account, auth_passkey_portal, auth_password_policy_portal, auth_totp_portal, contract, digest, event, fieldservice_portal, helpdesk_mgmt, l10n_es_aeat_mod347, loyalty, mail_group, mass_mailing_sms, payment, portal_debranding, portal_rating, project, project_key, resource_booking, sign_oca, spreadsheet, test_mail_full, website, website_crm_partner_assign, website_payment
Description
This module adds required base code for a fully integrated customer portal.
It contains the base controller class and base templates. Business addons
will add their specific templates and controllers to extend the customer
portal.

This module contains most code coming from odoo v10 website_portal. Purpose
of this module is to allow the display of a customer portal without having
a dependency towards website editing and customization capabilities.

Code Analysis

Views touched (38)
XML IDNameModelTypeStatus
footer_language_selector Footer Language Selector ir.ui.view qweb Inherits portal.frontend_layout
frontend_layout Main Frontend Layout ir.ui.view qweb Inherits web.frontend_layout
language_selector Language Selector ir.ui.view qweb New
message_document_unfollowed message_document_unfollowed ir.ui.view qweb Inherits mail.message_document_unfollowed
message_thread message_thread ir.ui.view qweb New
my_account_link Link to frontend portal ir.ui.view qweb Inherits portal.user_dropdown
pager Pager ir.ui.view qweb New
placeholder_user_sign_in User Sign In Placeholder ir.ui.view qweb New
portal.address_card Address Card ir.ui.view qweb New
portal.address_footer portal.address_footer ir.ui.view qweb New
portal.address_form_fields Address Details ir.ui.view qweb New
portal.address_list portal.address_list ir.ui.view qweb New
portal.address_management Address Management ir.ui.view qweb New
portal.my_addresses portal.my_addresses ir.ui.view qweb New
portal.portal_my_details Contact Details ir.ui.view qweb New
portal.signature_form Ask Signature ir.ui.view qweb New
portal.user_sign_in_redirect User Sign In redirect ir.ui.view qweb Inherits portal.user_sign_in
portal_back_in_edit_mode Back to edit mode ir.ui.view qweb New
portal_breadcrumbs Portal Breadcrumbs ir.ui.view qweb New
portal_contact Contact ir.ui.view qweb New
portal_docs_entry My Portal Docs Entry ir.ui.view qweb New
portal_docs_entry_layout Use Pictograms ir.ui.view qweb Inherits portal.portal_docs_entry
portal_layout Portal Layout ir.ui.view qweb New
portal_my_contact portal_my_contact ir.ui.view qweb New
portal_my_home My Portal ir.ui.view qweb New
portal_my_security portal_my_security ir.ui.view qweb New
portal_record_sidebar My Portal Record Sidebar ir.ui.view qweb New
portal_searchbar Portal Search Bar ir.ui.view qweb New
portal_share_template portal_share_template ir.ui.view qweb New
portal_share_wizard portal.share.wizard portal.share form New
portal_sidebar Sidebar ir.ui.view qweb New
portal_table My Portal Table ir.ui.view qweb New
record_pager Portal Record Pager ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.portal res.config.settings form Inherits base_setup.res_config_settings_view_form
side_content side_content ir.ui.view qweb New
user_dropdown Portal User Dropdown ir.ui.view qweb New
user_sign_in User Sign In ir.ui.view qweb Inherits portal.placeholder_user_sign_in
wizard_view Grant portal access portal.wizard form New
HTTP endpoints (18)
Route(s)HandlerAuthTypeMethodsFlags
/my/account CustomerPortal.account user http ALL website
/my/address/archive CustomerPortal.address_archive user jsonrpc POST sudo website
/portal/attachment/remove CustomerPortal.attachment_remove public jsonrpc ALL
/my/counters CustomerPortal.counters user jsonrpc ALL website
/my/deactivate_account CustomerPortal.deactivate_account user http POST sudo website
/my, /my/home CustomerPortal.home user http ALL website
/my/addresses CustomerPortal.my_addresses user http ALL website
/my/address CustomerPortal.portal_address user http GET sudo website
/my/address/country_info/<model("res.country"):country> CustomerPortal.portal_address_country_info public jsonrpc POST sudo website
/my/address/submit CustomerPortal.portal_address_submit user http POST sudo website
/my/security CustomerPortal.security user http GET, POST sudo website
(inherited route override) Home.index inherited http ALL
(inherited route override) Home.web_client inherited http ALL
/mail/unfollow MailController.mail_action_unfollow public http ALL website
/mail/avatar/mail.message/<int:res_id>/author_avatar/<int:width>x<int:height> PortalChatter.portal_avatar public http ALL sudo
/portal/chatter_init PortalChatter.portal_chatter_init public jsonrpc ALL sudo website
/mail/chatter_fetch PortalChatter.portal_message_fetch public jsonrpc ALL sudo website
/mail/update_is_internal PortalChatter.portal_message_update_is_internal user jsonrpc ALL website
Models touched (12)

New fields (0)

No new fields.

Public methods (1)
  • get_frontend_session_info(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • customize_show Boolean
    default=False args: 'Show As Optional Inherit'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • portal_message_format(self, options=None)
    Simpler and portal-oriented version of 'message_format'. Purpose is to prepare, organize and format values required by frontend widget (frontend Chatter). This public API asks for read access on messages before doing the actual computation in the private implementation. :param dict options: options, used notably for inheritance and adding specific fields or properties to compute; :returns: list of dict, one per message in self. Each dict contains values for either fields, either properties derived from fields. :rtype: list[dict]

New fields (1)
  • website_message_ids One2many → mail.message
    bypass_search_access=True domain=<expr> help='Website communication history' string='Website Messages' args: 'mail.message', 'res_id'
Public methods (0)

No public methods.

New fields (3)
  • access_token Char
    copy=False args: 'Security Token'
  • access_url Char
    compute='_compute_access_url' help='Customer Portal URL' args: 'Portal Access URL'
  • access_warning Text
    compute='_compute_access_warning' args: 'Access warning'
Public methods (2)
  • action_share(self)
    @api.model
  • get_portal_url(self, suffix=None, report_type=None, download=None, query_string=None, anchor=None)
    Get a portal url for this model, including access_token. The associated route must handle the flags for them to have any effect. - suffix: string to append to the url, before the query string - report_type: report_type query string, often one of: html, pdf, text - download: set the download query string to true - query_string: additional query string - anchor: string to append after the anchor #

New fields (7)
  • access_warning Text
    compute='_compute_access_warning' args: 'Access warning'
  • note Text
    help='Add extra content to display in the email'
  • partner_ids Many2many → res.partner
    required=True string='Recipients' args: 'res.partner'
  • res_id Integer
    required=True args: 'Related Document ID'
  • res_model Char
    required=True args: 'Related Document Model'
  • resource_ref Reference
    compute='_compute_resource_ref' args: '_selection_target_model', 'Related Document'
  • share_link Char
    compute='_compute_share_link' string='Link'
Public methods (2)
  • action_send_mail(self)
  • default_get(self, fields)
    @api.model

New fields (3)
  • partner_ids Many2many → res.partner
    default=_default_partner_ids string='Partners' args: 'res.partner'
  • user_ids One2many → portal.wizard.user
    compute='_compute_user_ids' readonly=False store=True string='Users' args: 'portal.wizard.user', 'wizard_id'
  • welcome_message Text
    help='This text is included in the email sent to new users of the portal.' args: 'Invitation Message'
Public methods (1)
  • action_open_wizard(self)
    @api.model
    Create a "portal.wizard" and open the form view. We need a server action for that because the one2many "user_ids" records need to exist to be able to execute an a button action on it. If they have no ID, the buttons will be disabled and we won't be able to click on them. That's why we need a server action, to create the records and then open the form view on them.

New fields (8)
  • email Char
    args: 'Email'
  • email_state Selection
    compute='_compute_email_state' default='ok' string='Status' args: [('ok', 'Valid'), ('ko', 'Invalid'), ('exist', 'Already Registered')]
  • is_internal Boolean
    compute='_compute_group_details' args: 'Is Internal'
  • is_portal Boolean
    compute='_compute_group_details' args: 'Is Portal'
  • login_date Datetime
    related='user_id.login_date' string='Latest Authentication'
  • partner_id Many2one → res.partner
    ondelete='cascade' readonly=True required=True string='Contact' args: 'res.partner'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=True string='User' args: 'res.users'
  • wizard_id Many2one → portal.wizard
    ondelete='cascade' required=True string='Wizard' args: 'portal.wizard'
Public methods (4)
  • action_grant_access(self)
    Grant the portal access to the partner. If the partner has no linked user, we will create a new one in the same company as the partner (or in the current company if not set). An invitation email will be sent to the partner.
  • action_invite_again(self)
    Re-send the invitation email to the partner.
  • action_refresh_modal(self)
    Refresh the portal wizard modal and keep it open. Used as fallback action of email state icon buttons, required as they must be non-disabled buttons to fire mouse events to show tooltips on email state.
  • action_revoke_access(self)
    Archive the portal user of the partner. User is kept in `group_portal` as `group_public` should only be used for automated tasks and guest interactions.

New fields (1)
  • portal_allow_api_keys Boolean
    compute='_compute_portal_allow_api_keys' inverse='_inverse_portal_allow_api_keys' string='Customer API Keys'
Public methods (1)
  • get_values(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • can_edit_vat(self)
    `vat` is a commercial field, synced between the parent (commercial entity) and the children. Only the commercial entity should be able to edit it (as in backend).

New fields (0)

No new fields.

Public methods (1)
  • check_access_make_key(self)

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…