翼度科技»论坛 编程开发 python 查看内容

odoo 开发入门教程系列-准备一些操作(Action)?

15

主题

15

帖子

45

积分

新手上路

Rank: 1

积分
45
准备一些操作(Action)?

到目前为止,我们主要通过声明字段和视图来构建模块。在任何真实的业务场景中,我们都希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中,我们希望能够:

  • 取消或将房产设置为已售出
  • 接受或拒绝报价
有人可能会说,我们已经可以通过手动更改状态来完成这些事情,但这并不太方便。此外,我们还想增加一些额外的处理:当报价被接受时,我们想设定房产的售价和买家。
操作类型(Action Type)

参考:本主题相关文档可参考ActionsError management
在我们的房地产模块中,我们希望将些业务逻辑和一些按钮关联,最常见的做法是:

  • 在视图中添加一个按钮,比如在视图header部分:
  1. <form>
  2.     <header>
  3.         <button name="action_do_something" type="object" string="Do Something"/>
  4.     </header>
  5.     <sheet>
  6.         <field name="name"/>
  7.     </sheet>
  8. </form>
复制代码

  • 将该按钮和业务逻辑关联:
  1. from odoo import fields, models
  2. class TestAction(models.Model):
  3.     _name = "test.action"
  4.     name = fields.Char()
  5.     def action_do_something(self):
  6.         for record in self:
  7.             record.name = "Something"
  8.         return True
复制代码
通过将type="object"分配给我们的按钮, Odoo框架将在给定模型上执行带有name="action_do_something"的Python方法。
需要注意的第一个重要细节是,我们的方法名没有前缀下划线(_)。这使我们的方法成为一个公共方法,可以直接通过Odoo接口调用(通过RPC调用)。到目前为止,我们创建的所有方法(compute、onchange)都是在内部调用的,因此我们使用了前缀为下划线的私有方法。除非需要从用户界面调用方法,否则应始终将方法定义为私有。
还要注意,我们对self循环。始终假设可以对多个记录调用同一个方法;这有利于重用性。
最后,公共方法应该始终返回一些东西,以便可以通过XML-RPC调用它。当有疑问时,只需return True即可。
Odoo源代码中有数百个示例。其中一个例子是 视图中的按钮 和其对应的Python方法
  1. <form  js_>
  2.     <header>
  3.         <button name="action_set_won_rainbowman" string="Mark Won"
  4.             type="object"
  5.             attrs="{'invisible': ['|','|', ('active','=',False), ('probability', '=', 100), ('type', '=', 'lead')]}"/>
  6.         ...略
复制代码
  1.     def action_set_won_rainbowman(self):
  2.         self.ensure_one()
  3.         self.action_set_won()
  4.         message = self._get_rainbowman_message()
  5.         if message:
  6.             return {
  7.                 'effect': {
  8.                     'fadeout': 'slow',
  9.                     'message': message,
  10.                     'img_url': '/web/image/%s/%s/image_1024' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image_1024 else '/web/static/src/img/smile.svg',
  11.                     'type': 'rainbow_man',
  12.                 }
  13.             }
  14.         return True
复制代码
练习1

添加 ‘Cancel’ 和‘Sold’ 按钮到 estate.property 模型。已取消的房产不能被设置为已出售,已出售的房产不能被取消。
预期效果动画:


提示:为了抛出错误,可以使用  UserError 函数。
修改odoo14\custom\estate\views\estate_property_views.xml中的estate_property_view_form视图
  1.             estate.property.form        estate.property<form>
  2.     <header>
  3.         <button name="action_do_something" type="object" string="Do Something"/>
  4.     </header>
  5.     <sheet>
  6.         <field name="name"/>
  7.     </sheet>
  8. </form><form>
  9.     <header>
  10.         <button name="action_do_something" type="object" string="Do Something"/>
  11.     </header>
  12.     <sheet>
  13.         <field name="name"/>
  14.     </sheet>
  15. </form><form>
  16.     <header>
  17.         <button name="action_do_something" type="object" string="Do Something"/>
  18.     </header>
  19.     <sheet>
  20.         <field name="name"/>
  21.     </sheet>
  22. </form><form>
  23.     <header>
  24.         <button name="action_do_something" type="object" string="Do Something"/>
  25.     </header>
  26.     <sheet>
  27.         <field name="name"/>
  28.     </sheet>
  29. </form><form>
  30.     <header>
  31.         <button name="action_do_something" type="object" string="Do Something"/>
  32.     </header>
  33.     <sheet>
  34.         <field name="name"/>
  35.     </sheet>
  36. </form>    [size=6]<form>
  37.     <header>
  38.         <button name="action_do_something" type="object" string="Do Something"/>
  39.     </header>
  40.     <sheet>
  41.         <field name="name"/>
  42.     </sheet>
  43. </form>            [/size]
  44. <form>
  45.     <header>
  46.         <button name="action_do_something" type="object" string="Do Something"/>
  47.     </header>
  48.     <sheet>
  49.         <field name="name"/>
  50.     </sheet>
  51. </form><form>
  52.     <header>
  53.         <button name="action_do_something" type="object" string="Do Something"/>
  54.     </header>
  55.     <sheet>
  56.         <field name="name"/>
  57.     </sheet>
  58. </form>
  59. <form>
  60.     <header>
  61.         <button name="action_do_something" type="object" string="Do Something"/>
  62.     </header>
  63.     <sheet>
  64.         <field name="name"/>
  65.     </sheet>
  66. </form><form>
  67.     <header>
  68.         <button name="action_do_something" type="object" string="Do Something"/>
  69.     </header>
  70.     <sheet>
  71.         <field name="name"/>
  72.     </sheet>
  73. </form><form>
  74.     <header>
  75.         <button name="action_do_something" type="object" string="Do Something"/>
  76.     </header>
  77.     <sheet>
  78.         <field name="name"/>
  79.     </sheet>
  80. </form><form>
  81.     <header>
  82.         <button name="action_do_something" type="object" string="Do Something"/>
  83.     </header>
  84.     <sheet>
  85.         <field name="name"/>
  86.     </sheet>
  87. </form><form>
  88.     <header>
  89.         <button name="action_do_something" type="object" string="Do Something"/>
  90.     </header>
  91.     <sheet>
  92.         <field name="name"/>
  93.     </sheet>
  94. </form><form>
  95.     <header>
  96.         <button name="action_do_something" type="object" string="Do Something"/>
  97.     </header>
  98.     <sheet>
  99.         <field name="name"/>
  100.     </sheet>
  101. </form><form>
  102.     <header>
  103.         <button name="action_do_something" type="object" string="Do Something"/>
  104.     </header>
  105.     <sheet>
  106.         <field name="name"/>
  107.     </sheet>
  108. </form><form>
  109.     <header>
  110.         <button name="action_do_something" type="object" string="Do Something"/>
  111.     </header>
  112.     <sheet>
  113.         <field name="name"/>
  114.     </sheet>
  115. </form><form>
  116.     <header>
  117.         <button name="action_do_something" type="object" string="Do Something"/>
  118.     </header>
  119.     <sheet>
  120.         <field name="name"/>
  121.     </sheet>
  122. </form><form>
  123.     <header>
  124.         <button name="action_do_something" type="object" string="Do Something"/>
  125.     </header>
  126.     <sheet>
  127.         <field name="name"/>
  128.     </sheet>
  129. </form><form>
  130.     <header>
  131.         <button name="action_do_something" type="object" string="Do Something"/>
  132.     </header>
  133.     <sheet>
  134.         <field name="name"/>
  135.     </sheet>
  136. </form><form>
  137.     <header>
  138.         <button name="action_do_something" type="object" string="Do Something"/>
  139.     </header>
  140.     <sheet>
  141.         <field name="name"/>
  142.     </sheet>
  143. </form><form>
  144.     <header>
  145.         <button name="action_do_something" type="object" string="Do Something"/>
  146.     </header>
  147.     <sheet>
  148.         <field name="name"/>
  149.     </sheet>
  150. </form><form>
  151.     <header>
  152.         <button name="action_do_something" type="object" string="Do Something"/>
  153.     </header>
  154.     <sheet>
  155.         <field name="name"/>
  156.     </sheet>
  157. </form><form>
  158.     <header>
  159.         <button name="action_do_something" type="object" string="Do Something"/>
  160.     </header>
  161.     <sheet>
  162.         <field name="name"/>
  163.     </sheet>
  164. </form><form>
  165.     <header>
  166.         <button name="action_do_something" type="object" string="Do Something"/>
  167.     </header>
  168.     <sheet>
  169.         <field name="name"/>
  170.     </sheet>
  171. </form><form>
  172.     <header>
  173.         <button name="action_do_something" type="object" string="Do Something"/>
  174.     </header>
  175.     <sheet>
  176.         <field name="name"/>
  177.     </sheet>
  178. </form><form>
  179.     <header>
  180.         <button name="action_do_something" type="object" string="Do Something"/>
  181.     </header>
  182.     <sheet>
  183.         <field name="name"/>
  184.     </sheet>
  185. </form><form>
  186.     <header>
  187.         <button name="action_do_something" type="object" string="Do Something"/>
  188.     </header>
  189.     <sheet>
  190.         <field name="name"/>
  191.     </sheet>
  192. </form><form>
  193.     <header>
  194.         <button name="action_do_something" type="object" string="Do Something"/>
  195.     </header>
  196.     <sheet>
  197.         <field name="name"/>
  198.     </sheet>
  199. </form><form>
  200.     <header>
  201.         <button name="action_do_something" type="object" string="Do Something"/>
  202.     </header>
  203.     <sheet>
  204.         <field name="name"/>
  205.     </sheet>
  206. </form><form>
  207.     <header>
  208.         <button name="action_do_something" type="object" string="Do Something"/>
  209.     </header>
  210.     <sheet>
  211.         <field name="name"/>
  212.     </sheet>
  213. </form><form>
  214.     <header>
  215.         <button name="action_do_something" type="object" string="Do Something"/>
  216.     </header>
  217.     <sheet>
  218.         <field name="name"/>
  219.     </sheet>
  220. </form><form>
  221.     <header>
  222.         <button name="action_do_something" type="object" string="Do Something"/>
  223.     </header>
  224.     <sheet>
  225.         <field name="name"/>
  226.     </sheet>
  227. </form><form>
  228.     <header>
  229.         <button name="action_do_something" type="object" string="Do Something"/>
  230.     </header>
  231.     <sheet>
  232.         <field name="name"/>
  233.     </sheet>
  234. </form><form>
  235.     <header>
  236.         <button name="action_do_something" type="object" string="Do Something"/>
  237.     </header>
  238.     <sheet>
  239.         <field name="name"/>
  240.     </sheet>
  241. </form><form>
  242.     <header>
  243.         <button name="action_do_something" type="object" string="Do Something"/>
  244.     </header>
  245.     <sheet>
  246.         <field name="name"/>
  247.     </sheet>
  248. </form><form>
  249.     <header>
  250.         <button name="action_do_something" type="object" string="Do Something"/>
  251.     </header>
  252.     <sheet>
  253.         <field name="name"/>
  254.     </sheet>
  255. </form><form>
  256.     <header>
  257.         <button name="action_do_something" type="object" string="Do Something"/>
  258.     </header>
  259.     <sheet>
  260.         <field name="name"/>
  261.     </sheet>
  262. </form><form>
  263.     <header>
  264.         <button name="action_do_something" type="object" string="Do Something"/>
  265.     </header>
  266.     <sheet>
  267.         <field name="name"/>
  268.     </sheet>
  269. </form><form>
  270.     <header>
  271.         <button name="action_do_something" type="object" string="Do Something"/>
  272.     </header>
  273.     <sheet>
  274.         <field name="name"/>
  275.     </sheet>
  276. </form><form>
  277.     <header>
  278.         <button name="action_do_something" type="object" string="Do Something"/>
  279.     </header>
  280.     <sheet>
  281.         <field name="name"/>
  282.     </sheet>
  283. </form><form>
  284.     <header>
  285.         <button name="action_do_something" type="object" string="Do Something"/>
  286.     </header>
  287.     <sheet>
  288.         <field name="name"/>
  289.     </sheet>
  290. </form>                    
复制代码
修改odoo14\custom\estate\models\estate_property.py
开头增加导入UserError
  1. from odoo.exceptions import UserError
复制代码
末尾新增以下代码
  1.     def set_property_canceled(self):
  2.         if self.state == 'Sold':
  3.             raise UserError('不能取消已出售房产')
  4.         else:
  5.             self.state = 'Canceled'
  6.         return True
  7.     def set_property_sold(self):
  8.         if self.state == 'Canceled':
  9.             raise UserError('不能出售已取消房产')
  10.         else:
  11.             self.state = 'Sold'
  12.         return True
复制代码
重启服务,浏览器中验证
练习2

添加‘Accept’ 和‘Refuse’ 到estate.property.offer 模型。
预期效果动画:


提示: 把图标当按钮用,请查看这个例子
  1. [/code]修改odoo14\custom\estate\views\estate_property_offer_views.xml 中estate_property_offer_view_tree
  2. [code]            estate.property.offer.tree        estate.property.offer<form>
  3.     <header>
  4.         <button name="action_do_something" type="object" string="Do Something"/>
  5.     </header>
  6.     <sheet>
  7.         <field name="name"/>
  8.     </sheet>
  9. </form><form>
  10.     <header>
  11.         <button name="action_do_something" type="object" string="Do Something"/>
  12.     </header>
  13.     <sheet>
  14.         <field name="name"/>
  15.     </sheet>
  16. </form><form>
  17.     <header>
  18.         <button name="action_do_something" type="object" string="Do Something"/>
  19.     </header>
  20.     <sheet>
  21.         <field name="name"/>
  22.     </sheet>
  23. </form><form>
  24.     <header>
  25.         <button name="action_do_something" type="object" string="Do Something"/>
  26.     </header>
  27.     <sheet>
  28.         <field name="name"/>
  29.     </sheet>
  30. </form><form>
  31.     <header>
  32.         <button name="action_do_something" type="object" string="Do Something"/>
  33.     </header>
  34.     <sheet>
  35.         <field name="name"/>
  36.     </sheet>
  37. </form>            
复制代码
修改odoo14\custom\estate\models\estate_property_offer.py,最末尾添加以下代码
  1.     def action_accept_offer(self):
  2.         self.status = 'Accepted'
  3.         self.property_id.state = 'Offer Accepted'
  4.         return True
  5.     def action_refuse_offer(self):
  6.         self.status = 'Refused'
  7.         return True
复制代码
重启服务,浏览器中验证

练习3

当报价被接受时,设定相应房产的买家和售价。
预期效果动画:

注意:在现实生活中,给定房产只能接受一个报价!
修改odoo14\custom\estate\models\estate_property_offer.py,action_accept_offer函数如下
  1.     def action_accept_offer(self):
  2.         self.status = 'Accepted'
  3.         self.property_id.state = 'Offer Accepted'
  4.         self.property_id.selling_price = 260000
  5.         self.property_id.buyer_id = self.partner_id
  6.         return True
复制代码
重启服务,浏览器中验证
对象类型(Object Type)

“一些用户界面”章节中,我们创建了连接到菜单的操作。你可能好奇,是否可以连接操作到按钮。好消息,的确可以,其中一种实现方式如下:
[code][/code]我们使用 type="action" 且在name中引用外部标识

来源:https://www.cnblogs.com/shouke/p/17253371.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具