代码优化
This commit is contained in:
+102
-98
@@ -1,15 +1,19 @@
|
||||
import json, uuid,requests,os
|
||||
import json, uuid, requests, os
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import UserError
|
||||
from . import datasource
|
||||
from PyPDF2 import PdfFileWriter, PdfFileReader
|
||||
|
||||
FIELD_TYPES = [(key, key) for key in sorted(fields.Field.by_type)]
|
||||
import tempfile
|
||||
|
||||
#################
|
||||
dir=tempfile.gettempdir()
|
||||
#dir='/opt/odoo'
|
||||
login='admin'
|
||||
password='admin'
|
||||
dir = tempfile.gettempdir()
|
||||
# dir='/opt/odoo'
|
||||
login = 'test'
|
||||
password = 'test'
|
||||
|
||||
|
||||
##################
|
||||
|
||||
class BaseModelExtend(models.AbstractModel):
|
||||
@@ -25,7 +29,7 @@ class BaseModelExtend(models.AbstractModel):
|
||||
|
||||
def getOdooToken(self):
|
||||
|
||||
url = GetUrl(self)+"/web/session/authenticate"
|
||||
url = GetUrl(self) + "/web/session/authenticate"
|
||||
# 传入需要访问的数据库名称,登录账号与密码
|
||||
data = {
|
||||
"params": {
|
||||
@@ -38,6 +42,7 @@ class BaseModelExtend(models.AbstractModel):
|
||||
headers = {'Content-type': 'application/json'}
|
||||
response = requests.post(url, headers=headers, json=data)
|
||||
return response.cookies["session_id"]
|
||||
|
||||
def report_pdf_prints(self, args, types):
|
||||
'''
|
||||
PDF打印公共方法
|
||||
@@ -50,33 +55,37 @@ class BaseModelExtend(models.AbstractModel):
|
||||
print_type = 'pdf' if types == 0 else 'xlsx'
|
||||
data_id = self._context.get('active_ids', None)
|
||||
report_report = self.env['report.report'].browse(report_id)
|
||||
data_model=self._context.get('active_model', None)
|
||||
data_model_details=report_report.model_detail_id.model if report_report.report_type=='bill' else ''
|
||||
if data_model is None:
|
||||
data_model = self._context.get('active_model', None)
|
||||
data_model_details = report_report.model_detail_id.model if report_report.report_type == 'bill' else ''
|
||||
if data_model is None:
|
||||
raise UserError('获取数据源失败')
|
||||
res_id=self.env[data_model].read_group([('id','in',data_id)],[report_report.group_field],[report_report.group_field])
|
||||
res_id = self.env[data_model].read_group([('id', 'in', data_id)], [report_report.group_field],
|
||||
[report_report.group_field])
|
||||
headers = {
|
||||
'Connection': 'keep-alive',
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
|
||||
'Cookie':'session_id='+getOdooToken(self)
|
||||
'Cookie': 'session_id=' + getOdooToken(self)
|
||||
}
|
||||
|
||||
inFileList = []
|
||||
for s_code in res_id:
|
||||
s_id=[]
|
||||
wheres_id = self.env[data_model].search([('id', 'in', data_id),(report_report.group_field,'=',s_code[report_report.group_field])])
|
||||
s_id = []
|
||||
wheres_id = self.env[data_model].search(
|
||||
[('id', 'in', data_id), (report_report.group_field, '=', s_code[report_report.group_field])])
|
||||
for wid in wheres_id:
|
||||
s_id.append(wid.id)
|
||||
dic = {}
|
||||
dic['report'] = json.loads(report_report.report_data)
|
||||
dic['data'] = datasource.wms_datasource.get_data(self,report_id,s_id,data_model,data_model_details,report_report.model_main_key)
|
||||
dic['data'] = datasource.wms_datasource.get_data(self, report_id, s_id, data_model, data_model_details,
|
||||
report_report.model_main_key)
|
||||
dic['outputFormat'] = print_type
|
||||
dic['isTestData'] = True
|
||||
res = requests.post(self.GetUrl() + '/api/report/report_server/run', data={'data': str(json.dumps(dic))},headers=headers, allow_redirects=True)
|
||||
res = requests.post(self.GetUrl() + '/api/report/report_server/run',
|
||||
data={'data': str(json.dumps(dic))}, headers=headers, allow_redirects=True)
|
||||
print(res.text)
|
||||
key = str(res.text.split(':')[1])
|
||||
url=self.GetUrl() + '/api/report/report_server/run?key=' + key + '&outputFormat=' + print_type
|
||||
r = requests.get(url, stream=True,cookies={'session_id':getOdooToken(self)})
|
||||
url = self.GetUrl() + '/api/report/report_server/run?key=' + key + '&outputFormat=' + print_type
|
||||
r = requests.get(url, stream=True, cookies={'session_id': getOdooToken(self)})
|
||||
pdf = "/%s.pdf" % key
|
||||
# 获取temp临时文件路径
|
||||
|
||||
@@ -105,8 +114,7 @@ class BaseModelExtend(models.AbstractModel):
|
||||
key_uid = str(uuid.uuid4())
|
||||
self.env['wms.print.list'].create({'p_key': key_uid, 'report_file_pdf': pdf_content})
|
||||
if print_type == 'pdf':
|
||||
|
||||
#打开新页面
|
||||
# 打开新页面
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_url',
|
||||
# 'title':'打印预览',
|
||||
@@ -122,19 +130,14 @@ class BaseModelExtend(models.AbstractModel):
|
||||
'views': [[False, "form"]],
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'default_name': '<iframe src="' + self.GetUrl() + '/api/report/report_server/run?key=' +key_uid + '&outputFormat=' + print_type + '&report_id='+str(args)+'" marginheight="0" marginwidth="0" width="100%" height="700px" />'}
|
||||
'default_name': '<iframe src="' + self.GetUrl() + '/api/report/report_server/run?key=' + key_uid + '&outputFormat=' + print_type + '&report_id=' + str(
|
||||
args) + '" marginheight="0" marginwidth="0" width="100%" height="700px" />'}
|
||||
|
||||
}
|
||||
|
||||
models.BaseModel.GetUrl = GetUrl
|
||||
models.BaseModel.report_pdf_prints = report_pdf_prints
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return super(BaseModelExtend, self)._register_hook()
|
||||
|
||||
|
||||
@@ -142,20 +145,21 @@ class wmsprintlist(models.Model):
|
||||
_name = 'wms.print.list'
|
||||
_description = '打印服务表'
|
||||
|
||||
p_key=fields.Char('内容键')
|
||||
report_file_pdf= fields.Binary('PDF', attachment=False)
|
||||
report_file_xlsx = fields.Binary('XLSX',attachment=False)
|
||||
print_status=fields.Boolean('打印状态',default=False)
|
||||
p_key = fields.Char('内容键')
|
||||
report_file_pdf = fields.Binary('PDF', attachment=False)
|
||||
report_file_xlsx = fields.Binary('XLSX', attachment=False)
|
||||
print_status = fields.Boolean('打印状态', default=False)
|
||||
|
||||
name = fields.Html('预览', store=False, sanitize=False)
|
||||
|
||||
name=fields.Html('预览',store=False,sanitize=False)
|
||||
|
||||
class ReportReport(models.Model):
|
||||
_name = "report.report"
|
||||
_description = "Report"
|
||||
|
||||
name = fields.Char(string='报表名称', required=True)
|
||||
model_id = fields.Many2one('ir.model', string='主表模型', ondelete="cascade", required=True,help='至少要存在一个数据模型')
|
||||
model_id = fields.Many2one('ir.model', string='主表模型', ondelete="cascade", required=True,
|
||||
help='至少要存在一个数据模型')
|
||||
model_detail_id = fields.Many2one('ir.model', string='明细表模型', ondelete="cascade")
|
||||
report = fields.Text(string='报表')
|
||||
model_main_key = fields.Char('主模型Key', help='主数据模型和明细模型的关联字段名称', default='order_id')
|
||||
@@ -167,9 +171,11 @@ class ReportReport(models.Model):
|
||||
report_data = fields.Text('模板数据')
|
||||
data_source = fields.Char(string='数据源')
|
||||
test_data = fields.Text('数据结构')
|
||||
pdf_name=fields.Text('PDF名称')
|
||||
report_type=fields.Selection(selection=[('bill','单据'),('report','报表')],string='报表类型',help='一般带主表,明细表模型的为单据类报表,单个模型的为纯报表类型')
|
||||
group_field=fields.Char(string='套打字段',help='用于批量打印时,区分每页的关键字段')
|
||||
pdf_name = fields.Text('PDF名称')
|
||||
report_type = fields.Selection(selection=[('bill', '单据'), ('report', '报表')], string='报表类型',
|
||||
help='一般带主表,明细表模型的为单据类报表,单个模型的为纯报表类型')
|
||||
group_field = fields.Char(string='套打字段', help='用于批量打印时,区分每页的关键字段')
|
||||
|
||||
@api.model
|
||||
def default_get(self, fields):
|
||||
res = super(ReportReport, self).default_get(fields)
|
||||
@@ -183,10 +189,12 @@ class ReportReport(models.Model):
|
||||
raise UserError('汇总打印字段不能为空')
|
||||
model = self.env['ir.model'].search([('model', '=', 'report.report')])
|
||||
res.write({'display_completes': True})
|
||||
act_type='list,form' if res.report_type=='bill' else 'list'
|
||||
sql_pdf = "insert into ir_act_server (name,type,binding_model_id,binding_type,binding_view_types,usage,state,sequence,model_id,model_name,code,activity_date_deadline_range_type,activity_user_type) values ('" + json.dumps({'zh_CN':self.name}) + "','ir.actions.server', " + str(
|
||||
res.model_id.id) + ",'action', '"+act_type+"','ir_actions_server','code',5, " + str(
|
||||
model.id) + ",'report.report','action = model.report_pdf_prints(" + str(self.id) + ",0)','days','specific');"
|
||||
act_type = 'list,form' if res.report_type == 'bill' else 'list'
|
||||
sql_pdf = "insert into ir_act_server (name,type,binding_model_id,binding_type,binding_view_types,usage,state,sequence,model_id,model_name,code,activity_date_deadline_range_type,activity_user_type) values ('" + json.dumps(
|
||||
{'zh_CN': self.name}) + "','ir.actions.server', " + str(
|
||||
res.model_id.id) + ",'action', '" + act_type + "','ir_actions_server','code',5, " + str(
|
||||
model.id) + ",'report.report','action = model.report_pdf_prints(" + str(
|
||||
self.id) + ",0)','days','specific');"
|
||||
|
||||
self._cr.execute(sql_pdf)
|
||||
|
||||
@@ -194,7 +202,7 @@ class ReportReport(models.Model):
|
||||
res = self.env['report.report'].search([('id', '=', self.id)])
|
||||
res.write({'display_completes': False})
|
||||
|
||||
self._cr.execute('delete from ir_act_server where name=%s',(json.dumps({'zh_CN':self.name}),))
|
||||
self._cr.execute('delete from ir_act_server where name=%s', (json.dumps({'zh_CN': self.name}),))
|
||||
|
||||
def button_designer(self):
|
||||
res = self.env['report.report'].search([('id', '=', self.id)])
|
||||
@@ -212,8 +220,8 @@ class ReportReport(models.Model):
|
||||
for r2 in report_detail:
|
||||
res_detail.append(r2.field_id.id)
|
||||
|
||||
#report_main_names = self.env['ir.model.fields'].search([('id', 'in', res_main)])
|
||||
#report_detail_names = self.env['ir.model.fields'].search([('id', 'in', res_detail)])
|
||||
# report_main_names = self.env['ir.model.fields'].search([('id', 'in', res_main)])
|
||||
# report_detail_names = self.env['ir.model.fields'].search([('id', 'in', res_detail)])
|
||||
|
||||
parameters = [{
|
||||
'id': 1, 'name': 'page_count', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
|
||||
@@ -245,7 +253,6 @@ class ReportReport(models.Model):
|
||||
})
|
||||
index += 1
|
||||
|
||||
|
||||
# 序号
|
||||
children = [{
|
||||
'id': 888,
|
||||
@@ -260,14 +267,14 @@ class ReportReport(models.Model):
|
||||
'testData': ''}]
|
||||
test_data2 = []
|
||||
# 明细表
|
||||
r={}
|
||||
r = {}
|
||||
for rmn in report_detail:
|
||||
r[rmn.field_params]= ''
|
||||
r[rmn.field_params] = ''
|
||||
children.append({
|
||||
'id': index,
|
||||
'name': rmn.field_params,
|
||||
'type': self.get_type(rmn.ttype),
|
||||
'arrayItemType':self.get_type(rmn.ttype),
|
||||
'arrayItemType': self.get_type(rmn.ttype),
|
||||
'eval': False,
|
||||
'nullable': False,
|
||||
'pattern': '',
|
||||
@@ -346,7 +353,7 @@ class ReportReport(models.Model):
|
||||
'reference': 'string',
|
||||
'image': 'image',
|
||||
'image_url': 'string',
|
||||
'json':'string'
|
||||
'json': 'string'
|
||||
|
||||
}
|
||||
|
||||
@@ -363,57 +370,7 @@ class ReportReportMain(models.Model):
|
||||
field_id = fields.Many2one('ir.model.fields', string='字段名称', ondelete="cascade", required=True)
|
||||
field_description = fields.Char(string='字段', related='field_id.name')
|
||||
field_params = fields.Char(string='参数')
|
||||
field_value = fields.Char(string='字段取值', compute='_field_custom',store=True,inverse='_field_custom_inverse')
|
||||
ttype = fields.Selection(selection=FIELD_TYPES, string='类型', related='field_id.ttype')
|
||||
is_report = fields.Boolean(string='报表', default=True)
|
||||
|
||||
|
||||
@api.depends('field_id')
|
||||
def _field_custom(self):
|
||||
for s in self:
|
||||
s.field_params=s.field_description
|
||||
if s.ttype in ['text', 'char','html']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
|
||||
elif s.ttype in ['date', 'datetime', 'boolean']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
|
||||
elif s.ttype in ['integer', 'float', 'monetary']:
|
||||
s.field_value = "s." + str(s.field_id.name) + " or 0"
|
||||
elif s.ttype in ['one2many', 'many2one', 'many2many']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ".name) or ''"
|
||||
elif s.ttype=='selection':
|
||||
s.field_value = "str(dict(self.env['"+str(s.model_id.model)+"'].fields_get(allfields=['"+str(s.field_id.name)+"'])['"+str(s.field_id.name)+"']['selection'])[s."+str(s.field_id.name)+"]) or ''"
|
||||
else:
|
||||
s.field_value = "s." + str(s.field_id.name)
|
||||
|
||||
|
||||
|
||||
def _field_custom_inverse(self):
|
||||
pass
|
||||
|
||||
@api.depends('model_id')
|
||||
def _compute_field_domain(self):
|
||||
for record in self:
|
||||
fields = []
|
||||
record.field_domain = self._get_fields(fields=fields, model=record.model_id)
|
||||
|
||||
def _get_fields(self, fields=None, model=None):
|
||||
for field in model.field_id:
|
||||
if field.ttype != 'one2many':
|
||||
fields.append(field.id)
|
||||
return fields
|
||||
|
||||
|
||||
class ReportReportDetail(models.Model):
|
||||
_name = "report.report.detail"
|
||||
_description = "Report detail"
|
||||
|
||||
report_detail_id = fields.Many2one('report.report', string='Report detail')
|
||||
model_id = fields.Many2one('ir.model', string='Model', ondelete="cascade")
|
||||
field_domain = fields.Many2many('ir.model.fields', string='Field Domain', compute='_compute_field_domain')
|
||||
field_id = fields.Many2one('ir.model.fields', string='字段名称', ondelete="cascade", required=True)
|
||||
field_description = fields.Char(string='字段', related='field_id.name')
|
||||
field_params = fields.Char(string='参数')
|
||||
field_value = fields.Char(string='字段取值',compute='_field_custom',store=True,inverse='_field_custom_inverse')
|
||||
field_value = fields.Char(string='字段取值', compute='_field_custom', store=True, inverse='_field_custom_inverse')
|
||||
ttype = fields.Selection(selection=FIELD_TYPES, string='类型', related='field_id.ttype')
|
||||
is_report = fields.Boolean(string='报表', default=True)
|
||||
|
||||
@@ -452,3 +409,50 @@ class ReportReportDetail(models.Model):
|
||||
return fields
|
||||
|
||||
|
||||
class ReportReportDetail(models.Model):
|
||||
_name = "report.report.detail"
|
||||
_description = "Report detail"
|
||||
|
||||
report_detail_id = fields.Many2one('report.report', string='Report detail')
|
||||
model_id = fields.Many2one('ir.model', string='Model', ondelete="cascade")
|
||||
field_domain = fields.Many2many('ir.model.fields', string='Field Domain', compute='_compute_field_domain')
|
||||
field_id = fields.Many2one('ir.model.fields', string='字段名称', ondelete="cascade", required=True)
|
||||
field_description = fields.Char(string='字段', related='field_id.name')
|
||||
field_params = fields.Char(string='参数')
|
||||
field_value = fields.Char(string='字段取值', compute='_field_custom', store=True, inverse='_field_custom_inverse')
|
||||
ttype = fields.Selection(selection=FIELD_TYPES, string='类型', related='field_id.ttype')
|
||||
is_report = fields.Boolean(string='报表', default=True)
|
||||
|
||||
@api.depends('field_id')
|
||||
def _field_custom(self):
|
||||
for s in self:
|
||||
s.field_params = s.field_description
|
||||
if s.ttype in ['text', 'char', 'html']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
|
||||
elif s.ttype in ['date', 'datetime', 'boolean']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
|
||||
elif s.ttype in ['integer', 'float', 'monetary']:
|
||||
s.field_value = "s." + str(s.field_id.name) + " or 0"
|
||||
elif s.ttype in ['one2many', 'many2one', 'many2many']:
|
||||
s.field_value = "str(s." + str(s.field_id.name) + ".name) or ''"
|
||||
elif s.ttype == 'selection':
|
||||
s.field_value = "str(dict(self.env['" + str(s.model_id.model) + "'].fields_get(allfields=['" + str(
|
||||
s.field_id.name) + "'])['" + str(s.field_id.name) + "']['selection'])[s." + str(
|
||||
s.field_id.name) + "]) or ''"
|
||||
else:
|
||||
s.field_value = "s." + str(s.field_id.name)
|
||||
|
||||
def _field_custom_inverse(self):
|
||||
pass
|
||||
|
||||
@api.depends('model_id')
|
||||
def _compute_field_domain(self):
|
||||
for record in self:
|
||||
fields = []
|
||||
record.field_domain = self._get_fields(fields=fields, model=record.model_id)
|
||||
|
||||
def _get_fields(self, fields=None, model=None):
|
||||
for field in model.field_id:
|
||||
if field.ttype != 'one2many':
|
||||
fields.append(field.id)
|
||||
return fields
|
||||
|
||||
@@ -7,7 +7,7 @@ class ApprovalCategory(models.Model):
|
||||
_description = '审批框架拓展'
|
||||
|
||||
model_name = fields.Char(string="模型名称")
|
||||
category_type_number = fields.Char(srring='审批视图编号')
|
||||
category_type_number = fields.Char(string='审批视图编号')
|
||||
approval_department_ids = fields.Many2many('hr.department', string="审批所属部门")
|
||||
approval_process_id = fields.Many2one('approval.process', string="审批流程")
|
||||
is_enable = fields.Boolean(string="启用", default=True)
|
||||
|
||||
Reference in New Issue
Block a user