|  | from odoo.tests.common import TransactionCase
from odoo.addons.report_docx.report.report_docx import DataModelProxy
from odoo.tools import misc
import tempfile
import shutil
import datetime
from odoo.addons.report_docx.report import report_helper
from docxtpl import DocxTemplate
class TestReportDocx(TransactionCase):
    def setUp(self):
        '''准备数据'''
        super(TestReportDocx, self).setUp()
        self.ir_actions = self.env.ref('sell.report_sell_order_1')
        self.sell_order = self.env.ref('sell.sell_order_1')
        self.report_docx_sell = self.ir_actions._get_report_from_name('sell.order')
        self.ir_actions_pdf = self.env.ref('sell.report_sell_order_2')
        self.report_pdf_sell = self.ir_actions_pdf._get_report_from_name('sell.order.pdf')
    def test_get_report_from_name(self):
        '''测试docx报表模板'''
        self.sell_order.note = '测试&和<>'
        self.report_docx_sell.render_docx([self.sell_order.id], [])
    def test_get_report_from_name_many2one(self):
        '''测试docx报表模板many2one字段中含有特殊字符&<>'''
        for line in self.sell_order.line_ids:
            line.goods_id.name = '鼠标测试&和<>'
        self.report_docx_sell.render_docx([self.sell_order.id], [])
    def test_get_report_from_name_pdf(self):
        '''测试docx报表模,输出类型为pdf'''
        # 测试create_source_docx
        # self.report_pdf_sell.create(
        #     self.cr, self.uid, self.sell_order.id, self.ir_actions_pdf, self.env.context)
    def test_get_report_from_name_type_pdf(self):
        '''测试docx报表模,report_type 为pdf'''
        # 模板为pdf类型,测试create
        self.ir_actions_pdf.write({'output_type': 'pdf'})
        # self.report_pdf_sell.render_docx([self.sell_order.id], [])
        # 模板为docx类型,测试create
        self.report_docx_sell.render_docx([self.sell_order.id], [])
    # def test_get_report_from_name_no_r(self):
    #     ''' 测试 执行 ir_report '''
    #     # 测试 执行 ir_report 的 _get_report_from_name no r
    #     with self.assertRaises(Exception):
    #         self.report_pdf_sell_1 = self.ir_actions_pdf._get_report_from_name(
    #             'sell.order1')
    def test_get_docx_data(self):
        self.report_docx_sell.render_docx([self.sell_order.id], [])
    # def test_save_file(self):
    #     doxc_file = self.report_docx_sell.render_docx([self.sell_order.id], [])
    #     tempname = tempfile.mkdtemp()
    #     shutil.copy(misc.file_open(
    #         'sell/template/sell.order.docx').name, tempname)
    #     self.report_docx_sell._save_file(
    #         tempname + "/sell.order.docx", doxc_file)
    def test_datamodelproxy(self):
        data = DataModelProxy([{"type": 'selection'}])
        data.__getitem__(0)
        data = DataModelProxy([])
        data.__getattr__(0)
    def test_compute_by_datetime(self):
        '''datetime打印处理'''
        obj = self.env['sell.order']
        data = DataModelProxy(obj)
        data._compute_by_datetime(obj._fields.get('create_date'), datetime.datetime.now())
class TestReportHelper(TransactionCase):
    ''' 测试 ReportHelper '''
    # def test_picture(self):
    #     ''' 测试 把图片的二进制数据(使用了base64编码)转化为一个docx.Document对象 '''
    #     doc = DocxTemplate(misc.file_open(
    #         'sell/template/sell.order.docx').name)
    #     # 读取图片的数据且使用base64编码
    #     data_1 = open(misc.file_open(
    #         'core/static/description/logo.png').name, 'rb').read().encode('base64')
    #     data = self.env['sell.order'].search([('name', '=', 'SO00001')])
    #     ctx = {'obj': data, 'tpl': doc}
    #     # not data
    #     report_helper.picture(ctx, None)
    #     # not width, height
    #     report_helper.picture(ctx, data_1)
    #     # width, height 分别为 'cm', 'mm','inchs','pt','emu','twips'
    #     # align 分别为'left','center','center','middle'
    #     report_helper.picture(ctx, data_1, width='122mm')
    #     report_helper.picture(ctx, data_1, width='12cm',
    #                           height='12cm', align='left')
    #     report_helper.picture(ctx, data_1, width='12inchs',
    #                           height='12inchs', align='left')
    #     report_helper.picture(ctx, data_1, width='12pt',
    #                           height='12pt', align='center')
    #     report_helper.picture(ctx, data_1, width='12emu',
    #                           height='12emu', align='right')
    #     report_helper.picture(ctx, data_1, width='12twips',
    #                           height='12twips', align='middle')
    #     # width, height 单位不写,为像素
    #     report_helper.picture(ctx, data_1, width='12',
    #                           height='12', align='middle')
    #     # width, height 不是 string 类型 :  not isinstance(s, str)
    #     report_helper.picture(ctx, data_1, width=12, height=12, align='middle')
    def test_get_env(self):
        ''' 测试 get_env 方法 '''
        doc = DocxTemplate(misc.file_open(
            'sell/template/sell.order.docx').name)
        data = self.env['sell.order'].search([('name', '=', 'SO00001')])
        ctx = {'obj': data, 'tpl': doc}
        jinja_env = report_helper.get_env()
        doc.render(ctx, jinja_env)
 |