コード例 #1
0
def check_col_index_match_xl_title_for_a_field(field_attr, xl_title, col_index,
                                               set_val, needdata, field_name,
                                               func):
    #         if col_index or set_val or func:
    #             pass
    if xl_title and set_val:
        raise UserError("xl_title and set_val")
    if set_val == None:
        if col_index == None:
            if xl_title:  # không match
                sheet_allow_this_field_not_has_exel_col = get_key(
                    field_attr, 'sheet_allow_this_field_not_has_exel_col')
                skip_field_if_not_found_column_in_some_sheet = get_key(
                    field_attr, 'skip_field_if_not_found_column_in_some_sheet')

                skip_if_not_match = skip_field_if_not_found_column_in_some_sheet or (
                    sheet_allow_this_field_not_has_exel_col
                    and needdata['sheet_name']
                    in sheet_allow_this_field_not_has_exel_col)
                if not skip_if_not_match:
                    raise UserError(
                        _(u'Excel not has column one in %s of %s, please change column name match with them'
                          ) % (xl_title, field_name))
            else:

                if field_attr.get('model'):
                    if not func and not field_attr.get('fields'):
                        raise UserError(
                            u'model thì phải có ít nhất func và fields')
                else:
                    if not func:
                        raise UserError(
                            u' sao khong có col_index và  không có func luôn field %s attrs %s'
                            % (field_name, u'%s' % field_attr))
コード例 #2
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def replace_val_for_ci(field_attr, val, needdata):

    #### deal replace string ####
    replace_string = get_key(field_attr, 'replace_string')
    if replace_string and check_is_string_depend_python_version(val):
        for pattern, repl in replace_string:
            pattern = pattern.replace('(', '\(').replace(')', '\)')
            val = re.sub(pattern, repl, val)
    #### end  deal replace string ####

    #### deal empty val ###
    empty_val = get_key(field_attr, 'empty_val')

    if empty_val and val in empty_val:
        val = False
    #### !!!deal empty val ###

    #### deal  replace val#####
    replace_val = get_key(field_attr, 'replace_val')
    if replace_val:
        replace_val_tuple = replace_val.get(
            needdata['sheet_name']) or replace_val.get('all')
        if replace_val_tuple:
            for k, v in replace_val_tuple:
                if val == k:
                    val = v
                    break
    #### !!!deal  replace val#####

    ### deal defautl ###

    ### !!!!deal defautl ###SS
    return val
コード例 #3
0
def write_get_or_create_title(MD,
                              sheet,
                              sheet_of_copy_wb,
                              title_row,
                              fname=None):
    offset_write_xl = get_key(MD, 'offset_write_xl')
    offset_write_xl_diff = get_key(MD, 'offset_write_xl_diff')
    offset_write_xl_for_searched_obj = get_key(
        MD, 'offset_write_xl_for_searched_obj')
    check_file_write_more = get_key(MD, 'check_file_write_more')
    fname = fname or MD.get('model')
    sheet_ncols = sheet.ncols
    for k, v in [(offset_write_xl, u' có sẵn hay phải tạo'),
                 (offset_write_xl_for_searched_obj, u'theo cách tìm'),
                 (offset_write_xl_diff,
                  u'ở excel giống hay khác trong database')]:
        asmall_func(MD, fname, sheet_ncols, k, sheet_of_copy_wb, title_row, v)

    if check_file_write_more:
        for more_offset, func, more_title in check_file_write_more:
            col = sheet.ncols + more_offset
            title = more_title
            sheet_of_copy_wb.col(col).width = get_width(len(title))
            sheet_of_copy_wb.write(title_row, col, title, header_bold_style)

    if MD.get('fields'):
        for fname, field_MD in MD.get('fields').items():
            write_get_or_create_title(field_MD, sheet, sheet_of_copy_wb,
                                      title_row, fname)
コード例 #4
0
def add_col_index(MD, read_excel_value_may_be_title, col):
    is_map_xl_title = False
    for fname, field_MD in MD.get('fields').items():
        is_real_xl_match_with_xl_excel = False
        xl_title = get_key(field_MD, 'xl_title')
        if get_key(field_MD, 'set_val') != None:
            continue
        if xl_title == None and get_key(field_MD, 'col_index') != None:
            continue  # cos col_index
        elif field_MD.get('fields'):
            is_real_xl_match_with_xl_excel = add_col_index(
                field_MD, read_excel_value_may_be_title, col)
        elif xl_title:
            if isinstance(xl_title, list):
                xl_title_s = xl_title
            else:
                xl_title_s = [xl_title]
            for xl_title in xl_title_s:
                xl_title_partern = u'^%s$' % xl_title
                xl_title_partern = xl_title_partern.replace(
                    '\\', '\\\\').replace('(', '\(').replace(')', '\)')
                is_map = re.search(xl_title_partern,
                                   read_excel_value_may_be_title,
                                   re.IGNORECASE)
                is_map = is_map or (xl_title == read_excel_value_may_be_title)
                if is_map:
                    field_MD['col_index'] = col
                    is_real_xl_match_with_xl_excel = True
        is_map_xl_title = is_map_xl_title or is_real_xl_match_with_xl_excel
    return is_map_xl_title  #or is_map_xl_title_foreinkey
コード例 #5
0
def check_compatible_col_index_and_xl_title_for_a_field(
        field_attr, xl_title, col_index, set_val, needdata, field_name, func):
    #         if col_index or set_val or func:
    #             pass
    if xl_title and set_val:
        raise UserError("xl_title and set_val")
    if set_val != None:
        return True
    if col_index == None:
        if xl_title:  # có kê xl_title nhưng mà không match
            sheet_allow_this_field_not_has_exel_col = get_key(
                field_attr, 'sheet_allow_this_field_not_has_exel_col')
            allow_not_match_xl_title = get_key(field_attr,
                                               'allow_not_match_xl_title')
            skip_if_not_match = allow_not_match_xl_title or (
                sheet_allow_this_field_not_has_exel_col
                and needdata['sheet_name']
                in sheet_allow_this_field_not_has_exel_col)
            if not skip_if_not_match:
                raise UserError(
                    _(u'Excel has not column  in "[%s]" of %s, please change column name match with them'
                      ) % (xl_title, field_name))
        else:
            if field_attr.get('model'):
                if not func and not field_attr.get('fields'):
                    raise UserError(
                        u'model thì phải có ít nhất func và fields: %s-%s' %
                        (field_name, field_attr))
            else:
                if not func:
                    raise UserError(
                        u'Sao không có col_index và không có func luôn field %s attrs %s'
                        % (field_name, u'%s' % field_attr))
コード例 #6
0
def add_more_attrs_to_field_MD(self,
                               MD,
                               field_stt=0,
                               setting={}):  # add x2m_fields
    model_name = get_key(MD, 'model')
    OBJ = self.env[model_name]
    fields = OBJ._fields
    default_dict = OBJ.default_get(fields)

    for f_name, field_MD in MD.get('fields').items():
        field_stt += 1
        f_name = get_key(field_MD, 'transfer_name') or f_name
        skip_this_field = get_key(field_MD, 'skip_this_field', False)
        if not skip_this_field:
            if f_name not in fields and not field_MD.get('for_excel_readonly'):
                raise UserError(
                    u'f_name:"%s" không nằm trong fields, phải thêm thược tính for_excel_readonly-field_attr:%s'
                    % (f_name, field_MD))
            st_write_false = setting['st_write_false']
            write_false = field_MD[
                'write_false'] if 'write_false' in field_MD else st_write_false
            field_MD['write_false'] = write_false
            field_MD['field_stt'] = field_stt
            write_field = field_MD.get(
                'write_field',
                DEFAULT_VAL_DICT_OF_ATTR.get('write_field').get(
                    'default_value'))
            field_MD['write_field'] = write_field
            if not field_MD.get(
                    'for_excel_readonly'):  # and not skip_this_field
                field = fields[f_name]
                field_MD['field_type'] = field.type
                if field.comodel_name:
                    field_MD['model'] = field.comodel_name

                if 'required' not in field_MD:
                    required_from_model = field.required
                    required_force = field_MD.get('required_force', None)
                    required = required_force or required_from_model
                    field_MD['required'] = required

            if f_name in default_dict and field_MD.get('default_val') == None:
                default_val = default_dict[f_name]
                field_MD['default_val'] = default_val
            if field_MD.get('empty_val'):
                partern_empty_val = '^(' + '|'.join(
                    field_MD.get('empty_val')) + ')$'
                field_MD['partern_empty_val'] = partern_empty_val
            if 'st_is_x2m_field' in field_MD:
                x2m_fields = MD.setdefault('x2m_fields', [])
                x2m_fields.append(f_name)
            if field_MD.get('fields'):
                field_stt = add_more_attrs_to_field_MD(self,
                                                       field_MD,
                                                       field_stt=field_stt,
                                                       setting=setting)
    return field_stt
コード例 #7
0
def check_compatible_col_index_and_xl_title(self, MD, needdata):
    for fname, field_MD in MD.get('fields').items():
        skip_this_field = get_key(field_MD, 'skip_this_field', False)
        if not skip_this_field: 
            col_index = get_key(field_MD, 'col_index', None)
            xl_title = get_key(field_MD, 'xl_title')#moi them , moi bo field_attr.get('xl_title')
            set_val = get_key( field_MD,'set_val')
            func = field_MD.get('func')
            check_compatible_col_index_and_xl_title_for_a_field( field_MD, xl_title, col_index, set_val, needdata, fname, func)
            if field_MD.get('fields'):
                check_compatible_col_index_and_xl_title(self, field_MD, needdata)
コード例 #8
0
def search_handle(self, model_dict, search_dict, model_name, setting,
                  needdata):
    search_func = model_dict.get('search_func')
    if search_func:
        searched_obj = search_func(self, model_dict, setting, needdata)
    else:
        if search_dict:
            pass
        else:
            raise UserError(u'Không có search dict, model_name: %s-MD: %s' %
                            (model_name, model_dict))
        if model_dict.get('inactive_include_search'):
            domain_not_active = [
                '|', ('active', '=', True), ('active', '=', False)
            ]
        else:
            domain_not_active = []
        domain = []
        has_none_val_search_field = False
        for f_name in search_dict:
            field_attr = model_dict['fields'][f_name]
            val = search_dict[f_name]
            f_name = get_key(field_attr, 'transfer_name') or f_name
            operator_search = field_attr.get('operator_search', '=')
            tuple_in = (f_name, operator_search, val)
            domain.append(tuple_in)
        if not has_none_val_search_field:
            domain = expression.AND([domain_not_active, domain])
            searched_obj = self.env[model_name].search(domain)
    return searched_obj
コード例 #9
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def after_ci(setting, exist_val, field_attr, check_file, sheet_of_copy_wb, row,
             sheet, get_or_create, obj, noti_dict):
    if exist_val:
        func_check_if_excel_is_same_existence = setting.get(
            'st_allow_check_if_excel_is_same_existence') and field_attr.get(
                'func_check_if_excel_is_same_existence')
        if func_check_if_excel_is_same_existence:  # and not get_or_create:,not st_is_allow_write_existence and
            func_check_if_excel_is_same_existence(get_or_create, obj,
                                                  exist_val)
        val = exist_val.id
        obj = exist_val
        get_or_create = True
        this_model_notice = noti_dict.setdefault(field_attr.get('model'), {})
        this_model_notice['exist_val'] = this_model_notice.get('exist_val',
                                                               0) + 1
    field_attr['get_or_create'] = get_or_create

    if check_file:
        #             if val ==False or val ==None:
        #                 val = None
        offset_write_xl = get_key(field_attr, 'offset_write_xl')
        if offset_write_xl != None:
            if get_or_create:
                get_or_create_display = u'Đã Có'
            else:
                if field_attr['fields']['name']['val'] != False:
                    get_or_create_display = u'Chưa'
                else:
                    get_or_create_display = u'empty cell'
            sheet_of_copy_wb.write(row, sheet.ncols + offset_write_xl,
                                   get_or_create_display,
                                   wrap_center_vert_border_style)
コード例 #10
0
def write_handle(self,
                 return_obj,
                 MD,
                 write_dict,
                 new_noti_dict,
                 f_name_call=False):
    write_dict_new = {}
    writed_object = return_obj
    for key_f_name, val in write_dict.items():
        field_MD = MD['fields'][key_f_name]
        if field_MD.get('val_goc') != False or field_MD.get(
                'write_false', False):
            f_name = get_key(field_MD, 'transfer_name') or key_f_name
            is_write_this_field = field_MD['write_field']
            if is_write_this_field:
                orm_field_val = getattr(writed_object, f_name)
                func_in_write_handle = field_MD.get('func_in_write_handle')
                if func_in_write_handle:
                    val = func_in_write_handle(orm_field_val, val)
                is_x2m = field_MD.get('x2m_fields', False)
                diff = check_diff_write_val_with_exist_obj(
                    orm_field_val, val, field_MD, is_x2m)
                if diff:
                    if is_write_this_field:
                        write_dict_new[f_name] = val
    if write_dict_new:
        writed_object.write(write_dict_new)
        new_noti_dict['update'] = 1
        if f_name_call == 'main_call':
            print('**write_dict_new', write_dict_new)
    else:  #'not update'
        new_noti_dict['skipupdate'] = 1
コード例 #11
0
def add_more_attrs_to_field_MD_after_add_col_index(self, MD, field_stt = 0, setting={}):# add x2m_fields
    for f_name, field_MD in MD.get('fields').items():
#         f_name = get_key(field_MD, 'transfer_name') or  f_name
        skip_this_field = get_key(field_MD, 'skip_this_field',False)
        if not skip_this_field:
            set_col_index = field_MD.get('set_col_index')
            if set_col_index != None:
                field_MD['col_index'] = set_col_index
            if field_MD.get('fields'):
                    field_stt = add_more_attrs_to_field_MD(self, field_MD, field_stt =  field_stt, setting=setting)
コード例 #12
0
def write_get_or_create_title(MD, sheet, sheet_of_copy_wb, title_row):
    fields = MD['fields']
    for fname, field_MD in fields.items():
        offset_write_xl = get_key(field_MD, 'offset_write_xl')
        if offset_write_xl != None:
            col = sheet.ncols + offset_write_xl
            title = field_MD.get('string', fname) + u' sẵn hay tạo'
            sheet_of_copy_wb.col(col).width = get_width(len(title))
            sheet_of_copy_wb.write(title_row, col, title, header_bold_style)
        if field_MD.get('fields'):
            write_get_or_create_title(field_MD, sheet, sheet_of_copy_wb,
                                      title_row)
コード例 #13
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def gen_first_last_row(self, MD, row_title_index, nrows, dong_test_in_MD):
    off_set_row = get_key(MD, 'begin_data_row_offset_with_title_row', 1)
    min_row = row_title_index + off_set_row
    first_row = min_row + getattr(self, 'begin_row', 0)
    print('first_row', 'min_row', first_row, min_row)
    dong_test = getattr(self, 'dong_test', None) or dong_test_in_MD
    if not dong_test:
        last_row = nrows
    else:
        last_row = first_row + dong_test
    if last_row > nrows:
        last_row = nrows
    if first_row > last_row:
        raise UserError(u'first_row >  last_row')
    return first_row, last_row
コード例 #14
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def gen_sheet_names(self, MD, xl_workbook, gen_model_dict_kargs):
    sheet_names = get_key(MD, 'sheet_names')
    if callable(sheet_names):
        try:
            sheet_names = sheet_names(self)
        except TypeError as e:
            if 'required positional argument' in u'%s' % e:
                try:
                    sheet_names = sheet_names(self, xl_workbook)
                except TypeError as e:
                    if 'required positional argument' in u'%s' % e:
                        sheet_names = sheet_names(self, xl_workbook,
                                                  gen_model_dict_kargs)
                    else:
                        raise UserError(u'có 1 lỗi ở hàm sheet_names: %s ' % e)
            else:
                raise UserError(u'có 1 lỗi ở hàm sheet_names: %s ' % e)
    return sheet_names
コード例 #15
0
def create_handle(self, search_dict, write_dict, MD, model_name, f_name_call):
    search_dict_new = {}
    allow_create = MD.get('allow_create', True)
    if not allow_create:
        if MD.get('BreakRowException_if_raise_allow_create'):
            raise BreakRowException(
                u'Model %s này với giá trị f_name_call:%s, name: "%s" chỉ được get chứ không được tạo, hãy tạo tay hoặc chọn thuộc tính BreakRowException_if_raise_allow_create để bỏ qua thông báo này'
                % (model_name, f_name_call, MD['fields']['name']['val']))
        else:
            raise UserError(
                u'Model %s này với giá trị f_name_call:%s,  name: "%s" chỉ được get chứ không được tạo, hãy tạo tay hoặc chọn thuộc tính BreakRowException_if_raise_allow_create để bỏ qua thông báo này'
                % (model_name, f_name_call, MD['fields']['name']['val']))
    search_dict.update(write_dict)
    for f_name, val in search_dict.items():
        field_attr = MD['fields'][f_name]
        f_name = get_key(field_attr, 'transfer_name') or f_name
        search_dict_new[f_name] = val
    created_object = self.env[model_name].create(search_dict_new)
    return_obj = created_object
    return return_obj
コード例 #16
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def xac_dinh_title_rows(self, MD, set_is_largest_map_row_choosing, nrows,
                        sheet_name):
    range_1 = getattr(self, 'range_1', None)
    range_2 = getattr(self, 'range_2', None)

    if range_1 or range_2:
        title_rows = range(range_1, range_2)
    else:

        if set_is_largest_map_row_choosing:
            title_rows = range(0, nrows)
        else:
            title_rows_some_sheets = MD.get('title_rows_some_sheets', {})
            if title_rows_some_sheets:
                title_rows_some_sheets = title_rows_some_sheets.get(sheet_name)
            if title_rows_some_sheets:
                title_rows = title_rows_some_sheets
            else:
                title_rows = get_key(MD,
                                     'title_rows')  # MODEL_DICT['title_rows']
    return title_rows
コード例 #17
0
def create_handle(self, search_dict, write_dict, MD, model_name, f_name_call,
                  is_x2m_fields):
    search_dict_new = {}
    context = MD.get('context', {})
    allow_create = MD.get('allow_create', True)
    if not allow_create:
        if getattr(self, 'BreakRowException_if_raise_allow_create'):
            raise BreakRowException(
                u'Model %s này với giá trị f_name_call:%s, name: "%s" chỉ được get chứ không được tạo'
                % (model_name, f_name_call, MD['fields']['name']['val']))
        else:
            raise UserError(
                u'Model %s này với giá trị f_name_call:%s,  name: "%s" chỉ được get chứ không được tạo, hãy tạo tay hoặc chọn thuộc tính BreakRowException_if_raise_allow_create để bỏ qua thông báo này'
                % (model_name, f_name_call, MD['fields']['name']['val']))


#     search_dict.update(write_dict)
    write_dict.update(search_dict)
    for f_name, val in write_dict.items():
        field_attr = MD['fields'][f_name]
        f_name = get_key(field_attr, 'transfer_name') or f_name
        delete_when_return_x2m_create_if_false = field_attr.get(
            'delete_when_return_x2m_create_if_false', False)
        if not delete_when_return_x2m_create_if_false:

            search_dict_new[f_name] = val
    if is_x2m_fields and not CREATE_IN_M2X:
        #         for i in search_dict:
        #             delete_when_return_x2m_create_if_false = MD.get('delete_when_return_x2m_create_if_false',False)
        #             if delete_when_return_x2m_create_if_false:

        return search_dict_new

    created_object = self.env[model_name].sudo().with_context(
        **context).create(search_dict_new)
    return_obj = created_object
    return return_obj
コード例 #18
0
def get_or_create_object_sosanh(self,
                                class_name,
                                search_dict,
                                write_dict={},
                                noti_dict=None,
                                inactive_include_search=False,
                                model_dict={},
                                exist_val=False,
                                setting={},
                                check_file=False,
                                is_search=True,
                                is_create=True,
                                is_write=True,
                                sheet_of_copy_wb_para=None):
    search_dict_new = {}
    write_dict_new = {}
    if noti_dict != None:
        this_model_noti_dict = noti_dict.setdefault(class_name, {})

    if is_search:
        this_model_noti_dict['search'] = this_model_noti_dict.get('search',
                                                                  0) + 1
        search_func = model_dict.get('search_func')

        if search_func:
            searched_object = search_func(self, model_dict, setting)
            if not searched_object and is_create:

                for f_name in search_dict:
                    field_attr = model_dict['fields'][f_name]
                    val = search_dict[f_name]
                    f_name = get_key(field_attr, 'transfer_name') or f_name
                    search_dict_new[f_name] = val
        else:
            if search_dict:
                pass
            else:
                raise UserError(
                    u'Không có Key search dict, model_name%s----MD%s' %
                    (class_name, model_dict))
            if inactive_include_search:
                domain_not_active = [
                    '|', ('active', '=', True), ('active', '=', False)
                ]
            else:
                domain_not_active = []

            domain = []
            break_condition = False

            for f_name in search_dict:
                field_attr = model_dict['fields'][f_name]
                val = search_dict[f_name]
                if val == None:
                    if check_file:
                        searched_object, get_or_create = None, False
                        break_condition = True
                        break
                    else:
                        raise UserError(u'val không thể bằng None')
                f_name = get_key(field_attr, 'transfer_name') or f_name
                operator_search = field_attr.get('operator_search', '=')
                tuple_in = (f_name, operator_search, val)
                domain.append(tuple_in)
                if is_create:
                    search_dict_new[f_name] = val

            if not break_condition:
                domain = expression.AND([domain_not_active, domain])
                searched_object = self.env[class_name].search(domain)

        return_obj = searched_object
        get_or_create = bool(searched_object)
        if get_or_create:
            this_model_noti_dict['search_yes'] = this_model_noti_dict.get(
                'search_yes', 0) + 1
        else:
            this_model_noti_dict['search_no'] = this_model_noti_dict.get(
                'search_no', 0) + 1
    else:
        return_obj = None
        get_or_create = None

    if is_create:
        if not searched_object:  #create
            only_get = get_key(model_dict, 'only_get')
            if only_get:
                raise UserError(
                    u'Model %s này chỉ được get chứ không được tạo' %
                    class_name)
            for f_name, val in write_dict.items():
                field_attr = model_dict['fields'][f_name]
                f_name = get_key(field_attr, 'transfer_name') or f_name
                search_dict_new[f_name] = val
            created_object = self.env[class_name].create(search_dict_new)

            this_model_noti_dict['create'] = this_model_noti_dict.get(
                'create', 0) + 1

            return_obj = created_object
            return return_obj, get_or_create
    allow_write_all_field = setting['allow_write']
    if is_write or check_file:
        if exist_val:
            searched_object = exist_val
        if searched_object:  # write
            if len(searched_object) > 1:
                raise UserError(
                    u' exist_val: %s len(searched_object) > 1, searched_object: %s'
                    % (exist_val, searched_object))

            for f_name, val in write_dict.items():
                field_MD = model_dict['fields'][f_name]
                if check_file and field_MD.get('offset_write_xl') == None:
                    continue
                if not check_file and (field_attr.get('val_goc') == False
                                       and not field_attr.get('write_false')):
                    continue

                f_name = get_key(field_attr, 'transfer_name') or f_name
                if check_file:
                    is_write_this_field = False
                else:
                    is_write_this_field = field_attr.get('write_field')
                    is_write_this_field = allow_write_all_field if is_write_this_field == None else is_write_this_field
                if not check_file and not is_write_this_field:
                    continue
                orm_field_val = getattr(searched_object, f_name)
                diff = check_diff_write_val_with_exist_obj(
                    orm_field_val, val, field_attr)
                if diff:
                    if is_write_this_field:
                        write_dict_new[f_name] = val
                    if check_file:
                        diff_show = 'Khac orm:%s-dict:%s' % (orm_field_val,
                                                             val)
                else:
                    if check_file:
                        diff_show = 'Giong orm:%s-dict:%s' % (orm_field_val,
                                                              val)
                if check_file:
                    sheet_of_copy_wb = sheet_of_copy_wb_para[
                        'sheet_of_copy_wb']
                    sheet_of_copy_wb.write(
                        sheet_of_copy_wb_para['row'],
                        sheet_of_copy_wb_para['sheet'].ncols +
                        field_MD.get('offset_write_xl'), diff_show,
                        wrap_center_vert_border_style)
            if write_dict_new:
                searched_object.write(write_dict_new)
                this_model_noti_dict['update'] = this_model_noti_dict.get(
                    'update', 0) + 1
            else:  #'not update'
                this_model_noti_dict['skipupdate'] = this_model_noti_dict.get(
                    'skipupdate', 0) + 1

    return return_obj, get_or_create  # bool(searched_object)
コード例 #19
0
def add_model_n_type_n_required_to_fields(self,
                                          MD,
                                          field_stt=0,
                                          setting={}):  # add x2m_fields
    model_name = get_key(MD, 'model')
    OBJ = self.env[model_name]
    fields = OBJ._fields
    default_dict = OBJ.default_get(fields)

    for f_name, field_MD in MD.get('fields').items():
        field_stt += 1
        f_name = get_key(field_MD, 'transfer_name') or f_name
        skip_this_field = get_key(field_MD, 'skip_this_field', False)
        if not skip_this_field:
            if f_name not in fields and not field_MD.get('for_excel_readonly'):
                raise UserError(
                    u'f_name:"%s" không nằm trong fields, phải thêm thược tính for_excel_readonly-field_attr:%s'
                    % (f_name, field_MD))

#             bypass_this_field_if_value_equal_False = field_MD.get('bypass_this_field_if_value_equal_False',False)
#             key = field_MD.get('key', False)
#             if key and bypass_this_field_if_value_equal_False:
#                 raise UserError(u'key and bypass_this_field_if_value_equal_False')
            st_write_false = setting['st_write_false']
            write_false = field_MD[
                'write_false'] if 'write_false' in field_MD else st_write_false
            field_MD['write_false'] = write_false
            field_MD['field_stt'] = field_stt

            if not field_MD.get(
                    'for_excel_readonly'):  # and not skip_this_field
                try:
                    field = fields[f_name]
                except:
                    raise UserError(
                        u'field %s không có trong  danh sách fields của model %s'
                        % (f_name, model_name))
                field_MD['field_type'] = field.type
                if field.comodel_name:
                    field_MD['model'] = field.comodel_name

                if 'required' not in field_MD:
                    required_from_model = field.required
                    required_force = field_MD.get('required_force', None)
                    required = required_force or required_from_model
                    field_MD['required'] = required
            default_val = field_MD.get('default_val')

            if f_name in default_dict and default_val == None:
                default_val = default_dict[f_name]
                field_MD['default_val'] = default_val
            if field_MD.get('empty_val'):
                partern_empty_val = '^(' + '|'.join(
                    field_MD.get('empty_val')) + ')$'
                field_MD['partern_empty_val'] = partern_empty_val
            if field_MD.get('fields'):
                field_stt = add_model_n_type_n_required_to_fields(
                    self, field_MD, field_stt=field_stt, setting=setting)

            if 'st_is_x2m_field' in field_MD:
                x2m_fields = MD.setdefault('x2m_fields', [])
                x2m_fields.append(f_name)

    return field_stt
コード例 #20
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def create_instance(
    self,
    MD,
    sheet,
    row,
    merge_tuple_list,
    needdata,
    noti_dict,
    #                     main_call_create_instance_model = False,
    check_file=False,
    sheet_of_copy_wb=False,
    setting={},
    sheet_of_copy_wb_para=None,
    #                     exist_val = False,
    #                     is_search = True,
    #                     is_create = True,
    #                     is_write = True,
):

    key_search_dict = {}
    update_dict = {}
    model_name = MD.get('model')
    collection_dict = {}
    is_create, is_write, is_search, exist_val, is_go_loop_fields = before_ci(
        self, MD, setting, check_file, needdata)
    if is_go_loop_fields:
        for field_name, field_attr in MD['fields'].items():
            a_field_code = get_a_field_val(
                self, field_name, field_attr, needdata, row, sheet, check_file,
                sheet_of_copy_wb, merge_tuple_list, model_name, noti_dict,
                key_search_dict, update_dict, collection_dict, setting,
                sheet_of_copy_wb_para)
            if a_field_code == 'break_out_a_row_because_a_required':
                if field_attr.get('raise_if_False') and not check_file:
                    raise UserError('raise_if_False field: %s' % field_name)
                break
        if a_field_code == 'break_out_a_row_because_a_required':
            #             if main_call_create_instance_model:
            break_condition_func_for_main_instance = get_key(
                MD, 'break_condition_func_for_main_instance')
            if break_condition_func_for_main_instance:
                break_condition_func_for_main_instance(needdata)
            obj = False
            obj_val = False
            get_or_create = None
        elif collection_dict.get(
                'instance_false'
        ):  # có 1 field = false and required ==> instance đó = False
            obj, obj_val, get_or_create = False, False, None

        else:
            obj, obj_val, get_or_create = get_or_create_instance_from_key_search_and_update_dict(
                self,
                model_name,
                key_search_dict,
                update_dict,
                check_file,
                noti_dict,
                MD,
                exist_val=exist_val,
                setting=setting,
                is_search=is_search,
                is_create=is_create,
                is_write=is_write,
                sheet_of_copy_wb_para=sheet_of_copy_wb_para)

#     after_ci(exist_val,func_check_if_excel_is_same_existence, field_attr, check_file, sheet_of_copy_wb, row, sheet, get_or_create, obj, noti_dict)

    if exist_val:
        func_check_if_excel_is_same_existence = setting.get(
            'st_allow_check_if_excel_is_same_existence') and MD.get(
                'func_check_if_excel_is_same_existence')
        if func_check_if_excel_is_same_existence:  # and not get_or_create:,not st_is_allow_write_existence and
            func_check_if_excel_is_same_existence(get_or_create, obj,
                                                  exist_val)
        obj_val = exist_val.id
        obj = exist_val
        get_or_create = True
        this_model_notice = noti_dict.setdefault(MD.get('model'), {})
        this_model_notice['exist_val'] = this_model_notice.get('exist_val',
                                                               0) + 1
    MD['get_or_create'] = get_or_create
    if check_file:
        #             if val ==False or val ==None:
        #                 val = None
        offset_write_xl = get_key(MD, 'offset_write_xl')
        if offset_write_xl != None:
            if get_or_create:
                get_or_create_display = u'Đã Có'
            elif get_or_create == None:
                get_or_create_display = u'None'

            else:
                if 'name' not in MD['fields']:
                    get_or_create_display = u'Chưa'
                else:
                    if MD['fields']['name']['val'] != False:
                        get_or_create_display = u'Chưa'
                    else:
                        get_or_create_display = u'empty cell'
            sheet_of_copy_wb.write(row, sheet.ncols + offset_write_xl,
                                   get_or_create_display,
                                   wrap_center_vert_border_style)
    #     if check_file:
    #         if obj_val == False:
    #             obj_val = None
#     last_record_function = get_key(MD, 'last_record_function')
#     if last_record_function:
#         last_record_function(needdata, self)
    return obj, obj_val, get_or_create
コード例 #21
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def get_a_field_val(
        self,
        field_name,
        field_attr,
        needdata,
        row,
        sheet,
        check_file,
        sheet_of_copy_wb,
        merge_tuple_list,
        model_name,
        noti_dict,
        key_search_dict,
        update_dict,
        #                                    x2m_fields,
        collection_dict,
        setting,
        sheet_of_copy_wb_para):
    skip_this_field = get_key(field_attr, 'skip_this_field', False)
    if callable(skip_this_field):
        skip_this_field = skip_this_field(self)
    if skip_this_field:
        return 'continue'
    col_index = get_key(field_attr, 'col_index')
    func = get_key(field_attr, 'func')
    #F11
    obj, val = read_val_for_ci(self,
                               field_attr,
                               check_file,
                               needdata,
                               noti_dict,
                               setting,
                               excel_para={
                                   'col_index': col_index,
                                   'sheet': sheet,
                                   'row': row,
                                   'merge_tuple_list': merge_tuple_list,
                                   'sheet_of_copy_wb': sheet_of_copy_wb
                               },
                               for_print_para={
                                   'model_name': model_name,
                                   'field_name': field_name
                               },
                               sheet_of_copy_wb_para=sheet_of_copy_wb_para)

    field_attr['before_func_val'] = val
    # func
    karg = get_key(field_attr, 'karg', {})
    if karg == None:
        karg = {}
    func_pre_func = field_attr.get('func_pre_func')
    if func_pre_func:
        val = func_pre_func(val, needdata, self)
    if func:
        try:
            val = func(val, needdata, **karg)
        except TypeError:
            try:
                val = func(val, needdata, self, **karg)
            except TypeError:
                val = func(val, **karg)
#         print ('func read model_name:%s field_name:%s'%(model_name,field_name),'val',val)

    val = replace_val_for_ci(field_attr, val, needdata)
    field_attr['val_goc'] = val
    if val == False:
        default_val = field_attr.get('default_val')
        if default_val != None:
            val = default_val
    if field_attr.get('field_type') == 'float':
        val = float_round(val, precision_rounding=0.01)

    field_attr['val'] = val
    field_attr['obj'] = obj
    if check_file:
        required_when_normal = get_key(field_attr, 'required', False)
        required = get_key(field_attr, 'required_when_check_file',
                           required_when_normal)
        if (required_when_normal and val == False) and required == False:
            collection_dict['instance_false'] = True
    else:
        required = get_key(field_attr, 'required', False)

    key_or_not = field_attr.get('key')
    if '2many' in field_attr.get('field_type', '') and val == False:
        a_field_code = 'continue'
        return a_field_code
    if required and (val == False and isinstance(
            val, bool)):  # val ==False <==> val ==0, val ==0 <==> val =False
        this_model_notice = noti_dict.setdefault(model_name, {})
        skip_because_required = this_model_notice.setdefault(
            'skip_because_required', 0)
        this_model_notice['skip_because_required'] = skip_because_required + 1
        a_field_code = 'break_out_a_row_because_a_required'
        return a_field_code  #sua 5
    elif not field_attr.get('for_excel_readonly'):
        if key_or_not == True:
            key_search_dict[field_name] = val
        elif key_or_not == 'Both':
            key_search_dict[field_name] = val
            update_dict[field_name] = val
        else:
            update_dict[field_name] = val
    valid_field_func = field_attr.get('valid_field_func')
    if valid_field_func:
        valid_field_func(val, obj, needdata, self)
    print("row: ", row, 'model_name: ', model_name, '-field: ', field_name,
          '-val: ', val)
    check_type_of_val(field_attr, val, field_name, model_name)
    a_field_code = False
    return a_field_code
コード例 #22
0
ファイル: tao_instance_new.py プロジェクト: tu95ctv/duan_mi2
def read_val_for_ci(self,
                    field_attr,
                    check_file,
                    needdata,
                    noti_dict,
                    setting,
                    excel_para={},
                    for_print_para={},
                    sheet_of_copy_wb_para=None):
    col_index = excel_para['col_index']
    sheet = excel_para['sheet']
    row = excel_para['row']
    merge_tuple_list = excel_para['merge_tuple_list']
    sheet_of_copy_wb = excel_para['sheet_of_copy_wb']
    val = False
    obj = False
    set_val = get_key(field_attr, 'set_val')
    if set_val != None:
        val = set_val

    elif col_index != None:  # đọc file exc
        xl_val = read_excel_cho_field(sheet, row, col_index, merge_tuple_list)
        xl_val = empty_string_to_False(xl_val)
        field_attr['excel_val'] = xl_val
        val = empty_string_to_False(xl_val)
        if field_attr.get('partern_empty_val'):
            val = empty_string_to_False(val,
                                        pt=field_attr.get('partern_empty_val'))

        if val != False and field_attr.get('st_is_x2m_field'):
            val = val.split(',')
            val = list(map(lambda i: empty_string_to_False(i.strip()), val))
            if False in val:
                raise UserError(u'Không được có phần tử = False')
        print(
            'excel read model_name:%s field_name:%s' %
            (for_print_para['model_name'], for_print_para['field_name']),
            'xl_val', xl_val, 'val', xl_val)

    elif field_attr.get('fields'):
        #         before_ci()
        obj, val, get_or_create = create_instance(
            self,
            field_attr,
            sheet,
            row,
            merge_tuple_list,
            needdata,
            noti_dict,
            check_file=check_file,
            sheet_of_copy_wb=sheet_of_copy_wb,
            #                                                                 exist_val = exist_val,
            setting=setting,
            sheet_of_copy_wb_para=sheet_of_copy_wb_para
            #                                                                 is_search = is_search,
            #                                                                 is_create = is_create,
            #                                                                 is_write = is_write,
        )


#         after_ci()

    return obj, val