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 = 'res.config.settings'</p>
<pre><code>demo_prefix = fields.Char(
string="Demo Prefix",
# config_parameter='demo_config_settings.config.demo_prefix',
)
def get_values(self):
res = super(ResConfigSettings, self).get_values()
demo_prefix = self.env["ir.config_parameter"].get_param("demo_config_settings.config.demo_prefix", False)
res.update({
'demo_prefix': demo_prefix,
})
return res
def set_values(self):
super(ResConfigSettings, self).set_values()
self.env['ir.config_parameter'].sudo().set_param('demo_config_settings.config.demo_prefix', 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='demo_config_settings.config.demo_prefix'</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 -> Parameters -> 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):
""" 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 'settings' wizard, define a model like::</p>
<pre><code> class MyConfigWizard(models.TransientModel):
_name = 'my.settings'
_inherit = 'res.config.settings'
default_foo = fields.type(..., default_model='my.model'),
group_bar = fields.Boolean(..., group='base.group_user', implied_group='my.group'),
module_baz = fields.Boolean(...),
config_qux = fields.Char(..., config_parameter='my.parameter')
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 = 'res.config.settings'</p>
<pre><code>......
group_demo_config_setting = fields.Boolean("Demo Config",
group='base.group_user', # default
# group='demo_config_settings.demo_config_settings_tutorial_group',
implied_group='sale.group_delivery_invoice_address',
)
......
</code></pre>
<p>```</p>
<p><code>group='base.group_user'</code> 為預設, 如果你不設定, 就是會預設這個值.</p>
<p><code>implied_group='sale.group_delivery_invoice_address'</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
<record id="group_delivery_invoice_address" model="res.groups">
<field name="name">Addresses in Sales Orders</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
</code></p>
<p>當這個 field 為 True 的時候, 所有的 <code>group='base.group_user'</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='base.group_user'</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='demo_config_settings.demo_config_settings_tutorial_group'</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
......
<record id="demo_config_settings_tutorial_group" model="res.groups">
<field name="name">Config Settings User</field>
<field name="category_id" ref="base.module_category_hidden"/>
<field name="users"
eval="[(4, ref('base.user_root')),
(4, ref('base.user_admin'))]"/>
</record>
......
</code></p>
<p><code><field name="category_id" ref="base.module_category_hidden"/></code></p>
<p>這代表這個 groups 是被隱藏的.</p>
<p>也就是不會出現在 user 設定 groups 的地方.</p>