You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

599 lines
21 KiB

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
  7. <title>Base Custom Info</title>
  8. <style type="text/css">
  9. /*
  10. :Author: David Goodger (goodger@python.org)
  11. :Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
  12. :Copyright: This stylesheet has been placed in the public domain.
  13. Default cascading style sheet for the HTML output of Docutils.
  14. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
  15. customize this style sheet.
  16. */
  17. /* used to remove borders from tables and images */
  18. .borderless, table.borderless td, table.borderless th {
  19. border: 0 }
  20. table.borderless td, table.borderless th {
  21. /* Override padding for "table.docutils td" with "! important".
  22. The right padding separates the table cells. */
  23. padding: 0 0.5em 0 0 ! important }
  24. .first {
  25. /* Override more specific margin styles with "! important". */
  26. margin-top: 0 ! important }
  27. .last, .with-subtitle {
  28. margin-bottom: 0 ! important }
  29. .hidden {
  30. display: none }
  31. .subscript {
  32. vertical-align: sub;
  33. font-size: smaller }
  34. .superscript {
  35. vertical-align: super;
  36. font-size: smaller }
  37. a.toc-backref {
  38. text-decoration: none ;
  39. color: black }
  40. blockquote.epigraph {
  41. margin: 2em 5em ; }
  42. dl.docutils dd {
  43. margin-bottom: 0.5em }
  44. object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
  45. overflow: hidden;
  46. }
  47. /* Uncomment (and remove this text!) to get bold-faced definition list terms
  48. dl.docutils dt {
  49. font-weight: bold }
  50. */
  51. div.abstract {
  52. margin: 2em 5em }
  53. div.abstract p.topic-title {
  54. font-weight: bold ;
  55. text-align: center }
  56. div.admonition, div.attention, div.caution, div.danger, div.error,
  57. div.hint, div.important, div.note, div.tip, div.warning {
  58. margin: 2em ;
  59. border: medium outset ;
  60. padding: 1em }
  61. div.admonition p.admonition-title, div.hint p.admonition-title,
  62. div.important p.admonition-title, div.note p.admonition-title,
  63. div.tip p.admonition-title {
  64. font-weight: bold ;
  65. font-family: sans-serif }
  66. div.attention p.admonition-title, div.caution p.admonition-title,
  67. div.danger p.admonition-title, div.error p.admonition-title,
  68. div.warning p.admonition-title, .code .error {
  69. color: red ;
  70. font-weight: bold ;
  71. font-family: sans-serif }
  72. /* Uncomment (and remove this text!) to get reduced vertical space in
  73. compound paragraphs.
  74. div.compound .compound-first, div.compound .compound-middle {
  75. margin-bottom: 0.5em }
  76. div.compound .compound-last, div.compound .compound-middle {
  77. margin-top: 0.5em }
  78. */
  79. div.dedication {
  80. margin: 2em 5em ;
  81. text-align: center ;
  82. font-style: italic }
  83. div.dedication p.topic-title {
  84. font-weight: bold ;
  85. font-style: normal }
  86. div.figure {
  87. margin-left: 2em ;
  88. margin-right: 2em }
  89. div.footer, div.header {
  90. clear: both;
  91. font-size: smaller }
  92. div.line-block {
  93. display: block ;
  94. margin-top: 1em ;
  95. margin-bottom: 1em }
  96. div.line-block div.line-block {
  97. margin-top: 0 ;
  98. margin-bottom: 0 ;
  99. margin-left: 1.5em }
  100. div.sidebar {
  101. margin: 0 0 0.5em 1em ;
  102. border: medium outset ;
  103. padding: 1em ;
  104. background-color: #ffffee ;
  105. width: 40% ;
  106. float: right ;
  107. clear: right }
  108. div.sidebar p.rubric {
  109. font-family: sans-serif ;
  110. font-size: medium }
  111. div.system-messages {
  112. margin: 5em }
  113. div.system-messages h1 {
  114. color: red }
  115. div.system-message {
  116. border: medium outset ;
  117. padding: 1em }
  118. div.system-message p.system-message-title {
  119. color: red ;
  120. font-weight: bold }
  121. div.topic {
  122. margin: 2em }
  123. h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
  124. h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  125. margin-top: 0.4em }
  126. h1.title {
  127. text-align: center }
  128. h2.subtitle {
  129. text-align: center }
  130. hr.docutils {
  131. width: 75% }
  132. img.align-left, .figure.align-left, object.align-left, table.align-left {
  133. clear: left ;
  134. float: left ;
  135. margin-right: 1em }
  136. img.align-right, .figure.align-right, object.align-right, table.align-right {
  137. clear: right ;
  138. float: right ;
  139. margin-left: 1em }
  140. img.align-center, .figure.align-center, object.align-center {
  141. display: block;
  142. margin-left: auto;
  143. margin-right: auto;
  144. }
  145. table.align-center {
  146. margin-left: auto;
  147. margin-right: auto;
  148. }
  149. .align-left {
  150. text-align: left }
  151. .align-center {
  152. clear: both ;
  153. text-align: center }
  154. .align-right {
  155. text-align: right }
  156. /* reset inner alignment in figures */
  157. div.align-right {
  158. text-align: inherit }
  159. /* div.align-center * { */
  160. /* text-align: left } */
  161. .align-top {
  162. vertical-align: top }
  163. .align-middle {
  164. vertical-align: middle }
  165. .align-bottom {
  166. vertical-align: bottom }
  167. ol.simple, ul.simple {
  168. margin-bottom: 1em }
  169. ol.arabic {
  170. list-style: decimal }
  171. ol.loweralpha {
  172. list-style: lower-alpha }
  173. ol.upperalpha {
  174. list-style: upper-alpha }
  175. ol.lowerroman {
  176. list-style: lower-roman }
  177. ol.upperroman {
  178. list-style: upper-roman }
  179. p.attribution {
  180. text-align: right ;
  181. margin-left: 50% }
  182. p.caption {
  183. font-style: italic }
  184. p.credits {
  185. font-style: italic ;
  186. font-size: smaller }
  187. p.label {
  188. white-space: nowrap }
  189. p.rubric {
  190. font-weight: bold ;
  191. font-size: larger ;
  192. color: maroon ;
  193. text-align: center }
  194. p.sidebar-title {
  195. font-family: sans-serif ;
  196. font-weight: bold ;
  197. font-size: larger }
  198. p.sidebar-subtitle {
  199. font-family: sans-serif ;
  200. font-weight: bold }
  201. p.topic-title {
  202. font-weight: bold }
  203. pre.address {
  204. margin-bottom: 0 ;
  205. margin-top: 0 ;
  206. font: inherit }
  207. pre.literal-block, pre.doctest-block, pre.math, pre.code {
  208. margin-left: 2em ;
  209. margin-right: 2em }
  210. pre.code .ln { color: grey; } /* line numbers */
  211. pre.code, code { background-color: #eeeeee }
  212. pre.code .comment, code .comment { color: #5C6576 }
  213. pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
  214. pre.code .literal.string, code .literal.string { color: #0C5404 }
  215. pre.code .name.builtin, code .name.builtin { color: #352B84 }
  216. pre.code .deleted, code .deleted { background-color: #DEB0A1}
  217. pre.code .inserted, code .inserted { background-color: #A3D289}
  218. span.classifier {
  219. font-family: sans-serif ;
  220. font-style: oblique }
  221. span.classifier-delimiter {
  222. font-family: sans-serif ;
  223. font-weight: bold }
  224. span.interpreted {
  225. font-family: sans-serif }
  226. span.option {
  227. white-space: nowrap }
  228. span.pre {
  229. white-space: pre }
  230. span.problematic {
  231. color: red }
  232. span.section-subtitle {
  233. /* font-size relative to parent (h1..h6 element) */
  234. font-size: 80% }
  235. table.citation {
  236. border-left: solid 1px gray;
  237. margin-left: 1px }
  238. table.docinfo {
  239. margin: 2em 4em }
  240. table.docutils {
  241. margin-top: 0.5em ;
  242. margin-bottom: 0.5em }
  243. table.footnote {
  244. border-left: solid 1px black;
  245. margin-left: 1px }
  246. table.docutils td, table.docutils th,
  247. table.docinfo td, table.docinfo th {
  248. padding-left: 0.5em ;
  249. padding-right: 0.5em ;
  250. vertical-align: top }
  251. table.docutils th.field-name, table.docinfo th.docinfo-name {
  252. font-weight: bold ;
  253. text-align: left ;
  254. white-space: nowrap ;
  255. padding-left: 0 }
  256. /* "booktabs" style (no vertical lines) */
  257. table.docutils.booktabs {
  258. border: 0px;
  259. border-top: 2px solid;
  260. border-bottom: 2px solid;
  261. border-collapse: collapse;
  262. }
  263. table.docutils.booktabs * {
  264. border: 0px;
  265. }
  266. table.docutils.booktabs th {
  267. border-bottom: thin solid;
  268. text-align: left;
  269. }
  270. h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
  271. h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  272. font-size: 100% }
  273. ul.auto-toc {
  274. list-style-type: none }
  275. </style>
  276. </head>
  277. <body>
  278. <div class="document" id="base-custom-info">
  279. <h1 class="title">Base Custom Info</h1>
  280. <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  281. !! This file is generated by oca-gen-addon-readme !!
  282. !! changes will be overwritten. !!
  283. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
  284. <p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/base_custom_info"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_custom_info"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/149/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
  285. <p>This module allows you to attach custom information to records without the need
  286. to alter the database structure too much.</p>
  287. <p>This module defines several concepts that you have to understand.</p>
  288. <div class="section" id="templates">
  289. <h1>Templates</h1>
  290. <p>A <em>template</em> is a collection of <em>properties</em> that a record should have.
  291. <em>Templates</em> always apply to a given model, and then you can choose among the
  292. current templates for the model you are using when you edit a record of that
  293. model.</p>
  294. <p>I.e., This addon includes a demo template called “Smart partners”, that applies
  295. to the model <tt class="docutils literal">res.partner</tt>, so if you edit any partner, you can choose that
  296. template and get its properties autofilled.</p>
  297. </div>
  298. <div class="section" id="properties">
  299. <h1>Properties</h1>
  300. <p>A <em>property</em> is the “name” of the field. <em>Templates</em> can have any amount of
  301. <em>properties</em>, and when you apply a <em>template</em> to a record, it automatically
  302. gets all of its <em>properties</em> filled, empty (unless they have a <em>Default
  303. value</em>), ready to assign <em>values</em>.</p>
  304. <p>You can set a property to as <em>required</em> to force it have a value, although you
  305. should keep in mind that for yes/no properties, this would mean that only <em>yes</em>
  306. can be selected, and for numeric properties, zero would be forbidden.</p>
  307. <p>Also you can set <em>Minimum</em> and <em>Maximum</em> limits for every <em>property</em>, but those
  308. limits are only used when the data type is text (to constrain its length) or
  309. number. To skip this constraint, just set a maximum smaller than the minimum.</p>
  310. <p><em>Properties</em> always belong to a template, and as such, to a model.</p>
  311. <p><em>Properties</em> define the data type (text, number, yes/no…), and when the type
  312. is “Selection”, then you can define what <em>options</em> are available.</p>
  313. <p>I.e., the “Smart partners” <em>template</em> has the following <em>properties</em>:</p>
  314. <ul class="simple">
  315. <li>Name of his/her teacher</li>
  316. <li>Amount of people that hates him/her for being so smart</li>
  317. <li>Average note on all subjects</li>
  318. <li>Does he/she believe he/she is the smartest person on earth?</li>
  319. <li>What weaknesses does he/she have?</li>
  320. </ul>
  321. <p>When you set that template to any partner, you will then be able to fill these
  322. <em>properties</em> with <em>values</em>.</p>
  323. </div>
  324. <div class="section" id="categories">
  325. <h1>Categories</h1>
  326. <p><em>Properties</em> can also belong to a <em>category</em>, which allows you to sort them in
  327. a logical way, and makes further development easier.</p>
  328. <p>For example, the <tt class="docutils literal">website_sale_custom_info</tt> addon uses these to display a
  329. technical datasheet per product in your online shop, sorted and separated by
  330. category.</p>
  331. <p>You are not required to give a <em>category</em> to every <em>property</em>.</p>
  332. </div>
  333. <div class="section" id="options">
  334. <h1>Options</h1>
  335. <p>When a <em>property</em>’s type is “Selection”, then you define the <em>options</em>
  336. available, so the <em>value</em> must be one of these <em>options</em>.</p>
  337. <p>I.e., the “What weaknesses does he/she have?” <em>property</em> has some options:</p>
  338. <ul class="simple">
  339. <li>Loves junk food</li>
  340. <li>Needs videogames</li>
  341. <li>Huge glasses</li>
  342. </ul>
  343. <p>The <em>value</em> will always be one of these.</p>
  344. </div>
  345. <div class="section" id="value">
  346. <h1>Value</h1>
  347. <p>When you assign a <em>template</em> to a partner, and then you get the <em>properties</em> it
  348. should have, you still have to set a <em>value</em> for each property.</p>
  349. <p><em>Values</em> can be of different types (whole numbers, constrained selection,
  350. booleans…), depending on how the <em>property</em> was defined. However, there is
  351. always the <tt class="docutils literal">value</tt> field, that is a text string, and converts automatically
  352. to/from the correct type.</p>
  353. <div class="section" id="why-would-i-need-this">
  354. <h2>Why would I need this?</h2>
  355. <p>Imagine you have some partners that are foreign, and that for those partners
  356. you need some extra information that is not needed for others, and you do not
  357. want to fill the partners model with a lot of fields that will be empty most of
  358. the time.</p>
  359. <p>In this case, you could define a <em>template</em> called “Foreign partners”, which
  360. will be applied to <tt class="docutils literal">res.partner</tt> objects, and defines some <em>properties</em> that
  361. these are expected to have.</p>
  362. <p>Then you could assign that <em>template</em> to a partner, and automatically you will
  363. get a subtable of all the properties it should have, with tools to fill their
  364. <em>values</em> correctly.</p>
  365. </div>
  366. <div class="section" id="does-this-work-with-any-model">
  367. <h2>Does this work with any model?</h2>
  368. <p>Yes and no.</p>
  369. <p>Yes, because this is a base module that provides the tools to make this work
  370. with any model.</p>
  371. <p>No, because, although the tools are provided, they are only applied to the
  372. <tt class="docutils literal">res.partner</tt> model. This is by design, because different models can have
  373. different needs, and we don’t want to depend on every possible model.</p>
  374. <p>So, if you want to apply this to other models, you will have to develop a
  375. little additional addon that depends on this one. If you are a developer, refer
  376. to the <em>Development</em> section below.</p>
  377. <p><strong>Table of contents</strong></p>
  378. <div class="contents local topic" id="contents">
  379. <ul class="simple">
  380. <li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
  381. <li><a class="reference internal" href="#configuration" id="id2">Configuration</a></li>
  382. <li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
  383. <li><a class="reference internal" href="#development" id="id4">Development</a></li>
  384. <li><a class="reference internal" href="#known-issues-roadmap" id="id5">Known issues / Roadmap</a></li>
  385. <li><a class="reference internal" href="#bug-tracker" id="id6">Bug Tracker</a></li>
  386. <li><a class="reference internal" href="#credits" id="id7">Credits</a></li>
  387. </ul>
  388. </div>
  389. <div class="section" id="installation">
  390. <h3><a class="toc-backref" href="#id1">Installation</a></h3>
  391. <p>This module serves as a base for other modules that implement this behavior in
  392. concrete models.</p>
  393. <p>This module is a technical dependency and is to be installed in parallel to
  394. other modules.</p>
  395. </div>
  396. <div class="section" id="configuration">
  397. <h3><a class="toc-backref" href="#id2">Configuration</a></h3>
  398. <p>To enable the main <em>Custom Info</em> menu:</p>
  399. <ol class="arabic simple">
  400. <li>Enable <em>Settings &gt; General Settings &gt; Manage custom information</em>.</li>
  401. </ol>
  402. <p>To enable partner’s custom info tab:</p>
  403. <ol class="arabic simple">
  404. <li>Enable <em>Settings &gt; General Settings &gt; Edit custom information in partners</em>.</li>
  405. </ol>
  406. </div>
  407. <div class="section" id="usage">
  408. <h3><a class="toc-backref" href="#id3">Usage</a></h3>
  409. <p>This module defines <em>Custom Info Templates</em> that define what properties are
  410. expected for a given record.</p>
  411. <p>To define a template, you need to:</p>
  412. <ul class="simple">
  413. <li>Go to <em>Custom Info &gt; Templates</em>.</li>
  414. <li>Create one.</li>
  415. <li>Add some <em>Properties</em> to it.</li>
  416. </ul>
  417. <p>All database records with that template enabled will automatically fill those
  418. properties.</p>
  419. <p>To manage the properties, you need to:</p>
  420. <ul class="simple">
  421. <li>Go to <em>Custom Info &gt; Properties</em>.</li>
  422. </ul>
  423. <p>To manage the property categories, you need to:</p>
  424. <ul class="simple">
  425. <li>Go to <em>Custom Info &gt; Categories</em>.</li>
  426. </ul>
  427. <p>Some properties can have a number of options to choose, to manage them:</p>
  428. <ul class="simple">
  429. <li>Go to <em>Custom Info &gt; Options</em>.</li>
  430. </ul>
  431. <p>To manage their values, you need to:</p>
  432. <ul class="simple">
  433. <li>Go to <em>Custom Info &gt; Values</em>.</li>
  434. </ul>
  435. </div>
  436. <div class="section" id="development">
  437. <h3><a class="toc-backref" href="#id4">Development</a></h3>
  438. <p>To create a module that supports custom information, just depend on this module
  439. and inherit from the <tt class="docutils literal">custom.info</tt> model.</p>
  440. <p>See an example in the <tt class="docutils literal">product_custom_info</tt> addon.</p>
  441. </div>
  442. <div class="section" id="known-issues-roadmap">
  443. <h3><a class="toc-backref" href="#id5">Known issues / Roadmap</a></h3>
  444. <ul>
  445. <li><p class="first">Custom properties cannot be shared among templates.</p>
  446. </li>
  447. <li><p class="first">Required attributes are for now only set in the UI, not in the ORM itself.</p>
  448. </li>
  449. <li><p class="first">Support recursive templates using options</p>
  450. <div class="figure">
  451. <img alt="Customizations Everywhere" src="https://raw.githubusercontent.com/base_custom_info/static/description/customizations-everywhere.jpg" />
  452. </div>
  453. <p>If you assign an <em>additional template</em> to an option, and while using the owner
  454. form you choose that option, you can then press <em>reload custom information
  455. templates</em> to make the owner update itself to include all the properties in all
  456. the involved templates. If you do not press the button, anyway the reloading
  457. will be performed when saving the owner record.</p>
  458. <div class="figure">
  459. <img alt="Templateception" src="https://raw.githubusercontent.com/base_custom_info/static/description/templateception.jpg" />
  460. </div>
  461. <p>I.e., if you select the option “Needs videogames” for the property “What
  462. weaknesses does he/she have?” of a smart partner and press <em>reload custom
  463. information templates</em>, you will get 2 new properties to fill: “Favourite
  464. videogames genre” and “Favourite videogame”.</p>
  465. </li>
  466. </ul>
  467. </div>
  468. <div class="section" id="bug-tracker">
  469. <h3><a class="toc-backref" href="#id6">Bug Tracker</a></h3>
  470. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
  471. In case of trouble, please check there if your issue has already been reported.
  472. If you spotted it first, help us smashing it by providing a detailed and welcomed
  473. <a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20base_custom_info%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
  474. <p>Do not contact contributors directly about support or help with technical issues.</p>
  475. </div>
  476. <div class="section" id="credits">
  477. <h3><a class="toc-backref" href="#id7">Credits</a></h3>
  478. </div>
  479. </div>
  480. <div class="section" id="authors">
  481. <h2>Authors</h2>
  482. <ul class="simple">
  483. <li>Tecnativa</li>
  484. </ul>
  485. </div>
  486. <div class="section" id="contributors">
  487. <h2>Contributors</h2>
  488. <ul class="simple">
  489. <li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
  490. <li>Rafael Blasco &lt;<a class="reference external" href="mailto:rafael.blasco&#64;tecnativa.com">rafael.blasco&#64;tecnativa.com</a>&gt;</li>
  491. <li>Carlos Dauden &lt;<a class="reference external" href="mailto:carlos.dauden&#64;tecnativa.com">carlos.dauden&#64;tecnativa.com</a>&gt;</li>
  492. <li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
  493. <li>Jairo Llopis &lt;<a class="reference external" href="mailto:jairo.llopis&#64;tecnativa.com">jairo.llopis&#64;tecnativa.com</a>&gt;</li>
  494. <li>Pedro M. Baeza &lt;<a class="reference external" href="mailto:pedro.baeza&#64;tecnativa.com">pedro.baeza&#64;tecnativa.com</a>&gt;</li>
  495. <li>Alexandre Díaz &lt;<a class="reference external" href="mailto:alexandre.diaz&#64;tecnativa.com">alexandre.diaz&#64;tecnativa.com</a>&gt;</li>
  496. </ul>
  497. </li>
  498. </ul>
  499. </div>
  500. <div class="section" id="maintainers">
  501. <h2>Maintainers</h2>
  502. <p>This module is maintained by the OCA.</p>
  503. <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
  504. <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
  505. mission is to support the collaborative development of Odoo features and
  506. promote its widespread use.</p>
  507. <p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/base_custom_info">OCA/server-tools</a> project on GitHub.</p>
  508. <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
  509. </div>
  510. </div>
  511. </div>
  512. </body>
  513. </html>