• odoo之技巧合集一


    罗列一些odoo开发中的简单但有效的方法;

    1.重写odoo登录代码

    参考链接:odoo10-重写登录方法

    from odoo import models, fields, api, SUPERUSER_ID
    
    class Users(models.Model):
        _inherit = "res.users"
        @classmethod
        def _login(cls, db, login, password):
            user_id = super(Users, cls)._login(db, login, password)
    
            """自定义代码部分开始"""
            data = {
                'user': user_id,
                'message': u"用户登录了系统"
            }
            with cls.pool.cursor() as cr:
                self = api.Environment(cr, SUPERUSER_ID, {})[cls._name]
                self.env['system_log.login_log'].sudo().create(data)
            """自定义代码部分结束"""
    
            return user_id

    2.使用jinja2在odoo中返回自定义的html页面

    返回一个login.html页面

    def get_env(self):
        if hasattr(sys, 'frozen'):
            # When running on compiled windows binary, we don't have access to package loader.
            path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'views'))
            loader = jinja2.FileSystemLoader(path)
        else:
            loader = jinja2.PackageLoader('odoo.addons.module_name', "views")
        env = jinja2.Environment(loader=loader, autoescape=True)
        return env
    
    env = self.get_env()
    return env.get_template('login.html').render({"request": request, "errmsg": ""})

    3.在controller中操作别的/指定数据库的数据

    在odoo.register()中指定数据库

    import odoo
    import odoo.modules.registry
    
    registry = odoo.registry(request.session.db)
    with registry.cursor() as cr:
        env = api.Environment(cr, SUPERUSER_ID, {})
        rec = env["res.users"].search([('login', '=', request.params['login'])])

    4.自定义记录表示标题_rec_name

    记录显示标题可采用一个魔法计算字段display_name,odoo会⾃动添加它到所有模型 中。它的值由name_get() 模型⽅法⽣成,name_get()的默认实现使⽤_rec_name属性来查找放置数据的字段,使⽤它⽣成显示名称。 如果你想要⾃⼰实现显示名称,可以重载name_get()中的逻辑来⽣成⼀个⾃定义显示名称。 该⽅法应返回⼀个包含两个元素的列表,格式:[(id,  unicode_str)]。

    例如:

    class LibraryBook(models.Model):
        _name = "library.book"
        _rec_name = "short_name"
    
        name = fields.Char(string="Title", required=True)
        short_name = fields.Char(string="Short Name", required=True)
        date_release = fields.Date(string="Release Date")
    
        def name_get(self):
            result = []
            for rec in self:
                rec_name = "{}_{}".format(rec.name, rec.date_release)
                data = (rec.id, rec_name)
                result.append(data)
            return result

    5.模型父子级索引优化

    我们启动了对于等级的特别⽀持。这是⼀个⾮常有⽤的⾼读取低写⼊指令,因为 它通过更⼤的写⼊运算开销带来了更快速的数据浏览。这通过添加⼀个帮助字段parent_path 及设置模型属性为 _parent_store=True来实现。在启⽤了这个属性之后,该帮助字段会⽤于 在等级树的搜索中存储数据。默认,它假定记录的⽗级字段名为parent_id,但也可以使⽤不 同的名称。这种情况下,正确的字段名应使⽤额外的模型属性_parent_name来进⾏表明。

    class BookCategory(models.Model):
        _name = "library.book.category"
        # 添加如下代码启动特别的等级支持
        _parent_store = True
        _parent_name = "parent_id"
        parent_path = fields.Char(index=True)
    
        name = fields.Char(string="Category")
        parent_id = fields.Many2one("library.book.category", string="Parent Category", ondelete="restrict", index=True)
        child_ids = fields.One2many("library.book.category", "parent_id", string="child Category")

    详情可以查看anlan hou的 odoo12开发者指南第五章-应用模型;

    6.计算字段的可编辑和可搜索

    计算字段是在 运⾏时动态计算的,并且除⾮你⾃⼰特别的添加⽀持,否则它们是不可写、不可搜索的。 计算字段在运⾏时动态计算,但ORM使⽤缓存来避免在每次访问值时的低效重计算。
    因此, 它需要知道所依赖的其它字段。它使⽤@depends装饰器来监测缓存值何时应置为⽆效并重 新计算。

    确保compute函数总是为计算字段设置⼀个值。否则会抛出错误。这在代码中包含if条件⽽ 对计算字段设置值失败时会发⽣。那样会很难进⾏调试。

    准备

    date_release = fields.Date(string="Release Date")
    # 计算字段,及让计算字段可编辑和可搜索
    age_days = fields.Float(string="Days Since Release", compute="_compute_age", inverse="_inverse_age",
                            search="_search_age", store=False, compute_sudo=False)
    
    # 值计算逻辑的方法
    @api.depends("date_release")
    def _compute_age(self):
        today = fields.Date.today()
        for book in self.filtered("date_release"):  # 筛选有 date_release 的书籍
            delta = today - book.date_release
            book.age_days = delta.days

    计算字段逆向编辑

    写操作可通过实现inverse函数来添加。这使⽤分配给计算字段的值来更新原字段。
    # 添加方法及实现客入计算字段的逻辑
    def _inverse_age(self):
        today = fields.Date.today()
        for book in self.filtered("date_release"):  # 筛选有 date_release 的书籍
            d = today - timedelta(days=book.age_days)
            book.date_release = d

    计算字段可搜素

    可以通过将search属性设置为⽅法名(类似compute和inverse)来让⾮存储的计算字段可 搜索。这个⽅法预期不实现实际的搜索。⽽是接收⽤于搜索该字段的运算符和值来作为参 数,并预期返回⼀个带有⽤于替换搜索条件的域。

    # 实现允许你在计算字段中进行搜索的逻辑;将对计算字段 age_days 的搜索转换为对 age_days 依赖的 date_release 字段的搜索
    def _search_age(self, operator, value):  # =, 7
        today = fields.Date.today()  # 2021,1,18
        value_days = timedelta(days=value)
        value_date = today - value_days
        operator_map = {
            '>': '<', '>=': '<=',
            '<': '>', '<=': '>=',
        }
        new_op = operator_map.get(operator, operator) # =
        res = [('date_release', new_op, value_date)]  # [('date_release', '=', datetime.date(2021, 1, 11))]
        return res

    7.使用mail模块记录字段改变

    在__manifest__.py中继承 mail 模块

    'depends': ['base', 'mail'],

    在需要记录的模型中继承mail的相关模型

    _inherit = ['mail.thread', 'mail.activity.mixin']

    在需要记录的字段后面添加追踪属性 track_visibility

    title = fields.Char(string="标题", required=True, readonly=True, states={'draft': [('readonly', False)]}, track_visibility="onchange")

    在模型的form视图上添加记录的字段

    <sheet>
    ...
    </sheet>
    <div class="oe_chatter">
        <field name="message_ids" widget="mail_thread"/>
    </div>

    8.用户自定义引用的模型及记录(使用引用字段添加动态关联)

    在n2n中,我们可以固定提供用户选用的某条记录 ,比如用户要选择书籍中的红楼梦那条记录。但是有时候这不足以满足我们的需求,此时,我们可以让用户自己选择想要关联的模型及记录。我们通过引用字段来实现。

    @api.model  # 在模型级别而不是记录集级别上进行操作
    def _referencable_models(self):
        models = self.env['ir.model'].search([])
        return [(x.model, x.name) for x in models]
    
    ref_doc_id = fields.Reference(selection='_referencable_models', string="Reference Document")

    9.使用可配置精度的浮点字段

    odoo自带Decimal Precision configuration模块插件提供了这一功能。

    步骤:安装模块,在配置中添加Usage,然后在模型字段中使用它。

    1.搜索Decimal应用,点击安装;

    2.激活开发者模式;进入设置--技术--数据库结构--小数准确性;创建一条记录,设置Usage为Book Price并选择数字精度,例如:

    用途:Book Price
    数字:3  # 表示小数位

    3.在__manifest__.py声明文件中添加这个新依赖。如下:

    "depends": ['base', 'decimal_precision'],  # 该模块所直接依赖的模块技术名称列表 # 第二个为可配置浮点数精度模块

    4.使用数字精度设置添加模型字段

    from addons import decimal_precision as dp
    cost_price = fields.Float(string="Book Cost", digits=dp.get_precision('Book Price'))

    显示结果:

    Book Cost:99.000

    运行原理:

    get_precision()函数查找数字精度中的Usage字段并返回一个16位精度的元组以及在配置中所定义的小数位数。

    10.odoo添加默认筛选

    filter xml中

    <record id="view_account_payment_search" model="ir.ui.view">
        <field name="name">account.payment.search</field>
        <field name="model">account.payment</field>
        <field name="arch" type="xml">
            <search string="Payments">
                <filter string="Customer Payments" name="inbound_filter" domain="[('partner_type', '=', 'customer')]"/>
            </search>
        </field>
    </record>

    act_window 中

    <record id="action_account_payments" model="ir.actions.act_window">
        <field name="name">Payments</field>
        <field name="res_model">account.payment</field>
        <field name="view_mode">tree,kanban,form,graph</field>
        <field name="context">{
            'default_payment_type': 'inbound',
            'default_partner_type': 'customer',
            'search_default_inbound_filter': 1,
            'res_partner_search_mode': 'customer',
        }</field>
        <field name="view_id" ref="view_account_payment_tree"/>
        <field name="help" type="html">
            <p class="o_view_nocontent_smiling_face">
              Register a payment
            </p><p>
              Payments are used to register liquidity movements. You can process those payments by your own means or by using installed facilities.
            </p>
        </field>
    </record>

    待。。。

     

  • 相关阅读:
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    JAVA面向对象详细总结
    父愁者联盟--需求规格说明书
    案例分析
    软件工程编程作业1
    构建之法观后提问
    第一次随笔——准备工作
  • 原文地址:https://www.cnblogs.com/yifchan/p/14095053.html
Copyright © 2020-2023  润新知