Compare commits
2 Commits
14.0-scss-
...
14.0-websi
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ce49dc81c9 |
[MOV] live chat: structure
task-3269837 |
||
|
|
08c192e226 |
[MOV] website: structure
As a first step to update the doc - at last! - we first need to update its structure. task-3269837 |
|
|
@@ -13,7 +13,7 @@ personal email address or an address created by a custom domain.
|
|||
|
||||
.. seealso::
|
||||
- :doc:`/applications/general/auth/azure`
|
||||
- :doc:`/applications/productivity/calendar/outlook`
|
||||
- :doc:`/applications/general/calendars/outlook/outlook_calendar`
|
||||
|
||||
Setup in Microsoft Azure Portal
|
||||
===============================
|
||||
|
|
|
|||
|
|
@@ -13,7 +13,7 @@ email address or an address created by a custom domain.
|
|||
|
||||
.. seealso::
|
||||
- :doc:`/applications/general/auth/google`
|
||||
- :doc:`/applications/productivity/calendar/google`
|
||||
- :doc:`/applications/general/calendars/google/google_calendar_credentials`
|
||||
|
||||
Setup in Google
|
||||
===============
|
||||
|
|
|
|||
|
|
@@ -174,9 +174,8 @@ Do the same for all the sales taxes that the company needs, either those that co
|
|||
Odoo, or those that you add that are necessary for your company bill.
|
||||
|
||||
.. tip::
|
||||
For the 0% VAT tax, select the option :guilabel:`Tasa` within the :guilabel:`Factor Type` field.
|
||||
For the 0% VAT **exempt** tax, select the option :guilabel:`Exento` instead of :guilabel:`Tasa`
|
||||
within the :guilabel:`Factor Type` field.
|
||||
For the 0% VAT tax, select the option *Exento* instead of *Tasa* within the **Factor Type**
|
||||
field.
|
||||
|
||||
When registering a payment, Odoo will carry out the movement of taxes from the **Cash Basis
|
||||
Transition Account** to the account set in the **Definition** tab. For such movement, a tax base
|
||||
|
|
|
|||
|
|
@@ -10,5 +10,6 @@ Miscellaneous
|
|||
general/export_import_data
|
||||
general/email_communication
|
||||
general/voip
|
||||
general/calendars
|
||||
general/in_app_purchase
|
||||
general/developer_mode
|
||||
|
|
|
|||
|
|
@@ -6,5 +6,5 @@ Due to specific requirements in Azure's OAuth implementation, Microsoft Azure OA
|
|||
is NOT compatible with Odoo at the moment.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../../productivity/calendar/outlook`
|
||||
- :doc:`/applications/general/calendars/outlook/outlook_calendar`
|
||||
- :doc:`/administration/maintain/azure_oauth`
|
||||
|
|
|
|||
|
|
@@ -9,7 +9,7 @@ This is particularly helpful if your organization uses Google Workforce and you
|
|||
within your organization to connect to Odoo with their Google Accounts.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../../productivity/calendar/google`
|
||||
- :doc:`/applications/general/calendars/google/google_calendar_credentials`
|
||||
- :doc:`/administration/maintain/google_oauth`
|
||||
|
||||
.. _google-sign-in/configuration:
|
||||
|
|
|
|||
11
content/applications/general/calendars.rst
Normal file
|
|
@@ -0,0 +1,11 @@
|
|||
:nosearch:
|
||||
|
||||
=========
|
||||
Calendars
|
||||
=========
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
calendars/outlook/outlook_calendar
|
||||
calendars/google/google_calendar_credentials
|
||||
|
|
@@ -1,6 +1,6 @@
|
|||
===============================
|
||||
Google Calendar synchronization
|
||||
===============================
|
||||
=====================================
|
||||
Synchronize Google Calendar with Odoo
|
||||
=====================================
|
||||
|
||||
Synchronize Google Calendar with Odoo to see and manage meetings from both platforms (updates go
|
||||
in both directions). This integration helps organize your schedule so you never miss a meeting.
|
||||
|
|
@@ -25,7 +25,7 @@ Begin by creating a new Google API project and enabling the Google Calendar API.
|
|||
|
||||
Next, click :guilabel:`Select a project` and select or create an API project to store credentials.
|
||||
|
||||
.. image:: google/new-api-project.png
|
||||
.. image:: google_calendar_credentials/new-api-project.png
|
||||
:align: center
|
||||
:alt: Create a new API project to store credentials.
|
||||
|
||||
|
|
@@ -34,14 +34,14 @@ Next, click :guilabel:`Select a project` and select or create an API project to
|
|||
|
||||
Then, open the API Project and click :guilabel:`Enable APIs and Services`.
|
||||
|
||||
.. image:: google/enable-apis-services.png
|
||||
.. image:: google_calendar_credentials/enable-apis-services.png
|
||||
:align: center
|
||||
:alt: Enable APIs and Services on the API Project.
|
||||
|
||||
After that, search for *Google Calendar API* using the search bar and select :guilabel:`Google
|
||||
Calendar API` from the search results. Click :guilabel:`Enable`.
|
||||
|
||||
.. image:: google/enable-google-cal-api.png
|
||||
.. image:: google_calendar_credentials/enable-google-cal-api.png
|
||||
:align: center
|
||||
:alt: Enable the Google Calendar API.
|
||||
|
||||
|
|
@@ -55,7 +55,7 @@ four steps to create your API credentials.
|
|||
- In the first step, :guilabel:`Credential Type`, select the :guilabel:`Google Calendar API` and
|
||||
:guilabel:`User Data` options. Then, click :guilabel:`Next`.
|
||||
|
||||
.. image:: google/credential-type.png
|
||||
.. image:: google_calendar_credentials/credential-type.png
|
||||
:align: center
|
||||
:alt: Select Google Calendar API and User Data for the Credential Type.
|
||||
|
||||
|
|
@@ -76,7 +76,7 @@ four steps to create your API credentials.
|
|||
your company's Odoo URL address followed by */google_account/authentication*. Finally, click
|
||||
:guilabel:`Create` and :guilabel:`Done`.
|
||||
|
||||
.. image:: google/uri.png
|
||||
.. image:: google_calendar_credentials/uri.png
|
||||
:align: center
|
||||
:alt: Add the authorized JavaScript origins and the authorized redirect URIs.
|
||||
|
||||
|
|
@@ -94,7 +94,7 @@ Next, locate the credentials you just created for the Google Calendar API. Then,
|
|||
:guilabel:`Edit OAuth Client` (the pencil icon). The page will redirect to the edit page, where you
|
||||
can view the Client ID and the Client Secret.
|
||||
|
||||
.. image:: google/edit-oauth-2.png
|
||||
.. image:: google_calendar_credentials/edit-oauth-2.png
|
||||
:align: center
|
||||
:alt: Click Edit OAuth Client to view the credential details.
|
||||
|
||||
|
|
@@ -105,7 +105,7 @@ Once the Client ID and the Client Secret are located, open the Odoo database and
|
|||
:menuselection:`Settings --> General Settings --> Integrations --> Google Calendar`. Check the box
|
||||
next to :guilabel:`Google Calendar`.
|
||||
|
||||
.. image:: google/settings-google-cal.png
|
||||
.. image:: google_calendar_credentials/settings-google-cal.png
|
||||
:align: center
|
||||
:alt: The Google Calendar checkbox in General Settings.
|
||||
|
||||
|
|
@@ -116,7 +116,7 @@ page into their respective fields below the :guilabel:`Google Calendar` checkbox
|
|||
Finally, open the Calendar module in Odoo and click on the :guilabel:`Google` sync button to sync
|
||||
Google Calendar with Odoo.
|
||||
|
||||
.. image:: google/sync-google.png
|
||||
.. image:: google_calendar_credentials/sync-google.png
|
||||
:align: center
|
||||
:alt: Click the Google sync button in Odoo Calendar to sync Google Calendar with Odoo.
|
||||
|
||||
|
|
@@ -124,12 +124,12 @@ Google Calendar with Odoo.
|
|||
The first time you sync your Google Calendar with Odoo, the page will redirect to your Google
|
||||
Account. Click :guilabel:`OK` and :guilabel:`Allow` to authorize Odoo to access Google Calendar.
|
||||
|
||||
.. image:: google/trust-odoo.png
|
||||
.. image:: google_calendar_credentials/trust-odoo.png
|
||||
:align: center
|
||||
:alt: Give Odoo permission to access Google Calendar.
|
||||
|
||||
Now, Odoo Calendar is successfully synced with Google Calendar!
|
||||
|
||||
.. image:: google/successful-sync.png
|
||||
.. image:: google_calendar_credentials/successful-sync.png
|
||||
:align: center
|
||||
:alt: Successfully sync between Odoo and Google Calendar.
|
||||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
|
@@ -1,6 +1,6 @@
|
|||
================================
|
||||
Outlook Calendar synchronization
|
||||
================================
|
||||
======================================
|
||||
Synchronize Outlook Calendar with Odoo
|
||||
======================================
|
||||
|
||||
Synchronizing a user's Outlook Calendar with Odoo is useful for keeping track of their tasks and
|
||||
appointments across all related applications.
|
||||
|
|
@@ -33,7 +33,7 @@ URI (URL) followed by `/microsoft_account/authentication`.
|
|||
Enter `https://www.companyname.odoo.com/microsoft_account/authentication` for the
|
||||
:guilabel:`Redirect URI`.
|
||||
|
||||
.. image:: outlook/azure-register-application.png
|
||||
.. image:: outlook_calendar/azure-register-application.png
|
||||
:align: center
|
||||
:alt: The "Supported account type" and "Redirect URI" settings in the Microsoft Azure AD portal.
|
||||
|
||||
|
|
@@ -58,27 +58,27 @@ Configuration in Odoo
|
|||
In the Odoo database, go to :menuselection:`Settings --> General Settings --> Integrations` and
|
||||
activate the :guilabel:`Outlook Calendar` setting.
|
||||
|
||||
.. image:: outlook/outlook-calendar-setting.png
|
||||
.. image:: outlook_calendar/outlook-calendar-setting.png
|
||||
:align: center
|
||||
:alt: The "Outlook Calendar" setting activated in Odoo.
|
||||
|
||||
From the Microsoft Azure portal, under the :guilabel:`Overview` section of the application, copy
|
||||
the :guilabel:`Application (Client) ID`, and paste it into the :guilabel:`Client ID` field in Odoo.
|
||||
|
||||
.. image:: outlook/client-id.png
|
||||
.. image:: outlook_calendar/client-id.png
|
||||
:align: center
|
||||
:alt: The "Client ID" in the Microsoft Azure portal.
|
||||
|
||||
In the Microsoft Azure portal, under the :guilabel:`Certificates & secrets` section, copy the
|
||||
:guilabel:`Client Secret Value` and paste it into the :guilabel:`Client Secret` field in Odoo.
|
||||
|
||||
.. image:: outlook/client-secret-value.png
|
||||
.. image:: outlook_calendar/client-secret-value.png
|
||||
:align: center
|
||||
:alt: The "Client Secret" token to be copied from Microsoft to Odoo.
|
||||
|
||||
Finally, on the Odoo :menuselection:`Settings --> General Settings` page, click :guilabel:`Save`.
|
||||
|
||||
.. _outlook/sync:
|
||||
.. _outlook_calendar/sync_with_outlook:
|
||||
|
||||
Sync with Outlook
|
||||
=================
|
||||
|
|
@@ -125,7 +125,7 @@ In the Odoo database, go to the :guilabel:`Calendar` module and click the :guila
|
|||
button. The page will redirect to a Microsoft login page, and the user is asked to log in to
|
||||
their account, if they are not already, and grant the required permissions.
|
||||
|
||||
.. image:: outlook/outlook-sync-button.png
|
||||
.. image:: outlook_calendar/outlook-sync-button.png
|
||||
:align: center
|
||||
:alt: The "Outlook" sync button in Odoo Calendar.
|
||||
|
||||
|
|
@@ -134,11 +134,11 @@ The synchronization is a two-way process, meaning that events are reconciled in
|
|||
|
||||
.. note::
|
||||
All users that want to use the synchronization simply need to :ref:`sync their calendar with
|
||||
Outlook <outlook/sync>`. The configuration of Microsoft's Azure account
|
||||
Outlook <outlook_calendar/sync_with_outlook>`. The configuration of Microsoft's Azure account
|
||||
is only done once, as Azure AD tenants' Client IDs and Client Secrets are unique, and represent
|
||||
an organization that helps the user to manage a specific instance of Microsoft cloud services
|
||||
for their internal and external users.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../../sales/crm/optimize/outlook_extension`
|
||||
- :doc:`google`
|
||||
- :doc:`../../../sales/crm/optimize/outlook_extension`
|
||||
- :doc:`../google/google_calendar_credentials`
|
||||
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
|
@@ -1,125 +1,45 @@
|
|||
=================================================
|
||||
Consignment: buy and sell stock without owning it
|
||||
=================================================
|
||||
===============================
|
||||
Manage Stock that you don't own
|
||||
===============================
|
||||
|
||||
Most of the time, products stored in a company's warehouse are either purchased from suppliers, or
|
||||
are manufactured in-house. However, suppliers will sometimes let companies store and sell products
|
||||
in the company's warehouse, without having to buy those items up-front. This is called
|
||||
*consignment*.
|
||||
Sometimes, suppliers can offer you to store and sell products without
|
||||
having to buy those items. This technique is called *consignee stock*.
|
||||
|
||||
Consignment is a useful method for suppliers to launch new products, and easily deliver to their
|
||||
customers. It's also a great way for the company storing the products (the consignee) to earn
|
||||
something back for their efforts. Consignees can even charge a fee for the convenience of storing
|
||||
products they don't actually own.
|
||||
Consignee stock is a great way for manufacturers and suppliers to launch
|
||||
new products. As resellers may be reluctant to buy a product they are
|
||||
not sure to be able to sell, consignee stock will allow them to offer an
|
||||
item to check its market without having to pay for it in the first
|
||||
place.
|
||||
|
||||
Enable the consignment setting
|
||||
==============================
|
||||
Of course, Odoo has the ability to manage those consignee stocks through
|
||||
advanced settings.
|
||||
|
||||
To receive, store, and sell consignment stock, the feature needs to be enabled in the settings. To
|
||||
do this, go to :menuselection:`Inventory --> Configuration --> Settings`, and under the
|
||||
:guilabel:`Traceability` section, check the box next to :guilabel:`Consignment`, and then click
|
||||
:guilabel:`Save` to finish.
|
||||
Configuration
|
||||
=============
|
||||
|
||||
.. image:: owned_stock/owned-stock-enable-consignment.png
|
||||
:align: center
|
||||
:alt: Enabled Consignment setting in Inventory configuration.
|
||||
To use this feature, go to :menuselection:`Inventory --> Configuration --> Settings` in
|
||||
the inventory app. Then, enable the *Consignment* feature in the
|
||||
*Traceability* section. Now, hit save.
|
||||
|
||||
Receive (and store) consignment stock
|
||||
=====================================
|
||||
.. image:: owned_stock/owned_stock_01.png
|
||||
:align: center
|
||||
|
||||
With the feature enabled in Odoo, consignment stock can now be received into a warehouse. From the
|
||||
main :menuselection:`Inventory` dashboard, click into the :guilabel:`Receipts`
|
||||
section. Then, click :guilabel:`Create`.
|
||||
Reception of Consignee Stock
|
||||
============================
|
||||
|
||||
When in the *Inventory* app, open the receipts and create a new
|
||||
reception. On the right side, you will see that a new line called
|
||||
*Assign Owner* has appeared. There, you can specify the partner which
|
||||
owns the stock.
|
||||
|
||||
.. image:: owned_stock/owned_stock_02.png
|
||||
:align: center
|
||||
|
||||
.. note::
|
||||
Consignment stock is not actually purchased from the vendor; it is simply received and stored.
|
||||
Because of this, there are no quotations or purchase orders involved in receiving consignment
|
||||
stock. So, *every* receipt of consignment stock will start by creating manual receipts.
|
||||
If you are the owner, you can leave the field blank.
|
||||
|
||||
Choose a vendor to enter in the :guilabel:`Receive From` field, and then choose the same vendor to
|
||||
enter in the :guilabel:`Assign Owner` field.
|
||||
Once the receipt is validated, the products enter your stock but still
|
||||
belong to the owner. They don’t impact your inventory valuation.
|
||||
|
||||
.. important::
|
||||
Since the products received from the vendor will be owned by the same vendor, the
|
||||
:guilabel:`Receive From` and :guilabel:`Assign Owner` fields must match.
|
||||
|
||||
Once the vendor-related fields are set, enter products into the :guilabel:`Product` lines, and set
|
||||
the quantities to be received into the warehouse under the :guilabel:`Done` column. If the
|
||||
:guilabel:`Units of Measure` feature is enabled, the :abbr:`UoM (Units of Measure)` can be changed,
|
||||
as well. Once all the consignment stock has been received, :guilabel:`Validate` the receipt.
|
||||
|
||||
.. image:: owned_stock/owned-stock-receipt-fields.png
|
||||
:align: center
|
||||
:alt: Matching vendor fields in consignment Receipt creation.
|
||||
|
||||
Sell and deliver consignment stock
|
||||
==================================
|
||||
|
||||
Once consignment stock has been received into the warehouse, it can be sold the same as any other
|
||||
in-stock product that has the :guilabel:`Can Be Sold` option enabled on the product form.
|
||||
|
||||
To create a sales order, navigate to the :menuselection:`Sales` app, and from the
|
||||
:guilabel:`Quotations` overview, click :guilabel:`Create`. Next, choose a customer to enter into the
|
||||
:guilabel:`Customer` field.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Customer` *must* be different from the :guilabel:`Vendor` that supplied the
|
||||
consignment stock received (and stored) in the warehouse.
|
||||
|
||||
Add the consignment product under the :guilabel:`Product` column in the order lines, set the
|
||||
:guilabel:`Quantity`, and fill out any other pertinent product details on the form. Once the
|
||||
quotation is complete, click :guilabel:`Confirm`.
|
||||
|
||||
.. image:: owned_stock/owned-stock-sales-order.png
|
||||
:align: center
|
||||
:alt: Sales order of consignment stock.
|
||||
|
||||
Once the :abbr:`RFQ (Request for Quotation)` has been confirmed, it will become a sales order. From
|
||||
here, the products can be delivered by clicking on the :guilabel:`Delivery` smart button, and
|
||||
selecting :guilabel:`Validate` to validate the delivery.
|
||||
|
||||
Traceability and reporting of consignment stock
|
||||
===============================================
|
||||
|
||||
Although consignment stock is owned by the vendor who supplied it, and not by the company storing it
|
||||
in their warehouse, consignment products will *still* appear in certain inventory reports.
|
||||
|
||||
To find inventory reports, go to :menuselection:`Inventory --> Reporting`, and choose a report to
|
||||
view.
|
||||
|
||||
.. note::
|
||||
Since the consignee does not actually own consigment stock, these products are *not* reflected
|
||||
in the :guilabel:`Stock Valuation` report, and have no impact on the consignee's inventory
|
||||
valuation.
|
||||
|
||||
Product moves report
|
||||
--------------------
|
||||
|
||||
To view all information about on-hand stock moves, navigate to the the :guilabel:`Product Moves`
|
||||
dashboard by going to :menuselection:`Inventory --> Reporting --> Product Moves`. For consignment
|
||||
products, the information in this report is the same as any other product: the history
|
||||
of its product moves can be reviewed; the :guilabel:`Quantity Done` and :guilabel:`Reference`
|
||||
document are available; and its :guilabel:`Locations` are available, as well. The consignment stock
|
||||
will originate from :guilabel:`Partner Location/Vendors`.
|
||||
|
||||
.. tip::
|
||||
To view a consignment product's moves by ownership, select the :guilabel:`Group By` filter,
|
||||
choose the :guilabel:`Add Custom Group` parameter, and then select :guilabel:`From Owner`, and
|
||||
:guilabel:`Apply` to finish.
|
||||
|
||||
.. image:: owned_stock/owned-stock-moves-history.png
|
||||
:align: center
|
||||
:alt: Consignment stock moves history.
|
||||
|
||||
.. tip::
|
||||
To see forecasted units of consignment stock, go to :menuselection:`Inventory --> Reporting -->
|
||||
Forecasted Inventory`.
|
||||
|
||||
Stock on hand report
|
||||
--------------------
|
||||
|
||||
View the :guilabel:`Stock On Hand` dashboard by navigating to :menuselection:`Inventory -->
|
||||
Reporting --> Inventory Report`. From this report, the :guilabel:`Locations` of all stock on-hand
|
||||
are displayed, in addition to the quantities per location. For consigment products, the
|
||||
:guilabel:`Owner` column will be populated with the owner of those products, or the original vendor
|
||||
who supplied the products in the first place.
|
||||
.. image:: owned_stock/owned_stock_03.png
|
||||
:align: center
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
|
@@ -8,6 +8,5 @@ Productivity
|
|||
.. toctree::
|
||||
|
||||
productivity/discuss
|
||||
productivity/calendar
|
||||
productivity/iot
|
||||
productivity/studio
|
||||
|
|
|
|||
|
|
@@ -1,11 +0,0 @@
|
|||
:nosearch:
|
||||
|
||||
========
|
||||
Calendar
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
calendar/outlook
|
||||
calendar/google
|
||||
|
|
@@ -10,6 +10,5 @@ Configuration
|
|||
|
||||
config/connect
|
||||
config/pos
|
||||
config/https_certificate_iot
|
||||
config/flash_sdcard
|
||||
config/troubleshooting
|
||||
|
|
|
|||
|
|
@@ -1,260 +0,0 @@
|
|||
.. _iot/https_certificate_iot:
|
||||
|
||||
=======================
|
||||
HTTPS certificate (IoT)
|
||||
=======================
|
||||
|
||||
What is HTTPS?
|
||||
==============
|
||||
|
||||
*Hypertext Transfer Protocol Secure* (HTTPS) is the secure version of *Hypertext Transfer Protocol*
|
||||
(HTTP), which is the primary protocol used to send data back and forth between a web browser and a
|
||||
website. :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` is encrypted in order to increase the
|
||||
security of data transfer.
|
||||
|
||||
:abbr:`HTTPS (Hypertext Transfer Protocol Secure)` uses an encryption protocol to encrypt
|
||||
communications. The protocol is called *Transport Layer Security* (TLS), although formerly it was
|
||||
known as *Secure Sockets Layer* (SSL).
|
||||
|
||||
:abbr:`HTTPS (Hypertext Transfer Protocol Secure)` occurs based upon the transmission of :abbr:`TLS
|
||||
(Transport Layer Security)`/:abbr:`SSL (Secure Sockets Layer)` certificates, which verify that a
|
||||
particular provider is who they say they are.
|
||||
|
||||
.. note::
|
||||
In this documentation and throughout Odoo the term "HTTPS certificate" will be used to define the
|
||||
fact that the :abbr:`SSL (Secure Sockets Layer)` certificate is valid and allows a :abbr:`HTTPS
|
||||
(Hypertext Transfer Protocol Secure)` connection.
|
||||
|
||||
Why is it needed?
|
||||
-----------------
|
||||
|
||||
In order to communicate with certain network devices (in particular for payment terminals), the
|
||||
usage of :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` is mandatory. If the :abbr:`HTTPS
|
||||
(Hypertext Transfer Protocol Secure)` certificate isn't valid, some devices won't be able to
|
||||
interact with the :abbr:`IoT (Internet of Things)` Box.
|
||||
|
||||
How to obtain a Hypertext Transfer Protocol Secure (HTTPS) certificate
|
||||
======================================================================
|
||||
|
||||
The generation of the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate is automatic.
|
||||
|
||||
The :abbr:`IoT (Internet of Things)` Box will send a specific request to `<https://www.odoo.com>`_
|
||||
which will send back the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate if the
|
||||
:abbr:`IoT (Internet of Things)` box and database are eligible.
|
||||
|
||||
.. _iot/iot-eligibility:
|
||||
|
||||
Internet of Things (IoT) eligibility
|
||||
------------------------------------
|
||||
|
||||
#. The database should be a **production** instance. The database instance should not be a copy, a
|
||||
duplicate, a staging, or a development environment.
|
||||
#. The Odoo subscription must:
|
||||
|
||||
- Have an :guilabel:`IoT Box Subscription` line.
|
||||
- :guilabel:`Status` must be :guilabel:`In Progress`.
|
||||
|
||||
If the subscription is linked to a `<https://www.odoo.com>`_ portal user check the information
|
||||
on the portal subscription page.
|
||||
|
||||
.. figure:: https_certificate_iot/sub-example-in-progress.png
|
||||
:align: center
|
||||
:alt: Odoo.com portal subscriptions filtered by "in progress".
|
||||
|
||||
In this case, both subscriptions are considered "in progress" as the :guilabel:`Filter By\:
|
||||
In Progress` was used.
|
||||
|
||||
.. note::
|
||||
If the subscription is in question, contact the database's Account Manager or Partner
|
||||
regarding the matter.
|
||||
|
||||
Troubleshooting Hypertext Transfer Protocol Secure (HTTPS) certificate errors
|
||||
=============================================================================
|
||||
|
||||
If anything goes wrong during the process of the "HTTPS certificate" generation or reception, a
|
||||
specific error will code be given on the :abbr:`IoT (Internet of Things)` box home page.
|
||||
|
||||
.. tip::
|
||||
Accessing the :abbr:`IoT (Internet of Things)` box homepage will check for the presence of the
|
||||
"HTTPS certificate" and will attempt its generation if it is missing. As such, if there is an
|
||||
error on the :abbr:`IoT (Internet of Things)` box home page, refresh the :abbr:`IoT (Internet of
|
||||
Things)` home page to see if the error disappears.
|
||||
|
||||
`ERR_IOT_HTTPS_CHECK_NO_SERVER`
|
||||
-------------------------------
|
||||
|
||||
Reason:
|
||||
The configuration regarding the server is missing. In other words, the Odoo instance is not
|
||||
connected with the IoT box.
|
||||
|
||||
Solution:
|
||||
Ensure that the server is configured.
|
||||
|
||||
.. seealso::
|
||||
:doc:`/applications/productivity/iot/config/connect`
|
||||
|
||||
`ERR_IOT_HTTPS_CHECK_CERT_READ_EXCEPTION`
|
||||
-----------------------------------------
|
||||
|
||||
Reason:
|
||||
An unhandled error happened when trying to read the existing :abbr:`HTTPS (Hypertext Transfer
|
||||
Protocol Secure)` certificate.
|
||||
|
||||
Solution:
|
||||
Ensure that the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate file is readable.
|
||||
|
||||
`ERR_IOT_HTTPS_LOAD_NO_CREDENTIAL`
|
||||
----------------------------------
|
||||
|
||||
Reason:
|
||||
The contract and/or database :abbr:`UUID (Universal Unique Identifier)` is missing.
|
||||
|
||||
Solution:
|
||||
Ensure that both values are configured as intended. To modify them, go to the :abbr:`IoT
|
||||
(Internet of Things)` box home page, and navigate to :guilabel:`Credential`.
|
||||
|
||||
`ERR_IOT_HTTPS_LOAD_REQUEST_EXCEPTION`
|
||||
--------------------------------------
|
||||
|
||||
Reason:
|
||||
An unexpected error happened when the :abbr:`IoT (Internet of Things)` box tried to reach
|
||||
`<https://www.odoo.com>`_. The causes are likely due to the network
|
||||
infrastructure/configuration:
|
||||
|
||||
- The :abbr:`IoT (Internet of Things)` box does not have access to internet.
|
||||
- The network does not allow the :abbr:`IoT (Internet of Things)` box to communicate with
|
||||
`<https://www.odoo.com>`_. This may be due to network devices preventing the communication
|
||||
(firewalls, etc.) or the network configuration (:abbr:`VPN (Virtual Private Network)`,
|
||||
etc.).
|
||||
|
||||
.. note::
|
||||
More information regarding the error that occurred can be found in the full request
|
||||
exception details, which are in the :abbr:`IoT (Internet of Things)` box logs.
|
||||
|
||||
Solution:
|
||||
.. warning::
|
||||
Consult with your system or network administrator should this issue arise. This error code
|
||||
depends on the network infrastructure and goes beyond :doc:`Odoo support's service scope
|
||||
</services/support/what_can_i_expect>`.
|
||||
|
||||
`ERR_IOT_HTTPS_LOAD_REQUEST_STATUS`
|
||||
-----------------------------------
|
||||
|
||||
Reason:
|
||||
The IoT-box was able to reach `<https://www.odoo.com>`_ but received an unusual
|
||||
`HTTP response (status codes)
|
||||
<https://developer.mozilla.org/en-US/docs/Web/HTTP/Status>`_.
|
||||
|
||||
This error code will also give the HTTP response status codes. For example, if the error reads
|
||||
`ERR_IOT_HTTPS_LOAD_REQUEST_STATUS 404` it means that the page returned a 404 error, which is
|
||||
the "Page Not Found" code.
|
||||
|
||||
Solution:
|
||||
Check if `<https://www.odoo.com>`_ is down using a web browser, as it's possible that it is down
|
||||
due to maintenance.
|
||||
|
||||
- If `<https://www.odoo.com>`_ is down due to maintenance, unfortunately there is nothing that
|
||||
can be done but instead wait for it to recover.
|
||||
- If `<https://www.odoo.com>`_ is not down due to maintenance, open a `support ticket
|
||||
<https://www.odoo.com/help>`_ on the matter. Ensure that the 3 digits status code next to the
|
||||
code error is included in the support ticket.
|
||||
|
||||
`ERR_IOT_HTTPS_LOAD_REQUEST_NO_RESULT`
|
||||
--------------------------------------
|
||||
|
||||
Reason:
|
||||
The :abbr:`IoT (Internet of Things)` box was able to reach `<https://www.odoo.com>`_ but it
|
||||
refused to deliver the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate.
|
||||
|
||||
Solution:
|
||||
Ensure that the :abbr:`IoT (Internet of Things)` box and database are eligible for a
|
||||
certificate: :ref:`Internet of Things (IoT) eligibility <iot/iot-eligibility>`.
|
||||
|
||||
How to ensure that the HTTPS certificate is correct
|
||||
===================================================
|
||||
|
||||
If the certificate has been applied successfully, a new :abbr:`HTTPS (Hypertext Transfer Protocol
|
||||
Secure)` :abbr:`URL (Uniform Resource Locator)` for the :abbr:`IoT (Internet of Things)` box ending
|
||||
with `.odoo-iot.com` will appear on the Odoo database, inside of the :menuselection:`IoT`
|
||||
application on that specific device's form.
|
||||
|
||||
.. image:: https_certificate_iot/odoo-new-domain.png
|
||||
:align: center
|
||||
:alt: Odoo IoT app IoT box with .odoo-iot.com domain.
|
||||
|
||||
When navigating to the :abbr:`URL (Uniform Resource Locator)` in a browser a secured :abbr:`HTTPS
|
||||
(Hypertext Transfer Protocol Secure)` connection will be established.
|
||||
|
||||
.. figure:: https_certificate_iot/secured-connection.png
|
||||
:align: center
|
||||
:alt: Example of valid SSL certificate details on the browser.
|
||||
|
||||
Padlock in Chrome on Windows 10 attesting the fact that the connection is secured in :abbr:`HTTPS
|
||||
(Hypertext Transfer Protocol Secure)`.
|
||||
|
||||
The IoT-box homepage will now display an `OK` status next to `HTTPS certificate`. The
|
||||
drop-down menu icon, when clicked, will reveal information regarding the certificate.
|
||||
|
||||
.. image:: https_certificate_iot/status-ok.png
|
||||
:align: center
|
||||
:alt: IoT box homepage with HTTPS certificate OK status.
|
||||
|
||||
Domain Name System (DNS) issue
|
||||
==============================
|
||||
|
||||
If the :abbr:`IoT (Internet of Things)` box can be accessed from its :abbr:`IP (Intrernet Protocol)`
|
||||
address but not the Odoo assigned domain: `.odoo-iot.com`; then the :abbr:`IoT (Internet of Things)`
|
||||
box is likely running into a :abbr:`DNS (Domain Name System)` issue. On some browsers, it will give
|
||||
an error code mentioning :abbr:`DNS (Domain Name System)` (like `DNS_PROBE_FINISHED_NXDOMAIN`).
|
||||
|
||||
These :abbr:`DNS (Domain Name System)` issues may appear as the following in different browsers:
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Chrome
|
||||
|
||||
.. figure:: https_certificate_iot/dns-chrome.png
|
||||
:align: center
|
||||
:alt: DNS issue on Chrome browser on Windows 10.
|
||||
|
||||
DNS issue on Chrome browser on Windows 10.
|
||||
|
||||
|
||||
.. tab:: Firefox
|
||||
|
||||
.. figure:: https_certificate_iot/dns-firefox.png
|
||||
:align: center
|
||||
:alt: DNS issue on Firefox browser on Windows 10.
|
||||
|
||||
DNS issue on Firefox browser on Windows 10.
|
||||
|
||||
.. tab:: Edge
|
||||
|
||||
.. figure:: https_certificate_iot/dns-edge.png
|
||||
:align: center
|
||||
:alt: DNS issue on Edge browser on Windows 10.
|
||||
|
||||
DNS issue on Edge browser on Windows 10.
|
||||
|
||||
|
||||
Domain Name System (DNS) issue solution
|
||||
---------------------------------------
|
||||
|
||||
#. Should the router allow the :abbr:`DNS (Domain Name System)` to be manually changed, change the
|
||||
DNS to use `Google DNS <https://developers.google.com/speed/public-dns>`_.
|
||||
#. If your router doesn't allow for this, then a change will need to be made on the :abbr:`DNS
|
||||
(Domain Name System)` settings of each of the devices using `Google DNS
|
||||
<https://developers.google.com/speed/public-dns>`_. This will need to occur on **every** device
|
||||
that plans to interact with the :abbr:`IoT (Internet of Things)` box (e.g. computer, tablet or
|
||||
phone). The individual device configuration processes can be found on the website of the
|
||||
device's manufacturer.
|
||||
|
||||
.. note::
|
||||
Other :abbr:`IoT (Internet of Things)` devices such as payment terminals likely won't need
|
||||
their :abbr:`DNS (Domain Name System)` settings changed as they are already configured with
|
||||
custom :abbr:`DNS (Domain Name System)`.
|
||||
|
||||
.. warning::
|
||||
Consult with your system or network administrator should this issue arise. This error code
|
||||
depends on the network infrastructure, and it goes beyond :doc:`Odoo support's service scope
|
||||
</services/support/what_can_i_expect>`.
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
|
@@ -3,7 +3,6 @@
|
|||
from docutils import nodes
|
||||
from docutils.parsers.rst.directives import admonitions
|
||||
from sphinx.locale import admonitionlabels
|
||||
from sphinx.util.docutils import SphinxRole
|
||||
|
||||
|
||||
class example(nodes.Admonition, nodes.Element):
|
||||
|
|
@@ -22,35 +21,6 @@ class Exercise(admonitions.BaseAdmonition):
|
|||
node_class = exercise
|
||||
|
||||
|
||||
class Dfn(SphinxRole):
|
||||
""" Overwrite the `dfn` role to use custom HTML. """
|
||||
|
||||
def run(self):
|
||||
""" Process the content of the role.
|
||||
|
||||
We use custom node classes to represent the `span`s rather than the corresponding
|
||||
sphinx.nodes.* class to prevent automatically setting the name of the node as class (e.g.,
|
||||
"container") on the element.
|
||||
"""
|
||||
outer_span = DfnSpan(classes=['dfn'])
|
||||
inner_span = DfnSpan()
|
||||
outer_span.append(inner_span)
|
||||
text = nodes.Text(self.text)
|
||||
inner_span.append(text)
|
||||
return [outer_span], []
|
||||
|
||||
|
||||
class DfnSpan(nodes.General, nodes.Element):
|
||||
|
||||
@staticmethod
|
||||
def visit(translator, node):
|
||||
translator.body.append(translator.starttag(node, 'span').rstrip())
|
||||
|
||||
@staticmethod
|
||||
def depart(translator, node):
|
||||
translator.body.append('</span>')
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_directive('example', Example)
|
||||
app.add_node(example, html=(
|
||||
|
|
@@ -62,8 +32,6 @@ def setup(app):
|
|||
lambda self, node: self.visit_admonition(node, 'exercise'),
|
||||
lambda self, node: self.depart_admonition(node),
|
||||
))
|
||||
app.add_role('dfn', Dfn(), override=True)
|
||||
app.add_node(DfnSpan, html=(DfnSpan.visit, DfnSpan.depart))
|
||||
|
||||
return {
|
||||
'parallel_read_safe': True,
|
||||
|
|
|
|||
|
|
@@ -59,11 +59,15 @@
|
|||
deepestActiveTocEntries.push(lastTocEntry);
|
||||
}
|
||||
deepestActiveTocEntries.forEach(deepestTocEntry => {
|
||||
let tocEntryToHighlight;
|
||||
const childTocEntryList = deepestTocEntry.querySelector('ul');
|
||||
if (childTocEntryList) { // The TOC entry has an associated TOC entry list.
|
||||
tocEntryToHighlight = deepestTocEntry;
|
||||
childTocEntryList.classList.add('show');
|
||||
} else { // The TOC entry is at the last level of its branch.
|
||||
tocEntryToHighlight = deepestTocEntry.parentElement.parentElement;
|
||||
}
|
||||
deepestTocEntry.classList.add('o_deepest_active_toc_entry');
|
||||
tocEntryToHighlight.classList.add('o_deepest_active_toc_entry');
|
||||
});
|
||||
return deepestActiveTocEntries;
|
||||
};
|
||||
|
|
|
|||
|
|
@@ -4,78 +4,63 @@ let tocEntryListId = 0; // Used to generate IDs of toc entry lists for both the
|
|||
* Update the provided TOC to allow collapsing its entries with Bootstrap's accordion.
|
||||
*
|
||||
* The typical structure of a TOC menu is a follows:
|
||||
* <ul>
|
||||
* <li>
|
||||
* <a name="heading_without_children" href="something.html">Something</a>
|
||||
* </li>
|
||||
* <li>
|
||||
* <a name="non-clickable_heading_with_children" href="#">Something</a>
|
||||
* <ul>...</ul>
|
||||
* </li>
|
||||
* <li>
|
||||
* <a name="clickable_heading_with_children" href="something.html">Something</a>
|
||||
* <ul>...</ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* <ul><li>
|
||||
* <a href="#"/>
|
||||
* <ul>
|
||||
* <li><a href="#heading_without_child"/></li>
|
||||
* <li>
|
||||
* <a href="#heading_with_children"/>
|
||||
* <ul>...</ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* </li></ul>
|
||||
*
|
||||
* Since a <ul> is always preceded by a <a>, and since we only need to make change to <a>
|
||||
* elements followed by a <ul>, we simply loop on <ul> elements to access all parts of the DOM
|
||||
* that need to be modified.
|
||||
*
|
||||
* The final structure must look like this:
|
||||
* <ul>
|
||||
* <!-- Unchanged -->
|
||||
* <li>
|
||||
* <a name="heading_without_children" href="something.html">Something</a>
|
||||
* </li>
|
||||
* <!-- Create a <div>; append <i> and <a> to <div>; set BS target on <a> and <i>; set id on <ul> -->
|
||||
* <li>
|
||||
* <div class="o_toc_entry_wrapper">
|
||||
* <i class="i-chevron-right" data-bs-target="#o_target_123" data-bs-toggle="collapse"/>
|
||||
* <a name="non-clickable_heading_with_children" href="#" data-bs-target="#o_target_123>" data-bs-toggle="collapse">Something</a>
|
||||
* </div>
|
||||
* <ul id="o_target_123" class="collapse">...</ul>
|
||||
* </li>
|
||||
* <!-- Create a <div>; append <i> and <a> to <div>; set BS target on only <i> to let the <a> redirect; set id on <ul> -->
|
||||
* <li>
|
||||
* <div class="o_toc_entry_wrapper">
|
||||
* <i class="i-chevron-right" data-bs-target="#o_target_456" data-bs-toggle="collapse"/>
|
||||
* <a name="clickable_heading_with_children" href="something.html">Something</a>
|
||||
* </div>
|
||||
* <ul id="o_target_456" class="collapse">...</ul>
|
||||
* </li>
|
||||
*</ul>
|
||||
* <ul><li>
|
||||
* <!-- Only <a> element with empty href must expand/collapse on click -->
|
||||
* <a href="#" data-bs-target="#o_target_{id}>" data-bs-toggle="collapse"/>
|
||||
* <ul>
|
||||
* <li><a href="#heading_without_child"/></li>
|
||||
* <li>
|
||||
* <div class="o_toc_entry_wrapper">
|
||||
* <i class="i-chevron-right" data-bs-target="#o_target_{id}" data-bs-toggle="collapse"/>
|
||||
* <a href="#heading_with_children"/>
|
||||
* </div>
|
||||
* <ul id="o_target_{id}" class="collapse">...</ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* </li></ul>
|
||||
*
|
||||
* @param {HTMLElement} tocElement - The element containing the TOC.
|
||||
* @param {HTMLElement} tocElement - The element containing the TOC
|
||||
*/
|
||||
const _prepareAccordion = (tocElement) => {
|
||||
// Start at the second TOC entry list (<ul>) to avoid collapsing the entire TOC.
|
||||
// Start at the second TOC entry list (<ul>) to avoid collapsing the entire TOC
|
||||
const tocRoot = tocElement.querySelector('ul');
|
||||
tocRoot.querySelectorAll('ul').forEach(tocEntryList => {
|
||||
// Modify the <ul> element.
|
||||
// Modify the <ul> element
|
||||
tocEntryList.id = `o_target_${tocEntryListId++}`;
|
||||
tocEntryList.classList.add('collapse');
|
||||
|
||||
// Modify the <a> element only if it has no href; otherwise, let the redirection happen.
|
||||
// Create and configure an <i> element
|
||||
const arrowButton = document.createElement('I');
|
||||
arrowButton.setAttribute('data-bs-target', `#${tocEntryList.id}`);
|
||||
arrowButton.setAttribute('data-bs-toggle', 'collapse');
|
||||
arrowButton.classList.add('i-chevron-right');
|
||||
// Modify the <a> element (only if it has no href, otherwise let the redirection happen)
|
||||
const relatedHeadingRef = tocEntryList.previousSibling;
|
||||
if (relatedHeadingRef.getAttribute('href') === '#') {
|
||||
relatedHeadingRef.setAttribute('data-bs-target', `#${tocEntryList.id}`);
|
||||
relatedHeadingRef.setAttribute('data-bs-toggle', 'collapse');
|
||||
}
|
||||
|
||||
// Create and configure a <div> element.
|
||||
// Create a <div> element
|
||||
const tocEntryWrapper = document.createElement('DIV');
|
||||
tocEntryWrapper.classList.add('o_toc_entry_wrapper');
|
||||
tocEntryList.parentElement.insertBefore(tocEntryWrapper, tocEntryList);
|
||||
|
||||
// Create and configure an <i> element.
|
||||
const arrowButton = document.createElement('I');
|
||||
arrowButton.setAttribute('data-bs-target', `#${tocEntryList.id}`);
|
||||
arrowButton.setAttribute('data-bs-toggle', 'collapse');
|
||||
arrowButton.classList.add('i-chevron-right');
|
||||
|
||||
// Insert the <i> and <a> elements inside the <div>.
|
||||
// Insert the <i> and <a> elements inside the <div> and prepend the <div> to the <ul>
|
||||
tocEntryWrapper.append(arrowButton, relatedHeadingRef);
|
||||
tocEntryList.parentNode.insertBefore(tocEntryWrapper, tocEntryList);
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@@ -64,10 +64,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
@mixin o-content-tab-selected {
|
||||
font-weight: $font-weight-bolder;
|
||||
border-bottom: 1px solid $white;
|
||||
border-left: 1px solid $o-gray-border;
|
||||
border-right: 1px solid $o-gray-border;
|
||||
background: $white;
|
||||
}
|
||||
|
||||
@mixin o-code {
|
||||
display: inline-block;
|
||||
overflow-wrap: anywhere;
|
||||
background: $o-literals-bg;
|
||||
font-size: 0.875rem;
|
||||
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
|
||||
font-weight: inherit;
|
||||
color: inherit;
|
||||
|
|
|
|||
|
|
@@ -588,15 +588,15 @@ ol.upperroman {
|
|||
list-style: upper-roman;
|
||||
}
|
||||
|
||||
// :not(li) > ol > li:first-child > :first-child,
|
||||
// :not(li) > ul > li:first-child > :first-child {
|
||||
// margin-top: 0px;
|
||||
// }
|
||||
:not(li) > ol > li:first-child > :first-child,
|
||||
:not(li) > ul > li:first-child > :first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
// :not(li) > ol > li:last-child > :last-child,
|
||||
// :not(li) > ul > li:last-child > :last-child {
|
||||
// margin-bottom: 0px;
|
||||
// }
|
||||
:not(li) > ol > li:last-child > :last-child,
|
||||
:not(li) > ul > li:last-child > :last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
ol.simple ol p,
|
||||
ol.simple ul p,
|
||||
|
|
|
|||
|
|
@@ -1,3 +1,9 @@
|
|||
$o-grid-breakpoint-xxl: 1400px;
|
||||
$o-grid-breakpoint-xxxl: 1680px;
|
||||
|
||||
$o-container-max-width-xxl:1380px;
|
||||
$o-container-max-width-xxxl: 1560px;
|
||||
|
||||
// Typography
|
||||
// ===============================================
|
||||
$o-font-family-serif: 'Roboto Slab', Georgia, "Times New Roman", Times, serif;
|
||||
|
|
@@ -136,7 +142,7 @@ $o-codecol-width: 43%;
|
|||
// Paddings and margins
|
||||
$o-padding-xs: .5rem;
|
||||
$o-padding-s: 1rem;
|
||||
$o-padding-m: 1.5rem;
|
||||
$o-padding-m: 2rem;
|
||||
$o-padding-l: 3rem;
|
||||
$o-margin-s: $o-padding-s;
|
||||
$o-margin-m: $o-padding-m;
|
||||
|
|
|
|||
|
|
@@ -10,6 +10,7 @@ from sphinx.writers.html5 import HTML5Translator
|
|||
# └── Odoo Translator
|
||||
|
||||
ADMONITION_MAPPING = {
|
||||
# The alert classes have been replaced by default BS classes to reduce number of scss lines.
|
||||
'note': 'alert-primary',
|
||||
|
||||
'tip': 'alert-tip',
|
||||
|
|
@@ -26,7 +27,7 @@ ADMONITION_MAPPING = {
|
|||
|
||||
'example': 'alert-success',
|
||||
'exercise': 'alert-dark',
|
||||
} # The alert classes have been replaced by default BS classes to reduce number of scss lines.
|
||||
}
|
||||
|
||||
|
||||
class BootstrapTranslator(HTML5Translator):
|
||||
|
|
|
|||
|
|
@@ -35,11 +35,6 @@ applications/finance/accounting/fiscal_localizations/overview/localizations_list
|
|||
applications/finance/accounting/getting_started/memento.rst applications/finance/accounting/getting_started/cheat_sheet.rst # memento -> cheat_sheet
|
||||
applications/finance/accounting/payables/supplier_bills/manage.rst applications/inventory_and_mrp/purchase/manage_deals/manage.rst # (#3302)
|
||||
|
||||
# applications/general
|
||||
|
||||
applications/general/calendars/outlook/outlook_calendar.rst applications/productivity/calendar/outlook.rst # general/calendars/outlook/outlook_calendar -> productivity/calendar/outlook
|
||||
applications/general/calendars/google/google_calendar_credentials.rst applications/productivity/calendar/google.rst # general/calendars/google/google_calendar_credentials -> productivity/calendar/google
|
||||
|
||||
# applications/inventory
|
||||
|
||||
applications/inventory_and_mrp/inventory/routes/concepts/inter_warehouse.rst applications/inventory_and_mrp/inventory/management/warehouses/warehouse_replenishment_transfer.rst
|
||||
|
|
|
|||
|
|
@@ -4,10 +4,8 @@
|
|||
}
|
||||
|
||||
table.o-showcase-table > tbody > tr.row-odd > td {
|
||||
display: block;
|
||||
border: 1px solid #d5d5d5;
|
||||
padding: 2rem;
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
|
||||
table.o-showcase-table > tbody > tr.row-odd > td .highlight-text {
|
||||
|
|
@@ -19,5 +17,4 @@ table.o-showcase-table > tbody > tr.row-even > td {
|
|||
padding: 1rem;
|
||||
background: #f8f8f8;
|
||||
border: 0;
|
||||
border-radius: 0 0 3px 3px;
|
||||
}
|
||||
|
|
|
|||