Author: |
My Company |
License: |
no license |
Branch: |
master |
Repository: |
twtrubiks/odoo-demo-addons-tutorial |
Dependencies: |
base,
hr,
and
mail |
Languages: |
Markdown (155, 57.8%),
Python (39, 14.6%),
and
XML (74, 27.6%) |
Other branches: |
14.0 |
<h1>odoo 觀念 - activity</h1>
<p>建議觀看影片, 會更清楚:smile:</p>
<p><a href="">Youtube Tutorial - (等待新增)odoo 手把手教學 - activity</a></p>
<p>建議在閱讀這篇文章之前, 請先確保了解看過以下的文章 (因為都有連貫的關係)</p>
<p><a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_odoo_tutorial">odoo 手把手建立第一個 addons</a></p>
<p>本篇文章主要介紹 odoo 中的 activity 這部份</p>
<h2>說明</h2>
<p>在 odoo 中, 肯定會常常看到 activity, 也就是如下圖的地方</p>
<p><img src="https://i.imgur.com/AIlIG2b.png" alt="alt tag"></p>
<p>因為要先定義一個 activity 的 data, 所以先來看 <a href="data/mail_data.xml">data/mail_data.xml</a></p>
<p><code>xml
......
<data noupdate="0">
<record id="mail_act_approval" model="mail.activity.type">
<field name="name">Activity Approval</field>
<field name="icon">fa-dollar</field>
<field name="res_model_id" ref="demo_activity.model_demo_activity"/>
</record>
</data>
......
</code></p>
<p><code>name</code> 定義 activity 的名稱.</p>
<p><code>icon</code> 定義 icon.</p>
<p><code>res_model_id</code> 選擇對應的 model.</p>
<p>這個 activity 的 record 也可以在 odoo 中找到,</p>
<p>路徑為 Technical -> Email -> Activity Types</p>
<p><img src="https://i.imgur.com/K6mubdq.png" alt="alt tag"></p>
<p><img src="https://i.imgur.com/X98vjmh.png" alt="alt tag"></p>
<p>也可以進去修改相關的設定</p>
<p><img src="https://i.imgur.com/xxToZSP.png" alt="alt tag"></p>
<p>再來看 <a href="models/models.py">models/models.py</a></p>
<p>```python
......
class DemoActivity(models.Model):
_name = "demo.activity"
_description = "Demo Activity"
_inherit = ['mail.thread', 'mail.activity.mixin']</p>
<pre><code>name = fields.Char(string='name', required=True)
employee_id = fields.Many2one(
'hr.employee', string="Employee", required=True)
def button_activity_schedule(self):
self.activity_schedule(
'demo_activity.mail_act_approval',
user_id = self.sudo().employee_id.user_id.id,
note = 'my note',
summary = 'my summary')
def button_activity_feedback(self):
self.activity_feedback(
['demo_activity.mail_act_approval'])
def button_activity_unlink(self):
self.activity_unlink(
['demo_activity.mail_act_approval'])
</code></pre>
<p>```</p>
<p>注意 <code>_inherit = ['mail.thread', 'mail.activity.mixin']</code></p>
<p>這繼承是必須的哦, 不然你的 activity 是會失效的:smile:</p>
<p>這是所謂的 prototype inheritance,</p>
<p>可參考之前的文章以及影片 <a href="https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/master/demo_prototype_inheritance">demo<em>prototype</em>inheritance</a>.</p>
<p>最重要的就是這3個 function,</p>
<p>分別展示 <code>activity_schedule</code> <code>activity_feedback</code> <code>activity_unlink</code></p>
<p><code>activity_schedule</code></p>
<p>指定 activity_schedule 給特定的人</p>
<p><code>python
self.activity_schedule(
'demo_activity.mail_act_approval',
user_id = self.sudo().employee_id.user_id.id,
note = 'my note',
summary = 'my summary')
</code></p>
<p><code>demo_activity.mail_act_approval</code> 代表 activity id.</p>
<p><code>user_id</code> 代表 user.</p>
<p><code>note</code> 代表 note.</p>
<p><code>summary</code> 代表 summary.</p>
<p>當點選範例的 activity_schedule</p>
<p><img src="https://i.imgur.com/AD48O0S.png" alt="alt tag"></p>
<p>底下會顯示 activity</p>
<p><img src="https://i.imgur.com/1af8U1V.png" alt="alt tag"></p>
<p>狀態列也會顯示有一個 activity</p>
<p><img src="https://i.imgur.com/LYkQdkP.png" alt="alt tag"></p>
<p><code>activity_feedback</code></p>
<p>同意(done)這個 activity</p>
<p>當點選範例的 activity_feedback</p>
<p><img src="https://i.imgur.com/NXdAALh.png" alt="alt tag"></p>
<p>底下會顯示 activity 狀態</p>
<p><img src="https://i.imgur.com/OtNzxqC.png" alt="alt tag"></p>
<p><code>activity_unlink</code></p>
<p>取消 activity</p>
<p><img src="https://i.imgur.com/IEoHNhc.png" alt="alt tag"></p>
<p>這功能和直接點選 Cancel 是一樣的 ( activity 會消失 )</p>
<p><img src="https://i.imgur.com/ZzCNX4p.png" alt="alt tag"></p>
<p>也請記得設定 security</p>
<p><a href="security/ir.model.access.csv">security/ir.model.access.csv</a></p>
<p><a href="security/security.xml">security/security.xml</a></p>
<p>來看 <a href="views/view.xml">views/view.xml</a></p>
<p>```xml
......
<record id="view_activity_form" model="ir.ui.view">
<field name="name">demo.activity.form</field>
<field name="model">demo.activity</field>
<field eval="25" name="priority"/>
<field name="arch" type="xml">
<form string="Demo Activity">
<header>
<button name="button_activity_schedule" string="activity schedule" type="object" class="oe_highlight"/>
<button name="button_activity_unlink" string="activity unlink" type="object" class="oe_highlight"/>
<button name="button_activity_feedback" string="activity feedback" type="object" class="oe_highlight"/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="employee_id"/>
</group>
</sheet></p>
<pre><code> <div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
</code></pre>
<p>......
```</p>
<p><code><button name="button_activity_schedule" string="activity schedule" type="object" class="oe_highlight"/></code></p>
<p><code>name</code> 就是對應 model 中的 function 的名稱, 像這邊就是對應 <code>demo.activity</code> model 中的</p>
<p><code>button_activity_schedule</code> function.</p>
<p><code>string</code> 定義 button 的名稱.</p>
<p>最後的這段之前也說過了,</p>
<p><code>xml
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</code></p>
<p>就是顯示下面的那段</p>
<p><img src="https://i.imgur.com/7L9wkDx.png" alt="alt tag"></p>
<p>最後記得也要設定 <code>__manifest__.py</code> 哦:smile:</p>
<p>注意需要 depend <code>mail</code>:exclamation::exclamation:</p>
<p>```python
......
{
......
# any module necessary for this one to work correctly
'depends': ['base', 'mail', 'hr'],</p>
<pre><code># always loaded
'data': [
'security/security.xml',
'security/ir.model.access.csv',
'data/mail_data.xml',
'views/menu.xml',
'views/view.xml',
],
'application': True,
</code></pre>
<p>}
```</p>