Compare commits
115 Commits
18.0
...
saas-15.1-
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7528e17080 | ||
![]() |
890b4c31fa | ||
![]() |
56496aede7 | ||
![]() |
3e8ed2aa35 | ||
![]() |
59ab5966cc | ||
![]() |
e441f7fdd0 | ||
![]() |
ab3428355f | ||
![]() |
4024ca9e72 | ||
![]() |
9ab23b7456 | ||
![]() |
0c5859de57 | ||
![]() |
49dab677fe | ||
![]() |
9d24b835d7 | ||
![]() |
5cb16a772f | ||
![]() |
f9a9c9cc02 | ||
![]() |
8aa6d9a72c | ||
![]() |
deb743e1d7 | ||
![]() |
9fc9363b3f | ||
![]() |
b2886e2ee2 | ||
![]() |
1cbe885e92 | ||
![]() |
b745456d47 | ||
![]() |
2fdb1ffc79 | ||
![]() |
0a3dd86eef | ||
![]() |
269031e162 | ||
![]() |
c073f53c1c | ||
![]() |
3b9362eed0 | ||
![]() |
d0d75af4a1 | ||
![]() |
888e72785b | ||
![]() |
ff97fbc392 | ||
![]() |
04d25efbef | ||
![]() |
81972f5737 | ||
![]() |
856365c473 | ||
![]() |
88f61bf187 | ||
![]() |
234caaa947 | ||
![]() |
03e05613ca | ||
![]() |
4d35ac3199 | ||
![]() |
0fac3da61d | ||
![]() |
c7cbe7f234 | ||
![]() |
26b0251ff5 | ||
![]() |
92cb732684 | ||
![]() |
04cae556ea | ||
![]() |
e4b94e9d46 | ||
![]() |
dd89b2947c | ||
![]() |
51301eb432 | ||
![]() |
7f0b281d29 | ||
![]() |
8d4bf8f379 | ||
![]() |
15bbd5c2e7 | ||
![]() |
71efdf7ecb | ||
![]() |
6bb2000fe4 | ||
![]() |
e5b7530b84 | ||
![]() |
4ac68055da | ||
![]() |
ba4462a686 | ||
![]() |
764cea6e92 | ||
![]() |
be5c872d7e | ||
![]() |
46163e8e34 | ||
![]() |
ccb87a6f72 | ||
![]() |
b321c9f79f | ||
![]() |
4fec161a6f | ||
![]() |
a731b2ca04 | ||
![]() |
bb05f4ae7b | ||
![]() |
869577cf2c | ||
![]() |
98293a9e29 | ||
![]() |
79fa2961aa | ||
![]() |
78804e6c1d | ||
![]() |
fb68acf097 | ||
![]() |
337b36320c | ||
![]() |
31709ad082 | ||
![]() |
696ab7de05 | ||
![]() |
9659f18836 | ||
![]() |
f8ab5aa5fe | ||
![]() |
3b804d40ba | ||
![]() |
fcc925a6d5 | ||
![]() |
251c2b9156 | ||
![]() |
bd10492d42 | ||
![]() |
93ae401194 | ||
![]() |
a2dee66e13 | ||
![]() |
96d6d9a8bb | ||
![]() |
30479c8dd5 | ||
![]() |
946a87d731 | ||
![]() |
3e22e871d3 | ||
![]() |
4ac7ce7678 | ||
![]() |
cbe6aad9e9 | ||
![]() |
4691efface | ||
![]() |
38e541b527 | ||
![]() |
fdda5c538a | ||
![]() |
77a3b40c95 | ||
![]() |
89132be618 | ||
![]() |
2ca3dcb7d1 | ||
![]() |
71f1d10159 | ||
![]() |
37ee0f3130 | ||
![]() |
272bbe7a8c | ||
![]() |
ffdfdc4e50 | ||
![]() |
9209d4896c | ||
![]() |
4b1cb7bf11 | ||
![]() |
bc2bf45778 | ||
![]() |
3a42d8107b | ||
![]() |
7763c22db4 | ||
![]() |
20f04ea36b | ||
![]() |
8c56ec064d | ||
![]() |
f612d5f105 | ||
![]() |
6483288614 | ||
![]() |
27c06354cb | ||
![]() |
97e46b57bd | ||
![]() |
b305db3c0d | ||
![]() |
3c8bdfaac1 | ||
![]() |
27ce4aa4c9 | ||
![]() |
a5edcd6f7c | ||
![]() |
e0f1b7969f | ||
![]() |
3bc44e3fcd | ||
![]() |
c9bc9f7f51 | ||
![]() |
fd9d7d4dc0 | ||
![]() |
3c00fd6adf | ||
![]() |
67234ef779 | ||
![]() |
3625b5fb98 | ||
![]() |
fa80c9e340 | ||
![]() |
d3d0531832 |
1
.gitignore
vendored
@ -8,4 +8,3 @@ _build/
|
||||
|
||||
# Dependencies
|
||||
odoo
|
||||
venv/
|
187
.tx/config
@ -1,152 +1,63 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
type = PO
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:administration]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/administration.po
|
||||
source_file = locale/sources/administration.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = administration
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.applications]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/applications.po
|
||||
source_file = locale/sources/applications.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:applications]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/applications.po
|
||||
source_file = locale/sources/applications.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = applications
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.finance]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/finance.po
|
||||
source_file = locale/sources/finance.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:essentials]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/essentials.po
|
||||
source_file = locale/sources/essentials.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = essentials
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.general]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/general.po
|
||||
source_file = locale/sources/general.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:finance]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/finance.po
|
||||
source_file = locale/sources/finance.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = finance
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/index.po
|
||||
source_file = locale/sources/index.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:general]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/general.po
|
||||
source_file = locale/sources/general.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = general
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.inventory_and_mrp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/inventory_and_mrp.po
|
||||
source_file = locale/sources/inventory_and_mrp.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:hr]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/hr.po
|
||||
source_file = locale/sources/hr.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = hr
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.marketing]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/marketing.po
|
||||
source_file = locale/sources/marketing.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/index.po
|
||||
source_file = locale/sources/index.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = index
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.productivity]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/productivity.po
|
||||
source_file = locale/sources/productivity.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:inventory_and_mrp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/inventory_and_mrp.po
|
||||
source_file = locale/sources/inventory_and_mrp.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = inventory_and_mrp
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.sales]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/sales.po
|
||||
source_file = locale/sources/sales.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:marketing]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/marketing.po
|
||||
source_file = locale/sources/marketing.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = marketing
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.services]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/services.po
|
||||
source_file = locale/sources/services.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:productivity]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/productivity.po
|
||||
source_file = locale/sources/productivity.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = productivity
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.theme]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/sphinx.po
|
||||
source_file = locale/sources/sphinx.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:sales]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/sales.po
|
||||
source_file = locale/sources/sales.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = sales
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.user_settings]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/settings.po
|
||||
source_file = locale/sources/settings.pot
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:services]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/services.po
|
||||
source_file = locale/sources/services.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = services
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:user_settings]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/settings.po
|
||||
source_file = locale/sources/settings.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = settings
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:studio]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/studio.po
|
||||
source_file = locale/sources/studio.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = studio
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-18-doc:r:websites]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/websites.po
|
||||
source_file = locale/sources/websites.pot
|
||||
type = POT
|
||||
minimum_perc = 0
|
||||
resource_name = websites
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
[odoo-14-doc.websites]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/websites.po
|
||||
source_file = locale/sources/websites.pot
|
||||
source_lang = en
|
13
COPYRIGHT
@ -1,13 +0,0 @@
|
||||
Most of the files are
|
||||
|
||||
Copyright (c) 2004-2023 Odoo S.A.
|
||||
|
||||
Some files may also contain contributions from third
|
||||
parties. In this case the original copyright of
|
||||
the contributions can be traced through the
|
||||
history of the source version control system.
|
||||
|
||||
When that is not the case, the files contain a prominent
|
||||
notice stating the original copyright and applicable
|
||||
license, or come with their own dedicated COPYRIGHT
|
||||
and/or LICENSE file.
|
428
LICENSE
@ -1,428 +0,0 @@
|
||||
Attribution-ShareAlike 4.0 International
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public
|
||||
licenses, a licensor grants the public permission to use the
|
||||
licensed material under specified terms and conditions. If
|
||||
the licensor's permission is not necessary for any reason--for
|
||||
example, because of any applicable exception or limitation to
|
||||
copyright--then that use is not regulated by the license. Our
|
||||
licenses grant only permissions under copyright and certain
|
||||
other rights that a licensor has authority to grant. Use of
|
||||
the licensed material may still be restricted for other
|
||||
reasons, including because others have copyright or other
|
||||
rights in the material. A licensor may make special requests,
|
||||
such as asking that all changes be marked or described.
|
||||
Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations
|
||||
for the public:
|
||||
wiki.creativecommons.org/Considerations_for_licensees
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-ShareAlike 4.0 International Public
|
||||
License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-ShareAlike 4.0 International Public License ("Public
|
||||
License"). To the extent this Public License may be interpreted as a
|
||||
contract, You are granted the Licensed Rights in consideration of Your
|
||||
acceptance of these terms and conditions, and the Licensor grants You
|
||||
such rights in consideration of benefits the Licensor receives from
|
||||
making the Licensed Material available under these terms and
|
||||
conditions.
|
||||
|
||||
|
||||
Section 1 -- Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. BY-SA Compatible License means a license listed at
|
||||
creativecommons.org/compatiblelicenses, approved by Creative
|
||||
Commons as essentially the equivalent of this Public License.
|
||||
|
||||
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
|
||||
e. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
|
||||
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||
any other exception or limitation to Copyright and Similar Rights
|
||||
that applies to Your use of the Licensed Material.
|
||||
|
||||
g. License Elements means the license attributes listed in the name
|
||||
of a Creative Commons Public License. The License Elements of this
|
||||
Public License are Attribution and ShareAlike.
|
||||
|
||||
h. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
i. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
k. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
l. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
|
||||
m. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
|
||||
Section 2 -- Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with
|
||||
its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor -- Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. Additional offer from the Licensor -- Adapted Material.
|
||||
Every recipient of Adapted Material from You
|
||||
automatically receives an offer from the Licensor to
|
||||
exercise the Licensed Rights in the Adapted Material
|
||||
under the conditions of the Adapter's License You apply.
|
||||
|
||||
c. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not
|
||||
licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to
|
||||
the extent possible, the Licensor waives and/or agrees not to
|
||||
assert any such rights held by the Licensor to the limited
|
||||
extent necessary to allow You to exercise the Licensed
|
||||
Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this
|
||||
Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society
|
||||
under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly
|
||||
reserves any right to collect such royalties.
|
||||
|
||||
|
||||
Section 3 -- License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if
|
||||
designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
b. ShareAlike.
|
||||
|
||||
In addition to the conditions in Section 3(a), if You Share
|
||||
Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter's License You apply must be a Creative Commons
|
||||
license with the same License Elements, this version or
|
||||
later, or a BY-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to, the
|
||||
Adapter's License You apply. You may satisfy this condition
|
||||
in any reasonable manner based on the medium, means, and
|
||||
context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms
|
||||
or conditions on, or apply any Effective Technological
|
||||
Measures to, Adapted Material that restrict exercise of the
|
||||
rights granted under the Adapter's License You apply.
|
||||
|
||||
|
||||
Section 4 -- Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material,
|
||||
including for purposes of Section 3(b); and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||
|
||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
|
||||
Section 6 -- Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the
|
||||
violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
|
||||
Section 7 -- Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
|
||||
Section 8 -- Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||
its public licenses to material it publishes and in those instances
|
||||
will be considered the “Licensor.” The text of the Creative Commons
|
||||
public licenses is dedicated to the public domain under the CC0 Public
|
||||
Domain Dedication. Except for the limited purpose of indicating that
|
||||
material is shared under a Creative Commons public license or as
|
||||
otherwise permitted by the Creative Commons policies published at
|
||||
creativecommons.org/policies, Creative Commons does not authorize the
|
||||
use of the trademark "Creative Commons" or any other trademark or logo
|
||||
of Creative Commons without its prior written consent including,
|
||||
without limitation, in connection with any unauthorized modifications
|
||||
to any of its public licenses or any other arrangements,
|
||||
understandings, or agreements concerning use of licensed material. For
|
||||
the avoidance of doubt, this paragraph does not form part of the
|
||||
public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
|
55
Makefile
@ -14,32 +14,17 @@ ifndef CURRENT_LANG
|
||||
endif
|
||||
|
||||
SPHINX_BUILD = sphinx-build
|
||||
SPHINX_AUTO_BUILD = sphinx-autobuild
|
||||
CONFIG_DIR = .
|
||||
SPHINXOPTS = -D project_root=$(ROOT) -D canonical_version=$(CANONICAL_VERSION) \
|
||||
-D versions=$(VERSIONS) -D languages=$(LANGUAGES) -D language=$(CURRENT_LANG) \
|
||||
-D is_remote_build=$(IS_REMOTE_BUILD) \
|
||||
-T \
|
||||
-A google_analytics_key=$(GOOGLE_ANALYTICS_KEY) \
|
||||
-A plausible_script=$(PLAUSIBLE_SCRIPT) \
|
||||
-A plausible_domain=$(PLAUSIBLE_DOMAIN) \
|
||||
-j $(WORKERS)
|
||||
SOURCE_DIR = content
|
||||
THEME = extensions/odoo_theme
|
||||
THEME_STATIC = extensions/odoo_theme/static
|
||||
LOCALE = locale
|
||||
STATIC = static
|
||||
REDIRECTS = redirects
|
||||
SERVER_IP := $(shell ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
|
||||
# Get all listening ports
|
||||
LISTENING_PORTS := $(shell ss -tuln | awk 'NR>1 {print $$4}' | awk -F: '{print $$NF}' | sort -n | uniq)
|
||||
LOGFILE := $(BUILD_DIR)/live_server.log
|
||||
# Default port
|
||||
OPEN_PORTS := $(shell ss -tuln | awk 'NR>1 {print $$4}' | awk -F: '{print $$NF}' | sort -n | uniq)
|
||||
SELECTED_PORT := $(shell echo "$(OPEN_PORTS)" | awk 'NR==1')
|
||||
|
||||
HTML_BUILD_DIR = $(BUILD_DIR)/html
|
||||
ifdef VERSIONS
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/18.0
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/saas-15.1
|
||||
endif
|
||||
ifneq ($(CURRENT_LANG),en)
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/$(CURRENT_LANG)
|
||||
@ -55,7 +40,6 @@ help:
|
||||
@echo " html to build the documentation to HTML"
|
||||
@echo " fast to build the documentation to HTML with shallow menu (faster)"
|
||||
@echo " clean to delete the build files"
|
||||
@echo " test to run the guidelines tests"
|
||||
|
||||
clean:
|
||||
@echo "Cleaning build files..."
|
||||
@ -64,28 +48,12 @@ clean:
|
||||
|
||||
html: $(HTML_BUILD_DIR)/_static/style.css
|
||||
@echo "Starting build..."
|
||||
$(SPHINX_BUILD) -q -c $(CONFIG_DIR) -b html $(SPHINXOPTS) $(SOURCE_DIR) $(HTML_BUILD_DIR)
|
||||
$(SPHINX_BUILD) -c $(CONFIG_DIR) -b html $(SPHINXOPTS) $(SOURCE_DIR) $(HTML_BUILD_DIR)
|
||||
@echo "Build finished."
|
||||
html_log: SPHINXOPTS += -A collapse_menu=True
|
||||
html_log: $(HTML_BUILD_DIR)/_static/style.css
|
||||
@echo "Starting build..."
|
||||
$(SPHINX_BUILD) -q -c $(CONFIG_DIR) -b html $(SPHINXOPTS) $(SOURCE_DIR) $(HTML_BUILD_DIR) > $(LOGFILE) 2>&1
|
||||
@echo "Build finished."
|
||||
|
||||
live: SPHINXOPTS += -A collapse_menu=True
|
||||
live:
|
||||
@echo "Starting Live Server..."
|
||||
$(SPHINX_AUTO_BUILD) $(SOURCE_DIR) $(HTML_BUILD_DIR) \
|
||||
--port 8000 --host $(SERVER_IP) \
|
||||
--watch $(THEME) --watch $(LOCALE) --watch $(STATIC) --watch $(REDIRECTS) --watch $(THEME_STATIC) --watch . \
|
||||
--pre-build "sh -c 'mkdir -p $(HTML_BUILD_DIR)/_static && python3 -m pysassc $(THEME)/static/style.scss $(HTML_BUILD_DIR)/_static/style.css'" \
|
||||
$(SPHINXOPTS) -c $(CONFIG_DIR) -b html
|
||||
|
||||
|
||||
|
||||
# To call *after* `make html`
|
||||
# Binary dependencies (Debian): texlive-fonts-recommended texlive-latex-extra
|
||||
# texlive-fonts-extra
|
||||
# texlive-generic-recommended texlive-fonts-extra
|
||||
latexpdf:
|
||||
@echo "Starting build..."
|
||||
$(SPHINX_BUILD) -c $(CONFIG_DIR) -b latex $(SPHINXOPTS) $(SOURCE_DIR) $(BUILD_DIR)/latex
|
||||
@ -107,21 +75,8 @@ $(HTML_BUILD_DIR)/_static/style.css: extensions/odoo_theme/static/style.scss ext
|
||||
#=== Development and debugging rules ===#
|
||||
|
||||
fast: SPHINXOPTS += -A collapse_menu=True
|
||||
fast: hmlt
|
||||
fast: html
|
||||
|
||||
static: $(HTML_BUILD_DIR)/_static/style.css
|
||||
cp -r extensions/odoo_theme/static/* $(HTML_BUILD_DIR)/_static/
|
||||
cp -r static/* $(HTML_BUILD_DIR)/_static/
|
||||
|
||||
# Called by runbot for the ci/documentation_guideline check.
|
||||
test:
|
||||
@python tests/main.py $(SOURCE_DIR)/administration $(SOURCE_DIR)/applications $(SOURCE_DIR)/contributing $(SOURCE_DIR)/developer redirects
|
||||
|
||||
# Similar as `test`, but called only manually by content reviewers to trigger extra checks.
|
||||
review:
|
||||
@read -p "Enter relative content path: " path; read -p "Enter max line length (default: 100): " line_length; \
|
||||
if [ -z "$$path" ]; then echo "Error: Path cannot be empty"; exit 1; fi; \
|
||||
if echo $$path | grep -q 'content/'; then path=`echo $$path | sed 's|content/||'`; fi; \
|
||||
if [ -z "$$line_length" ]; then line_length=100; fi; \
|
||||
export REVIEW=1; \
|
||||
python tests/main.py --max-line-length=$$line_length $(SOURCE_DIR)/$$path
|
||||
|
40
README.md
@ -1,38 +1,46 @@
|
||||
# Documentation
|
||||
# Odoo documentation
|
||||
|
||||
## Build the documentation locally
|
||||
|
||||
### Requirements
|
||||
|
||||
- Git
|
||||
- Python 3.6, 3.7, or 3.8
|
||||
- Python dependencies listed in the file `requirements.txt`.
|
||||
- Make
|
||||
- A local copy of the [odoo/odoo repository](https://github.com/odoo/odoo) (optional)
|
||||
- A local copy of the [odoo/upgrade-util repository](https://github.com/odoo/upgrade-util) (optional)
|
||||
- [Git](https://www.odoo.com/documentation/saas-15.1/contributing/documentation.html#install-git)
|
||||
- [Python 3.7 or 3.8](https://www.odoo.com/documentation/saas-15.1/contributing/documentation.html#python)
|
||||
- Python dependencies listed in the file [`requirements.txt`](https://github.com/odoo/documentation/tree/saas-15.1/requirements.txt).
|
||||
- [Make](https://www.odoo.com/documentation/saas-15.1/contributing/documentation.html#make)
|
||||
- A local copy of the [odoo/odoo repository in saas-15.1](https://github.com/odoo/odoo/tree/saas-15.1) (Optional)
|
||||
|
||||
### Instructions
|
||||
|
||||
1. In a terminal, navigate to the root directory of the documentation and build it `make`.
|
||||
1. In a terminal, navigate to the root directory and compile the documentation to HTML with the
|
||||
following command:
|
||||
|
||||
```sh
|
||||
make
|
||||
```
|
||||
|
||||
Additional commands are available with `make help`.
|
||||
2. Open the file `documentation/_build/html/index.html` in your web browser.
|
||||
3. See [this guide](https://www.odoo.com/documentation/latest/contributing/documentation.html)
|
||||
|
||||
2. Open the file `documentation/_build/html/index.html` in your web browser to display the render.
|
||||
|
||||
3. See [this guide](https://www.odoo.com/documentation/saas-15.1/contributing/documentation.html#preview-your-changes)
|
||||
for more detailed instructions.
|
||||
|
||||
Optional: place your local copy of the `odoo/odoo` and `odoo/upgrade-util` repositories in
|
||||
the parent directory or in the root directory of the documentation to build the latter
|
||||
with the documented Python docstrings.
|
||||
Optional: to fully build the developer documentation with inline docstrings for documented Python
|
||||
functions, place your local copy of the `odoo/odoo` repository in the root directory. Alternatively,
|
||||
create a symbolic link with `odoo` as link name. If the Odoo sources are not found, a warning will
|
||||
be shown.
|
||||
|
||||
## Contribute to the documentation
|
||||
|
||||
For contributions to the content of the documentation, please refer to the
|
||||
[Introduction Guide](https://www.odoo.com/documentation/latest/contributing/documentation.html).
|
||||
[Introduction Guide](https://www.odoo.com/documentation/saas-15.1/contributing/documentation.html).
|
||||
|
||||
To **report a content issue**, **request new content** or **ask a question**, use the
|
||||
[repository's issue tracker](https://github.com/odoo/documentation/issues).
|
||||
[repository's issue tracker](https://github.com/odoo/documentation-user/issues) as usual.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Odoo, in addition to the documentation, have a look at
|
||||
[the official eLearning](https://odoo.com/slides) and
|
||||
[Scale-up, The Business Game](https://www.odoo.com/page/scale-up-business-game).
|
||||
[Scale-up, The Business Game](https://www.odoo.com/page/scale-up-business-game).
|
@ -16,4 +16,4 @@
|
||||
# [REM] = Removal
|
||||
# [REF] = Refactoring (restructuring)
|
||||
# [MOV] = Move/rename
|
||||
#
|
||||
#
|
557
conf.py
@ -1,104 +1,74 @@
|
||||
import os
|
||||
import re
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import docutils
|
||||
import sphinx
|
||||
from pygments.lexers import JsonLexer, XmlLexer
|
||||
from sphinx.ext import graphviz
|
||||
from sphinx.util import logging
|
||||
import sphinx
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# === General configuration ===#
|
||||
#=== General configuration ===#
|
||||
|
||||
# General information about the project.
|
||||
project = "Odoo"
|
||||
copyright = "Odoo S.A."
|
||||
project = 'Odoo'
|
||||
copyright = 'Odoo S.A.'
|
||||
|
||||
# `version` is the version info for the project being documented, acts as replacement for |version|,
|
||||
# `version` if the version info for the project being documented, acts as replacement for |version|,
|
||||
# also used in various other places throughout the built documents.
|
||||
# `release` is the full version, including alpha/beta/rc tags. Acts as replacement for |release|.
|
||||
version = release = "18.0"
|
||||
|
||||
# `current_branch` is the technical name of the current branch.
|
||||
# E.g., saas-15.4 -> saas-15.4; 12.0 -> 12.0, master -> master (*).
|
||||
current_branch = version
|
||||
# `current_version` is the Odoo version linked to the current branch.
|
||||
# E.g., saas-15.4 -> 15.4; 12.0 -> 12; master -> master (*).
|
||||
current_version = current_branch.replace("saas-", "").replace(".0", "")
|
||||
# `current_major_branch` is the technical name of the major branch before the current branch.
|
||||
# E.g., saas-15.4 -> 15.0; 12.0 -> 12.0; master -> master (*).
|
||||
current_major_branch = re.sub(r"\.\d", ".0", current_branch.replace("saas-", ""))
|
||||
# `current_major_version` is the Odoo version linked to the current major branch.
|
||||
# E.g., saas-15.4 -> 15; 12.0 -> 12; master -> master (*).
|
||||
current_major_version = current_major_branch.replace(".0", "")
|
||||
# (*): We don't care for master.
|
||||
version = release = 'saas-15.1'
|
||||
|
||||
# The minimal Sphinx version required to build the documentation.
|
||||
needs_sphinx = "3.0.0"
|
||||
needs_sphinx = '3.0.0'
|
||||
|
||||
# The default language in which the documentation is written. It is set to `None` because Sphinx
|
||||
# considers that no language means 'en'.
|
||||
language = None
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = {
|
||||
".md": "markdown",
|
||||
".rst": "restructuredtext",
|
||||
}
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = "index"
|
||||
master_doc = 'index'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and directories to ignore when
|
||||
# looking for source files.
|
||||
exclude_patterns = [
|
||||
"locale",
|
||||
"README.*",
|
||||
"bin",
|
||||
"include",
|
||||
"lib",
|
||||
"odoo",
|
||||
'locale',
|
||||
'README.*',
|
||||
'bin', 'include', 'lib',
|
||||
'odoo',
|
||||
]
|
||||
|
||||
# The RST text role to use when the role is not specified. E.g.: `example`.
|
||||
# We use 'literal' as default role for markdown compatibility: `foo` behaves like ``foo``.
|
||||
# See https://docutils.sourceforge.io/docs/ref/rst/roles.html#standard-roles for other roles.
|
||||
default_role = "literal"
|
||||
|
||||
html_copy_source = False
|
||||
# Whether scaled down images should be be wrapped in a `<a/>` tag linking to the image file or not.
|
||||
html_scaled_image_link = False
|
||||
default_role = 'literal'
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text
|
||||
add_function_parentheses = True
|
||||
|
||||
# === Extensions configuration ===#
|
||||
#=== Extensions configuration ===#
|
||||
|
||||
source_read_replace_vals = {
|
||||
"BRANCH": current_branch,
|
||||
"CURRENT_BRANCH": current_branch,
|
||||
"CURRENT_VERSION": current_version,
|
||||
"CURRENT_MAJOR_BRANCH": current_major_branch,
|
||||
"CURRENT_MAJOR_VERSION": current_major_version,
|
||||
"GITHUB_PATH": f"https://github.com/odoo/odoo/blob/{version}",
|
||||
"GITHUB_ENT_PATH": f"https://github.com/odoo/enterprise/blob/{version}",
|
||||
"OWL_PATH": f"https://github.com/odoo/owl/blob/master",
|
||||
'GITHUB_PATH': f'https://github.com/odoo/odoo/blob/{version}',
|
||||
'GITHUB_ENT_PATH': f'https://github.com/odoo/enterprise/blob/{version}',
|
||||
}
|
||||
|
||||
# Add extensions directory to PYTHONPATH
|
||||
extension_dir = Path("extensions")
|
||||
extension_dir = Path('extensions')
|
||||
sys.path.insert(0, str(extension_dir.absolute()))
|
||||
|
||||
# Search for the directory of odoo sources to know whether autodoc should be used on the dev doc
|
||||
odoo_sources_candidate_dirs = (Path("Odoo18"), Path("../Odoo18"))
|
||||
# odoo_sources_candidate_dirs = (Path('odoo'), Path('../odoo'))
|
||||
odoo_sources_candidate_dirs = (Path('odoo'), Path('../odoo'))
|
||||
odoo_sources_dirs = [
|
||||
d for d in odoo_sources_candidate_dirs if d.is_dir() and (d / "odoo-bin").exists()
|
||||
d for d in odoo_sources_candidate_dirs if d.is_dir() and (d / 'odoo-bin').exists()
|
||||
]
|
||||
odoo_dir_in_path = False
|
||||
|
||||
@ -109,30 +79,21 @@ if not odoo_sources_dirs:
|
||||
"The 'Developer' documentation will be built but autodoc directives will be skipped.\n"
|
||||
"In order to fully build the 'Developer' documentation, clone the repository with "
|
||||
"`git clone https://github.com/odoo/odoo` or create a symbolic link.",
|
||||
{
|
||||
"dir_list": "\n".join(
|
||||
[f"\t- {d.resolve()}" for d in odoo_sources_candidate_dirs]
|
||||
)
|
||||
},
|
||||
{'dir_list': '\n'.join([f'\t- {d.resolve()}' for d in odoo_sources_candidate_dirs])},
|
||||
)
|
||||
else:
|
||||
if (3, 6) < sys.version_info < (3, 7):
|
||||
# Running odoo needs python 3.7 min but monkey patch version_info to be compatible with 3.6.
|
||||
sys.version_info = (3, 7, 0)
|
||||
odoo_dir = odoo_sources_dirs[0].resolve()
|
||||
source_read_replace_vals["ODOO_RELPATH"] = "/../" + str(odoo_sources_dirs[0])
|
||||
source_read_replace_vals['ODOO_RELPATH'] = '/../' + str(odoo_sources_dirs[0])
|
||||
source_read_replace_vals['ODOO_ABSPATH'] = str(odoo_dir)
|
||||
sys.path.insert(0, str(odoo_dir))
|
||||
import odoo.addons
|
||||
|
||||
odoo.addons.__path__.append(str(odoo_dir) + "/addons")
|
||||
from odoo import (
|
||||
release as odoo_release,
|
||||
) # Don't collide with Sphinx's 'release' config option
|
||||
|
||||
odoo_version = ".".join(str(s) for s in odoo_release.version_info[:2]).replace(
|
||||
"~", "-"
|
||||
) # Change saas~XX.Y to saas-XX.Y
|
||||
odoo_version = "master" if "alpha" in odoo_release.version else odoo_version
|
||||
odoo.addons.__path__.append(str(odoo_dir) + '/addons')
|
||||
if (3, 6) < sys.version_info < (3, 7):
|
||||
# Running odoo needs python 3.7 min but monkey patch version_info to be compatible with 3.6
|
||||
sys.version_info = (3, 7, 0)
|
||||
from odoo import release as odoo_release # Don't collide with Sphinx's 'release' config option
|
||||
odoo_version = odoo_release.version.replace('~', '-') # Change saas~XX.Y to saas-XX.Y
|
||||
odoo_version = 'master' if 'alpha' in odoo_release.version else odoo_version
|
||||
if release != odoo_version:
|
||||
_logger.warning(
|
||||
"Found Odoo sources in %(directory)s but with version '%(odoo_version)s' incompatible "
|
||||
@ -140,327 +101,195 @@ else:
|
||||
"The 'Developer' documentation will be built but autodoc directives will be skipped.\n"
|
||||
"In order to fully build the 'Developer' documentation, checkout the matching branch"
|
||||
" with `cd odoo && git checkout %(doc_version)s`.",
|
||||
{
|
||||
"directory": odoo_dir,
|
||||
"odoo_version": odoo_version,
|
||||
"doc_version": version,
|
||||
},
|
||||
{'directory': odoo_dir, 'odoo_version': odoo_version, 'doc_version': version},
|
||||
)
|
||||
else:
|
||||
_logger.info(
|
||||
"Found Odoo sources in %(directory)s matching documentation version '%(version)s'.",
|
||||
{"directory": odoo_dir, "version": release},
|
||||
{'directory': odoo_dir, 'version': release},
|
||||
)
|
||||
odoo_dir_in_path = True
|
||||
|
||||
if odoo_dir_in_path:
|
||||
upgrade_util_dir = next(
|
||||
filter(Path.exists, [Path("upgrade-util"), Path("../upgrade-util")]), None
|
||||
)
|
||||
if not upgrade_util_dir:
|
||||
_logger.warning(
|
||||
"Could not find Upgrade Utils sources directory in `upgrade_util`.\n"
|
||||
"The developer documentation will be built but autodoc directives will be skipped.\n"
|
||||
"In order to fully build the 'Developer' documentation, clone the repository with "
|
||||
"`git clone https://github.com/odoo/upgrade-util` or create a symbolic link."
|
||||
)
|
||||
odoo_dir_in_path = False
|
||||
else:
|
||||
_logger.info(
|
||||
"Found Upgrade Util sources in %(directory)s",
|
||||
{"directory": upgrade_util_dir.resolve()},
|
||||
)
|
||||
from odoo import upgrade
|
||||
|
||||
upgrade.__path__.append(str((upgrade_util_dir / "src").resolve()))
|
||||
|
||||
# Mapping between odoo models related to master data and the declaration of the
|
||||
# data. This is used to point users to available xml_ids when giving values for
|
||||
# a field with the autodoc_field extension.
|
||||
model_references = {
|
||||
"account.account.type": "addons/account/data/data_account_type.xml",
|
||||
"res.country": "odoo/addons/base/data/res_country_data.xml",
|
||||
"res.currency": "odoo/addons/base/data/res_currency_data.xml",
|
||||
'account.account.type': 'addons/account/data/data_account_type.xml',
|
||||
'res.country': 'odoo/addons/base/data/res_country_data.xml',
|
||||
'res.currency': 'odoo/addons/base/data/res_currency_data.xml',
|
||||
}
|
||||
|
||||
# The Sphinx extensions to use, as module names.
|
||||
# They can be extensions coming with Sphinx (named 'sphinx.ext.*') or custom ones.
|
||||
extensions = [
|
||||
# Link sources in other projects (used to build the reference doc)
|
||||
"sphinx.ext.intersphinx",
|
||||
'sphinx.ext.intersphinx',
|
||||
|
||||
# Support the specialized to-do directives
|
||||
"sphinx.ext.todo",
|
||||
'sphinx.ext.todo',
|
||||
|
||||
# Custom Odoo theme
|
||||
"odoo_theme",
|
||||
'odoo_theme',
|
||||
|
||||
# Youtube and Vimeo videos integration (youtube, vimeo directives)
|
||||
"embedded_video",
|
||||
"custom_admonitions",
|
||||
'embedded_video',
|
||||
|
||||
'custom_admonitions',
|
||||
|
||||
# Redirection generator
|
||||
"redirects",
|
||||
'redirects',
|
||||
|
||||
# Content tabs
|
||||
"sphinx_tabs.tabs",
|
||||
# Cards
|
||||
# "cards",
|
||||
# Spoilers
|
||||
"spoilers",
|
||||
'sphinx_tabs.tabs',
|
||||
|
||||
# Strange html domain logic used in memento pages
|
||||
"html_domain",
|
||||
"myst_parser",
|
||||
"sphinx_design",
|
||||
'html_domain',
|
||||
]
|
||||
|
||||
myst_enable_extensions = [
|
||||
"amsmath",
|
||||
"colon_fence",
|
||||
"deflist",
|
||||
"dollarmath",
|
||||
"fieldlist",
|
||||
"html_admonition",
|
||||
"html_image",
|
||||
"replacements",
|
||||
"smartquotes",
|
||||
"strikethrough",
|
||||
"substitution",
|
||||
"tasklist",
|
||||
]
|
||||
if odoo_dir_in_path:
|
||||
# GitHub links generation
|
||||
extensions += [
|
||||
"sphinx.ext.linkcode",
|
||||
"github_link",
|
||||
'sphinx.ext.linkcode',
|
||||
'github_link',
|
||||
# Parse Python docstrings (autodoc, automodule, autoattribute directives)
|
||||
"sphinx.ext.autodoc",
|
||||
"autodoc_field",
|
||||
'sphinx.ext.autodoc',
|
||||
'autodoc_field',
|
||||
]
|
||||
else:
|
||||
extensions += [
|
||||
"autodoc_placeholder",
|
||||
'autodoc_placeholder',
|
||||
]
|
||||
extensions.append(
|
||||
"sphinx.ext.graphviz" if shutil.which("dot") else "graphviz_placeholder"
|
||||
)
|
||||
extensions.append('sphinx.ext.graphviz' if shutil.which('dot') else 'graphviz_placeholder')
|
||||
|
||||
todo_include_todos = False
|
||||
|
||||
intersphinx_mapping = {
|
||||
"pillow": ("https://pillow.readthedocs.io/en/stable/", None),
|
||||
"python": ("https://docs.python.org/3/", None),
|
||||
"werkzeug": ("https://werkzeug.palletsprojects.com/en/2.3.x/", None),
|
||||
'python': ('https://docs.python.org/3/', None),
|
||||
'werkzeug': ('https://werkzeug.palletsprojects.com/en/1.0.x/', None),
|
||||
}
|
||||
|
||||
github_user = "NextERP"
|
||||
github_project = "documentation"
|
||||
github_user = 'odoo'
|
||||
github_project = 'documentation'
|
||||
|
||||
locale_dirs = ["../locale/"]
|
||||
templates_path = ["../extensions"]
|
||||
locale_dirs = ['../locale/']
|
||||
templates_path = ['../extensions']
|
||||
|
||||
# custom docname_to_domain to divide the translations of applications in subdirectories
|
||||
sphinx.transforms.i18n.docname_to_domain = sphinx.util.i18n.docname_to_domain = (
|
||||
lambda docname, compact: docname.split("/")[
|
||||
1 if docname.startswith("applications/") else 0
|
||||
]
|
||||
)
|
||||
sphinx.transforms.i18n.docname_to_domain = (
|
||||
sphinx.util.i18n.docname_to_domain
|
||||
) = lambda docname, compact: docname.split('/')[1 if docname.startswith('applications/') else 0]
|
||||
|
||||
# The version names that should be shown in the version switcher, if the config option `versions`
|
||||
# is populated. If a version is passed to `versions` but is not listed here, it will not be shown.
|
||||
versions_names = {
|
||||
"master": "Master",
|
||||
"saas-18.1": "Odoo Online",
|
||||
"18.0": "18.0",
|
||||
"saas-17.4": "Odoo Online",
|
||||
"saas-17.2": "Odoo Online",
|
||||
"17.0": "Odoo 17",
|
||||
"16.0": "Odoo 16",
|
||||
"15.0": "Odoo 15",
|
||||
'master': "Master",
|
||||
'saas-15.2': "Odoo Online",
|
||||
'saas-15.1': "Odoo Online",
|
||||
'15.0': "Odoo 15",
|
||||
'14.0': "Odoo 14",
|
||||
'13.0': "Odoo 13",
|
||||
}
|
||||
|
||||
# The language names that should be shown in the language switcher, if the config option `languages`
|
||||
# is populated. If a language is passed to `languages` but is not listed here, it will not be shown.
|
||||
languages_names = {
|
||||
"de": "DE",
|
||||
"en": "EN",
|
||||
"es": "ES",
|
||||
"es_419": "ES (LATAM)",
|
||||
"fr": "FR",
|
||||
"id": "ID",
|
||||
"it": "IT",
|
||||
"ja": "JA",
|
||||
"ko": "KR",
|
||||
"nl": "NL",
|
||||
"pt_BR": "PT",
|
||||
"ro": "RO",
|
||||
"sv": "SV",
|
||||
"th": "TH",
|
||||
"uk": "UA",
|
||||
"vi": "VI",
|
||||
"zh_CN": "ZH (CN)",
|
||||
"zh_TW": "ZH (TW)",
|
||||
'de': 'Deutsch',
|
||||
'en': 'English',
|
||||
'es': 'Español',
|
||||
'fr': 'Français',
|
||||
'nl': 'Nederlands',
|
||||
'pt_BR': 'Português (BR)',
|
||||
'uk': 'українська',
|
||||
'zh_CN': '简体中文',
|
||||
}
|
||||
|
||||
# The directory in which files holding redirect rules used by the 'redirects' extension are listed.
|
||||
redirects_dir = "redirects/"
|
||||
# The specifications of redirect rules used by the redirects extension.
|
||||
redirects_file = 'redirects.txt'
|
||||
|
||||
sphinx_tabs_disable_tab_closing = True
|
||||
sphinx_tabs_disable_css_loading = True
|
||||
|
||||
# Autodoc ordering
|
||||
autodoc_member_order = "bysource"
|
||||
#=== Options for HTML output ===#
|
||||
|
||||
# === Options for HTML output ===#
|
||||
|
||||
html_theme = "odoo_theme"
|
||||
html_theme = 'odoo_theme'
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
# See extensions/odoo_theme/pygments_override.py
|
||||
pygments_style = "odoo"
|
||||
pygments_style = 'odoo'
|
||||
|
||||
# The paths that contain custom themes, relative to this directory.
|
||||
html_theme_path = ["extensions"]
|
||||
html_theme_path = ['extensions']
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the docs.
|
||||
# This file should be a Windows icon file (.ico) being 16x16 or 32x32 pixels large.
|
||||
html_favicon = os.path.join(
|
||||
html_theme_path[0], html_theme, "static", "img", "favicon.ico"
|
||||
)
|
||||
html_favicon = os.path.join(html_theme_path[0], html_theme, 'static', 'img', 'favicon.ico')
|
||||
|
||||
# The paths that contain custom static files, relative to this directory.
|
||||
# They are copied after the builtin static files, so a file named "default.css" will overwrite the
|
||||
# builtin "default.css".
|
||||
html_static_path = ["static"]
|
||||
html_permalinks = True
|
||||
|
||||
html_static_path = ['static']
|
||||
html_add_permalinks = '¶' # Sphinx < 3.5
|
||||
html_permalinks = True # Sphinx >= 3.5
|
||||
# Additional JS & CSS files that can be imported with the 'custom-js' and 'custom-css' metadata.
|
||||
# Lists are empty because the files are specified in extensions/themes.
|
||||
html_js_files = []
|
||||
html_css_files = []
|
||||
html_css_files = ["css/js.css"]
|
||||
|
||||
# PHP lexer option to not require <?php
|
||||
highlight_options = {
|
||||
"php": {"startinline": True},
|
||||
'php': {'startinline': True},
|
||||
}
|
||||
|
||||
# === Options for LaTeX output ===#
|
||||
#=== Options for LaTeX output ===#
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
"papersize": "a4paper",
|
||||
'papersize': 'a4paper',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
"preamble": r"\usepackage{odoo}",
|
||||
"tableofcontents": "", # no TOC
|
||||
'preamble': r'\usepackage{odoo}',
|
||||
'tableofcontents': '', # no TOC
|
||||
|
||||
# Output manually in latex docs
|
||||
"releasename": release,
|
||||
'releasename': '14.0',
|
||||
}
|
||||
|
||||
latex_additional_files = ["static/latex/odoo.sty"]
|
||||
latex_additional_files = ['static/latex/odoo.sty']
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples:
|
||||
# (source start file, target name, title, author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(
|
||||
"legal/terms/enterprise_tex",
|
||||
"odoo_enterprise_agreement.tex",
|
||||
"Odoo Enterprise Subscription Agreement",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/partnership_tex",
|
||||
"odoo_partnership_agreement.tex",
|
||||
"Odoo Partnership Agreement",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/terms_of_sale",
|
||||
"terms_of_sale.tex",
|
||||
"Odoo Terms of Sale",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/enterprise_tex_fr",
|
||||
"odoo_enterprise_agreement_fr.tex",
|
||||
"Odoo Enterprise Subscription Agreement (FR)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/partnership_tex_fr",
|
||||
"odoo_partnership_agreement_fr.tex",
|
||||
"Odoo Partnership Agreement (FR)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/terms_of_sale_fr",
|
||||
"terms_of_sale_fr.tex",
|
||||
"Conditions Générales de Vente Odoo",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/enterprise_tex_nl",
|
||||
"odoo_enterprise_agreement_nl.tex",
|
||||
"Odoo Enterprise Subscription Agreement (NL)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/enterprise_tex_de",
|
||||
"odoo_enterprise_agreement_de.tex",
|
||||
"Odoo Enterprise Subscription Agreement (DE)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/terms_of_sale_de",
|
||||
"terms_of_sale_de.tex",
|
||||
"Allgemeine Verkaufsbedingungen Odoo",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/enterprise_tex_es",
|
||||
"odoo_enterprise_agreement_es.tex",
|
||||
"Odoo Enterprise Subscription Agreement (ES)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/partnership_tex_es",
|
||||
"odoo_partnership_agreement_es.tex",
|
||||
"Odoo Partnership Agreement (ES)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/terms_of_sale_es",
|
||||
"terms_of_sale_es.tex",
|
||||
"Términos Generales de Venta Odoo",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
(
|
||||
"legal/terms/i18n/enterprise_tex_pt_BR",
|
||||
"odoo_enterprise_agreement_pt_BR.tex",
|
||||
"Odoo Enterprise Subscription Agreement (PT)",
|
||||
"",
|
||||
"howto",
|
||||
),
|
||||
('legal/terms/enterprise_tex', 'odoo_enterprise_agreement.tex',
|
||||
'Odoo Enterprise Subscription Agreement', '', 'howto'),
|
||||
('legal/terms/partnership_tex',
|
||||
'odoo_partnership_agreement.tex', 'Odoo Partnership Agreement', '', 'howto'),
|
||||
('legal/terms/terms_of_sale',
|
||||
'terms_of_sale.tex', 'Odoo Terms of Sale', '', 'howto'),
|
||||
|
||||
('legal/terms/i18n/enterprise_tex_fr', 'odoo_enterprise_agreement_fr.tex',
|
||||
'Odoo Enterprise Subscription Agreement (FR)', '', 'howto'),
|
||||
('legal/terms/i18n/partnership_tex_fr',
|
||||
'odoo_partnership_agreement_fr.tex', 'Odoo Partnership Agreement (FR)', '', 'howto'),
|
||||
('legal/terms/i18n/terms_of_sale_fr', 'terms_of_sale_fr.tex',
|
||||
u'Conditions Générales de Vente Odoo', '', 'howto'),
|
||||
|
||||
('legal/terms/i18n/enterprise_tex_nl', 'odoo_enterprise_agreement_nl.tex',
|
||||
'Odoo Enterprise Subscription Agreement (NL)', '', 'howto'),
|
||||
|
||||
('legal/terms/i18n/enterprise_tex_de', 'odoo_enterprise_agreement_de.tex',
|
||||
'Odoo Enterprise Subscription Agreement (DE)', '', 'howto'),
|
||||
|
||||
('legal/terms/i18n/enterprise_tex_es', 'odoo_enterprise_agreement_es.tex',
|
||||
'Odoo Enterprise Subscription Agreement (ES)', '', 'howto'),
|
||||
('legal/terms/i18n/partnership_tex_es',
|
||||
'odoo_partnership_agreement_es.tex', 'Odoo Partnership Agreement (ES)', '', 'howto'),
|
||||
]
|
||||
|
||||
# List of languages that have legal translations (excluding EN). The keys must be in
|
||||
# `languages_names`. These translations will have a link to their versions of the legal
|
||||
# contracts, instead of the default EN one. The main legal documents are not part of the
|
||||
# translations since they have legal meaning.
|
||||
legal_translations = ["de", "es", "fr", "nl", "pt_BR"]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of the title page.
|
||||
latex_logo = "static/img/odoo_logo.png"
|
||||
latex_logo = 'static/img/odoo_logo.png'
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
latex_show_urls = "True"
|
||||
|
||||
latex_show_urls = 'True'
|
||||
|
||||
# https://github.com/sphinx-doc/sphinx/issues/4054#issuecomment-329097229
|
||||
def source_read_replace(app, docname, source):
|
||||
@ -481,39 +310,31 @@ def source_read_replace(app, docname, source):
|
||||
|
||||
def setup(app):
|
||||
# Generate all alternate URLs for each document
|
||||
app.add_config_value("project_root", None, "env")
|
||||
app.add_config_value("canonical_version", None, "env")
|
||||
app.add_config_value("versions", None, "env")
|
||||
app.add_config_value("languages", None, "env")
|
||||
app.add_config_value(
|
||||
"is_remote_build", None, "env"
|
||||
) # Whether the build is remotely deployed
|
||||
app.add_config_value("source_read_replace_vals", {}, "env")
|
||||
app.connect("source-read", source_read_replace)
|
||||
# TODO uncomment after moving to >= v7.2.5 to also substitute placeholders in included files.
|
||||
# See https://github.com/sphinx-doc/sphinx/commit/ff1831
|
||||
# app.connect('include-read', source_read_replace)
|
||||
app.add_config_value('project_root', None, 'env')
|
||||
app.add_config_value('canonical_version', None, 'env')
|
||||
app.add_config_value('versions', None, 'env')
|
||||
app.add_config_value('languages', None, 'env')
|
||||
app.add_config_value('is_remote_build', None, 'env') # Whether the build is remotely deployed
|
||||
app.add_config_value('source_read_replace_vals', {}, 'env')
|
||||
app.connect('source-read', source_read_replace)
|
||||
|
||||
app.add_lexer("json", JsonLexer)
|
||||
app.add_lexer("xml", XmlLexer)
|
||||
app.add_lexer('json', JsonLexer)
|
||||
app.add_lexer('xml', XmlLexer)
|
||||
|
||||
app.connect("html-page-context", _generate_alternate_urls)
|
||||
app.connect('html-page-context', _generate_alternate_urls)
|
||||
|
||||
# Add a `condition` option on directives to ignore them based on config values
|
||||
app.add_config_value("odoo_dir_in_path", None, "env")
|
||||
|
||||
app.add_config_value('odoo_dir_in_path', None, 'env')
|
||||
def context_eval(expr):
|
||||
return eval(expr, {confval.name: confval.value for confval in app.config})
|
||||
|
||||
def patch(to_patch):
|
||||
to_patch.option_spec["condition"] = context_eval
|
||||
to_patch.option_spec['condition'] = context_eval
|
||||
original_run = to_patch.run
|
||||
|
||||
def new_run(self):
|
||||
if not self.options.get("condition", True):
|
||||
if not self.options.get('condition', True):
|
||||
return []
|
||||
return original_run(self)
|
||||
|
||||
to_patch.run = new_run
|
||||
|
||||
for to_patch in (
|
||||
@ -524,7 +345,7 @@ def setup(app):
|
||||
|
||||
|
||||
def _generate_alternate_urls(app, pagename, templatename, context, doctree):
|
||||
"""Add keys of required alternate URLs for the current document in the rendering context.
|
||||
""" Add keys of required alternate URLs for the current document in the rendering context.
|
||||
|
||||
Alternate URLS are required for:
|
||||
- The canonical link tag
|
||||
@ -533,7 +354,7 @@ def _generate_alternate_urls(app, pagename, templatename, context, doctree):
|
||||
"""
|
||||
|
||||
def _canonicalize():
|
||||
"""Add the canonical URL for the current document in the rendering context.
|
||||
""" Add the canonical URL for the current document in the rendering context.
|
||||
|
||||
The canonical version is the last released version of the documentation.
|
||||
For a given language, the canonical root of a page is in the same language so that web
|
||||
@ -545,117 +366,71 @@ def _generate_alternate_urls(app, pagename, templatename, context, doctree):
|
||||
"""
|
||||
# If the canonical version is not set, assume that the project has a single version
|
||||
_canonical_version = app.config.canonical_version or app.config.version
|
||||
_canonical_lang = (
|
||||
"en" # Always 'en'. Don't take the value of the config option.
|
||||
)
|
||||
context["canonical"] = _build_url(
|
||||
_version=_canonical_version, _lang=_canonical_lang
|
||||
)
|
||||
_canonical_lang = 'en' # Always 'en'. Don't take the value of the config option.
|
||||
context['canonical'] = _build_url(_version=_canonical_version, _lang=_canonical_lang)
|
||||
|
||||
def _versionize():
|
||||
"""Add the pairs of (version, url) for the current document in the rendering context.
|
||||
""" Add the pairs of (version, url) for the current document in the rendering context.
|
||||
|
||||
The entry 'version' is added by Sphinx in the rendering context.
|
||||
"""
|
||||
context["version_display_name"] = versions_names[version]
|
||||
context['version_display_name'] = versions_names[version]
|
||||
|
||||
# If the list of versions is not set, assume the project has no alternate version
|
||||
_provided_versions = (
|
||||
app.config.versions and app.config.versions.split(",") or []
|
||||
)
|
||||
_provided_versions = app.config.versions and app.config.versions.split(',') or []
|
||||
|
||||
# Map alternate versions to their display names and URLs.
|
||||
context["alternate_versions"] = []
|
||||
context['alternate_versions'] = []
|
||||
for _alternate_version, _display_name in versions_names.items():
|
||||
if (
|
||||
_alternate_version in _provided_versions
|
||||
and _alternate_version != version
|
||||
):
|
||||
context["alternate_versions"].append(
|
||||
if _alternate_version in _provided_versions and _alternate_version != version:
|
||||
context['alternate_versions'].append(
|
||||
(_display_name, _build_url(_alternate_version))
|
||||
)
|
||||
|
||||
def _localize():
|
||||
"""Add the pairs of (lang, code, url) for the current document in the rendering context.
|
||||
""" Add the pairs of (lang, code, url) for the current document in the rendering context.
|
||||
|
||||
E.g.: ('French', 'fr', 'https://.../fr_BE/...')
|
||||
|
||||
The entry 'language' is added by Sphinx in the rendering context.
|
||||
"""
|
||||
_current_lang = app.config.language or "en"
|
||||
# Replace the context value by its upper-cased value ("FR" instead of "fr")
|
||||
context["language"] = languages_names.get(_current_lang, _current_lang.upper())
|
||||
context["language_code"] = _current_lang
|
||||
_current_lang = app.config.language or 'en'
|
||||
# Replace the context value by its translated description ("Français" instead of "french")
|
||||
context['language'] = languages_names.get(_current_lang)
|
||||
|
||||
# If the list of languages is not set, assume that the project has no alternate language
|
||||
_provided_languages = (
|
||||
app.config.languages and app.config.languages.split(",") or []
|
||||
)
|
||||
_provided_languages = app.config.languages and app.config.languages.split(',') or []
|
||||
|
||||
# Map alternate languages to their display names and URLs.
|
||||
context["alternate_languages"] = []
|
||||
context['alternate_languages'] = []
|
||||
for _alternate_lang, _display_name in languages_names.items():
|
||||
if (
|
||||
_alternate_lang in _provided_languages
|
||||
and _alternate_lang != _current_lang
|
||||
):
|
||||
context["alternate_languages"].append(
|
||||
if _alternate_lang in _provided_languages and _alternate_lang != _current_lang:
|
||||
context['alternate_languages'].append(
|
||||
(
|
||||
_display_name,
|
||||
(
|
||||
_alternate_lang.split("_")[0]
|
||||
if _alternate_lang != "en"
|
||||
else "x-default"
|
||||
),
|
||||
_alternate_lang.split('_')[0] if _alternate_lang != 'en' else 'x-default',
|
||||
_build_url(_lang=_alternate_lang),
|
||||
)
|
||||
)
|
||||
|
||||
# Dynamic generation of localized legal doc links
|
||||
context["legal_translations"] = legal_translations
|
||||
|
||||
def _build_url(_version=None, _lang=None):
|
||||
# print(f"###################################{app.config.is_remote_build}")
|
||||
# print(f"###################################{app.config.project_root}")
|
||||
if app.config.is_remote_build:
|
||||
# Project root like https://www.odoo.com/documentation
|
||||
_root = app.config.project_root
|
||||
else:
|
||||
# Project root like .../documentation/_build/html/14.0/fr
|
||||
_root = re.sub(
|
||||
rf"(/{app.config.version})?(/{app.config.language})?$", "", app.outdir
|
||||
)
|
||||
_root = re.sub(rf'(/{app.config.version})?(/{app.config.language})?$', '', app.outdir)
|
||||
# If the canonical version is not set, assume that the project has a single version
|
||||
_canonical_version = app.config.canonical_version or app.config.version
|
||||
_version = _version or app.config.version
|
||||
_lang = _lang or app.config.language or "en"
|
||||
_canonical_page = f"{pagename}.html"
|
||||
|
||||
# legal translations have different URLs schemes as they are not managed on transifex
|
||||
# e.g. FR translation of /terms/enterprise => /fr/terms/enterprise_fr
|
||||
if pagename.startswith("legal/terms/"):
|
||||
if _lang in legal_translations and not pagename.endswith(f"_{_lang}"):
|
||||
# remove language code for current translation, set target one
|
||||
_page = re.sub("_[a-z]{2}$", "", pagename)
|
||||
if "terms/i18n" not in _page:
|
||||
_page = _page.replace("/terms/", "/terms/i18n/")
|
||||
_canonical_page = f"{_page}_{_lang}.html"
|
||||
elif _lang == "en" and pagename.endswith(
|
||||
tuple(f"_{l}" for l in legal_translations)
|
||||
):
|
||||
# remove language code for current translation, link to original EN one
|
||||
_page = re.sub("_[a-z]{2}$", "", pagename)
|
||||
_canonical_page = f'{_page.replace("/i18n/", "/")}.html'
|
||||
|
||||
_lang = _lang or app.config.language or 'en'
|
||||
_canonical_page = f'{pagename}.html'
|
||||
if app.config.is_remote_build:
|
||||
_canonical_page = _canonical_page.replace("index.html", "")
|
||||
|
||||
return (
|
||||
f"{_root}"
|
||||
f'{f"/{_version}" if app.config.versions else ""}'
|
||||
f'{f"/{_lang}" if _lang != "en" else ""}'
|
||||
f"/{_canonical_page}"
|
||||
)
|
||||
_canonical_page = _canonical_page.replace('index.html', '')
|
||||
return f'{_root}' \
|
||||
f'{f"/{_version}" if app.config.versions else ""}' \
|
||||
f'{f"/{_lang}" if _lang != "en" else ""}' \
|
||||
f'/{_canonical_page}'
|
||||
|
||||
_canonicalize()
|
||||
_versionize()
|
||||
|
42
config.yaml
@ -1,42 +0,0 @@
|
||||
# -d, --dry-run Do not write/remove any files
|
||||
# -R, --replace-files Remove parsed files
|
||||
# -S, --stop-on-fail Stop on first failure
|
||||
# -W, --raise-on-warning Raise exception on parsing warning
|
||||
# -l, --language TEXT Language code for directive names [default:
|
||||
# en]
|
||||
# --sphinx / --no-sphinx Load sphinx. [default: sphinx]
|
||||
# -e, --extensions TEXT A comma-separated list of sphinx extensions
|
||||
# to load.
|
||||
# -dd, --default-domain TEXT Default sphinx domain [default: py]
|
||||
# -dr, --default-role TEXT Default sphinx role [default: convert to
|
||||
# literal]
|
||||
# -cp, --cite-prefix TEXT Prefix to add to citation references
|
||||
# [default: cite]
|
||||
# --consecutive-numbering / --no-consecutive-numbering
|
||||
# Apply consecutive numbering to ordered lists
|
||||
# [default: consecutive-numbering]
|
||||
# --colon-fences / --no-colon-fences
|
||||
# Use colon fences for directives with parsed
|
||||
# content [default: colon-fences]
|
||||
# --dollar-math / --no-dollar-math
|
||||
# Convert math (where possible) to dollar-
|
||||
# delimited math [default: dollar-math]
|
||||
# -c, --conversions PATH YAML file mapping directives -> conversions
|
||||
# --encoding TEXT Encoding for read/write [default: utf8]
|
||||
# --config FILE YAML file to read default configuration from
|
||||
# -h, --help Show this message and exit.
|
||||
language: en
|
||||
sphinx: true
|
||||
default_conversion: parse_all
|
||||
conversions:
|
||||
docutils.parsers.rst.directives.images.image: parse_all
|
||||
sphinx.directives.patches.ListTable: parse_all # For tables if needed
|
||||
extensions:
|
||||
- sphinx.ext.intersphinx
|
||||
- sphinx.ext.todo
|
||||
- sphinx_tabs.tabs
|
||||
- sphinx_design
|
||||
default_domain: py
|
||||
consecutive_numbering: true
|
||||
colon_fences: true
|
||||
dollar_math: true
|
@ -1,65 +0,0 @@
|
||||
:nosearch:
|
||||
:show-content:
|
||||
:hide-page-toc:
|
||||
:show-toc:
|
||||
|
||||
===================
|
||||
Database management
|
||||
===================
|
||||
|
||||
These guides provide instructions on how to install, maintain and upgrade Odoo databases.
|
||||
|
||||
.. seealso::
|
||||
:doc:`History of Versions <administration/supported_versions>`
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Depending on the intended use case, there are multiple ways to install Odoo - or not install it at
|
||||
all.
|
||||
|
||||
- :doc:`Online <administration/odoo_online>` is the easiest way to use Odoo in production or to try it.
|
||||
|
||||
- :doc:`Packaged installers <administration/on_premise/packages>` are suitable for testing Odoo and
|
||||
developing modules. They can be used for long-term production with additional deployment and
|
||||
maintenance work.
|
||||
|
||||
- :doc:`Source install <administration/on_premise/source>` provides greater flexibility, as it
|
||||
allows, for example, running multiple Odoo versions on the same system. It is adequate to develop
|
||||
modules and can be used as a base for production deployment.
|
||||
|
||||
- A `Docker <https://hub.docker.com/_/odoo/>`_ base image is available for development or
|
||||
deployment.
|
||||
|
||||
.. _install/editions:
|
||||
|
||||
Editions
|
||||
========
|
||||
|
||||
There are two different editions.
|
||||
|
||||
**Odoo Community** is the free and open-source version of the software, licensed under the `GNU
|
||||
LGPLv3 <https://github.com/odoo/odoo/blob/master/LICENSE>`_. It is the core upon which Odoo
|
||||
Enterprise is built.
|
||||
|
||||
**Odoo Enterprise** is the shared source version of the software, giving access to more
|
||||
functionalities, including functional support, upgrades, and hosting. `Pricing
|
||||
<https://www.odoo.com/pricing-plan>`_ starts from one app free.
|
||||
|
||||
.. tip::
|
||||
:doc:`Switch from Community to Enterprise <administration/on_premise/community_to_enterprise>` at
|
||||
any time (except for the source install).
|
||||
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
administration/hosting
|
||||
administration/odoo_online
|
||||
administration/odoo_sh
|
||||
administration/on_premise
|
||||
administration/upgrade
|
||||
administration/neutralized_database
|
||||
administration/supported_versions
|
||||
administration/mobile
|
||||
administration/odoo_accounts
|
@ -1,121 +0,0 @@
|
||||
=======
|
||||
Hosting
|
||||
=======
|
||||
|
||||
.. _hosting/change-solution:
|
||||
|
||||
Change hosting solution
|
||||
=======================
|
||||
|
||||
The instructions to change the hosting type of a database depend on the current solution used and to
|
||||
which solution the database should be moved.
|
||||
|
||||
Transferring an on-premise database
|
||||
===================================
|
||||
|
||||
To Odoo Online
|
||||
--------------
|
||||
|
||||
.. important::
|
||||
- Odoo Online is *not* compatible with **non-standard apps**.
|
||||
- The database's current version must be :doc:`supported <supported_versions>`.
|
||||
|
||||
#. Create a :ref:`duplicate of the database <on-premise/duplicate>`.
|
||||
#. In this duplicate, uninstall all **non-standard apps**.
|
||||
#. Use the database manager to grab a *dump with filestore*.
|
||||
#. `Submit a support ticket <https://www.odoo.com/help>`_ including the following:
|
||||
|
||||
- your **subscription number**,
|
||||
- the **URL** you want to use for the database (e.g., `company.odoo.com`), and
|
||||
- the **dump** as an attachment or as a link to the file (required for 60 MB+ files).
|
||||
|
||||
#. Odoo then makes sure the database is compatible before putting it online. In case of technical
|
||||
issues during the process, Odoo might contact you.
|
||||
|
||||
.. note::
|
||||
If you have time constraints, `submit a support ticket <https://www.odoo.com/help>`_ as soon as
|
||||
possible to schedule the transfer.
|
||||
|
||||
To Odoo.sh
|
||||
----------
|
||||
|
||||
Follow the instructions found in :ref:`the Import your database section
|
||||
<odoo_sh_import_your_database>` of the Odoo.sh *Create your project* documentation.
|
||||
|
||||
Transferring an Odoo Online database
|
||||
====================================
|
||||
|
||||
.. important::
|
||||
Odoo Online's :ref:`intermediary versions <supported_versions>` are not supported by Odoo.sh or
|
||||
on-premise. Therefore, if the database to transfer is running an intermediary version, it must be
|
||||
upgraded first to the next :ref:`major version <supported_versions>`, waiting for its release if
|
||||
necessary.
|
||||
|
||||
.. example::
|
||||
Transferring an online database running on Odoo 16.3 would require first upgrading it to Odoo
|
||||
17.0.
|
||||
|
||||
.. tip::
|
||||
Click the gear icon (:guilabel:`⚙`) next to the database name on the `Odoo Online database
|
||||
manager <https://www.odoo.com/my/databases/>`_ to display its version number.
|
||||
|
||||
.. warning::
|
||||
If there is an active Odoo subscription linked to the database being migrated, reach out to
|
||||
the Customer Service Manager or `submit a support ticket <https://www.odoo.com/help>`_ to
|
||||
complete the subscription transfer.
|
||||
|
||||
To on-premise
|
||||
-------------
|
||||
|
||||
#. Sign in to `the Odoo Online database manager <https://www.odoo.com/my/databases/>`_ and click the
|
||||
gear icon (:guilabel:`⚙`) next to the database name to :guilabel:`Download` a backup. If the
|
||||
download fails due to the file being too large, `contact Odoo support
|
||||
<https://www.odoo.com/help>`_.
|
||||
#. Restore the database from the database manager on your local server using the backup.
|
||||
|
||||
To Odoo.sh
|
||||
----------
|
||||
|
||||
#. Sign in to `the Odoo Online database manager <https://www.odoo.com/my/databases/>`_ and click the
|
||||
gear icon (:guilabel:`⚙`) next to the database name to :guilabel:`Download` a backup. If the
|
||||
download fails due to the file being too large, `contact Odoo support
|
||||
<https://www.odoo.com/help>`_.
|
||||
#. Follow the instructions found in :ref:`the Import your database section
|
||||
<odoo_sh_import_your_database>` of the Odoo.sh *Create your project* documentation.
|
||||
|
||||
Transferring an Odoo.sh database
|
||||
================================
|
||||
|
||||
To Odoo Online
|
||||
--------------
|
||||
|
||||
.. important::
|
||||
Odoo Online is *not* compatible with **non-standard apps**.
|
||||
|
||||
#. Uninstall all **non-standard apps** in a staging build before doing it in the production build.
|
||||
#. `Create a support ticket <https://www.odoo.com/help>`_ including the following:
|
||||
|
||||
- your **subscription number**,
|
||||
- the **URL** you want to use for the database (e.g., `company.odoo.com`),
|
||||
- which **branch** should be migrated,
|
||||
- in which **region** you want the database to be hosted (Americas, Europe, or Asia),
|
||||
- which user(s) will be the **administrator(s)**, and
|
||||
- **when** (and in which timezone) you want the database to be up and running.
|
||||
|
||||
#. Odoo then makes sure the database is compatible before putting it online. In case of technical
|
||||
issues during the process, Odoo might contact you.
|
||||
|
||||
.. note::
|
||||
- If you have time constraints, `submit a support ticket <https://www.odoo.com/help>`_ as soon as
|
||||
possible to schedule the transfer.
|
||||
- Select the **region** closest to most of your users to reduce latency.
|
||||
- Future **administrator(s)** must have an Odoo.com account.
|
||||
- The **date and time** you want the database to be up and running are helpful to organize the
|
||||
switch from the Odoo.sh server to the Odoo Online servers.
|
||||
- Databases are **not reachable** during their migration.
|
||||
|
||||
To on-premise
|
||||
-------------
|
||||
|
||||
#. Download a :ref:`backup of your Odoo.sh production database <odoo_sh_branches_backups>`.
|
||||
#. Restore the database from the database manager on your local server using the backup.
|
@ -1,67 +0,0 @@
|
||||
================
|
||||
Odoo mobile apps
|
||||
================
|
||||
|
||||
Two kind of Odoo mobile app exist: the progressive web app (PWA) and store apps. Using the PWA is
|
||||
recommended.
|
||||
|
||||
Progressive web app (PWA)
|
||||
=========================
|
||||
|
||||
PWAs are web-based applications designed to function across different devices and platforms,
|
||||
leveraging web browsers to deliver user experiences similar to native apps.
|
||||
|
||||
The Odoo PWA features include:
|
||||
|
||||
- Quick access by adding the PWA to a device's home screen
|
||||
- Seamless and borderless navigation experience
|
||||
- Push notifications
|
||||
- SSO authentication
|
||||
|
||||
To install the Odoo PWA, launch a browser supporting PWAs, and sign in to an Odoo database. The
|
||||
instructions to install a PWA depend on the platform and browser used.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Android
|
||||
|
||||
**Chrome**: open Chrome's menu (:guilabel:`⋮`), select :guilabel:`Install app`, and tap
|
||||
:guilabel:`Install`.
|
||||
|
||||
**Firefox**: open Firefox's menu (:guilabel:`⋮`), select :guilabel:`Install`, and either touch
|
||||
and hold the Odoo icon or tap :guilabel:`Add automatically`.
|
||||
|
||||
The PWA can also be installed with **Samsung Internet**, **Edge**, and **Opera**.
|
||||
|
||||
.. tab:: iOS
|
||||
|
||||
**Safari**: open the **Share** menu by tapping the square with an arrow pointing upwards icon,
|
||||
select :guilabel:`Add to Home Screen`, edit the PWA details if desired, and tap
|
||||
:guilabel:`Add`.
|
||||
|
||||
On iOS 16.4 and above, the PWA can also be installed with **Chrome**, **Firefox**, and
|
||||
**Edge**.
|
||||
|
||||
.. tab:: Desktop
|
||||
|
||||
**Chrome** and **Edge**: click the installation icon at the right of the address bar and click
|
||||
:guilabel:`Install`.
|
||||
|
||||
.. seealso::
|
||||
- `Google Chrome Help: Use progressive web apps
|
||||
<https://support.google.com/chrome/answer/9658361>`_
|
||||
- `MDN Web Docs: Installing and uninstalling web apps
|
||||
<https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing>`_
|
||||
- `Microsoft Support: Install, manage, or uninstall apps in Microsoft Edge <https://support.microsoft.com/en-us/topic/install-manage-or-uninstall-apps-in-microsoft-edge-0c156575-a94a-45e4-a54f-3a84846f6113>`_
|
||||
|
||||
Store apps
|
||||
==========
|
||||
|
||||
The Odoo mobile apps are available for download on the `Google Play Store
|
||||
<https://play.google.com/store/apps/details?id=com.odoo.mobile>`_ and `Apple App Store
|
||||
<https://apps.apple.com/app/odoo/id1272543640>`_.
|
||||
|
||||
.. important::
|
||||
The iOS app cannot be updated and will be deprecated at some point in the future.
|
||||
|
||||
While the store apps support multi-accounts, they are not compatible with SSO authentication.
|
@ -1,36 +0,0 @@
|
||||
====================
|
||||
Neutralized database
|
||||
====================
|
||||
|
||||
A neutralized database is a non-production database on which several parameters are deactivated.
|
||||
This enables one to carry out tests without the risk of launching specific automated processes that
|
||||
could impact production data (e.g., sending emails to customers). Live access is removed and
|
||||
turned into a testing environment.
|
||||
|
||||
.. note::
|
||||
**Any testing database created is a neutralized database:**
|
||||
|
||||
- testing backup databases
|
||||
- duplicate databases
|
||||
- for Odoo.sh: staging and development databases
|
||||
|
||||
.. important::
|
||||
A database can also be neutralized when upgrading, as it is vital to do some tests before
|
||||
switching to a new version.
|
||||
|
||||
Deactivated features
|
||||
====================
|
||||
|
||||
Here is a non-exhaustive list of the deactivated features:
|
||||
|
||||
- all planned actions (e.g., automatic invoicing of subscriptions, mass mailing, etc.)
|
||||
- outgoing emails
|
||||
- bank synchronization
|
||||
- payment providers
|
||||
- delivery methods
|
||||
- :abbr:`IAP (In-App Purchase)` tokens
|
||||
- website visibility (prevent search engines from indexing your site)
|
||||
|
||||
.. note::
|
||||
**A red banner at the top of the screen is displayed on the neutralized database so that it can
|
||||
be seen immediately.**
|
@ -1,80 +0,0 @@
|
||||
=================
|
||||
Odoo.com accounts
|
||||
=================
|
||||
|
||||
This documentation is dedicated to edits made to an Odoo.com account. The following processes
|
||||
describe how to delete an Odoo.com account, and how to change the password on an Odoo.com account.
|
||||
|
||||
Delete Odoo.com account
|
||||
=======================
|
||||
|
||||
To delete an Odoo.com account, start by clicking the profile icon in the upper-right corner
|
||||
(represented by the username and icon) to reveal a drop-down menu. From the drop-down menu, select
|
||||
:guilabel:`My Odoo.com account`, which reveals the user portal.
|
||||
|
||||
From the user portal, the delete option can be accessed by going to :menuselection:`My Account -->
|
||||
Edit Security Settings --> Delete Account`. It can also be accessed by going to
|
||||
`https://www.odoo.com/my/home <https://www.odoo.com/my/home>`_.
|
||||
|
||||
.. danger::
|
||||
Deleting an Odoo account is irreversible. Be careful performing this action, as the Odoo.com
|
||||
account is **not** retrievable once deleted.
|
||||
|
||||
Upon clicking the :guilabel:`Delete Account` button, a pop-up window appears, requesting
|
||||
confirmation for the account deletion.
|
||||
|
||||
.. image:: odoo_accounts/delete-account.png
|
||||
:align: center
|
||||
:alt: Clicking on the Delete Account button will populate a window verifying the change.
|
||||
|
||||
To confirm the deletion, enter the :guilabel:`Password` and the :guilabel:`Login` for the account
|
||||
being deleted. Then, click the :guilabel:`Delete Account` button to confirm the deletion.
|
||||
|
||||
.. _odoocom/change_password:
|
||||
|
||||
Odoo.com account password change
|
||||
================================
|
||||
|
||||
To change an Odoo.com account password, first login into the Odoo.com user account from the Odoo.com
|
||||
login page. After logging-in, go to the upper-right corner of the screen, and click the :guilabel:`▼
|
||||
(down arrow)` icon next to the profile icon. Then, select :guilabel:`My Account`, and a portal
|
||||
dashboard appears.
|
||||
|
||||
To change the Odoo.com password, click on the :guilabel:`Edit Security Settings` link, below the
|
||||
:menuselection:`Account Security` section. Next, make the necessary changes by typing in the current
|
||||
:guilabel:`Password`, :guilabel:`New Password`, and verify the new password. Lastly, click on
|
||||
:guilabel:`Change Password` to complete the password change.
|
||||
|
||||
.. note::
|
||||
If a customer would like to change the login, contact Odoo support `here
|
||||
<https://www.odoo.com/help>`_.
|
||||
|
||||
.. note::
|
||||
Passwords for Odoo.com users and portal users remain separate, even if the same email address is
|
||||
used.
|
||||
|
||||
Add two-factor authentication
|
||||
=============================
|
||||
|
||||
To add two-factor authentication, login into the Odoo.com user account from the Odoo.com login page.
|
||||
After logging-in, go to the upper-right corner of the screen, and click the :guilabel:`▼ (down
|
||||
arrow)` icon next to the :guilabel:`profile icon`. Then, select :guilabel:`My Account`, and a portal
|
||||
dashboard appears.
|
||||
|
||||
If the user would like to turn on two-factor authentication (2FA) for Odoo.com access, click on the
|
||||
:guilabel:`Edit Security Settings` link below the :menuselection:`Account Security` section.
|
||||
|
||||
Click on :guilabel:`Enable two-factor authentication` to turn on :abbr:`2FA (two-factor
|
||||
authentication)`. Then, confirm the current password in the :guilabel:`Password` field. Next, click
|
||||
on :guilabel:`Confirm Password`. Following that, activate :abbr:`2FA (two-factor authentication)` in
|
||||
a :abbr:`2FA (two-factor authentication)` app (Google Authenticator, Authy, etc.), by scanning the
|
||||
:guilabel:`QR code` or entering a :guilabel:`Verification Code`.
|
||||
|
||||
Finally, click on :guilabel:`Enable two-factor authentication` to complete the setup.
|
||||
|
||||
.. note::
|
||||
Under :guilabel:`My Account` Odoo.com users can also access the following:
|
||||
|
||||
- :guilabel:`My Partner dashboard`
|
||||
- :guilabel:`My In-App Services`
|
||||
- :guilabel:`My Apps Dashboard`
|
Before ![]() (image error) Size: 18 KiB |
@ -1,151 +0,0 @@
|
||||
===========
|
||||
Odoo Online
|
||||
===========
|
||||
|
||||
`Odoo Online <https://www.odoo.com/trial>`_ provides private databases which are fully managed and
|
||||
hosted by Odoo. It can be used for long-term production or to test Odoo thoroughly, including
|
||||
customizations that don't require code.
|
||||
|
||||
.. note::
|
||||
Odoo Online is incompatible with custom modules or the Odoo App Store.
|
||||
|
||||
Odoo Online databases are accessed using any web browser and do not require a local installation.
|
||||
|
||||
To quickly try out Odoo, shared `demo <https://demo.odoo.com>`_ instances are available. No
|
||||
registration is required, but each instance only lives for a few hours.
|
||||
|
||||
Database management
|
||||
===================
|
||||
|
||||
To manage a database, go to the `database manager <https://www.odoo.com/my/databases>`_ and sign in
|
||||
as the database administrator.
|
||||
|
||||
All the main database management options are available by clicking the database name, except the
|
||||
upgrade option, which can be accessed by clicking the **arrow in a circle** icon next to the
|
||||
database name. It is only displayed if an upgrade is available.
|
||||
|
||||
.. image:: odoo_online/database-manager.png
|
||||
:alt: Accessing the database management options
|
||||
|
||||
- :ref:`odoo_online/upgrade`
|
||||
- :ref:`odoo_online/duplicate`
|
||||
- :ref:`odoo_online/rename`
|
||||
- :ref:`odoo_online/download`
|
||||
- :ref:`odoo_online/domains`
|
||||
- :ref:`odoo_online/tags`
|
||||
- :ref:`odoo_online/delete`
|
||||
- :ref:`odoo_online/contact-support`
|
||||
- :ref:`odoo_online/users`
|
||||
|
||||
.. _odoo_online/upgrade:
|
||||
|
||||
Upgrade
|
||||
=======
|
||||
|
||||
Trigger a database upgrade.
|
||||
|
||||
.. seealso::
|
||||
For more information about the upgrade process, check out the :ref:`Odoo Online upgrade
|
||||
documentation <upgrade-request-test>`.
|
||||
|
||||
.. _odoo_online/duplicate:
|
||||
|
||||
Duplicate
|
||||
=========
|
||||
|
||||
Create an exact copy of the database, which can be used to perform testing without compromising
|
||||
daily operations.
|
||||
|
||||
.. important::
|
||||
- By checking :guilabel:`For testing purposes`, all external actions (emails, payments, delivery
|
||||
orders, etc.) are disabled by default on the duplicated database.
|
||||
- Duplicated databases expire automatically after 15 days.
|
||||
- A maximum of five duplicates can be made per database. Under extraordinary circumstances,
|
||||
contact `support <https://www.odoo.com/help>`_ to raise the limit.
|
||||
|
||||
.. _odoo_online/rename:
|
||||
|
||||
Rename
|
||||
======
|
||||
|
||||
Rename the database and its URL.
|
||||
|
||||
.. _odoo_online/download:
|
||||
|
||||
Download
|
||||
========
|
||||
|
||||
Download a ZIP file containing a backup of the database.
|
||||
|
||||
.. note::
|
||||
Databases are backed up daily as per the `Odoo Cloud Hosting SLA
|
||||
<https://www.odoo.com/cloud-sla>`_.
|
||||
|
||||
.. _odoo_online/domains:
|
||||
|
||||
Domain names
|
||||
============
|
||||
|
||||
Use a custom :doc:`domain name </applications/websites/website/configuration/domain_names>` to
|
||||
access the database via another URL.
|
||||
|
||||
.. tip::
|
||||
You can :ref:`register a domain name for free <domain-name/register>`.
|
||||
|
||||
.. _odoo_online/tags:
|
||||
|
||||
Tags
|
||||
====
|
||||
|
||||
Add tags to easily identify and sort your databases.
|
||||
|
||||
.. tip::
|
||||
You can search for tags in the search bar.
|
||||
|
||||
.. _odoo_online/delete:
|
||||
|
||||
Delete
|
||||
======
|
||||
|
||||
Delete a database instantly.
|
||||
|
||||
.. danger::
|
||||
Deleting a database means that all data is permanently lost. The deletion is instant and applies
|
||||
to all users. It is recommended to create a backup of the database before deleting it.
|
||||
|
||||
Carefully read the warning message and only proceed if the implications of deleting a database are
|
||||
fully understood.
|
||||
|
||||
.. image:: odoo_online/delete.png
|
||||
:alt: The warning message displayed before deleting a database
|
||||
|
||||
.. note::
|
||||
- Only an administrator can delete a database.
|
||||
- The database name is immediately made available to anyone.
|
||||
- Deleting a database if it has expired or is linked to a subscription is impossible. In that
|
||||
case, contact `Odoo Support <https://www.odoo.com/help>`_.
|
||||
|
||||
.. _odoo_online/contact-support:
|
||||
|
||||
Contact us
|
||||
==========
|
||||
|
||||
Access the `Odoo.com support page <https://www.odoo.com/help>`_ with the database's details already
|
||||
pre-filled.
|
||||
|
||||
.. _odoo_online/users:
|
||||
|
||||
Invite / remove users
|
||||
=====================
|
||||
|
||||
To invite users, fill out the new user's email address and click :guilabel:`Invite`. To add multiple
|
||||
users, click :guilabel:`Add more users`.
|
||||
|
||||
.. image:: odoo_online/invite-users.png
|
||||
:alt: Inviting a user on a database
|
||||
|
||||
To remove users, select them and click :guilabel:`Remove`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`/applications/general/users`
|
||||
- :doc:`odoo_accounts`
|
Before ![]() (image error) Size: 2.8 KiB |
@ -1,12 +0,0 @@
|
||||
:nosearch:
|
||||
|
||||
========
|
||||
Advanced
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
advanced/containers
|
||||
advanced/submodules
|
||||
advanced/frequent_technical_questions
|
@ -1,60 +0,0 @@
|
||||
|
||||
.. _odoosh-advanced-frequent_technical_questions:
|
||||
|
||||
============================
|
||||
Frequent Technical Questions
|
||||
============================
|
||||
|
||||
"Scheduled actions do not run at the exact time they were expected"
|
||||
-------------------------------------------------------------------
|
||||
|
||||
On the Odoo.sh platform, we cannot guarantee an exact running time for scheduled actions.
|
||||
|
||||
This is due to the fact that there might be multiple customers on the same server, and we must guarantee a fair share of the server for every customer. Scheduled actions are therefore implemented slightly differently than on a regular Odoo server, and are run on a *best effort* policy.
|
||||
|
||||
.. warning::
|
||||
Do not expect any scheduled action to be run more often than every 5 min.
|
||||
|
||||
Are there "best practices" regarding scheduled actions?
|
||||
-------------------------------------------------------
|
||||
|
||||
**Odoo.sh always limits the execution time of scheduled actions (*aka* crons).**
|
||||
Therefore, you must keep this fact in mind when developing your own crons.
|
||||
|
||||
We advise that:
|
||||
|
||||
- Your scheduled actions should work on small batches of records.
|
||||
- Your scheduled actions should commit their work after processing each batch;
|
||||
this way, if they get interrupted by the time-limit, there is no need to start over.
|
||||
- Your scheduled actions should be
|
||||
`idempotent <https://stackoverflow.com/a/1077421/3332416>`_: they must not
|
||||
cause side-effects if they are started more often than expected.
|
||||
|
||||
.. _ip-address-change:
|
||||
|
||||
How can I automate tasks when an IP address change occurs?
|
||||
----------------------------------------------------------
|
||||
|
||||
**Odoo.sh notifies project administrators of IP address changes.**
|
||||
Additionally, when the IP address of a production instance changes, an HTTP `GET` request is made
|
||||
to the path `/_odoo.sh/ip-change` with the new IP address included as a query string parameter
|
||||
(`new`), along with the previous IP address as an additional parameter (`old`).
|
||||
|
||||
This mechanism allows custom actions to be applied in response to the IP address change
|
||||
(e.g., sending an email, contacting a firewall API, configuring database objects, etc.)
|
||||
|
||||
For security reasons, the `/_odoo.sh/ip-change` route is accessible only internally by the platform
|
||||
itself and returns a `403` response if accessed through any other means.
|
||||
|
||||
Here is a pseudo-implementation example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class IPChangeController(http.Controller):
|
||||
|
||||
@http.route('/_odoo.sh/ip-change', auth='public')
|
||||
def ip_change(self, old=None, new=None):
|
||||
_logger.info("IP address changed from %s to %s", old, new)
|
||||
# Then perform whatever action required for your use case, e.g., update an
|
||||
# ir.config_parameter, send an email, contact an external firewall service's API, ...
|
||||
return 'ok'
|
@ -1,16 +0,0 @@
|
||||
:nosearch:
|
||||
|
||||
===========
|
||||
Get started
|
||||
===========
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
getting_started/create
|
||||
getting_started/branches
|
||||
getting_started/builds
|
||||
getting_started/status
|
||||
getting_started/settings
|
||||
getting_started/online-editor
|
||||
getting_started/first_module
|
@ -1,124 +0,0 @@
|
||||
|
||||
.. _odoosh-gettingstarted-builds:
|
||||
|
||||
======
|
||||
Builds
|
||||
======
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
In Odoo.sh, a build is considered as a database loaded by an Odoo server
|
||||
(`odoo/odoo <https://github.com/odoo/odoo>`_ & `odoo/enterprise
|
||||
<https://github.com/odoo/enterprise>`_) running on a specific revision of your project repository in
|
||||
a containerized environment. Its purpose is to test the well-behavior of the server, the database
|
||||
and the features with this revision.
|
||||
|
||||
.. image:: builds/interface-builds.png
|
||||
:align: center
|
||||
|
||||
In this view, a row represents a branch, and a cell of a row represents a build of this branch.
|
||||
|
||||
Most of the time, builds are created following pushes on your Github repository branches.
|
||||
They can be created as well when you do other operations,
|
||||
such as importing a database on Odoo.sh or asking a rebuild for a branch in your project.
|
||||
|
||||
A build is considered successful if no errors or warnings come up during its creation.
|
||||
A successful build is highlighted in green.
|
||||
|
||||
A build is considered failed if errors come up during its creation.
|
||||
A failed build is highlighted in red.
|
||||
|
||||
If warnings come up during the creation, but there are no errors, the build is considered almost
|
||||
successful. It is highlighted in yellow to notify the developer warnings were raised.
|
||||
|
||||
Builds do not always create a database from scratch. For instance, when pushing a change on the
|
||||
production branch, the build created just starts the server with your new revision and tries to load
|
||||
the current production database on it. If no errors come up, the build is considered successful, and
|
||||
otherwise failed.
|
||||
|
||||
Stages
|
||||
======
|
||||
|
||||
Production
|
||||
----------
|
||||
|
||||
The first build of a production branch creates a database from scratch.
|
||||
If this build is successful, this database is considered as the production database of your project.
|
||||
|
||||
From then, pushes on the production branch will create new builds that attempt to load the database
|
||||
using a server running with the new revision.
|
||||
|
||||
If the build is successful, or has warnings but no errors, the production database will now run with
|
||||
this build, along with the revision associated to this build.
|
||||
|
||||
If the build fails to load or update the database, then the previous successful build is re-used to
|
||||
load the database, and therefore the database will run using a server running with the previous
|
||||
successful revision.
|
||||
|
||||
The build used to run the production database is always the first of the builds list. If a build
|
||||
fails, it is put after the build currently running the production database.
|
||||
|
||||
Staging
|
||||
-------
|
||||
|
||||
Staging builds duplicate the production database,
|
||||
and try to load this duplicate with the revisions of the staging branches.
|
||||
|
||||
Each time you push a new revision on a staging branch, the build created uses a new copy of the
|
||||
production database. The databases are not re-used between builds of the same branch. This ensures:
|
||||
|
||||
* staging builds use databases that are close to what the production looks like, so you do not make
|
||||
your tests with outdated data,
|
||||
|
||||
* you can play around as much as you want in the same staging database, and you can then ask for a
|
||||
rebuild when you want to restart with a new copy of the production.
|
||||
|
||||
Nevertheless, this means that if you make configuration changes in staging databases and do not
|
||||
apply them in the production, they will not be passed on the next build of the same staging branch.
|
||||
|
||||
Development
|
||||
-----------
|
||||
|
||||
Development builds create new databases, load the demo data and run the unit tests.
|
||||
|
||||
A build will be considered failed and highlighted in red if tests fail during the installation,
|
||||
as they are meant to raise errors if something wrong occurs.
|
||||
|
||||
If all tests pass, and there is no error, the build will be considered successful.
|
||||
|
||||
According to the list of modules to install and test, a development build can take up to 1 hour to
|
||||
be ready. This is due to the large number of tests set in the default Odoo modules suite.
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
The production branch will always appear first, and then the other branches are ordered by last
|
||||
build created. You can filter out the branches.
|
||||
|
||||
.. image:: builds/interface-builds-branches.png
|
||||
:align: center
|
||||
|
||||
For each branch, you can access the last build's database using the *Connect* link and jump to the
|
||||
branch code using the *Github* link. For other branches than the production, you can create a new
|
||||
build which will use the latest revision of the branch using the link *rebuild*. This last link is
|
||||
not available when there is already a build in progress for the branch.
|
||||
|
||||
.. image:: builds/interface-builds-build.png
|
||||
:align: center
|
||||
|
||||
For each build, you can access the revision changes using the button with the Github icon. You can
|
||||
access the build's database as the administrator using the *Connect* button. Also, you can access
|
||||
the database with another user using the *Connect as* button, in the dropdown menu of the *Connect*
|
||||
button.
|
||||
|
||||
.. _odoosh-gettingstarted-builds-download-dump:
|
||||
|
||||
.. image:: builds/interface-builds-build-dropdown.png
|
||||
:align: center
|
||||
|
||||
.. _odoosh-gettingstarted-builds-dropdown-menu:
|
||||
|
||||
In the dropdown menu of the build, you can access the same features than in :ref:`the branches view
|
||||
<odoosh-gettingstarted-branches-tabs>`: *Logs*, *Web Shell*, *Editor*, *Outgoing e-mails*. You also
|
||||
have the possibility to *Download a dump* of the build's database.
|
@ -1,205 +0,0 @@
|
||||
|
||||
.. _odoosh-gettingstarted-create:
|
||||
|
||||
===================
|
||||
Create your project
|
||||
===================
|
||||
|
||||
Deploy your platform
|
||||
====================
|
||||
|
||||
Go to `Odoo.sh <https://www.odoo.sh/>`_ and hit the *Deploy your platform* button.
|
||||
|
||||
.. image:: create/deploy.png
|
||||
:align: center
|
||||
|
||||
Sign in with Github
|
||||
===================
|
||||
|
||||
Sign in with your Github account. If you do not have an account yet, hit the *Create an account*
|
||||
link.
|
||||
|
||||
.. image:: create/github-signin.png
|
||||
:align: center
|
||||
|
||||
Authorize Odoo.sh
|
||||
=================
|
||||
|
||||
Grant Odoo.sh the required accesses to your account by clicking the *Authorize* button.
|
||||
|
||||
.. image:: create/github-authorize.png
|
||||
:align: center
|
||||
|
||||
Odoo.sh basically needs:
|
||||
|
||||
* to know your Github login and email,
|
||||
* to create a new repository in case you decide to start from scratch,
|
||||
* to read your existing repositories, including the ones of your organizations, in case you want to
|
||||
start from an existing repository,
|
||||
* to create a webhook to be notified each time you push changes,
|
||||
* to commit changes to make your deployment easier, merging branches or adding new `submodules
|
||||
<https://git-scm.com/book/en/v2/Git-Tools-Submodules>`_ for example.
|
||||
|
||||
Submit your project
|
||||
===================
|
||||
|
||||
Choose if you want to start from scratch by creating a new repository, or if you want to use an
|
||||
existing repository.
|
||||
|
||||
Then, choose a name or select the repository you want to use.
|
||||
|
||||
Choose the Odoo version you want to use. If you plan to import an existing database or an existing
|
||||
set of applications, you might need to choose the according version. If you start from scratch, use
|
||||
the latest version.
|
||||
|
||||
Enter your *subscription code*. This is also called *subscription referral*, *contract number* or
|
||||
*activation code*.
|
||||
|
||||
It should be the code of your Enterprise subscription that includes Odoo.sh.
|
||||
|
||||
Partners can use their partnership codes to start a trial. Should their clients start a project,
|
||||
they ought to get an Enterprise subscription including Odoo.sh and use its subscription code. The
|
||||
partner will get 50% of the amount back as commission. Contact your sales representative or account
|
||||
manager in order to get it.
|
||||
|
||||
When submitting the form, if you are notified your subscription is not valid, it either means:
|
||||
|
||||
* it is not an existing subscription,
|
||||
* it is not a partnership subscription,
|
||||
* it is an enterprise subscription, but which does not include Odoo.sh,
|
||||
* it is neither a partnership subscription or an enterprise subscription (e.g. an online
|
||||
subscription).
|
||||
|
||||
In case of doubt with your subscription, please contact the `Odoo support
|
||||
<https://www.odoo.com/help>`_.
|
||||
|
||||
.. image:: create/deploy-form.png
|
||||
:align: center
|
||||
|
||||
You're done !
|
||||
=============
|
||||
|
||||
You can start using Odoo.sh. Your first build is about to be created. You will soon be able to
|
||||
connect to your first database.
|
||||
|
||||
.. image:: create/deploy-done.png
|
||||
:align: center
|
||||
|
||||
.. _odoo_sh_import_your_database:
|
||||
|
||||
Import your database
|
||||
====================
|
||||
|
||||
You can import your database in your Odoo.sh project as long as it is in a :doc:`supported version
|
||||
</administration/supported_versions>` of Odoo.
|
||||
|
||||
Push your modules in production
|
||||
-------------------------------
|
||||
|
||||
If you use community or custom modules, add them in a branch in your Github repository.
|
||||
Databases hosted on the Odoo.com online platform do not have any custom modules.
|
||||
Users of these databases can therefore skip this step.
|
||||
|
||||
You can structure your modules as you wish, Odoo.sh will automatically detect the folders containing
|
||||
Odoo addons. For instance, you can put all your modules folder in the root directory of your
|
||||
repository, or group the modules in folders by categories that you define (accounting, project,
|
||||
...).
|
||||
|
||||
For community modules available in public Git repositories,
|
||||
you can also consider to add them using :ref:`Submodules <odoosh-advanced-submodules>`.
|
||||
|
||||
Then, either :ref:`make this branch the production branch <odoosh-gettingstarted-branches-stages>`,
|
||||
or :ref:`merge it into your production branch <odoosh-gettingstarted-branches-mergingbranches>`.
|
||||
|
||||
Download a backup
|
||||
-----------------
|
||||
|
||||
On-premise databases
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Access the URL :file:`/web/database/manager` of your on-premise database and download a backup.
|
||||
|
||||
.. Warning::
|
||||
|
||||
If you cannot access the database manager, it may have been disabled by your system administrator.
|
||||
See the :ref:`database manager security documentation <db_manager_security>`.
|
||||
|
||||
You will need the master password of your database server. If you do not have it, contact your
|
||||
system administrator.
|
||||
|
||||
.. image:: create/create-import-onpremise-backup.png
|
||||
:align: center
|
||||
|
||||
Choose a zip including the filestore as the backup format.
|
||||
|
||||
.. image:: create/create-import-onpremise-backup-dialog.png
|
||||
:align: center
|
||||
|
||||
Odoo Online databases
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
`Access your databases manager <https://accounts.odoo.com/my/databases/manage>`_ and download a
|
||||
backup of your database.
|
||||
|
||||
.. image:: create/create-import-online-backup.png
|
||||
:align: center
|
||||
|
||||
.. Warning::
|
||||
|
||||
Online versions (e.g. *saas-**) are not supported on Odoo.sh.
|
||||
|
||||
Upload the backup
|
||||
-----------------
|
||||
|
||||
Then, in your Odoo.sh project, in the backups tab of your production branch, import the backup you
|
||||
just downloaded.
|
||||
|
||||
.. image:: create/create-import-production.png
|
||||
:align: center
|
||||
|
||||
Once the backup imported, you can access the database using the *Connect* button in the history of
|
||||
the branch.
|
||||
|
||||
.. image:: create/create-import-production-done.png
|
||||
:align: center
|
||||
|
||||
Check your outgoing email servers
|
||||
---------------------------------
|
||||
|
||||
There is a default mail server provided with Odoo.sh.
|
||||
To use it, there must be no enabled outgoing mail server configured in your database in
|
||||
:menuselection:`Settings --> Technical --> Outgoing Mail Servers` (:ref:`Developer mode
|
||||
<developer-mode>` must be activated).
|
||||
|
||||
After the import of your database, all outgoing email servers are disabled so you use the Odoo.sh
|
||||
email server provided by default.
|
||||
|
||||
.. warning::
|
||||
Port 25 is (and will stay) closed. If you want to connect to an external SMTP server, you should
|
||||
use ports 465 and 587.
|
||||
|
||||
Check your scheduled actions
|
||||
----------------------------
|
||||
|
||||
All scheduled actions are disabled after the import.
|
||||
|
||||
This is to prevent your newly imported database to perform actions that could impact your running
|
||||
production, such as sending the mails remaining in the queue, processing mass mailings, or
|
||||
third-party services synchronization (Calendars, files hosting, ...).
|
||||
|
||||
If you plan to make the imported database your production, enable the scheduled actions you need.
|
||||
You can check what is enabled in the database of origin and enable the same actions in the imported
|
||||
database. Scheduled actions are located under :menuselection:`Settings --> Technical --> Automation
|
||||
--> Scheduled Actions`.
|
||||
|
||||
Register your subscription
|
||||
--------------------------
|
||||
|
||||
Your subscription is unlinked after the import.
|
||||
|
||||
The imported database is considered a duplicate by default and the enterprise subscription is
|
||||
therefore removed, as you can only have one database linked per subscription.
|
||||
|
||||
If you plan to make it your production, unlink your former database from the subscription, and
|
||||
register the newly imported database. Read the :doc:`database registration documentation
|
||||
<../../on_premise>` for instructions.
|
@ -1,197 +0,0 @@
|
||||
|
||||
.. _odoosh-gettingstarted-online-editor:
|
||||
|
||||
=============
|
||||
Online Editor
|
||||
=============
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The online editor allows you to edit the source code of your builds from a web browser.
|
||||
It also gives you the possibility to open terminals, Python consoles, Odoo Shell consoles and
|
||||
`Notebooks <https://jupyterlab.readthedocs.io/en/stable/user/notebook.html>`_.
|
||||
|
||||
.. image:: online-editor/interface-editor.png
|
||||
:align: center
|
||||
|
||||
You can access the editor of a build through
|
||||
:ref:`the branches tabs <odoosh-gettingstarted-branches-tabs>`,
|
||||
:ref:`the builds dropdown menu <odoosh-gettingstarted-builds-dropdown-menu>`
|
||||
or by adding */odoo-sh/editor* to your build domain name
|
||||
(e.g. *https://odoo-addons-master-1.dev.odoo.com/odoo-sh/editor*).
|
||||
|
||||
Edit the source code
|
||||
====================
|
||||
|
||||
The working directory is composed of the following folders:
|
||||
|
||||
::
|
||||
|
||||
.
|
||||
├── home
|
||||
│ └── odoo
|
||||
│ ├── src
|
||||
│ │ ├── odoo Odoo Community source code
|
||||
│ │ │ └── odoo-bin Odoo server executable
|
||||
│ │ ├── enterprise Odoo Enterprise source code
|
||||
│ │ ├── themes Odoo Themes source code
|
||||
│ │ └── user Your repository branch source code
|
||||
│ ├── data
|
||||
│ │ ├── filestore database attachments, as well as the files of binary fields
|
||||
│ │ └── sessions visitors and users sessions
|
||||
│ └── logs
|
||||
│ ├── install.log Database installation logs
|
||||
│ ├── odoo.log Running server logs
|
||||
│ ├── update.log Database updates logs
|
||||
│ └── pip.log Python packages installation logs
|
||||
|
||||
You can edit the source code (files under */src*) in development and staging builds.
|
||||
|
||||
.. note::
|
||||
Your changes won't be propagated to a new build, you must commit them in your
|
||||
source code if you want to make them persist.
|
||||
|
||||
|
||||
For production builds, the source code is read-only, because applying local changes on a production
|
||||
server is not a good practice.
|
||||
|
||||
* The source code of your Github repository is located under */src/user*,
|
||||
* The source code of Odoo is located under
|
||||
|
||||
* */src/odoo* (`odoo/odoo <https://github.com/odoo/odoo>`_),
|
||||
* */src/enterprise* (`odoo/enterprise <https://github.com/odoo/enterprise>`_),
|
||||
* */src/themes* (`odoo/design-themes <https://github.com/odoo/design-themes>`_).
|
||||
|
||||
To open a file in the editor, just double-click on it in the file browser panel on the left.
|
||||
|
||||
.. image:: online-editor/interface-editor-open-file.png
|
||||
:align: center
|
||||
|
||||
You can then begin to make your changes. You can save your changes with the menu
|
||||
:menuselection:`File --> Save .. File` or by hitting the :kbd:`Ctrl+S` shortcut.
|
||||
|
||||
.. image:: online-editor/interface-editor-save-file.png
|
||||
:align: center
|
||||
|
||||
If you save a Python file which is under your Odoo server addons path,
|
||||
Odoo will detect it and reload automatically so your changes are reflected immediately,
|
||||
without having to restart the server manually.
|
||||
|
||||
.. image:: online-editor/interface-editor-automaticreload.gif
|
||||
:align: center
|
||||
|
||||
However, if the change is a data stored in database, such as the label of a field, or a view,
|
||||
you have to update the according module to apply the change.
|
||||
You can update the module of the currently opened file by using the menu
|
||||
:menuselection:`Odoo --> Update current module`. Note that the file considered as currently opened
|
||||
is the file focused in the text editor, not the file highlighted in the file browser.
|
||||
|
||||
.. image:: online-editor/interface-editor-update-current-module.png
|
||||
:align: center
|
||||
|
||||
You can also open a terminal and execute the command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ odoo-bin -u <comma-separated module names> --stop-after-init
|
||||
|
||||
.. _odoosh-gettingstarted-online-editor-push:
|
||||
|
||||
Commit & Push your changes
|
||||
==========================
|
||||
|
||||
You have the possibility to commit and push your changes to your Github repository.
|
||||
|
||||
* Open a terminal (:menuselection:`File --> New --> Terminal`),
|
||||
* Change the directory to *~/src/user* using :code:`cd ~/src/user`,
|
||||
* Stage your changes using :code:`git add`,
|
||||
* Commit your changes using :code:`git commit`,
|
||||
* Push your changes using :code:`git push https HEAD:<branch>`.
|
||||
|
||||
In this last command,
|
||||
|
||||
* *https* is the name of your *HTTPS* Github remote repository
|
||||
(e.g. https://github.com/username/repository.git),
|
||||
* HEAD is the reference to the latest revision you committed,
|
||||
* <branch> must be replaced by the name of the branch to which you want to push the changes,
|
||||
most-likely the current branch if you work in a development build.
|
||||
|
||||
.. image:: online-editor/interface-editor-commit-push.png
|
||||
:align: center
|
||||
|
||||
.. note::
|
||||
The SSH Github remote is not used because your SSH private key
|
||||
is not hosted in your build containers (for obvious security concerns)
|
||||
nor forwarded through an SSH Agent (as you access this editor through a web browser)
|
||||
and you therefore cannot authenticate yourself to Github using SSH.
|
||||
You have to use the HTTPS remote of your Github repository to push your changes,
|
||||
which is added automatically named as *https* in your Git remotes.
|
||||
You will be prompted to enter your Github username and password.
|
||||
If you activated the two-factor authentication on Github,
|
||||
you can create a `personal access token
|
||||
<https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/>`_
|
||||
and use it as password. Granting the ``repo`` permission suffices.
|
||||
|
||||
.. note::
|
||||
The Git source folder *~/src/user* is not checked out on a branch but rather on a detached revision:
|
||||
This is because builds work on specific revisions rather than branches.
|
||||
In other words, this means you can have multiple builds on the same branch, but on different revisions.
|
||||
|
||||
Once your changes are pushed,
|
||||
according to your :ref:`branch push behavior <odoosh-gettingstarted-branches-tabs-settings>`,
|
||||
a new build may be created. You can continue to work in the editor you pushed from,
|
||||
as it will have the same revision as the new build that was created, but always make sure to be
|
||||
in an editor of a build using the latest revision of your branch.
|
||||
|
||||
Consoles
|
||||
========
|
||||
|
||||
You can open Python consoles, which are
|
||||
`IPython interactive shells <https://ipython.readthedocs.io/en/stable/interactive/tutorial.html>`_.
|
||||
One of the most interesting addition to use a Python console
|
||||
rather than a IPython shell within a terminal is the
|
||||
`rich display <https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display>`_
|
||||
capabilities.
|
||||
Thanks to this, you will be able to display objects in HTML.
|
||||
|
||||
You can for instance display cells of a CSV file using
|
||||
`pandas <https://pandas.pydata.org/pandas-docs/stable/tutorials.html>`_.
|
||||
|
||||
.. image:: online-editor/interface-editor-console-python-read-csv.png
|
||||
:align: center
|
||||
|
||||
You can also open an Odoo Shell console to play around
|
||||
with the Odoo registry and model methods of your database. You can also directly read or write
|
||||
on your records.
|
||||
|
||||
.. warning::
|
||||
In an Odoo Console, transactions are automatically committed.
|
||||
This means, for instance, that changes in records are applied effectively in the database.
|
||||
If you change the name of a user, the name of the user is changed in your database as well.
|
||||
You therefore should use Odoo consoles carefully on production databases.
|
||||
|
||||
You can use *env* to invoke models of your database registry, e.g. :code:`env['res.users']`.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
env['res.users'].search_read([], ['name', 'email', 'login'])
|
||||
[{'id': 2,
|
||||
'login': 'admin',
|
||||
'name': 'Administrator',
|
||||
'email': 'admin@example.com'}]
|
||||
|
||||
The class :code:`Pretty` gives you the possibility
|
||||
to easily display lists and dicts in a pretty way, using the
|
||||
`rich display <https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display>`_
|
||||
mentioned above.
|
||||
|
||||
.. image:: online-editor/interface-editor-console-odoo-pretty.png
|
||||
:align: center
|
||||
|
||||
You can also use
|
||||
`pandas <https://pandas.pydata.org/pandas-docs/stable/tutorials.html>`_
|
||||
to display graphs.
|
||||
|
||||
.. image:: online-editor/interface-editor-console-odoo-graph.png
|
||||
:align: center
|
@ -1,339 +0,0 @@
|
||||
========
|
||||
Settings
|
||||
========
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The settings allow you to manage the configuration of your project.
|
||||
|
||||
.. image:: settings/interface-settings.png
|
||||
:align: center
|
||||
|
||||
Project name
|
||||
============
|
||||
|
||||
The name of your project.
|
||||
|
||||
.. image:: settings/interface-settings-projectname.png
|
||||
:align: center
|
||||
|
||||
This defines the address that will be used to access your production database.
|
||||
|
||||
Addresses of your staging and development builds are derived from this name and assigned
|
||||
automatically. However, when you change your project name, only future builds will use the new name.
|
||||
|
||||
.. _odoosh-gettingstarted-settings-collaborators:
|
||||
|
||||
Collaborators
|
||||
=============
|
||||
|
||||
Manage the Github users who can access your project.
|
||||
|
||||
.. image:: settings/interface-settings-collaborators.png
|
||||
:align: center
|
||||
|
||||
There are three levels of users:
|
||||
|
||||
- :guilabel:`Admin`: has access to all features of an Odoo.sh project.
|
||||
|
||||
- :guilabel:`Tester`: has access to the *Staging* and *Development* databases and their tooling.
|
||||
This role is for users conducting User Acceptance Tests. Testers can work with copies of
|
||||
production data but cannot access the production database through the Odoo.sh tooling.
|
||||
|
||||
- :guilabel:`Developer`: has access only to the *Development* databases and their tooling. This
|
||||
role is for developers who propose code modifications but are not allowed to access production
|
||||
and staging databases through the Odoo.sh tooling.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
* -
|
||||
-
|
||||
- Developer
|
||||
- Tester
|
||||
- Admin
|
||||
* - Development
|
||||
- History
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- 1-click connect
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Logs
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Shell/SSH
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Mails
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Settings
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* - Staging
|
||||
- History
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- 1-click connect
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Logs
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Shell/SSH
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Mails
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Monitoring
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Backups
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Upgrade
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Settings
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* - Production
|
||||
- History
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- 1-click connect
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Logs
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Shell/SSH
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Mails
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Monitoring
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Backups
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Upgrade
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Settings
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
* - Status
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
* - Settings
|
||||
-
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
|
||||
.. warning::
|
||||
Those roles only apply to the usage of Odoo.sh. It is important to reflect the user roles
|
||||
attribution within the repository on GitHub. Please refer to the GitHub documentation section on
|
||||
`Managing a branch protection rule <https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule>`_
|
||||
for detailed guidance.
|
||||
|
||||
.. |green| raw:: html
|
||||
|
||||
<span class="text-success" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
.. |orange| raw:: html
|
||||
|
||||
<span class="text-warning" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
.. |red| raw:: html
|
||||
|
||||
<span class="text-danger" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
Public Access
|
||||
=============
|
||||
|
||||
Allow public access to your development builds.
|
||||
|
||||
.. image:: settings/interface-settings-public.png
|
||||
:align: center
|
||||
|
||||
If activated, this option exposes the Builds page publicly, allowing visitors to view logs of development builds.
|
||||
|
||||
Production and staging builds are excluded, visitors can only see their status.
|
||||
|
||||
.. _odoosh-gettingstarted-settings-modules-installation:
|
||||
|
||||
GitHub commit statuses
|
||||
======================
|
||||
|
||||
This option enables Odoo.sh to push commit statuses to your GitHub repository when a build is
|
||||
created or updated. It requires a GitHub token with permissions to push commit statuses to the
|
||||
repository. Refer to `GitHub's documentation on personal access tokens <https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens>`_
|
||||
for instructions to create yours.
|
||||
|
||||
.. note::
|
||||
GitHub's **fine-grained personal tokens** have an expiration date and will be disabled if they
|
||||
fail to update the commit status. You can replace the token at any time on Odoo.sh.
|
||||
|
||||
The commit statuses pushed to GitHub can have the following contexts:
|
||||
|
||||
- :guilabel:`ci/odoo.sh (dev)`: status of a development build
|
||||
- :guilabel:`ci/odoo.sh (staging)`: status of a staging build
|
||||
- :guilabel:`ci/odoo.sh (production)`: status of a production build
|
||||
- :guilabel:`ci/odoo.sh (test_ci)`: testing the token from the Settings page will push a test
|
||||
status on the last commit of your repository
|
||||
|
||||
Custom domains
|
||||
==============
|
||||
|
||||
To configure additional domains please refer to the corresponding branch's :ref:`settings tab
|
||||
<odoosh-gettingstarted-branches-tabs-settings>`.
|
||||
|
||||
.. _odoosh-gettingstarted-settings-submodules:
|
||||
|
||||
Submodules
|
||||
==========
|
||||
|
||||
Configure the deploy keys for the private repositories you use
|
||||
as submodules in your branches to allow Odoo.sh to download them.
|
||||
|
||||
.. warning::
|
||||
These settings are required for **private repositories** only. If you are looking on how to set
|
||||
up your submodules, instructions are available in the chapter :ref:`Submodules
|
||||
<odoosh-advanced-submodules>` of this documentation.
|
||||
|
||||
.. image:: settings/interface-settings-submodules.png
|
||||
:align: center
|
||||
|
||||
When a repository is private, it is not possible to publicly download its branches and revisions.
|
||||
For that reason, you need to configure a deploy key for Odoo.sh,
|
||||
so the remote Git server allows our platform to download the revisions
|
||||
of this private repository.
|
||||
|
||||
To configure the deploy key for a private repository, proceed as follows:
|
||||
|
||||
* in the input, paste the SSH URL of your private sub-repository and click on *Add*,
|
||||
|
||||
* e.g. *git@github.com:USERNAME/REPOSITORY.git*
|
||||
* it can be another Git server than Github, such as Bitbucket, Gitlab or even your own self-hosted
|
||||
server
|
||||
|
||||
* copy the public key,
|
||||
|
||||
* it should look like *ssh-rsa some...random...characters...here...==*
|
||||
|
||||
* in the settings of the private sub-repository, add the public key amongst the deploy keys.
|
||||
|
||||
* Github.com: :menuselection:`Settings --> Deploy keys --> Add deploy key`
|
||||
* Bitbucket.com: :menuselection:`Settings --> Access keys --> Add key`
|
||||
* Gitlab.com: :menuselection:`Settings --> Repository --> Deploy Keys`
|
||||
* Self-hosted: append the key to the git user’s authorized_keys file in its .ssh directory
|
||||
|
||||
Storage Size
|
||||
============
|
||||
|
||||
This section shows the storage size used by your project.
|
||||
|
||||
.. image:: settings/interface-settings-storage.png
|
||||
:align: center
|
||||
|
||||
Storage size is computed as follows:
|
||||
|
||||
* the size of the PostgreSQL database
|
||||
|
||||
* the size of the disk files available in your container: database filestore, sessions storage directory...
|
||||
|
||||
.. warning::
|
||||
In case you want to analyze disk usage, you can run the tool `ncdu
|
||||
<https://dev.yorhel.nl/ncdu/man>`_ in your Web Shell.
|
||||
|
||||
Should your production database size grow to exceed what's provisioned in your subscription, it
|
||||
will automatically be synchronized with it.
|
||||
|
||||
Database Workers
|
||||
================
|
||||
|
||||
Additional database workers can be configured here. More workers help increase the load your
|
||||
production database is able to handle. If you add more, it will automatically be synchronized
|
||||
with your subscription.
|
||||
|
||||
.. image:: settings/interface-settings-workers.png
|
||||
:align: center
|
||||
|
||||
.. Warning::
|
||||
Adding more workers will not magically solve all performance issues. It only allows the server
|
||||
to handle more connections at the same time. If some operations are unusually slow, it's most
|
||||
likely a problem with the code, if it's not due to your own customizations you can open a ticket
|
||||
`here <https://www.odoo.com/help>`_.
|
||||
|
||||
Staging Branches
|
||||
================
|
||||
|
||||
Additional staging branches allow you to develop and test more features at the same time. If you
|
||||
add more, it will automatically be synchronized with your subscription.
|
||||
|
||||
.. image:: settings/interface-settings-staging-branches.png
|
||||
:align: center
|
||||
|
||||
Activation
|
||||
==========
|
||||
|
||||
Shows the status of the project's activation. You can change the project's activation code if
|
||||
needed.
|
||||
|
||||
.. image:: settings/interface-settings-activation.png
|
||||
:align: center
|
Before ![]() (image error) Size: 17 KiB |
@ -1,12 +0,0 @@
|
||||
======
|
||||
Status
|
||||
======
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The status page shows statistics regarding the servers your project uses. It includes the servers
|
||||
availability.
|
||||
|
||||
.. image:: status/interface-status.png
|
||||
:align: center
|
@ -1,10 +0,0 @@
|
||||
:nosearch:
|
||||
|
||||
========
|
||||
Overview
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
overview/introduction
|
@ -1,10 +0,0 @@
|
||||
=======================
|
||||
Introduction to Odoo.sh
|
||||
=======================
|
||||
|
||||
.. youtube:: QuNsa9n9PMg
|
||||
:align: right
|
||||
:width: 700
|
||||
:height: 394
|
||||
|
||||
The documentation will help you go live with your Odoo.sh project in no time.
|
@ -1,117 +0,0 @@
|
||||
:show-content:
|
||||
|
||||
==========
|
||||
On-premise
|
||||
==========
|
||||
|
||||
Register a database
|
||||
===================
|
||||
|
||||
To register your database, enter your subscription code in the banner in the app dashboard. If the
|
||||
registration is successful, the banner will turn green and display the database expiration date.
|
||||
|
||||
.. tip::
|
||||
The expiration date is also displayed at the bottom of the Settings page.
|
||||
|
||||
.. _on-premise/duplicate:
|
||||
|
||||
Duplicate a database
|
||||
====================
|
||||
|
||||
Duplicate a database by accessing the database manager on your server
|
||||
(`<odoo-server>/web/database/manager`). Typically, you want to duplicate your production database
|
||||
into a neutralized testing database. It can be done by checking the neutralize box when prompted,
|
||||
which executes all :file:`neutralize.sql` scripts for every installed module.
|
||||
|
||||
Common error messages and solutions
|
||||
===================================
|
||||
|
||||
Registration error
|
||||
------------------
|
||||
|
||||
In case of a registration error, the following message should be displayed.
|
||||
|
||||
.. image:: on_premise/error-message-sub-code.png
|
||||
:alt: Database registration error message
|
||||
|
||||
To resolve the issue:
|
||||
|
||||
- Check the **validity of your Odoo Enterprise subscription** by verifying if your subscription
|
||||
details have the tag :guilabel:`In Progress` on your `Odoo Account
|
||||
<https://accounts.odoo.com/my/subscription>`_ or contact your Account Manager.
|
||||
|
||||
- Ensure that **no other database is linked** to the subscription code, as only one database can be
|
||||
linked per subscription.
|
||||
|
||||
.. tip::
|
||||
If a test or a development database is needed, you can :ref:`duplicate a database
|
||||
<on-premise/duplicate>`.
|
||||
|
||||
- Verify that **no databases share the same UUID** (Universally Unique Identifier) by opening your
|
||||
`Odoo Contract <https://accounts.odoo.com/my/subscription>`_. If two or more databases share the
|
||||
same UUID, their name will be displayed.
|
||||
|
||||
.. image:: on_premise/unlink-db-name-collision.png
|
||||
:alt: Database UUID error message
|
||||
|
||||
If that is the case, manually change the database(s) UUID or `send a support ticket
|
||||
<https://www.odoo.com/help>`_.
|
||||
|
||||
- As the update notification must be able to reach Odoo's subscription validation servers, ensure
|
||||
your **network and firewall settings** allow the Odoo server to open outgoing connections
|
||||
towards:
|
||||
|
||||
- Odoo 18.0 and above: `services.odoo.com` on port `80`
|
||||
- Odoo 17.0 and below: `services.openerp.com` on port `80`
|
||||
|
||||
These ports must be kept open even after registering a database, as the update notification runs
|
||||
once a week.
|
||||
|
||||
Too many users error
|
||||
--------------------
|
||||
|
||||
If you have more users in a local database than provisioned in your Odoo Enterprise subscription,
|
||||
the following message should be displayed.
|
||||
|
||||
.. image:: on_premise/add-more-users.png
|
||||
:alt: Too many users on a database error message
|
||||
|
||||
When the message appears, you have 30 days to act before the database expires. The countdown is
|
||||
updated every day.
|
||||
|
||||
To resolve the issue, either:
|
||||
|
||||
- **Add more users** to your subscription by clicking the :guilabel:`Upgrade your subscription` link
|
||||
displayed in the message to validate the upsell quotation and pay for the extra users.
|
||||
- :ref:`Deactivate users <users/deactivate>` and **reject** the upsell quotation.
|
||||
|
||||
Once your database has the correct number of users, the expiration message disappears automatically
|
||||
after a few days, when the next verification occurs.
|
||||
|
||||
Database expired error
|
||||
----------------------
|
||||
|
||||
If your database expires before you renew your subscription, the following message should be
|
||||
displayed.
|
||||
|
||||
.. image:: on_premise/database-expired.png
|
||||
:alt: Database expired error message
|
||||
|
||||
This message appears if you fail to act before the end of the 30-day countdown.
|
||||
|
||||
To resolve the issue, either:
|
||||
|
||||
- Click the :guilabel:`Renew your subscription` link displayed in the message and complete the
|
||||
process. If you pay by wire transfer, your subscription will be renewed when the payment arrives
|
||||
which can take a few days. Credit card payments are processed immediately.
|
||||
- `Send a support ticket <https://www.odoo.com/help>`_.
|
||||
|
||||
.. toctree::
|
||||
|
||||
on_premise/packages
|
||||
on_premise/source
|
||||
on_premise/update
|
||||
on_premise/deploy
|
||||
on_premise/email_gateway
|
||||
on_premise/geo_ip
|
||||
on_premise/community_to_enterprise
|
Before ![]() (image error) Size: 6.3 KiB |
@ -1,106 +0,0 @@
|
||||
|
||||
.. _setup/enterprise:
|
||||
|
||||
===================================
|
||||
Switch from Community to Enterprise
|
||||
===================================
|
||||
|
||||
Depending on your current installation, there are multiple ways to upgrade
|
||||
your community version.
|
||||
In any case the basic guidelines are:
|
||||
|
||||
* Backup your community database
|
||||
|
||||
.. image:: community_to_enterprise/db_manager.png
|
||||
:class: img-fluid
|
||||
|
||||
* Shutdown your server
|
||||
|
||||
* Install the web_enterprise module
|
||||
|
||||
* Restart your server
|
||||
|
||||
* Enter your Odoo Enterprise Subscription code
|
||||
|
||||
.. image:: community_to_enterprise/enterprise_code.png
|
||||
:class: img-fluid
|
||||
|
||||
On Linux, using an installer
|
||||
============================
|
||||
|
||||
* Backup your community database
|
||||
|
||||
* Stop the odoo service
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo service odoo stop
|
||||
|
||||
* Install the enterprise .deb (it should install over the community package)
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo dpkg -i <path_to_enterprise_deb>
|
||||
|
||||
* Update your database to the enterprise packages using
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 /usr/bin/odoo-bin -d <database_name> -i web_enterprise --stop-after-init
|
||||
|
||||
* You should be able to connect to your Odoo Enterprise instance using your usual mean of identification.
|
||||
You can then link your database with your Odoo Enterprise Subscription by entering the code you received
|
||||
by e-mail in the form input
|
||||
|
||||
|
||||
On Linux, using the source code
|
||||
===============================
|
||||
|
||||
There are many ways to launch your server when using sources, and you probably
|
||||
have your own favourite. You may need to adapt sections to your usual workflow.
|
||||
|
||||
* Shutdown your server
|
||||
* Backup your community database
|
||||
* Update the ``--addons-path`` parameter of your launch command (see :doc:`../on_premise/source`)
|
||||
* Install the web_enterprise module by using
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ -d <database_name> -i web_enterprise --stop-after-init
|
||||
|
||||
Depending on the size of your database, this may take some time.
|
||||
|
||||
* Restart your server with the updated addons path of point 3.
|
||||
You should be able to connect to your instance. You can then link your database with your
|
||||
Odoo Enterprise Subscription by entering the code you received by e-mail in the form input
|
||||
|
||||
On Windows
|
||||
==========
|
||||
|
||||
* Backup your community database
|
||||
|
||||
* Uninstall Odoo Community (using the Uninstall executable in the installation folder) -
|
||||
PostgreSQL will remain installed
|
||||
|
||||
.. image:: community_to_enterprise/windows_uninstall.png
|
||||
:class: img-fluid
|
||||
|
||||
* Launch the Odoo Enterprise Installer and follow the steps normally. When choosing
|
||||
the installation path, you can set the folder of the Community installation
|
||||
(this folder still contains the PostgreSQL installation).
|
||||
Uncheck ``Start Odoo`` at the end of the installation
|
||||
|
||||
.. image:: community_to_enterprise/windows_setup.png
|
||||
:class: img-fluid
|
||||
|
||||
* Using a command window, update your Odoo Database using this command (from the Odoo
|
||||
installation path, in the server subfolder)
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ ..\python\python.exe odoo-bin -d <database_name> -i web_enterprise --stop-after-init
|
||||
|
||||
* No need to manually launch the server, the service is running.
|
||||
You should be able to connect to your Odoo Enterprise instance using your usual
|
||||
mean of identification. You can then link your database with your Odoo Enterprise
|
||||
Subscription by entering the code you received by e-mail in the form input
|
Before ![]() (image error) Size: 25 KiB |
Before ![]() (image error) Size: 39 KiB |
@ -1,930 +0,0 @@
|
||||
====================
|
||||
System configuration
|
||||
====================
|
||||
|
||||
This document describes basic steps to set up Odoo in production or on an
|
||||
internet-facing server. It follows :doc:`installation <../on_premise>`, and is
|
||||
not generally necessary for a development systems that is not exposed on the
|
||||
internet.
|
||||
|
||||
.. warning:: If you are setting up a public server, be sure to check our :ref:`security` recommendations!
|
||||
|
||||
.. _dbfilter:
|
||||
|
||||
dbfilter
|
||||
========
|
||||
|
||||
Odoo is a multi-tenant system: a single Odoo system may run and serve a number
|
||||
of database instances. It is also highly customizable, with customizations
|
||||
(starting from the modules being loaded) depending on the "current database".
|
||||
|
||||
This is not an issue when working with the backend (web client) as a logged-in
|
||||
company user: the database can be selected when logging in, and customizations
|
||||
loaded afterwards.
|
||||
|
||||
However it is an issue for non-logged users (portal, website) which aren't
|
||||
bound to a database: Odoo needs to know which database should be used to load
|
||||
the website page or perform the operation. If multi-tenancy is not used that is not an
|
||||
issue, there's only one database to use, but if there are multiple databases
|
||||
accessible Odoo needs a rule to know which one it should use.
|
||||
|
||||
That is one of the purposes of :option:`--db-filter <odoo-bin --db-filter>`:
|
||||
it specifies how the database should be selected based on the hostname (domain)
|
||||
that is being requested. The value is a `regular expression`_, possibly
|
||||
including the dynamically injected hostname (``%h``) or the first subdomain
|
||||
(``%d``) through which the system is being accessed.
|
||||
|
||||
For servers hosting multiple databases in production, especially if ``website``
|
||||
is used, dbfilter **must** be set, otherwise a number of features will not work
|
||||
correctly.
|
||||
|
||||
Configuration samples
|
||||
---------------------
|
||||
|
||||
* Show only databases with names beginning with 'mycompany'
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[options]
|
||||
dbfilter = ^mycompany.*$
|
||||
|
||||
* Show only databases matching the first subdomain after ``www``: for example
|
||||
the database "mycompany" will be shown if the incoming request
|
||||
was sent to ``www.mycompany.com`` or ``mycompany.co.uk``, but not
|
||||
for ``www2.mycompany.com`` or ``helpdesk.mycompany.com``.
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[options]
|
||||
dbfilter = ^%d$
|
||||
|
||||
.. note::
|
||||
|
||||
Setting a proper :option:`--db-filter <odoo-bin --db-filter>` is an important part
|
||||
of securing your deployment.
|
||||
Once it is correctly working and only matching a single database per hostname, it
|
||||
is strongly recommended to block access to the database manager screens,
|
||||
and to use the ``--no-database-list`` startup parameter to prevent listing
|
||||
your databases, and to block access to the database management screens.
|
||||
See also security_.
|
||||
|
||||
PostgreSQL
|
||||
==========
|
||||
|
||||
By default, PostgreSQL only allows connection over UNIX sockets and loopback
|
||||
connections (from "localhost", the same machine the PostgreSQL server is
|
||||
installed on).
|
||||
|
||||
UNIX socket is fine if you want Odoo and PostgreSQL to execute on the same
|
||||
machine, and is the default when no host is provided, but if you want Odoo and
|
||||
PostgreSQL to execute on different machines [#different-machines]_ it will
|
||||
need to `listen to network interfaces`_ [#remote-socket]_, either:
|
||||
|
||||
* Only accept loopback connections and `use an SSH tunnel`_ between the
|
||||
machine on which Odoo runs and the one on which PostgreSQL runs, then
|
||||
configure Odoo to connect to its end of the tunnel
|
||||
* Accept connections to the machine on which Odoo is installed, possibly
|
||||
over ssl (see `PostgreSQL connection settings`_ for details), then configure
|
||||
Odoo to connect over the network
|
||||
|
||||
Configuration sample
|
||||
--------------------
|
||||
|
||||
* Allow tcp connection on localhost
|
||||
* Allow tcp connection from 192.168.1.x network
|
||||
|
||||
in ``/etc/postgresql/<YOUR POSTGRESQL VERSION>/main/pg_hba.conf`` set:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# IPv4 local connections:
|
||||
host all all 127.0.0.1/32 md5
|
||||
host all all 192.168.1.0/24 md5
|
||||
|
||||
in ``/etc/postgresql/<YOUR POSTGRESQL VERSION>/main/postgresql.conf`` set:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
listen_addresses = 'localhost,192.168.1.2'
|
||||
port = 5432
|
||||
max_connections = 80
|
||||
|
||||
.. _setup/deploy/odoo:
|
||||
|
||||
Configuring Odoo
|
||||
----------------
|
||||
|
||||
Out of the box, Odoo connects to a local postgres over UNIX socket via port
|
||||
5432. This can be overridden using :ref:`the database options
|
||||
<reference/cmdline/server/database>` when your Postgres deployment is not
|
||||
local and/or does not use the installation defaults.
|
||||
|
||||
The :doc:`packaged installers <packages>` will automatically
|
||||
create a new user (``odoo``) and set it as the database user.
|
||||
|
||||
* The database management screens are protected by the ``admin_passwd``
|
||||
setting. This setting can only be set using configuration files, and is
|
||||
simply checked before performing database alterations. It should be set to
|
||||
a randomly generated value to ensure third parties can not use this
|
||||
interface.
|
||||
* All database operations use the :ref:`database options
|
||||
<reference/cmdline/server/database>`, including the database management
|
||||
screen. For the database management screen to work requires that the PostgreSQL user
|
||||
have ``createdb`` right.
|
||||
* Users can always drop databases they own. For the database management screen
|
||||
to be completely non-functional, the PostgreSQL user needs to be created with
|
||||
``no-createdb`` and the database must be owned by a different PostgreSQL user.
|
||||
|
||||
.. warning:: the PostgreSQL user *must not* be a superuser
|
||||
|
||||
Configuration sample
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* connect to a PostgreSQL server on 192.168.1.2
|
||||
* port 5432
|
||||
* using an 'odoo' user account,
|
||||
* with 'pwd' as a password
|
||||
* filtering only db with a name beginning with 'mycompany'
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[options]
|
||||
admin_passwd = mysupersecretpassword
|
||||
db_host = 192.168.1.2
|
||||
db_port = 5432
|
||||
db_user = odoo
|
||||
db_password = pwd
|
||||
dbfilter = ^mycompany.*$
|
||||
|
||||
.. _postgresql_ssl_connect:
|
||||
|
||||
SSL Between Odoo and PostgreSQL
|
||||
-------------------------------
|
||||
|
||||
Since Odoo 11.0, you can enforce ssl connection between Odoo and PostgreSQL.
|
||||
in Odoo the db_sslmode control the ssl security of the connection
|
||||
with value chosen out of 'disable', 'allow', 'prefer', 'require', 'verify-ca'
|
||||
or 'verify-full'
|
||||
|
||||
`PostgreSQL Doc <https://www.postgresql.org/docs/12/static/libpq-ssl.html>`_
|
||||
|
||||
.. _builtin_server:
|
||||
|
||||
Builtin server
|
||||
==============
|
||||
|
||||
Odoo includes built-in HTTP, cron, and live-chat servers, using either multi-threading or
|
||||
multi-processing.
|
||||
|
||||
The **multi-threaded** server is a simpler server primarily used for development, demonstrations,
|
||||
and its compatibility with various operating systems (including Windows). A new thread is spawned
|
||||
for every new HTTP request, even for long-lived connections such as websocket. Extra daemonic cron
|
||||
threads are spawned too. Due to a Python limitation (GIL), it doesn't make the best use of the
|
||||
hardware.
|
||||
|
||||
The multi-threaded server is the default server, also for docker containers. It is selected by
|
||||
leaving the :option:`--workers <odoo-bin --workers>` option out or setting it to ``0``.
|
||||
|
||||
The **multi-processing** server is a full-blown server primarily used for production. It is not
|
||||
liable to the same Python limitation (GIL) on resource usage and hence makes the best use of the
|
||||
hardware. A pool of workers is created upon server startup. New HTTP requests are queued by the OS
|
||||
until there are workers ready to process them. An extra event-driven HTTP worker for the live chat
|
||||
is spawned on an alternative port. Extra cron workers are spawned too. A configurable process
|
||||
reaper monitors resource usage and can kill/restart failed workers.
|
||||
|
||||
The multi-processing server is opt-in. It is selected by setting the :option:`--workers
|
||||
<odoo-bin --workers>` option to a non-null integer.
|
||||
|
||||
.. note::
|
||||
Because it is highly customized for Linux servers, the multi-processing server is not available
|
||||
on Windows.
|
||||
|
||||
Worker number calculation
|
||||
-------------------------
|
||||
|
||||
* Rule of thumb : (#CPU * 2) + 1
|
||||
* Cron workers need CPU
|
||||
* 1 worker ~= 6 concurrent users
|
||||
|
||||
memory size calculation
|
||||
-----------------------
|
||||
|
||||
* We consider 20% of the requests are heavy requests, while 80% are simpler ones
|
||||
* A heavy worker, when all computed field are well designed, SQL requests are well designed, ... is estimated to consume around 1GB of RAM
|
||||
* A lighter worker, in the same scenario, is estimated to consume around 150MB of RAM
|
||||
|
||||
Needed RAM = #worker * ( (light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation) )
|
||||
|
||||
LiveChat
|
||||
--------
|
||||
|
||||
In multi-processing, a dedicated LiveChat worker is automatically started and listens on
|
||||
the :option:`--gevent-port <odoo-bin --gevent-port>`. By default, the HTTP requests will keep
|
||||
accessing the normal HTTP workers instead of the LiveChat one. You must deploy a proxy in front of
|
||||
Odoo and redirect incoming requests whose path starts with ``/websocket/`` to the LiveChat worker.
|
||||
You must also start Odoo in :option:`--proxy-mode <odoo-bin --proxy-mode>` so it uses the real
|
||||
client headers (such as hostname, scheme, and IP) instead of the proxy ones.
|
||||
|
||||
Configuration sample
|
||||
--------------------
|
||||
|
||||
* Server with 4 CPU, 8 Thread
|
||||
* 60 concurrent users
|
||||
|
||||
* 60 users / 6 = 10 <- theoretical number of worker needed
|
||||
* (4 * 2) + 1 = 9 <- theoretical maximal number of worker
|
||||
* We'll use 8 workers + 1 for cron. We'll also use a monitoring system to measure cpu load, and check if it's between 7 and 7.5 .
|
||||
* RAM = 9 * ((0.8*150) + (0.2*1024)) ~= 3Go RAM for Odoo
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>`:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[options]
|
||||
limit_memory_hard = 1677721600
|
||||
limit_memory_soft = 629145600
|
||||
limit_request = 8192
|
||||
limit_time_cpu = 600
|
||||
limit_time_real = 1200
|
||||
max_cron_threads = 1
|
||||
workers = 8
|
||||
|
||||
.. _https_proxy:
|
||||
|
||||
HTTPS
|
||||
=====
|
||||
|
||||
Whether it's accessed via website/web client or web service, Odoo transmits
|
||||
authentication information in cleartext. This means a secure deployment of
|
||||
Odoo must use HTTPS\ [#switching]_. SSL termination can be implemented via
|
||||
just about any SSL termination proxy, but requires the following setup:
|
||||
|
||||
* Enable Odoo's :option:`proxy mode <odoo-bin --proxy-mode>`. This should only be enabled when Odoo is behind a reverse proxy
|
||||
* Set up the SSL termination proxy (`Nginx termination example`_)
|
||||
* Set up the proxying itself (`Nginx proxying example`_)
|
||||
* Your SSL termination proxy should also automatically redirect non-secure
|
||||
connections to the secure port
|
||||
|
||||
Configuration sample
|
||||
--------------------
|
||||
|
||||
* Redirect http requests to https
|
||||
* Proxy requests to odoo
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
proxy_mode = True
|
||||
|
||||
in ``/etc/nginx/sites-enabled/odoo.conf`` set:
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
#odoo server
|
||||
upstream odoo {
|
||||
server 127.0.0.1:8069;
|
||||
}
|
||||
upstream odoochat {
|
||||
server 127.0.0.1:8072;
|
||||
}
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
# http -> https
|
||||
server {
|
||||
listen 80;
|
||||
server_name odoo.mycompany.com;
|
||||
rewrite ^(.*) https://$host$1 permanent;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name odoo.mycompany.com;
|
||||
proxy_read_timeout 720s;
|
||||
proxy_connect_timeout 720s;
|
||||
proxy_send_timeout 720s;
|
||||
|
||||
# SSL parameters
|
||||
ssl_certificate /etc/ssl/nginx/server.crt;
|
||||
ssl_certificate_key /etc/ssl/nginx/server.key;
|
||||
ssl_session_timeout 30m;
|
||||
ssl_protocols TLSv1.2;
|
||||
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
# log
|
||||
access_log /var/log/nginx/odoo.access.log;
|
||||
error_log /var/log/nginx/odoo.error.log;
|
||||
|
||||
# Redirect websocket requests to odoo gevent port
|
||||
location /websocket {
|
||||
proxy_pass http://odoochat;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
proxy_set_header X-Forwarded-Host $http_host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
|
||||
proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8
|
||||
}
|
||||
|
||||
# Redirect requests to odoo backend server
|
||||
location / {
|
||||
# Add Headers for odoo proxy mode
|
||||
proxy_set_header X-Forwarded-Host $http_host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_redirect off;
|
||||
proxy_pass http://odoo;
|
||||
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
|
||||
proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8
|
||||
}
|
||||
|
||||
# common gzip
|
||||
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
|
||||
gzip on;
|
||||
}
|
||||
|
||||
HTTPS Hardening
|
||||
---------------
|
||||
|
||||
Add the `Strict-Transport-Security` header to all requests, in order to prevent
|
||||
browsers from ever sending a plain HTTP request to this domain. You will need
|
||||
to maintain a working HTTPS service with a valid certificate on this domain at
|
||||
all times, otherwise your users will see security alerts or be entirely unable
|
||||
to access it.
|
||||
|
||||
Force HTTPS connections during a year for every visitor in NGINX with the line:
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
|
||||
|
||||
Additional configuration can be defined for the `session_id` cookie. The `Secure`
|
||||
flag can be added to ensure it is never transmitted over HTTP and `SameSite=Lax`
|
||||
to prevent authenticated `CSRF`_.
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
# requires nginx 1.19.8
|
||||
proxy_cookie_flags session_id samesite=lax secure;
|
||||
|
||||
|
||||
Odoo as a WSGI Application
|
||||
==========================
|
||||
|
||||
It is also possible to mount Odoo as a standard WSGI_ application. Odoo
|
||||
provides the base for a WSGI launcher script as ``odoo-wsgi.example.py``. That
|
||||
script should be customized (possibly after copying it from the setup directory) to correctly set the
|
||||
configuration directly in :mod:`odoo.tools.config` rather than through the
|
||||
command-line or a configuration file.
|
||||
|
||||
However the WSGI server will only expose the main HTTP endpoint for the web
|
||||
client, website and webservice API. Because Odoo does not control the creation
|
||||
of workers anymore it can not setup cron or livechat workers
|
||||
|
||||
Cron Workers
|
||||
------------
|
||||
|
||||
Starting one of the built-in Odoo servers next to the WSGI server is required to process cron jobs.
|
||||
That server must be configured to only process crons and not HTTP requests using the
|
||||
:option:`--no-http <odoo-bin --no-http>` cli option or the ``http_enable = False`` configuration
|
||||
file setting.
|
||||
|
||||
On Linux-like systems, using the multi-processing server over the multi-threading one is recommended
|
||||
to benefit from better hardware usage and increased stability, i.e., using
|
||||
the :option:`--workers=-1 <odoo-bin --workers>` and :option:`--max-cron-threads=n
|
||||
<odoo-bin --max-cron-threads>` cli options.
|
||||
|
||||
LiveChat
|
||||
--------
|
||||
|
||||
Using a gevent-compatible WSGI server is required for the correct operation of the live chat
|
||||
feature. That server should be able to handle many simultaneous long-lived connections but doesn't
|
||||
need a lot of processing power. All requests whose path starts with ``/websocket/`` should be
|
||||
directed to that server. A regular (thread/process-based) WSGI server should be used for all other
|
||||
requests.
|
||||
|
||||
The Odoo cron server can also be used to serve the live chat requests. Just drop
|
||||
the :option:`--no-http <odoo-bin --no-http>` cli option from the cron server and make sure requests
|
||||
whose path starts with ``/websocket/`` are directed to this server, either on
|
||||
the :option:`--http-port <odoo-bin --http-port>` (multi-threading server) or on
|
||||
the :option:`--gevent-port <odoo-bin --gevent-port>` (multi-processing server).
|
||||
|
||||
.. _deploy/streaming:
|
||||
|
||||
Serving static files and attachments
|
||||
====================================
|
||||
|
||||
For development convenience, Odoo directly serves all static files and attachments in its modules.
|
||||
This may not be ideal when it comes to performances, and static files should generally be served by
|
||||
a static HTTP server.
|
||||
|
||||
Serving static files
|
||||
--------------------
|
||||
|
||||
Odoo static files are located in each module's :file:`static/` folder, so static files can be served
|
||||
by intercepting all requests to :samp:`/{MODULE}/static/{FILE}`, and looking up the right module
|
||||
(and file) in the various addons paths.
|
||||
|
||||
It is recommended to set the ``Content-Security-Policy: default-src 'none'`` header on all images
|
||||
delivered by the web server. It is not strictly necessary as users cannot modify/inject content
|
||||
inside of modules' :file:`static/` folder and existing images are final (they do not fetch new
|
||||
resources by themselves). However, it is good practice.
|
||||
|
||||
Using the above NGINX (https) configuration, the following ``map`` and ``location`` blocks should be
|
||||
added to serve static files via NGINX.
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
map $sent_http_content_type $content_type_csp {
|
||||
default "";
|
||||
~image/ "default-src 'none'";
|
||||
}
|
||||
|
||||
server {
|
||||
# the rest of the configuration
|
||||
|
||||
location @odoo {
|
||||
# copy-paste the content of the / location block
|
||||
}
|
||||
|
||||
# Serve static files right away
|
||||
location ~ ^/[^/]+/static/.+$ {
|
||||
# root and try_files both depend on your addons paths
|
||||
root ...;
|
||||
try_files ... @odoo;
|
||||
expires 24h;
|
||||
add_header Content-Security-Policy $content_type_csp;
|
||||
}
|
||||
}
|
||||
|
||||
The actual ``root`` and ``try_files`` directives are dependant on your installation, specifically on
|
||||
your :option:`--addons-path <odoo-bin --addons-path>`.
|
||||
|
||||
.. example::
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Debian package
|
||||
|
||||
Say Odoo has been installed via the **debian packages** for Community and Enterprise, and
|
||||
that the :option:`--addons-path <odoo-bin --addons-path>` is
|
||||
``'/usr/lib/python3/dist-packages/odoo/addons'``.
|
||||
|
||||
The ``root`` and ``try_files`` should be:
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
root /usr/lib/python3/dist-packages/odoo/addons;
|
||||
try_files $uri @odoo;
|
||||
|
||||
.. group-tab:: Git sources
|
||||
|
||||
Say Odoo has been installed via the **sources**, that both the Community and Enterprise git
|
||||
repositories were cloned in :file:`/opt/odoo/community` and :file:`/opt/odoo/enterprise`
|
||||
respectively, and that the :option:`--addons-path <odoo-bin --addons-path>` is
|
||||
``'/opt/odoo/community/odoo/addons,/opt/odoo/community/addons,/opt/odoo/enterprise'``.
|
||||
|
||||
The ``root`` and ``try_files`` should be:
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
root /opt/odoo;
|
||||
try_files /community/odoo/addons$uri /community/addons$uri /enterprise$uri @odoo;
|
||||
|
||||
Serving attachments
|
||||
-------------------
|
||||
|
||||
Attachments are files stored in the filestore which access is regulated by Odoo. They cannot be
|
||||
directly accessed via a static web server as accessing them requires multiple lookups in the
|
||||
database to determine where the files are stored and whether the current user can access them or
|
||||
not.
|
||||
|
||||
Nevertheless, once the file has been located and the access rights verified by Odoo, it is a good
|
||||
idea to serve the file using the static web server instead of Odoo. For Odoo to delegate serving
|
||||
files to the static web server, the `X-Sendfile <https://tn123.org/mod_xsendfile/>`_ (apache) or
|
||||
`X-Accel <https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/>`_ (nginx) extensions
|
||||
must be enabled and configured on the static web server. Once it is set up, start Odoo with the
|
||||
:option:`--x-sendfile <odoo-bin --x-sendfile>` CLI flag (this unique flag is used for both
|
||||
X-Sendfile and X-Accel).
|
||||
|
||||
|
||||
.. note::
|
||||
- The X-Sendfile extension for apache (and compatible web servers) does not require any
|
||||
supplementary configuration.
|
||||
- The X-Accel extension for NGINX **does** require the following additionnal configuration:
|
||||
|
||||
.. code-block:: nginx
|
||||
|
||||
location /web/filestore {
|
||||
internal;
|
||||
alias /path/to/odoo/data-dir/filestore;
|
||||
}
|
||||
|
||||
In case you don't know what is the path to your filestore, start Odoo with the
|
||||
:option:`--x-sendfile <odoo-bin --x-sendfile>` option and navigate to the ``/web/filestore`` URL
|
||||
directly via Odoo (don't navigate to the URL via NGINX). This logs a warnings, the message
|
||||
contains the configuration you need.
|
||||
|
||||
|
||||
.. _security:
|
||||
|
||||
Security
|
||||
========
|
||||
|
||||
For starters, keep in mind that securing an information system is a continuous process,
|
||||
not a one-shot operation. At any moment, you will only be as secure as the weakest link
|
||||
in your environment.
|
||||
|
||||
So please do not take this section as the ultimate list of measures that will prevent
|
||||
all security problems. It's only intended as a summary of the first important things
|
||||
you should be sure to include in your security action plan. The rest will come
|
||||
from best security practices for your operating system and distribution,
|
||||
best practices in terms of users, passwords, and access control management, etc.
|
||||
|
||||
When deploying an internet-facing server, please be sure to consider the following
|
||||
security-related topics:
|
||||
|
||||
- Always set a strong super-admin admin password, and restrict access to the database
|
||||
management pages as soon as the system is set up. See :ref:`db_manager_security`.
|
||||
|
||||
- Choose unique logins and strong passwords for all administrator accounts on all databases.
|
||||
Do not use 'admin' as the login. Do not use those logins for day-to-day operations,
|
||||
only for controlling/managing the installation.
|
||||
*Never* use any default passwords like admin/admin, even for test/staging databases.
|
||||
|
||||
- Do **not** install demo data on internet-facing servers. Databases with demo data contain
|
||||
default logins and passwords that can be used to get into your systems and cause significant
|
||||
trouble, even on staging/dev systems.
|
||||
|
||||
- Use appropriate database filters ( :option:`--db-filter <odoo-bin --db-filter>`)
|
||||
to restrict the visibility of your databases according to the hostname.
|
||||
See :ref:`dbfilter`.
|
||||
You may also use :option:`-d <odoo-bin -d>` to provide your own (comma-separated)
|
||||
list of available databases to filter from, instead of letting the system fetch
|
||||
them all from the database backend.
|
||||
|
||||
- Once your ``db_name`` and ``dbfilter`` are configured and only match a single database
|
||||
per hostname, you should set ``list_db`` configuration option to ``False``, to prevent
|
||||
listing databases entirely, and to block access to the database management screens
|
||||
(this is also exposed as the :option:`--no-database-list <odoo-bin --no-database-list>`
|
||||
command-line option)
|
||||
|
||||
- Make sure the PostgreSQL user (:option:`--db_user <odoo-bin --db_user>`) is *not* a super-user,
|
||||
and that your databases are owned by a different user. For example they could be owned by
|
||||
the ``postgres`` super-user if you are using a dedicated non-privileged ``db_user``.
|
||||
See also :ref:`setup/deploy/odoo`.
|
||||
|
||||
- Keep installations updated by regularly installing the latest builds,
|
||||
either via GitHub or by downloading the latest version from
|
||||
https://www.odoo.com/page/download or http://nightly.odoo.com
|
||||
|
||||
- Configure your server in multi-process mode with proper limits matching your typical
|
||||
usage (memory/CPU/timeouts). See also :ref:`builtin_server`.
|
||||
|
||||
- Run Odoo behind a web server providing HTTPS termination with a valid SSL certificate,
|
||||
in order to prevent eavesdropping on cleartext communications. SSL certificates are
|
||||
cheap, and many free options exist.
|
||||
Configure the web proxy to limit the size of requests, set appropriate timeouts,
|
||||
and then enable the :option:`proxy mode <odoo-bin --proxy-mode>` option.
|
||||
See also :ref:`https_proxy`.
|
||||
|
||||
- If you need to allow remote SSH access to your servers, make sure to set a strong password
|
||||
for **all** accounts, not just `root`. It is strongly recommended to entirely disable
|
||||
password-based authentication, and only allow public key authentication. Also consider
|
||||
restricting access via a VPN, allowing only trusted IPs in the firewall, and/or
|
||||
running a brute-force detection system such as `fail2ban` or equivalent.
|
||||
|
||||
- Consider installing appropriate rate-limiting on your proxy or firewall, to prevent
|
||||
brute-force attacks and denial of service attacks. See also :ref:`login_brute_force`
|
||||
for specific measures.
|
||||
|
||||
Many network providers provide automatic mitigation for Distributed Denial of
|
||||
Service attacks (DDOS), but this is often an optional service, so you should consult
|
||||
with them.
|
||||
|
||||
- Whenever possible, host your public-facing demo/test/staging instances on different
|
||||
machines than the production ones. And apply the same security precautions as for
|
||||
production.
|
||||
|
||||
- If your public-facing Odoo server has access to sensitive internal network resources
|
||||
or services (e.g. via a private VLAN), implement appropriate firewall rules to
|
||||
protect those internal resources. This will ensure that the Odoo server cannot
|
||||
be used accidentally (or as a result of malicious user actions) to access or disrupt
|
||||
those internal resources.
|
||||
Typically this can be done by applying an outbound default DENY rule on the firewall,
|
||||
then only explicitly authorizing access to internal resources that the Odoo server
|
||||
needs to access.
|
||||
`Systemd IP traffic access control <http://0pointer.net/blog/ip-accounting-and-access-lists-with-systemd.html>`_
|
||||
may also be useful to implement per-process network access control.
|
||||
|
||||
- If your public-facing Odoo server is behind a Web Application Firewall, a load-balancer,
|
||||
a transparent DDoS protection service (like CloudFlare) or a similar network-level
|
||||
device, you may wish to avoid direct access to the Odoo system. It is generally
|
||||
difficult to keep the endpoint IP addresses of your Odoo servers secret. For example
|
||||
they can appear in web server logs when querying public systems, or in the headers
|
||||
of emails posted from Odoo.
|
||||
In such a situation you may want to configure your firewall so that the endpoints
|
||||
are not accessible publicly except from the specific IP addresses of your WAF,
|
||||
load-balancer or proxy service. Service providers like CloudFlare usually maintain
|
||||
a public list of their IP address ranges for this purpose.
|
||||
|
||||
- If you are hosting multiple customers, isolate customer data and files from each other
|
||||
using containers or appropriate "jail" techniques.
|
||||
|
||||
- Setup daily backups of your databases and filestore data, and copy them to a remote
|
||||
archiving server that is not accessible from the server itself.
|
||||
|
||||
- Deploying Odoo on Linux is strongly recommended over Windows. Should you choose nevertheless
|
||||
to deploy on a Windows platform, a thorough security hardening review of the server should be
|
||||
conducted and is outside of the scope of this guide.
|
||||
|
||||
|
||||
.. _login_brute_force:
|
||||
|
||||
Blocking Brute Force Attacks
|
||||
----------------------------
|
||||
|
||||
For internet-facing deployments, brute force attacks on user passwords are very common, and this
|
||||
threat should not be neglected for Odoo servers. Odoo emits a log entry whenever a login attempt
|
||||
is performed, and reports the result: success or failure, along with the target login and source IP.
|
||||
|
||||
The log entries will have the following form.
|
||||
|
||||
Failed login::
|
||||
|
||||
2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login failed for db:db_name login:admin from 127.0.0.1
|
||||
|
||||
Successful login::
|
||||
|
||||
2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login successful for db:db_name login:admin from 127.0.0.1
|
||||
|
||||
|
||||
These logs can be easily analyzed by an intrusion prevention system such as `fail2ban`.
|
||||
|
||||
For example, the following fail2ban filter definition should match a
|
||||
failed login::
|
||||
|
||||
[Definition]
|
||||
failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from <HOST>
|
||||
ignoreregex =
|
||||
|
||||
This could be used with a jail definition to block the attacking IP on HTTP(S).
|
||||
|
||||
Here is what it could look like for blocking the IP for 15 minutes when
|
||||
10 failed login attempts are detected from the same IP within 1 minute::
|
||||
|
||||
[odoo-login]
|
||||
enabled = true
|
||||
port = http,https
|
||||
bantime = 900 ; 15 min ban
|
||||
maxretry = 10 ; if 10 attempts
|
||||
findtime = 60 ; within 1 min /!\ Should be adjusted with the TZ offset
|
||||
logpath = /var/log/odoo.log ; set the actual odoo log path here
|
||||
|
||||
.. _db_manager_security:
|
||||
|
||||
Database Manager Security
|
||||
-------------------------
|
||||
|
||||
:ref:`setup/deploy/odoo` mentioned ``admin_passwd`` in passing.
|
||||
|
||||
This setting is used on all database management screens (to create, delete,
|
||||
dump or restore databases).
|
||||
|
||||
If the management screens must not be accessible at all, you should set ``list_db``
|
||||
configuration option to ``False``, to block access to all the database selection and
|
||||
management screens.
|
||||
|
||||
.. warning::
|
||||
|
||||
It is strongly recommended to disable the Database Manager for any internet-facing
|
||||
system! It is meant as a development/demo tool, to make it easy to quickly create
|
||||
and manage databases. It is not designed for use in production, and may even expose
|
||||
dangerous features to attackers. It is also not designed to handle large databases,
|
||||
and may trigger memory limits.
|
||||
|
||||
On production systems, database management operations should always be performed by
|
||||
the system administrator, including provisioning of new databases and automated backups.
|
||||
|
||||
Be sure to setup an appropriate ``db_name`` parameter
|
||||
(and optionally, ``dbfilter`` too) so that the system can determine the target database
|
||||
for each request, otherwise users will be blocked as they won't be allowed to choose the
|
||||
database themselves.
|
||||
|
||||
If the management screens must only be accessible from a selected set of machines,
|
||||
use the proxy server's features to block access to all routes starting with ``/web/database``
|
||||
except (maybe) ``/web/database/selector`` which displays the database-selection screen.
|
||||
|
||||
If the database-management screen should be left accessible, the
|
||||
``admin_passwd`` setting must be changed from its ``admin`` default: this
|
||||
password is checked before allowing database-alteration operations.
|
||||
|
||||
It should be stored securely, and should be generated randomly e.g.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 -c 'import base64, os; print(base64.b64encode(os.urandom(24)))'
|
||||
|
||||
which generates a 32-character pseudorandom printable string.
|
||||
|
||||
Reset the master password
|
||||
-------------------------
|
||||
|
||||
There may be instances where the master password is misplaced, or compromised, and needs to be
|
||||
reset. The following process is for system administrators of an Odoo on-premise database detailing
|
||||
how to manually reset and re-encrypt the master password.
|
||||
|
||||
.. seealso::
|
||||
For more information about changing an Odoo.com account password, see this documentation:
|
||||
:ref:`odoocom/change_password`.
|
||||
|
||||
When creating a new on-premise database, a random master password is generated. Odoo recommends
|
||||
using this password to secure the database. This password is implemented by default, so there is a
|
||||
secure master password for any Odoo on-premise deployment.
|
||||
|
||||
.. warning::
|
||||
When creating an Odoo on-premise database the installation is accessible to anyone on the
|
||||
internet, until this password is set to secure the database.
|
||||
|
||||
The master password is specified in the Odoo configuration file (`odoo.conf` or `odoorc` (hidden
|
||||
file)). The Odoo master password is needed to modify, create, or delete a database through the
|
||||
graphical user interface (GUI).
|
||||
|
||||
Locate configuration file
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
First, open the Odoo configuration file (`odoo.conf` or `odoorc` (hidden file)).
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Windows
|
||||
|
||||
The configuration file is located at: `c:\\ProgramFiles\\Odoo{VERSION}\\server\\odoo.conf`
|
||||
|
||||
.. tab:: Linux
|
||||
|
||||
Depending on how Odoo is installed on the Linux machine, the configuration file is located in
|
||||
one of two different places:
|
||||
|
||||
- Package installation: `/etc/odoo.conf`
|
||||
- Source installation: `~/.odoorc`
|
||||
|
||||
Change old password
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Once the appropriate file has been opened, proceed to modify the old password in the configuration
|
||||
file to a temporary password.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Graphical user interface
|
||||
|
||||
After locating the configuration file, open it using a (:abbr:`GUI (graphical user
|
||||
interface)`). This can be achieved by simply double clicking on the file. Then, the device
|
||||
should have a default :abbr:`GUI (graphical user interface)` to open the file with.
|
||||
|
||||
Next, modify the master password line `admin_passwd = $pbkdf2-sha…` to `admin_passwd =
|
||||
newpassword1234`, for example. This password can be anything, as long as it is saved
|
||||
temporarily. Make sure to modify all characters after the `=`.
|
||||
|
||||
.. example::
|
||||
The line appears like this:
|
||||
`admin_passwd =
|
||||
$pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m`
|
||||
|
||||
The modified line appears like this: `admin_passwd = newpassword1234`
|
||||
|
||||
.. group-tab:: Command-line interface
|
||||
|
||||
Modify the master password line using the following Unix command detailed below.
|
||||
|
||||
Connect to the Odoo server's terminal via Secure Shell (SSH) protocol, and edit the
|
||||
configuration file. To modify the configuration file, enter the following command:
|
||||
:command:`sudo nano /etc/odoo.conf`
|
||||
|
||||
After opening the configuration file, modify the master password line `admin_passwd =
|
||||
$pbkdf2-sha…` to `admin_passwd = newpassword1234`. This password can be anything, as long as
|
||||
it is saved temporarily. Make sure to modify all characters after the `=`.
|
||||
|
||||
.. example::
|
||||
The line appears like this:
|
||||
`admin_passwd =
|
||||
$pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m`
|
||||
|
||||
The modified line appears like this: `admin_passwd = newpassword1234`
|
||||
|
||||
.. important::
|
||||
It is essential that the password is changed to something else, rather than triggering a new
|
||||
password reset by adding a semicolon `;` at the beginning of the line. This ensures the database
|
||||
is secure throughout the entire password reset process.
|
||||
|
||||
Restart Odoo server
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
After setting the temporary password, a restart of the Odoo server is **required**.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Graphical user interface
|
||||
|
||||
To restart the Odoo server, first, type `services` into the Windows :guilabel:`Search` bar.
|
||||
Then, select the :guilabel:`Services` application, and scroll down to the :guilabel:`Odoo`
|
||||
service.
|
||||
|
||||
Next, right click on :guilabel:`Odoo`, and select :guilabel:`Start` or :guilabel:`Restart`.
|
||||
This action manually restarts the Odoo server.
|
||||
|
||||
.. group-tab:: Command-line interface
|
||||
|
||||
Restart the Odoo server by typing the command: :command:`sudo service odoo15 restart`
|
||||
|
||||
.. note::
|
||||
Change the number after `odoo` to fit the specific version the server is running on.
|
||||
|
||||
Use web interface to re-encrypt password
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
First, navigate to `/web/database/manager` or `http://server_ip:port/web/database/manager` in a
|
||||
browser.
|
||||
|
||||
.. note::
|
||||
Replace `server_ip` with the IP address of the database. Replace `port` with the numbered port
|
||||
the database is accessible from.
|
||||
|
||||
Next, click :guilabel:`Set Master Password`, and type in the previously-selected temporary password
|
||||
into the :guilabel:`Master Password` field. Following this step, type in a :guilabel:`New Master
|
||||
Password`. The :guilabel:`New Master Password` is hashed (or encrypted), once the
|
||||
:guilabel:`Continue` button is clicked.
|
||||
|
||||
At this point, the password has been successfully reset, and a hashed version of the new password
|
||||
now appears in the configuration file.
|
||||
|
||||
.. seealso::
|
||||
For more information on Odoo database security, see this documentation:
|
||||
:ref:`db_manager_security`.
|
||||
|
||||
Supported Browsers
|
||||
==================
|
||||
|
||||
Odoo supports all the major desktop and mobile browsers available on the market,
|
||||
as long as they are supported by their publishers.
|
||||
|
||||
Here are the supported browsers:
|
||||
|
||||
- Google Chrome
|
||||
- Mozilla Firefox
|
||||
- Microsoft Edge
|
||||
- Apple Safari
|
||||
|
||||
.. warning:: Please make sure your browser is up-to-date and still supported by
|
||||
its publisher before filing a bug report.
|
||||
|
||||
.. note::
|
||||
|
||||
Since Odoo 13.0, ES6 is supported. Therefore, IE support is dropped.
|
||||
|
||||
.. [#different-machines]
|
||||
to have multiple Odoo installations use the same PostgreSQL database,
|
||||
or to provide more computing resources to both software.
|
||||
.. [#remote-socket]
|
||||
technically a tool like socat_ can be used to proxy UNIX sockets across
|
||||
networks, but that is mostly for software which can only be used over
|
||||
UNIX sockets
|
||||
.. [#switching]
|
||||
or be accessible only over an internal packet-switched network, but that
|
||||
requires secured switches, protections against `ARP spoofing`_ and
|
||||
precludes usage of WiFi. Even over secure packet-switched networks,
|
||||
deployment over HTTPS is recommended, and possible costs are lowered as
|
||||
"self-signed" certificates are easier to deploy on a controlled
|
||||
environment than over the internet.
|
||||
|
||||
.. _regular expression: https://docs.python.org/3/library/re.html
|
||||
.. _CSRF: https://en.wikipedia.org/wiki/Cross-site_request_forgery
|
||||
.. _ARP spoofing: https://en.wikipedia.org/wiki/ARP_spoofing
|
||||
.. _Nginx termination example:
|
||||
https://nginx.com/resources/admin-guide/nginx-ssl-termination/
|
||||
.. _Nginx proxying example:
|
||||
https://nginx.com/resources/admin-guide/reverse-proxy/
|
||||
.. _socat: http://www.dest-unreach.org/socat/
|
||||
.. _PostgreSQL connection settings:
|
||||
.. _listen to network interfaces:
|
||||
https://www.postgresql.org/docs/12/static/runtime-config-connection.html
|
||||
.. _use an SSH tunnel:
|
||||
https://www.postgresql.org/docs/12/static/ssh-tunnels.html
|
||||
.. _WSGI: https://wsgi.readthedocs.org/
|
||||
.. _POSBox: https://www.odoo.com/page/point-of-sale-hardware#part_2
|
@ -1,63 +0,0 @@
|
||||
======
|
||||
Geo IP
|
||||
======
|
||||
|
||||
.. note::
|
||||
This documentation only applies to On-premise databases.
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
#. Download both the GeoLite2 City and Country
|
||||
`databases <https://dev.maxmind.com/geoip/geoip2/geolite2/>`_. You should end up with two files
|
||||
called :file:`GeoLite2-City.mmdb` and :file:`GeoLite2-Country.mmdb`.
|
||||
|
||||
#. Move the files to the folder :file:`/usr/share/GeoIP/`.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
mv ~/Downloads/GeoLite2-City.mmdb /usr/share/GeoIP/
|
||||
mv ~/Downloads/GeoLite2-Country.mmdb /usr/share/GeoIP/
|
||||
|
||||
#. Restart the server
|
||||
|
||||
.. note::
|
||||
If you don't want to locate the geoip database in :file:`/usr/share/GeoIP/`, use the
|
||||
:option:`--geoip-city-db <odoo-bin --geoip-city-db>` and
|
||||
:option:`--geoip-country-db <odoo-bin --geoip-country-db>` options of the Odoo command line
|
||||
interface. These options take the absolute path to the GeoIP database file and use it as the
|
||||
GeoIP database. For example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
./odoo-bin --geoip-city-db= ~/Downloads/GeoLite2-City.mmdb
|
||||
|
||||
.. seealso::
|
||||
- :doc:`CLI documentation </developer/reference/cli>`.
|
||||
|
||||
Test GeoIP geolocation in your Odoo website
|
||||
===========================================
|
||||
|
||||
Edit a web page to include some geo-ip information such as the country name of the current
|
||||
request IP address. To do so:
|
||||
|
||||
#. Go to your website. Open the web page that you want to test ``GeoIP``.
|
||||
#. Choose :menuselection:`Customize --> HTML/CSS/JS Editor`.
|
||||
#. Add the following piece of XML in the page :
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<h1 class="text-center" t-esc="request.geoip.country.name or 'geoip failure'"/>
|
||||
|
||||
#. Save and refresh the page.
|
||||
|
||||
Geo-ip is working if you read your country name displayed in bold in the middle of the page.
|
||||
|
||||
In case you read "**geoip failure**" instead then the geolocalization failed. The common causes are:
|
||||
|
||||
#. The browsing IP address is the localhost (``127.0.0.1``) or a local area network one. If you
|
||||
don't know, you can access your website using mobile data.
|
||||
#. You are using a reverse-proxy (apache, nginx) in front of Odoo but didn't start Odoo with the
|
||||
proxy-mode enabled. See :option:`proxy mode <odoo-bin --proxy-mode>`.
|
||||
#. The GeoIP database is corrupt, missing or unaccessible. In such case a warning was logged in the
|
||||
server logs.
|
@ -1,167 +0,0 @@
|
||||
===================
|
||||
Packaged installers
|
||||
===================
|
||||
|
||||
Odoo provides packaged installers for Debian-based Linux distributions (Debian, Ubuntu, etc.),
|
||||
RPM-based Linux distributions (Fedora, CentOS, RHEL, etc.), and Windows for the Community and
|
||||
Enterprise editions.
|
||||
|
||||
Official **Community** nightly packages with all relevant dependency requirements are available on
|
||||
the `nightly server <https://nightly.odoo.com>`_.
|
||||
|
||||
.. note::
|
||||
Nightly packages may be difficult to keep up to date.
|
||||
|
||||
Official **Community** and **Enterprise** packages can be downloaded from the `Odoo download page
|
||||
<https://www.odoo.com/page/download>`_.
|
||||
|
||||
.. note::
|
||||
It is required to be logged in as a paying on-premise customer or partner to download the
|
||||
Enterprise packages.
|
||||
|
||||
.. _install/packages/linux:
|
||||
|
||||
Linux
|
||||
=====
|
||||
|
||||
Prepare
|
||||
-------
|
||||
|
||||
Odoo needs a `PostgreSQL <https://www.postgresql.org/>`_ server to run properly.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Debian/Ubuntu
|
||||
|
||||
The default configuration for the Odoo 'deb' package is to use the PostgreSQL server on the
|
||||
same host as the Odoo instance. Execute the following command to install the PostgreSQL
|
||||
server:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo apt install postgresql -y
|
||||
|
||||
.. group-tab:: Fedora
|
||||
|
||||
Make sure that the `sudo` command is available and well configured and, only then, execute the
|
||||
following command to install the PostgreSQL server:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo dnf install -y postgresql-server
|
||||
$ sudo postgresql-setup --initdb --unit postgresql
|
||||
$ sudo systemctl enable postgresql
|
||||
$ sudo systemctl start postgresql
|
||||
|
||||
.. warning::
|
||||
`wkhtmltopdf` is not installed through **pip** and must be installed manually in `version 0.12.6
|
||||
<https://github.com/wkhtmltopdf/packaging/releases/tag/0.12.6.1-3>`_ for it to support headers
|
||||
and footers. Check out the `wkhtmltopdf wiki <https://github.com/odoo/odoo/wiki/Wkhtmltopdf>`_
|
||||
for more details on the various versions.
|
||||
|
||||
Repository
|
||||
----------
|
||||
|
||||
Odoo S.A. provides a repository that can be used to install the **Community** edition by executing
|
||||
the following commands:
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Debian/Ubuntu
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg
|
||||
$ echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/{CURRENT_MAJOR_BRANCH}/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list
|
||||
$ sudo apt-get update && sudo apt-get install odoo
|
||||
|
||||
Use the usual `apt-get upgrade` command to keep the installation up-to-date.
|
||||
|
||||
.. group-tab:: Fedora
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo dnf config-manager --add-repo=https://nightly.odoo.com/{CURRENT_MAJOR_BRANCH}/nightly/rpm/odoo.repo
|
||||
$ sudo dnf install -y odoo
|
||||
$ sudo systemctl enable odoo
|
||||
$ sudo systemctl start odoo
|
||||
|
||||
.. note::
|
||||
Currently, there is no nightly repository for the Enterprise edition.
|
||||
|
||||
Distribution package
|
||||
--------------------
|
||||
|
||||
Instead of using the repository, packages for both the **Community** and **Enterprise** editions can
|
||||
be downloaded from the `Odoo download page <https://www.odoo.com/page/download>`_.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Debian/Ubuntu
|
||||
|
||||
.. note::
|
||||
Odoo {CURRENT_MAJOR_VERSION} 'deb' package currently supports `Debian Buster
|
||||
<https://www.debian.org/releases/buster/>`_ and `Ubuntu 18.04
|
||||
<https://releases.ubuntu.com/18.04>`_ or above.
|
||||
|
||||
Once downloaded, execute the following commands **as root** to install Odoo as a service,
|
||||
create the necessary PostgreSQL user, and automatically start the server:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# dpkg -i <path_to_installation_package> # this probably fails with missing dependencies
|
||||
# apt-get install -f # should install the missing dependencies
|
||||
# dpkg -i <path_to_installation_package>
|
||||
|
||||
.. warning::
|
||||
- The `python3-xlwt` Debian package, needed to export into the XLS format, does not exist
|
||||
in Debian Buster nor Ubuntu 18.04. If needed, install it manually with the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo pip3 install xlwt
|
||||
|
||||
- The `num2words` Python package - needed to render textual amounts - does not exist in
|
||||
Debian Buster nor Ubuntu 18.04, which could cause problems with the `l10n_mx_edi` module.
|
||||
If needed, install it manually with the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo pip3 install num2words
|
||||
|
||||
.. group-tab:: Fedora
|
||||
|
||||
.. note::
|
||||
Odoo {CURRENT_MAJOR_VERSION} 'rpm' package supports Fedora 38.
|
||||
|
||||
Once downloaded, the package can be installed using the 'dnf' package manager:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo dnf localinstall odoo_{CURRENT_MAJOR_BRANCH}.latest.noarch.rpm
|
||||
$ sudo systemctl enable odoo
|
||||
$ sudo systemctl start odoo
|
||||
|
||||
.. _install/packages/windows:
|
||||
|
||||
Windows
|
||||
=======
|
||||
|
||||
.. warning::
|
||||
Windows packaging is offered for the convenience of testing or running single-user local
|
||||
instances but production deployment is discouraged due to a number of limitations and risks
|
||||
associated with deploying Odoo on a Windows platform.
|
||||
|
||||
#. Download the installer from the `nightly server <https://nightly.odoo.com>`_ (Community only) or
|
||||
the Windows installer from the `Odoo download page <https://www.odoo.com/page/download>`_ (any
|
||||
edition.
|
||||
#. Execute the downloaded file.
|
||||
|
||||
.. warning::
|
||||
On Windows 8 and later, a warning titled *Windows protected your PC* may be displayed. Click
|
||||
**More Info** and then **Run anyway** to proceed.
|
||||
|
||||
#. Accept the `UAC <https://en.wikipedia.org/wiki/User_Account_Control>`_ prompt.
|
||||
#. Go through the installation steps.
|
||||
|
||||
Odoo launches automatically at the end of the installation.
|
@ -1,491 +0,0 @@
|
||||
==============
|
||||
Source install
|
||||
==============
|
||||
|
||||
The source 'installation' is not about installing Odoo but running it directly from the source
|
||||
instead.
|
||||
|
||||
Using the Odoo source can be more convenient for module developers as it is more easily accessible
|
||||
than using packaged installers.
|
||||
|
||||
It makes starting and stopping Odoo more flexible and explicit than the services set up by the
|
||||
packaged installers. Also, it allows overriding settings using :ref:`command-line parameters
|
||||
<reference/cmdline>` without needing to edit a configuration file.
|
||||
|
||||
Finally, it provides greater control over the system's setup and allows to more easily keep (and
|
||||
run) multiple versions of Odoo side-by-side.
|
||||
|
||||
Fetch the sources
|
||||
-----------------
|
||||
|
||||
There are two ways to obtain the source code of Odoo: as a ZIP **archive** or through **Git**.
|
||||
|
||||
Archive
|
||||
~~~~~~~
|
||||
|
||||
Community edition:
|
||||
|
||||
- `Odoo download page <https://www.odoo.com/page/download>`_
|
||||
- `GitHub Community repository <https://github.com/odoo/odoo>`_
|
||||
- `Nightly server <https://nightly.odoo.com>`_
|
||||
|
||||
Enterprise edition:
|
||||
|
||||
- `Odoo download page <https://www.odoo.com/page/download>`_
|
||||
- `GitHub Enterprise repository <https://github.com/odoo/enterprise>`_
|
||||
|
||||
.. _install/source/git:
|
||||
|
||||
Git
|
||||
~~~
|
||||
|
||||
.. note::
|
||||
It is required to have `Git <https://git-scm.com/>`_ installed, and it is recommended to have a
|
||||
basic knowledge of Git commands to proceed.
|
||||
|
||||
To clone a Git repository, choose between cloning with HTTPS or SSH. In most cases, the best option
|
||||
is HTTPS. However, choose SSH to contribute to Odoo source code or when following the :doc:`Getting
|
||||
Started developer tutorial </developer/tutorials/server_framework_101>`.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Clone with HTTPS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone https://github.com/odoo/odoo.git
|
||||
$ git clone https://github.com/odoo/enterprise.git
|
||||
|
||||
.. tab:: Clone with SSH
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone git@github.com:odoo/odoo.git
|
||||
$ git clone git@github.com:odoo/enterprise.git
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Clone with HTTPS
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> git clone https://github.com/odoo/odoo.git
|
||||
C:\> git clone https://github.com/odoo/enterprise.git
|
||||
|
||||
.. tab:: Clone with SSH
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> git clone git@github.com:odoo/odoo.git
|
||||
C:\> git clone git@github.com:odoo/enterprise.git
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Clone with HTTPS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone https://github.com/odoo/odoo.git
|
||||
$ git clone https://github.com/odoo/enterprise.git
|
||||
|
||||
.. tab:: Clone with SSH
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone git@github.com:odoo/odoo.git
|
||||
$ git clone git@github.com:odoo/enterprise.git
|
||||
|
||||
.. note::
|
||||
**The Enterprise git repository does not contain the full Odoo source code**. It is only a
|
||||
collection of extra add-ons. The main server code is in the Community edition. Running the
|
||||
Enterprise version means running the server from the Community version with the `addons-path`
|
||||
option set to the folder with the Enterprise edition. It is required to clone both the Community
|
||||
and Enterprise repositories to have a working Odoo Enterprise installation.
|
||||
|
||||
.. _install/source/prepare:
|
||||
|
||||
Prepare
|
||||
-------
|
||||
|
||||
Python
|
||||
~~~~~~
|
||||
|
||||
Odoo requires **Python 3.10** or later to run.
|
||||
|
||||
.. versionchanged:: 17
|
||||
Minimum requirement updated from Python 3.7 to Python 3.10.
|
||||
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
Use a package manager to download and install Python 3 if needed.
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
`Download the latest version of Python 3 <https://www.python.org/downloads/windows/>`_ and
|
||||
install it.
|
||||
|
||||
During installation, check **Add Python 3 to PATH**, then click **Customize Installation** and
|
||||
make sure that **pip** is checked.
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
Use a package manager (`Homebrew <https://brew.sh/>`_, `MacPorts <https://www.macports.org>`_)
|
||||
to download and install Python 3 if needed.
|
||||
|
||||
.. note::
|
||||
If Python 3 is already installed, make sure that the version is 3.10 or above, as previous
|
||||
versions are not compatible with Odoo.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 --version
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> python --version
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 --version
|
||||
|
||||
Verify that `pip <https://pip.pypa.io>`_ is also installed for this version.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip3 --version
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> pip --version
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip3 --version
|
||||
|
||||
PostgreSQL
|
||||
~~~~~~~~~~
|
||||
|
||||
Odoo uses PostgreSQL as its database management system.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
Use a package manager to download and install PostgreSQL (supported versions: 12.0 or above).
|
||||
It can be achieved by executing the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo apt install postgresql postgresql-client
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
`Download PostgreSQL <https://www.postgresql.org/download/windows>`_ (supported versions: 12.0
|
||||
or above) and install it.
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
Use `Postgres.app <https://postgresapp.com>`_ to download and install PostgreSQL (supported
|
||||
version: 12.0 or above).
|
||||
|
||||
.. tip::
|
||||
To make the command line tools bundled with Postgres.app available, make sure to set up the
|
||||
`$PATH` variable by following the `Postgres.app CLI tools instructions
|
||||
<https://postgresapp.com/documentation/cli-tools.html>`_.
|
||||
|
||||
By default, the only user is `postgres`. As Odoo forbids connecting as `postgres`, create a new
|
||||
PostgreSQL user.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo -u postgres createuser -d -R -S $USER
|
||||
$ createdb $USER
|
||||
|
||||
.. note::
|
||||
Because the PostgreSQL user has the same name as the Unix login, it is possible to connect
|
||||
to the database without a password.
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
#. Add PostgreSQL's `bin` directory (by default:
|
||||
:file:`C:\\Program Files\\PostgreSQL\\<version>\\bin`) to the `PATH`.
|
||||
#. Create a postgres user with a password using the pg admin gui:
|
||||
|
||||
#. Open **pgAdmin**.
|
||||
#. Double-click the server to create a connection.
|
||||
#. Select :menuselection:`Object --> Create --> Login/Group Role`.
|
||||
#. Enter the username in the **Role Name** field (e.g., `odoo`).
|
||||
#. Open the **Definition** tab, enter a password (e.g., `odoo`), and click **Save**.
|
||||
#. Open the **Privileges** tab and switch **Can login?** to `Yes` and **Create database?**
|
||||
to `Yes`.
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo -u postgres createuser -d -R -S $USER
|
||||
$ createdb $USER
|
||||
|
||||
.. note::
|
||||
Because the PostgreSQL user has the same name as the Unix login, it is possible to connect
|
||||
to the database without a password.
|
||||
|
||||
.. _install/dependencies:
|
||||
|
||||
Dependencies
|
||||
~~~~~~~~~~~~
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
Using **distribution packages** is the preferred way of installing dependencies.
|
||||
Alternatively, install the Python dependencies with **pip**.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Debian/Ubuntu
|
||||
|
||||
On Debian/Ubuntu, the following commands should install the required packages:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ cd odoo #CommunityPath
|
||||
$ sudo ./setup/debinstall.sh
|
||||
|
||||
The `setup/debinstall.sh` script will parse the `debian/control
|
||||
<{GITHUB_PATH}/debian/control>`_ file and install the found packages.
|
||||
|
||||
.. tab:: Install with pip
|
||||
|
||||
.. warning::
|
||||
Using pip may lead to security issues and broken dependencies; only do this if you
|
||||
know what you are doing.
|
||||
|
||||
As some of the Python packages need a compilation step, they require system libraries to
|
||||
be installed.
|
||||
|
||||
On Debian/Ubuntu, the following command should install these required libraries:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo apt install python3-pip libldap2-dev libpq-dev libsasl2-dev
|
||||
|
||||
Odoo dependencies are listed in the :file:`requirements.txt` file located at the root of
|
||||
the Odoo Community directory.
|
||||
|
||||
.. note::
|
||||
The Python packages in :file:`requirements.txt` are based on their stable/LTS
|
||||
Debian/Ubuntu corresponding version at the moment of the Odoo release. For example,
|
||||
for Odoo 15.0, the `python3-babel` package version is 2.8.0 in Debian Bullseye and
|
||||
2.6.0 in Ubuntu Focal. The lowest version is then chosen in the
|
||||
:file:`requirements.txt`.
|
||||
|
||||
.. tip::
|
||||
It can be preferable not to mix Python module packages between different instances of
|
||||
Odoo or with the system. However, it is possible to use `virtualenv
|
||||
<https://pypi.org/project/virtualenv/>`_ to create isolated Python environments.
|
||||
|
||||
Navigate to the path of the Odoo Community installation (:file:`CommunityPath`) and run
|
||||
**pip** on the requirements file to install the requirements for the current user.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ cd /CommunityPath
|
||||
$ pip install -r requirements.txt
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
Before installing the dependencies, download and install the `Build Tools for Visual
|
||||
Studio <https://visualstudio.microsoft.com/downloads/>`_. Select **C++ build tools** in the
|
||||
**Workloads** tab and install them when prompted.
|
||||
|
||||
Odoo dependencies are listed in the `requirements.txt` file located at the root of the Odoo
|
||||
Community directory.
|
||||
|
||||
.. tip::
|
||||
It can be preferable not to mix Python module packages between different instances of
|
||||
Odoo or with the system. However, it is possible to use `virtualenv
|
||||
<https://pypi.org/project/virtualenv/>`_ to create isolated Python environments.
|
||||
|
||||
Navigate to the path of the Odoo Community installation (`CommunityPath`) and run **pip** on
|
||||
the requirements file in a terminal **with Administrator privileges**:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> cd \CommunityPath
|
||||
C:\> pip install setuptools wheel
|
||||
C:\> pip install -r requirements.txt
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
Odoo dependencies are listed in the `requirements.txt` file located at the root of the Odoo
|
||||
Community directory.
|
||||
|
||||
.. tip::
|
||||
It can be preferable not to mix Python module packages between different instances of
|
||||
Odoo or with the system. However, it is possible to use `virtualenv
|
||||
<https://pypi.org/project/virtualenv/>`_ to create isolated Python environments.
|
||||
|
||||
Navigate to the path of the Odoo Community installation (`CommunityPath`) and run **pip** on
|
||||
the requirements file:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ cd /CommunityPath
|
||||
$ pip3 install setuptools wheel
|
||||
$ pip3 install -r requirements.txt
|
||||
|
||||
.. warning::
|
||||
Non-Python dependencies must be installed with a package manager (`Homebrew
|
||||
<https://brew.sh/>`_, `MacPorts <https://www.macports.org>`_).
|
||||
|
||||
#. Download and install the **Command Line Tools**:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ xcode-select --install
|
||||
|
||||
#. Use the package manager to install non-Python dependencies.
|
||||
|
||||
.. note::
|
||||
For languages using a **right-to-left interface** (such as Arabic or Hebrew), the `rtlcss`
|
||||
package is required.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
#. Download and install **nodejs** and **npm** with a package manager.
|
||||
#. Install `rtlcss`:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo npm install -g rtlcss
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
#. Download and install `nodejs <https://nodejs.org/en/download>`_.
|
||||
#. Install `rtlcss`:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> npm install -g rtlcss
|
||||
|
||||
#. Edit the system environment's variable `PATH` to add the folder where `rtlcss.cmd` is
|
||||
located (typically: :file:`C:\\Users\\<user>\\AppData\\Roaming\\npm\\`).
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
#. Download and install **nodejs** with a package manager (`Homebrew <https://brew.sh/>`_,
|
||||
`MacPorts <https://www.macports.org>`_).
|
||||
#. Install `rtlcss`:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo npm install -g rtlcss
|
||||
|
||||
.. warning::
|
||||
`wkhtmltopdf` is not installed through **pip** and must be installed manually in `version 0.12.6
|
||||
<https://github.com/wkhtmltopdf/packaging/releases/tag/0.12.6.1-3>`_ for it to support headers
|
||||
and footers. Check out the `wkhtmltopdf wiki <https://github.com/odoo/odoo/wiki/Wkhtmltopdf>`_
|
||||
for more details on the various versions.
|
||||
|
||||
.. _install/source/running_odoo:
|
||||
|
||||
Running Odoo
|
||||
------------
|
||||
|
||||
Once all dependencies are set up, Odoo can be launched by running `odoo-bin`, the command-line
|
||||
interface of the server. It is located at the root of the Odoo Community directory.
|
||||
|
||||
To configure the server, either specify :ref:`command-line arguments <reference/cmdline/server>` or
|
||||
a :ref:`configuration file <reference/cmdline/config>`.
|
||||
|
||||
.. tip::
|
||||
For the Enterprise edition, add the path to the `enterprise` add-ons to the `addons-path`
|
||||
argument. Note that it must come before the other paths in `addons-path` for add-ons to be loaded
|
||||
correctly.
|
||||
|
||||
Common necessary configurations are:
|
||||
|
||||
- PostgreSQL user and password.
|
||||
- Custom addon paths beyond the defaults to load custom modules.
|
||||
|
||||
A typical way to run the server would be:
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Linux
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ cd /CommunityPath
|
||||
$ python3 odoo-bin --addons-path=addons -d mydb
|
||||
|
||||
Where `CommunityPath` is the path of the Odoo Community installation, and `mydb` is the name
|
||||
of the PostgreSQL database.
|
||||
|
||||
.. group-tab:: Windows
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\> cd CommunityPath/
|
||||
C:\> python odoo-bin -r dbuser -w dbpassword --addons-path=addons -d mydb
|
||||
|
||||
Where `CommunityPath` is the path of the Odoo Community installation, `dbuser` is the
|
||||
PostgreSQL login, `dbpassword` is the PostgreSQL password, and `mydb` is the name of the
|
||||
PostgreSQL database.
|
||||
|
||||
.. group-tab:: Mac OS
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ cd /CommunityPath
|
||||
$ python3 odoo-bin --addons-path=addons -d mydb
|
||||
|
||||
Where `CommunityPath` is the path of the Odoo Community installation, and `mydb` is the name
|
||||
of the PostgreSQL database.
|
||||
|
||||
After the server has started (the INFO log `odoo.modules.loading: Modules loaded.` is printed), open
|
||||
http://localhost:8069 in a web browser and log into the Odoo database with the base administrator
|
||||
account: use `admin` as the email and, again, `admin` as the password.
|
||||
|
||||
.. tip::
|
||||
- From there, create and manage new :doc:`users <../../applications/general/users>`.
|
||||
- The user account used to log into Odoo's web interface differs from the :option:`--db_user
|
||||
<odoo-bin -r>` CLI argument.
|
||||
|
||||
.. seealso::
|
||||
:doc:`The list of CLI arguments for odoo-bin </developer/reference/cli>`
|
@ -1,107 +0,0 @@
|
||||
:hide-page-toc:
|
||||
|
||||
.. _supported_versions:
|
||||
|
||||
==================
|
||||
Supported versions
|
||||
==================
|
||||
|
||||
Odoo provides support and bug fixing **for the 3 last major versions** of Odoo.
|
||||
|
||||
.. note::
|
||||
Odoo releases intermediary versions called **Online versions** on the :doc:`Odoo Online
|
||||
<odoo_online>` hosting every two months. Odoo Online users can then benefit from the latest
|
||||
features of Odoo.
|
||||
|
||||
- Admins of Odoo Online databases are invited to :doc:`upgrade <upgrade>` them regularly.
|
||||
- Online versions are *not* released for Odoo.sh and On-Premise installations.
|
||||
- Online versions are listed below as *SaaS*.
|
||||
|
||||
This matrix shows the support status of every version.
|
||||
|
||||
**Major releases are in bold type.**
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
* -
|
||||
- Odoo Online
|
||||
- Odoo.sh
|
||||
- On-Premise
|
||||
- Release date
|
||||
- End of support
|
||||
* - Odoo SaaS 18.1
|
||||
- |green|
|
||||
- N/A
|
||||
- N/A
|
||||
- January 2025
|
||||
-
|
||||
* - **Odoo 18.0**
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
- October 2024
|
||||
- October 2027 (planned)
|
||||
* - Odoo SaaS 17.4
|
||||
- |red|
|
||||
- N/A
|
||||
- N/A
|
||||
- July 2024
|
||||
- October 2024
|
||||
* - Odoo SaaS 17.2
|
||||
- |red|
|
||||
- N/A
|
||||
- N/A
|
||||
- April 2024
|
||||
- October 2024
|
||||
* - **Odoo 17.0**
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
- November 2023
|
||||
- October 2026 (planned)
|
||||
* - **Odoo 16.0**
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
- October 2022
|
||||
- October 2025 (planned)
|
||||
* - **Odoo 15.0**
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- October 2021
|
||||
- October 2024
|
||||
* - **Odoo 14.0**
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- October 2020
|
||||
- November 2023
|
||||
* - Older versions
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- Before 2020
|
||||
- Before 2023
|
||||
|
||||
.. admonition:: Legend
|
||||
|
||||
|green| Supported version
|
||||
|
||||
|red| End-of-support
|
||||
|
||||
N/A Never released for this platform
|
||||
|
||||
.. important::
|
||||
Even though we don't support older versions, you can always `upgrade from any version
|
||||
<https://upgrade.odoo.com/>`_.
|
||||
|
||||
.. |green| raw:: html
|
||||
|
||||
<span class="text-success" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
.. |red| raw:: html
|
||||
|
||||
<span class="text-danger" style="font-size: 32px; line-height: 0.5">●</span>
|
@ -1,439 +0,0 @@
|
||||
=======
|
||||
Upgrade
|
||||
=======
|
||||
|
||||
An upgrade involves moving a database from an older version to a newer supported version (e.g., from
|
||||
Odoo 16.0 to Odoo 18.0). Regular upgrades are crucial as each version offers new features, bug
|
||||
fixes, and security patches. Using a :doc:`supported version <supported_versions>` is strongly
|
||||
recommended. Each major version is supported for three years.
|
||||
|
||||
Depending on the hosting type and Odoo version used, a database upgrade can be **mandatory**.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Odoo Online
|
||||
|
||||
- If a database is on a **major version** (e.g., 16.0, 17.0, 18.0), an upgrade is mandatory
|
||||
every two years.
|
||||
- If a database is on a **minor version** (e.g., 17.1, 17.2, 17.4), an upgrade is mandatory
|
||||
a few weeks after the next version is released. Minor versions are usually released every
|
||||
two months.
|
||||
|
||||
.. group-tab:: Odoo.sh
|
||||
|
||||
After the initial three years of support, you will have another two years to complete the
|
||||
upgrade. You will be notified when an upgrade is required.
|
||||
|
||||
.. image:: upgrade/odoo-sh-message.png
|
||||
:alt: The "unsupported version" popup on Odoo.sh.
|
||||
|
||||
.. group-tab:: On-premise
|
||||
|
||||
You can stay on the same version indefinitely, even if it is not recommended. Note that the
|
||||
smaller the version gap, the easier the upgrade should be.
|
||||
|
||||
.. spoiler:: Automatic upgrades: Odoo Online's Rolling Release process
|
||||
|
||||
You will receive a notification in your database a few weeks before a mandatory upgrade will be
|
||||
automatically carried out. You are in control of the process as long as the deadline is not
|
||||
reached.
|
||||
|
||||
.. image:: upgrade/rr-upgrade-message.png
|
||||
:alt: The upgrade message prompt on the top right of the database
|
||||
|
||||
Concretely, Odoo’s Upgrade Team performs a silent test upgrade of every database that should be
|
||||
upgraded. If the test is successful and lasts less than 20 minutes, you can directly trigger the
|
||||
upgrade from the database. If the test fails, you can test an upgrade using the `database manager
|
||||
<https://www.odoo.com/my/databases>`_.
|
||||
|
||||
When you are invited to upgrade, it is strongly recommended to :ref:`request an upgraded test
|
||||
database <upgrade-request-test>` first and spend time :ref:`testing <upgrade-testing>` it.
|
||||
|
||||
An automatic upgrade to the next version will be triggered if no action is taken before the
|
||||
specified due date.
|
||||
|
||||
An upgrade does not cover:
|
||||
|
||||
- Downgrading to a previous version of Odoo
|
||||
- :doc:`Switching editions <on_premise/community_to_enterprise>` (e.g., from Community to
|
||||
Enterprise)
|
||||
- :ref:`Changing hosting type <hosting/change-solution>` (e.g., from on-premise to Odoo Online)
|
||||
- Migrating from another ERP to Odoo
|
||||
|
||||
.. warning::
|
||||
If your database contains custom modules, it cannot be upgraded until a version of your custom
|
||||
modules is available for the target version of Odoo. For customers maintaining their own custom
|
||||
modules, we recommend to parallelize the process by :ref:`requesting an upgraded database
|
||||
<upgrade-request-test>` while also :doc:`upgrading the source code of your custom
|
||||
modules </developer/howtos/upgrade_custom_db>`.
|
||||
|
||||
.. _upgrade-nutshell:
|
||||
|
||||
Upgrading in a nutshell
|
||||
=======================
|
||||
|
||||
#. Request an upgraded test database (see :ref:`obtaining an upgraded test database
|
||||
<upgrade-request-test>`).
|
||||
#. If applicable, upgrade the source code of your custom module to be compatible with the new
|
||||
version of Odoo (see :doc:`/developer/howtos/upgrade_custom_db`).
|
||||
#. Thoroughly test the upgraded database (see :ref:`testing the new version of the database
|
||||
<upgrade-testing>`).
|
||||
#. Report any issue encountered during the testing to Odoo by going to the `Support page and
|
||||
selecting "An issue related to my future upgrade (I am testing an upgrade)"
|
||||
<https://www.odoo.com/help?stage=migration>`_.
|
||||
#. Once all issues are resolved and you are confident that the upgraded database can be used as
|
||||
your main database without any issues, plan the upgrade of your production database.
|
||||
#. Request the upgrade for the production database, rendering it unavailable for the time it takes
|
||||
to complete the process (see :ref:`upgrading the production database <upgrade-production>`).
|
||||
#. Report any issue encountered during the upgrade to Odoo by going to the `Support page and
|
||||
selecting "An issue related to my upgrade (production)"
|
||||
<https://www.odoo.com/help?stage=post_upgrade>`_.
|
||||
|
||||
.. _upgrade-request-test:
|
||||
|
||||
Obtaining an upgraded test database
|
||||
===================================
|
||||
|
||||
The `Upgrade page <https://upgrade.odoo.com>`_ is the main platform for requesting an upgraded
|
||||
database. However, depending on the hosting type, you can upgrade from the command line
|
||||
(on-premise), the Odoo Online `database manager <https://www.odoo.com/my/databases>`_, or your
|
||||
`Odoo.sh project <https://www.odoo.sh/project>`_.
|
||||
|
||||
.. note::
|
||||
The Upgrade platform follows the same `Privacy Policy <https://www.odoo.com/privacy>`_ as the
|
||||
other Odoo.com services. Visit the `General Data Protection Regulation page
|
||||
<https://www.odoo.com/gdpr>`_ to learn more about how Odoo handles your data and privacy.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Odoo Online
|
||||
|
||||
Odoo Online databases can be manually upgraded via the `database manager
|
||||
<https://www.odoo.com/my/databases>`_.
|
||||
|
||||
The database manager displays all databases associated with the user's account. Databases
|
||||
not on the most recent version of Odoo display an arrow in a circle icon next to their name,
|
||||
indicating that they can be upgraded.
|
||||
|
||||
.. image:: upgrade/databases-page.png
|
||||
:alt: The database manager with an upgrade button next to the name of a database.
|
||||
|
||||
Click the **arrow in a circle** icon to start the upgrade process. In the popup, fill in:
|
||||
|
||||
- The **version** of Odoo you want to upgrade to, usually the latest version
|
||||
- The **email** address that should receive the link to the upgraded database
|
||||
- The :guilabel:`Purpose` of the upgrade, which is automatically set to :guilabel:`Test` for
|
||||
your first upgrade request
|
||||
|
||||
.. image:: upgrade/upgrade-popup.png
|
||||
:alt: The "Upgrade your database" popup.
|
||||
|
||||
The :guilabel:`Upgrade in progress` tag is displayed next to the database name until
|
||||
completion. Once the process succeeds, an email containing a link to the upgraded test
|
||||
database is sent to the address provided. The database can also be accessed from the database
|
||||
manager by clicking the dropdown arrow before the database name.
|
||||
|
||||
.. image:: upgrade/access-upgraded-db.png
|
||||
:alt: Clicking the menu arrow displays the upgraded test database.
|
||||
|
||||
.. group-tab:: Odoo.sh
|
||||
|
||||
Odoo.sh is integrated with the upgrade platform to simplify the upgrade process.
|
||||
|
||||
.. image:: upgrade/odoo-sh-staging.png
|
||||
:alt: Odoo.sh project and tabs
|
||||
|
||||
The **latest production daily automatic backup** is then sent to the Upgrade platform.
|
||||
|
||||
Once the upgrade platform is done upgrading the backup and uploading it on the branch, it is
|
||||
put in a **special mode**: each time a **commit is pushed** on the branch, a **restore
|
||||
operation** of the upgraded backup and an **update of all the custom modules** occur. This
|
||||
allows you to test your custom modules on a pristine copy of the upgraded database. The log
|
||||
file of the upgrade process can be found in your newly upgraded staging build by going to
|
||||
:file:`~/logs/upgrade.log`.
|
||||
|
||||
.. important::
|
||||
In databases where custom modules are installed, their source code must be up-to-date with
|
||||
the target version of Odoo before the upgrade can be performed. If there are none, the
|
||||
"update on commit" mode is skipped, the upgraded database is built as soon as it is
|
||||
transferred from the upgrade platform, and the upgrade mode is exited.
|
||||
|
||||
Check out the :doc:`/developer/howtos/upgrade_custom_db` page for more information.
|
||||
|
||||
.. group-tab:: On-premise
|
||||
|
||||
The standard upgrade process can be initiated by entering the following command line on the
|
||||
machine where the database is hosted:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python <(curl -s https://upgrade.odoo.com/upgrade) test -d <your db name> -t <target version>
|
||||
|
||||
.. note::
|
||||
This command has some requirements on the environment it runs in:
|
||||
|
||||
- Some external commands that must be provided by the operating system, normally found in
|
||||
any Linux distribution (including WSL). An error will be displayed if one or several of
|
||||
them are missing.
|
||||
- The system user that executes the command needs to be configured with access to the
|
||||
database. Please refer to the PostgreSQL documentation of the `client environment
|
||||
<https://www.postgresql.org/docs/current/libpq-envars.html>`_ or the `client password
|
||||
file <https://www.postgresql.org/docs/current/libpq-pgpass.html>`_ for this requirement.
|
||||
- The script needs to be able to reach one or multiple servers of the upgrade platform
|
||||
both on TCP port 443 and to any random TCP port in the range between 32768 and 60999.
|
||||
This can be in conflict with your restrictive firewall and may need an exception added
|
||||
to the firewall configuration.
|
||||
|
||||
The following command can be used to display the general help and the main commands:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python <(curl -s https://upgrade.odoo.com/upgrade) --help
|
||||
|
||||
An upgraded test database can also be requested via the `Upgrade page
|
||||
<https://upgrade.odoo.com>`_.
|
||||
|
||||
.. important::
|
||||
In databases where custom modules are installed, their source code must be up-to-date with
|
||||
the target version of Odoo before the upgrade can be performed. Check out the
|
||||
:doc:`/developer/howtos/upgrade_custom_db` page for more information.
|
||||
|
||||
.. note::
|
||||
- For security reasons, only the person who submitted the upgrade request can download it.
|
||||
- For storage reasons, the database's copy is submitted without a filestore to the upgrade
|
||||
server. Therefore, the upgraded database does not contain the production filestore.
|
||||
- Before restoring the upgraded database, its filestore must be merged with the production
|
||||
filestore to be able to perform tests in the same conditions as it would be in the new
|
||||
version.
|
||||
- The upgraded database contains:
|
||||
|
||||
- A `dump.sql` file containing the upgraded database
|
||||
- A `filestore` folder containing files extracted from in-database records into
|
||||
attachments (if there are any) and new standard Odoo files from the targeted Odoo
|
||||
version (e.g., new images, icons, payment provider's logos, etc.).
|
||||
This is the folder that should be merged with the production filestore
|
||||
in order to get the full upgraded filestore.
|
||||
|
||||
.. note::
|
||||
You can request multiple test databases if you wish to test an upgrade more than once.
|
||||
|
||||
.. note::
|
||||
When an upgrade request is completed, an upgrade report is attached to the successful upgrade
|
||||
email, and it becomes available in the Discuss app for users who are part of the "Administration
|
||||
/ Settings" group. This report provides important information about the changes introduced by
|
||||
the new version.
|
||||
|
||||
.. _upgrade-testing:
|
||||
|
||||
Testing the new version of the database
|
||||
=======================================
|
||||
|
||||
It is essential to test the upgraded test database to ensure that you are not stuck in your
|
||||
day-to-day activities by a change in views, behavior, or an error message once the upgrade goes
|
||||
live.
|
||||
|
||||
.. note::
|
||||
Test databases are neutralized, and some features are disabled to prevent them from impacting the
|
||||
production database:
|
||||
|
||||
#. Scheduled actions are disabled.
|
||||
#. Outgoing mail servers are disabled by archiving the existing ones and adding a fake one.
|
||||
#. Payment providers and delivery carriers are reset to the test environment.
|
||||
#. Bank synchronization is disabled. Should you want to test the synchronization, contact your
|
||||
bank synchronization provider to get sandbox credentials.
|
||||
|
||||
Testing as many of your business flows as possible is strongly recommended to ensure they are
|
||||
working correctly and to get more familiar with the new version.
|
||||
|
||||
.. admonition:: Basic test checklist
|
||||
|
||||
- Are there views that are deactivated in your test database but active in your production
|
||||
database?
|
||||
- Are your usual views still displayed correctly?
|
||||
- Are your reports (invoice, sales order, etc.) correctly generated?
|
||||
- Are your website pages working correctly?
|
||||
- Are you able to create and modify records? (sales orders, invoices, purchases, users, contacts,
|
||||
companies, etc.)
|
||||
- Are there any issues with your mail templates?
|
||||
- Are there any issues with saved translations?
|
||||
- Are your search filters still present?
|
||||
- Can you export your data?
|
||||
|
||||
.. spoiler:: Example of end-to-end testing
|
||||
|
||||
- Checking a random product in your product catalog and comparing its test and production data to
|
||||
verify everything is the same (product category, selling price, cost price, vendor, accounts,
|
||||
routes, etc.).
|
||||
- Buying this product (Purchase app).
|
||||
- Confirming the reception of this product (Inventory app).
|
||||
- Checking if the route to receive this product is the same in your production database
|
||||
(Inventory app).
|
||||
- Selling this product (Sales app) to a random customer.
|
||||
- Opening your customer database (Contacts app), selecting a customer (or company), and checking
|
||||
its data.
|
||||
- Shipping this product (Inventory app).
|
||||
- Checking if the route to ship this product is the same as in your production database
|
||||
(Inventory app).
|
||||
- Validating a customer invoice (Invoicing or Accounting app).
|
||||
- Crediting the invoice (issuing a credit note) and checking if it behaves as in your production
|
||||
database.
|
||||
- Checking your reports' results (Accounting app).
|
||||
- Randomly checking your taxes, currencies, bank accounts, and fiscal year (Accounting app).
|
||||
- Making an online order (Website apps) from the product selection in your shop until the
|
||||
checkout process and checking if everything behaves as in your production database.
|
||||
|
||||
This list is **not** exhaustive. Extend the example to your other apps based on your use of Odoo.
|
||||
|
||||
If you face an issue while testing your upgraded test database, you can request the assistance of
|
||||
Odoo by going to the `Support page and selecting "An issue related to my future upgrade (I am
|
||||
testing an upgrade)" <https://www.odoo.com/help?stage=migration>`_. In any case, it is essential to
|
||||
report any problem encountered during the testing to fix it before upgrading your production
|
||||
database.
|
||||
|
||||
You might encounter significant differences with standard views, features, fields, and models during
|
||||
testing. Those changes cannot be reverted on a case-by-case basis. However, if a change introduced
|
||||
by a new version breaks a customization, it is the responsibility of the maintainer of your custom
|
||||
module to make it compatible with the new version of Odoo.
|
||||
|
||||
.. tip::
|
||||
Do not forget to test:
|
||||
|
||||
- Integrations with external software (EDI, APIs, etc.)
|
||||
- Workflows between different apps (online sales with eCommerce, converting a lead all the way to
|
||||
a sales order, delivery of products, etc.)
|
||||
- Data exports
|
||||
- Automated actions
|
||||
- Server actions in the action menu on form views, as well as by selecting multiple records on
|
||||
list views
|
||||
|
||||
.. _upgrade-production:
|
||||
|
||||
Upgrading the production database
|
||||
=================================
|
||||
|
||||
Once the :ref:`tests <upgrade-testing>` are completed and you are confident that the upgraded
|
||||
database can be used as your main database without any issues, it is time to plan the go-live day.
|
||||
|
||||
Your production database will be unavailable during its upgrade. Therefore, we recommend planning
|
||||
the upgrade at a time when the use of the database is minimal.
|
||||
|
||||
As the standard upgrade scripts and your database are constantly evolving, it is also recommended
|
||||
to frequently request another upgraded test database to ensure that the upgrade process is still
|
||||
successful, especially if it takes a long time to finish. **Fully rehearsing the upgrade process the
|
||||
day before upgrading the production database is also recommended.**
|
||||
|
||||
.. important::
|
||||
Going into production without first testing may lead to:
|
||||
|
||||
- Users failing to adjust to the changes and new features
|
||||
- Business interruptions (e.g., no longer having the possibility to validate an action)
|
||||
- Poor customer experience (e.g., an eCommerce website that does not work correctly)
|
||||
|
||||
The process of upgrading a production database is similar to upgrading a test database, but with a
|
||||
few exceptions.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Odoo Online
|
||||
|
||||
The process is similar to :ref:`obtaining an upgraded test database
|
||||
<upgrade-request-test>`, except for the purpose option, which must be set to
|
||||
:guilabel:`Production` instead of :guilabel:`Test`.
|
||||
|
||||
.. warning::
|
||||
Once the upgrade is requested, the database will be unavailable until the upgrade is
|
||||
finished. Once the process is completed, it is impossible to revert to the previous
|
||||
version.
|
||||
|
||||
.. group-tab:: Odoo.sh
|
||||
|
||||
The process is similar to :ref:`obtaining an upgraded test database <upgrade-request-test>` on
|
||||
the :guilabel:`Production` branch.
|
||||
|
||||
.. image:: upgrade/odoo-sh-prod.png
|
||||
:alt: View from the upgrade tab
|
||||
|
||||
The process is **triggered as soon as a new commit is made** on the branch. This
|
||||
allows the upgrade process to be synchronized with the deployment of the custom modules'
|
||||
upgraded source code.
|
||||
If there are no custom modules, the upgrade process is triggered immediately.
|
||||
|
||||
.. important::
|
||||
The database is unavailable throughout the process. If anything goes wrong, the platform
|
||||
automatically reverts the upgrade, as it would be for a regular update. In case of success,
|
||||
a backup of the database before the upgrade is created.
|
||||
|
||||
The update of your custom modules must be successful to complete the entire upgrade process.
|
||||
Make sure the status of your staging upgrade is :guilabel:`successful` before trying it in
|
||||
production. More information on how to upgrade your custom modules can be found on
|
||||
:doc:`/developer/howtos/upgrade_custom_db`.
|
||||
|
||||
.. group-tab:: On-premise
|
||||
|
||||
The command to upgrade a database to production is similar to the one of upgrading a test
|
||||
database except for the argument `test`, which must be replaced by `production`:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python <(curl -s https://upgrade.odoo.com/upgrade) production -d <your db name> -t <target version>
|
||||
|
||||
An upgraded production database can also be requested via the `Upgrade page
|
||||
<https://upgrade.odoo.com>`_.
|
||||
|
||||
Once the database is uploaded, any modification to your production database will **not** be
|
||||
present on your upgraded database. This is why we recommend not using it during the upgrade
|
||||
process.
|
||||
|
||||
.. important::
|
||||
When requesting an upgraded database for production purposes, the copy is submitted without
|
||||
a filestore. Therefore, the upgraded database filestore must be merged with the production
|
||||
filestore before deploying the new version.
|
||||
|
||||
In case of an issue with your production database, you can request the assistance of Odoo by going
|
||||
to the `Support page and selecting "An issue related to my upgrade (production)"
|
||||
<https://www.odoo.com/help?stage=post_upgrade>`_.
|
||||
|
||||
.. _upgrade-sla:
|
||||
|
||||
Service-level agreement (SLA)
|
||||
=============================
|
||||
|
||||
With Odoo Enterprise, upgrading a database to the most recent version of Odoo is **free**, including
|
||||
any support required to rectify potential discrepancies in the upgraded database.
|
||||
|
||||
Information about the upgrade services included in the Enterprise Licence is available in the
|
||||
:ref:`Odoo Enterprise Subscription Agreement <upgrade>`. However, this section clarifies what
|
||||
upgrade services you can expect.
|
||||
|
||||
.. _upgrade-sla-covered:
|
||||
|
||||
Upgrade services covered by the SLA
|
||||
-----------------------------------
|
||||
|
||||
Databases hosted on Odoo's cloud platforms (Odoo Online and Odoo.sh) or self-hosted (On-Premise) can
|
||||
benefit from upgrade services at all times for:
|
||||
|
||||
- the upgrade of all **standard applications**;
|
||||
- the upgrade of all **customizations created with the Studio app**, as long as Studio is still
|
||||
installed and the respective subscription is still active; and
|
||||
- the upgrade of all **developments and customizations covered by a maintenance of customizations
|
||||
subscription**.
|
||||
|
||||
Upgrade services are limited to the technical conversion and adaptation of a database (standard
|
||||
modules and data) to make it compatible with the version targeted by the upgrade.
|
||||
|
||||
.. _upgrade-sla-not-covered:
|
||||
|
||||
Upgrade services not covered by the SLA
|
||||
---------------------------------------
|
||||
|
||||
The following upgrade-related services are **not** included:
|
||||
|
||||
- the **cleaning** of pre-existing data and configurations while upgrading;
|
||||
- the upgrade of **additional modules not covered by a maintenance contract** that are created
|
||||
in-house or by third parties, including Odoo partners; and
|
||||
- **training** on using the upgraded version's features and workflows.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Odoo.sh documentation <odoo_sh>`
|
||||
- :doc:`Supported Odoo versions <supported_versions>`
|
Before ![]() (image error) Size: 2.9 KiB |
Before ![]() (image error) Size: 2.6 KiB |
Before ![]() (image error) Size: 14 KiB |
Before ![]() (image error) Size: 35 KiB |
Before ![]() (image error) Size: 24 KiB |
Before ![]() (image error) Size: 14 KiB |
Before ![]() (image error) Size: 17 KiB |
@ -1,13 +0,0 @@
|
||||
===============
|
||||
Odoo essentials
|
||||
===============
|
||||
|
||||
.. toctree::
|
||||
|
||||
essentials/activities
|
||||
essentials/reporting
|
||||
essentials/search
|
||||
essentials/contacts
|
||||
essentials/export_import_data
|
||||
essentials/in_app_purchase
|
||||
essentials/keyboard_shortcuts
|
@ -1,345 +0,0 @@
|
||||
==========
|
||||
Activities
|
||||
==========
|
||||
|
||||
.. |clock| replace:: :icon:`fa-clock-o` :guilabel:`(clock)` icon
|
||||
|
||||
*Activities* are follow-up tasks tied to a record in an Odoo database.
|
||||
|
||||
.. _activities/important:
|
||||
|
||||
The icon used to display activities varies, depending on the :ref:`activity type
|
||||
<activities/types>`:
|
||||
|
||||
- :icon:`fa-clock-o` :guilabel:`(clock)` icon: the default activities icon.
|
||||
- :icon:`fa-phone` :guilabel:`(phone)` icon: a phone call is scheduled.
|
||||
- :icon:`fa-envelope` :guilabel:`(envelope)` icon: an email is scheduled.
|
||||
- :icon:`fa-check` :guilabel:`(check)` icon: a "to-do" is scheduled.
|
||||
- :icon:`fa-users` :guilabel:`(people)` icon: a meeting is scheduled.
|
||||
- :icon:`fa-upload` :guilabel:`(upload)` icon: a document is scheduled to be uploaded.
|
||||
- :icon:`fa-pencil-square-o` :guilabel:`(request signature)` icon: a signature request is scheduled.
|
||||
|
||||
Schedule activities
|
||||
===================
|
||||
|
||||
Activities can be scheduled on any page of the database that contains a :ref:`chatter
|
||||
<activities/chatter>` thread, :ref:`Kanban view <activities/kanban>`, :ref:`list view
|
||||
<activities/list>`, or :ref:`activities view <activities/activity>` of an application.
|
||||
|
||||
.. _activities/chatter:
|
||||
|
||||
Chatter
|
||||
-------
|
||||
|
||||
Activities can be created from the chatter on any record.
|
||||
|
||||
To schedule a new activity, click the :guilabel:`Activities` button, located at the top of the
|
||||
chatter. In the :guilabel:`Schedule Activity` pop-up window that appears, :ref:`fill out the
|
||||
Schedule Activity form <activities/form>`.
|
||||
|
||||
.. image:: activities/chatter.png
|
||||
:align: center
|
||||
:alt: New activity type form.
|
||||
|
||||
.. _activities/kanban:
|
||||
|
||||
Kanban view
|
||||
-----------
|
||||
|
||||
Activities can also be created from the :icon:`oi-view-kanban` :guilabel:`(Kanban)` view.
|
||||
|
||||
To do so, click on the |clock| located at the bottom of an individual record.
|
||||
|
||||
Click :guilabel:`+ Schedule An Activity`, then proceed to :ref:`fill out the Schedule Activity form
|
||||
<activities/form>`.
|
||||
|
||||
.. image:: activities/schedule-kanban-activity.png
|
||||
:align: center
|
||||
:alt: Kanban view of the CRM pipeline and the option to schedule an activity.
|
||||
|
||||
.. note::
|
||||
If a record already has a scheduled activity, the |clock| is replaced by the icon that represents
|
||||
the existing scheduled activity. Click on the activity type's icon to schedule another activity.
|
||||
|
||||
.. _activities/list:
|
||||
|
||||
List view
|
||||
---------
|
||||
|
||||
Activities can also be created from a :icon:`oi-view-list` :guilabel:`(list)` view.
|
||||
|
||||
If the :guilabel:`Activities` column is hidden, reveal it using the :icon:`oi-settings-adjust`
|
||||
:guilabel:`(settings adjust)` icon in the far-right of the top row.
|
||||
|
||||
Then, click on the |clock| for the record the activity is being added to, and click :guilabel:`+
|
||||
Schedule an activity`. Proceed to :ref:`fill out the Schedule Activity form <activities/form>` that
|
||||
appears.
|
||||
|
||||
.. note::
|
||||
If a record already has a scheduled activity, the |clock| is replaced by the icon that represents
|
||||
the existing scheduled activity. Click on the activity type's icon to schedule another activity.
|
||||
|
||||
.. image:: activities/schedule-list-activity.png
|
||||
:align: center
|
||||
:alt: List view of the CRM pipeline and the option to schedule an activity.
|
||||
|
||||
.. _activities/activity:
|
||||
|
||||
Activity view
|
||||
-------------
|
||||
|
||||
Most applications in Odoo have an *Activity* view available. If available, a |clock| is visible in
|
||||
the top-right corner of the main menu bar, amongst the other view option icons.
|
||||
|
||||
To open the activity view, click the |clock|.
|
||||
|
||||
.. image:: activities/activities.png
|
||||
:align: center
|
||||
:alt: Top-right menu with the Activities icon called out.
|
||||
|
||||
In this view, all the available activities are listed in the columns, while the horizontal entries
|
||||
represent all the individual records.
|
||||
|
||||
Activities that appear green have a due date in the future, activities that appear orange are due
|
||||
today, while activities appearing red are overdue.
|
||||
|
||||
Color bars in each column represent records for specific activity types, and display a number
|
||||
indicating how many activities are scheduled for that type.
|
||||
|
||||
If multiple activity types are scheduled for a record, a number appears in the box, indicating the
|
||||
total number of scheduled activities.
|
||||
|
||||
.. note::
|
||||
Activity colors, and their relation to an activity's due date, are consistent throughout Odoo,
|
||||
regardless of the activity type, or the view.
|
||||
|
||||
To schedule an activity for a record, hover over the corresponding field. Click the :icon:`fa-plus`
|
||||
:guilabel:`(plus)` icon that appears, and then :ref:`fill out the Schedule Activity form
|
||||
<activities/form>`.
|
||||
|
||||
.. image:: activities/activity-view.png
|
||||
:align: center
|
||||
:alt: Activity view of the CRM pipeline and the option to schedule an activity.
|
||||
|
||||
.. _activities/form:
|
||||
|
||||
Schedule Activity form
|
||||
----------------------
|
||||
|
||||
Activities can be scheduled from many different places, such as from the :ref:`chatter
|
||||
<activities/chatter>` of a record, or from one of multiple views in an application, when available:
|
||||
the :ref:`Kanban view <activities/kanban>`, :ref:`list view <activities/list>`, or :ref:`activity
|
||||
view <activities/activity>`.
|
||||
|
||||
Enter the following information on the form:
|
||||
|
||||
- :guilabel:`Activity Type`: select the type of activity from the drop-down menu. The default
|
||||
options are: :guilabel:`Email`, :guilabel:`Call`, :guilabel:`Meeting`, or :guilabel:`To-Do`.
|
||||
Depending on what other applications are installed, additional options may be available.
|
||||
- :guilabel:`Summary`: enter a short title for the activity, such as `Discuss Proposal`.
|
||||
- :guilabel:`Due Date`: using the calendar popover, select the activity's deadline.
|
||||
- :guilabel:`Assigned to`: by default, the current user populates this field. To assign a different
|
||||
user to the activity, select them from the drop-down menu.
|
||||
- :guilabel:`Notes`: add any additional information for the activity in this field.
|
||||
|
||||
When the :guilabel:`Schedule Activity` pop-up window is completed, click one of the following
|
||||
buttons:
|
||||
|
||||
- :guilabel:`Open Calendar`: opens the user's calendar to add and schedule the activity.
|
||||
|
||||
Click on the desired date and time for the activity, and a :guilabel:`New Event` pop-up window
|
||||
appears. The summary from the *Schedule Activity* pop-up window populates the :guilabel:`Title`
|
||||
field.
|
||||
|
||||
Enter the information in the :guilabel:`New Event` pop-up window, then click :guilabel:`Save &
|
||||
Close` to schedule it. Once scheduled, the activity is added to the chatter under the
|
||||
:guilabel:`Planned Activities` section.
|
||||
|
||||
.. important::
|
||||
The :guilabel:`Open Calendar` button **only** appears if the :guilabel:`Activity Type` is set
|
||||
to either :guilabel:`Call` or :guilabel:`Meeting`.
|
||||
|
||||
- :guilabel:`Schedule`: schedules the activity, and adds the activity to the chatter under
|
||||
:guilabel:`Planned Activities`.
|
||||
- :guilabel:`Schedule & Mark as Done`: adds the details of the activity to the chatter under
|
||||
:guilabel:`Today`. The activity is not scheduled, and is automatically marked as done.
|
||||
- :guilabel:`Done & Schedule Next`: adds the details of the activity to the chatter under
|
||||
:guilabel:`Today`. The activity is not scheduled, is automatically marked as done, and a new
|
||||
:guilabel:`Schedule Activity` pop-up window appears.
|
||||
- :guilabel:`Cancel`: discards any changes made on the :guilabel:`Schedule Activity` pop-up window.
|
||||
|
||||
.. image:: activities/schedule-pop-up.png
|
||||
:align: center
|
||||
:alt: View of CRM leads and the option to schedule an activity.
|
||||
|
||||
.. _activities/all:
|
||||
|
||||
All scheduled activities
|
||||
========================
|
||||
|
||||
To view a consolidated list of activities, organized by application, click the |clock| in the header
|
||||
menu, located in the top-right corner.
|
||||
|
||||
If any activities are scheduled, the number of activities appear in a red bubble on the
|
||||
|clock|.
|
||||
|
||||
All activities for each application are further divided into subsections, indicating where in the
|
||||
application the activity is to be completed. Each sub-section lists the number of scheduled
|
||||
activities that are :guilabel:`Late`, due :guilabel:`Today`, and scheduled in the
|
||||
:guilabel:`Future`.
|
||||
|
||||
.. example::
|
||||
In the *Time Off* application, one activity is scheduled to be done in the *All Time Off*
|
||||
requests dashboard, and six activities are scheduled to be done in the *Allocations* dashboard.
|
||||
|
||||
These requests appear in two separate lists in the all activities drop-down menu: one labeled
|
||||
`Time Off` and one labeled `Time Off Allocation`.
|
||||
|
||||
.. image:: activities/activities-menu.png
|
||||
:align: center
|
||||
:alt: The list of activities that is accessed from the main menu bar. Two entries for the Time
|
||||
Off application are highlighted.
|
||||
|
||||
Request a document
|
||||
------------------
|
||||
|
||||
The option to :guilabel:`Request a Document` is available at the bottom of the list of :ref:`all
|
||||
scheduled activities <activities/all>`, the option to :guilabel:`Request a Document` appears. Click
|
||||
:guilabel:`Request a Document`, and a :guilabel:`Request a file` pop-up window appears.
|
||||
|
||||
Enter the following information on the form:
|
||||
|
||||
- :guilabel:`Document Name`: enter a name for the document being requested.
|
||||
- :guilabel:`Request To`: select the user the document is being requested from using the drop-down
|
||||
menu.
|
||||
- :guilabel:`Due Date In`: enter a numerical value indicating when the document is due. Next to
|
||||
this field, a :guilabel:`Days` field is visible. Click :guilabel:`Days`, the default option, to
|
||||
reveal a drop-down menu. Select the desired time-frame option from the list. The options are
|
||||
:guilabel:`Days`, :guilabel:`Weeks`, or :guilabel:`Months`.
|
||||
- :guilabel:`Workspace`: using the drop-down menu, select the specific :ref:`Workspace
|
||||
<documents/workspaces>` the document is being uploaded to.
|
||||
- :guilabel:`Tags`: select any desired tags from the drop-down menu. The available tags displayed
|
||||
are based on the tags configured for the selected :guilabel:`Workspace`.
|
||||
- :guilabel:`Message`: enter a message to clarify the document request in this field.
|
||||
|
||||
When all the fields are completed, click :guilabel:`Request` to send the document request.
|
||||
|
||||
.. image:: activities/request-doc.png
|
||||
:align: center
|
||||
:alt: The Request a file form, with all fields filled out to request a contract.
|
||||
|
||||
.. _activities/types:
|
||||
|
||||
Activity types
|
||||
==============
|
||||
|
||||
To view the currently configured types of activities in the database, navigate to
|
||||
:menuselection:`Settings app --> Discuss section --> Activities setting --> Activity Types`.
|
||||
|
||||
.. image:: activities/settings-activities-types.png
|
||||
:align: center
|
||||
:alt: Activity Types button in the Settings application under the Discuss section.
|
||||
|
||||
Doing so reveals the :guilabel:`Activity Types` page, where the existing activity types are found.
|
||||
|
||||
.. tip::
|
||||
Individual applications have a list of *Activity Types* dedicated to that application. For
|
||||
example, to view and edit the activities available for the *CRM* application, go to
|
||||
:menuselection:`CRM app --> Configuration --> Activity Types`.
|
||||
|
||||
.. image:: activities/activity-list.png
|
||||
:align: center
|
||||
:alt: The list of activity types already configured and available.
|
||||
|
||||
Edit activity types
|
||||
-------------------
|
||||
|
||||
To edit an existing :ref:`activity type <activities/types>`, click on the activity type, and the
|
||||
activity type form loads.
|
||||
|
||||
Make any desired changes to the activity type form. The form automatically saves, but it can be
|
||||
saved manually at any time by clicking the :guilabel:`Save Manually` option, represented by a
|
||||
:icon:`fa-cloud-upload` :guilabel:`(cloud upload)` icon, located in the top-left corner of the page.
|
||||
|
||||
Create new activity types
|
||||
-------------------------
|
||||
|
||||
To create a new :ref:`activity type <activities/types>`, click :guilabel:`New` from the
|
||||
:guilabel:`Activity Types` page, and a blank activity type form loads.
|
||||
|
||||
Enter a :guilabel:`Name` for the activity type at the top of the form, then enter the following
|
||||
information on the form.
|
||||
|
||||
Activity Settings section
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- :guilabel:`Action`: using the drop-down menu, select an action associated with this new activity
|
||||
type. Some actions trigger specific behaviors after an activity is scheduled, such as:
|
||||
|
||||
- :guilabel:`Upload Document`: if selected, a link to upload a document is automatically added to
|
||||
the planned activity in the chatter.
|
||||
- :guilabel:`Call` or :guilabel:`Meeting`: if selected, users have the option to open their
|
||||
calendar to select a date and time for the activity.
|
||||
- :guilabel:`Request Signature`: if selected, a link to open a signature request pop-up window is
|
||||
automatically added to the planned activity in the chatter. This requires the Odoo *Sign*
|
||||
application to be installed.
|
||||
|
||||
.. note::
|
||||
Available activity types vary based on the installed applications in the database.
|
||||
|
||||
- :guilabel:`Folder`: select a specific :ref:`workspace <documents/workspaces>` folder to save a
|
||||
document to. This field **only** appears if :guilabel:`Upload Document` is selected for the
|
||||
:guilabel:`Action`.
|
||||
|
||||
Using the drop-down menu, select the :guilabel:`Folder` the document is saved to.
|
||||
|
||||
- :guilabel:`Default User`: select a user from the drop-down menu to automatically assign this
|
||||
activity to the selected user when this activity type is scheduled. If this field is left blank,
|
||||
the activity is assigned to the user who creates the activity.
|
||||
- :guilabel:`Default Summary`: enter a note to include whenever this activity type is created.
|
||||
|
||||
.. note::
|
||||
The information in the :guilabel:`Default User` and :guilabel:`Default Summary` fields are
|
||||
included when an activity is created. However, they can be altered before the activity is
|
||||
scheduled or saved.
|
||||
|
||||
- :guilabel:`Keep Done`: tick this checkbox to keep activities that have been marked as `Done`
|
||||
visible in the :ref:`activity view <activities/activity>`.
|
||||
- :guilabel:`Default Note`: enter any notes to appear with the activity.
|
||||
|
||||
Next Activity section
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It is possible to have another activity either suggested or triggered. To do so, configure the
|
||||
:guilabel:`Next Activity` section.
|
||||
|
||||
- :guilabel:`Chaining Type`: select either :guilabel:`Suggest Next Activity` or :guilabel:`Trigger
|
||||
Next Activity` from the drop-down menu. Depending on the selected option, either the
|
||||
:guilabel:`Suggest` or :guilabel:`Trigger` field is displayed.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Chaining Type` field does **not** appear if :guilabel:`Upload Document` is
|
||||
selected for the :guilabel:`Action`.
|
||||
|
||||
- :guilabel:`Suggest/Trigger`: depending on what is selected for the :guilabel:`Chaining Type`, this
|
||||
field either displays :guilabel:`Suggest` or :guilabel:`Trigger`. Using the drop-down menu, select
|
||||
the activity to recommend or schedule as a follow-up task to the activity type.
|
||||
- :guilabel:`Schedule`: configure when the next activity is suggested or triggered.
|
||||
|
||||
First, enter a numerical value indicating when the activity is suggested or triggered.
|
||||
|
||||
Next to this field, a :guilabel:`Days` field is visible. Click :guilabel:`Days`, the default
|
||||
option, to reveal a drop-down menu. Select the desired time-frame option from the list. The
|
||||
options are :guilabel:`Days`, :guilabel:`Weeks`, or :guilabel:`Months`.
|
||||
|
||||
Lastly, using the drop-down menu, select whether the activity is scheduled or triggered either
|
||||
:guilabel:`after previous activity deadline` or :guilabel:`after completion date`.
|
||||
|
||||
.. image:: activities/new-activity.png
|
||||
:align: center
|
||||
:alt: A new Activity form with all the fields filled out.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../productivity/discuss`
|
||||
- :doc:`../productivity/discuss/team_communication`
|
||||
- :doc:`../sales/crm/optimize/utilize_activities`
|
Before ![]() (image error) Size: 26 KiB |
Before ![]() (image error) Size: 5.6 KiB |
Before ![]() (image error) Size: 18 KiB |
Before ![]() (image error) Size: 30 KiB |
Before ![]() (image error) Size: 24 KiB |
Before ![]() (image error) Size: 21 KiB |
Before ![]() (image error) Size: 21 KiB |
Before ![]() (image error) Size: 32 KiB |
Before ![]() (image error) Size: 26 KiB |
Before ![]() (image error) Size: 15 KiB |
Before ![]() (image error) Size: 26 KiB |
@ -1,263 +0,0 @@
|
||||
:show-content:
|
||||
|
||||
========
|
||||
Contacts
|
||||
========
|
||||
|
||||
Contacts are created in the **Contacts** application for customers the company does business with
|
||||
through Odoo. A contact is a repository of vital business information, facilitating communication
|
||||
and business transactions.
|
||||
|
||||
Contact form
|
||||
============
|
||||
|
||||
To create a new contact, navigate to the :menuselection:`Contacts app`, and click
|
||||
:guilabel:`Create`. A new form appears where various contact information can be added.
|
||||
|
||||
Contact type
|
||||
------------
|
||||
|
||||
Odoo allows for both :guilabel:`Individual` and :guilabel:`Company` contacts. Select either
|
||||
:guilabel:`Individual` or :guilabel:`Company`, depending on the type of contact that is being added.
|
||||
|
||||
Name
|
||||
----
|
||||
|
||||
First, fill in the name of the :guilabel:`Individual` or :guilabel:`Company`. This is how the name
|
||||
appears throughout the database. This field is **mandatory**.
|
||||
|
||||
.. tip::
|
||||
:guilabel:`Individual` contacts can have a :guilabel:`Company` contact linked to it. After
|
||||
selecting :guilabel:`Individual`, a new :guilabel:`Company Name...` field appears below the
|
||||
first name field.
|
||||
|
||||
Address
|
||||
-------
|
||||
|
||||
Next, enter the :guilabel:`Address` of the :guilabel:`Company` or :guilabel:`Individual`.
|
||||
|
||||
.. tip::
|
||||
If the :guilabel:`Individual` option is chosen, then the *type of address* can be chosen from a
|
||||
drop-down menu. Options for this drop-down menu include: :guilabel:`Contact`, :guilabel:`Invoice
|
||||
Address`, :guilabel:`Delivery Address`, :guilabel:`Other Address`, and :guilabel:`Private
|
||||
Address`.
|
||||
|
||||
Additional fields
|
||||
-----------------
|
||||
|
||||
Additional details are included on the initial form. The following fields are available:
|
||||
|
||||
- :guilabel:`VAT`: Value Added Tax number.
|
||||
- :guilabel:`Citizen Identification`: citizen or government identification number (only available
|
||||
on :guilabel:`Individual`).
|
||||
- :guilabel:`Job Position`: list the job position of the :guilabel:`Individual` (only available on
|
||||
:guilabel:`Individual`).
|
||||
- :guilabel:`Phone`: list phone number (with country code). Make a call, send an SMS, or WhatsApp
|
||||
message by hovering over the field on the saved form, and clicking the desired option.
|
||||
- :guilabel:`Mobile`: list mobile phone number (with country code). Make a call, send an SMS, or
|
||||
WhatsApp message by hovering over the field on the saved form, and clicking on the desired option.
|
||||
- :guilabel:`Email`: enter the email address with the domain.
|
||||
- :guilabel:`Website`: enter the full website address, starting with `http` or `https`.
|
||||
- :guilabel:`Title`: select :guilabel:`Doctor`, :guilabel:`Madam`, :guilabel:`Miss`,
|
||||
:guilabel:`Mister`, :guilabel:`Professor`, or create a new one directly from this field.
|
||||
- :guilabel:`Tags`: enter preconfigured tags by typing them in the field, or clicking the drop-down
|
||||
menu, and selecting one. To create a new one, type the new tag in the field, and click
|
||||
:guilabel:`Create` from the resulting drop-down menu.
|
||||
|
||||
Contacts & Addresses tab
|
||||
------------------------
|
||||
|
||||
At the bottom of the contact form are several tabs. On the :guilabel:`Contacts & Addresses` tab,
|
||||
contacts can be added that are associated with a :guilabel:`Company` and related addresses. For
|
||||
example, a specific contact person for the company can be listed here.
|
||||
|
||||
Multiple addresses can be added on both :guilabel:`Individual` and :guilabel:`Company` contacts. To
|
||||
do so, click :guilabel:`Add` in the :guilabel:`Contacts & Addresses` tab. Doing so reveals a
|
||||
:guilabel:`Create Contact` pop-up form, in which additional addresses can be configured.
|
||||
|
||||
.. image:: contacts/contact-form-add-address.png
|
||||
:align: center
|
||||
:alt: Add a contact/address to the contact form.
|
||||
|
||||
On the :guilabel:`Create Contact` pop-up form, start by clicking the default :guilabel:`Other
|
||||
Address` field at the top to reveal a drop-down menu of address-related options.
|
||||
|
||||
Select any of the following options:
|
||||
|
||||
- :guilabel:`Contact`: adds another contact to the existing contact form.
|
||||
- :guilabel:`Invoice Address`: adds a specific invoice address to the existing contact form.
|
||||
- :guilabel:`Delivery Address`: adds a specific delivery address to the existing contact form.
|
||||
- :guilabel:`Other Address`: adds an alternate address to the existing contact form.
|
||||
- :guilabel:`Private Address`: adds a private address to the existing contact form.
|
||||
|
||||
.. image:: contacts/create-contact-window.png
|
||||
:align: center
|
||||
:alt: Create a new contact/address on a contact form.
|
||||
|
||||
Once an option is selected, enter the corresponding contact information that should be used for the
|
||||
specified address type.
|
||||
|
||||
Add the :guilabel:`Contact Name`, :guilabel:`Address`, :guilabel:`Email`, along with the
|
||||
:guilabel:`Phone` and/or :guilabel:`Mobile` numbers below.
|
||||
|
||||
Set the :guilabel:`Job Position`, which appears if the :guilabel:`Contact` address type has been
|
||||
selected. This is similar to the :guilabel:`Individual` contact.
|
||||
|
||||
To add a note, click on the text field next to :guilabel:`Notes`, and write anything that is
|
||||
applicable to the customer or contact.
|
||||
|
||||
Then, click :guilabel:`Save & Close` to save the address, and close the :guilabel:`Create Contact`
|
||||
window. Or, click :guilabel:`Save & New` to save the address, and immediately input another one.
|
||||
|
||||
Sales & Purchase tab
|
||||
--------------------
|
||||
|
||||
Next, is the :guilabel:`Sales & Purchases` tab, which only appears when the *Sales*, *Purchase*,
|
||||
**or** *Point of Sale* applications are installed.
|
||||
|
||||
The :guilabel:`Fiscal Position` can be set on the :guilabel:`Sales & Purchases` tab. Select a
|
||||
:guilabel:`Fiscal Position` from the drop-down menu.
|
||||
|
||||
Sales section
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Under the :guilabel:`Sales` heading, a specific :guilabel:`Salesperson` can be assigned to a
|
||||
contact. To do that, click the :guilabel:`Salesperson` drop-down field, and select one. Create a new
|
||||
:guilabel:`Salesperson` by typing the user's name, and making the appropriate selection.
|
||||
|
||||
Certain :guilabel:`Payment Terms`, or a certain :guilabel:`Pricelist`, can also be set, if needed.
|
||||
Click the drop-down menu next to :guilabel:`Payment Terms`, and change it to one of the preselected
|
||||
:guilabel:`Payment Terms`, or :guilabel:`Create` a new one. Select the :guilabel:`Pricelist`
|
||||
drop-down menu to choose the appropriate :guilabel:`Pricelist`.
|
||||
|
||||
Click into the :guilabel:`Delivery Method` field to select an option from the drop-down menu.
|
||||
|
||||
Point Of Sale section
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Under the :guilabel:`Point Of Sale` heading, enter a :guilabel:`Barcode` that can be used to
|
||||
identify the contact. Use the :guilabel:`Loyalty Points` field to track points the user won as part
|
||||
of a *Loyalty Program*.
|
||||
|
||||
Purchase section
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Specify :guilabel:`Payment Terms`, :guilabel:`1099 Box` information, and a preferred
|
||||
:guilabel:`Payment Method` here. A :guilabel:`Receipt Reminder` can be set here, as well.
|
||||
|
||||
Misc section
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Under the :guilabel:`Misc.` heading, use :guilabel:`Reference` field to add any additional
|
||||
information for this contact. If this contact should only be accessible for one company in a
|
||||
multi-company database, select it from the :guilabel:`Company` field drop-down list. Use the
|
||||
:guilabel:`Website` drop-down menu to restrict the publishing of this contact to one website (if
|
||||
working on a database with multiple websites). Select one or more :guilabel:`Website Tags` to assist
|
||||
in filtering published customers on the `/customers` website page. Select an :guilabel:`Industry`
|
||||
for this contact from the drop-down menu. Use the :guilabel:`SLA Policies` field to assign a
|
||||
*Helpdesk* SLA policy to this contact.
|
||||
|
||||
Accounting tab
|
||||
--------------
|
||||
|
||||
The :guilabel:`Accounting` tab appears when the *Accounting* application is installed. Here, a user
|
||||
can add any related :guilabel:`Bank Accounts`, or set default :guilabel:`Accounting entries`.
|
||||
|
||||
Under the :guilabel:`Miscellaneous` heading, use the :guilabel:`LEI` field to enter a Legal Entity
|
||||
Identifier, if necessary.
|
||||
|
||||
Internal Notes tab
|
||||
------------------
|
||||
|
||||
Following the :guilabel:`Accounting` tab is the :guilabel:`Internal Notes` tab, where notes can be
|
||||
left on this contact form, just like on the contact form noted above.
|
||||
|
||||
Partner Assignment tab
|
||||
----------------------
|
||||
|
||||
Next is the :guilabel:`Partner Assignment` tab, which by default, includes a :guilabel:`Geolocation`
|
||||
section, and other partner options, including :guilabel:`Partner Activation` and :guilabel:`Partner
|
||||
Review` configurations. These are **only** present when the *Resellers* module is installed.
|
||||
|
||||
.. seealso::
|
||||
Follow the :doc:`Resellers documentation <../sales/crm/track_leads/resellers>` for more
|
||||
information on publishing partners on the website.
|
||||
|
||||
Membership tab
|
||||
--------------
|
||||
|
||||
Finally, there is the :guilabel:`Membership` tab on contact forms, which can help users manage any
|
||||
memberships that are being offered to this specific contact. It should be noted that this tab
|
||||
**only** appears when the *Members* application is installed.
|
||||
|
||||
Activate membership
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To activate a contact's membership, click :guilabel:`Buy Membership` in the :guilabel:`Membership`
|
||||
tab of a contact form. On the pop-up window that appears, select a :guilabel:`Membership` from the
|
||||
drop-down menu. Then, configure a :guilabel:`Member Price`. Click :guilabel:`Invoice Membership`
|
||||
when both fields are filled in.
|
||||
|
||||
Alternatively, to offer a free membership, tick the :guilabel:`Free Member` checkbox, in the
|
||||
:guilabel:`Membership` tab of a contact form.
|
||||
|
||||
.. seealso::
|
||||
Follow the :doc:`Members documentation <../sales/members>` for more information on publishing
|
||||
members on the website.
|
||||
|
||||
Smart buttons
|
||||
=============
|
||||
|
||||
At the top of the contact form, there are some additional options available, known as *smart
|
||||
buttons*.
|
||||
|
||||
Here, Odoo displays a variety of records, related to this contact, that were created on other apps.
|
||||
Odoo integrates information from every single app, so there are many smart buttons.
|
||||
|
||||
.. example::
|
||||
For example, there is an :guilabel:`Opportunities` smart button, where all the opportunities
|
||||
related to this customer from the *CRM* app are accessible.
|
||||
|
||||
.. tip::
|
||||
If the corresponding applications are installed, their related smart buttons appear
|
||||
automatically on a contact form.
|
||||
|
||||
A user can see any :guilabel:`Meetings`, :guilabel:`Sales`, :guilabel:`POS Orders`,
|
||||
:guilabel:`Subscriptions`, project :guilabel:`Tasks`, and the :guilabel:`More` smart button reveals
|
||||
additional options, via a drop-down menu. A user can even quickly access :guilabel:`Purchases`,
|
||||
:guilabel:`Helpdesk` tasks, :guilabel:`On-time Rate` for deliveries, :guilabel:`Invoiced`
|
||||
information, :guilabel:`Vendor Bills`, and the :guilabel:`Partner Ledger` connected to this contact.
|
||||
|
||||
Deliveries, documents, loyalty cards, and direct debits are *also* linked to smart buttons, like
|
||||
this, should there be any outstanding/on-file for this contact.
|
||||
|
||||
If the contact is a partner, the user can visit their partner page on the Odoo-built website by
|
||||
clicking the :guilabel:`Go to Website` smart button.
|
||||
|
||||
Archive contacts
|
||||
----------------
|
||||
|
||||
If a user decides they no longer want to have this contact active, the record can be archived. To do
|
||||
that, go to the :icon:`fa-cog` :guilabel:`Action` menu at the top of the contact form, and click
|
||||
:guilabel:`Archive`.
|
||||
|
||||
Then, click :guilabel:`OK` from the resulting :guilabel:`Confirmation` pop-up window.
|
||||
|
||||
With this contact successfully archived, as indicated by a banner at the top, they do not show up
|
||||
in the main contacts page, but they can still be searched for with the :guilabel:`Archived` filter.
|
||||
|
||||
.. tip::
|
||||
A contact can be *unarchived*, if the user decides to work with them again. To do that, just
|
||||
click the :icon:`fa-cog` :guilabel:`Action` menu again at the top of the archived contact form,
|
||||
and click :guilabel:`Unarchive`. Upon doing so, the :guilabel:`Archived` banner is removed, and
|
||||
the contact is restored.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Add different addresses in CRM <../sales/sales/send_quotations/different_addresses>`
|
||||
- `Odoo's eLearning Contacts tutorial
|
||||
<https://www.odoo.com/slides/slide/contacts-2527?fullscreen=1>`_
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
contacts/merge
|
Before ![]() (image error) Size: 28 KiB |
Before ![]() (image error) Size: 14 KiB |
@ -1,78 +0,0 @@
|
||||
==============
|
||||
Merge contacts
|
||||
==============
|
||||
|
||||
Odoo's *Contacts* application allows user's to merge duplicate contacts, without losing any
|
||||
information in the process. This keeps the database organized, and prevents contacts from being
|
||||
contacted by more than one salesperson.
|
||||
|
||||
.. _contacts/merge-duplicate:
|
||||
|
||||
Merge duplicate contacts
|
||||
========================
|
||||
|
||||
.. danger::
|
||||
Merging is an irreversible action. Do **not** merge contacts unless absolutely certain they
|
||||
should be combined.
|
||||
|
||||
Navigate to the :menuselection:`Contacts app`, and select the :icon:`oi-view-list`
|
||||
:guilabel:`(list)` icon. Select two or more duplicate contacts from the list, and tick the checkbox
|
||||
(on the far-left) for the contacts that should be merged. Then, click the :icon:`fa-cog`
|
||||
:guilabel:`Actions` icon, and select :guilabel:`Merge` from the resulting drop-down menu.
|
||||
|
||||
.. image:: merge/merge-menu.png
|
||||
:align: center
|
||||
:alt: The merge contacts option in the Contacts application.
|
||||
|
||||
This opens the :guilabel:`Merge` pop-up window. From here, review the details of the contacts before
|
||||
confirming they should be merged. If any contacts in the list should **not** be merged, click the
|
||||
:icon:`fa-times` :guilabel:`(delete)` icon at the far right of the contact.
|
||||
|
||||
.. tip::
|
||||
Click the individual contact to open the record for that contact, and view additional
|
||||
information.
|
||||
|
||||
.. image:: merge/merge-window.png
|
||||
:align: center
|
||||
:alt: The merge pop-up window in the Contacts application.
|
||||
|
||||
Click the :guilabel:`Destination Contact` field, and select an option from the drop-down list. This
|
||||
field defaults to the contact record that was created first in the system.
|
||||
|
||||
After confirming the information on the pop-up window, click :guilabel:`Merge Contacts`.
|
||||
|
||||
Deduplicate contacts
|
||||
====================
|
||||
|
||||
After the merge is finished, a pop-up window appears confirming it is complete. This pop-up window
|
||||
also contains a :guilabel:`Deduplicate the other Contacts` button. This feature searches for
|
||||
duplicated records, based on selected criteria, and merges them automatically, or after manual
|
||||
approval.
|
||||
|
||||
Click the :guilabel:`Deduplicate the other Contacts` button to open the :guilabel:`Deduplicate
|
||||
Contacts` pop-up window.
|
||||
|
||||
Select one or more fields to be used in the search for duplicated records. Duplicated contacts can
|
||||
be searched, based on the following criteria:
|
||||
|
||||
- :guilabel:`Email`
|
||||
- :guilabel:`Name`
|
||||
- :guilabel:`Is Company`
|
||||
- :guilabel:`VAT`
|
||||
- :guilabel:`Parent Company`
|
||||
|
||||
.. note::
|
||||
If more than one field is selected, only records that have **all** fields in common are suggested
|
||||
as duplicates.
|
||||
|
||||
If necessary, select criteria to be used to exclude potential duplicates from the search. Potential
|
||||
duplicates can be excluded from the search, based on the following criteria:
|
||||
|
||||
- :guilabel:`A user associated to the contact`
|
||||
- :guilabel:`Journal Items associated to the contact`
|
||||
|
||||
After confirming the search criteria, click either :guilabel:`Merge with Manual Check`,
|
||||
:guilabel:`Merge Automatically`, or :guilabel:`Merge Automatically all process`.
|
||||
|
||||
If :guilabel:`Merge with Manual Check` is selected, complete the merge by following the :ref:`steps
|
||||
above <contacts/merge-duplicate>`.
|
Before ![]() (image error) Size: 25 KiB |
Before ![]() (image error) Size: 20 KiB |
@ -1,549 +0,0 @@
|
||||
======================
|
||||
Export and import data
|
||||
======================
|
||||
|
||||
.. |list| replace:: :icon:`oi-view-list` :guilabel:`(list)` icon
|
||||
.. |actions| replace:: :icon:`fa-cog` :guilabel:`Actions`
|
||||
|
||||
In Odoo, it is sometimes necessary to export or import data for running reports, or for data
|
||||
modification. This document covers the export and import of data into and out of Odoo.
|
||||
|
||||
.. important::
|
||||
Sometimes, users run into a 'time out' error, or a record does not process, due to its size. This
|
||||
can occur with large exports, or in cases where the import file is too large. To circumvent this
|
||||
limitation surrounding the size of the records, process exports or imports in smaller batches.
|
||||
|
||||
.. _export-data:
|
||||
|
||||
Export data from Odoo
|
||||
=====================
|
||||
|
||||
When working with a database, it is sometimes necessary to export data in a distinct file. Doing so
|
||||
can aid in reporting on activities, although, Odoo provides a precise and easy reporting tool with
|
||||
each available application.
|
||||
|
||||
With Odoo, the values can be exported from any field in any record. To do so, activate the list view
|
||||
(|list|), on the items that need to be exported, then select the records that should be exported. To
|
||||
select a record, tick the checkbox next to the corresponding record. Finally, click on |actions|,
|
||||
then :guilabel:`Export`.
|
||||
|
||||
.. image:: export_import_data/list-view-export.png
|
||||
:alt: View of the different things to enable/click to export data.
|
||||
|
||||
When clicking on :guilabel:`Export`, an :guilabel:`Export Data` pop-over window appears, with
|
||||
several options for the data to export:
|
||||
|
||||
.. image:: export_import_data/export-data-overview.png
|
||||
:alt: Overview of options to consider when exporting data in Odoo.
|
||||
|
||||
#. With the :guilabel:`I want to update data (import-compatable export)` option ticked, the system
|
||||
only shows the fields that can be imported. This is helpful in the case where the :ref:`existing
|
||||
records need to be updated <essentials/update-data>`. This works like a filter. Leaving the box
|
||||
unticked, gives many more field options because it shows all the fields, not just the ones that
|
||||
can be imported.
|
||||
#. When exporting, there is the option to export in two formats: `.csv` and `.xls`. With `.csv`,
|
||||
items are separated by a comma, while `.xls` holds information about all the worksheets in a
|
||||
file, including both content and formatting.
|
||||
#. These are the items that can be exported. Use the :guilabel:`> (right arrow)` icon to display
|
||||
more sub-field options. Use the :guilabel:`Search` bar to find specific fields. To use the
|
||||
:guilabel:`Search` option more efficiently, click on all the :guilabel:`> (right arrows)` to
|
||||
display all fields.
|
||||
#. The :guilabel:`+ (plus sign)` icon button is present to add fields to the :guilabel:`Fields to
|
||||
export` list.
|
||||
#. The :guilabel:`↕️ (up-down arrow)` to the left of the selected fields can be used to move the
|
||||
fields up and down, to change the order in which they are displayed in the exported file.
|
||||
Drag-and-drop using the :guilabel:`↕️ (up-down arrow)` icon.
|
||||
#. The :guilabel:`🗑️ (trash can)` icon is used to remove fields. Click on the :guilabel:`🗑️ (trash
|
||||
can)` icon to remove the field.
|
||||
#. For recurring reports, it is helpful to save export presets. Select all the needed fields, and
|
||||
click on the template drop-down menu. Once there, click on :guilabel:`New template`, and give a
|
||||
unique name to the export just created. Click the :guilabel:`💾 (floppy drive)` icon to save the
|
||||
configuration. The next time the same list needs to be exported, select the related template that
|
||||
was previously saved from the drop-down menu.
|
||||
|
||||
.. tip::
|
||||
It is helpful to know the field's external identifier. For example, :guilabel:`Related Company`
|
||||
in the export user interface is equal to *parent_id* (external identifier). This is helpful
|
||||
because then, the only data exported is what should be modified and re-imported.
|
||||
|
||||
.. _import-data:
|
||||
|
||||
Import data into Odoo
|
||||
=====================
|
||||
|
||||
Importing data into Odoo is extremely helpful during implementation, or in times where data needs to
|
||||
be :ref:`updated in bulk <essentials/update-data>`. The following documentation covers how to import
|
||||
data into an Odoo database.
|
||||
|
||||
.. warning::
|
||||
Imports are permanent and **cannot** be undone. However, it is possible to use filters (`created
|
||||
on` or `last modified`) to identify records changed or created by the import.
|
||||
|
||||
.. tip::
|
||||
Activating :ref:`developer mode <developer-mode>` changes the visible import settings in the left
|
||||
menu. Doing so reveals an :menuselection:`Advanced` menu. Included in this advanced menu are two
|
||||
options: :guilabel:`Track history during import` and :guilabel:`Allow matching with subfields`.
|
||||
|
||||
.. image:: export_import_data/advanced-import.png
|
||||
:alt: Advanced import options when developer mode is activated.
|
||||
|
||||
If the model uses openchatter, the :guilabel:`Track history during import` option sets up
|
||||
subscriptions and sends notifications during the import, but leads to a slower import.
|
||||
|
||||
Should the :guilabel:`Allow matching with subfields` option be selected, then all subfields
|
||||
within a field are used to match under the :guilabel:`Odoo Field` while importing.
|
||||
|
||||
.. _essentials/export_import_data/get-started:
|
||||
|
||||
Get started
|
||||
-----------
|
||||
|
||||
Data can be imported on any Odoo business object using either Excel (`.xlsx`) or :abbr:`CSV
|
||||
(Comma-separated Values)` (`.csv`) formats. This includes: contacts, products, bank statements,
|
||||
journal entries, and orders.
|
||||
|
||||
Open the view of the object to which the data should be imported/populated, click the :icon:`fa-cog`
|
||||
(:guilabel:`gear`) icon and select :guilabel:`Import records`.
|
||||
|
||||
.. image:: export_import_data/import-button.png
|
||||
:alt: Action menu revealed with the import records option highlighted.
|
||||
|
||||
Click :icon:`fa-download`:guilabel:`Import Template for Customers` at the center of the page to
|
||||
download a :ref:`template <essentials/export_import_data/adapt-a-template>` and populate it with
|
||||
the company's own data. Such templates can be imported in one click since the data mapping is
|
||||
already preconfigured.
|
||||
|
||||
To upload the downloaded template or your own file, follow the next steps:
|
||||
|
||||
#. Click :guilabel:`Upload Data File` and select the desired file.
|
||||
#. Adjust the :guilabel:`Formatting` options as needed (for CSV files only).
|
||||
#. Ensure all data in the :guilabel:`File Column` is correctly mapped to the appropriate
|
||||
:guilabel:`Odoo Field` and free of errors.
|
||||
#. (Optional) Click :guilabel:`Load Data File` to reload the same file or upload a different one.
|
||||
#. Click :guilabel:`Test` to verify that the data is valid.
|
||||
#. Click :guilabel:`Import`.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Formatting` options do **not** appear when importing the proprietary Excel file
|
||||
type (i.e., `.xls` or `.xlsx`).
|
||||
|
||||
.. _essentials/export_import_data/adapt-a-template:
|
||||
|
||||
Adapt a template
|
||||
----------------
|
||||
|
||||
Import templates are provided in the import tool of the most common data to import (contacts,
|
||||
products, bank statements, etc.). Open them with any spreadsheet software (*Microsoft Office*,
|
||||
*OpenOffice*, *Google Drive*, etc.).
|
||||
|
||||
Once the template is downloaded, proceed to follow these steps:
|
||||
|
||||
- Add, remove, and sort columns to best fit the data structure.
|
||||
- It is strongly advised to **not** remove the :guilabel:`External ID` (ID) column (see why in the
|
||||
next section).
|
||||
- Set a unique ID to every record by dragging down the ID sequencing in the :guilabel:`External ID`
|
||||
(ID) column.
|
||||
|
||||
.. image:: export_import_data/dragdown.gif
|
||||
:alt: An animation of the mouse dragging down the ID column, so each record has a unique ID.
|
||||
|
||||
.. note::
|
||||
When a new column is added, Odoo may not be able to map it automatically, if its label does not
|
||||
fit any field within Odoo. However, new columns can be mapped manually when the import is tested.
|
||||
Search the drop-down menu for the corresponding field.
|
||||
|
||||
.. image:: export_import_data/field_list.png
|
||||
:alt: Drop-down menu expanded in the initial import screen on Odoo.
|
||||
|
||||
Then, use this field's label in the import file to ensure future imports are successful.
|
||||
|
||||
.. tip::
|
||||
Another useful way to find out the proper column names to import is to export a sample file
|
||||
using the fields that should be imported. This way, if there is not a sample import template,
|
||||
the names are accurate.
|
||||
|
||||
|
||||
.. _essentials/external-id:
|
||||
|
||||
Import from another application
|
||||
-------------------------------
|
||||
|
||||
The :guilabel:`External ID` (ID) is a unique identifier for the line item. Feel free to use one
|
||||
from previous software to facilitate the transition to Odoo.
|
||||
|
||||
Setting an ID is not mandatory when importing, but it helps in many cases:
|
||||
|
||||
- :ref:`Update imports <essentials/update-data>`: import the same file several times without
|
||||
creating duplicates.
|
||||
- :ref:`Import relation fields <export_import_data/relation-fields>`.
|
||||
|
||||
To recreate relationships between different records, the unique identifier from the original
|
||||
application should be used to map it to the :guilabel:`External ID` (ID) column in Odoo.
|
||||
|
||||
When another record is imported that links to the first one, use **XXX/ID** (XXX/External ID) for
|
||||
the original unique identifier. This record can also be found using its name.
|
||||
|
||||
.. warning::
|
||||
It should be noted that conflicts occur if two (or more) records have the same *External ID*.
|
||||
|
||||
Field missing to map column
|
||||
---------------------------
|
||||
|
||||
Odoo heuristically tries to find the type of field for each column inside the imported file, based
|
||||
on the first ten lines of the files.
|
||||
|
||||
For example, if there is a column only containing numbers, only the fields with the *integer* type
|
||||
are presented as options.
|
||||
|
||||
While this behavior might be beneficial in most cases, it is also possible that it could fail, or
|
||||
the column may be mapped to a field that is not proposed by default.
|
||||
|
||||
If this happens, check the :guilabel:`Show fields of relation fields (advanced) option`, then a
|
||||
complete list of fields becomes available for each column.
|
||||
|
||||
.. image:: export_import_data/field_list.png
|
||||
:alt: Searching for the field to match the tax column.
|
||||
|
||||
Change data import format
|
||||
-------------------------
|
||||
|
||||
.. note::
|
||||
Odoo can automatically detect if a column is a date, and tries to guess the date format from a
|
||||
set of most commonly used date formats. While this process can work for many date formats, some
|
||||
date formats are not recognizable. This can cause confusion, due to day-month inversions; it is
|
||||
difficult to guess which part of a date format is the day, and which part is the month, in a
|
||||
date, such as `01-03-2016`.
|
||||
|
||||
When importing a :abbr:`CSV (Comma-separated Values)` file, Odoo provides :guilabel:`Formatting`
|
||||
options.
|
||||
|
||||
To view which date format Odoo has found from the file, check the :guilabel:`Date Format` that is
|
||||
shown when clicking on options under the file selector. If this format is incorrect, change it to
|
||||
the preferred format using *ISO 8601* to define the format.
|
||||
|
||||
.. important::
|
||||
*ISO 8601* is an international standard, covering the worldwide exchange, along with the
|
||||
communication of date and time-related data. For example, the date format should be `YYYY-MM-DD`.
|
||||
So, in the case of July 24th 1981, it should be written as `1981-07-24`.
|
||||
|
||||
.. tip::
|
||||
When importing Excel files (`.xls`, `.xlsx`), consider using *date cells* to store dates. This
|
||||
maintains locale date formats for display, regardless of how the date is formatted in Odoo. When
|
||||
importing a :abbr:`CSV (Comma-separated Values)` file, use Odoo's :guilabel:`Formatting` section
|
||||
to select the date format columns to import.
|
||||
|
||||
Import numbers with currency signs
|
||||
----------------------------------
|
||||
|
||||
Odoo fully supports numbers with parenthesis to represent negative signs, as well as numbers with
|
||||
currency signs attached to them. Odoo also automatically detects which thousand/decimal separator is
|
||||
used. If a currency symbol unknown to Odoo is used, it might not be recognized as a number, and the
|
||||
import crashes.
|
||||
|
||||
.. note::
|
||||
When importing a :abbr:`CSV (Comma-separated Values)` file, the :guilabel:`Formatting` menu
|
||||
appears on the left-hand column. Under these options, the :guilabel:`Thousands Separator` can be
|
||||
changed.
|
||||
|
||||
Examples of supported numbers (using 'thirty-two thousand' as the figure):
|
||||
|
||||
- 32.000,00
|
||||
- 32000,00
|
||||
- 32,000.00
|
||||
- -32000.00
|
||||
- (32000.00)
|
||||
- $ 32.000,00
|
||||
- (32000.00 €)
|
||||
|
||||
Example that will not work:
|
||||
|
||||
- ABC 32.000,00
|
||||
- $ (32.000,00)
|
||||
|
||||
.. important::
|
||||
A :guilabel:`() (parenthesis)` around the number indicates that the number is a negative value.
|
||||
The currency symbol **must** be placed within the parenthesis for Odoo to recognize it as a
|
||||
negative currency value.
|
||||
|
||||
Import preview table not displayed correctly
|
||||
--------------------------------------------
|
||||
|
||||
By default, the import preview is set on commas as field separators, and quotation marks as text
|
||||
delimiters. If the :abbr:`CSV (Comma-separated Values)` file does not have these settings, modify
|
||||
the :guilabel:`Formatting` options (displayed under the :guilabel:`Import` :abbr:`CSV
|
||||
(Comma-separated Values)` file bar after selecting the :abbr:`CSV (Comma-separated Values)` file).
|
||||
|
||||
.. important::
|
||||
If the :abbr:`CSV (Comma-separated Values)` file has a tabulation as a separator, Odoo does
|
||||
**not** detect the separations. The file format options need to be modified in the spreadsheet
|
||||
application. See the following :ref:`Change CSV file format <export_import_data/change-csv>`
|
||||
section.
|
||||
|
||||
.. _export_import_data/change-csv:
|
||||
|
||||
Change CSV file format in spreadsheet application
|
||||
-------------------------------------------------
|
||||
|
||||
When editing and saving :abbr:`CSV (Comma-separated Values)` files in spreadsheet applications, the
|
||||
computer's regional settings are applied for the separator and delimiter. Odoo suggests using
|
||||
*OpenOffice* or *LibreOffice*, as both applications allow modifications of all three options (from
|
||||
*LibreOffice* application, go to :menuselection:`'Save As' dialog box --> Check the box 'Edit filter
|
||||
settings' --> Save`).
|
||||
|
||||
Microsoft Excel can modify the encoding when saving (:menuselection:`'Save As' dialog box -->
|
||||
'Tools' drop-down menu --> Encoding tab`).
|
||||
|
||||
Difference between Database ID and External ID
|
||||
----------------------------------------------
|
||||
|
||||
Some fields define a relationship with another object. For example, the country of a contact is a
|
||||
link to a record of the 'Country' object. When such fields are imported, Odoo has to recreate links
|
||||
between the different records. To help import such fields, Odoo provides three mechanisms.
|
||||
|
||||
.. important::
|
||||
**Only one** mechanism should be used per field that is imported.
|
||||
|
||||
For example, to reference the country of a contact, Odoo proposes three different fields to import:
|
||||
|
||||
- :guilabel:`Country`: the name or code of the country
|
||||
- :guilabel:`Country/Database ID`: the unique Odoo ID for a record, defined by the ID PostgreSQL
|
||||
column
|
||||
- :guilabel:`Country/External ID`: the ID of this record referenced in another application (or the
|
||||
`.XML` file that imported it)
|
||||
|
||||
For the country of Belgium, for example, use one of these three ways to import:
|
||||
|
||||
- :guilabel:`Country`: `Belgium`
|
||||
- :guilabel:`Country/Database ID`: `21`
|
||||
- :guilabel:`Country/External ID`: `base.be`
|
||||
|
||||
According to the company's need, use one of these three ways to reference records in relations. Here
|
||||
is an example when one or the other should be used, according to the need:
|
||||
|
||||
- Use :guilabel:`Country`: this is the easiest way when data comes from :abbr:`CSV (Comma-separated
|
||||
Values)` files that have been created manually.
|
||||
- Use :guilabel:`Country/Database ID`: this should rarely be used. It is mostly used by developers
|
||||
as the main advantage is to never have conflicts (there may be several records with the same name,
|
||||
but they always have a unique Database ID)
|
||||
- Use :guilabel:`Country/External ID`: use *External ID* when importing data from a third-party
|
||||
application.
|
||||
|
||||
When *External IDs* are used, import :abbr:`CSV (Comma-separated Values)` files with the
|
||||
:guilabel:`External ID` (ID) column defining the *External ID* of each record that is imported.
|
||||
Then, a reference can be made to that record with columns, like `Field/External ID`. The following
|
||||
two :abbr:`CSV (Comma-separated Values)` files provide an example for products and their categories.
|
||||
|
||||
- :download:`CSV file for categories
|
||||
<export_import_data/External_id_3rd_party_application_product_categories.csv>`
|
||||
- :download:`CSV file for Products
|
||||
<export_import_data/External_id_3rd_party_application_products.csv>`
|
||||
|
||||
.. _export_import_data/relation-fields:
|
||||
|
||||
Import relation fields
|
||||
----------------------
|
||||
|
||||
An Odoo object is always related to many other objects (e.g. a product is linked to product
|
||||
categories, attributes, vendors, etc.). To import those relations, the records of the related object
|
||||
need to be imported first, from their own list menu.
|
||||
|
||||
This can be achieved by using either the name of the related record, or its ID, depending on the
|
||||
circumstances. The ID is expected when two records have the same name. In such a case add `/ ID`
|
||||
at the end of the column title (e.g. for product attributes: `Product Attributes / Attribute / ID`).
|
||||
|
||||
Options for multiple matches on fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If, for example, there are two product categories with the child name `Sellable` (e.g. `Misc.
|
||||
Products/Sellable` & `Other Products/Sellable`), the validation is halted, but the data may still be
|
||||
imported. However, Odoo recommends that the data is not imported because it will all be linked to
|
||||
the first `Sellable` category found in the *Product Category* list (`Misc. Products/Sellable`).
|
||||
Odoo, instead, recommends modifying one of the duplicate's values, or the product category
|
||||
hierarchy.
|
||||
|
||||
However, if the company does not wish to change the configuration of product categories, Odoo
|
||||
recommends making use of the *External ID* for this field, 'Category'.
|
||||
|
||||
Import many2many relationship fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The tags should be separated by a comma, without any spacing. For example, if a customer needs to be
|
||||
linked to both tags: `Manufacturer` and `Retailer` then 'Manufacturer,Retailer' needs to be encoded
|
||||
in the same column of the :abbr:`CSV (Comma-separated Values)` file.
|
||||
|
||||
- :download:`CSV file for Manufacturer, Retailer <export_import_data/m2m_customers_tags.csv>`
|
||||
|
||||
Import one2many relationships
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If a company wants to import a sales order with several order lines, a specific row **must** be
|
||||
reserved in the :abbr:`CSV (Comma-separated Values)` file for each order line. The first order line
|
||||
is imported on the same row as the information relative to order. Any additional lines need an
|
||||
additional row that does not have any information in the fields relative to the order.
|
||||
|
||||
As an example, here is a :abbr:`CSV (Comma-separated Values)` file of some quotations that can be
|
||||
imported, based on demo data:
|
||||
|
||||
- :download:`File for some Quotations
|
||||
<export_import_data/purchase.order_functional_error_line_cant_adpat.csv>`
|
||||
|
||||
The following :abbr:`CSV (Comma-separated Values)` file shows how to import purchase orders with
|
||||
their respective purchase order lines:
|
||||
|
||||
- :download:`Purchase orders with their respective purchase order lines
|
||||
<export_import_data/o2m_purchase_order_lines.csv>`
|
||||
|
||||
The following :abbr:`CSV (Comma-separated Values)` file shows how to import customers and their
|
||||
respective contacts:
|
||||
|
||||
- :download:`Customers and their respective contacts
|
||||
<export_import_data/o2m_customers_contacts.csv>`
|
||||
|
||||
Import image files
|
||||
------------------
|
||||
|
||||
To import image files along with the :ref:`uploaded <essentials/export_import_data/get-started>`
|
||||
CSV or Excel file, follow the next steps:
|
||||
|
||||
#. Add the image file names to the relevant :guilabel:`Image` column in the data file.
|
||||
#. :ref:`Upload the data file <essentials/export_import_data/get-started>` or reload it by
|
||||
clicking :guilabel:`Load Data File`.
|
||||
#. Click :guilabel:`Upload your files` under the :guilabel:`Files to import` section.
|
||||
#. Select the relevant image files. The number of files selected appears next to the button.
|
||||
#. Click :guilabel:`Test` to verify that all data is valid.
|
||||
#. Click :guilabel:`Import`. During the import process, Odoo performs a file check to automatically
|
||||
link the uploaded images to the imported data file. If there is no match, the data file is
|
||||
imported without any image.
|
||||
|
||||
.. note::
|
||||
- The :guilabel:`Files to import` section is enabled if your product template has an
|
||||
:guilabel:`Image` column with all fields populated.
|
||||
- The image file names in the data file must correspond to the uploaded image files.
|
||||
- When importing a large number of images, you can specify the maximum batch size in megabytes
|
||||
and set a delay to prevent the system from becoming overloaded. To do so, :doc:`enable the
|
||||
developer mode <../general/developer_mode>` and fill in the :guilabel:`Max size per
|
||||
batch` and the :guilabel:`Delay after each batch` fields in the :guilabel:`Files to import`
|
||||
section. By default, the delay meets the RPC/API call limit defined in the `Odoo Cloud -
|
||||
Acceptable Use Policy <https://www.odoo.com/acceptable-use>`_.
|
||||
|
||||
Import records several times
|
||||
----------------------------
|
||||
|
||||
If an imported file contains one of the columns: :guilabel:`External ID` or :guilabel:`Database ID`,
|
||||
records that have already been imported are modified, instead of being created. This is extremely
|
||||
useful as it allows users to import the same :abbr:`CSV (Comma-separated Values)` file several
|
||||
times, while having made some changes in between two imports.
|
||||
|
||||
Odoo takes care of creating or modifying each record, depending if it is new or not.
|
||||
|
||||
This feature allows a company to use the *Import/Export tool* in Odoo to modify a batch of records
|
||||
in a spreadsheet application.
|
||||
|
||||
Value not provided for a specific field
|
||||
---------------------------------------
|
||||
|
||||
If all fields are not set in the CSV file, Odoo assigns the default value for every non-defined
|
||||
field. But, if fields are set with empty values in the :abbr:`CSV (Comma-separated Values)` file,
|
||||
Odoo sets the empty value in the field, instead of assigning the default value.
|
||||
|
||||
Export/import different tables from an SQL application to Odoo
|
||||
--------------------------------------------------------------
|
||||
|
||||
If data needs to be imported from different tables, relations need to be recreated between records
|
||||
belonging to different tables. For instance, if companies and people are imported, the link between
|
||||
each person and the company they work for needs to be recreated.
|
||||
|
||||
To manage relations between tables, use the `External ID` facilities of Odoo. The `External ID` of a
|
||||
record is the unique identifier of this record in another application. The `External ID` must be
|
||||
unique across all records of all objects. It is a good practice to prefix this `External ID` with
|
||||
the name of the application or table. (like, 'company_1', 'person_1' - instead of '1')
|
||||
|
||||
As an example, suppose there is an SQL database with two tables that are to be imported: companies
|
||||
and people. Each person belongs to one company, so the link between a person and the company they
|
||||
work for must be recreated.
|
||||
|
||||
Test this example, with a :download:`sample of a PostgreSQL database
|
||||
<export_import_data/database_import_test.sql>`.
|
||||
|
||||
First, export all companies and their *External ID*. In PSQL, write the following command:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
> copy (select 'company_'||id as "External ID",company_name as "Name",'True' as "Is a Company" from companies) TO '/tmp/company.csv' with CSV HEADER;
|
||||
|
||||
This SQL command creates the following :abbr:`CSV (Comma-separated Values)` file:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
External ID,Name,Is a Company
|
||||
company_1,Bigees,True
|
||||
company_2,Organi,True
|
||||
company_3,Boum,True
|
||||
|
||||
To create the :abbr:`CSV (Comma-separated Values)` file for people linked to companies, use the
|
||||
following SQL command in PSQL:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
> copy (select 'person_'||id as "External ID",person_name as "Name",'False' as "Is a Company",'company_'||company_id as "Related Company/External ID" from persons) TO '/tmp/person.csv' with CSV
|
||||
|
||||
It produces the following :abbr:`CSV (Comma-separated Values)` file:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
External ID,Name,Is a Company,Related Company/External ID
|
||||
person_1,Fabien,False,company_1
|
||||
person_2,Laurence,False,company_1
|
||||
person_3,Eric,False,company_2
|
||||
person_4,Ramsy,False,company_3
|
||||
|
||||
In this file, Fabien and Laurence are working for the Bigees company (`company_1`), and Eric is
|
||||
working for the Organi company. The relation between people and companies is done using the
|
||||
*External ID* of the companies. The *External ID* is prefixed by the name of the table to avoid a
|
||||
conflict of ID between people and companies (`person_1` and `company_1`, who shared the same ID 1 in
|
||||
the original database).
|
||||
|
||||
The two files produced are ready to be imported in Odoo without any modifications. After having
|
||||
imported these two :abbr:`CSV (Comma-separated Values)` files, there are four contacts and three
|
||||
companies (the first two contacts are linked to the first company). Keep in mind to first import
|
||||
the companies, and then the people.
|
||||
|
||||
.. _essentials/update-data:
|
||||
|
||||
Update data in Odoo
|
||||
===================
|
||||
|
||||
Existing data can be updated in bulk through a data import, as long as the :ref:`External ID
|
||||
<essentials/external-id>` remains consistent.
|
||||
|
||||
Prepare data export
|
||||
-------------------
|
||||
|
||||
To update data through an import, first navigate to the data to be updated, and select the |list| to
|
||||
activate list view. On the far-left side of the list, tick the checkbox for any record to be
|
||||
updated. Then, click |actions|, and select :icon:`fa-upload` :guilabel:`Export` from the drop-down
|
||||
menu.
|
||||
|
||||
On the resulting :guilabel:`Export Data` pop-up window, tick the checkbox labeled, :guilabel:`I want
|
||||
to update data (import-compatible export)`. This automatically includes the *External ID* in the
|
||||
export. Additionally, it limits the :guilabel:`Fields to export` list to **only** include fields
|
||||
that are able to be imported.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`External ID` field does **not** appear in the :guilabel:`Fields to export` list
|
||||
unless it is manually added, but it is still included in the export. However, if the :guilabel:`I
|
||||
want to update data (import-compatible export)` checkbox is ticked, it is included in the export.
|
||||
|
||||
Select the required fields to be included in the export using the :ref:`options <export-data>` on
|
||||
the pop-up window, then click :guilabel:`Export`.
|
||||
|
||||
Import updated data
|
||||
-------------------
|
||||
|
||||
After exporting, make any necessary changes to the data file. When the file is ready, it can be
|
||||
:ref:`imported <import-data>` by following the same process as a normal data import.
|
||||
|
||||
.. danger::
|
||||
When updating data, it is extremely important that the *External ID* remain consistent, as
|
||||
this is how the system identifies a record. If an ID is altered, or removed, the system may add a
|
||||
duplicate record, instead of updating the existing one.
|
Before ![]() (image error) Size: 3.6 KiB |
@ -1,154 +0,0 @@
|
||||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = off;
|
||||
SET check_function_bodies = false;
|
||||
SET client_min_messages = warning;
|
||||
SET escape_string_warning = off;
|
||||
|
||||
SET search_path = public, pg_catalog;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_with_oids = false;
|
||||
|
||||
--
|
||||
-- Name: companies; Type: TABLE; Schema: public; Owner: fp; Tablespace:
|
||||
--
|
||||
|
||||
CREATE TABLE companies (
|
||||
id integer NOT NULL,
|
||||
company_name character varying
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.companies OWNER TO fp;
|
||||
|
||||
--
|
||||
-- Name: companies_id_seq; Type: SEQUENCE; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
CREATE SEQUENCE companies_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MAXVALUE
|
||||
NO MINVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER TABLE public.companies_id_seq OWNER TO fp;
|
||||
|
||||
--
|
||||
-- Name: companies_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
ALTER SEQUENCE companies_id_seq OWNED BY companies.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: companies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
SELECT pg_catalog.setval('companies_id_seq', 3, true);
|
||||
|
||||
|
||||
--
|
||||
-- Name: persons; Type: TABLE; Schema: public; Owner: fp; Tablespace:
|
||||
--
|
||||
|
||||
CREATE TABLE persons (
|
||||
id integer NOT NULL,
|
||||
company_id integer,
|
||||
person_name character varying
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.persons OWNER TO fp;
|
||||
|
||||
--
|
||||
-- Name: persons_id_seq; Type: SEQUENCE; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
CREATE SEQUENCE persons_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MAXVALUE
|
||||
NO MINVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER TABLE public.persons_id_seq OWNER TO fp;
|
||||
|
||||
--
|
||||
-- Name: persons_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
ALTER SEQUENCE persons_id_seq OWNED BY persons.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: persons_id_seq; Type: SEQUENCE SET; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
SELECT pg_catalog.setval('persons_id_seq', 4, true);
|
||||
|
||||
|
||||
--
|
||||
-- Name: id; Type: DEFAULT; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY companies ALTER COLUMN id SET DEFAULT nextval('companies_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: id; Type: DEFAULT; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY persons ALTER COLUMN id SET DEFAULT nextval('persons_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Data for Name: companies; Type: TABLE DATA; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
COPY companies (id, company_name) FROM stdin;
|
||||
1 Bigees
|
||||
2 Organi
|
||||
3 Boum
|
||||
\.
|
||||
|
||||
|
||||
--
|
||||
-- Data for Name: persons; Type: TABLE DATA; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
COPY persons (id, company_id, person_name) FROM stdin;
|
||||
1 1 Fabien
|
||||
2 1 Laurence
|
||||
3 2 Eric
|
||||
4 3 Ramsy
|
||||
\.
|
||||
|
||||
|
||||
--
|
||||
-- Name: companies_pkey; Type: CONSTRAINT; Schema: public; Owner: fp; Tablespace:
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY companies
|
||||
ADD CONSTRAINT companies_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: persons_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: fp
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY persons
|
||||
ADD CONSTRAINT persons_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);
|
||||
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
Before ![]() (image error) Size: 25 KiB |
Before ![]() (image error) Size: 22 KiB |
Before ![]() (image error) Size: 47 KiB |
@ -1,192 +0,0 @@
|
||||
======================
|
||||
In-app purchases (IAP)
|
||||
======================
|
||||
|
||||
.. |IAP| replace:: :abbr:`IAP (In-app purchases)`
|
||||
|
||||
In-app purchases (IAP) are optional services that enhance Odoo databases. Each service provides its
|
||||
own specific features and functionality. A full list of services is available on the `Odoo IAP
|
||||
Catalog <https://iap.odoo.com/iap/all-in-app-services>`_.
|
||||
|
||||
.. image:: in_app_purchase/iap.png
|
||||
:align: center
|
||||
:alt: The IAP catalog with various services available on IAP.Odoo.com.
|
||||
|
||||
.. example::
|
||||
The :guilabel:`SMS` service sends text messages to contacts directly from the database, and the
|
||||
:guilabel:`Documents Digitization` service digitizes scanned or PDF vendor bills, expenses, and
|
||||
resumes with optical character recognition (OCR) and artificial intelligence (AI).
|
||||
|
||||
|IAP| services do **not** need to be configured or set up before use. Odoo users can simply click on
|
||||
the service in the app to activate it. However, each service requires its own prepaid credits, and
|
||||
when they run out, users **must** :ref:`buy more <iap/buying_credits>` in order to keep using it.
|
||||
|
||||
.. note::
|
||||
Enterprise Odoo users with a valid subscription get free credits to test IAP features before
|
||||
deciding to purchase more credits for the database. This includes demo/training databases,
|
||||
educational databases, and one-app-free databases.
|
||||
|
||||
.. _in_app_purchase/portal:
|
||||
|
||||
IAP services
|
||||
============
|
||||
|
||||
|IAP| services are provided by Odoo, as well as third-parties, and have a wide range of uses.
|
||||
|
||||
The following |IAP| services are offered by Odoo:
|
||||
|
||||
- :guilabel:`Documents Digitization`: digitizes scanned or PDF vendor bills, expenses, and resumes
|
||||
with OCR and AI.
|
||||
- :guilabel:`Partner Autocomplete`: automatically populates contact records with corporate data.
|
||||
- :guilabel:`SMS`: sends SMS text messages to contacts directly from the database.
|
||||
- :guilabel:`Lead Generation`: generates leads based on a set of criteria, and converts web visitors
|
||||
into quality leads and opportunities.
|
||||
- :guilabel:`Snailmail`: sends customer invoices and follow-up reports by post, worldwide.
|
||||
- :guilabel:`Signer identification with itsme®️`: ask document signatories in Odoo *Sign* to provide
|
||||
their identity using the *itsme®* identity platform, which is available in Belgium and the
|
||||
Netherlands.
|
||||
|
||||
For more information on every service currently available (offered from developers other than Odoo),
|
||||
visit the `Odoo IAP Catalog <https://iap.odoo.com/iap/all-in-app-services>`_.
|
||||
|
||||
Use IAP services
|
||||
----------------
|
||||
|
||||
|IAP| services are automatically integrated with Odoo, and do **not** require users to configure any
|
||||
settings. To use a service, simply interact with it wherever it appears in the database.
|
||||
|
||||
.. example::
|
||||
The following flow focuses on the *SMS* |IAP| service being used from a contact's record.
|
||||
|
||||
This can be done by clicking the :guilabel:`📱 SMS` icon within the database.
|
||||
|
||||
.. image:: in_app_purchase/sms-icon.png
|
||||
:align: center
|
||||
:alt: The SMS icon on a typical contact information form located within an Odoo database.
|
||||
|
||||
One way to utilize the *SMS* |IAP| service with Odoo is showcased in the following steps:
|
||||
|
||||
First, navigate to the :menuselection:`Contacts application`, and click on a contact with a
|
||||
mobile phone number entered in either the :guilabel:`Phone` or :guilabel:`Mobile` field of the
|
||||
contact form.
|
||||
|
||||
Next, find the :guilabel:`📱 SMS` icon that appears to the right of the :guilabel:`Phone` or
|
||||
:guilabel:`Mobile` fields. Click the :guilabel:`📱 SMS` icon, and a :guilabel:`Send SMS Text
|
||||
Message` pop-up window appears.
|
||||
|
||||
Type a message in the :guilabel:`Message` field of the pop-up window. Then, click the
|
||||
:guilabel:`Send SMS` button. Odoo then sends the message, via SMS, to the contact, and logs what
|
||||
was sent in the *chatter* of the contact's form.
|
||||
|
||||
Upon sending the SMS message, the prepaid credits for the *SMS* |IAP| service are automatically
|
||||
deducted from the existing credits. If there are not enough credits to send the message, Odoo
|
||||
prompts the user to purchase more.
|
||||
|
||||
.. seealso::
|
||||
For more information on how to use various |IAP| services, and for more in-depth instructions
|
||||
related to SMS functionality in Odoo, review the documentation below:
|
||||
|
||||
- :doc:`Lead mining <../sales/crm/acquire_leads/lead_mining>`
|
||||
- :doc:`Enrich your contacts base with Partner Autocomplete
|
||||
<../sales/crm/optimize/partner_autocomplete>`
|
||||
- :doc:`SMS Marketing <../marketing/sms_marketing>`
|
||||
|
||||
.. _in_app_purchase/credits:
|
||||
|
||||
IAP credits
|
||||
===========
|
||||
|
||||
Every time an |IAP| service is used, the prepaid credits for that service are spent. Odoo prompts
|
||||
the purchase of more credits when there are not enough credits left to continue using a service.
|
||||
Email alerts can also be set up for when :ref:`credits are low <in_app_purchase/low-credits>`.
|
||||
|
||||
Credits are purchased in *Packs* from the `Odoo IAP Catalog
|
||||
<https://iap.odoo.com/iap/all-in-app-services>`_, and pricing is specific to each service.
|
||||
|
||||
.. example::
|
||||
The `SMS service <https://iap.odoo.com/iap/in-app-services/1>`_ has four packs available, in
|
||||
denominations of:
|
||||
|
||||
- :guilabel:`Starter Pack`: 10 credits
|
||||
- :guilabel:`Standard Pack`: 100 credits
|
||||
- :guilabel:`Advanced Pack`: 500 credits
|
||||
- :guilabel:`Expert Pack`: 1,000 credits
|
||||
|
||||
.. image:: in_app_purchase/packs.png
|
||||
:align: center
|
||||
:alt: Four different packs of credits for the SMS IAP service.
|
||||
|
||||
The number of credits consumed depends on the length of the SMS and the country of destination.
|
||||
|
||||
For more information, refer to the :doc:`SMS Pricing and FAQ
|
||||
<../marketing/sms_marketing/pricing_and_faq>` documentation.
|
||||
|
||||
.. _iap/buying_credits:
|
||||
|
||||
Buy credits
|
||||
-----------
|
||||
|
||||
If there are not enough credits to perform a task, the database automatically prompts the purchase
|
||||
of more credits.
|
||||
|
||||
Users can check the current balance of credits for each service, and manually purchase more credits,
|
||||
by navigating to the :menuselection:`Settings app --> Contacts section`, and beneath the
|
||||
:guilabel:`Odoo IAP` setting, click :guilabel:`View My Services`.
|
||||
|
||||
Doing so reveals an :guilabel:`IAP Service` page, listing the various |IAP| services in the
|
||||
database. From here, click an |IAP| service to open its :guilabel:`Account Information` page, where
|
||||
additional credits can be purchased.
|
||||
|
||||
Manually buy credits
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To manually buy credits in Odoo, follow these steps:
|
||||
|
||||
First, go to the :menuselection:`Settings application` and type `IAP` in the :guilabel:`Search...`
|
||||
bar. Alternatively users can scroll down to the :guilabel:`Contacts` section. Under the
|
||||
:guilabel:`Contacts` section, where it says :guilabel:`Odoo IAP`, click :guilabel:`View My
|
||||
Services`.
|
||||
|
||||
.. image:: in_app_purchase/view-services.png
|
||||
:align: center
|
||||
:alt: The Settings app showing the Odoo IAP heading and View My Services button.
|
||||
|
||||
Doing so reveals an :guilabel:`IAP Account` page, listing the various |IAP| services in the
|
||||
database. From here, click an |IAP| service to open its :guilabel:`Account Information` page, where
|
||||
additional credits can be purchased.
|
||||
|
||||
On the :guilabel:`Account Information` page, click the :guilabel:`Buy Credit` button. Doing so loads
|
||||
a :guilabel:`Buy Credits for (IAP Account)` page in a new tab. From here, click :guilabel:`Buy` on
|
||||
the desired pack of credits. Then, follow the prompts to enter payment details, and confirm the
|
||||
order.
|
||||
|
||||
.. image:: in_app_purchase/buy-pack.png
|
||||
:align: center
|
||||
:alt: The SMS service page on IAP.Odoo.com with four packs of credits available for purchase.
|
||||
|
||||
Once the transaction is complete, the credits are available for use in the database.
|
||||
|
||||
.. _in_app_purchase/low-credits:
|
||||
|
||||
Low-credit notification
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It is possible to be notified when credits are low, in order to avoid running out of credits, while
|
||||
using an |IAP| service. To do that, follow this process:
|
||||
|
||||
Go to the :menuselection:`Settings application`, and type `IAP` in the :guilabel:`Search...` bar.
|
||||
Under the :guilabel:`Contacts` section, where it says :guilabel:`Odoo IAP`, click :guilabel:`View My
|
||||
Services`.
|
||||
|
||||
The available |IAP| accounts appear in a list view on the :guilabel:`IAP Account` page. From here,
|
||||
click on the desired |IAP| account to view that service's :guilabel:`Account Information` page.
|
||||
|
||||
On the :guilabel:`Account Information` page, tick the :guilabel:`Warn Me` checkbox. Doing so reveals
|
||||
two fields on the form: :guilabel:`Threshold` and :guilabel:`Warning Email`.
|
||||
|
||||
In the :guilabel:`Threshold` field, enter an amount of credits Odoo should use as the
|
||||
minimum threshold for this service. In the :guilabel:`Warning Email` field, enter the email address
|
||||
that receives the notification.
|
||||
|
||||
Odoo sends a low-credit alert to the :guilabel:`Warning Email` when the balance of credits falls
|
||||
below the amount listed as the :guilabel:`Threshold`.
|
Before ![]() (image error) Size: 36 KiB |
Before ![]() (image error) Size: 73 KiB |
Before ![]() (image error) Size: 19 KiB |
Before ![]() (image error) Size: 9.1 KiB |
Before ![]() (image error) Size: 6.9 KiB |
@ -1,86 +0,0 @@
|
||||
==================
|
||||
Keyboard shortcuts
|
||||
==================
|
||||
|
||||
Users in Odoo can utilize several keyboard shortcuts to navigate through modules, execute actions,
|
||||
and manage data.
|
||||
|
||||
.. tip::
|
||||
Hold :kbd:`Ctrl` to view the keyboard shortcuts assigned to each element on the interface.
|
||||
|
||||
.. image:: keyboard_shortcuts/menu-shortcuts.png
|
||||
:align: center
|
||||
:alt: A selection of keyboard shortcuts in Odoo.
|
||||
|
||||
.. important::
|
||||
Some keyboard shortcuts may not be available on different versions of Odoo or effective depending
|
||||
on browsers, extensions, or other individual settings.
|
||||
|
||||
Keyboard shortcuts by operating system
|
||||
======================================
|
||||
|
||||
Below is a list of some of the most commonly used keyboard shortcuts within Odoo, listed by
|
||||
operating system.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - Description
|
||||
- Windows / Linux
|
||||
- macOS
|
||||
* - Previous breadcrumb
|
||||
- :kbd:`Alt` + :kbd:`B`
|
||||
- :kbd:`Ctrl` + :kbd:`B`
|
||||
* - Create new record
|
||||
- :kbd:`Alt` + :kbd:`C`
|
||||
- :kbd:`Ctrl` + :kbd:`C`
|
||||
* - Odoo Home Page
|
||||
- :kbd:`Alt` + :kbd:`H`
|
||||
- :kbd:`Ctrl` + :kbd:`H`
|
||||
* - Discard changes
|
||||
- :kbd:`Alt` + :kbd:`J`
|
||||
- :kbd:`Ctrl` + :kbd:`J`
|
||||
* - Save changes
|
||||
- :kbd:`Alt` + :kbd:`S`
|
||||
- :kbd:`Ctrl` + :kbd:`S`
|
||||
* - Next page
|
||||
- :kbd:`Alt` + :kbd:`N`
|
||||
- :kbd:`Ctrl` + :kbd:`N`
|
||||
* - Previous page
|
||||
- :kbd:`Alt` + :kbd:`P`
|
||||
- :kbd:`Ctrl` + :kbd:`P`
|
||||
* - Search
|
||||
- :kbd:`Alt` + :kbd:`Q`
|
||||
- :kbd:`Ctrl` + :kbd:`Q`
|
||||
* - Select menus
|
||||
- :kbd:`Alt` + :kbd:`1-9`
|
||||
- :kbd:`Ctrl` + :kbd:`1-9`
|
||||
* - Create a new To-Do
|
||||
- :kbd:`Alt` + :kbd:`Shift` + :kbd:`T`
|
||||
- :kbd:`Ctrl` + :kbd:`Shift` + :kbd:`T`
|
||||
* - Search a Knowledge article
|
||||
- :kbd:`Alt` + :kbd:`F`
|
||||
- :kbd:`Ctrl` + :kbd:`F`
|
||||
* - Share a Knowledge article
|
||||
- :kbd:`Alt` + :kbd:`Shift` + :kbd:`S`
|
||||
- :kbd:`Ctrl` + :kbd:`Shift` + :kbd:`S`
|
||||
* - Open command palette
|
||||
- :kbd:`Ctrl` + :kbd:`K`
|
||||
- :kbd:`Command` + :kbd:`K`
|
||||
|
||||
.. tip::
|
||||
After opening the command palette, search using the following keyboard shortcuts:
|
||||
|
||||
- :kbd:`/`: search for menus, applications, and modules.
|
||||
- :kbd:`@`: search for users.
|
||||
- :kbd:`#`: search for **Discuss** channels.
|
||||
- :kbd:`?`: search for **Knowledge** articles.
|
||||
|
||||
Enter a name (or term) in the search bar, or use the arrow keys to scroll through the available
|
||||
options. Then, click :kbd:`Ctrl` + :kbd:`Enter` to open the selected app, module, or menu in a
|
||||
new tab.
|
||||
|
||||
.. image:: keyboard_shortcuts/command-palete.png
|
||||
:align: center
|
||||
:alt: The command palette in Odoo, with the menu search option selected.
|
Before ![]() (image error) Size: 15 KiB |
Before ![]() (image error) Size: 5.7 KiB |
@ -1,187 +0,0 @@
|
||||
=========
|
||||
Reporting
|
||||
=========
|
||||
|
||||
You can find several reports under the :guilabel:`Reporting` menu of most apps that let you analyze
|
||||
and visualize the data of your records.
|
||||
|
||||
.. _reporting/views:
|
||||
|
||||
Selecting a view
|
||||
================
|
||||
|
||||
Depending on the report, Odoo can display the data in various ways. Sometimes, a unique view
|
||||
fully tailored to the report is available, while several views are available for others. However,
|
||||
two generic views are dedicated to reporting: the graph and pivot views.
|
||||
|
||||
.. _reporting/views/graph:
|
||||
|
||||
Graph view
|
||||
----------
|
||||
|
||||
The :ref:`graph view <reporting/using-graph>` is used to visualize your records' data, helping you
|
||||
identify patterns and trends. The view is often found under the :guilabel:`Reporting` menu of apps
|
||||
but can be found elsewhere. Click the **graph view button** located at the top right to access
|
||||
it.
|
||||
|
||||
.. image:: reporting/graph-button.png
|
||||
:alt: Selecting the graph view
|
||||
|
||||
.. _reporting/views/pivot:
|
||||
|
||||
Pivot view
|
||||
----------
|
||||
|
||||
The :ref:`pivot view <reporting/using-pivot>` is used to aggregate your records' data and break it
|
||||
down for analysis. The view is often found under the :guilabel:`Reporting` menu of apps but can be
|
||||
found elsewhere. Click the **pivot view button** located at the top right to access it.
|
||||
|
||||
.. image:: reporting/pivot-button.png
|
||||
:alt: Selecting the pivot view
|
||||
|
||||
.. _reporting/choosing-measures:
|
||||
|
||||
Choosing measures
|
||||
=================
|
||||
|
||||
After selecting a view, you should ensure only the relevant records are :doc:`filtered <search>`.
|
||||
Next, you should choose what is measured. By default, a measure is always selected. If you wish to
|
||||
edit it, click :guilabel:`Measures` and choose one or, only for pivots, multiple measures.
|
||||
|
||||
.. note::
|
||||
When you select a measure, Odoo aggregates the values recorded on that field for the filtered
|
||||
records. Only numerical fields (:ref:`integer <studio/fields/simple-fields/integer>`,
|
||||
:ref:`decimal <studio/fields/simple-fields/decimal>`, :ref:`monetary
|
||||
<studio/fields/simple-fields/monetary>`) can be measured. In addition, the :guilabel:`Count`
|
||||
option is used to count the total number of filtered records.
|
||||
|
||||
After choosing what you want to measure, you can define how the data should be :ref:`grouped
|
||||
<search/group>` depending on the dimension you want to analyze. By default, the data is often
|
||||
grouped by *Date > Month*, which is used to analyze the evolution of a measure over the months.
|
||||
|
||||
.. tip::
|
||||
When you filter a single time period, the option to compare it against another one appears.
|
||||
|
||||
.. image:: reporting/comparison.png
|
||||
:alt: Using the comparison option
|
||||
|
||||
.. example::
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Select measures
|
||||
|
||||
Among other measures, you could add the :guilabel:`Margin` and :guilabel:`Count` measures
|
||||
to the Sales Analysis report. By default, the :guilabel:`Untaxed Amount` measure is
|
||||
selected.
|
||||
|
||||
.. image:: reporting/measures.png
|
||||
:alt: Selecting different measures on the Sales Analysis report
|
||||
|
||||
.. tab:: Group measures
|
||||
|
||||
You could group the measures by :guilabel:`Product Category` at the level of rows on the
|
||||
previous Sales Analysis report example.
|
||||
|
||||
.. image:: reporting/single-group.png
|
||||
:alt: Adding a group on the Sales Analysis report
|
||||
|
||||
.. _reporting/using-pivot:
|
||||
|
||||
Using the pivot view
|
||||
====================
|
||||
|
||||
Grouping data is quintessential to the pivot view. It enables drilling down the data to gain deeper
|
||||
insights. While you can use the :guilabel:`Group By` option to quickly add a group at the level of
|
||||
rows, as shown in the example above, you can also click the plus button (:guilabel:`➕`) next to the
|
||||
:guilabel:`Total` header at the level of rows *and* columns, and then select one of the
|
||||
**preconfigured groups**. To remove one, click the minus button (:guilabel:`➖`).
|
||||
|
||||
Once you have added a group, you can add new ones on the opposite axis or the newly created
|
||||
subgroups.
|
||||
|
||||
.. example::
|
||||
You could further divide the measures on the previous Sales Analysis report example by the
|
||||
:guilabel:`Salesperson` group at the level of columns and by the :guilabel:`Order Date > Month`
|
||||
group on the :guilabel:`All / Saleable / Office Furniture` product category.
|
||||
|
||||
.. image:: reporting/multiple-groups.png
|
||||
:alt: Adding multiple groups on the Sales Analysis report
|
||||
|
||||
.. tip::
|
||||
- Switch the rows and columns' groups by clicking the flip axis button (:guilabel:`⇄`).
|
||||
- Click on a measure's label to sort the values by ascending (⏶) or descending (⏷) order.
|
||||
- Download a `.xlsx` version of the pivot by clicking the download button (:guilabel:`⭳`).
|
||||
|
||||
.. _reporting/using-graph:
|
||||
|
||||
Using the graph view
|
||||
====================
|
||||
|
||||
Three graphs are available: the bar, line, and pie charts.
|
||||
|
||||
**Bar charts** are used to show the distribution or a comparison of several categories. They are
|
||||
especially useful as they can deal with larger data sets.
|
||||
|
||||
**Line charts** are useful to show changing time series and trends over time.
|
||||
|
||||
**Pie charts** are used to show the distribution or a comparison of a small number of categories
|
||||
when they form a meaningful whole.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Bar chart
|
||||
|
||||
.. image:: reporting/bar.png
|
||||
:alt: Viewing the Sales Analysis report as a bar chart
|
||||
|
||||
.. tab:: Line chart
|
||||
|
||||
.. image:: reporting/line.png
|
||||
:alt: Viewing the Sales Analysis report as a line chart
|
||||
|
||||
.. tab:: Pie chart
|
||||
|
||||
.. image:: reporting/pie.png
|
||||
:alt: Viewing the Sales Analysis report as a pie chart
|
||||
|
||||
.. tip::
|
||||
For **bar** and **line** charts, you can use the stacked option when you have at least two
|
||||
groups, which then appear on top of each other instead of next to each other.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Stacked bar chart
|
||||
|
||||
.. image:: reporting/stacked-bar.png
|
||||
:alt: Stacked bar chart example
|
||||
|
||||
.. tab:: Regular bar chart
|
||||
|
||||
.. image:: reporting/non-stacked-bar.png
|
||||
:alt: Non-stacked bar chart example
|
||||
|
||||
.. tab:: Stacked line chart
|
||||
|
||||
.. image:: reporting/stacked-line.png
|
||||
:alt: Stacked line chart example
|
||||
|
||||
.. tab:: Regular line chart
|
||||
|
||||
.. image:: reporting/non-stacked-line.png
|
||||
:alt: Non-stacked line chart example
|
||||
|
||||
For **line** charts, you can use the cumulative option to sum values, which is especially useful
|
||||
to show the change in growth over a time period.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: Cumulative line chart
|
||||
|
||||
.. image:: reporting/cumulative.png
|
||||
:alt: Cumulative line chart example
|
||||
|
||||
.. tab:: Regular line chart
|
||||
|
||||
.. image:: reporting/non-cumulative.png
|
||||
:alt: Regular line chart example
|
Before ![]() (image error) Size: 11 KiB |
Before ![]() (image error) Size: 9.3 KiB |
Before ![]() (image error) Size: 12 KiB |
Before ![]() (image error) Size: 1.8 KiB |
Before ![]() (image error) Size: 15 KiB |
Before ![]() (image error) Size: 8.0 KiB |
Before ![]() (image error) Size: 46 KiB |
Before ![]() (image error) Size: 13 KiB |
Before ![]() (image error) Size: 14 KiB |
Before ![]() (image error) Size: 12 KiB |
Before ![]() (image error) Size: 13 KiB |
Before ![]() (image error) Size: 1.8 KiB |
Before ![]() (image error) Size: 15 KiB |
Before ![]() (image error) Size: 14 KiB |
Before ![]() (image error) Size: 11 KiB |
@ -1,283 +0,0 @@
|
||||
=================================
|
||||
Search, filter, and group records
|
||||
=================================
|
||||
|
||||
Odoo allows for the searching, filtering, and grouping of records in a view to display only the most
|
||||
relevant records. The search bar is located at the top of the view, start typing to :ref:`search for
|
||||
values <search/values>`, or click the :guilabel:`🔽 (down arrow)` icon to access the :ref:`Filter
|
||||
<search/filters>`, :ref:`Group By <search/group>`, and :ref:`Favorites <search/favorites>` drop-down
|
||||
menus.
|
||||
|
||||
.. _search/values:
|
||||
|
||||
Search for values
|
||||
=================
|
||||
|
||||
Use the search field to quickly look for specific values, and add them as a filter. Type the value
|
||||
to search for, and select the desired option from the drop-down menu to apply the search filter.
|
||||
|
||||
.. example::
|
||||
Instead of adding a :ref:`custom filter <search/custom-filters>` to select records where
|
||||
*Mitchell Admin* is the salesperson on the *Sales Analysis* report (:menuselection:`Sales app -->
|
||||
Reporting --> Sales`), search for `Mitch`, and click the :guilabel:`⏵ (right arrow)` next to
|
||||
:guilabel:`Search Salesperson for: Mitch`, and select :guilabel:`Mitchell Admin`.
|
||||
|
||||
.. image:: search/search-values.png
|
||||
:align: center
|
||||
:alt: Searching for a specific value on the Sales Analysis report
|
||||
|
||||
.. note::
|
||||
Using the search field is equivalent to using the *contains* operator when adding a :ref:`custom
|
||||
filter <search/custom-filters>`. If a partial value is entered, and the desired field is directly
|
||||
selected (without selecting the :guilabel:`⏵ (right arrow)`), *all* records containing the typed
|
||||
characters for the selected field are included.
|
||||
|
||||
.. _search/filters:
|
||||
|
||||
Filters
|
||||
=======
|
||||
|
||||
Filters are used to select records that meet specific criteria. The default selection of records is
|
||||
specific to each view, but can be modified by selecting one (or several) :ref:`preconfigured filters
|
||||
<search/preconfigured-filters>`, or by adding a :ref:`custom filter <search/custom-filters>`.
|
||||
|
||||
.. _search/preconfigured-filters:
|
||||
|
||||
Preconfigured filters
|
||||
---------------------
|
||||
|
||||
Modify the default selection of records by clicking the :guilabel:`🔽 (down arrow)` icon from the
|
||||
search bar, and selecting one (or several) *preconfigured filters* from the :guilabel:`Filters`
|
||||
drop-down menu.
|
||||
|
||||
.. example::
|
||||
On the *Sales Analysis* report (:menuselection:`Sales app --> Reporting --> Sales`), only records
|
||||
that are at the *sales order* stage, with an *order date* within the last 365 days, are selected
|
||||
by default.
|
||||
|
||||
To also include records at the *quotation* stage, select :guilabel:`Quotations` from the
|
||||
:guilabel:`Filters`.
|
||||
|
||||
Furthermore, to *only* include sales order and quotation records from a specific year, like
|
||||
2024, for example, first remove the existing `Order Date: Last 365 Days` filter, by clicking the
|
||||
:guilabel:`❌ (remove)` icon, then select :menuselection:`Order Date --> 2024`.
|
||||
|
||||
.. image:: search/preconfigured-filters.png
|
||||
:align: center
|
||||
:alt: Using preconfigured filters on the Sales Analysis report
|
||||
|
||||
.. note::
|
||||
The preconfigured :guilabel:`Filters` are grouped, and each group is separated by a horizontal
|
||||
line. Selecting preconfigured filters from the same group allows records to match *any* of the
|
||||
applied conditions. However, selecting filters from different groups requires records to match
|
||||
*all* of the applied conditions.
|
||||
|
||||
.. _search/custom-filters:
|
||||
|
||||
Custom filters
|
||||
--------------
|
||||
|
||||
If the :ref:`preconfigured filters <search/preconfigured-filters>` are not specific enough, add a
|
||||
custom filter. To do so, click the :guilabel:`🔽 (down arrow)` icon in the search bar, then select
|
||||
:menuselection:`Filters --> Add Custom Filter`.
|
||||
|
||||
The :guilabel:`Add Custom Filter` pop-up window displays the matching option, filter rule, and a
|
||||
toggle to :guilabel:`Include archived` records.
|
||||
|
||||
.. image:: search/custom-filter.png
|
||||
:align: center
|
||||
:alt: The Add Custom Filter pop-up window.
|
||||
|
||||
The default matching configuration is to :guilabel:`Match any of the following rules`, indicating
|
||||
that each filter rule is applied independently. To change the matching configuration to
|
||||
:guilabel:`Match all of the following rules`, at least two filter rules must be added to the custom
|
||||
filter.
|
||||
|
||||
- :guilabel:`Match all 🔽 of the following rules`: **all** of the filter rules must be met.
|
||||
Logically, this is an *AND* (`&`) operation.
|
||||
- :guilabel:`Match any 🔽 of the following rules`: **any** of the filter rules can be met.
|
||||
Logically, this is an *OR* (`|`) operation.
|
||||
|
||||
By default, a single filter rule is added to the custom filter. The following describes the
|
||||
structure of a filter rule:
|
||||
|
||||
#. The first inline field is the *field name* to filter by. Some fields have refined parameters that
|
||||
are nested within another field. These fields have an :guilabel:`> (arrow)` icon beside them,
|
||||
which can be selected to reveal the nested fields.
|
||||
#. The second inline field is the conditional *operator* used to compare the field name to the
|
||||
value. The :ref:`available conditional operators <reference/orm/domains>` are specific to the
|
||||
field's data type.
|
||||
#. The third inline field is the variable *value* of the field name. The value input may appear as a
|
||||
drop-down menu, a text input, a number input, a date/time input, a boolean selector, or it may be
|
||||
blank, depending on the operator used and the field's data type.
|
||||
|
||||
Three inline buttons are also available to the right of the rule's filter criteria:
|
||||
|
||||
#. :guilabel:`➕ (plus sign)`: adds a new rule below the existing rule.
|
||||
#. :guilabel:`(Add branch)`: adds a new group of rules below the existing rule, with the
|
||||
:guilabel:`any` and :guilabel:`all` matching options available to define how each rule within
|
||||
this branch is applied to the filter. If the matching option is set to the same as the parent
|
||||
group, the fields are moved to join the parent group.
|
||||
|
||||
.. example::
|
||||
If the matching option is set to :guilabel:`Match all 🔽 of the following rules`, and a new
|
||||
branch is added with its matching option changed from :guilabel:`any 🔽 of` to :guilabel:`all
|
||||
🔽 of`, the newly-added branch disappears, and its group of rules are moved to the parent
|
||||
group.
|
||||
|
||||
#. :guilabel:`🗑️ (garbage can)`: deletes the node. If a branch node is deleted, all children of
|
||||
that node are deleted, as well.
|
||||
|
||||
A new filter rule can be added to the custom filter by clicking the :guilabel:`New Rule` button.
|
||||
|
||||
Once the filter criteria are defined, click :guilabel:`Add` to add the custom filter to the view.
|
||||
|
||||
.. example::
|
||||
To target all leads and opportunities from the :menuselection:`CRM` app that are in the *Won*
|
||||
stage, and have an expected revenue greater than $1,000, the following should be entered:
|
||||
|
||||
:guilabel:`Match all 🔽 (down arrow) of the following rules:`
|
||||
|
||||
#. :guilabel:`Stage` :guilabel:`is in` :guilabel:`Won`
|
||||
#. :guilabel:`Expected Revenue` :guilabel:`>` `1,000`
|
||||
#. :guilabel:`any 🔽 (down arrow)` :guilabel:`of:`
|
||||
|
||||
- :guilabel:`Type` :guilabel:`=` :guilabel:`Lead`
|
||||
- :guilabel:`Type` :guilabel:`=` :guilabel:`Opportunity`
|
||||
|
||||
.. image:: search/custom-filter-example.png
|
||||
:align: center
|
||||
:alt: Adding a custom filter to filter specific records in CRM.
|
||||
|
||||
.. tip::
|
||||
Activate :ref:`developer-mode` to reveal each field's technical name and data type, as well as
|
||||
the :guilabel:`# Code editor` text area below the filter rules, to view and edit the domain
|
||||
manually.
|
||||
|
||||
.. _search/group:
|
||||
|
||||
Group records
|
||||
=============
|
||||
|
||||
The display of records in a view can be clustered together, according to one of the *preconfigured
|
||||
groups*. To do so, click the :guilabel:`🔽 (down arrow)` icon in the search bar, then select one of
|
||||
the :guilabel:`Group By` options from the drop-down menu.
|
||||
|
||||
.. example::
|
||||
To group the records by salesperson on the *Sales Analysis* report (:menuselection:`Sales app -->
|
||||
Reporting --> Sales`), click the :guilabel:`Salesperson` option from the :guilabel:`Group By`
|
||||
drop-down menu. The view changes to group the records by salesperson, without filtering out any
|
||||
records.
|
||||
|
||||
.. image:: search/group.png
|
||||
:align: center
|
||||
:alt: Grouping records on the Sales Analysis report
|
||||
|
||||
It is possible to *customize groups* by using a field present on the model. To do so, click
|
||||
:menuselection:`Add Custom Group`, and select a field from the drop-down menu.
|
||||
|
||||
.. note::
|
||||
Several groups can be used at the same time. The first group that is selected is the main
|
||||
cluster, the next one that is added further divides the main group's categories, and so on.
|
||||
Furthermore, filters and groups can be used together to refine the view even more.
|
||||
|
||||
.. _search/comparison:
|
||||
|
||||
Comparison
|
||||
==========
|
||||
|
||||
Certain reporting dashboards include a :guilabel:`Comparison` section in the drop-down menus of
|
||||
their :guilabel:`Search...` bars. This includes the :doc:`Overall Equipment Effectiveness
|
||||
<../inventory_and_mrp/manufacturing/reporting/oee>` report for the *Manufacturing* app, and the
|
||||
:doc:`Purchase <../inventory_and_mrp/purchase/advanced/analyze>` report for the *Purchase* app,
|
||||
among others.
|
||||
|
||||
The options in the :icon:`fa-adjust` :guilabel:`Comparison` section are used to compare data from
|
||||
two different time periods. There are two comparison options to choose from: :guilabel:`(Time
|
||||
Filter): Previous Period` and :guilabel:`(Time Filter): Previous Year`.
|
||||
|
||||
.. important::
|
||||
For some reports, the :guilabel:`Comparison` section **only** appears in the
|
||||
:guilabel:`Search...` bar drop-down menu if one (or more) time periods have been selected in the
|
||||
:guilabel:`Filters` column. This is because, if no time period is specified, there is nothing to
|
||||
compare.
|
||||
|
||||
Additionally, some reports only allow use of the :guilabel:`Comparison` feature when the
|
||||
:icon:`fa-pie-chart` :guilabel:`(pie chart)` graph type, or the :icon:`oi-view-pivot`
|
||||
:guilabel:`(pivot)` view, is selected. A :guilabel:`Comparison` option can be selected even if
|
||||
another view is enabled, but doing so does **not** change the way data is displayed on the
|
||||
report.
|
||||
|
||||
.. image:: search/comparison-section.png
|
||||
:align: center
|
||||
:alt: The Search... bar for the production analysis report.
|
||||
|
||||
To view data using one of the two comparisons, begin by selecting a time period in the
|
||||
:guilabel:`Filters` column of the :guilabel:`Search...` bar drop-down menu. Then, select either
|
||||
:guilabel:`(Time Filter): Previous Period` or :guilabel:`(Time Filter): Previous Year` in the
|
||||
:guilabel:`Comparison` section.
|
||||
|
||||
With one of the :guilabel:`Comparison` options enabled, the report compares the data for the
|
||||
selected period, with the data for the same unit of time (month, quarter, year), one period or year
|
||||
prior. The way the data is displayed depends on the selected view:
|
||||
|
||||
- The :icon:`fa-bar-chart` :guilabel:`(bar chart)` shows two bars, side-by-side, for each unit of
|
||||
time for the selected time period. The left bar represents the selected time period, while the
|
||||
right bar represents the previous time period.
|
||||
- The :icon:`fa-line-chart` :guilabel:`(line chart)` is displayed with two lines, one representing
|
||||
the selected time period, and the other representing the previous time period.
|
||||
- The :icon:`fa-pie-chart` :guilabel:`(pie chart)` appears as a large circle with a smaller circle
|
||||
inside. The larger circle represents the selected time period, while the smaller circle represents
|
||||
the previous time period.
|
||||
- The :icon:`oi-view-pivot` :guilabel:`(pivot table)` is displayed with each column split into two
|
||||
smaller columns. The right column represents the selected time period, while the left column
|
||||
represents the previous time period.
|
||||
|
||||
.. example::
|
||||
In the :guilabel:`Production Analysis` report of the :menuselection:`Manufacturing` app, data for
|
||||
the second quarter of 2024 is compared to data for the second quarter of 2023. :guilabel:`Q2` is
|
||||
selected in the :guilabel:`End Date` filter section of the :guilabel:`Search...` bar drop-down
|
||||
menu. In the :guilabel:`Comparison` section, :guilabel:`End Date: Previous Year` is selected.
|
||||
|
||||
The current year is 2024, so the larger circle shows data for the second quarter (Q2) of 2024.
|
||||
The smaller circle shows data for the second quarter (Q2) of 2023, which is the same time period,
|
||||
but one *year* prior.
|
||||
|
||||
If :guilabel:`End Date: Previous Period` is selected instead, the smaller circle shows data for
|
||||
the first quarter (Q1) of 2024, which is the same time period, but one *period* prior.
|
||||
|
||||
.. image:: search/comparison.png
|
||||
:align: center
|
||||
:alt: The comparison view of the Production Analysis report.
|
||||
|
||||
.. _search/favorites:
|
||||
|
||||
Favorites
|
||||
=========
|
||||
|
||||
Favorites are a way to save a specific search for future use, or as the new default filter for the
|
||||
view.
|
||||
|
||||
To save the current view as a favorite, click the :guilabel:`🔽 (down arrow)` icon in the search
|
||||
bar, then select the :guilabel:`Save current search` drop-down menu to display the following
|
||||
options:
|
||||
|
||||
- Filter name: name of the favorited search.
|
||||
- :guilabel:`Default filter`: sets the favorited search as the default filter for the view.
|
||||
- :guilabel:`Shared`: makes the favorited search available to all users. By default, the favorited
|
||||
search is only available to the user who created it.
|
||||
|
||||
Once the options are set, click :guilabel:`Save` to save the favorited search.
|
||||
|
||||
.. image:: search/favorites.png
|
||||
:align: center
|
||||
:alt: Saving a favorite search on the Sales Analysis report
|
||||
|
||||
Saved favorites can be accessed by clicking the :guilabel:`🔽 (down arrow)` icon in the search bar,
|
||||
then selecting the saved filter in the :guilabel:`Favorites` drop-down menu. To remove a saved
|
||||
favorite, click the :guilabel:`🗑️ (garbage can)` icon next to the favorited search.
|
||||
|
||||
.. tip::
|
||||
To view *all* favorited searches, first activate :ref:`developer-mode`, and navigate to
|
||||
:menuselection:`Settings app --> Technical --> User Interface: User-defined Filters`. From here,
|
||||
all favorited searches can be viewed, edited, archived, or deleted.
|
Before ![]() (image error) Size: 11 KiB |
Before ![]() (image error) Size: 31 KiB |
Before ![]() (image error) Size: 7.9 KiB |