odoo-forge-bundle 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1190) hide show
  1. package/index.js +6 -0
  2. package/manifest.json +13 -0
  3. package/package.json +16 -0
  4. package/payload/README.md +4 -0
  5. package/payload/config/product.json +11 -0
  6. package/payload/platforms/claude/hooks.template.json +15 -0
  7. package/payload/platforms/claude/mcp.template.json +9 -0
  8. package/payload/platforms/claude/plugin.template.json +8 -0
  9. package/payload/platforms/claude/settings.template.json +3 -0
  10. package/payload/platforms/codex/mcp.template.json +12 -0
  11. package/payload/platforms/codex/plugin.template.json +19 -0
  12. package/payload/skills/company-rules/SKILL.md +244 -0
  13. package/payload/skills/company-rules/agents/openai.yaml +6 -0
  14. package/payload/skills/company-rules/assets/icon-large.svg +1 -0
  15. package/payload/skills/company-rules/assets/icon-small.svg +5 -0
  16. package/payload/skills/company-rules/references/1 /343/200/212/350/256/276/350/256/241/345/274/200/345/267/245/346/212/245/345/221/212/343/200/213/347/274/226/345/210/266/350/247/204/345/256/2329920ZD1811A-2018.md" +128 -0
  17. package/payload/skills/company-rules/references/1 /350/256/276/350/256/241/345/274/200/345/267/245/346/212/245/345/221/212TBED-9920-201A-2018.md" +15 -0
  18. package/payload/skills/company-rules/references/10 /344/270/223/344/270/232/350/256/276/350/256/241/344/273/273/345/212/241/345/247/224/346/211/230/344/271/246TBED-9920-222A-2018.md" +16 -0
  19. package/payload/skills/company-rules/references/11 /347/272/240/346/255/243/357/274/210/351/242/204/351/230/262/357/274/211/346/216/252/346/226/275/350/241/250TBQM-9920-201A-2009.md" +12 -0
  20. package/payload/skills/company-rules/references/11 /350/256/276/350/256/241/346/226/207/344/273/266/345/217/212/346/212/200/346/234/257/346/226/207/344/273/266/347/274/226/345/217/267/350/247/204/345/256/2329920ZD1822A-2018.md" +411 -0
  21. package/payload/skills/company-rules/references/11-1/351/231/204/344/273/266/357/274/232/346/226/260/345/245/245/345/244/251/347/204/266/346/260/224/350/202/241/344/273/275/346/234/211/351/231/220/345/205/254/345/217/270/346/227/240/345/275/242/350/265/204/344/272/247/347/256/241/347/220/206/345/212/236/346/263/225.md +56 -0
  22. package/payload/skills/company-rules/references/12 /350/256/276/350/256/241/350/201/224/347/273/234/345/215/225TBED-4002-221A-2024.md" +16 -0
  23. package/payload/skills/company-rules/references/12 /351/241/271/347/233/256/350/256/276/345/244/207/346/235/220/346/226/231/350/257/267/350/264/255/346/216/247/345/210/266/347/250/213/345/272/217XMZX KZCL004A-2023.md" +244 -0
  24. package/payload/skills/company-rules/references/13 /345/237/271/350/256/255/350/256/260/345/275/225/350/241/250TBHR-9920-235A-2013.md" +36 -0
  25. package/payload/skills/company-rules/references/14 /345/244/226/345/207/272/345/237/271/350/256/255/347/224/263/350/257/267/350/241/250XDNYQM12A-B01-2025.md" +16 -0
  26. package/payload/skills/company-rules/references/14 /350/264/250/351/207/217/351/243/216/351/231/251/347/256/241/347/220/206/350/247/204/345/256/232 ENN NG 9920TEI003A-2025.md" +227 -0
  27. package/payload/skills/company-rules/references/15 /345/272/224/350/201/230/347/231/273/350/256/260/350/241/250XDNYQM12A-B02-2025.md" +31 -0
  28. package/payload/skills/company-rules/references/16 /351/235/242/350/257/225/346/265/213/350/257/204/345/215/225XDNYQM12A-B03-2025.md" +34 -0
  29. package/payload/skills/company-rules/references/17 /345/214/226/345/267/245/350/256/276/350/256/241/344/270/255/345/277/203/344/270/223/344/270/232/344/274/232/347/255/276/350/246/201/346/261/202/345/222/214/350/214/203/345/233/264/350/247/204/345/256/232ENN NG 4002 ENG001A-2023.md" +97 -0
  30. package/payload/skills/company-rules/references/17 /350/247/222/350/211/262/350/257/264/346/230/216/344/271/246XDNYQM12A-B04-2025.md" +175 -0
  31. package/payload/skills/company-rules/references/17 /350/264/250/351/207/217/347/256/241/347/220/206/350/247/204/345/256/232 ENN NG 9920TEI015A-2025.md" +218 -0
  32. package/payload/skills/company-rules/references/18 /345/212/236/345/205/254/347/224/250/345/223/201/351/242/206/347/224/250/347/231/273/350/256/260/350/241/250XDNYQM12A-B05-2025.md" +37 -0
  33. package/payload/skills/company-rules/references/18 /345/215/260/347/253/240/347/256/241/347/220/206/350/247/204/345/256/232 ENN NG 9920ASC011A-2024.md" +212 -0
  34. package/payload/skills/company-rules/references/19 /350/256/276/350/256/241/344/273/273/345/212/241/351/200/232/347/237/245/345/215/225XDNYQM12A-B06-2025.md" +35 -0
  35. package/payload/skills/company-rules/references/2 /350/256/276/350/256/241/350/257/204/345/256/241/347/256/241/347/220/206/350/247/204/345/256/2329920ZD1812A-2018.md" +139 -0
  36. package/payload/skills/company-rules/references/2 /350/256/276/350/256/241/350/257/204/345/256/241/350/256/260/345/275/225TBED-9920-202A-2015.md" +11 -0
  37. package/payload/skills/company-rules/references/20 /345/233/272/345/256/232/350/265/204/344/272/247/347/256/241/347/220/206/345/210/266/345/272/246 ENN NG 9920FIN004A-2024.md" +277 -0
  38. package/payload/skills/company-rules/references/20 /346/264/276/350/275/246/345/215/225ENN NG 4002ASC003A-2025-B03.md" +10 -0
  39. package/payload/skills/company-rules/references/21 /345/221/230/345/267/245/345/237/271/350/256/255/347/256/241/347/220/206/345/212/236/346/263/2259920ZD0313A-2013.md" +142 -0
  40. package/payload/skills/company-rules/references/23 /350/256/276/350/256/241/350/264/250/351/207/217/346/216/247/345/210/266/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4002ENG001A-2025.md" +116 -0
  41. package/payload/skills/company-rules/references/24 /345/267/245/347/250/213/350/256/276/350/256/241/350/264/250/351/207/217/347/272/242/351/273/204/347/272/277/347/256/241/347/220/206/345/212/236/346/263/225 ENN NG 4002/357/274/217ENG003A-2025.md" +100 -0
  42. package/payload/skills/company-rules/references/26 /346/212/200/346/234/257/346/241/243/346/241/210/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4002TEI002A-2025.md" +346 -0
  43. package/payload/skills/company-rules/references/27 /345/220/210/345/220/214/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4002LEG001A-2025.md" +151 -0
  44. package/payload/skills/company-rules/references/28 /350/256/276/350/256/241/346/226/207/344/273/266/346/231/222/345/217/221/347/256/241/347/220/206/345/212/236/346/263/225 ENN NG 4002MFG001A-2025.md" +109 -0
  45. package/payload/skills/company-rules/references/29 /346/212/225/346/240/207/347/256/241/347/220/206/347/273/206/345/210/231ENN NG 4002MKT001A-2024.md" +161 -0
  46. package/payload/skills/company-rules/references/3 /350/256/276/350/256/241/346/226/207/344/273/266/346/240/274/345/274/217/350/247/204/345/256/2329920ZD1821A-2018.md" +371 -0
  47. package/payload/skills/company-rules/references/3 /350/256/276/350/256/241/350/241/245/345/205/205/343/200/201/345/217/230/346/233/264/351/200/232/347/237/245/345/215/225TBED-9920-208A-2018.md" +19 -0
  48. package/payload/skills/company-rules/references/3 /350/256/276/350/256/241/351/252/214/350/257/201/350/247/204/345/256/2329920ZD1813A-2018.md" +97 -0
  49. package/payload/skills/company-rules/references/30 /350/256/276/350/256/241/347/273/217/347/220/206/345/210/206/347/272/247/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4002HR001A-2025.md" +139 -0
  50. package/payload/skills/company-rules/references/31 /350/256/276/350/256/241/351/241/271/347/233/256/350/277/233/345/272/246/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4003ENG001A-2024.md" +153 -0
  51. package/payload/skills/company-rules/references/32 EPC/351/241/271/347/233/256/350/256/276/350/256/241/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4003ENG004A-2024.md" +295 -0
  52. package/payload/skills/company-rules/references/4 /346/226/260/345/234/260/350/203/275/346/272/220/345/267/245/347/250/213/346/212/200/346/234/257/346/234/211/351/231/220/345/205/254/345/217/270/347/237/263/345/256/266/345/272/204/350/203/275/346/272/220/345/214/226/345/267/245/346/212/200/346/234/257/345/210/206/345/205/254/345/217/270/345/233/276/344/271/246/347/256/241/347/220/206/345/212/236/346/263/225ENN NG 4002TEI001A-2025.md" +88 -0
  53. package/payload/skills/company-rules/references/4 /350/256/276/350/256/241/344/273/273/345/212/241/351/200/232/347/237/245/344/271/246TBED-9920-209A-2011.md" +14 -0
  54. package/payload/skills/company-rules/references/4 /350/256/276/350/256/241/346/210/220/345/223/201/350/264/250/351/207/217/350/257/204/345/256/232/350/247/204/345/256/2329920ZD1815A-2018.md" +205 -0
  55. package/payload/skills/company-rules/references/5 /350/256/276/350/256/241/346/235/241/344/273/266/347/256/241/347/220/206/350/247/204/345/256/2329920ZD1816A-2018.md" +70 -0
  56. package/payload/skills/company-rules/references/5 /350/256/276/350/256/241/350/277/233/345/272/246/350/256/241/345/210/222/350/241/250TBED-9920-211A-2011.md" +14 -0
  57. package/payload/skills/company-rules/references/6 /345/267/245/347/250/213/350/256/276/350/256/241/350/265/204/346/240/274/347/256/241/347/220/206/345/212/236/346/263/2259920ZD1817A-2015.md" +169 -0
  58. package/payload/skills/company-rules/references/6 /350/256/241/347/256/227/344/271/246TBED-9920-212A-2011.md" +30 -0
  59. package/payload/skills/company-rules/references/7 /350/256/276/350/256/241/344/272/244/345/272/225/350/256/260/345/275/225TBED-9920-213A-2015.md" +16 -0
  60. package/payload/skills/company-rules/references/7 /351/241/271/347/233/256/350/256/276/350/256/241/347/273/204/347/273/207/345/222/214/346/212/200/346/234/257/346/216/245/345/217/243/350/247/204/345/256/2329920ZD1818A-2018.md" +138 -0
  61. package/payload/skills/company-rules/references/8 /350/256/276/350/256/241/346/234/215/345/212/241/347/256/241/347/220/206/350/247/204/345/256/2329920ZD1819A-2015.md" +98 -0
  62. package/payload/skills/company-rules/references/8 /350/256/276/350/256/241/357/274/210/346/226/207/346/234/254/357/274/211/346/240/241/345/256/241/350/256/260/345/275/225TBED-9920-214A-2018.md" +13 -0
  63. package/payload/skills/company-rules/references/9 /350/256/276/350/256/241/346/226/207/344/273/266/347/255/276/347/275/262/350/247/204/345/256/2329920ZD1820A-2018.md" +133 -0
  64. package/payload/skills/company-rules/references/9 /350/256/276/350/256/241/350/276/223/345/205/245/350/257/204/345/256/241/350/241/250TBED-9920-215A-2020.md" +10 -0
  65. package/payload/skills/company-rules/references/ENN NG 4002/357/274/217TEI001A-2025-B01/346/240/207/345/207/206/345/233/276/344/271/246/350/256/242/350/264/255/347/224/263/350/257/267/345/215/225.md" +30 -0
  66. package/payload/skills/company-rules/references/ENN NG 4002/357/274/217TEI001A-2025-B02/345/233/276/344/271/246/345/200/237/351/230/205/347/231/273/350/256/260/350/241/250.md" +10 -0
  67. package/payload/skills/company-rules/references/ENN NG 4002/357/274/217TEI001A-2025-B03/345/233/276/344/271/246/345/200/237/351/230/205/346/230/216/347/273/206/350/241/250.md" +11 -0
  68. package/payload/skills/company-rules/references/ENN NG 4002/357/274/217TEI001A-2025-L01~03/345/233/276/344/271/246/347/256/241/347/220/206/346/265/201/347/250/213 /357/274/2103/344/270/252/357/274/211 PDF.md" +26 -0
  69. package/payload/skills/company-rules/references//345/256/242/346/210/267/346/273/241/346/204/217/345/272/246/350/260/203/346/237/245/345/217/212/345/233/236/350/256/277/345/267/245/345/205/267/350/241/250/345/215/225.md +184 -0
  70. package/payload/skills/company-rules/references//345/256/242/346/210/267/346/273/241/346/204/217/345/272/246/350/260/203/346/237/245/345/217/212/345/233/236/350/256/277/347/256/241/347/220/206/350/247/204/345/256/232 ENN NG 9920MKT002A-2025.md" +225 -0
  71. package/payload/skills/company-rules/references//345/267/245/347/250/213/350/264/250/351/207/217/347/246/201/344/273/244/347/256/241/347/220/206/350/247/204/345/256/232 ENN NG 9920TEI012A-2025.md" +84 -0
  72. package/payload/skills/company-rules/references//346/227/240/345/275/242/350/265/204/344/272/247/347/256/241/347/220/206/345/212/236/346/263/225 ENN NG FIN014B-2024.md" +110 -0
  73. package/payload/skills/company-rules/references//347/207/203/346/260/224/345/214/226/345/267/245/350/256/276/350/256/241/344/270/255/345/277/203/350/264/250/351/207/217/345/210/206/346/211/213/345/206/214XDNYQM12A-2025.md +1102 -0
  74. package/payload/skills/company-rules/references//350/264/250/351/207/217/344/272/213/346/225/205/347/256/241/347/220/206/350/247/204/345/256/232ENN NG 9920TEI014A-2025.md" +188 -0
  75. package/payload/skills/company-rules/references//351/231/204/344/273/2661 /345/220/204/344/270/223/344/270/232/344/274/232/347/255/276/346/204/217/350/247/201/346/261/207/346/200/273/350/241/250.md" +14 -0
  76. package/payload/skills/company-rules/references//351/231/204/344/273/2661 /345/267/245/347/250/213/350/264/250/351/207/217/347/246/201/344/273/244/350/277/235/350/247/204/350/241/214/344/270/272/350/256/244/345/256/232/346/212/245/345/221/212.docx.md" +9 -0
  77. package/payload/skills/company-rules/references//351/231/204/344/273/2661/357/274/232/345/211/215/346/234/237/345/267/245/344/275/234/343/200/201/345/210/235/346/255/245/350/256/276/350/256/241/347/255/211/350/256/276/350/256/241/346/226/207/344/273/266/347/274/226/345/210/266/346/240/274/345/274/217.md +73 -0
  78. package/payload/skills/company-rules/references//351/231/204/344/273/2661/357/274/232/350/264/250/351/207/217/344/272/213/346/225/205/345/277/253/346/212/245.md +14 -0
  79. package/payload/skills/company-rules/references//351/231/204/344/273/2662 /345/267/245/347/250/213/350/264/250/351/207/217/347/246/201/344/273/244/350/277/235/350/247/204/350/241/214/344/270/272/347/273/237/350/256/241/345/217/260/350/264/246.docx.md" +9 -0
  80. package/payload/skills/company-rules/references//351/231/204/344/273/2662/357/274/232/346/266/210/351/230/262/350/256/276/350/256/241/346/226/207/344/273/266/343/200/201/346/266/210/351/230/262/350/256/276/350/256/241/344/270/223/347/257/207/347/274/226/345/210/266/346/240/274/345/274/217.md +103 -0
  81. package/payload/skills/company-rules/references//351/231/204/344/273/2662/357/274/232/350/264/250/351/207/217/344/272/213/346/225/205/350/260/203/346/237/245/346/212/245/345/221/212.md +71 -0
  82. package/payload/skills/company-rules/references//351/231/204/344/273/2663 /345/267/245/347/250/213/350/264/250/351/207/217/347/246/201/344/273/244/346/235/241/346/254/276/345/210/206/350/247/243/345/217/212/347/275/232/345/210/231.md" +80 -0
  83. package/payload/skills/company-rules/references//351/231/204/344/273/2663/357/274/232/345/256/211/345/205/250/350/256/276/346/226/275/350/256/276/350/256/241/344/270/223/347/257/207/357/274/210/346/210/226HAZOP/345/210/206/346/236/220/357/274/211/347/274/226/345/210/266/346/240/274/345/274/217.md +48 -0
  84. package/payload/skills/company-rules/references//351/231/204/344/273/2663/357/274/232/350/264/250/351/207/217/344/272/213/346/225/205/344/272/213/344/273/266/345/217/260/350/264/246.md +37 -0
  85. package/payload/skills/company-rules/references//351/231/204/344/273/2664/357/274/232/350/201/214/344/270/232/347/227/205/351/230/262/346/212/244/350/256/276/346/226/275/350/256/276/350/256/241/344/270/223/347/257/207/347/274/226/345/210/266/346/240/274/345/274/217/357/274/210/347/234/201/347/272/247/357/274/211.md +44 -0
  86. package/payload/skills/company-rules/references//351/231/204/344/273/2665/357/274/232/350/212/202/350/203/275/346/212/245/345/221/212/347/274/226/345/210/266/346/240/274/345/274/217.md +52 -0
  87. package/payload/skills/company-rules/references//351/231/204/344/273/2666/357/274/232/346/212/200/346/234/257/350/247/204/346/240/274/344/271/246/347/274/226/345/210/266/346/240/274/345/274/217.md +60 -0
  88. package/payload/skills/company-rules/references//351/231/204/344/273/2667/357/274/232/345/255/227/344/275/223/347/244/272/344/276/213.md +223 -0
  89. package/payload/skills/company-rules/scripts/convert.py +295 -0
  90. package/payload/skills/company-rules/scripts/summarize.py +144 -0
  91. package/payload/skills/dev/SKILL.md +310 -0
  92. package/payload/skills/dev/agents/openai.yaml +6 -0
  93. package/payload/skills/dev/assets/icon-large.svg +1 -0
  94. package/payload/skills/dev/assets/icon-small.svg +5 -0
  95. package/payload/skills/dev/references/repo-conventions.md +104 -0
  96. package/payload/skills/discovery/SKILL.md +360 -0
  97. package/payload/skills/discovery/agents/openai.yaml +6 -0
  98. package/payload/skills/discovery/assets/icon-large.svg +1 -0
  99. package/payload/skills/discovery/assets/icon-small.svg +5 -0
  100. package/payload/skills/discovery/references/output-template.md +264 -0
  101. package/payload/skills/discovery/references/question-dimensions.md +375 -0
  102. package/payload/skills/global-context/SKILL.md +341 -0
  103. package/payload/skills/global-context/agents/openai.yaml +6 -0
  104. package/payload/skills/global-context/assets/icon-large.svg +1 -0
  105. package/payload/skills/global-context/assets/icon-small.svg +5 -0
  106. package/payload/skills/global-context/references/document-specs.md +300 -0
  107. package/payload/skills/industry-practice/SKILL.md +273 -0
  108. package/payload/skills/industry-practice/agents/openai.yaml +6 -0
  109. package/payload/skills/industry-practice/assets/icon-large.svg +1 -0
  110. package/payload/skills/industry-practice/assets/icon-small.svg +5 -0
  111. package/payload/skills/industry-practice/references/review-checklist.md +63 -0
  112. package/payload/skills/module-report/SKILL.md +214 -0
  113. package/payload/skills/module-report/agents/openai.yaml +6 -0
  114. package/payload/skills/module-report/assets/icon-large.svg +1 -0
  115. package/payload/skills/module-report/assets/icon-small.svg +5 -0
  116. package/payload/skills/module-research/SKILL.md +151 -0
  117. package/payload/skills/module-research/agents/openai.yaml +6 -0
  118. package/payload/skills/module-research/assets/icon-large.svg +1 -0
  119. package/payload/skills/module-research/assets/icon-small.svg +5 -0
  120. package/payload/skills/odoo18-docs/SKILL.md +97 -0
  121. package/payload/skills/odoo18-docs/agents/openai.yaml +6 -0
  122. package/payload/skills/odoo18-docs/assets/icon-large.svg +1 -0
  123. package/payload/skills/odoo18-docs/assets/icon-small.svg +5 -0
  124. package/payload/skills/odoo18-docs/references/catalog/administration-catalog.md +44 -0
  125. package/payload/skills/odoo18-docs/references/catalog/applications-catalog.md +949 -0
  126. package/payload/skills/odoo18-docs/references/catalog/contributing-catalog.md +18 -0
  127. package/payload/skills/odoo18-docs/references/catalog/developer-catalog.md +162 -0
  128. package/payload/skills/odoo18-docs/references/docs/administration/hosting.md +115 -0
  129. package/payload/skills/odoo18-docs/references/docs/administration/mobile.md +69 -0
  130. package/payload/skills/odoo18-docs/references/docs/administration/neutralized_database.md +39 -0
  131. package/payload/skills/odoo18-docs/references/docs/administration/odoo_accounts.md +105 -0
  132. package/payload/skills/odoo18-docs/references/docs/administration/odoo_online.md +198 -0
  133. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/advanced/containers.md +235 -0
  134. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/advanced/frequent_technical_questions.md +60 -0
  135. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/advanced/submodules.md +109 -0
  136. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/advanced.md +15 -0
  137. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/branches.md +543 -0
  138. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/builds.md +121 -0
  139. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/create.md +192 -0
  140. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/first_module.md +518 -0
  141. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/online-editor.md +196 -0
  142. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/settings.md +332 -0
  143. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started/status.md +15 -0
  144. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/getting_started.md +19 -0
  145. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/overview/introduction.md +14 -0
  146. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh/overview.md +13 -0
  147. package/payload/skills/odoo18-docs/references/docs/administration/odoo_sh.md +15 -0
  148. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/community_to_enterprise.md +106 -0
  149. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/deploy.md +901 -0
  150. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/email_gateway.md +51 -0
  151. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/geo_ip.md +65 -0
  152. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/packages.md +166 -0
  153. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/source.md +487 -0
  154. package/payload/skills/odoo18-docs/references/docs/administration/on_premise/update.md +146 -0
  155. package/payload/skills/odoo18-docs/references/docs/administration/on_premise.md +114 -0
  156. package/payload/skills/odoo18-docs/references/docs/administration/supported_versions.md +110 -0
  157. package/payload/skills/odoo18-docs/references/docs/administration/upgrade.md +436 -0
  158. package/payload/skills/odoo18-docs/references/docs/applications/essentials/activities.md +336 -0
  159. package/payload/skills/odoo18-docs/references/docs/applications/essentials/contacts/merge.md +80 -0
  160. package/payload/skills/odoo18-docs/references/docs/applications/essentials/contacts.md +248 -0
  161. package/payload/skills/odoo18-docs/references/docs/applications/essentials/export_import_data.md +532 -0
  162. package/payload/skills/odoo18-docs/references/docs/applications/essentials/html_editor.md +295 -0
  163. package/payload/skills/odoo18-docs/references/docs/applications/essentials/in_app_purchase.md +185 -0
  164. package/payload/skills/odoo18-docs/references/docs/applications/essentials/keyboard_shortcuts.md +89 -0
  165. package/payload/skills/odoo18-docs/references/docs/applications/essentials/reporting.md +185 -0
  166. package/payload/skills/odoo18-docs/references/docs/applications/essentials/search.md +275 -0
  167. package/payload/skills/odoo18-docs/references/docs/applications/essentials.md +18 -0
  168. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/bank_synchronization/enablebanking.md +36 -0
  169. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/bank_synchronization/ponto.md +103 -0
  170. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/bank_synchronization/saltedge.md +96 -0
  171. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/bank_synchronization.md +197 -0
  172. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/foreign_currency.md +115 -0
  173. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/internal_transfers.md +73 -0
  174. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/loans.md +70 -0
  175. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/reconciliation.md +138 -0
  176. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/reconciliation_models.md +121 -0
  177. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank/transactions.md +136 -0
  178. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/bank.md +194 -0
  179. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/cash_discounts.md +176 -0
  180. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/cash_rounding.md +42 -0
  181. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/credit_notes.md +119 -0
  182. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/customer_addresses.md +46 -0
  183. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/deferred_revenues.md +187 -0
  184. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.md +55 -0
  185. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.md +53 -0
  186. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.md +51 -0
  187. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.md +54 -0
  188. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.md +54 -0
  189. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.md +52 -0
  190. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.md +52 -0
  191. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.md +51 -0
  192. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.md +48 -0
  193. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.md +51 -0
  194. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.md +48 -0
  195. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.md +48 -0
  196. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/france.md +51 -0
  197. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.md +48 -0
  198. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.md +47 -0
  199. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.md +47 -0
  200. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.md +51 -0
  201. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.md +46 -0
  202. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.md +47 -0
  203. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.md +48 -0
  204. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.md +58 -0
  205. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.md +47 -0
  206. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.md +45 -0
  207. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.md +56 -0
  208. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.md +46 -0
  209. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.md +49 -0
  210. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.md +55 -0
  211. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.md +46 -0
  212. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.md +51 -0
  213. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.md +58 -0
  214. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/electronic_invoicing.md +294 -0
  215. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/epc_qr_code.md +62 -0
  216. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/incoterms.md +59 -0
  217. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/overview.md +154 -0
  218. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/payment_terms.md +185 -0
  219. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/sequence.md +68 -0
  220. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/snailmail.md +55 -0
  221. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices/terms_conditions.md +42 -0
  222. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/customer_invoices.md +231 -0
  223. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/avg_price_valuation.md +433 -0
  224. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/chart_of_accounts.md +189 -0
  225. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/cheat_sheet.md +252 -0
  226. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/consolidation.md +182 -0
  227. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/multi_currency.md +157 -0
  228. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started/tax_units.md +70 -0
  229. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/get_started.md +189 -0
  230. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/batch.md +69 -0
  231. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/batch_sdd.md +126 -0
  232. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/checks.md +126 -0
  233. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/follow_up.md +154 -0
  234. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/forecast.md +49 -0
  235. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/online/install_portal_patch.md +58 -0
  236. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/online.md +50 -0
  237. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/pay_checks.md +59 -0
  238. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/pay_sepa.md +87 -0
  239. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments/trusted_accounts.md +63 -0
  240. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/payments.md +375 -0
  241. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/analytic_accounting.md +138 -0
  242. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/budget.md +167 -0
  243. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/customize.md +308 -0
  244. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/data_inalterability.md +115 -0
  245. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/intrastat.md +189 -0
  246. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/silverfin.md +69 -0
  247. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/tax_carryover.md +42 -0
  248. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/tax_returns.md +114 -0
  249. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting/year_end.md +114 -0
  250. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/reporting.md +138 -0
  251. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/B2B_B2C.md +182 -0
  252. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/avatax/avalara_portal.md +252 -0
  253. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/avatax/avatax_use.md +164 -0
  254. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/avatax.md +423 -0
  255. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/cash_basis.md +118 -0
  256. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/eu_distance_selling.md +66 -0
  257. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/fiscal_positions.md +116 -0
  258. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/retention.md +44 -0
  259. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes/vat_verification.md +44 -0
  260. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/taxes.md +336 -0
  261. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/vendor_bills/assets.md +244 -0
  262. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/vendor_bills/deferred_expenses.md +187 -0
  263. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/vendor_bills/invoice_digitization.md +98 -0
  264. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/vendor_bills/sequence.md +68 -0
  265. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting/vendor_bills.md +116 -0
  266. package/payload/skills/odoo18-docs/references/docs/applications/finance/accounting.md +243 -0
  267. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/approve_expenses.md +118 -0
  268. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/expense_reports.md +131 -0
  269. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/log_expenses.md +228 -0
  270. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/post_expenses.md +77 -0
  271. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/reimburse.md +140 -0
  272. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses/reinvoice_expenses.md +150 -0
  273. package/payload/skills/odoo18-docs/references/docs/applications/finance/expenses.md +105 -0
  274. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/argentina.md +1164 -0
  275. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/australia.md +498 -0
  276. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/austria.md +126 -0
  277. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/belgium.md +615 -0
  278. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/brazil.md +574 -0
  279. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/canada.md +305 -0
  280. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/chile.md +1211 -0
  281. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/colombia.md +480 -0
  282. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/denmark.md +83 -0
  283. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/ecuador.md +760 -0
  284. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/egypt.md +234 -0
  285. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/employment_hero.md +78 -0
  286. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/france.md +629 -0
  287. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/germany.md +330 -0
  288. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/hong_kong.md +89 -0
  289. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/india.md +702 -0
  290. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/indonesia.md +174 -0
  291. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/italy.md +726 -0
  292. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/jordan.md +250 -0
  293. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/kenya.md +361 -0
  294. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/luxembourg.md +100 -0
  295. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/malaysia.md +225 -0
  296. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/mexico.md +1078 -0
  297. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/netherlands.md +28 -0
  298. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/new_zealand.md +18 -0
  299. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/peru.md +1009 -0
  300. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/philippines.md +184 -0
  301. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/romania.md +165 -0
  302. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/saudi_arabia.md +136 -0
  303. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/singapore.md +66 -0
  304. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/spain.md +201 -0
  305. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/switzerland.md +144 -0
  306. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/thailand.md +158 -0
  307. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/united_arab_emirates.md +203 -0
  308. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/united_kingdom.md +389 -0
  309. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/united_states.md +738 -0
  310. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/uruguay.md +375 -0
  311. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations/vietnam.md +263 -0
  312. package/payload/skills/odoo18-docs/references/docs/applications/finance/fiscal_localizations.md +192 -0
  313. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/adyen.md +159 -0
  314. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/amazon_payment_services.md +46 -0
  315. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/asiapay.md +52 -0
  316. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/authorize.md +162 -0
  317. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/buckaroo.md +39 -0
  318. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/demo.md +40 -0
  319. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/flutterwave.md +46 -0
  320. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/mercado_pago.md +42 -0
  321. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/mollie.md +33 -0
  322. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/nuvei.md +88 -0
  323. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/paypal.md +81 -0
  324. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/razorpay.md +56 -0
  325. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/stripe.md +119 -0
  326. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/wire_transfer.md +57 -0
  327. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/worldline.md +68 -0
  328. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers/xendit.md +57 -0
  329. package/payload/skills/odoo18-docs/references/docs/applications/finance/payment_providers.md +459 -0
  330. package/payload/skills/odoo18-docs/references/docs/applications/finance.md +15 -0
  331. package/payload/skills/odoo18-docs/references/docs/applications/general/apps_modules.md +90 -0
  332. package/payload/skills/odoo18-docs/references/docs/applications/general/companies/digest_emails.md +259 -0
  333. package/payload/skills/odoo18-docs/references/docs/applications/general/companies/email_template.md +288 -0
  334. package/payload/skills/odoo18-docs/references/docs/applications/general/companies.md +251 -0
  335. package/payload/skills/odoo18-docs/references/docs/applications/general/developer_mode.md +68 -0
  336. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/azure_oauth.md +285 -0
  337. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/email_domain.md +152 -0
  338. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/email_servers_inbound.md +350 -0
  339. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/email_servers_outbound.md +326 -0
  340. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/faq.md +369 -0
  341. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/google_oauth.md +210 -0
  342. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication/mailjet_api.md +185 -0
  343. package/payload/skills/odoo18-docs/references/docs/applications/general/email_communication.md +111 -0
  344. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/barcodelookup.md +41 -0
  345. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/geolocation.md +43 -0
  346. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/google_translate.md +121 -0
  347. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/mail_plugins/gmail.md +159 -0
  348. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/mail_plugins/outlook.md +154 -0
  349. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/mail_plugins.md +58 -0
  350. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations/unsplash.md +34 -0
  351. package/payload/skills/odoo18-docs/references/docs/applications/general/integrations.md +15 -0
  352. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/connect.md +141 -0
  353. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/camera.md +83 -0
  354. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/footswitch.md +54 -0
  355. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/measurement_tool.md +92 -0
  356. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/printer.md +481 -0
  357. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/scale.md +81 -0
  358. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices/screen.md +110 -0
  359. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/devices.md +27 -0
  360. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/iot_advanced/https_certificate_iot.md +160 -0
  361. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/iot_advanced/ssh_connect.md +39 -0
  362. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/iot_advanced/updating_iot.md +91 -0
  363. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/iot_advanced.md +14 -0
  364. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/iot_box.md +94 -0
  365. package/payload/skills/odoo18-docs/references/docs/applications/general/iot/windows_iot.md +171 -0
  366. package/payload/skills/odoo18-docs/references/docs/applications/general/iot.md +89 -0
  367. package/payload/skills/odoo18-docs/references/docs/applications/general/multi_company.md +131 -0
  368. package/payload/skills/odoo18-docs/references/docs/applications/general/users/2fa.md +125 -0
  369. package/payload/skills/odoo18-docs/references/docs/applications/general/users/access_rights.md +187 -0
  370. package/payload/skills/odoo18-docs/references/docs/applications/general/users/azure.md +178 -0
  371. package/payload/skills/odoo18-docs/references/docs/applications/general/users/facebook.md +130 -0
  372. package/payload/skills/odoo18-docs/references/docs/applications/general/users/google.md +163 -0
  373. package/payload/skills/odoo18-docs/references/docs/applications/general/users/language.md +50 -0
  374. package/payload/skills/odoo18-docs/references/docs/applications/general/users/ldap.md +48 -0
  375. package/payload/skills/odoo18-docs/references/docs/applications/general/users/portal.md +168 -0
  376. package/payload/skills/odoo18-docs/references/docs/applications/general/users.md +235 -0
  377. package/payload/skills/odoo18-docs/references/docs/applications/general.md +18 -0
  378. package/payload/skills/odoo18-docs/references/docs/applications/hr/appraisals/appraisal_analysis.md +117 -0
  379. package/payload/skills/odoo18-docs/references/docs/applications/hr/appraisals/goals.md +87 -0
  380. package/payload/skills/odoo18-docs/references/docs/applications/hr/appraisals/new_appraisals.md +275 -0
  381. package/payload/skills/odoo18-docs/references/docs/applications/hr/appraisals/skills_evolution.md +165 -0
  382. package/payload/skills/odoo18-docs/references/docs/applications/hr/appraisals.md +182 -0
  383. package/payload/skills/odoo18-docs/references/docs/applications/hr/attendances/check_in_check_out.md +90 -0
  384. package/payload/skills/odoo18-docs/references/docs/applications/hr/attendances/hardware.md +107 -0
  385. package/payload/skills/odoo18-docs/references/docs/applications/hr/attendances/kiosks.md +185 -0
  386. package/payload/skills/odoo18-docs/references/docs/applications/hr/attendances.md +303 -0
  387. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/certifications.md +118 -0
  388. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/departments.md +150 -0
  389. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/equipment.md +86 -0
  390. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/new_employee.md +532 -0
  391. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/offboarding.md +106 -0
  392. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees/retention_report.md +106 -0
  393. package/payload/skills/odoo18-docs/references/docs/applications/hr/employees.md +22 -0
  394. package/payload/skills/odoo18-docs/references/docs/applications/hr/fleet/accidents.md +275 -0
  395. package/payload/skills/odoo18-docs/references/docs/applications/hr/fleet/models.md +198 -0
  396. package/payload/skills/odoo18-docs/references/docs/applications/hr/fleet/new_vehicle.md +326 -0
  397. package/payload/skills/odoo18-docs/references/docs/applications/hr/fleet/service.md +509 -0
  398. package/payload/skills/odoo18-docs/references/docs/applications/hr/fleet.md +94 -0
  399. package/payload/skills/odoo18-docs/references/docs/applications/hr/frontdesk/visitors.md +162 -0
  400. package/payload/skills/odoo18-docs/references/docs/applications/hr/frontdesk.md +223 -0
  401. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch/management.md +189 -0
  402. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch/orders.md +220 -0
  403. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch/products.md +65 -0
  404. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch/user-accounts.md +104 -0
  405. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch/vendors.md +160 -0
  406. package/payload/skills/odoo18-docs/references/docs/applications/hr/lunch.md +130 -0
  407. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/contracts.md +295 -0
  408. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations/australia.md +858 -0
  409. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations/belgium.md +3024 -0
  410. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations/hong_kong.md +433 -0
  411. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations/jordan.md +125 -0
  412. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations/united_arab_emirates.md +401 -0
  413. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payroll_localizations.md +60 -0
  414. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/payslips.md +453 -0
  415. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/reporting.md +226 -0
  416. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/salary_attachment.md +66 -0
  417. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/salary_attachments.md +155 -0
  418. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/work_entries.md +332 -0
  419. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll/work_entry_analysis.md +82 -0
  420. package/payload/skills/odoo18-docs/references/docs/applications/hr/payroll.md +912 -0
  421. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/add-new-applicants.md +167 -0
  422. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/new_job.md +139 -0
  423. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/offer_job_positions.md +160 -0
  424. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/recruitment-flow.md +228 -0
  425. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/recruitment_analysis.md +102 -0
  426. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/refuse_applicant.md +144 -0
  427. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/schedule_interviews.md +319 -0
  428. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/source_analysis.md +86 -0
  429. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/team_performance.md +96 -0
  430. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment/time_in_stage.md +81 -0
  431. package/payload/skills/odoo18-docs/references/docs/applications/hr/recruitment.md +387 -0
  432. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals/alerts.md +62 -0
  433. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals/points.md +74 -0
  434. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals/reporting.md +89 -0
  435. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals/rewards.md +89 -0
  436. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals/share_jobs.md +161 -0
  437. package/payload/skills/odoo18-docs/references/docs/applications/hr/referrals.md +266 -0
  438. package/payload/skills/odoo18-docs/references/docs/applications/hr/time_off/allocations.md +176 -0
  439. package/payload/skills/odoo18-docs/references/docs/applications/hr/time_off/management.md +151 -0
  440. package/payload/skills/odoo18-docs/references/docs/applications/hr/time_off/my_time.md +114 -0
  441. package/payload/skills/odoo18-docs/references/docs/applications/hr/time_off/request_time_off.md +74 -0
  442. package/payload/skills/odoo18-docs/references/docs/applications/hr/time_off.md +585 -0
  443. package/payload/skills/odoo18-docs/references/docs/applications/hr.md +21 -0
  444. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/adjustments.md +185 -0
  445. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.md +240 -0
  446. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.md +226 -0
  447. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/gs1_usage.md +235 -0
  448. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/process_transfers.md +58 -0
  449. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.md +203 -0
  450. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations/transfers_scratch.md +222 -0
  451. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/operations.md +20 -0
  452. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.md +206 -0
  453. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/setup/hardware.md +162 -0
  454. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/setup/software.md +100 -0
  455. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode/setup.md +16 -0
  456. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/barcode.md +25 -0
  457. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/configure/package.md +210 -0
  458. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/configure/packaging.md +184 -0
  459. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/configure/type.md +339 -0
  460. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/configure/uom.md +167 -0
  461. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/configure.md +169 -0
  462. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.md +484 -0
  463. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.md +167 -0
  464. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.md +176 -0
  465. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.md +204 -0
  466. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.md +17 -0
  467. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.md +254 -0
  468. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.md +405 -0
  469. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.md +90 -0
  470. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.md +373 -0
  471. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management/product_tracking.md +109 -0
  472. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/product_management.md +15 -0
  473. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.md +94 -0
  474. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.md +119 -0
  475. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.md +86 -0
  476. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.md +123 -0
  477. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.md +96 -0
  478. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.md +144 -0
  479. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.md +224 -0
  480. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.md +111 -0
  481. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.md +232 -0
  482. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.md +173 -0
  483. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.md +336 -0
  484. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.md +162 -0
  485. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.md +219 -0
  486. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.md +167 -0
  487. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.md +135 -0
  488. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.md +15 -0
  489. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.md +100 -0
  490. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.md +128 -0
  491. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.md +99 -0
  492. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.md +75 -0
  493. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.md +69 -0
  494. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.md +180 -0
  495. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.md +92 -0
  496. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.md +154 -0
  497. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.md +141 -0
  498. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.md +112 -0
  499. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.md +107 -0
  500. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.md +52 -0
  501. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.md +130 -0
  502. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.md +258 -0
  503. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/envia_shipping.md +287 -0
  504. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.md +169 -0
  505. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.md +123 -0
  506. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.md +73 -0
  507. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.md +163 -0
  508. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.md +118 -0
  509. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.md +195 -0
  510. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.md +327 -0
  511. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.md +307 -0
  512. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.md +235 -0
  513. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.md +339 -0
  514. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.md +205 -0
  515. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.md +234 -0
  516. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.md +89 -0
  517. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/shipping_receiving.md +17 -0
  518. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.md +341 -0
  519. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.md +124 -0
  520. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.md +109 -0
  521. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.md +118 -0
  522. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.md +147 -0
  523. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.md +77 -0
  524. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.md +140 -0
  525. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.md +376 -0
  526. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.md +142 -0
  527. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.md +552 -0
  528. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.md +140 -0
  529. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.md +170 -0
  530. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.md +117 -0
  531. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.md +223 -0
  532. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/forecast.md +163 -0
  533. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.md +159 -0
  534. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.md +102 -0
  535. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.md +137 -0
  536. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.md +17 -0
  537. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory/warehouses_storage.md +15 -0
  538. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/inventory.md +24 -0
  539. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/maintenance/add_new_equipment.md +94 -0
  540. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/maintenance/maintenance_calendar.md +373 -0
  541. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/maintenance/maintenance_requests.md +108 -0
  542. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/maintenance/maintenance_setup.md +240 -0
  543. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/maintenance.md +26 -0
  544. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.md +110 -0
  545. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.md +190 -0
  546. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.md +203 -0
  547. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.md +283 -0
  548. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.md +118 -0
  549. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/advanced_configuration.md +17 -0
  550. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.md +257 -0
  551. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.md +100 -0
  552. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.md +231 -0
  553. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.md +157 -0
  554. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.md +191 -0
  555. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.md +176 -0
  556. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/basic_setup.md +18 -0
  557. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/reporting/allocation.md +132 -0
  558. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/reporting/oee.md +163 -0
  559. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.md +164 -0
  560. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/reporting.md +14 -0
  561. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.md +256 -0
  562. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.md +120 -0
  563. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/shop_floor.md +14 -0
  564. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.md +102 -0
  565. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.md +191 -0
  566. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.md +161 -0
  567. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.md +195 -0
  568. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.md +256 -0
  569. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.md +270 -0
  570. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/subcontracting.md +135 -0
  571. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/byproducts.md +77 -0
  572. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.md +241 -0
  573. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.md +136 -0
  574. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.md +133 -0
  575. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.md +95 -0
  576. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/split_merge.md +84 -0
  577. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.md +92 -0
  578. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/use_mps.md +269 -0
  579. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.md +112 -0
  580. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing/workflows.md +21 -0
  581. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/manufacturing.md +29 -0
  582. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/manage_changes/eco_type.md +140 -0
  583. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.md +331 -0
  584. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/manage_changes/version_control.md +168 -0
  585. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/manage_changes.md +14 -0
  586. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/management/approvals.md +103 -0
  587. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm/management.md +12 -0
  588. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/plm.md +23 -0
  589. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/advanced/analyze.md +147 -0
  590. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/advanced/edi.md +109 -0
  591. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.md +128 -0
  592. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.md +107 -0
  593. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/advanced.md +16 -0
  594. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.md +185 -0
  595. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.md +248 -0
  596. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/control_bills.md +158 -0
  597. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/manage.md +237 -0
  598. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.md +81 -0
  599. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals/rfq.md +213 -0
  600. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/manage_deals.md +18 -0
  601. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/products/pricelist.md +253 -0
  602. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/products/reordering.md +105 -0
  603. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/products/temporary_reordering.md +132 -0
  604. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase/products.md +15 -0
  605. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/purchase.md +24 -0
  606. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.md +98 -0
  607. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_check_types/measure_check.md +208 -0
  608. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.md +144 -0
  609. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_check_types/picture_check.md +181 -0
  610. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_check_types.md +16 -0
  611. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_management/failure_locations.md +108 -0
  612. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_management/quality_alerts.md +111 -0
  613. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_management/quality_checks.md +156 -0
  614. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_management/quality_control_points.md +149 -0
  615. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality/quality_management.md +16 -0
  616. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/quality.md +24 -0
  617. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/repairs/repair_orders.md +266 -0
  618. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp/repairs.md +19 -0
  619. package/payload/skills/odoo18-docs/references/docs/applications/inventory_and_mrp.md +19 -0
  620. package/payload/skills/odoo18-docs/references/docs/applications/marketing/email_marketing/analyze_metrics.md +209 -0
  621. package/payload/skills/odoo18-docs/references/docs/applications/marketing/email_marketing/lost_leads_email.md +350 -0
  622. package/payload/skills/odoo18-docs/references/docs/applications/marketing/email_marketing/mailing_lists.md +225 -0
  623. package/payload/skills/odoo18-docs/references/docs/applications/marketing/email_marketing/unsubscriptions.md +129 -0
  624. package/payload/skills/odoo18-docs/references/docs/applications/marketing/email_marketing.md +813 -0
  625. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/create_events.md +425 -0
  626. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/event_booths.md +269 -0
  627. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/event_templates.md +216 -0
  628. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/event_tracks.md +306 -0
  629. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/registration_desk.md +83 -0
  630. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/revenues_report.md +188 -0
  631. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/sell_tickets.md +144 -0
  632. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events/track_manage_talks.md +143 -0
  633. package/payload/skills/odoo18-docs/references/docs/applications/marketing/events.md +255 -0
  634. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/campaign_templates/double_optin.md +156 -0
  635. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/campaign_templates.md +13 -0
  636. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/target_audience.md +87 -0
  637. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/testing_running.md +154 -0
  638. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/understanding_metrics.md +179 -0
  639. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation/workflow_activities.md +331 -0
  640. package/payload/skills/odoo18-docs/references/docs/applications/marketing/marketing_automation.md +200 -0
  641. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing/create_sms.md +117 -0
  642. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing/mailing_lists_blacklists.md +144 -0
  643. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing/marketing_campaigns.md +156 -0
  644. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing/pricing_and_faq.md +114 -0
  645. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing/sms_analysis.md +98 -0
  646. package/payload/skills/odoo18-docs/references/docs/applications/marketing/sms_marketing.md +85 -0
  647. package/payload/skills/odoo18-docs/references/docs/applications/marketing/social_marketing/social_campaigns.md +147 -0
  648. package/payload/skills/odoo18-docs/references/docs/applications/marketing/social_marketing/social_posts.md +386 -0
  649. package/payload/skills/odoo18-docs/references/docs/applications/marketing/social_marketing.md +163 -0
  650. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys/analysis.md +259 -0
  651. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys/create.md +326 -0
  652. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys/live_session.md +218 -0
  653. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys/questions.md +331 -0
  654. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys/scoring.md +60 -0
  655. package/payload/skills/odoo18-docs/references/docs/applications/marketing/surveys.md +264 -0
  656. package/payload/skills/odoo18-docs/references/docs/applications/marketing.md +18 -0
  657. package/payload/skills/odoo18-docs/references/docs/applications/productivity/appointments.md +195 -0
  658. package/payload/skills/odoo18-docs/references/docs/applications/productivity/calendar/google.md +254 -0
  659. package/payload/skills/odoo18-docs/references/docs/applications/productivity/calendar/outlook.md +249 -0
  660. package/payload/skills/odoo18-docs/references/docs/applications/productivity/calendar.md +280 -0
  661. package/payload/skills/odoo18-docs/references/docs/applications/productivity/data_cleaning.md +474 -0
  662. package/payload/skills/odoo18-docs/references/docs/applications/productivity/discuss/canned_responses.md +135 -0
  663. package/payload/skills/odoo18-docs/references/docs/applications/productivity/discuss/chatter.md +413 -0
  664. package/payload/skills/odoo18-docs/references/docs/applications/productivity/discuss/ice_servers.md +83 -0
  665. package/payload/skills/odoo18-docs/references/docs/applications/productivity/discuss/team_communication.md +112 -0
  666. package/payload/skills/odoo18-docs/references/docs/applications/productivity/discuss.md +168 -0
  667. package/payload/skills/odoo18-docs/references/docs/applications/productivity/documents.md +378 -0
  668. package/payload/skills/odoo18-docs/references/docs/applications/productivity/knowledge/articles_editing.md +138 -0
  669. package/payload/skills/odoo18-docs/references/docs/applications/productivity/knowledge/management.md +204 -0
  670. package/payload/skills/odoo18-docs/references/docs/applications/productivity/knowledge/properties.md +103 -0
  671. package/payload/skills/odoo18-docs/references/docs/applications/productivity/knowledge.md +27 -0
  672. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/algeria.md +72 -0
  673. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/angola.md +74 -0
  674. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/argentina.md +73 -0
  675. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/australia.md +71 -0
  676. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/azerbaijan.md +72 -0
  677. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/bangladesh.md +72 -0
  678. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/brazil.md +76 -0
  679. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/canada.md +74 -0
  680. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/chile.md +75 -0
  681. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/china.md +71 -0
  682. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/colombia.md +74 -0
  683. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/dominican_republic.md +72 -0
  684. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/ecuador.md +72 -0
  685. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/egypt.md +71 -0
  686. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/ethiopia.md +71 -0
  687. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/germany.md +73 -0
  688. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/guatemala.md +71 -0
  689. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/hong_kong.md +71 -0
  690. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/india.md +75 -0
  691. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/indonesia.md +77 -0
  692. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/iran.md +70 -0
  693. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/iraq.md +75 -0
  694. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/israel.md +71 -0
  695. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/japan.md +72 -0
  696. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/kazakhstan.md +73 -0
  697. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/kenya.md +71 -0
  698. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/kuwait.md +70 -0
  699. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/malaysia.md +73 -0
  700. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/mexico.md +74 -0
  701. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/morocco.md +72 -0
  702. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/new_zealand.md +72 -0
  703. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/nigeria.md +70 -0
  704. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/norway.md +73 -0
  705. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/oman.md +71 -0
  706. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/pakistan.md +72 -0
  707. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/peru.md +74 -0
  708. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/philippines.md +74 -0
  709. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/qatar.md +72 -0
  710. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/russia.md +76 -0
  711. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/saudi_arabia.md +71 -0
  712. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/singapore.md +69 -0
  713. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/south_africa.md +72 -0
  714. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/south_korea.md +74 -0
  715. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/switzerland.md +72 -0
  716. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/thailand.md +69 -0
  717. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/turkey.md +73 -0
  718. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/ukraine.md +71 -0
  719. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/united_arab_emirates.md +74 -0
  720. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/united_kingdom.md +78 -0
  721. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/uzbekistan.md +72 -0
  722. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign/vietnam.md +74 -0
  723. package/payload/skills/odoo18-docs/references/docs/applications/productivity/sign.md +371 -0
  724. package/payload/skills/odoo18-docs/references/docs/applications/productivity/spreadsheet/functions.md +826 -0
  725. package/payload/skills/odoo18-docs/references/docs/applications/productivity/spreadsheet/global_filters.md +202 -0
  726. package/payload/skills/odoo18-docs/references/docs/applications/productivity/spreadsheet/insert.md +60 -0
  727. package/payload/skills/odoo18-docs/references/docs/applications/productivity/spreadsheet/templates.md +70 -0
  728. package/payload/skills/odoo18-docs/references/docs/applications/productivity/spreadsheet.md +46 -0
  729. package/payload/skills/odoo18-docs/references/docs/applications/productivity/to_do.md +92 -0
  730. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/axivox_config.md +74 -0
  731. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/call_queues.md +236 -0
  732. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/conference_calls.md +99 -0
  733. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/dial_plan_advanced.md +403 -0
  734. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/dial_plan_basics.md +199 -0
  735. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/dynamic_caller_id.md +114 -0
  736. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/manage_users.md +340 -0
  737. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox/vm_audio_messages.md +257 -0
  738. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/axivox.md +20 -0
  739. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/devices_integrations.md +196 -0
  740. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/onsip.md +162 -0
  741. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip/voip_widget.md +196 -0
  742. package/payload/skills/odoo18-docs/references/docs/applications/productivity/voip.md +106 -0
  743. package/payload/skills/odoo18-docs/references/docs/applications/productivity/whatsapp.md +869 -0
  744. package/payload/skills/odoo18-docs/references/docs/applications/productivity.md +23 -0
  745. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads/convert.md +99 -0
  746. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads/email_manual.md +128 -0
  747. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads/lead_mining.md +117 -0
  748. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads/opportunities_form.md +119 -0
  749. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads/send_quotes.md +223 -0
  750. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/acquire_leads.md +17 -0
  751. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/optimize/gamification.md +154 -0
  752. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/optimize/lead_enrichment.md +123 -0
  753. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/optimize/partner_autocomplete.md +84 -0
  754. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/optimize/utilize_activities.md +251 -0
  755. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/optimize.md +16 -0
  756. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/performance/expected_revenue_report.md +210 -0
  757. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/performance/forecast_report.md +108 -0
  758. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/performance/win_loss.md +649 -0
  759. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/performance.md +15 -0
  760. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/pipeline/lost_opportunities.md +208 -0
  761. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/pipeline/manage_sales_teams.md +109 -0
  762. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/pipeline/merge_similar.md +113 -0
  763. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/pipeline.md +15 -0
  764. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/lead_distribution_report.md +191 -0
  765. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/lead_scoring.md +186 -0
  766. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/marketing_attribution.md +161 -0
  767. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/quality_leads_report.md +217 -0
  768. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/resellers.md +129 -0
  769. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads/unattended_leads_report.md +185 -0
  770. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm/track_leads.md +18 -0
  771. package/payload/skills/odoo18-docs/references/docs/applications/sales/crm.md +27 -0
  772. package/payload/skills/odoo18-docs/references/docs/applications/sales/members/members_analysis.md +57 -0
  773. package/payload/skills/odoo18-docs/references/docs/applications/sales/members.md +91 -0
  774. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/combos.md +62 -0
  775. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/configuration/epos_printers.md +69 -0
  776. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/configuration/epos_ssc.md +286 -0
  777. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/configuration/https.md +25 -0
  778. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/configuration/pos_iot.md +60 -0
  779. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/configuration.md +93 -0
  780. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/employee_login.md +75 -0
  781. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/online_food_delivery.md +208 -0
  782. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/qr_code_payment.md +106 -0
  783. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/adyen.md +85 -0
  784. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/ingenico.md +52 -0
  785. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.md +101 -0
  786. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/razorpay.md +57 -0
  787. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/six.md +60 -0
  788. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/stripe.md +106 -0
  789. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/tyro.md +63 -0
  790. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.md +116 -0
  791. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals/worldline.md +90 -0
  792. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods/terminals.md +62 -0
  793. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/payment_methods.md +36 -0
  794. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pos_based_marketing.md +119 -0
  795. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/preparation.md +109 -0
  796. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/cash_rounding.md +49 -0
  797. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/discount_tags.md +54 -0
  798. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/discounts.md +99 -0
  799. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/electronic_labels.md +183 -0
  800. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/fiscal_position.md +53 -0
  801. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/loyalty.md +47 -0
  802. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing/pricelists.md +130 -0
  803. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/pricing.md +19 -0
  804. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/receipts_invoices.md +107 -0
  805. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/reporting.md +16 -0
  806. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/restaurant/bill_printing.md +42 -0
  807. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/restaurant/floors_tables.md +98 -0
  808. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/restaurant/kitchen_printing.md +66 -0
  809. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/restaurant/tips.md +89 -0
  810. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/restaurant.md +56 -0
  811. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/self_order.md +222 -0
  812. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop/barcode.md +59 -0
  813. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop/customer_display.md +61 -0
  814. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop/sales_order.md +49 -0
  815. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop/serial_numbers.md +62 -0
  816. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop/ship_later.md +47 -0
  817. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale/shop.md +17 -0
  818. package/payload/skills/odoo18-docs/references/docs/applications/sales/point_of_sale.md +189 -0
  819. package/payload/skills/odoo18-docs/references/docs/applications/sales/rental.md +276 -0
  820. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/amazon_connector/features.md +115 -0
  821. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/amazon_connector/manage.md +195 -0
  822. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/amazon_connector/setup.md +155 -0
  823. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/amazon_connector.md +15 -0
  824. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/gelato.md +159 -0
  825. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/down_payment.md +286 -0
  826. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/expense.md +258 -0
  827. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/invoicing_policy.md +86 -0
  828. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/milestone.md +240 -0
  829. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/proforma.md +73 -0
  830. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing/time_materials.md +364 -0
  831. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/invoicing.md +18 -0
  832. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/ewallets_giftcards.md +145 -0
  833. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/loyalty_discount.md +206 -0
  834. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/prices/currencies.md +224 -0
  835. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/prices/discounts.md +88 -0
  836. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/prices/pricing.md +280 -0
  837. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/prices.md +15 -0
  838. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/products/import.md +253 -0
  839. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/products/product_images.md +164 -0
  840. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/products/variants.md +291 -0
  841. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/products.md +15 -0
  842. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices/returns.md +119 -0
  843. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/products_prices.md +17 -0
  844. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/create_quotations.md +323 -0
  845. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/deadline.md +58 -0
  846. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/different_addresses.md +81 -0
  847. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/get_paid_to_validate.md +92 -0
  848. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/get_signature_to_validate.md +80 -0
  849. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/optional_products.md +101 -0
  850. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/orders_and_variants.md +116 -0
  851. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/pdf_quote_builder.md +266 -0
  852. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations/quote_template.md +256 -0
  853. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/sales_quotations.md +139 -0
  854. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/shopee_connector/manage.md +191 -0
  855. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/shopee_connector/setup.md +226 -0
  856. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales/shopee_connector.md +74 -0
  857. package/payload/skills/odoo18-docs/references/docs/applications/sales/sales.md +27 -0
  858. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/automatic_alerts.md +169 -0
  859. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/closing.md +107 -0
  860. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/ecommerce.md +28 -0
  861. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/payment_providers/wire_transfer.md +157 -0
  862. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/payment_providers.md +13 -0
  863. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/plans.md +104 -0
  864. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/products.md +158 -0
  865. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/renewals.md +133 -0
  866. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/reports.md +396 -0
  867. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/scheduled_actions.md +188 -0
  868. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions/upselling.md +111 -0
  869. package/payload/skills/odoo18-docs/references/docs/applications/sales/subscriptions.md +90 -0
  870. package/payload/skills/odoo18-docs/references/docs/applications/sales.md +18 -0
  871. package/payload/skills/odoo18-docs/references/docs/applications/services/field_service/creating_tasks.md +31 -0
  872. package/payload/skills/odoo18-docs/references/docs/applications/services/field_service/planning_itinerary.md +39 -0
  873. package/payload/skills/odoo18-docs/references/docs/applications/services/field_service/product_management.md +87 -0
  874. package/payload/skills/odoo18-docs/references/docs/applications/services/field_service/worksheets.md +66 -0
  875. package/payload/skills/odoo18-docs/references/docs/applications/services/field_service.md +22 -0
  876. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/advanced/after_sales.md +283 -0
  877. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/advanced/close_tickets.md +111 -0
  878. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/advanced/track_and_bill.md +248 -0
  879. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/advanced.md +15 -0
  880. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/help_center.md +344 -0
  881. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/ratings.md +116 -0
  882. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/receiving_tickets.md +341 -0
  883. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/reports.md +178 -0
  884. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/sla.md +213 -0
  885. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview/stages.md +111 -0
  886. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk/overview.md +18 -0
  887. package/payload/skills/odoo18-docs/references/docs/applications/services/helpdesk.md +183 -0
  888. package/payload/skills/odoo18-docs/references/docs/applications/services/planning.md +327 -0
  889. package/payload/skills/odoo18-docs/references/docs/applications/services/project/project_management/project_dashboard.md +123 -0
  890. package/payload/skills/odoo18-docs/references/docs/applications/services/project/project_management/project_profitability.md +107 -0
  891. package/payload/skills/odoo18-docs/references/docs/applications/services/project/project_management.md +118 -0
  892. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks/recurring_tasks.md +50 -0
  893. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks/sub-tasks.md +53 -0
  894. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks/task_creation.md +124 -0
  895. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks/task_dependencies.md +46 -0
  896. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks/task_stages_statuses.md +74 -0
  897. package/payload/skills/odoo18-docs/references/docs/applications/services/project/tasks.md +17 -0
  898. package/payload/skills/odoo18-docs/references/docs/applications/services/project.md +23 -0
  899. package/payload/skills/odoo18-docs/references/docs/applications/services/timesheets/overview/time_off.md +50 -0
  900. package/payload/skills/odoo18-docs/references/docs/applications/services/timesheets/overview.md +13 -0
  901. package/payload/skills/odoo18-docs/references/docs/applications/services/timesheets.md +20 -0
  902. package/payload/skills/odoo18-docs/references/docs/applications/services.md +17 -0
  903. package/payload/skills/odoo18-docs/references/docs/applications/studio/approval_rules.md +95 -0
  904. package/payload/skills/odoo18-docs/references/docs/applications/studio/automated_actions/webhooks.md +274 -0
  905. package/payload/skills/odoo18-docs/references/docs/applications/studio/automated_actions.md +354 -0
  906. package/payload/skills/odoo18-docs/references/docs/applications/studio/fields.md +547 -0
  907. package/payload/skills/odoo18-docs/references/docs/applications/studio/models_modules_apps.md +283 -0
  908. package/payload/skills/odoo18-docs/references/docs/applications/studio/pdf_reports.md +558 -0
  909. package/payload/skills/odoo18-docs/references/docs/applications/studio/views.md +363 -0
  910. package/payload/skills/odoo18-docs/references/docs/applications/studio.md +43 -0
  911. package/payload/skills/odoo18-docs/references/docs/applications/websites/blog.md +128 -0
  912. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/cart.md +110 -0
  913. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/checkout.md +171 -0
  914. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/customer_accounts.md +45 -0
  915. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/order_handling.md +109 -0
  916. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/payments.md +55 -0
  917. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/performance.md +63 -0
  918. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/products/catalog.md +200 -0
  919. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/products/cross_upselling.md +70 -0
  920. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/products/price_management.md +193 -0
  921. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/products.md +400 -0
  922. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce/shipping.md +124 -0
  923. package/payload/skills/odoo18-docs/references/docs/applications/websites/ecommerce.md +36 -0
  924. package/payload/skills/odoo18-docs/references/docs/applications/websites/elearning.md +245 -0
  925. package/payload/skills/odoo18-docs/references/docs/applications/websites/forum.md +394 -0
  926. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat/chatbots.md +260 -0
  927. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat/participate.md +98 -0
  928. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat/ratings.md +147 -0
  929. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat/reports.md +187 -0
  930. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat/responses.md +182 -0
  931. package/payload/skills/odoo18-docs/references/docs/applications/websites/livechat.md +255 -0
  932. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/address_autocomplete.md +64 -0
  933. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/cdn.md +109 -0
  934. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/cookies_bar.md +58 -0
  935. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/domain_names.md +368 -0
  936. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/google_search_console.md +99 -0
  937. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/multi_website.md +152 -0
  938. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/spam_protection.md +149 -0
  939. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration/translate.md +112 -0
  940. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/configuration.md +20 -0
  941. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/mail_groups.md +129 -0
  942. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/pages/menus.md +95 -0
  943. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/pages/seo.md +175 -0
  944. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/pages.md +194 -0
  945. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/reporting/analytics.md +178 -0
  946. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/reporting/link_tracker.md +74 -0
  947. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/reporting.md +14 -0
  948. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/building_blocks/dynamic_content.md +103 -0
  949. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/building_blocks/features.md +42 -0
  950. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/building_blocks/inner_content.md +36 -0
  951. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/building_blocks/structure.md +61 -0
  952. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/building_blocks.md +165 -0
  953. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/elements.md +194 -0
  954. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design/themes.md +164 -0
  955. package/payload/skills/odoo18-docs/references/docs/applications/websites/website/web_design.md +15 -0
  956. package/payload/skills/odoo18-docs/references/docs/applications/websites/website.md +66 -0
  957. package/payload/skills/odoo18-docs/references/docs/applications/websites.md +18 -0
  958. package/payload/skills/odoo18-docs/references/docs/contributing/development/coding_guidelines.md +1305 -0
  959. package/payload/skills/odoo18-docs/references/docs/contributing/development/git_guidelines.md +142 -0
  960. package/payload/skills/odoo18-docs/references/docs/contributing/development.md +175 -0
  961. package/payload/skills/odoo18-docs/references/docs/contributing/documentation/content_guidelines.md +329 -0
  962. package/payload/skills/odoo18-docs/references/docs/contributing/documentation/rst_guidelines.md +1317 -0
  963. package/payload/skills/odoo18-docs/references/docs/contributing/documentation.md +300 -0
  964. package/payload/skills/odoo18-docs/references/docs/contributing/install_git.md +25 -0
  965. package/payload/skills/odoo18-docs/references/docs/developer/glossary.md +46 -0
  966. package/payload/skills/odoo18-docs/references/docs/developer/howtos/accounting_localization.md +305 -0
  967. package/payload/skills/odoo18-docs/references/docs/developer/howtos/company.md +224 -0
  968. package/payload/skills/odoo18-docs/references/docs/developer/howtos/connect_device.md +191 -0
  969. package/payload/skills/odoo18-docs/references/docs/developer/howtos/create_reports.md +119 -0
  970. package/payload/skills/odoo18-docs/references/docs/developer/howtos/frontend_owl_components.md +180 -0
  971. package/payload/skills/odoo18-docs/references/docs/developer/howtos/javascript_client_action.md +50 -0
  972. package/payload/skills/odoo18-docs/references/docs/developer/howtos/javascript_field.md +101 -0
  973. package/payload/skills/odoo18-docs/references/docs/developer/howtos/javascript_view.md +259 -0
  974. package/payload/skills/odoo18-docs/references/docs/developer/howtos/scss_tips.md +233 -0
  975. package/payload/skills/odoo18-docs/references/docs/developer/howtos/standalone_owl_application.md +166 -0
  976. package/payload/skills/odoo18-docs/references/docs/developer/howtos/translations.md +261 -0
  977. package/payload/skills/odoo18-docs/references/docs/developer/howtos/upgrade_custom_db.md +303 -0
  978. package/payload/skills/odoo18-docs/references/docs/developer/howtos/web_services.md +149 -0
  979. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/animations.md +166 -0
  980. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/building_blocks.md +1179 -0
  981. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/forms.md +126 -0
  982. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/going_live.md +70 -0
  983. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/gradients.md +57 -0
  984. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/layout.md +846 -0
  985. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/media.md +190 -0
  986. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/navigation.md +267 -0
  987. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/pages.md +373 -0
  988. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/setup.md +297 -0
  989. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/shapes.md +299 -0
  990. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/theming.md +896 -0
  991. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes/translations.md +161 -0
  992. package/payload/skills/odoo18-docs/references/docs/developer/howtos/website_themes.md +41 -0
  993. package/payload/skills/odoo18-docs/references/docs/developer/howtos.md +112 -0
  994. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/actions.md +474 -0
  995. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/data.md +291 -0
  996. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/http.md +87 -0
  997. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/mixins.md +1060 -0
  998. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/module.md +159 -0
  999. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/orm/changelog.md +109 -0
  1000. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/orm.md +1234 -0
  1001. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/performance.md +448 -0
  1002. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/reports.md +318 -0
  1003. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/security.md +572 -0
  1004. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend/testing.md +958 -0
  1005. package/payload/skills/odoo18-docs/references/docs/developer/reference/backend.md +23 -0
  1006. package/payload/skills/odoo18-docs/references/docs/developer/reference/cli.md +965 -0
  1007. package/payload/skills/odoo18-docs/references/docs/developer/reference/external_api.md +1447 -0
  1008. package/payload/skills/odoo18-docs/references/docs/developer/reference/extract_api.md +563 -0
  1009. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/assets.md +356 -0
  1010. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/error_handling.md +568 -0
  1011. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/framework_overview.md +633 -0
  1012. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/hooks.md +341 -0
  1013. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/javascript_modules.md +361 -0
  1014. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/javascript_reference.md +1364 -0
  1015. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/mobile.md +201 -0
  1016. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/odoo_editor.md +227 -0
  1017. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/owl_components.md +1095 -0
  1018. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/patching_code.md +255 -0
  1019. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/qweb.md +976 -0
  1020. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/registries.md +298 -0
  1021. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend/services.md +886 -0
  1022. package/payload/skills/odoo18-docs/references/docs/developer/reference/frontend.md +26 -0
  1023. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_account.md +20 -0
  1024. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_account_tag.md +18 -0
  1025. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_fiscal_position.md +24 -0
  1026. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_group.md +16 -0
  1027. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_report.md +34 -0
  1028. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_report_line.md +21 -0
  1029. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_tax.md +30 -0
  1030. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account/account_tax_repartition.md +19 -0
  1031. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/account.md +20 -0
  1032. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/payment/payment_method.md +13 -0
  1033. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/payment/payment_provider.md +19 -0
  1034. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/payment/payment_token.md +16 -0
  1035. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/payment/payment_transaction.md +28 -0
  1036. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules/payment.md +16 -0
  1037. package/payload/skills/odoo18-docs/references/docs/developer/reference/standard_modules.md +14 -0
  1038. package/payload/skills/odoo18-docs/references/docs/developer/reference/upgrades/upgrade_scripts.md +108 -0
  1039. package/payload/skills/odoo18-docs/references/docs/developer/reference/upgrades/upgrade_utils.md +106 -0
  1040. package/payload/skills/odoo18-docs/references/docs/developer/reference/upgrades.md +14 -0
  1041. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/icons.md +361 -0
  1042. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/scss_inheritance.md +106 -0
  1043. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_context.md +19 -0
  1044. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_help.md +18 -0
  1045. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_icon.md +19 -0
  1046. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_name.md +14 -0
  1047. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_string.md +18 -0
  1048. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/button_attribute_type.md +31 -0
  1049. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/field_attribute_name.md +22 -0
  1050. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/field_attribute_readonly.md +20 -0
  1051. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/field_attribute_required.md +20 -0
  1052. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/field_attribute_string.md +13 -0
  1053. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/generic_attribute_class.md +39 -0
  1054. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/generic_attribute_column_invisible.md +22 -0
  1055. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/generic_attribute_groups.md +21 -0
  1056. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/generic_attribute_invisible.md +32 -0
  1057. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_create.md +13 -0
  1058. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_default_group_by.md +14 -0
  1059. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_default_order.md +23 -0
  1060. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_delete.md +13 -0
  1061. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_edit.md +13 -0
  1062. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_sample.md +21 -0
  1063. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures/root_attribute_string.md +14 -0
  1064. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_architectures.md +3899 -0
  1065. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface/view_records.md +366 -0
  1066. package/payload/skills/odoo18-docs/references/docs/developer/reference/user_interface.md +16 -0
  1067. package/payload/skills/odoo18-docs/references/docs/developer/reference.md +23 -0
  1068. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/backend.md +1332 -0
  1069. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/define_module_data.md +404 -0
  1070. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/discover_js_framework/01_owl_components.md +517 -0
  1071. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/discover_js_framework/02_build_a_dashboard.md +458 -0
  1072. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/discover_js_framework.md +48 -0
  1073. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/importable_modules.md +931 -0
  1074. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/master_odoo_web_framework/01_build_clicker_game.md +426 -0
  1075. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/master_odoo_web_framework/02_create_gallery_view.md +446 -0
  1076. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view.md +192 -0
  1077. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/master_odoo_web_framework.md +59 -0
  1078. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/mixins.md +16 -0
  1079. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/pdf_reports.md +291 -0
  1080. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/restrict_data_access.md +500 -0
  1081. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/01_architecture.md +131 -0
  1082. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/02_newapp.md +100 -0
  1083. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/03_basicmodel.md +298 -0
  1084. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/04_securityintro.md +124 -0
  1085. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/05_firstui.md +284 -0
  1086. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/06_basicviews.md +242 -0
  1087. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/07_relations.md +261 -0
  1088. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/08_compute_onchange.md +298 -0
  1089. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/09_actions.md +138 -0
  1090. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/10_constraints.md +127 -0
  1091. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/11_sprinkles.md +504 -0
  1092. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/12_inheritance.md +248 -0
  1093. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/13_other_module.md +170 -0
  1094. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/14_qwebintro.md +129 -0
  1095. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101/15_final_word.md +32 -0
  1096. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/server_framework_101.md +47 -0
  1097. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/setup_guide.md +302 -0
  1098. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/unit_tests.md +295 -0
  1099. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/web.md +2275 -0
  1100. package/payload/skills/odoo18-docs/references/docs/developer/tutorials/website.md +992 -0
  1101. package/payload/skills/odoo18-docs/references/docs/developer/tutorials.md +92 -0
  1102. package/payload/skills/odoo18-docs/references/url-mapping.json +3906 -0
  1103. package/payload/skills/prd/SKILL.md +333 -0
  1104. package/payload/skills/prd/agents/openai.yaml +6 -0
  1105. package/payload/skills/prd/assets/icon-large.svg +1 -0
  1106. package/payload/skills/prd/assets/icon-small.svg +5 -0
  1107. package/payload/skills/prd/evals/evals.json +23 -0
  1108. package/payload/skills/prd/references/output-template.md +197 -0
  1109. package/payload/skills/prd/references/section-guide.md +191 -0
  1110. package/payload/skills/review/SKILL.md +249 -0
  1111. package/payload/skills/review/agents/openai.yaml +6 -0
  1112. package/payload/skills/review/assets/icon-large.svg +1 -0
  1113. package/payload/skills/review/assets/icon-small.svg +5 -0
  1114. package/payload/skills/review/evals/evals.json +23 -0
  1115. package/payload/skills/review/references/brd-checklist.md +43 -0
  1116. package/payload/skills/review/references/gate-rules.md +73 -0
  1117. package/payload/skills/review/references/output-template.md +43 -0
  1118. package/payload/skills/review/references/prd-checklist.md +39 -0
  1119. package/payload/skills/review/references/solution-checklist.md +37 -0
  1120. package/payload/skills/review/references/trd-checklist.md +40 -0
  1121. package/payload/skills/review/references/uat-checklist.md +38 -0
  1122. package/payload/skills/solution/SKILL.md +389 -0
  1123. package/payload/skills/solution/agents/openai.yaml +6 -0
  1124. package/payload/skills/solution/assets/icon-large.svg +1 -0
  1125. package/payload/skills/solution/assets/icon-small.svg +5 -0
  1126. package/payload/skills/solution/references/modeling-guide.md +173 -0
  1127. package/payload/skills/solution/references/output-template.md +229 -0
  1128. package/payload/skills/translation/SKILL.md +259 -0
  1129. package/payload/skills/translation/agents/openai.yaml +6 -0
  1130. package/payload/skills/translation/assets/icon-large.svg +1 -0
  1131. package/payload/skills/translation/assets/icon-small.svg +5 -0
  1132. package/payload/skills/translation/scripts/translate.py +275 -0
  1133. package/payload/skills/translation/tests/test_translate.py +124 -0
  1134. package/payload/skills/trd/SKILL.md +340 -0
  1135. package/payload/skills/trd/agents/openai.yaml +6 -0
  1136. package/payload/skills/trd/assets/icon-large.svg +1 -0
  1137. package/payload/skills/trd/assets/icon-small.svg +5 -0
  1138. package/payload/skills/trd/evals/evals.json +23 -0
  1139. package/payload/skills/trd/references/modeling-guide.md +212 -0
  1140. package/payload/skills/trd/references/output-template.md +242 -0
  1141. package/payload/skills/trd/references/section-guide.md +167 -0
  1142. package/payload/skills/uat/SKILL.md +339 -0
  1143. package/payload/skills/uat/agents/openai.yaml +6 -0
  1144. package/payload/skills/uat/assets/icon-large.svg +1 -0
  1145. package/payload/skills/uat/assets/icon-small.svg +5 -0
  1146. package/payload/skills/uat/evals/evals.json +23 -0
  1147. package/payload/skills/uat/references/output-template.md +158 -0
  1148. package/payload/skills/uat/references/section-guide.md +165 -0
  1149. package/payload/skills/view-dev/SKILL.md +167 -0
  1150. package/payload/skills/view-dev/agents/openai.yaml +6 -0
  1151. package/payload/skills/view-dev/assets/README.md +7 -0
  1152. package/payload/skills/view-dev/assets/icon-large.svg +1 -0
  1153. package/payload/skills/view-dev/assets/icon-small.svg +5 -0
  1154. package/payload/skills/view-dev/references/actions.md +277 -0
  1155. package/payload/skills/view-dev/references/activity.md +65 -0
  1156. package/payload/skills/view-dev/references/calendar.md +92 -0
  1157. package/payload/skills/view-dev/references/cohort.md +80 -0
  1158. package/payload/skills/view-dev/references/common-architecture.md +35 -0
  1159. package/payload/skills/view-dev/references/field-widgets.md +529 -0
  1160. package/payload/skills/view-dev/references/form.md +520 -0
  1161. package/payload/skills/view-dev/references/gantt.md +162 -0
  1162. package/payload/skills/view-dev/references/graph.md +76 -0
  1163. package/payload/skills/view-dev/references/grid.md +221 -0
  1164. package/payload/skills/view-dev/references/kanban.md +232 -0
  1165. package/payload/skills/view-dev/references/list.md +233 -0
  1166. package/payload/skills/view-dev/references/mail-thread.md +504 -0
  1167. package/payload/skills/view-dev/references/map.md +69 -0
  1168. package/payload/skills/view-dev/references/orm-api.md +149 -0
  1169. package/payload/skills/view-dev/references/pivot.md +109 -0
  1170. package/payload/skills/view-dev/references/python-expressions.md +48 -0
  1171. package/payload/skills/view-dev/references/qweb-templates.md +326 -0
  1172. package/payload/skills/view-dev/references/qweb.md +53 -0
  1173. package/payload/skills/view-dev/references/search.md +249 -0
  1174. package/payload/skills/view-dev/references/security.md +306 -0
  1175. package/payload/skills/view-dev/references/settings.md +140 -0
  1176. package/payload/skills/view-dev/references/ui-icons.md +44 -0
  1177. package/payload/skills/view-dev/references/view-records.md +171 -0
  1178. package/payload/skills/view-dev/scripts/README.md +7 -0
  1179. package/payload/skills/view-spec/SKILL.md +301 -0
  1180. package/payload/skills/view-spec/agents/openai.yaml +6 -0
  1181. package/payload/skills/view-spec/assets/icon-large.svg +1 -0
  1182. package/payload/skills/view-spec/assets/icon-small.svg +5 -0
  1183. package/payload/skills/view-spec/examples/sample-maintenance-request.md +304 -0
  1184. package/payload/skills/view-spec/references/analytics-templates.md +161 -0
  1185. package/payload/skills/view-spec/references/form-templates.md +237 -0
  1186. package/payload/skills/view-spec/references/kanban-templates.md +127 -0
  1187. package/payload/skills/view-spec/references/layout-rules.md +427 -0
  1188. package/payload/skills/view-spec/references/list-templates.md +128 -0
  1189. package/payload/skills/view-spec/references/search-templates.md +177 -0
  1190. package/payload/skills/view-spec/references/settings-templates.md +115 -0
@@ -0,0 +1,2275 @@
1
+ ---
2
+ title: ""
3
+ source_url: "https://docs.odoo.sbggai.top/developer/tutorials/web.html"
4
+ ---
5
+
6
+ :orphan:
7
+ #
8
+ # Customizing the web client
9
+
10
+ .. danger::
11
+ This tutorial is outdated.
12
+
13
+ .. highlight:: javascript
14
+
15
+ .. default-domain:: js
16
+
17
+ This guide is about creating modules for Odoo's web client.
18
+
19
+ To create websites with Odoo, see :doc:`website`; to add business capabilities
20
+ or extend existing business systems of Odoo, see :doc:`backend`.
21
+
22
+ > **warning**:
23
+ > This guide assumes knowledge of:
24
+
25
+ * Javascript basics and good practices
26
+ * jQuery_
27
+ * `Underscore.js`_
28
+
29
+ It also requires :doc:`an installed Odoo </administration/on_premise>`, and Git_.
30
+
31
+ # A Simple Module
32
+
33
+ Let's start with a simple Odoo module holding basic web component
34
+ configuration and letting us test the web framework.
35
+
36
+ The example module is available online and can be downloaded using the
37
+ following command:
38
+
39
+ ```console
40
+
41
+ $ git clone http://github.com/odoo/petstore
42
+
43
+ This will create a `petstore` folder wherever you executed the command.
44
+ You then need to add that folder to Odoo's
45
+ :option:`addons path <odoo-bin --addons-path>`, create a new database and
46
+ install the `oepetstore` module.
47
+
48
+ If you browse the `petstore` folder, you should see the following content:
49
+
50
+ ```text
51
+
52
+ oepetstore
53
+ |-- images
54
+ | |-- alligator.jpg
55
+ | |-- ball.jpg
56
+ | |-- crazy_circle.jpg
57
+ | |-- fish.jpg
58
+ | `-- mice.jpg
59
+ |-- __init__.py
60
+ |-- oepetstore.message_of_the_day.csv
61
+ |-- __manifest__.py
62
+ |-- petstore_data.xml
63
+ |-- petstore.py
64
+ |-- petstore.xml
65
+ `-- static
66
+ `-- src
67
+ |-- css
68
+ | `-- petstore.css
69
+ |-- js
70
+ | `-- petstore.js
71
+ `-- xml
72
+ `-- petstore.xml
73
+
74
+ The module already holds various server customizations. We'll come back to
75
+ these later, for now let's focus on the web-related content, in the `static`
76
+ folder.
77
+
78
+ Files used in the "web" side of an Odoo module must be placed in a `static`
79
+ folder so they are available to a web browser, files outside that folder can
80
+ not be fetched by browsers. The `src/css`, `src/js` and `src/xml`
81
+ sub-folders are conventional and not strictly necessary.
82
+
83
+ `oepetstore/static/css/petstore.css`
84
+ Currently empty, will hold the CSS_ for pet store content
85
+ `oepetstore/static/xml/petstore.xml`
86
+ Mostly empty, will hold :ref:`reference/qweb` templates
87
+ `oepetstore/static/js/petstore.js`
88
+ The most important (and interesting) part, contains the logic of the
89
+ application (or at least its web-browser side) as javascript. It should
90
+ currently look like::
91
+
92
+ odoo.oepetstore = function(instance, local) {
93
+ var _t = instance.web._t,
94
+ _lt = instance.web._lt;
95
+ var QWeb = instance.web.qweb;
96
+
97
+ local.HomePage = instance.Widget.extend({
98
+ start: function() {
99
+ console.log("pet store home page loaded");
100
+ },
101
+ });
102
+
103
+ instance.web.client_actions.add(
104
+ 'petstore.homepage', 'instance.oepetstore.HomePage');
105
+ }
106
+
107
+ Which only prints a small message in the browser's console.
108
+
109
+ The files in the `static` folder, need to be defined within the module in order for them to be
110
+ loaded correctly. Everything in `src/xml` is defined in `__manifest__.py` while the contents of
111
+ `src/css` and `src/js` are defined in `petstore.xml`, or a similar file.
112
+
113
+ > **warning**:
114
+ > All JavaScript files are concatenated and :term:`minified` to improve
115
+ application load time.
116
+
117
+ One of the drawback is debugging becomes more difficult as
118
+ individual files disappear and the code is made significantly less
119
+ readable. It is possible to disable this process by enabling the
120
+ "developer mode": log into your Odoo instance (user *admin* password
121
+ *admin* by default) open the user menu (in the top-right corner of the
122
+ Odoo screen) and select :guilabel:`About Odoo` then :guilabel:`Activate
123
+ the developer mode`:
124
+
125
+ .. image:: web/about_odoo.png
126
+ :align: center
127
+
128
+ .. image:: web/devmode.png
129
+ :align: center
130
+
131
+ This will reload the web client with optimizations disabled, making
132
+ development and debugging significantly more comfortable.
133
+
134
+ .. todo:: qweb files hooked via __manifest__.py, but js and CSS use bundles
135
+
136
+ # Odoo JavaScript Module
137
+
138
+ Javascript doesn't have built-in modules. As a result variables defined in
139
+ different files are all mashed together and may conflict. This has given rise
140
+ to various module patterns used to build clean namespaces and limit risks of
141
+ naming conflicts.
142
+
143
+ The Odoo framework uses one such pattern to define modules within web addons,
144
+ in order to both namespace code and correctly order its loading.
145
+
146
+ `oepetstore/static/js/petstore.js` contains a module declaration::
147
+
148
+ odoo.oepetstore = function(instance, local) {
149
+ local.xxx = ...;
150
+ }
151
+
152
+ In Odoo web, modules are declared as functions set on the global `odoo`
153
+ variable. The function's name must be the same as the addon (in this case
154
+ `oepetstore`) so the framework can find it, and automatically initialize it.
155
+
156
+ When the web client loads your module it will call the root function
157
+ and provide two parameters:
158
+
159
+ * the first parameter is the current instance of the Odoo web client, it gives
160
+ access to various capabilities defined by the Odoo (translations,
161
+ network services) as well as objects defined by the core or by other
162
+ modules.
163
+ * the second parameter is your own local namespace automatically created by
164
+ the web client. Objects and variables which should be accessible from
165
+ outside your module (either because the Odoo web client needs to call them
166
+ or because others may want to customize them) should be set inside that
167
+ namespace.
168
+
169
+ # Classes
170
+
171
+ Much as modules, and contrary to most object-oriented languages, javascript
172
+ does not build in *classes*\ [#classes]_ although it provides roughly
173
+ equivalent (if lower-level and more verbose) mechanisms.
174
+
175
+ For simplicity and developer-friendliness Odoo web provides a class
176
+ system based on John Resig's `Simple JavaScript Inheritance`_.
177
+
178
+ New classes are defined by calling the :func:`~odoo.web.Class.extend`
179
+ method of :class:`odoo.web.Class`::
180
+
181
+ var MyClass = instance.web.Class.extend({
182
+ say_hello: function() {
183
+ console.log("hello");
184
+ },
185
+ });
186
+
187
+ The :func:`~odoo.web.Class.extend` method takes a dictionary describing
188
+ the new class's content (methods and static attributes). In this case, it will
189
+ only have a `say_hello` method which takes no parameters.
190
+
191
+ Classes are instantiated using the `new` operator::
192
+
193
+ var my_object = new MyClass();
194
+ my_object.say_hello();
195
+ // print "hello" in the console
196
+
197
+ And attributes of the instance can be accessed via `this`::
198
+
199
+ var MyClass = instance.web.Class.extend({
200
+ say_hello: function() {
201
+ console.log("hello", this.name);
202
+ },
203
+ });
204
+
205
+ var my_object = new MyClass();
206
+ my_object.name = "Bob";
207
+ my_object.say_hello();
208
+ // print "hello Bob" in the console
209
+
210
+ Classes can provide an initializer to perform the initial setup of the
211
+ instance, by defining an `init()` method. The initializer receives the
212
+ parameters passed when using the `new` operator::
213
+
214
+ var MyClass = instance.web.Class.extend({
215
+ init: function(name) {
216
+ this.name = name;
217
+ },
218
+ say_hello: function() {
219
+ console.log("hello", this.name);
220
+ },
221
+ });
222
+
223
+ var my_object = new MyClass("Bob");
224
+ my_object.say_hello();
225
+ // print "hello Bob" in the console
226
+
227
+ It is also possible to create subclasses from existing (used-defined) classes
228
+ by calling :func:`~odoo.web.Class.extend` on the parent class, as is done
229
+ to subclass :class:`~odoo.web.Class`::
230
+
231
+ var MySpanishClass = MyClass.extend({
232
+ say_hello: function() {
233
+ console.log("hola", this.name);
234
+ },
235
+ });
236
+
237
+ var my_object = new MySpanishClass("Bob");
238
+ my_object.say_hello();
239
+ // print "hola Bob" in the console
240
+
241
+ When overriding a method using inheritance, you can use `this._super()` to
242
+ call the original method::
243
+
244
+ var MySpanishClass = MyClass.extend({
245
+ say_hello: function() {
246
+ this._super();
247
+ console.log("translation in Spanish: hola", this.name);
248
+ },
249
+ });
250
+
251
+ var my_object = new MySpanishClass("Bob");
252
+ my_object.say_hello();
253
+ // print "hello Bob \n translation in Spanish: hola Bob" in the console
254
+
255
+ > **warning**:
256
+ > `_super` is not a standard method, it is set on-the-fly to the next
257
+ method in the current inheritance chain, if any. It is only defined
258
+ during the *synchronous* part of a method call, for use in asynchronous
259
+ handlers (after network calls or in `setTimeout` callbacks) a reference
260
+ to its value should be retained, it should not be accessed via `this`::
261
+
262
+ // broken, will generate an error
263
+ say_hello: function () {
264
+ setTimeout(function () {
265
+ this._super();
266
+ }.bind(this), 0);
267
+ }
268
+
269
+ // correct
270
+ say_hello: function () {
271
+ // don't forget .bind()
272
+ var _super = this._super.bind(this);
273
+ setTimeout(function () {
274
+ _super();
275
+ }.bind(this), 0);
276
+ }
277
+
278
+ # Widgets Basics
279
+
280
+ The Odoo web client bundles jQuery_ for easy DOM manipulation. It is useful
281
+ and provides a better API than standard `W3C DOM`_\ [#dombugs]_, but
282
+ insufficient to structure complex applications leading to difficult
283
+ maintenance.
284
+
285
+ Much like object-oriented desktop UI toolkits (e.g. Qt_, Cocoa_ or GTK_),
286
+ Odoo Web makes specific components responsible for sections of a page. In
287
+ Odoo web, the base for such components is the :class:`~odoo.Widget`
288
+ class, a component specialized in handling a page section and displaying
289
+ information for the user.
290
+
291
+ ## Your First Widget
292
+
293
+ The initial demonstration module already provides a basic widget::
294
+
295
+ local.HomePage = instance.Widget.extend({
296
+ start: function() {
297
+ console.log("pet store home page loaded");
298
+ },
299
+ });
300
+
301
+ It extends :class:`~odoo.Widget` and overrides the standard method
302
+ :func:`~odoo.Widget.start`, which — much like the previous `MyClass`
303
+ — does little for now.
304
+
305
+ This line at the end of the file::
306
+
307
+ instance.web.client_actions.add(
308
+ 'petstore.homepage', 'instance.oepetstore.HomePage');
309
+
310
+ registers our basic widget as a client action. Client actions will be
311
+ explained later, for now this is just what allows our widget to
312
+ be called and displayed when we select the
313
+ :menuselection:`Pet Store --> Pet Store --> Home Page` menu.
314
+
315
+ > **warning**:
316
+ > because the widget will be called from outside our module, the web client
317
+ needs its "fully qualified" name, not the local version.
318
+
319
+ ## Display Content
320
+
321
+ Widgets have a number of methods and features, but the basics are simple:
322
+
323
+ * set up a widget
324
+ * format the widget's data
325
+ * display the widget
326
+
327
+ The `HomePage` widget already has a :func:`~odoo.Widget.start`
328
+ method. That method is part of the normal widget lifecycle and automatically
329
+ called once the widget is inserted in the page. We can use it to display some
330
+ content.
331
+
332
+ All widgets have a :attr:`~odoo.Widget.$el` which represents the
333
+ section of page they're in charge of (as a jQuery_ object). Widget content
334
+ should be inserted there. By default, :attr:`~odoo.Widget.$el` is an
335
+ empty `<div>` element.
336
+
337
+ A `<div>` element is usually invisible to the user if it has no content (or
338
+ without specific styles giving it a size) which is why nothing is displayed
339
+ on the page when `HomePage` is launched.
340
+
341
+ Let's add some content to the widget's root element, using jQuery::
342
+
343
+ local.HomePage = instance.Widget.extend({
344
+ start: function() {
345
+ this.$el.append("<div>Hello dear Odoo user!</div>");
346
+ },
347
+ });
348
+
349
+ That message will now appear when you open :menuselection:`Pet Store
350
+ --> Pet Store --> Home Page`
351
+
352
+ > **note**:
353
+ > to refresh the javascript code loaded in Odoo Web, you will need to reload
354
+ the page. There is no need to restart the Odoo server.
355
+
356
+ The `HomePage` widget is used by Odoo Web and managed automatically.
357
+ To learn how to use a widget "from scratch" let's create a new one::
358
+
359
+ local.GreetingsWidget = instance.Widget.extend({
360
+ start: function() {
361
+ this.$el.append("<div>We are so happy to see you again in this menu!</div>");
362
+ },
363
+ });
364
+
365
+ We can now add our `GreetingsWidget` to the `HomePage` by using the
366
+ `GreetingsWidget`'s :func:`~odoo.Widget.appendTo` method::
367
+
368
+ local.HomePage = instance.Widget.extend({
369
+ start: function() {
370
+ this.$el.append("<div>Hello dear Odoo user!</div>");
371
+ var greeting = new local.GreetingsWidget(this);
372
+ return greeting.appendTo(this.$el);
373
+ },
374
+ });
375
+
376
+ * `HomePage` first adds its own content to its DOM root
377
+ * `HomePage` then instantiates `GreetingsWidget`
378
+ * Finally it tells `GreetingsWidget` where to insert itself, delegating part
379
+ of its :attr:`~odoo.Widget.$el` to the `GreetingsWidget`.
380
+
381
+ When the :func:`~odoo.Widget.appendTo` method is called, it asks the
382
+ widget to insert itself at the specified position and to display its content.
383
+ The :func:`~odoo.Widget.start` method will be called during the call
384
+ to :func:`~odoo.Widget.appendTo`.
385
+
386
+ To see what happens under the displayed interface, we will use the browser's
387
+ DOM Explorer. But first let's alter our widgets slightly so we can more easily
388
+ find where they are, by :attr:`adding a class to their root elements
389
+ <odoo.Widget.className>`::
390
+
391
+ local.HomePage = instance.Widget.extend({
392
+ className: 'oe_petstore_homepage',
393
+ ...
394
+ });
395
+ local.GreetingsWidget = instance.Widget.extend({
396
+ className: 'oe_petstore_greetings',
397
+ ...
398
+ });
399
+
400
+ If you can find the relevant section of the DOM (right-click on the text
401
+ then :guilabel:`Inspect Element`), it should look like this:
402
+
403
+ ```html
404
+
405
+ <div class="oe_petstore_homepage">
406
+ <div>Hello dear Odoo user!</div>
407
+ <div class="oe_petstore_greetings">
408
+ <div>We are so happy to see you again in this menu!</div>
409
+ </div>
410
+ </div>
411
+
412
+ Which clearly shows the two `<div>` elements automatically created by
413
+ :class:`~odoo.Widget`, because we added some classes on them.
414
+
415
+ We can also see the two message-holding divs we added ourselves
416
+
417
+ Finally, note the `<div class="oe_petstore_greetings">` element which
418
+ represents the `GreetingsWidget` instance is *inside* the
419
+ `<div class="oe_petstore_homepage">` which represents the `HomePage`
420
+ instance, since we appended
421
+
422
+ ## Widget Parents and Children
423
+
424
+ In the previous part, we instantiated a widget using this syntax::
425
+
426
+ new local.GreetingsWidget(this);
427
+
428
+ The first argument is `this`, which in that case was a `HomePage`
429
+ instance. This tells the widget being created which other widget is its
430
+ *parent*.
431
+
432
+ As we've seen, widgets are usually inserted in the DOM by another widget and
433
+ *inside* that other widget's root element. This means most widgets are "part"
434
+ of another widget, and exist on behalf of it. We call the container the
435
+ *parent*, and the contained widget the *child*.
436
+
437
+ Due to multiple technical and conceptual reasons, it is necessary for a widget
438
+ to know who is its parent and who are its children.
439
+
440
+ :func:`~odoo.Widget.getParent`
441
+ can be used to get the parent of a widget::
442
+
443
+ local.GreetingsWidget = instance.Widget.extend({
444
+ start: function() {
445
+ console.log(this.getParent().$el );
446
+ // will print "div.oe_petstore_homepage" in the console
447
+ },
448
+ });
449
+
450
+ :func:`~odoo.Widget.getChildren`
451
+ can be used to get a list of its children::
452
+
453
+ local.HomePage = instance.Widget.extend({
454
+ start: function() {
455
+ var greeting = new local.GreetingsWidget(this);
456
+ greeting.appendTo(this.$el);
457
+ console.log(this.getChildren()[0].$el);
458
+ // will print "div.oe_petstore_greetings" in the console
459
+ },
460
+ });
461
+
462
+ When overriding the :func:`~odoo.Widget.init` method of a widget it is
463
+ *of the utmost importance* to pass the parent to the `this._super()` call,
464
+ otherwise the relation will not be set up correctly::
465
+
466
+ local.GreetingsWidget = instance.Widget.extend({
467
+ init: function(parent, name) {
468
+ this._super(parent);
469
+ this.name = name;
470
+ },
471
+ });
472
+
473
+ Finally, if a widget does not have a parent (e.g. because it's the root
474
+ widget of the application), `null` can be provided as parent::
475
+
476
+ new local.GreetingsWidget(null);
477
+
478
+ ## Destroying Widgets
479
+
480
+ If you can display content to your users, you should also be able to erase
481
+ it. This is done via the :func:`~odoo.Widget.destroy` method::
482
+
483
+ greeting.destroy();
484
+
485
+ When a widget is destroyed it will first call
486
+ :func:`~odoo.Widget.destroy` on all its children. Then it erases itself
487
+ from the DOM. If you have set up permanent structures in
488
+ :func:`~odoo.Widget.init` or :func:`~odoo.Widget.start` which
489
+ must be explicitly cleaned up (because the garbage collector will not handle
490
+ them), you can override :func:`~odoo.Widget.destroy`.
491
+
492
+ .. danger::
493
+ when overriding :func:`~odoo.Widget.destroy`, `_super()`
494
+ *must always* be called otherwise the widget and its children are not
495
+ correctly cleaned up leaving possible memory leaks and "phantom events",
496
+ even if no error is displayed
497
+
498
+ # The QWeb Template Engine
499
+
500
+ In the previous section we added content to our widgets by directly
501
+ manipulating (and adding to) their DOM::
502
+
503
+ this.$el.append("<div>Hello dear Odoo user!</div>");
504
+
505
+ This allows generating and displaying any type of content, but gets unwieldy
506
+ when generating significant amounts of DOM (lots of duplication, quoting
507
+ issues, ...)
508
+
509
+ As many other environments, Odoo's solution is to use a `template engine`_.
510
+ Odoo's template engine is called :ref:`reference/qweb`.
511
+
512
+ QWeb is an XML-based templating language, similar to [Genshi
513
+ ](http://en.wikipedia.org/wiki/Genshi_(templating_language)), [Thymeleaf
514
+ ](http://en.wikipedia.org/wiki/Thymeleaf) or [Facelets
515
+ ](http://en.wikipedia.org/wiki/Facelets). It has the following
516
+ characteristics:
517
+
518
+ * It's implemented fully in JavaScript and rendered in the browser
519
+ * Each template file (XML files) contains multiple templates
520
+ * It has special support in Odoo Web's :class:`~odoo.Widget`, though it
521
+ can be used outside of Odoo's web client (and it's possible to use
522
+ :class:`~odoo.Widget` without relying on QWeb)
523
+
524
+ > **note**:
525
+ > The rationale behind using QWeb instead of existing javascript template
526
+ engines is the extensibility of pre-existing (third-party) templates, much
527
+ like Odoo :doc:`views <../reference/user_interface/view_records>`.
528
+
529
+ Most javascript template engines are text-based which precludes easy
530
+ structural extensibility where an XML-based templating engine can be
531
+ generically altered using e.g. XPath or CSS and a tree-alteration DSL (or
532
+ even just XSLT). This flexibility and extensibility is a core
533
+ characteristic of Odoo, and losing it was considered unacceptable.
534
+
535
+ ## Using QWeb
536
+
537
+ First let's define a simple QWeb template in the almost-empty
538
+ `oepetstore/static/src/xml/petstore.xml` file:
539
+
540
+ ```xml
541
+
542
+ <?xml version="1.0" encoding="UTF-8"?>
543
+ <templates xml:space="preserve">
544
+ <t t-name="HomePageTemplate">
545
+ <div style="background-color: red;">This is some simple HTML</div>
546
+ </t>
547
+ </templates>
548
+
549
+ Now we can use this template inside of the `HomePage` widget. Using the
550
+ `QWeb` loader variable defined at the top of the page, we can call to the
551
+ template defined in the XML file::
552
+
553
+ local.HomePage = instance.Widget.extend({
554
+ start: function() {
555
+ this.$el.append(QWeb.render("HomePageTemplate"));
556
+ },
557
+ });
558
+
559
+ :func:`QWeb.render` looks for the specified template, renders it to a string
560
+ and returns the result.
561
+
562
+ However, because :class:`~odoo.Widget` has special integration for QWeb
563
+ the template can be set directly on the widget via its
564
+ :attr:`~odoo.Widget.template` attribute::
565
+
566
+ local.HomePage = instance.Widget.extend({
567
+ template: "HomePageTemplate",
568
+ start: function() {
569
+ ...
570
+ },
571
+ });
572
+
573
+ Although the result looks similar, there are two differences between these
574
+ usages:
575
+
576
+ * with the second version, the template is rendered right before
577
+ :func:`~odoo.Widget.start` is called
578
+ * in the first version the template's content is added to the widget's root
579
+ element, whereas in the second version the template's root element is
580
+ directly *set as* the widget's root element. Which is why the "greetings"
581
+ sub-widget also gets a red background
582
+
583
+ > **warning**:
584
+ > templates should have a single non-`t` root element, especially if
585
+ they're set as a widget's :attr:`~odoo.Widget.template`. If there are
586
+ multiple "root elements", results are undefined (usually only the first
587
+ root element will be used and the others will be ignored)
588
+
589
+ ### QWeb Context
590
+
591
+ QWeb templates can be given data and can contain basic display logic.
592
+
593
+ For explicit calls to :func:`QWeb.render`, the template data is passed as
594
+ second parameter::
595
+
596
+ QWeb.render("HomePageTemplate", {name: "Klaus"});
597
+
598
+ with the template modified to:
599
+
600
+ ```xml
601
+
602
+ <t t-name="HomePageTemplate">
603
+ <div>Hello <t t-esc="name"/></div>
604
+ </t>
605
+
606
+ will result in:
607
+
608
+ ```html
609
+
610
+ <div>Hello Klaus</div>
611
+
612
+ When using :class:`~odoo.Widget`'s integration it is not possible to
613
+ provide additional data to the template. The template will be given a single
614
+ `widget` context variable, referencing the widget being rendered right
615
+ before :func:`~odoo.Widget.start` is called (the widget's state will
616
+ essentially be that set up by :func:`~odoo.Widget.init`):
617
+
618
+ ```xml
619
+
620
+ <t t-name="HomePageTemplate">
621
+ <div>Hello <t t-esc="widget.name"/></div>
622
+ </t>
623
+
624
+ ::
625
+
626
+ local.HomePage = instance.Widget.extend({
627
+ template: "HomePageTemplate",
628
+ init: function(parent) {
629
+ this._super(parent);
630
+ this.name = "Mordecai";
631
+ },
632
+ start: function() {
633
+ },
634
+ });
635
+
636
+ Result:
637
+
638
+ ```html
639
+
640
+ <div>Hello Mordecai</div>
641
+
642
+ ### Template Declaration
643
+
644
+ We've seen how to *render* QWeb templates, let's now see the syntax of
645
+ the templates themselves.
646
+
647
+ A QWeb template is composed of regular XML mixed with QWeb *directives*. A
648
+ QWeb directive is declared with XML attributes starting with `t-`.
649
+
650
+ The most basic directive is `t-name`, used to declare new templates in
651
+ a template file:
652
+
653
+ ```xml
654
+
655
+ <templates>
656
+ <t t-name="HomePageTemplate">
657
+ <div>This is some simple HTML</div>
658
+ </t>
659
+ </templates>
660
+
661
+ `t-name` takes the name of the template being defined, and declares that
662
+ it can be called using :func:`QWeb.render`. It can only be used at the
663
+ top-level of a template file.
664
+
665
+ ### Escaping
666
+
667
+ The `t-esc` directive can be used to output text:
668
+
669
+ ```xml
670
+
671
+ <div>Hello <t t-esc="name"/></div>
672
+
673
+ It takes a Javascript expression which is evaluated, the result of the
674
+ expression is then HTML-escaped and inserted in the document. Since it's an
675
+ expression it's possible to provide just a variable name as above, or a more
676
+ complex expression like a computation:
677
+
678
+ ```xml
679
+
680
+ <div><t t-esc="3+5"/></div>
681
+
682
+ or method calls:
683
+
684
+ ```xml
685
+
686
+ <div><t t-esc="name.toUpperCase()"/></div>
687
+
688
+ ### Outputting HTML
689
+
690
+ To inject HTML in the page being rendered, use `t-raw`. Like `t-esc` it
691
+ takes an arbitrary Javascript expression as parameter, but it does not
692
+ perform an HTML-escape step.
693
+
694
+ ```xml
695
+
696
+ <div><t t-raw="name.link(user_account)"/></div>
697
+
698
+ .. danger::
699
+
700
+ `t-raw` *must not* be used on any data which may contain non-escaped
701
+ user-provided content as this leads to `cross-site scripting`_
702
+ vulnerabilities
703
+
704
+ ### Conditionals
705
+
706
+ QWeb can have conditional blocks using `t-if`. The directive takes an
707
+ arbitrary expression, if the expression is falsy (`false`, `null`, `0`
708
+ or an empty string) the whole block is suppressed, otherwise it is displayed.
709
+
710
+ ```xml
711
+
712
+ <div>
713
+ <t t-if="true == true">
714
+ true is true
715
+ </t>
716
+ <t t-if="true == false">
717
+ true is not true
718
+ </t>
719
+ </div>
720
+
721
+ > **note**:
722
+ > QWeb doesn't have an "else" structure, use a second `t-if` with the
723
+ original condition inverted. You may want to store the condition in a
724
+ local variable if it's a complex or expensive expression.
725
+
726
+ ### Iteration
727
+
728
+ To iterate on a list, use `t-foreach` and `t-as`. `t-foreach` takes an
729
+ expression returning a list to iterate on `t-as` takes a variable name to
730
+ bind to each item during iteration.
731
+
732
+ ```xml
733
+
734
+ <div>
735
+ <t t-foreach="names" t-as="name">
736
+ <div>
737
+ Hello <t t-esc="name"/>
738
+ </div>
739
+ </t>
740
+ </div>
741
+
742
+ .. note:: `t-foreach` can also be used with numbers and objects
743
+ (dictionaries)
744
+
745
+ ### Defining attributes
746
+
747
+ QWeb provides two related directives to define computed attributes:
748
+ :samp:`t-att-{name}` and :samp:`t-attf-{name}`. In either case, *name* is the
749
+ name of the attribute to create (e.g. `t-att-id` defines the attribute
750
+ `id` after rendering).
751
+
752
+ `t-att-` takes a javascript expression whose result is set as the
753
+ attribute's value, it is most useful if all of the attribute's value is
754
+ computed:
755
+
756
+ ```xml
757
+
758
+ <div>
759
+ Input your name:
760
+ <input type="text" t-att-value="defaultName"/>
761
+ </div>
762
+
763
+ `t-attf-` takes a *format string*. A format string is literal text with
764
+ interpolation blocks inside, an interpolation block is a javascript
765
+ expression between `{{` and `}}`, which will be replaced by the result
766
+ of the expression. It is most useful for attributes which are partially
767
+ literal and partially computed such as a class:
768
+
769
+ ```xml
770
+
771
+ <div t-attf-class="container {{ left ? 'text-left' : '' }} {{ extra_class }}">
772
+ insert content here
773
+ </div>
774
+
775
+ ### Calling other templates
776
+
777
+ Templates can be split into sub-templates (for simplicity, maintainability,
778
+ reusability or to avoid excessive markup nesting).
779
+
780
+ This is done using the `t-call` directive, which takes the name of the
781
+ template to render:
782
+
783
+ ```xml
784
+
785
+ <t t-name="A">
786
+ <div class="i-am-a">
787
+ <t t-call="B"/>
788
+ </div>
789
+ </t>
790
+ <t t-name="B">
791
+ <div class="i-am-b"/>
792
+ </t>
793
+
794
+ rendering the `A` template will result in:
795
+
796
+ ```xml
797
+
798
+ <div class="i-am-a">
799
+ <div class="i-am-b"/>
800
+ </div>
801
+
802
+ Sub-templates inherit the rendering context of their caller.
803
+
804
+ ### To Learn More About QWeb
805
+
806
+ For a QWeb reference, see :ref:`reference/qweb`.
807
+
808
+ ### Exercise
809
+
810
+ .. exercise:: Usage of QWeb in Widgets
811
+
812
+ Create a widget whose constructor takes two parameters aside from
813
+ `parent`: `product_names` and `color`.
814
+
815
+ * `product_names` should an array of strings, each one the name of a
816
+ product
817
+ * `color` is a string containing a color in CSS color format (ie:
818
+ `#000000` for black).
819
+
820
+ The widget should display the given product names one under the other,
821
+ each one in a separate box with a background color with the value of
822
+ `color` and a border. You should use QWeb to render the HTML. Any
823
+ necessary CSS should be in `oepetstore/static/src/css/petstore.css`.
824
+
825
+ Use the widget in `HomePage` with half a dozen products.
826
+
827
+ .. only:: solutions
828
+
829
+ ::
830
+
831
+ odoo.oepetstore = function(instance, local) {
832
+ var _t = instance.web._t,
833
+ _lt = instance.web._lt;
834
+ var QWeb = instance.web.qweb;
835
+
836
+ local.HomePage = instance.Widget.extend({
837
+ start: function() {
838
+ var products = new local.ProductsWidget(
839
+ this, ["cpu", "mouse", "keyboard", "graphic card", "screen"], "#00FF00");
840
+ products.appendTo(this.$el);
841
+ },
842
+ });
843
+
844
+ local.ProductsWidget = instance.Widget.extend({
845
+ template: "ProductsWidget",
846
+ init: function(parent, products, color) {
847
+ this._super(parent);
848
+ this.products = products;
849
+ this.color = color;
850
+ },
851
+ });
852
+
853
+ instance.web.client_actions.add(
854
+ 'petstore.homepage', 'instance.oepetstore.HomePage');
855
+ }
856
+
857
+ ```xml
858
+
859
+ <?xml version="1.0" encoding="UTF-8"?>
860
+ <templates xml:space="preserve">
861
+ <t t-name="ProductsWidget">
862
+ <div>
863
+ <t t-foreach="widget.products" t-as="product">
864
+ <span class="oe_products_item"
865
+ t-attf-style="background-color: {{ widget.color }};">
866
+ <t t-esc="product"/>
867
+ </span>
868
+ <br/>
869
+ </t>
870
+ </div>
871
+ </t>
872
+ </templates>
873
+
874
+ ```css
875
+
876
+ .oe_products_item {
877
+ display: inline-block;
878
+ padding: 3px;
879
+ margin: 5px;
880
+ border: 1px solid black;
881
+ border-radius: 3px;
882
+ }
883
+
884
+ .. image:: web/qweb.png
885
+ :align: center
886
+ :width: 70%
887
+
888
+ # Widget Helpers
889
+
890
+ ## `Widget`'s jQuery Selector
891
+
892
+ Selecting DOM elements within a widget can be performed by calling the
893
+ `find()` method on the widget's DOM root::
894
+
895
+ this.$el.find("input.my_input")...
896
+
897
+ But because it's a common operation, :class:`~odoo.Widget` provides an
898
+ equivalent shortcut through the :func:`~odoo.Widget.$` method::
899
+
900
+ local.MyWidget = instance.Widget.extend({
901
+ start: function() {
902
+ this.$("input.my_input")...
903
+ },
904
+ });
905
+
906
+ > **warning**:
907
+ > The global jQuery function `$()` should *never* be used unless it is
908
+ absolutely necessary: selection on a widget's root are scoped to the
909
+ widget and local to it, but selections with `$()` are global to the
910
+ page/application and may match parts of other widgets and views, leading
911
+ to odd or dangerous side-effects. Since a widget should generally act
912
+ only on the DOM section it owns, there is no cause for global selection.
913
+
914
+ ## Easier DOM Events Binding
915
+
916
+ We have previously bound DOM events using normal jQuery event handlers (e.g.
917
+ `.click()` or `.change()`) on widget elements::
918
+
919
+ local.MyWidget = instance.Widget.extend({
920
+ start: function() {
921
+ var self = this;
922
+ this.$(".my_button").click(function() {
923
+ self.button_clicked();
924
+ });
925
+ },
926
+ button_clicked: function() {
927
+ ..
928
+ },
929
+ });
930
+
931
+ While this works it has a few issues:
932
+
933
+ 1. it is rather verbose
934
+ 2. it does not support replacing the widget's root element at runtime as
935
+ the binding is only performed when `start()` is run (during widget
936
+ initialization)
937
+ 3. it requires dealing with `this`-binding issues
938
+
939
+ Widgets thus provide a shortcut to DOM event binding via
940
+ :attr:`~odoo.Widget.events`::
941
+
942
+ local.MyWidget = instance.Widget.extend({
943
+ events: {
944
+ "click .my_button": "button_clicked",
945
+ },
946
+ button_clicked: function() {
947
+ ..
948
+ }
949
+ });
950
+
951
+ :attr:`~odoo.Widget.events` is an object (mapping) of an event to the
952
+ function or method to call when the event is triggered:
953
+
954
+ * the key is an event name, possibly refined with a CSS selector in which
955
+ case only if the event happens on a selected sub-element will the function
956
+ or method run: `click` will handle all clicks within the widget, but
957
+ `click .my_button` will only handle clicks in elements bearing the
958
+ `my_button` class
959
+ * the value is the action to perform when the event is triggered
960
+
961
+ It can be either a function::
962
+
963
+ events: {
964
+ 'click': function (e) { /* code here */ }
965
+ }
966
+
967
+ or the name of a method on the object (see example above).
968
+
969
+ In either case, the `this` is the widget instance and the handler is given
970
+ a single parameter, the `jQuery event object`_ for the event.
971
+
972
+ # Widget Events and Properties
973
+
974
+ ## Events
975
+
976
+ Widgets provide an event system (separate from the DOM/jQuery event system
977
+ described above): a widget can fire events on itself, and other widgets (or
978
+ itself) can bind themselves and listen for these events::
979
+
980
+ local.ConfirmWidget = instance.Widget.extend({
981
+ events: {
982
+ 'click button.ok_button': function () {
983
+ this.trigger('user_chose', true);
984
+ },
985
+ 'click button.cancel_button': function () {
986
+ this.trigger('user_chose', false);
987
+ }
988
+ },
989
+ start: function() {
990
+ this.$el.append("<div>Are you sure you want to perform this action?</div>" +
991
+ "<button class='ok_button'>Ok</button>" +
992
+ "<button class='cancel_button'>Cancel</button>");
993
+ },
994
+ });
995
+
996
+ This widget acts as a facade, transforming user input (through DOM events)
997
+ into a documentable internal event to which parent widgets can bind
998
+ themselves.
999
+
1000
+ :func:`~odoo.Widget.trigger` takes the name of the event to trigger as
1001
+ its first (mandatory) argument, any further arguments are treated as event
1002
+ data and passed directly to listeners.
1003
+
1004
+ We can then set up a parent event instantiating our generic widget and
1005
+ listening to the `user_chose` event using :func:`~odoo.Widget.on`::
1006
+
1007
+ local.HomePage = instance.Widget.extend({
1008
+ start: function() {
1009
+ var widget = new local.ConfirmWidget(this);
1010
+ widget.on("user_chose", this, this.user_chose);
1011
+ widget.appendTo(this.$el);
1012
+ },
1013
+ user_chose: function(confirm) {
1014
+ if (confirm) {
1015
+ console.log("The user agreed to continue");
1016
+ } else {
1017
+ console.log("The user refused to continue");
1018
+ }
1019
+ },
1020
+ });
1021
+
1022
+ :func:`~odoo.Widget.on` binds a function to be called when the
1023
+ event identified by `event_name` is. The `func` argument is the
1024
+ function to call and `object` is the object to which that function is
1025
+ related if it is a method. The bound function will be called with the
1026
+ additional arguments of :func:`~odoo.Widget.trigger` if it has
1027
+ any. Example::
1028
+
1029
+ start: function() {
1030
+ var widget = ...
1031
+ widget.on("my_event", this, this.my_event_triggered);
1032
+ widget.trigger("my_event", 1, 2, 3);
1033
+ },
1034
+ my_event_triggered: function(a, b, c) {
1035
+ console.log(a, b, c);
1036
+ // will print "1 2 3"
1037
+ }
1038
+
1039
+ > **note**:
1040
+ > Triggering events on an other widget is generally a bad idea. The main
1041
+ exception to that rule is `odoo.web.bus` which exists specifically
1042
+ to broadcasts evens in which any widget could be interested throughout
1043
+ the Odoo web application.
1044
+
1045
+ ## Properties
1046
+
1047
+ Properties are very similar to normal object attributes in that they allow
1048
+ storing data on a widget instance, however they have the additional feature
1049
+ that they trigger events when set::
1050
+
1051
+ start: function() {
1052
+ this.widget = ...
1053
+ this.widget.on("change:name", this, this.name_changed);
1054
+ this.widget.set("name", "Nicolas");
1055
+ },
1056
+ name_changed: function() {
1057
+ console.log("The new value of the property 'name' is", this.widget.get("name"));
1058
+ }
1059
+
1060
+ * :func:`~odoo.Widget.set` sets the value of a property and triggers
1061
+ :samp:`change:{propname}` (where *propname* is the property name passed as
1062
+ first parameter to :func:`~odoo.Widget.set`) and `change`
1063
+ * :func:`~odoo.Widget.get` retrieves the value of a property.
1064
+
1065
+ ## Exercise
1066
+
1067
+ .. exercise:: Widget Properties and Events
1068
+
1069
+ Create a widget `ColorInputWidget` that will display 3 ``<input
1070
+ type="text">`. Each of these `<input>`` is dedicated to type a
1071
+ hexadecimal number from 00 to FF. When any of these `<input>` is
1072
+ modified by the user the widget must query the content of the three
1073
+ `<input>`, concatenate their values to have a complete CSS color code
1074
+ (ie: `#00FF00`) and put the result in a property named `color`. Please
1075
+ note the jQuery `change()` event that you can bind on any HTML
1076
+ `<input>` element and the `val()` method that can query the current
1077
+ value of that `<input>` could be useful to you for this exercise.
1078
+
1079
+ Then, modify the `HomePage` widget to instantiate `ColorInputWidget`
1080
+ and display it. The `HomePage` widget should also display an empty
1081
+ rectangle. That rectangle must always, at any moment, have the same
1082
+ background color as the color in the `color` property of the
1083
+ `ColorInputWidget` instance.
1084
+
1085
+ Use QWeb to generate all HTML.
1086
+
1087
+ .. only:: solutions
1088
+
1089
+ ::
1090
+
1091
+ odoo.oepetstore = function(instance, local) {
1092
+ var _t = instance.web._t,
1093
+ _lt = instance.web._lt;
1094
+ var QWeb = instance.web.qweb;
1095
+
1096
+ local.ColorInputWidget = instance.Widget.extend({
1097
+ template: "ColorInputWidget",
1098
+ events: {
1099
+ 'change input': 'input_changed'
1100
+ },
1101
+ start: function() {
1102
+ this.input_changed();
1103
+ return this._super();
1104
+ },
1105
+ input_changed: function() {
1106
+ var color = [
1107
+ "#",
1108
+ this.$(".oe_color_red").val(),
1109
+ this.$(".oe_color_green").val(),
1110
+ this.$(".oe_color_blue").val()
1111
+ ].join('');
1112
+ this.set("color", color);
1113
+ },
1114
+ });
1115
+
1116
+ local.HomePage = instance.Widget.extend({
1117
+ template: "HomePage",
1118
+ start: function() {
1119
+ this.colorInput = new local.ColorInputWidget(this);
1120
+ this.colorInput.on("change:color", this, this.color_changed);
1121
+ return this.colorInput.appendTo(this.$el);
1122
+ },
1123
+ color_changed: function() {
1124
+ this.$(".oe_color_div").css("background-color", this.colorInput.get("color"));
1125
+ },
1126
+ });
1127
+
1128
+ instance.web.client_actions.add('petstore.homepage', 'instance.oepetstore.HomePage');
1129
+ }
1130
+
1131
+ ```xml
1132
+
1133
+ <?xml version="1.0" encoding="UTF-8"?>
1134
+ <templates xml:space="preserve">
1135
+ <t t-name="ColorInputWidget">
1136
+ <div>
1137
+ Red: <input type="text" class="oe_color_red" value="00"></input><br />
1138
+ Green: <input type="text" class="oe_color_green" value="00"></input><br />
1139
+ Blue: <input type="text" class="oe_color_blue" value="00"></input><br />
1140
+ </div>
1141
+ </t>
1142
+ <t t-name="HomePage">
1143
+ <div>
1144
+ <div class="oe_color_div"></div>
1145
+ </div>
1146
+ </t>
1147
+ </templates>
1148
+
1149
+ ```css
1150
+
1151
+ .oe_color_div {
1152
+ width: 100px;
1153
+ height: 100px;
1154
+ margin: 10px;
1155
+ }
1156
+
1157
+ # Modify existing widgets and classes
1158
+
1159
+ The class system of the Odoo web framework allows direct modification of
1160
+ existing classes using the :func:`~odoo.web.Class.include` method::
1161
+
1162
+ var TestClass = instance.web.Class.extend({
1163
+ testMethod: function() {
1164
+ return "hello";
1165
+ },
1166
+ });
1167
+
1168
+ TestClass.include({
1169
+ testMethod: function() {
1170
+ return this._super() + " world";
1171
+ },
1172
+ });
1173
+
1174
+ console.log(new TestClass().testMethod());
1175
+ // will print "hello world"
1176
+
1177
+ This system is similar to the inheritance mechanism, except it will alter the
1178
+ target class in-place instead of creating a new class.
1179
+
1180
+ In that case, `this._super()` will call the original implementation of a
1181
+ method being replaced/redefined. If the class already had sub-classes, all
1182
+ calls to `this._super()` in sub-classes will call the new implementations
1183
+ defined in the call to :func:`~odoo.web.Class.include`. This will also work
1184
+ if some instances of the class (or of any of its sub-classes) were created
1185
+ prior to the call to :func:`~odoo.Widget.include`.
1186
+
1187
+ # Translations
1188
+
1189
+ The process to translate text in Python and JavaScript code is very
1190
+ similar. You could have noticed these lines at the beginning of the
1191
+ `petstore.js` file::
1192
+
1193
+ var _t = instance.web._t,
1194
+ _lt = instance.web._lt;
1195
+
1196
+ These lines are simply used to import the translation functions in the current
1197
+ JavaScript module. They are used thus::
1198
+
1199
+ this.$el.text(_t("Hello user!"));
1200
+
1201
+ In Odoo, translations files are automatically generated by scanning the source
1202
+ code. All piece of code that calls a certain function are detected and their
1203
+ content is added to a translation file that will then be sent to the
1204
+ translators. In Python, the function is `_()`. In JavaScript the function is
1205
+ :func:`~odoo.web._t` (and also :func:`~odoo.web._lt`).
1206
+
1207
+ `_t()` will return the translation defined for the text it is given. If no
1208
+ translation is defined for that text, it will return the original text as-is.
1209
+
1210
+ > **note**:
1211
+ > To inject user-provided values in translatable strings, it is recommended
1212
+ to use [_.str.sprintf
1213
+ ](http://gabceb.github.io/underscore.string.site/#sprintf) with named
1214
+ arguments *after* the translation::
1215
+
1216
+ this.$el.text(_.str.sprintf(
1217
+ _t("Hello, %(user)s!"), {
1218
+ user: "Ed"
1219
+ }));
1220
+
1221
+ This makes translatable strings more readable to translators, and gives
1222
+ them more flexibility to reorder or ignore parameters.
1223
+
1224
+ :func:`~odoo.web._lt` ("lazy translate") is similar but somewhat more
1225
+ complex: instead of translating its parameter immediately, it returns
1226
+ an object which, when converted to a string, will perform the translation.
1227
+
1228
+ It is used to define translatable terms before the translations system is
1229
+ initialized, for class attributes for instance (as modules are loaded before
1230
+ the user's language is configured and translations are downloaded).
1231
+
1232
+ # Communication with the Odoo Server
1233
+
1234
+ ## Contacting Models
1235
+
1236
+ Most operations with Odoo involve communicating with *models* implementing
1237
+ business concern, these models will then (potentially) interact with some
1238
+ storage engine (usually PostgreSQL_).
1239
+
1240
+ Although jQuery_ provides a `$.ajax`_ function for network interactions,
1241
+ communicating with Odoo requires additional metadata whose setup before every
1242
+ call would be verbose and error-prone. As a result, Odoo web provides
1243
+ higher-level communication primitives.
1244
+
1245
+ To demonstrate this, the file `petstore.py` already contains a small model
1246
+ with a sample method:
1247
+
1248
+ ```python
1249
+
1250
+ class message_of_the_day(models.Model):
1251
+ _name = "oepetstore.message_of_the_day"
1252
+
1253
+ @api.model
1254
+ def my_method(self):
1255
+ return {"hello": "world"}
1256
+
1257
+ message = fields.Text(),
1258
+ color = fields.Char(size=20),
1259
+
1260
+ This declares a model with two fields, and a method `my_method()` which
1261
+ returns a literal dictionary.
1262
+
1263
+ Here is a sample widget that calls `my_method()` and displays the result::
1264
+
1265
+ local.HomePage = instance.Widget.extend({
1266
+ start: function() {
1267
+ var self = this;
1268
+ var model = new instance.web.Model("oepetstore.message_of_the_day");
1269
+ model.call("my_method", {context: new instance.web.CompoundContext()}).then(function(result) {
1270
+ self.$el.append("<div>Hello " + result["hello"] + "</div>");
1271
+ // will show "Hello world" to the user
1272
+ });
1273
+ },
1274
+ });
1275
+
1276
+ The class used to call Odoo models is :class:`odoo.Model`. It is
1277
+ instantiated with the Odoo model's name as first parameter
1278
+ (`oepetstore.message_of_the_day` here).
1279
+
1280
+ :func:`~odoo.web.Model.call` can be used to call any (public) method of an
1281
+ Odoo model. It takes the following positional arguments:
1282
+
1283
+ `name`
1284
+ The name of the method to call, `my_method` here
1285
+ `args`
1286
+ an array of `positional arguments`_ to provide to the method. Because the
1287
+ example has no positional argument to provide, the `args` parameter is not
1288
+ provided.
1289
+
1290
+ Here is an other example with positional arguments:
1291
+
1292
+ ```python
1293
+
1294
+ @api.model
1295
+ def my_method2(self, a, b, c): ...
1296
+
1297
+ ```javascript
1298
+
1299
+ model.call("my_method", [1, 2, 3], ...
1300
+ // with this a=1, b=2 and c=3
1301
+
1302
+ `kwargs`
1303
+ a mapping of `keyword arguments`_ to pass. The example provides a single
1304
+ named argument `context`.
1305
+
1306
+ ```python
1307
+
1308
+ @api.model
1309
+ def my_method2(self, a, b, c): ...
1310
+
1311
+ ```javascript
1312
+
1313
+ model.call("my_method", [], {a: 1, b: 2, c: 3, ...
1314
+ // with this a=1, b=2 and c=3
1315
+
1316
+ :func:`~odoo.Widget.call` returns a deferred resolved with the value
1317
+ returned by the model's method as first argument.
1318
+
1319
+ ## CompoundContext
1320
+
1321
+ The previous section used a `context` argument which was not explained in
1322
+ the method call::
1323
+
1324
+ model.call("my_method", {context: new instance.web.CompoundContext()})
1325
+
1326
+ The context is like a "magic" argument that the web client will always give to
1327
+ the server when calling a method. The context is a dictionary containing
1328
+ multiple keys. One of the most important key is the language of the user, used
1329
+ by the server to translate all the messages of the application. Another one is
1330
+ the time zone of the user, used to compute correctly dates and times if Odoo
1331
+ is used by people in different countries.
1332
+
1333
+ The `argument` is necessary in all methods, otherwise bad things could
1334
+ happen (such as the application not being translated correctly). That's why,
1335
+ when you call a model's method, you should always provide that argument. The
1336
+ solution to achieve that is to use :class:`odoo.web.CompoundContext`.
1337
+
1338
+ :class:`~odoo.web.CompoundContext` is a class used to pass the user's
1339
+ context (with language, time zone, etc...) to the server as well as adding new
1340
+ keys to the context (some models' methods use arbitrary keys added to the
1341
+ context). It is created by giving to its constructor any number of
1342
+ dictionaries or other :class:`~odoo.web.CompoundContext` instances. It will
1343
+ merge all those contexts before sending them to the server.
1344
+
1345
+ ```javascript
1346
+
1347
+ model.call("my_method", {context: new instance.web.CompoundContext({'new_key': 'key_value'})})
1348
+
1349
+ ```python
1350
+
1351
+ @api.model
1352
+ def my_method(self):
1353
+ print(self.env.context)
1354
+ // will print: {'lang': 'en_US', 'new_key': 'key_value', 'tz': 'Europe/Brussels', 'uid': 1}
1355
+
1356
+ You can see the dictionary in the argument `context` contains some keys that
1357
+ are related to the configuration of the current user in Odoo plus the
1358
+ `new_key` key that was added when instantiating
1359
+ :class:`~odoo.web.CompoundContext`.
1360
+
1361
+ ## Queries
1362
+
1363
+ While :func:`~odoo.Model.call` is sufficient for any interaction with Odoo
1364
+ models, Odoo Web provides a helper for simpler and clearer querying of models
1365
+ (fetching of records based on various conditions):
1366
+ :func:`~odoo.Model.query` which acts as a shortcut for the common
1367
+ combination of :py:meth:`~odoo.models.Model.search` and
1368
+ ::py:meth:`~odoo.models.Model.read`. It provides a clearer syntax to search
1369
+ and read models::
1370
+
1371
+ model.query(['name', 'login', 'user_email', 'signature'])
1372
+ .filter([['active', '=', true], ['company_id', '=', main_company]])
1373
+ .limit(15)
1374
+ .all().then(function (users) {
1375
+ // do work with users records
1376
+ });
1377
+
1378
+ versus::
1379
+
1380
+ model.call('search', [['active', '=', true], ['company_id', '=', main_company]], {limit: 15})
1381
+ .then(function (ids) {
1382
+ return model.call('read', [ids, ['name', 'login', 'user_email', 'signature']]);
1383
+ })
1384
+ .then(function (users) {
1385
+ // do work with users records
1386
+ });
1387
+
1388
+ * :func:`~odoo.web.Model.query` takes an optional list of fields as
1389
+ parameter (if no field is provided, all fields of the model are fetched). It
1390
+ returns a :class:`odoo.web.Query` which can be further customized before
1391
+ being executed
1392
+ * :class:`~odoo.web.Query` represents the query being built. It is
1393
+ immutable, methods to customize the query actually return a modified copy,
1394
+ so it's possible to use the original and the new version side-by-side. See
1395
+ :class:`~odoo.web.Query` for its customization options.
1396
+
1397
+ When the query is set up as desired, simply call
1398
+ :func:`~odoo.web.Query.all` to execute it and return a
1399
+ deferred to its result. The result is the same as
1400
+ :py:meth:`~odoo.models.Model.read`'s, an array of dictionaries where each
1401
+ dictionary is a requested record, with each requested field a dictionary key.
1402
+
1403
+ # Exercises
1404
+
1405
+ .. exercise:: Message of the Day
1406
+
1407
+ Create a `MessageOfTheDay` widget displaying the last record of the
1408
+ `oepetstore.message_of_the_day` model. The widget should fetch its
1409
+ record as soon as it is displayed.
1410
+
1411
+ Display the widget in the Pet Store home page.
1412
+
1413
+ .. only:: solutions
1414
+
1415
+ ```javascript
1416
+
1417
+ odoo.oepetstore = function(instance, local) {
1418
+ var _t = instance.web._t,
1419
+ _lt = instance.web._lt;
1420
+ var QWeb = instance.web.qweb;
1421
+
1422
+ local.HomePage = instance.Widget.extend({
1423
+ template: "HomePage",
1424
+ start: function() {
1425
+ return new local.MessageOfTheDay(this).appendTo(this.$el);
1426
+ },
1427
+ });
1428
+
1429
+ instance.web.client_actions.add('petstore.homepage', 'instance.oepetstore.HomePage');
1430
+
1431
+ local.MessageOfTheDay = instance.Widget.extend({
1432
+ template: "MessageOfTheDay",
1433
+ start: function() {
1434
+ var self = this;
1435
+ return new instance.web.Model("oepetstore.message_of_the_day")
1436
+ .query(["message"])
1437
+ .order_by('-create_date', '-id')
1438
+ .first()
1439
+ .then(function(result) {
1440
+ self.$(".oe_mywidget_message_of_the_day").text(result.message);
1441
+ });
1442
+ },
1443
+ });
1444
+
1445
+ }
1446
+
1447
+ ```xml
1448
+
1449
+ <?xml version="1.0" encoding="UTF-8"?>
1450
+ <templates xml:space="preserve">
1451
+ <t t-name="HomePage">
1452
+ <div class="oe_petstore_homepage">
1453
+ </div>
1454
+ </t>
1455
+ <t t-name="MessageOfTheDay">
1456
+ <div class="oe_petstore_motd">
1457
+ <p class="oe_mywidget_message_of_the_day"></p>
1458
+ </div>
1459
+ </t>
1460
+ </templates>
1461
+
1462
+ ```css
1463
+
1464
+ .oe_petstore_motd {
1465
+ margin: 5px;
1466
+ padding: 5px;
1467
+ border-radius: 3px;
1468
+ background-color: #F0EEEE;
1469
+ }
1470
+
1471
+ .. exercise:: Pet Toys List
1472
+
1473
+ Create a `PetToysList` widget displaying 5 toys (using their name and
1474
+ their images).
1475
+
1476
+ The pet toys are not stored in a new model, instead they're stored in
1477
+ `product.product` using a special category *Pet Toys*. You can see the
1478
+ pre-generated toys and add new ones by going to
1479
+ :menuselection:`Pet Store --> Pet Store --> Pet Toys`. You will probably
1480
+ need to explore `product.product` to create the right domain to
1481
+ select just pet toys.
1482
+
1483
+ In Odoo, images are generally stored in regular fields encoded as
1484
+ base64_, HTML supports displaying images straight from base64 with
1485
+ :samp:`<img src="data:{mime_type};base64,{base64_image_data}"/>`
1486
+
1487
+ The `PetToysList` widget should be displayed on the home page on the
1488
+ right of the `MessageOfTheDay` widget. You will need to make some layout
1489
+ with CSS to achieve this.
1490
+
1491
+ .. only:: solutions
1492
+
1493
+ ```javascript
1494
+
1495
+ odoo.oepetstore = function(instance, local) {
1496
+ var _t = instance.web._t,
1497
+ _lt = instance.web._lt;
1498
+ var QWeb = instance.web.qweb;
1499
+
1500
+ local.HomePage = instance.Widget.extend({
1501
+ template: "HomePage",
1502
+ start: function () {
1503
+ return Promise.all([
1504
+ new local.PetToysList(this).appendTo(this.$('.oe_petstore_homepage_left')),
1505
+ new local.MessageOfTheDay(this).appendTo(this.$('.oe_petstore_homepage_right'))
1506
+ ]);
1507
+ }
1508
+ });
1509
+ instance.web.client_actions.add('petstore.homepage', 'instance.oepetstore.HomePage');
1510
+
1511
+ local.MessageOfTheDay = instance.Widget.extend({
1512
+ template: 'MessageOfTheDay',
1513
+ start: function () {
1514
+ var self = this;
1515
+ return new instance.web.Model('oepetstore.message_of_the_day')
1516
+ .query(["message"])
1517
+ .order_by('-create_date', '-id')
1518
+ .first()
1519
+ .then(function (result) {
1520
+ self.$(".oe_mywidget_message_of_the_day").text(result.message);
1521
+ });
1522
+ }
1523
+ });
1524
+
1525
+ local.PetToysList = instance.Widget.extend({
1526
+ template: 'PetToysList',
1527
+ start: function () {
1528
+ var self = this;
1529
+ return new instance.web.Model('product.product')
1530
+ .query(['name', 'image'])
1531
+ .filter([['categ_id.name', '=', "Pet Toys"]])
1532
+ .limit(5)
1533
+ .all()
1534
+ .then(function (results) {
1535
+ _(results).each(function (item) {
1536
+ self.$el.append(QWeb.render('PetToy', {item: item}));
1537
+ });
1538
+ });
1539
+ }
1540
+ });
1541
+ }
1542
+
1543
+ ```xml
1544
+
1545
+ <?xml version="1.0" encoding="UTF-8"?>
1546
+
1547
+ <templates xml:space="preserve">
1548
+ <t t-name="HomePage">
1549
+ <div class="oe_petstore_homepage">
1550
+ <div class="oe_petstore_homepage_left"></div>
1551
+ <div class="oe_petstore_homepage_right"></div>
1552
+ </div>
1553
+ </t>
1554
+ <t t-name="MessageOfTheDay">
1555
+ <div class="oe_petstore_motd">
1556
+ <p class="oe_mywidget_message_of_the_day"></p>
1557
+ </div>
1558
+ </t>
1559
+ <t t-name="PetToysList">
1560
+ <div class="oe_petstore_pettoyslist">
1561
+ </div>
1562
+ </t>
1563
+ <t t-name="PetToy">
1564
+ <div class="oe_petstore_pettoy">
1565
+ <p><t t-esc="item.name"/></p>
1566
+ <p><img t-att-src="'data:image/jpg;base64,'+item.image"/></p>
1567
+ </div>
1568
+ </t>
1569
+ </templates>
1570
+
1571
+ ```css
1572
+
1573
+ .oe_petstore_homepage {
1574
+ display: table;
1575
+ }
1576
+
1577
+ .oe_petstore_homepage_left {
1578
+ display: table-cell;
1579
+ width : 300px;
1580
+ }
1581
+
1582
+ .oe_petstore_homepage_right {
1583
+ display: table-cell;
1584
+ width : 300px;
1585
+ }
1586
+
1587
+ .oe_petstore_motd {
1588
+ margin: 5px;
1589
+ padding: 5px;
1590
+ border-radius: 3px;
1591
+ background-color: #F0EEEE;
1592
+ }
1593
+
1594
+ .oe_petstore_pettoyslist {
1595
+ padding: 5px;
1596
+ }
1597
+
1598
+ .oe_petstore_pettoy {
1599
+ margin: 5px;
1600
+ padding: 5px;
1601
+ border-radius: 3px;
1602
+ background-color: #F0EEEE;
1603
+ }
1604
+
1605
+
1606
+ # Existing web components
1607
+
1608
+ ## The Action Manager
1609
+
1610
+ In Odoo, many operations start from an :doc:`action <../reference/backend/actions>`:
1611
+ opening a menu item (to a view), printing a report, ...
1612
+
1613
+ Actions are pieces of data describing how a client should react to the
1614
+ activation of a piece of content. Actions can be stored (and read through a
1615
+ model) or they can be generated on-the fly (locally to the client by
1616
+ javascript code, or remotely by a method of a model).
1617
+
1618
+ In Odoo Web, the component responsible for handling and reacting to these
1619
+ actions is the *Action Manager*.
1620
+
1621
+ ### Using the Action Manager
1622
+
1623
+ The action manager can be invoked explicitly from javascript code by creating
1624
+ a dictionary describing :doc:`an action <../reference/backend/actions>` of the right
1625
+ type, and calling an action manager instance with it.
1626
+
1627
+ :func:`~odoo.Widget.do_action` is a shortcut of :class:`~odoo.Widget`
1628
+ looking up the "current" action manager and executing the action::
1629
+
1630
+ instance.web.TestWidget = instance.Widget.extend({
1631
+ dispatch_to_new_action: function() {
1632
+ this.do_action({
1633
+ type: 'ir.actions.act_window',
1634
+ res_model: "product.product",
1635
+ res_id: 1,
1636
+ views: [[false, 'form']],
1637
+ target: 'current',
1638
+ context: {},
1639
+ });
1640
+ },
1641
+ });
1642
+
1643
+ The most common action `type` is `ir.actions.act_window` which provides
1644
+ views to a model (displays a model in various manners), its most common
1645
+ attributes are:
1646
+
1647
+ `res_model`
1648
+ The model to display in views
1649
+ `res_id` (optional)
1650
+ For form views, a preselected record in `res_model`
1651
+ `views`
1652
+ Lists the views available through the action. A list of
1653
+ `[view_id, view_type]`, `view_id` can either be the database identifier
1654
+ of a view of the right type, or `false` to use the view by default for
1655
+ the specified type. View types can not be present multiple times. The action
1656
+ will open the first view of the list by default.
1657
+ `target`
1658
+ Either `current` (the default) which replaces the "content" section of the
1659
+ web client by the action, or `new` to open the action in a dialog box.
1660
+ `context`
1661
+ Additional context data to use within the action.
1662
+
1663
+ .. exercise:: Jump to Product
1664
+
1665
+ Modify the `PetToysList` component so clicking on a toy replaces the
1666
+ homepage by the toy's form view.
1667
+
1668
+ .. only:: solutions
1669
+
1670
+ ```javascript
1671
+
1672
+ local.PetToysList = instance.Widget.extend({
1673
+ template: 'PetToysList',
1674
+ events: {
1675
+ 'click .oe_petstore_pettoy': 'selected_item',
1676
+ },
1677
+ start: function () {
1678
+ var self = this;
1679
+ return new instance.web.Model('product.product')
1680
+ .query(['name', 'image'])
1681
+ .filter([['categ_id.name', '=', "Pet Toys"]])
1682
+ .limit(5)
1683
+ .all()
1684
+ .then(function (results) {
1685
+ _(results).each(function (item) {
1686
+ self.$el.append(QWeb.render('PetToy', {item: item}));
1687
+ });
1688
+ });
1689
+ },
1690
+ selected_item: function (event) {
1691
+ this.do_action({
1692
+ type: 'ir.actions.act_window',
1693
+ res_model: 'product.product',
1694
+ res_id: $(event.currentTarget).data('id'),
1695
+ views: [[false, 'form']],
1696
+ });
1697
+ },
1698
+ });
1699
+
1700
+ ```xml
1701
+
1702
+ <t t-name="PetToy">
1703
+ <div class="oe_petstore_pettoy" t-att-data-id="item.id">
1704
+ <p><t t-esc="item.name"/></p>
1705
+ <p><img t-attf-src="data:image/jpg;base64,{{item.image}}"/></p>
1706
+ </div>
1707
+ </t>
1708
+
1709
+ .. _howtos/web/client_actions:
1710
+
1711
+ ## Client Actions
1712
+
1713
+ Throughout this guide, we used a simple `HomePage` widget which the web
1714
+ client automatically starts when we select the right menu item. But how did
1715
+ the Odoo web know to start this widget? Because the widget is registered as
1716
+ a *client action*.
1717
+
1718
+ A client action is (as its name implies) an action type defined almost
1719
+ entirely in the client, in javascript for Odoo web. The server simply sends
1720
+ an action tag (an arbitrary name), and optionally adds a few parameters, but
1721
+ beyond that *everything* is handled by custom client code.
1722
+
1723
+ Our widget is registered as the handler for the client action through this::
1724
+
1725
+ instance.web.client_actions.add('petstore.homepage', 'instance.oepetstore.HomePage');
1726
+
1727
+
1728
+ `instance.web.client_actions` is a :class:`~odoo.web.Registry` in which
1729
+ the action manager looks up client action handlers when it needs to execute
1730
+ one. The first parameter of :class:`~odoo.web.Registry.add` is the name
1731
+ (tag) of the client action, and the second parameter is the path to the widget
1732
+ from the Odoo web client root.
1733
+
1734
+ When a client action must be executed, the action manager looks up its tag
1735
+ in the registry, walks the specified path and displays the widget it finds at
1736
+ the end.
1737
+
1738
+ .. note:: a client action handler can also be a regular function, in which case
1739
+ it'll be called and its result (if any) will be interpreted as the
1740
+ next action to execute.
1741
+
1742
+ On the server side, we had simply defined an `ir.actions.client` action:
1743
+
1744
+ ```xml
1745
+
1746
+ <record id="action_home_page" model="ir.actions.client">
1747
+ <field name="tag">petstore.homepage</field>
1748
+ </record>
1749
+
1750
+ and a menu opening the action:
1751
+
1752
+ ```xml
1753
+
1754
+ <menuitem id="home_page_petstore_menu" parent="petstore_menu"
1755
+ name="Home Page" action="action_home_page"/>
1756
+
1757
+ ## Architecture of the Views
1758
+
1759
+ Much of Odoo web's usefulness (and complexity) resides in views. Each view
1760
+ type is a way of displaying a model in the client.
1761
+
1762
+ ### The View Manager
1763
+
1764
+ When an `ActionManager` instance receive an action of type
1765
+ `ir.actions.act_window`, it delegates the synchronization and handling of
1766
+ the views themselves to a *view manager*, which will then set up one or
1767
+ multiple views depending on the original action's requirements:
1768
+
1769
+ .. image:: web/viewarchitecture.png
1770
+ :align: center
1771
+ :width: 40%
1772
+
1773
+ ### The Views
1774
+
1775
+ Most :doc:`Odoo views <../reference/user_interface/view_records>` are implemented through a subclass
1776
+ of :class:`odoo.web.View` which provides a bit of generic basic structure
1777
+ for handling events and displaying model information.
1778
+
1779
+ The *search view* is considered a view type by the main Odoo framework, but
1780
+ handled separately by the web client (as it's a more permanent fixture and
1781
+ can interact with other views, which regular views don't do).
1782
+
1783
+ A view is responsible for loading its own description XML (using
1784
+ :py:class:`~odoo.models.Model.fields_view_get`) and any other data source
1785
+ it needs. To that purpose, views are provided with an optional view
1786
+ identifier set as the :attr:`~odoo.web.View.view_id` attribute.
1787
+
1788
+ Views are also provided with a :class:`~odoo.web.DataSet` instance which
1789
+ holds most necessary model information (the model name and possibly various
1790
+ record ids).
1791
+
1792
+ Views may also want to handle search queries by overriding
1793
+ :func:`~odoo.web.View.do_search`, and updating their
1794
+ :class:`~odoo.web.DataSet` as necessary.
1795
+
1796
+ ## The Form View Fields
1797
+
1798
+ A common need is the extension of the web form view to add new ways of
1799
+ displaying fields.
1800
+
1801
+ All built-in fields have a default display implementation, a new
1802
+ form widget may be necessary to correctly interact with a new field type
1803
+ (e.g. a :term:`GIS` field) or to provide new representations and ways to
1804
+ interact with existing field types (e.g. validate
1805
+ :py:class:`~odoo.fields.Char` fields which should contain email addresses
1806
+ and display them as email links).
1807
+
1808
+ To explicitly specify which form widget should be used to display a field,
1809
+ simply use the `widget` attribute in the view's XML description:
1810
+
1811
+ ```xml
1812
+
1813
+ <field name="contact_mail" widget="email"/>
1814
+
1815
+ > **note**:
1816
+ > * the same widget is used in both "view" (read-only) and "edit" modes
1817
+ of a form view, it's not possible to use a widget in one and an other
1818
+ widget in the other
1819
+ * and a given field (name) can not be used multiple times in the same form
1820
+ * a widget may ignore the current mode of the form view and remain the
1821
+ same in both view and edit modes
1822
+
1823
+ .. todo:: most of this should probably move to an advanced form view guide
1824
+
1825
+ Fields are instantiated by the form view after it has read its XML description
1826
+ and constructed the corresponding HTML representing that description. After
1827
+ that, the form view will communicate with the field objects using some
1828
+ methods. These methods are defined by the `FieldInterface`
1829
+ interface. Almost all fields inherit the `AbstractField` abstract
1830
+ class. That class defines some default mechanisms that need to be implemented
1831
+ by most fields.
1832
+
1833
+ Here are some of the responsibilities of a field class:
1834
+
1835
+ * The field class must display and allow the user to edit the value of the field.
1836
+ * It must correctly implement the 3 field attributes available in all fields
1837
+ of Odoo. The `AbstractField` class already implements an algorithm that
1838
+ dynamically calculates the value of these attributes (they can change at any
1839
+ moment because their value change according to the value of other
1840
+ fields). Their values are stored in *Widget Properties* (the widget
1841
+ properties were explained earlier in this guide). It is the responsibility
1842
+ of each field class to check these widget properties and dynamically adapt
1843
+ depending of their values. Here is a description of each of these
1844
+ attributes:
1845
+
1846
+ * `required`: The field must have a value before saving. If `required`
1847
+ is `true` and the field doesn't have a value, the method
1848
+ `is_valid()` of the field must return `false`.
1849
+ * `invisible`: When this is `true`, the field must be invisible. The
1850
+ `AbstractField` class already has a basic implementation of this
1851
+ behavior that fits most fields.
1852
+ * `readonly`: When `true`, the field must not be editable by the
1853
+ user. Most fields in Odoo have a completely different behavior depending
1854
+ on the value of `readonly`. As example, the `FieldChar` displays an
1855
+ HTML `<input>` when it is editable and simply displays the text when
1856
+ it is read-only. This also means it has much more code it would need to
1857
+ implement only one behavior, but this is necessary to ensure a good user
1858
+ experience.
1859
+
1860
+ * Fields have two methods, `set_value()` and `get_value()`, which are
1861
+ called by the form view to give it the value to display and get back the new
1862
+ value entered by the user. These methods must be able to handle the value as
1863
+ given by the Odoo server when a `read()` is performed on a model and give
1864
+ back a valid value for a `write()`. Remember that the JavaScript/Python
1865
+ data types used to represent the values given by `read()` and given to
1866
+ `write()` is not necessarily the same in Odoo. As example, when you read a
1867
+ many2one, it is always a tuple whose first value is the id of the pointed
1868
+ record and the second one is the name get (ie: `(15, "Agrolait")`). But
1869
+ when you write a many2one it must be a single integer, not a tuple
1870
+ anymore. `AbstractField` has a default implementation of these methods
1871
+ that works well for simple data type and set a widget property named
1872
+ `value`.
1873
+
1874
+ Please note that, to better understand how to implement fields, you are
1875
+ strongly encouraged to look at the definition of the `FieldInterface`
1876
+ interface and the `AbstractField` class directly in the code of the Odoo web
1877
+ client.
1878
+
1879
+ ### Creating a New Type of Field
1880
+
1881
+ In this part we will explain how to create a new type of field. The example
1882
+ here will be to re-implement the `FieldChar` class and progressively explain
1883
+ each part.
1884
+
1885
+ Simple Read-Only Field
1886
+ **********************
1887
+
1888
+ Here is a first implementation that will only display text. The
1889
+ user will not be able to modify the content of the field.
1890
+
1891
+ ```javascript
1892
+
1893
+ local.FieldChar2 = instance.web.form.AbstractField.extend({
1894
+ init: function() {
1895
+ this._super.apply(this, arguments);
1896
+ this.set("value", "");
1897
+ },
1898
+ render_value: function() {
1899
+ this.$el.text(this.get("value"));
1900
+ },
1901
+ });
1902
+
1903
+ instance.web.form.widgets.add('char2', 'instance.oepetstore.FieldChar2');
1904
+
1905
+ In this example, we declare a class named `FieldChar2` inheriting from
1906
+ `AbstractField`. We also register this class in the registry
1907
+ `instance.web.form.widgets` under the key `char2`. That will allow us to
1908
+ use this new field in any form view by specifying `widget="char2"` in the
1909
+ `<field/>` tag in the XML declaration of the view.
1910
+
1911
+ In this example, we define a single method: `render_value()`. All it does is
1912
+ display the widget property `value`. Those are two tools defined by the
1913
+ `AbstractField` class. As explained before, the form view will call the
1914
+ method `set_value()` of the field to set the value to display. This method
1915
+ already has a default implementation in `AbstractField` which simply sets
1916
+ the widget property `value`. `AbstractField` also watch the
1917
+ `change:value` event on itself and calls the `render_value()` when it
1918
+ occurs. So, `render_value()` is a convenience method to implement in child
1919
+ classes to perform some operation each time the value of the field changes.
1920
+
1921
+ In the `init()` method, we also define the default value of the field if
1922
+ none is specified by the form view (here we assume the default value of a
1923
+ `char` field should be an empty string).
1924
+
1925
+ Read-Write Field
1926
+ ****************
1927
+
1928
+ Read-only fields, which only display content and don't allow the
1929
+ user to modify it can be useful, but most fields in Odoo also allow editing.
1930
+ This makes the field classes more complicated, mostly because fields are
1931
+ supposed to handle both editable and non-editable mode, those modes are
1932
+ often completely different (for design and usability purpose) and the fields
1933
+ must be able to switch between modes at any moment.
1934
+
1935
+ To know in which mode the current field should be, the `AbstractField` class
1936
+ sets a widget property named `effective_readonly`. The field should watch
1937
+ for changes in that widget property and display the correct mode
1938
+ accordingly. Example::
1939
+
1940
+ local.FieldChar2 = instance.web.form.AbstractField.extend({
1941
+ init: function() {
1942
+ this._super.apply(this, arguments);
1943
+ this.set("value", "");
1944
+ },
1945
+ start: function() {
1946
+ this.on("change:effective_readonly", this, function() {
1947
+ this.display_field();
1948
+ this.render_value();
1949
+ });
1950
+ this.display_field();
1951
+ return this._super();
1952
+ },
1953
+ display_field: function() {
1954
+ var self = this;
1955
+ this.$el.html(QWeb.render("FieldChar2", {widget: this}));
1956
+ if (! this.get("effective_readonly")) {
1957
+ this.$("input").change(function() {
1958
+ self.internal_set_value(self.$("input").val());
1959
+ });
1960
+ }
1961
+ },
1962
+ render_value: function() {
1963
+ if (this.get("effective_readonly")) {
1964
+ this.$el.text(this.get("value"));
1965
+ } else {
1966
+ this.$("input").val(this.get("value"));
1967
+ }
1968
+ },
1969
+ });
1970
+
1971
+ instance.web.form.widgets.add('char2', 'instance.oepetstore.FieldChar2');
1972
+
1973
+ ```xml
1974
+
1975
+ <t t-name="FieldChar2">
1976
+ <div class="oe_field_char2">
1977
+ <t t-if="! widget.get('effective_readonly')">
1978
+ <input type="text"></input>
1979
+ </t>
1980
+ </div>
1981
+ </t>
1982
+
1983
+ In the `start()` method (which is called immediately after a widget has been
1984
+ appended to the DOM), we bind on the event `change:effective_readonly`. That
1985
+ allows us to redisplay the field each time the widget property
1986
+ `effective_readonly` changes. This event handler will call
1987
+ `display_field()`, which is also called directly in `start()`. This
1988
+ `display_field()` was created specifically for this field, it's not a method
1989
+ defined in `AbstractField` or any other class. We can use this method
1990
+ to display the content of the field depending on the current mode.
1991
+
1992
+ From now on the conception of this field is typical, except there is a
1993
+ lot of verifications to know the state of the `effective_readonly` property:
1994
+
1995
+ * In the QWeb template used to display the content of the widget, it displays
1996
+ an `<input type="text" />` if we are in read-write mode and nothing in
1997
+ particular in read-only mode.
1998
+ * In the `display_field()` method, we have to bind on the `change` event
1999
+ of the `<input type="text" />` to know when the user has changed the
2000
+ value. When it happens, we call the `internal_set_value()` method with the
2001
+ new value of the field. This is a convenience method provided by the
2002
+ `AbstractField` class. That method will set a new value in the `value`
2003
+ property but will not trigger a call to `render_value()` (which is not
2004
+ necessary since the `<input type="text" />` already contains the correct
2005
+ value).
2006
+ * In `render_value()`, we use a completely different code to display the
2007
+ value of the field depending if we are in read-only or in read-write mode.
2008
+
2009
+ .. exercise:: Create a Color Field
2010
+
2011
+ Create a `FieldColor` class. The value of this field should be a string
2012
+ containing a color code like those used in CSS (example: `#FF0000` for
2013
+ red). In read-only mode, this color field should display a little block
2014
+ whose color corresponds to the value of the field. In read-write mode, you
2015
+ should display an `<input type="color" />`. That type of `<input />`
2016
+ is an HTML5 component that doesn't work in all browsers but works well in
2017
+ Google Chrome. So it's OK to use as an exercise.
2018
+
2019
+ You can use that widget in the form view of the `message_of_the_day`
2020
+ model for its field named `color`. As a bonus, you can change the
2021
+ `MessageOfTheDay` widget created in the previous part of this guide to
2022
+ display the message of the day with the background color indicated in the
2023
+ `color` field.
2024
+
2025
+ .. only:: solutions
2026
+
2027
+ ```javascript
2028
+
2029
+ local.FieldColor = instance.web.form.AbstractField.extend({
2030
+ events: {
2031
+ 'change input': function (e) {
2032
+ if (!this.get('effective_readonly')) {
2033
+ this.internal_set_value($(e.currentTarget).val());
2034
+ }
2035
+ }
2036
+ },
2037
+ init: function() {
2038
+ this._super.apply(this, arguments);
2039
+ this.set("value", "");
2040
+ },
2041
+ start: function() {
2042
+ this.on("change:effective_readonly", this, function() {
2043
+ this.display_field();
2044
+ this.render_value();
2045
+ });
2046
+ this.display_field();
2047
+ return this._super();
2048
+ },
2049
+ display_field: function() {
2050
+ this.$el.html(QWeb.render("FieldColor", {widget: this}));
2051
+ },
2052
+ render_value: function() {
2053
+ if (this.get("effective_readonly")) {
2054
+ this.$(".oe_field_color_content").css("background-color", this.get("value") || "#FFFFFF");
2055
+ } else {
2056
+ this.$("input").val(this.get("value") || "#FFFFFF");
2057
+ }
2058
+ },
2059
+ });
2060
+ instance.web.form.widgets.add('color', 'instance.oepetstore.FieldColor');
2061
+
2062
+ ```xml
2063
+
2064
+ <t t-name="FieldColor">
2065
+ <div class="oe_field_color">
2066
+ <t t-if="widget.get('effective_readonly')">
2067
+ <div class="oe_field_color_content" />
2068
+ </t>
2069
+ <t t-if="! widget.get('effective_readonly')">
2070
+ <input type="color"></input>
2071
+ </t>
2072
+ </div>
2073
+ </t>
2074
+
2075
+ ```css
2076
+
2077
+ .oe_field_color_content {
2078
+ height: 20px;
2079
+ width: 50px;
2080
+ border: 1px solid black;
2081
+ }
2082
+
2083
+ ## The Form View Custom Widgets
2084
+
2085
+ Form fields are used to edit a single field, and are intrinsically linked to
2086
+ a field. Because this may be limiting, it is also possible to create
2087
+ *form widgets* which are not so restricted and have less ties to a specific
2088
+ lifecycle.
2089
+
2090
+ Custom form widgets can be added to a form view through the `widget` tag:
2091
+
2092
+ ```xml
2093
+
2094
+ <widget type="xxx" />
2095
+
2096
+ This type of widget will simply be created by the form view during the
2097
+ creation of the HTML according to the XML definition. They have properties in
2098
+ common with the fields (like the `effective_readonly` property) but they are
2099
+ not assigned a precise field. And so they don't have methods like
2100
+ `get_value()` and `set_value()`. They must inherit from the `FormWidget`
2101
+ abstract class.
2102
+
2103
+ Form widgets can interact with form fields by listening for their changes and
2104
+ fetching or altering their values. They can access form fields through
2105
+ their :attr:`~odoo.web.form.FormWidget.field_manager` attribute::
2106
+
2107
+ local.WidgetMultiplication = instance.web.form.FormWidget.extend({
2108
+ start: function() {
2109
+ this._super();
2110
+ this.field_manager.on("field_changed:integer_a", this, this.display_result);
2111
+ this.field_manager.on("field_changed:integer_b", this, this.display_result);
2112
+ this.display_result();
2113
+ },
2114
+ display_result: function() {
2115
+ var result = this.field_manager.get_field_value("integer_a") *
2116
+ this.field_manager.get_field_value("integer_b");
2117
+ this.$el.text("a*b = " + result);
2118
+ }
2119
+ });
2120
+
2121
+ instance.web.form.custom_widgets.add('multiplication', 'instance.oepetstore.WidgetMultiplication');
2122
+
2123
+ :attr:`~odoo.web.form.FormWidget` is generally the
2124
+ :class:`~odoo.web.form.FormView` itself, but features used from it should
2125
+ be limited to those defined by :class:`~odoo.web.form.FieldManagerMixin`,
2126
+ the most useful being:
2127
+
2128
+ * :func:`~odoo.web.form.FieldManagerMixin.get_field_value(field_name)`
2129
+ which returns the value of a field.
2130
+ * :func:`~odoo.web.form.FieldManagerMixin.set_values(values)` sets multiple
2131
+ field values, takes a mapping of `{field_name: value_to_set}`
2132
+ * An event :samp:`field_changed:{field_name}` is triggered any time the value
2133
+ of the field called `field_name` is changed
2134
+
2135
+ .. exercise:: Show Coordinates on Google Map
2136
+
2137
+ Add two fields to `product.product` storing a latitude and a longitude,
2138
+ then create a new form widget to display the latitude and longitude of
2139
+ a product's origin on a map
2140
+
2141
+ To display the map, use Google Map's embedding:
2142
+
2143
+ ```html
2144
+
2145
+ <iframe width="400" height="300" src="https://maps.google.com/?ie=UTF8&amp;ll=XXX,YYY&amp;output=embed">
2146
+ </iframe>
2147
+
2148
+ where `XXX` should be replaced by the latitude and `YYY` by the
2149
+ longitude.
2150
+
2151
+ Display the two position fields and a map widget using them in a new
2152
+ notebook page of the product's form view.
2153
+
2154
+ .. only:: solutions
2155
+
2156
+ ```javascript
2157
+
2158
+ local.WidgetCoordinates = instance.web.form.FormWidget.extend({
2159
+ start: function() {
2160
+ this._super();
2161
+ this.field_manager.on("field_changed:provider_latitude", this, this.display_map);
2162
+ this.field_manager.on("field_changed:provider_longitude", this, this.display_map);
2163
+ this.display_map();
2164
+ },
2165
+ display_map: function() {
2166
+ this.$el.html(QWeb.render("WidgetCoordinates", {
2167
+ "latitude": this.field_manager.get_field_value("provider_latitude") || 0,
2168
+ "longitude": this.field_manager.get_field_value("provider_longitude") || 0,
2169
+ }));
2170
+ }
2171
+ });
2172
+
2173
+ instance.web.form.custom_widgets.add('coordinates', 'instance.oepetstore.WidgetCoordinates');
2174
+
2175
+ ```xml
2176
+
2177
+ <t t-name="WidgetCoordinates">
2178
+ <iframe width="400" height="300"
2179
+ t-attf-src="https://maps.google.com/?ie=UTF8&amp;ll={{latitude}},{{longitude}}&amp;output=embed">
2180
+ </iframe>
2181
+ </t>
2182
+
2183
+ .. exercise:: Get the Current Coordinate
2184
+
2185
+ Add a button resetting the product's coordinates to the location of the
2186
+ user, you can get these coordinates using the
2187
+ `javascript geolocation API`_.
2188
+
2189
+ Now we would like to display an additional button to automatically set the
2190
+ coordinates to the location of the current user.
2191
+
2192
+ To get the coordinates of the user, an easy way is to use the geolocation
2193
+ JavaScript API. `See the online documentation to know how to use it`_.
2194
+
2195
+ .. _See the online documentation to know how to use it: http://www.w3schools.com/html/html5_geolocation.asp
2196
+
2197
+ Please also note that the user should not be able to
2198
+ click on that button when the form view is in read-only mode. So, this
2199
+ custom widget should handle correctly the `effective_readonly` property
2200
+ just like any field. One way to do this would be to make the button
2201
+ disappear when `effective_readonly` is true.
2202
+
2203
+ .. only:: solutions
2204
+
2205
+ ```javascript
2206
+
2207
+ local.WidgetCoordinates = instance.web.form.FormWidget.extend({
2208
+ events: {
2209
+ 'click button': function () {
2210
+ navigator.geolocation.getCurrentPosition(
2211
+ this.proxy('received_position'));
2212
+ }
2213
+ },
2214
+ start: function() {
2215
+ var sup = this._super();
2216
+ this.field_manager.on("field_changed:provider_latitude", this, this.display_map);
2217
+ this.field_manager.on("field_changed:provider_longitude", this, this.display_map);
2218
+ this.on("change:effective_readonly", this, this.display_map);
2219
+ this.display_map();
2220
+ return sup;
2221
+ },
2222
+ display_map: function() {
2223
+ this.$el.html(QWeb.render("WidgetCoordinates", {
2224
+ "latitude": this.field_manager.get_field_value("provider_latitude") || 0,
2225
+ "longitude": this.field_manager.get_field_value("provider_longitude") || 0,
2226
+ }));
2227
+ this.$("button").toggle(! this.get("effective_readonly"));
2228
+ },
2229
+ received_position: function(obj) {
2230
+ this.field_manager.set_values({
2231
+ "provider_latitude": obj.coords.latitude,
2232
+ "provider_longitude": obj.coords.longitude,
2233
+ });
2234
+ },
2235
+ });
2236
+
2237
+ instance.web.form.custom_widgets.add('coordinates', 'instance.oepetstore.WidgetCoordinates');
2238
+
2239
+ ```xml
2240
+
2241
+ <t t-name="WidgetCoordinates">
2242
+ <iframe width="400" height="300"
2243
+ t-attf-src="https://maps.google.com/?ie=UTF8&amp;ll={{latitude}},{{longitude}}&amp;output=embed">
2244
+ </iframe>
2245
+ <button>Get My Current Coordinate</button>
2246
+ </t>
2247
+
2248
+ .. [#classes] as a separate concept from instances. In many languages classes
2249
+ are full-fledged objects and themselves instance (of
2250
+ metaclasses) but there remains two fairly separate hierarchies
2251
+ between classes and instances
2252
+ .. [#dombugs] as well as papering over cross-browser differences, although
2253
+ this has become less necessary over time
2254
+
2255
+ .. _jQuery: http://jquery.org
2256
+ .. _Underscore.js: http://underscorejs.org
2257
+ .. _git: http://git-scm.com
2258
+ .. _CSS: http://www.w3.org/Style/CSS/Overview.en.html
2259
+ .. _Simple JavaScript Inheritance:
2260
+ http://ejohn.org/blog/simple-javascript-inheritance/
2261
+ .. _W3C DOM: http://www.w3.org/TR/DOM-Level-3-Core/
2262
+ .. _Qt: http://qt-project.org
2263
+ .. _Cocoa: https://developer.apple.com/technologies/mac/cocoa.html
2264
+ .. _GTK: http://www.gtk.org
2265
+ .. _template engine: http://en.wikipedia.org/wiki/Web_template_system
2266
+ .. _cross-site scripting: http://en.wikipedia.org/wiki/Cross-site_scripting
2267
+ .. _jQuery event object: http://api.jquery.com/category/events/event-object/
2268
+ .. _$.ajax: http://api.jquery.com/jquery.ajax/
2269
+ .. _base64: http://en.wikipedia.org/wiki/Base64
2270
+ .. _javascript geolocation API:
2271
+ http://diveintohtml5.info/geolocation.html
2272
+ .. _PostgreSQL: http://en.wikipedia.org/wiki/PostgreSQL
2273
+ .. _positional arguments:
2274
+ .. _keyword arguments:
2275
+ https://docs.python.org/2/glossary.html#term-argument