コード例 #1
0
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def check_col_index_match_xl_title_for_a_field(field_attr, xl_title, col_index,
                                               set_val, key_tram, needdata,
                                               field_name, func):
    #         if field_attr.get('model'):
    #             if (xl_title or col_index):
    #                 raise UserError(u'có model thì không cần xl title')

    if xl_title and col_index == None and set_val == None:
        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'có khai báo xl_title nhưng không match với file excel, field: %s, xl_title: %s -- attr%s' %(field_name,xl_title,field_attr))
            raise UserError(
                _(u'Excel not has column one in %s of %s, please change column name match with them'
                  ) % (xl_title, field_name))
    if xl_title == None and col_index == None and set_val == None:
        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
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def add_col_index(MODEL_DICT, read_excel_value_may_be_title, col, key_tram):

    is_map_xl_title = False
    for field, field_attr in MODEL_DICT.get('fields').items():
        is_real_xl_match_with_xl_excel = False
        xl_title = get_key(field_attr, 'xl_title')
        if get_key(field_attr, 'set_val') != None:
            continue
        if xl_title == None and get_key(field_attr, 'col_index') != None:
            continue  # cos col_index
        elif field_attr.get('fields'):
            is_real_xl_match_with_xl_excel = add_col_index(
                field_attr, read_excel_value_may_be_title, col, key_tram)
        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
                #                 xl_title_partern = xl_title_partern.replace('/','//').replace('(','/(').replace(')','/)')
                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_attr['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
コード例 #3
0
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def xuat_het_dac_tinh(COPY_MODEL_DICT, key_tram, dac_tinhs={}):
    fields = COPY_MODEL_DICT['fields']
    for field, field_attr in fields.items():
        for attr, val in field_attr.items():
            a_dt_list = dac_tinhs.setdefault(attr, [])
            val = get_key(field_attr, attr)
            if val not in a_dt_list:
                a_dt_list.append(val)
        if 'fields' in field_attr:
            xuat_het_dac_tinh(field_attr, key_tram, dac_tinhs)
コード例 #4
0
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def recursive_add_model_name_to_field_attr(self, MODEL_DICT, key_tram=False):
    model_name = get_key(MODEL_DICT, 'model')
    fields = self.env[model_name]._fields
    for f_name, field_attr in MODEL_DICT.get('fields').items():
        f_name = get_key(field_attr, 'transfer_name') or f_name
        skip_this_field = get_key(field_attr, 'skip_this_field', False)
        if callable(skip_this_field):
            skip_this_field = skip_this_field(self)
        if not skip_this_field:
            if f_name not in fields and not field_attr.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_attr))
            if not field_attr.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_attr['field_type'] = field.type
                if field.comodel_name:
                    field_attr['model'] = field.comodel_name

                if 'required' not in field_attr:
                    required_from_model = field.required
                    required_force = field_attr.get('required_force', None)
                    #                 bypass_this_field_if_value_equal_False = field_attr.get('bypass_this_field_if_value_equal_False')  # nó tự default là gì đó
                    #                 if bypass_this_field_if_value_equal_False:
                    #                     required = False
                    #                 else:
                    if required_force:
                        required = True
                    else:
                        required = required_from_model
                    field_attr['required'] = required
            if field_attr.get('fields'):
                recursive_add_model_name_to_field_attr(self,
                                                       field_attr,
                                                       key_tram=key_tram)
コード例 #5
0
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def check_col_index_match_xl_title(self, COPY_MODEL_DICT, key_tram, needdata):
    for field_name, field_attr in COPY_MODEL_DICT.get('fields').items():
        skip_this_field = get_key(field_attr, 'skip_this_field', False)
        if callable(skip_this_field):
            skip_this_field = skip_this_field(self)
        if not skip_this_field:
            col_index = get_key(field_attr, 'col_index', None)
            xl_title = get_key(
                field_attr,
                'xl_title')  #moi them , moi bo field_attr.get('xl_title')
            ###  deal set_val ########
            set_val = get_key(field_attr, 'set_val')
            if callable(set_val):
                set_val = set_val(self)
            field_attr['set_val'] = set_val
            func = get_key(field_attr, 'func')
            check_col_index_match_xl_title_for_a_field(field_attr, xl_title,
                                                       col_index, set_val,
                                                       key_tram, needdata,
                                                       field_name, func)
            child_fields = field_attr.get('fields')
            if child_fields:
                check_col_index_match_xl_title(self, field_attr, key_tram,
                                               needdata)
コード例 #6
0
ファイル: recursive_func.py プロジェクト: tu95ctv/duan_mi
def write_get_or_create_title(model_dict, sheet, sheet_of_copy_wb, title_row,
                              key_tram):
    fields = model_dict['fields']
    #     print ('fields',fields)
    for fname, attr in fields.items():
        #         childrend_model_dict =  attr
        #         childrend_fields = attr.get('fields')
        if attr.get('fields'):
            write_get_or_create_title(attr, sheet, sheet_of_copy_wb, title_row,
                                      key_tram)
        offset_write_xl = get_key(attr, 'offset_write_xl')
        if offset_write_xl != None:
            col = sheet.ncols + offset_write_xl
            title = attr.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)
コード例 #7
0
ファイル: get_or_create_func.py プロジェクト: tu95ctv/duan_mi
def get_or_create_object_sosanh(self, class_name, search_dict,
                                write_dict ={},is_must_update=False, noti_dict=None,
                                inactive_include_search = False,
                                model_dict = {},
                                key_tram = None,
#                                 only_search = False,
                                exist_val=False,
#                                 search_func_para={},
                                setting = {},
                                check_file=False,
                                is_search = True,
                                is_create = True,
                                is_write = True,
#                                 instance_some_dict={}
                                ):
    search_dict_new = {}
    write_dict_new = {}
    if noti_dict !=None:
        this_model_noti_dict = noti_dict.setdefault(class_name,{})
    
#     is_search = True
    
#     if only_search:
#         is_create = False
#         is_write = False
#         
#     else:
#         if exist_val:
#             is_create = False
#             is_write = True
#         else:
#             is_create = True
#             is_write = True
    
    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(model_dict,self,exist_val,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 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 only_search and val == None:
#                     return None,None
                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  :  
        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_attr = model_dict['fields'][f_name]
                f_name = get_key(field_attr, 'transfer_name') or f_name

                if 'write_field' in field_attr and field_attr['write_field'] != None :
                    write_field = field_attr['write_field']
                else:
                    write_field = allow_write_all_field
                
                
#                 allow_write_from_False_to_not_false = field_attr.get('allow_write_from_False_to_not_false',True)   
                allow_write_from_False_to_not_false = field_attr.get('allow_write_from_False_to_not_false')   if 'allow_write_from_False_to_not_false' in field_attr else setting['allow_write_from_False_to_not_false']
                if allow_write_all_field and write_field == False and val ==False:
                    if  allow_write_from_False_to_not_false:
                        write_field = True
                print ('class_name',write_field)

               
                write_func = field_attr.get('write_func')
                if write_func:
                    code = write_func(searched_object=searched_object, f_name=f_name,val=val)
                    if code =='continue':
                        continue
                raise_if_diff = field_attr.get('raise_if_diff')
                if raise_if_diff:
                    if  val==False and allow_write_from_False_to_not_false: 
                        raise_if_diff = False
                    else:
                        raise_if_diff_only_write =  field_attr.get('raise_if_diff_only_write',True)
                        if raise_if_diff_only_write:
                            raise_if_diff = field_attr.get('raise_if_diff') and write_field
                            
                            
                if not (write_field or raise_if_diff) :
                    print ('field_name',f_name,'continue')
                    continue
                if not is_must_update or raise_if_diff :
                    orm_field_val = getattr(searched_object, f_name)
                    diff = check_diff_write_val_with_exist_obj(orm_field_val,val)
                    if diff:
                        if raise_if_diff:
                            raise UserError(u'raise_if_diff model:%s-f_name:%s - orm_field_val: %s -  val:%s '%(class_name,f_name,orm_field_val,val))
                        if write_field:
                            write_dict_new[f_name] = val
                        
                else:
                    write_dict_new[f_name] = val
            
            if write_dict_new:
                if model_dict.get('print_write_dict_new',False):
                    print ('***write_dict_new***',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)