odoo16 创建wizard临时窗口

wizard临时窗口一般都是使用按钮触发。
以下是一个基本示例,说明如何在 Odoo 中实现这个临时对话框:
在这里插入图片描述

  1. 创建 wizard 模型

    from odoo import models, fields, api
    
    class LightColorWizard(models.TransientModel):
        _name = 'light.color.wizard'
        _description = 'Light Color Wizard'
    
        color = fields.Selection([
            ('white', '白'),
            ('blue', '蓝'),
            ('green', '绿'),
            ('red', '红'),
            ('cyan', '青'),
            ('yellow', '黄'),
            ('purple', '紫'),
        ], string='选择颜色', required=True)
    
        def confirm_color(self):
            # 处理用户选择的颜色
            # 在这里添加你的逻辑,例如调用相关方法
            pass
    
  2. 创建视图

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <record id="view_light_color_wizard" model="ir.ui.view">
        <field name="name">light.color.wizard.form</field>
        <field name="model">light.color.wizard</field>
        <field name="arch" type="xml">
            <form string="选择亮灯颜色">
                <group>
                    <field name="color"/>
                </group>
                <footer>
                    <button string="确认" type="object" name="confirm_color" class="btn-primary"/>
                    <button string="取消" class="btn-secondary" special="cancel"/>
                </footer>
            </form>
        </field>
    </record>
</odoo>
  1. 在你的模型中添加按钮

    class YourModel(models.Model):
        _name = 'your.model'
    
        def open_light_color_wizard(self):
            return {
                'name': '选择亮灯颜色',
                'type': 'ir.actions.act_window',
                'res_model': 'light.color.wizard',
                'view_mode': 'form',
                'target': 'new',
            }
    
  2. 在视图中添加按钮

    <button string="选择亮灯" type="object" name="open_light_color_wizard" class="btn-primary"/>
    

这样,点击“选择亮灯”按钮时,就会弹出一个对话框,用户可以选择亮灯颜色并进行确认。你可以在 confirm_color 方法中处理用户选择的颜色。

目录结构

wizards\
    __init__.py
    light_color_wizard.xml
    models.py

最后别忘了,注册wizard视图文件,__init__.py中导入wizard模型,并且在ir.model.access.csv文件添加wizard模型的权限配置。

<think>我们正在处理用户关于在Odoo14中实现批量打包并下载附件功能的问题。根据用户提供的引用,我们可以总结如下:引用[1]介绍了安装第三方模块的方法,但用户需要的是功能实现,而不是安装模块。引用[2]展示了一个前端批量下载附件的模块实现示例,其中通过自定义JavaScript代码,在列表视图的按钮点击事件中获取选中的记录ID和模型名称,然后调用下载函数。引用[3]描述了一个附件批量下载模块的实现原理:通过多选记录触发一个客户端动作,弹出一个表单,然后执行下载函数。该函数获取选中记录的附件,进行打包压缩,然后通过创建压缩包的附件记录并返回其下载URL来实现下载。引用[4]展示了在表单视图上添加一个按钮来查看附件。用户需求:在Odoo14中实现批量打包并下载附件的功能。我们可以参考引用[3]的实现原理,设计一个自定义模块。主要步骤包括:1.在模型(如ir.attachment)上创建一个方法,用于根据提供的附件ID列表打包并返回压缩文件的附件记录ID。2.创建一个客户端动作(clientaction),当用户在多选记录后点击按钮时触发,该动作会弹出一个向导表单(或直接执行下载,但考虑到打包可能需要时间,通常采用向导形式)。3.在向导表单中,用户可以选择打包选项(如果有的话),然后点击下载按钮,触发打包下载操作。4.在向导的下载按钮事件中,调用后台的打包方法,获取生成的压缩包附件ID,然后返回该附件的下载URL,前端通过打开该URL实现下载。由于用户要求的是批量打包下载,我们可以设计如下:步骤1:创建模型方法(在后台进行打包操作)步骤2:创建客户端动作(绑定到树视图的多选动作)步骤3:创建向导模型和视图(用于触发打包下载)下面是一个具体的实现示例:###1.创建模型方法(在`ir.attachment`模型上扩展)我们需要在`ir.attachment`模型上添加一个方法,该方法接收附件ID列表,将这些附件打包成zip,并返回新创建的附件记录(即压缩包)的ID。注意:由于安全考虑,我们只允许下载用户有权限访问的附件。###2.创建向导模型创建一个临时向导,用于处理打包请求。该向导可以很简单,只有一个“下载”按钮。###3.创建客户端动作创建一个客户端动作,当在树视图中多选记录并点击动作按钮时,会触发这个客户端动作。该动作将打开向导表单。###4.实现下载功能在向导的按钮点击事件中,调用后台的打包方法,然后返回一个下载动作。具体代码实现如下:####模型代码(models/attachment.py)```pythonfromodooimportmodels,fields,apiimportosimportzipfileimporttempfilefromodoo.exceptionsimportAccessErrorclassAttachment(models.Model):_inherit='ir.attachment'@api.modeldefcreate_zip_attachment(self,attachment_ids):#检查当前用户是否有权限读取这些附件attachments=self.browse(attachment_ids)ifnotattachments:raiseValueError("没有附件可打包")#创建一个临时zip文件temp_dir=tempfile.mkdtemp()zip_path=os.path.join(temp_dir,'attachments.zip')withzipfile.ZipFile(zip_path,'w')aszipf:forattachmentinattachments:#检查用户是否有权限读取该附件ifnotself.env.user.has_group('base.group_user')ornotattachment.res_modelornotattachment.res_id:continue#确保用户有权限访问关联的记录(这里简化处理,实际可能需要根据模型和记录ID检查)#获取附件内容try:content=attachment.rawexceptAccessError:continue#将附件内容写入zipzipf.writestr(attachment.name,content)#读取zip文件内容withopen(zip_path,'rb')asf:zip_content=f.read()#创建新的附件记录(压缩包)zip_attachment=self.create({'name':'attachments.zip','datas':base64.b64encode(zip_content),'type':'binary','res_model':'ir.ui.view',#这里使用一个通用的模型,或者根据实际情况设置'res_id':0,#没有关联特定记录})returnzip_attachment.id```####向导模型(wizard/download_wizard.py)```pythonfromodooimportmodels,fields,apiclassDownloadWizard(models.TransientModel):_name='download.attachment.wizard'_description='下载附件向导'attachment_ids=fields.Many2many('ir.attachment',string='附件')zip_attachment_id=fields.Many2one('ir.attachment',string='压缩包')defaction_download(self):self.ensure_one()#调用创建压缩包的方法attachment_id=self.env['ir.attachment'].create_zip_attachment(self.attachment_ids.ids)#获取压缩包附件的下载URLaction={'type':'ir.actions.act_url','url':'/web/content/%s?download=true'%attachment_id,'target':'self',}returnaction```####客户端动作(actions/actions.xml)```xml<recordid="action_download_attachments"model="ir.actions.client"><fieldname="name">下载附件</field><fieldname="tag">download_attachments_action</field><fieldname="params"eval="{'model':'ir.attachment'}"/></record>```####将客户端动作绑定到树视图在需要此功能的模型的树视图中,添加动作按钮。例如,在`res.partner`的树视图中添加:```xml<recordid="view_partner_tree"model="ir.ui.view"><fieldname="name">res.partner.tree</field><fieldname="model">res.partner</field><fieldname="arch"type="xml"><treestring="Partners"><!--树视图列定义--><buttonname="action_download_attachments"type="action"string="下载附件"class="oe_highlight"groups="base.group_user"/></tree></field></record>```但是,注意:上述方式只会在每行显示一个按钮,而我们希望多选后有一个全局的按钮。因此,我们参考引用[2]和[3],使用列表视图的按钮。我们可以通过继承列表视图的控制器,在列表视图的顶部添加一个按钮,当点击时获取选中的记录,然后打开向导或直接下载。####JavaScript代码(static/src/js/download.js)参考引用[2],我们可以编写如下JavaScript代码:```javascriptodoo.define('custom_attachment_download.download',function(require){"usestrict";varListController=require('web.ListController');varcore=require('web.core');varqweb=core.qweb;ListController.include({renderButtons:function($node){this._super.apply(this,arguments);if(this.$buttons){//添加一个下载按钮varbutton=$(qweb.render('DownloadAttachmentsButton'));button.on('click',this.downloadAttachments.bind(this));this.$buttons.append(button);}},downloadAttachments:function(){varself=this;varattachment_ids=this.getSelectedIds();if(!attachment_ids.length){return;}//调用向导模型self.do_action({type:'ir.actions.act_window',name:'下载附件',res_model:'download.attachment.wizard',view_mode:'form',views:[[false,'form']],target:'new',context:{default_attachment_ids:attachment_ids,},});},});});```然后在模板中添加按钮的XML(在QWeb模板中):```xml<templates><tt-name="DownloadAttachmentsButton"><buttontype="button"class="btnbtn-primary">批量下载附件</button></t></templates>```####向导视图(views/download_wizard.xml)```xml<recordid="view_download_attachment_wizard_form"model="ir.ui.view"><fieldname="name">download.attachment.wizard.form</field><fieldname="model">download.attachment.wizard</field><fieldname="arch"type="xml"><formstring="下载附件"><group><fieldname="attachment_ids"widget="many2many_tags"/></group><footer><buttonname="action_download"type="object"string="下载"class="btn-primary"/><buttonstring="取消"class="btn-default"special="cancel"/></footer></form></field></record>```####菜单和动作需要为向导创建一个窗口动作,并在需要的地方调用。注意:上述代码只是一个示例,实际开发中需要考虑以下几点:1.权限控制:确保用户只能下载有权限访问的附件。2.错误处理:打包过程中可能出现的异常(如文件不存在、权限错误等)。3.性能:当附件很大或很多时,打包操作可能很耗时,可能需要使用队列(如使用Odoo的cron或队列作业)。由于用户要求的是示例,我们提供了一个基本的实现框架。根据实际需求,可能还需要调整。###相关问题§§相关问题§§1.如何确保批量下载附件时的安全性?2.在Odoo中如何处理大文件打包以避免超时?3.如何将打包下载功能限制给特定用户组?4.在Odoo中如何实现后台任务(异步处理)?</think>### Odoo 14 批量打包下载附件功能实现 在 Odoo 14 中实现批量打包下载附件功能,可通过创建自定义模块完成。以下是核心实现步骤和代码示例: #### 1. 创建客户端动作 (XML) ```xml <!-- views.xml --> <record id="action_download_attachments" model="ir.actions.client"> <field name="name">下载附件</field> <field name="tag">download_attachments_action</field> <field name="params">{'model': 'your.model.name'}</field> </record> ``` #### 2. 实现附件打包逻辑 (Python) ```python # models.py import zipfile import tempfile import base64 from odoo import models, api class YourModel(models.Model): _inherit = 'your.target.model' def _create_zip_attachment(self, attachment_ids): # 创建临时zip文件 with tempfile.NamedTemporaryFile(prefix='odoo_attachments_', suffix='.zip') as tmp: with zipfile.ZipFile(tmp.name, 'w') as zipf: for attachment in self.env['ir.attachment'].browse(attachment_ids): zipf.writestr(attachment.name, base64.b64decode(attachment.datas)) # 创建zip附件记录 zip_attachment = self.env['ir.attachment'].create({ 'name': f'attachments_{fields.Datetime.now()}.zip', 'datas': base64.b64encode(open(tmp.name, 'rb').read()), 'type': 'binary', }) return zip_attachment.id ``` #### 3. 前端JavaScript调用 (JS) ```javascript // static/src/js/download.js odoo.define('your_module.download', function(require) { "use strict"; var downloadFunction = { downloadAttachments: function(attachment_ids, model_name) { return this._rpc({ model: model_name, method: '_create_zip_attachment', args: [attachment_ids], }).then(function(zip_id) { window.location.href = '/web/content/' + zip_id + '?download=true'; }); } }; return downloadFunction; }); ``` #### 4. 树视图添加下载按钮 (XML) ```xml <!-- views.xml --> <record id="your_tree_view" model="ir.ui.view"> <field name="model">your.model.name</field> <field name="arch" type="xml"> <tree> <!-- 列定义 --> <button name="action_download_attachments" type="action" string="批量下载" class="oe_highlight" icon="fa-download"/> </tree> </field> </record> ``` #### 5. 安全权限配置 (XML) ```xml <!-- security/ir.model.access.csv --> id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_your_model,your.model,model_your_model,base.group_user,1,1,1,0 ``` ### 实现原理 1. **用户交互**:在树视图选择多条记录后点击"批量下载"按钮 2. **客户端动作**:触发自定义客户端动作 `download_attachments_action` 3. **数据处理**: - 获取选中记录的附件ID - 调用Python方法创建ZIP压缩包 - 生成临时附件记录 4. **文件下载**:返回压缩包附件的下载URL实现下载[^3] ### 注意事项 1. **权限控制**:需验证用户对附件的访问权限 2. **大文件处理**:添加进度提示和超时处理 3. **临时清理**:定期清理生成的临时附件 4. **错误处理**:添加附件不存在时的异常处理 [^1]: 第三方模块安装方法参考 [^2]: 前端批量下载实现示例 [^3]: 附件批量下载原理说明 [^4]: 附件上传功能实现参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弄堂汪

看了觉得好,就请我喝瓶水吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值