Day 0x1A odoo addons 永丰金流开发(Part 2 - model, view, security)

*** 请先建立资料夹 payment_sinopac,以下路径以 "/" 来代表此资料夹 ***

0x1 addons 基本需要的 __manifest__

__manifest__ 主要是跟odoo 沟通说这个模组的需求(depends)、介绍,以及资料设定(data)

/__manifest__.py

# -*- coding: utf-8 -*-
{
    "name": """永丰金流""",
    "summary": """13th IT铁人赛""",
    "category": "payment",
    "images": ['static/description/icon.png'],
    "version": "14.00",
    "description": """
        永丰金流 消费支付模组
    """,

    "author": "大河",
    "website": "https://mikuroda4402.github.io",
    'depends': ['web', 'website_sale'],
    "external_dependencies": {
        "python": ['pycryptodome'],
        "bin": []
    },
    "data": [
        'security/payment_sinopac_access_rule.xml',
        'security/ir.model.access.csv',
        'views/payment_order_views.xml',
    ],
    'installable': True,
    "application": False,
}

0x2 __init__

这里跟建立 package 一样,
不管是否有python档案要被探索,
这个一定要建立(应该吧),因为今天会把 models 的部分建立出来,
所以这里先拓展探索

/__init__.py

# coding: utf-8
from . import models

0x3 models

odoo 的 addons 是 MVC 架构,model 就是代表 table 栏位,
很有趣的是在 odoo 里要开栏位不用 Migrate 直接在里面宣告即可
所以我们先建立 /models/order_sinopac.py

# -*- coding: utf-8 -*-

from odoo import models, fields, api


class OrderSinopac(models.Model):
    _name = 'order.sinopac'
    _rec_name = 'order_no'

    order_no = fields.Char(string='订单编号')
    prdt_name = fields.Char(string='商品名称')
    ts_no = fields.Char(string='丰收款交易编号')
    ts_date = fields.Datetime(string='交易时间')
    approved_date = fields.Datetime(string='授权时间')
    pay_date = fields.Datetime(string='付款/请款时间')
    amount = fields.Float(string='订单金额', digits=(10, 2))
    status = fields.Char(string='处理状态')
    description = fields.Char(string='处理讯息')
    pay_status = fields.Char(string='订单付款状态')
    pay_type = fields.Selection(
        string='收款方式',
        selection=[('A', 'ATM转帐'), ('C', '信用卡')]
    )
    expire_date = fields.Datetime(string='付款截止日期')
    refund_flag = fields.Char(string='退款注记')
    refund_status = fields.Datetime(string='退款状态')
    refund_date = fields.Date(string='申请退款日期')

    # ATM Param
    atm_pay_no = fields.Char(string='转帐目的虚拟帐号')
    web_atm_url = fields.Char(string='ATM 线上转帐网址')
    otp_url = fields.Char(string='简讯动态密码付款网址')
    back_no = fields.Char(string='金融机构代码')
    acc_no = fields.Char(string='转帐帐号')

    # Card Param
    auto_billing = fields.Boolean(string='信用卡自动请款', default=True)
    exp_billing_days = fields.Integer(string='预计自动请款天数')
    exp_minutes = fields.Integer(string='信用卡付款廉洁有效时间(分钟)')
    pay_type_sub = fields.Char(string='信用卡付款子项目')
    card_pay_url = fields.Char(string='信用卡付款网址')
    staging_first_amount = fields.Float(string='分期付款首期金额', digits=(10, 2))
    staging_each_amount = fields.Float(string='分期付款每期金额', digits=(10, 2))
    bonus_count = fields.Integer(string='红利折抵点数')
    bonus_amount = fields.Float(string='红利折抵金额', digits=(10, 2))
    bonus_pay_amount = fields.Float(string='红利折抵实付金额', digits=(10, 2))
    bonus_last_count = fields.Integer(string='红利折抵剩余点数')
    left_cc_no = fields.Char(string='授权卡後前6码')
    right_cc_no = fields.Char(string='授权卡後後4码')
    auth_code = fields.Char(string='授权码')
    cc_exp_date = fields.Char(string='卡号有效期限')
    cc_token = fields.Char(string='快速付款 Token')
    order_id = fields.Many2one('sale.order', string='销售订单')

是不是忘了什麽?
models 资料夹被探索了,但没有探索到刚刚的 py 对吧
所以一样在 models 建立 __init__.py
/models/__init__.py

# coding: utf-8
from . import order_sinopac

0x4 views

有 model 当然要有 view (废话),而 odoo 写 view 所使用的结构是 xml
在模组资料夹里建立 /views

这里不需要建立 __init__.py,因为这里并没有要建立 .py

建立一个 view,位置为 /views/payment_order_views.xml

  • 简单解释一下,这里 view有三个部分
    1. 第一个 record 为 视图,有没有看到关键字 tree,这视清单要呈现的部分
    2. 第二个 record 为 动作,跟 odoo 通知说,这个 res_model 有哪些视图可被使用(若该对应视图不存在则会跑系统预设)
    3. 第三个 menuitem,就是把动作挂到选单上,让使用者可以点击,点击後就会载入动作对应的视图
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="order_sinopac_tree" model="ir.ui.view">
        <field name="name">永丰金流订单列表</field>
        <field name="model">order.sinopac</field>
        <field name="arch" type="xml">
            <tree>
                <field name="order_no"/>
                <field name="prdt_name"/>
                <field name="ts_no"/>
                <field name="ts_date"/>
                <field name="amount"/>
                <field name="status"/>
                <field name="description"/>
                <field name="pay_status"/>
            </tree>
        </field>
    </record>

    <record id="action_menuitem_order_sinopac" model="ir.actions.act_window">
        <field name="name">永丰金流订单</field>
        <field name="res_model">order.sinopac</field>
        <field name="view_mode">tree,form</field>
    </record>

    <menuitem id="menuitem_order_sinopac" name="永丰金流订单"
              action="action_menuitem_order_sinopac"    
              parent="account.root_payment_menu"
              groups="base.group_user"
              sequence="5"/>

</odoo>

0x5 Not Done yet! 我们还有 security

自从 odoo 13版开始,没有设定对於model的存取权限时,
就算view 写好了、用管理员登入也看不到我们写的画面跟选单,
当然还是有无视权限的功能,但我只用过一次,早就忘了 :p
但还是推荐各位不要无视权限,不然要上线的时候会除错除到怀疑人生
回到主题,一样在模组里建立 security 资料夹
并在里面建立一个档案 ir.model.access.csv (请注意,要命名一模一样,不然odoo不会理你)
/security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
payment_sinopac_admin,model_admin_access,model_order_sinopac,payment_sinopac.group_manager,1,1,1,1
payment_sinopac_user,model_user_access,model_order_sinopac,base.group_user,1,0,0,0

还没完成,我们在csv有宣告一个权限组 group_manager
我们同样在这个资料夹建立另一个档案 payment_sinopac_access_rule.xml
/security/payment_sinopac_access_rule.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
  <data noupdate="0">
    <record model="ir.module.category" id="access_management">
        <field name="name">永丰金流存取权限</field>
        <field name="sequence">5</field>
    </record>

    <record id="group_manager" model="res.groups">
        <field name="name">管理者</field>
        <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
        <field name="category_id" ref="payment_sinopac.access_management"/>
    </record>
  </data>
</odoo>

0x6 执行odoo 并安装模组

安装完成後会在会计的设定选单里,有个永丰金流订单
https://ithelp.ithome.com.tw/upload/images/20211006/20141805uWS0KRMQdq.png

点选进去後就会看到我们刚刚建立的tree view
https://ithelp.ithome.com.tw/upload/images/20211006/20141805ywn5ZahDr7.png

0x7 今日结语

今天快速地跑过一次流程,很多细节没有细讲,若有任何问题或错误欢迎提出或指正
明天会把目前写的永丰金流sdk放上来


<<:  【Day21】隐写技术 Steganography

>>:  台上三分钟,台下十年工

#22 No-code 之旅 — 静态网站可以部署到哪里?~

大家~ 今天文章会特别短Q 来讲一下静态网站可以部署到哪里呢?大家应该常听到 Github Page...

[Day19] - Django-REST-Framework Viewsets 介绍

在第一个 API 中我们编写的 View,不知道大家有没有觉得非常简洁呢,好像没有写什麽代码,但是就...

[Day 21] 妈! Keras 和 TensorFlow 在乱存模型啦! ( TFLite 轻量模型)

前言 受惠於深度学习框架的多元性,开发者可以选自己喜欢的框架, 像是: Theano、Caffe、O...

D30 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股申购功能扩充,算出价差 }

这是第三十天!!! 到目前为止的范例程序码就在这个 repo https://github.com/...

[今晚我想来点 Express 佐 MVC 分层架构] DAY 27 - 用 Webpack 打包 Express

Webpack 是什麽? 图片来源 Webpack 是一个打包工具,经常用於前端领域,能够将各个依赖...