pythonodoo

odoo 对报表文件进行加密操作,然后下载

2020-06-06  本文已影响0人  隔壁小红馆

朋友公司有需求,类似对报表先进行加密然后下载,密码是员工的出生年月。

#xml文件

<act_window
    name="打印工资"
    id="print_hr_payslip"
    multi="True"
    key2="client_action_multi"
    res_model="hr.payslip.export"
    src_model="hr.payslip"
    view_mode="form"
    target="new"
    view_type="form"/>

        <record model="ir.ui.view" id="hr_payslip_export_form">
            <field name="name">hr.payslip.export.form</field>
            <field name="model">hr.payslip.export</field>
            <field name="arch" type="xml">
                <form string="打印工资">
                    <group>
                        <p>批量打印下载的工资单。工资单解压密码是员工生日。(如:员工生日2020年6月8号 则密码: 2020-06-08)</p>
                    </group>
                    <footer>
                        <button string="下载" name="export" type="object"/>
                    </footer>
                </form>
            </field>
        </record>
#model.py
@api.multi
    def export(self):
        active_ids = self.env.context.get('active_ids',[])
        ids_str = ','.join([str(id) for id in active_ids])

        return {
            'type': 'ir.actions.act_url',
            'url':'/export_password_pdf?ids=%s'%ids_str,
            'target':'new'
        }
#model.py
class ExportPasswordPdf(http.Controller):
    '''
        下载带密码的pdf zip文件
    '''

    @http.route('/export_password_pdf', auth='user', type='http')
    def export_password_pdf(self,**data):
        '''

        '''
        ids_str = data.get('ids')
        ids = ids_str.split(',')
        ids = [int(id) for id in ids]

        payslips = request.env['hr.payslip'].sudo().search([('id','in',ids)])
        # 取报表,生成pdf,加密
        pdf_temps = []

        for pl in payslips:
            pdf = request.env.ref('hr_payroll.action_report_payslip').render_qweb_pdf([pl.id])[0] #取得报表
            pdf_reader = PyPDF2.PdfFileReader(io.BytesIO(pdf)) #进行加密操作
            pdf_writer = PyPDF2.PdfFileWriter()
            for page_num in range(pdf_reader.numPages):
                page_obj = pdf_reader.getPage(page_num)
                pdf_writer.addPage(page_obj)
             #设置密码
            if not pl.employee_id.birthday:
                password = '123456'
            else:
                year = pl.employee_id.birthday.year
                month = pl.employee_id.birthday.month
                day = pl.employee_id.birthday.day

                password = ('%s%s%s'%(year, (month if month > 10 else '0%s'%month), (day if day > 10 else '0%s'%day)))
              
            pdf_writer.encrypt(str(password))
             #创建临时文件夹存放文件,
            pdf_fd, pdf_path = tempfile.mkstemp(suffix='.pdf', prefix='export_password_pdf_%s.'%pl.id)
            with open(pdf_path,'wb') as pdf_file:
                pdf_writer.write(pdf_file)
            month = pl.date_from.month
            pdf_temps.append({
                # 这里文件的名字
                'arcname':'%s_%s_%s%s01_工资表.pdf' % (pl.id,pl.employee_id.work_email,pl.date_from.year,(month if month > 10 else '0%s'%month)),
                'pdf_file':pdf_path
            })
        #将多个文件打包成zip文件
        temp_file_fd, temp_file_path = tempfile.mkstemp(suffix='.zip', prefix='export_password_pdf.')
        with zipfile.ZipFile(temp_file_path,'w',zipfile.ZIP_DEFLATED) as myzip:
            for pdf in pdf_temps:
                myzip.write(pdf.get('pdf_file'),arcname=pdf.get('arcname'))

        with open(temp_file_path, 'rb') as myzipfile:
            myzipcontent = myzipfile.read()

        for temporary_file in pdf_temps:
            try:
                os.unlink(temporary_file.get('pdf_file'))
            except (OSError, IOError):
                _logger.error('Error when trying to remove file %s' % temporary_file)

        filename = '工资单.zip'
        ziphttpheaders = [('Content-Type', 'application/zip'), ('Content-Length', len(myzipcontent)),('Content-Disposition', content_disposition(filename))]
        return request.make_response(myzipcontent, headers=ziphttpheaders)

制作不易,点赞鼓励哈

上一篇下一篇

猜你喜欢

热点阅读