from odoo import api, fields, models, tools, SUPERUSER_ID, _ from odoo.exceptions import UserError, ValidationError from odoo.utils.model_util.const import DATE_LIST, get_database_value_from_value, get_value_from_database, EMPTY_CHAR, \ get_date_range_string from .report_set import DEFAULT_WIDTH, DEFAULT_HEIGHT LABEL_MODEL = 'jc_bi.report_label' STYLE_MODEL = 'jc_bi.report_style' SET_MODEL = 'jc_bi.report_set' CONDITION_MODEL = 'jc_bi.report_label_condition' USER_DETAIL_MODEL = 'jc_bi.report_label_user_detail' class ReportConfig(models.Model): _description = 'BI.报表配置' _name = "jc_bi.report_config" _order = 'id' default_date_range = fields.Char('通用日期默认条件') @api.model def get_config(self): has_right = self.user_has_groups('base.group_no_one') label_list = self._query_current_user_label() default_date_range = self._query_default_date_range() # group_no_one = self.env.ref('base.group_no_one') return [has_right, label_list, DATE_LIST, default_date_range, { 'id': 1, 'name': 'a', }] @api.model def query_all_label(self): """ 获取label信息. :return: label信息列表。每一项信息为 dictionary。内容为: id:标签ID name: 标签名称 order: 标签顺序 report_set_id: 报表集ID report_set_name: 报表集名称 report_label_condition_id: 标签条件ID report_label_condition_name: 标签条件名称 user_detail_id_list: 用户明细ID report_set_width: 报表集宽度 report_set_height: 报表集高度 style_list: 样式信息列表。每一项信息为: 样式信息格式:[样式ID, 样式宽度, 样式高度] 例如: [ {'id': 5, 'name': '仓库:ooo', 'order': 1, 'report_set_id': 10, 'report_set_name': '报表集10-11', 'report_label_condition_id': 1, 'report_label_condition_name': 'E仓库:ooo', 'user_detail_id_list': [1], 'report_set_width': 100, 'report_set_height': 800, 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]] } ] """ return self._query_label([], need_query_user=True) def _query_label(self, domain, need_query_user): query_fields = ['id', 'name', 'order', 'report_set_id', 'report_label_condition_id', 'user_detail'] res = self.env[LABEL_MODEL].sudo().search_read(domain, query_fields, order='order,name') label_list = [ReportConfig._get_label_info(x) for x in res if x['name']] label_list.sort(key=lambda x: x['order']) for item in label_list: # print('report_set_id before:', item[3]) report_set_id = item['report_set_id'] if need_query_user: user_domain = [('id', 'in', item['user_detail_id_list'])] res = self.env[USER_DETAIL_MODEL].sudo().search_read(user_domain, ['user_id']) item['current_user_list'] = [(x['user_id'][0], x['user_id'][1]) for x in res] if not report_set_id: item['report_set_width'] = DEFAULT_WIDTH item['report_set_height'] = DEFAULT_HEIGHT item['style_list'] = [] continue # print('report_set_id after:', report_set_id) set_info = self.env[SET_MODEL].sudo().query_set_info(report_set_id) item['report_set_width'] = set_info[0][1] item['report_set_height'] = set_info[0][2] item['style_list'] = set_info[1] print('label_list:', label_list) return label_list def _query_current_user_label(self): """ 获取当前用户的label信息. :return: label信息列表。每一项信息为 dictionary。内容为: id:标签ID name: 标签名称 order: 标签顺序 report_set_id: 报表集ID report_set_name: 报表集名称 report_label_condition_id: 标签条件ID report_label_condition_name: 标签条件名称 user_detail_id_list: 用户明细ID report_set_width: 报表集宽度 report_set_height: 报表集高度 style_list: 样式信息列表。每一项信息为: 样式信息格式:[样式ID, 样式宽度, 样式高度] 例如: [ {'id': 5, 'name': '仓库:ooo', 'order': 1, 'report_set_id': 10, 'report_set_name': '报表集10-11', 'report_label_condition_id': 1, 'report_label_condition_name': 'E仓库:ooo', 'user_detail_id_list': [1], 'report_set_width': 100, 'report_set_height': 800, 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]] } ] """ user = self.env.user domain = [('user_id', '=', user.id)] res = self.env[USER_DETAIL_MODEL].sudo().search_read(domain, ['report_label_id']) if not res: return [] id_list = [r['report_label_id'][0] for r in res] print('id_list:%s' % id_list) return self._query_label([('id', 'in', id_list)], need_query_user=False) @staticmethod def _get_label_info(label_res): report_set_pair = label_res['report_set_id'] if label_res['report_set_id'] else [0, ''] report_label_condition_pair = label_res['report_label_condition_id'] if label_res[ 'report_label_condition_id'] else [0, ''] return { 'id': label_res['id'], 'name': label_res['name'], 'order': label_res['order'] if label_res['order'] else 0, 'report_set_id': report_set_pair[0], 'report_set_name': report_set_pair[1], 'report_label_condition_id': report_label_condition_pair[0], 'report_label_condition_name': report_label_condition_pair[1], 'user_detail_id_list': label_res['user_detail'], } def _query_default_date_range(self): record = self.env[self._name].sudo().search([], limit=1) if record: date_range = get_value_from_database(record.default_date_range, 'date') start_date_define_pair, end_date_define_pair = date_range start_date_range = get_date_range_string(start_date_define_pair[0]) end_date_range = get_date_range_string(end_date_define_pair[0]) start = list(date_range[0]) end = list(date_range[1]) start.append(start_date_range[0]) end.append(end_date_range[1]) # print('date range:', date_range) # print('start:', start) # print('end:', end) return start, end return [[EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR], [EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR]] @api.model def save_default_date(self, default_date_range): date_range_string = get_database_value_from_value(default_date_range, 'date') print('date_range_string', date_range_string) val = { 'default_date_range': date_range_string, } record = self.env[self._name].sudo().search([], limit=1) if record: record.write(val) else: self.env[self._name].sudo().create(val) return @api.model def save_label(self, _id, name, order, report_set_id, report_label_condition_id): if not name: return val = { 'name': name, 'order': order if order else 0, } # print('save_label:', val) if _id == '0': bill = self.env[LABEL_MODEL].sudo().create(val) return bill.id else: record = self.env[LABEL_MODEL].sudo().browse(int(_id)) if record.report_set_id and not report_set_id: raise ValidationError('请选择{报表集}!') if record.report_label_condition_id and not report_label_condition_id: raise ValidationError('请选择{标签条件}!') if report_set_id: val['report_set_id'] = report_set_id if report_label_condition_id: val['report_label_condition_id'] = report_label_condition_id record.write(val) return @api.model def delete_label(self, _id): _id = int(_id) if not _id: return label = self.env[LABEL_MODEL].sudo().browse(_id) label.unlink() return @api.model def delete_condition(self, _id): _id = int(_id) if not _id: return condition = self.env[CONDITION_MODEL].sudo().browse(_id) condition.unlink() return @api.model def query_archive(self, archive_model, archive_id, archive_fields): bill = self.env[archive_model].sudo().browse(int(archive_id)) return [bill[f] for f in archive_fields] @api.model def query_archive2(self, archive_model, archive_id, archive_fields, detail_reference_field, detail_fields): bill = self.env[archive_model].sudo().browse(int(archive_id)) # _feilds = self.env[archive_model]._fields # print('a' if 'report_set_id' in _feilds else 'b') # print('a' if 'aaa' in _feilds else 'b') detail = bill[detail_reference_field] res_detail = [] for d in detail: item = [d[f] for f in detail_fields] res_detail.append(item) return [[self._get_value(archive_model, bill, f) for f in archive_fields], res_detail] def _get_value(self, archive_model, bill, field): _feilds = self.env[archive_model]._fields if field in _feilds: field_info = _feilds[field] if field_info.type == 'many2one': return bill[field]['name'] elif field_info.type in ['char', 'integer']: return bill[field] elif field_info.type == 'date': return 'date类型的数据未处理' elif field_info.type == 'selection': return 'selection类型的数据未处理' else: return '未知类型:{}'.format(field_info.type) else: return '' @api.model def save_archive(self, archive_model, archive_id, archive_fields): print('fields:', archive_fields) bill = self.env[archive_model].sudo().browse(int(archive_id)) bill.update(archive_fields) return # def _query_result(self): # test_data = ([('订单编号', 100, 0, False), ('订单状态', 90, 100, False), ('日期', 90, 190, False), ('摘要', 90, -1, False), # ('出库日期', 90, -1, False), ('客户', 90, -1, False), ('销售类型', 90, -1, False), ('公司', 120, -1, False), # ('部门', 90, -1, False), ('仓库', 90, -1, False), ('销售员', 90, -1, False), ('产品', 90, -1, False), # ('辅数量', 90, -1, True), ('辅单位', 90, -1, False), ('数量', 90, -1, True), ('主单位', 90, -1, False), # ('单价', 90, -1, True), ('金额', 90, -1, True), ('备注', 90, -1, False)], # [ # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'], # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['产品1'], ['50.00'], ['设备区域1'], ['5'], ['设备分类1'], # ['3.570'], ['17.85'], ['']], # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'], # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['销售产品3'], ['20.00'], ['袋'], ['2', 'red', 'gray'], # ['KG'], ['3.200'], ['6.40', '', 'lightblue'], ['']]], # [['合计', 12], ['5151.00', 1], ['', 1], ['', 1], ['', 1], ['', 1], ['1429.85', 1], ['', 1]], 19, 38) # return test_data