Search 1.9 billion lines of Odoo code on GitHub

demo_config_settings

Author: My Company
License: no license
Branch: master
Repository: twtrubiks/odoo-demo-addons-tutorial
Dependencies: base, base_setup, and sale
Languages: Markdown (117, 56.8%), Python (39, 18.9%), and XML (50, 24.3%)
Other branches: 14.0

<h1>實作 config settings</h1> <p>建議觀看影片, 會更清楚:smile:</p> <ul> <li><p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_config_settings#%E8%AA%AA%E6%98%8E">實作 config settings</a> - <a href="https://youtu.be/5k_TYBNs_uc">Youtube Tutorial - odoo - 實作 config settings</a></p></li> <li><p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_config_settings#implied_group-%E7%94%A8%E6%B3%95%E8%AA%AA%E6%98%8E">implied_group 用法說明</a> - <a href="https://youtu.be/FCmRNUSkh10">Youtube Tutorial - odoo - implied_group 進階用法說明</a></p></li> </ul> <p>建議在閱讀這篇文章之前, 請先確保了解看過以下的文章 (因為都有連貫的關係)</p> <p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_odoo_tutorial">odoo 手把手建立第一個 addons</a></p> <p>有時候會需要對 addons 做一些參數的 settings,</p> <p>所以這篇主要介紹 odoo 中如何實現 config settings 的部份.</p> <h2>說明</h2> <p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_config_settings/models/models.py">models/models.py</a></p> <p>```python class ResConfigSettings(models.TransientModel): _inherit = &#39;res.config.settings&#39;</p> <pre><code>demo_prefix = fields.Char( string=&quot;Demo Prefix&quot;, # config_parameter=&#39;demo_config_settings.config.demo_prefix&#39;, ) def get_values(self): res = super(ResConfigSettings, self).get_values() demo_prefix = self.env[&quot;ir.config_parameter&quot;].get_param(&quot;demo_config_settings.config.demo_prefix&quot;, False) res.update({ &#39;demo_prefix&#39;: demo_prefix, }) return res def set_values(self): super(ResConfigSettings, self).set_values() self.env[&#39;ir.config_parameter&#39;].sudo().set_param(&#39;demo_config_settings.config.demo_prefix&#39;, self.demo_prefix) </code></pre> <p>```</p> <p>這邊是使用 TransientModel, 如果不知道這個是甚麼, 建議先了解之前的文章</p> <p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_odoo_tutorial_wizard">demo<em>odoo</em>tutorial_wizard</a> - TransientModel 範例.</p> <p>這邊的重點在需要實作 <code>set_values</code> 以及 <code>get_values</code>,</p> <p><code>set_values</code></p> <p>將 <code>demo_prefix</code> 設定到 <code>ir.config_parameter</code> model 的 <code>demo_config_settings.config.demo_prefix</code> (這個名稱可以自己自訂) 中.</p> <p><code>get_values</code></p> <p>從 <code>ir.config_parameter</code> model 的 param 找是否有 <code>demo_config_settings.config.demo_prefix</code>.</p> <p>如果你沒有特殊的邏輯要處理, 可以直接使用 <code>config_parameter=&#39;demo_config_settings.config.demo_prefix&#39;</code> 代替,</p> <p>也就是說 <code>set_values</code> <code>get_values</code> 可以使用 <code>config_parameter=...</code> 替代.</p> <p>views 的部份可參考 <a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_config_settings/views/view.xml">views/view.xml</a>.</p> <p>然後不需要 security 資料夾, 因為它是 TransientModel.</p> <p>裝好 addons, debug developer mode 請打開, 可參考 <a href="https://github.com/twtrubiks/odoo-docker-tutorial#odoo12-%E5%A6%82%E4%BD%95%E9%96%8B%E5%95%9F-odoo-developer-mode">odoo12 如何開啟 odoo developer mode</a>,</p> <p>Odoo Setup Demo 就是我們加上去的 (在這裡填入 hello123, 記得 Save)</p> <p><img src="https://i.imgur.com/b6HFz7O.png" alt="alt tag"></p> <p>然後到 Technical -&gt; Parameters -&gt; System Parameters</p> <p><img src="https://i.imgur.com/jNHjHhX.png" alt="alt tag"></p> <p>在這裡你會看到剛剛定義的 <code>demo_config_settings.config.demo_prefix</code> 為 hello123</p> <p><img src="https://i.imgur.com/QbJYLGo.png" alt="alt tag"></p> <p>這樣子就可以在程式需要取設定值時, 直接到 <code>ir.config_parameter</code> model 裡找:smile:</p> <h2>implied_group 用法說明</h2> <p><a href="https://youtu.be/FCmRNUSkh10">Youtube Tutorial - odoo - implied_group 用法說明</a></p> <p>這部份稍微比較進階一點,</p> <p>原始碼的路徑可參考 <code>odoo/addons/base/models/res_config.py</code></p> <p>```python ......</p> <p>class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin): &quot;&quot;&quot; Base configuration wizard for application settings. It provides support for setting default values, assigning groups to employee users, and installing modules. To make such a &#39;settings&#39; wizard, define a model like::</p> <pre><code> class MyConfigWizard(models.TransientModel): _name = &#39;my.settings&#39; _inherit = &#39;res.config.settings&#39; default_foo = fields.type(..., default_model=&#39;my.model&#39;), group_bar = fields.Boolean(..., group=&#39;base.group_user&#39;, implied_group=&#39;my.group&#39;), module_baz = fields.Boolean(...), config_qux = fields.Char(..., config_parameter=&#39;my.parameter&#39;) other_field = fields.type(...), </code></pre> <p>......</p> <p>```</p> <p><code>implied_group</code> 這個的功能主要是用來管理 user 擁有哪些 groups 的權限.</p> <p>( 其實他的概念和 <code>implied_ids</code> 是一樣的, 但這個用法更進階一點:smirk: )</p> <p>詳細說明請看下方的 demo,</p> <p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_config_settings/models/models.py">models/models.py</a></p> <p>```python class ResConfigSettings(models.TransientModel): _inherit = &#39;res.config.settings&#39;</p> <pre><code>...... group_demo_config_setting = fields.Boolean(&quot;Demo Config&quot;, group=&#39;base.group_user&#39;, # default # group=&#39;demo_config_settings.demo_config_settings_tutorial_group&#39;, implied_group=&#39;sale.group_delivery_invoice_address&#39;, ) ...... </code></pre> <p>```</p> <p><code>group=&#39;base.group_user&#39;</code> 為預設, 如果你不設定, 就是會預設這個值.</p> <p><code>implied_group=&#39;sale.group_delivery_invoice_address&#39;</code> 這邊使用內建的</p> <p><code>sale.group_delivery_invoice_address</code> 來當作範例.</p> <p><code>sale.group_delivery_invoice_address</code> 路徑在 <code>addons/sale/security/sale_security.xml</code></p> <p><code>xml &lt;record id=&quot;group_delivery_invoice_address&quot; model=&quot;res.groups&quot;&gt; &lt;field name=&quot;name&quot;&gt;Addresses in Sales Orders&lt;/field&gt; &lt;field name=&quot;category_id&quot; ref=&quot;base.module_category_hidden&quot;/&gt; &lt;/record&gt; </code></p> <p>當這個 field 為 True 的時候, 所有的 <code>group=&#39;base.group_user&#39;</code> 都會擁有</p> <p><code>sale.group_delivery_invoice_address</code> groups 的權限.</p> <p>(注意:exclamation::exclamation: field 命名一定要是 <code>group_xxx</code> )</p> <p>當設定為 True 時</p> <p><img src="https://i.imgur.com/gmfqIju.png" alt="alt tag"></p> <p>你會發現全部的 <code>group=&#39;base.group_user&#39;</code> 都擁有 <code>sale.group_delivery_invoice_address</code> groups 的權限.</p> <p><img src="https://i.imgur.com/yGTegQ6.png" alt="alt tag"></p> <p>上面註解的 <code>group=&#39;demo_config_settings.demo_config_settings_tutorial_group&#39;</code></p> <p>只針對 admin user, 也就是設定為 True 時, 只會對擁有 admin 的 user 生效.</p> <p>(請自行修改測試, 這邊就不打字了, 影片內說明, 因為大同小異:smile:)</p> <p>記得加入 <a href="security/security.xml">security/security.xml</a></p> <p><code>xml ...... &lt;record id=&quot;demo_config_settings_tutorial_group&quot; model=&quot;res.groups&quot;&gt; &lt;field name=&quot;name&quot;&gt;Config Settings User&lt;/field&gt; &lt;field name=&quot;category_id&quot; ref=&quot;base.module_category_hidden&quot;/&gt; &lt;field name=&quot;users&quot; eval=&quot;[(4, ref(&#39;base.user_root&#39;)), (4, ref(&#39;base.user_admin&#39;))]&quot;/&gt; &lt;/record&gt; ...... </code></p> <p><code>&lt;field name=&quot;category_id&quot; ref=&quot;base.module_category_hidden&quot;/&gt;</code></p> <p>這代表這個 groups 是被隱藏的.</p> <p>也就是不會出現在 user 設定 groups 的地方.</p>