odoo 12 导入功能二开,导入多规格属性(变体)的产品

  • 创建 HrEmployeeImport 类,加入到_init_.py。该类继承import基础模块base_import.import
  • 重写base_import.import 对应类下的do 方法。也可根据需要重写其他方法


    模板图片.png

class HrEmployeeImport(models.TransientModel):
    _inherit = 'base_import.import'

    @api.multi
    def do(self, fields, columns, options, dryrun=False):

        self.ensure_one()
        self._cr.execute('SAVEPOINT import')

        try:
            data, import_fields = self._convert_import_data(fields, options)
            # Parse date and float field
            data = self._parse_import_data(data, import_fields, options)
        except ValueError as error:
            return {
                'messages': [{
                    'type': 'error',
                    'message': pycompat.text_type(error),
                    'record': False,
                }]
            }

        _logger.info('importing %d rows...', len(data))

        name_create_enabled_fields = options.pop('name_create_enabled_fields', {})
        model = self.env[self.res_model].with_context(import_file=True,
                                                      name_create_enabled_fields=name_create_enabled_fields)
        # 过滤属性名和属性值
        # 属性名ids
        attrName_ids = []
        # 属性值ids
        attrValue_ids = []
        # 属性名 和 属性值 id的字典
        attr_id_d = {}
        if model._name == 'product.template':
            for item in data:
                # 属性
                attrName = item[-2].split(';')
                # 属性值
                attr_Values = item[-1].split(';')
                # 属性名 属性值 的字典
                attr = {}
                for index, a_name in enumerate(attrName):
                    attrValue = attr_Values[index].split(',')
                    attr.update({a_name: attrValue})
                for key, value in attr.items():
                    attr_id = self.env['product.attribute'].search([('name', '=', key)])
                    v_list = []
                    if attr_id:
                        attr_value_list = [i.name for i in attr_id.value_ids]
                        for v in value:
                            if v in attr_value_list:
                                attr_value_id = self.env['product.attribute.value'].search(
                                    [('attribute_id', '=', attr_id.id), ('name', '=', v)])
                                v_list += (attr_value_id.id)
                            else:
                                new_attr_value_id = self.env['product.attribute.value'].create({
                                    'attribute_id': attr_id.id,
                                    'name': v
                                })
                                v_list += (new_attr_value_id.id)
                        attr_id_d.update({attr_id.id: v_list})
                        attrName_ids.append(attr_id.id)
                        attrValue_ids.append(v_list)
                    else:
                        new_attr_id = self.env['product.attribute'].create({
                            # 'value_ids.name': value,
                            'name': key
                        })
                        for v in value:
                            new_attr_value_id = self.env['product.attribute.value'].create({
                                'attribute_id': new_attr_id.id,
                                'name': v
                            })
                        v_list += (new_attr_id.value_ids.ids)
                        value_name = [i.name for i in new_attr_id.value_ids]
                        value_id = [i.id for i in new_attr_id.value_ids]
                        attr_id_d.update({new_attr_id.id: v_list})
                        attrName_ids.append(new_attr_id.id)
                        attrValue_ids.append(v_list)
                # print(attr_id_d)
                # print(item)

            # 处理属性名和属性值  字段匹配问题
            del import_fields[-1]
            del import_fields[-1]

        import_result = model.load(import_fields, data)
        _logger.info('done')

        _logger.info(import_result)

        try:
            if dryrun:
                # 测试产品多规格导入
                if model._name == 'product.template':
                    if import_result['ids']:
                        for index, id in enumerate(import_result['ids']):
                            if data[index][-2]:
                                # 每行属性名的长度
                                attrName_len = len(data[index][-2].split(';'))
                                # 每行属性名对应的ids
                                item_arrtNameIds = attrName_ids[0:attrName_len:1]
                                # 每行属性名对应的 属性值ids
                                item_attrValueIds = attrValue_ids[0:attrName_len:1]

                                for index, i in enumerate(item_arrtNameIds):
                                    self.env['product.template.attribute.line'].create({
                                        'product_tmpl_id': id,
                                        'attribute_id': i,
                                        'value_ids': [(6, 0, item_attrValueIds[index])]
                                    })
                                # self.env['product.template'].write()

                                # 删除操作之后的ids
                                del attrName_ids[0: attrName_len]
                                del attrValue_ids[0: attrName_len]

                self._cr.execute('ROLLBACK TO SAVEPOINT import')
                self.pool.reset_changes()
            else:
                # 产品多规格导入
                if model._name == 'product.template':
                    if import_result['ids']:
                        for index, id in enumerate(import_result['ids']):
                            if data[index][-2]:
                                # 每行属性名的长度
                                attrName_len = len(data[index][-2].split(';'))
                                # 每行属性名对应的ids
                                item_arrtNameIds = attrName_ids[0:attrName_len:1]
                                # 每行属性名对应的 属性值ids
                                item_attrValueIds = attrValue_ids[0:attrName_len:1]

                                for index, i in enumerate(item_arrtNameIds):
                                    self.env['product.template.attribute.line'].create({
                                        'product_tmpl_id': id,
                                        'attribute_id': i,
                                        'value_ids': [(6, 0, item_attrValueIds[index])]
                                    })
                                # self.env['product.template'].write()

                                # 删除操作之后的ids
                                del attrName_ids[0: attrName_len]
                                del attrValue_ids[0: attrName_len]

                self._cr.execute('RELEASE SAVEPOINT import')
        except psycopg2.InternalError:
            pass

        # Insert/Update mapping columns when import complete successfully
        if import_result['ids'] and options.get('headers'):
            BaseImportMapping = self.env['base_import.mapping']
            for index, column_name in enumerate(columns):
                if column_name:
                    # Update to latest selected field
                    exist_records = BaseImportMapping.search(
                        [('res_model', '=', self.res_model), ('column_name', '=', column_name)])
                    if exist_records:
                        exist_records.write({'field_name': fields[index]})
                    else:
                        BaseImportMapping.create({
                            'res_model': self.res_model,
                            'column_name': column_name,
                            'field_name': fields[index]
                        })

        return import_result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容