TIP: You can type at any time to perform a new search.
Customer Portal
portal · odoo/odoo
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
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) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/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_showBooleandefault=False args: 'Show As Optional Inherit'
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_idsOne2many → mail.messagebypass_search_access=Truedomain=<expr>help='Website communication history'string='Website Messages' args: 'mail.message', 'res_id'
No public methods.
New fields (3)
-
access_tokenCharcopy=False args: 'Security Token' -
access_urlCharcompute='_compute_access_url'help='Customer Portal URL' args: 'Portal Access URL' -
access_warningTextcompute='_compute_access_warning' args: 'Access warning'
-
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_warningTextcompute='_compute_access_warning' args: 'Access warning' -
noteTexthelp='Add extra content to display in the email' -
partner_idsMany2many → res.partnerrequired=Truestring='Recipients' args: 'res.partner' -
res_idIntegerrequired=True args: 'Related Document ID' -
res_modelCharrequired=True args: 'Related Document Model' -
resource_refReferencecompute='_compute_resource_ref' args: '_selection_target_model', 'Related Document' -
share_linkCharcompute='_compute_share_link'string='Link'
-
action_send_mail(self) -
default_get(self, fields)@api.model
New fields (3)
-
partner_idsMany2many → res.partnerdefault=_default_partner_idsstring='Partners' args: 'res.partner' -
user_idsOne2many → portal.wizard.usercompute='_compute_user_ids'readonly=Falsestore=Truestring='Users' args: 'portal.wizard.user', 'wizard_id' -
welcome_messageTexthelp='This text is included in the email sent to new users of the portal.' args: 'Invitation Message'
-
action_open_wizard(self)@api.modelCreate 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)
-
emailCharargs: 'Email' -
email_stateSelectioncompute='_compute_email_state'default='ok'string='Status' args: [('ok', 'Valid'), ('ko', 'Invalid'), ('exist', 'Already Registered')] -
is_internalBooleancompute='_compute_group_details' args: 'Is Internal' -
is_portalBooleancompute='_compute_group_details' args: 'Is Portal' -
login_dateDatetimerelated='user_id.login_date'string='Latest Authentication' -
partner_idMany2one → res.partnerondelete='cascade'readonly=Truerequired=Truestring='Contact' args: 'res.partner' -
user_idMany2one → res.userscompute='_compute_user_id'compute_sudo=Truestring='User' args: 'res.users' -
wizard_idMany2one → portal.wizardondelete='cascade'required=Truestring='Wizard' args: 'portal.wizard'
-
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_keysBooleancompute='_compute_portal_allow_api_keys'inverse='_inverse_portal_allow_api_keys'string='Customer API Keys'
-
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…