# -*- coding: utf-8 -*- from xmlrpc import client url = 'http://localhost:8069' db = 'ospp_cloud_dev_1' # 数据库 username = 'admin' password = 'admin' # 密码 common = client.ServerProxy('{}/xmlrpc/2/common'.format(url)) uid = common.authenticate(db, username, password, {}) models = client.ServerProxy('{}/xmlrpc/2/object'.format(url)) def fields_get(model): fields = models.execute_kw( db, uid, password, '%s' % model, 'fields_get', [], {'attributes': ['string', 'help', 'type', 'relation']}) return fields def fields_map(model, l=[], i=0): """ 以输入的模型参数为起点,遍历返回所有的many2one模型 :param model: :param l: :param i: :return: """ print(l) fields = fields_get(model) i += 1 print(i, l) for key, value in fields.items(): if value.get('type') == 'many2one': print(key) if value.get('relation') and value.get( 'relation') not in l and 'ir.' not in value.get('relation'): print(value.get('relation')) print(value.get('relation') not in l) l.append(value.get('relation')) fields_map(value.get('relation'), l, i) return l def models_get(model): """ 以输入的模型(基础模型)参数为起点,遍历返回基础的many2one, many2many, one2many等相关模型(一级模型)以及这些相关模型的many2one, many2many, one2many的相关模型(二级模型) :param model: :return: """ models_base = [model] models_many2one = [] models_many2one_l = [] models_many2many = [] models_many2many_l = [] models_one2many = [] models_one2many_l = [] fields = fields_get(model) for key, value in fields.items(): if key in [ 'write_uid', 'create_uid', 'id', 'write_date', 'create_date', 'display_name', '__last_update']: pass elif value.get('type') == 'many2one' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_many2one.append(value.get('relation')) elif value.get('type') == 'many2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_many2many.append(value.get('relation')) elif value.get('type') == 'one2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_one2many.append(value.get('relation')) else: pass for model in models_many2one: fields = fields_get(model) for key, value in fields.items(): if value.get('type') == 'many2one' and 'ir.' not in value.get( 'relation') and 'mail.' not in value.get('relation'): models_many2one_l.append(value.get('relation')) elif value.get('type') == 'many2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_many2many_l.append(value.get('relation')) elif value.get('type') == 'one2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_one2many_l.append(value.get('relation')) else: pass for model in models_many2many: fields = fields_get(model) for key, value in fields.items(): if value.get('type') == 'many2one' and value.get('relation') not in models_many2one and 'ir.' not in value.get( 'relation') and 'mail.' not in value.get('relation'): models_many2one_l.append(value.get('relation')) elif value.get('type') == 'many2many' and value.get('relation') not in models_many2one and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_many2many_l.append(value.get('relation')) elif value.get('type') == 'one2many' and value.get('relation') not in models_many2one and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_one2many_l.append(value.get('relation')) else: pass for model in models_one2many: fields = fields_get(model) for key, value in fields.items(): if value.get('type') == 'many2one' and 'ir.' not in value.get( 'relation') and 'mail.' not in value.get('relation'): models_many2one_l.append(value.get('relation')) elif value.get('type') == 'many2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_many2many_l.append(value.get('relation')) elif value.get('type') == 'one2many' and 'ir.' not in value.get('relation') and 'mail.' not in value.get('relation'): models_one2many_l.append(value.get('relation')) else: pass models_many2one = list(set(models_many2one) - set(models_base)) models_many2many = list(set(models_many2many) - set(models_many2one)) models_one2many = list( set(models_one2many) - set(models_many2many) - set(models_many2one)) models_many2one_l = list( set(models_many2one_l) - set(models_many2one) - set(models_base) - set(models_many2many) - set(models_one2many)) models_many2many_l = list( set(models_many2many_l) - set(models_many2one_l) - set(models_many2one) - set(models_base) - set(models_many2many) - set(models_one2many)) models_one2many_l = list( set(models_one2many_l) - set(models_many2many_l) - set(models_many2one_l) - set(models_many2one) - set(models_base) - set(models_many2many) - set(models_one2many)) return { 'models_base': models_base, 'many2one': models_many2one, 'many2many': models_many2many, 'one2many': models_one2many, 'many2one_l': models_many2one_l, 'many2many_l': models_many2many_l, 'one2many_l': models_one2many_l, } def get_external_id(model): model_id = models.execute_kw(db, uid, password, 'ir.model', 'search', [ [('model', '=', '%s' % model)]]) external_id = models.execute_kw(db, uid, password, 'ir.model.data', 'search_read', [[( 'model', '=', 'ir.model'), ('res_id', '=', model_id[0])]], {'fields': ['complete_name']}) external_id.sort(key=lambda key: key['id']) return external_id[0]['complete_name'] # def groups_get(xmlfile): # tree = etree.parse(xmlfile) # context = etree.iterparse(xmlfile) # for a, e in context: # print(e.attrib) def generate_access_file(model, group, rwcd): """ 基础模型的读写同RWCD;基础模型的读 - 一级模型读,二级模型读;基础模型的写,建,删 - 一级模型的one2many编辑删除权限,其余均为只读 :param model: :param group: :return: """ fields = models_get(model) if rwcd == 'r': rule_base = '1,0,0,0' # rule_many2one = '1,0,0,0' # rule_many2many = '1,0,0,0' rule_one2many = '1,0,0,0' for model in fields.get('models_base'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_base)) # for model in fields.get('many2one'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) # # for model in fields.get('many2many'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) # for model in fields.get('one2many'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_base)) # # for model in fields.get('many2one_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2one)) # # for model in fields.get('many2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2many)) # # for model in fields.get('one2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_one2many)) if rwcd == 'w': rule_base = '1,1,0,0' # rule_many2one = '1,0,0,0' # rule_many2many = '1,0,0,0' rule_one2many = '1,1,1,1' for model in fields.get('models_base'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_base)) # for model in fields.get('many2one'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) # # for model in fields.get('many2many'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) for model in fields.get('one2many'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_one2many)) # for model in fields.get('many2one_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2one)) # # for model in fields.get('many2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2many)) # # for model in fields.get('one2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, # model_external_id, group, rule_one2many)) if rwcd == 'c': rule_base = '1,0,1,0' # rule_many2one = '1,0,0,0' # rule_many2many = '1,0,0,0' rule_one2many = '1,1,1,1' for model in fields.get('models_base'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_base)) # for model in fields.get('many2one'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) # # for model in fields.get('many2many'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) for model in fields.get('one2many'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_one2many)) # for model in fields.get('many2one_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2one)) # # for model in fields.get('many2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2many)) # # for model in fields.get('one2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, # model_external_id, group, rule_one2many)) if rwcd == 'd': rule_base = '1,1,1,1' # rule_many2one = '1,0,0,0' # rule_many2many = '1,0,0,0' rule_one2many = '1,1,1,1' for model in fields.get('models_base'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_base)) # for model in fields.get('many2one'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) # # for model in fields.get('many2many'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines( # 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_base)) for model in fields.get('one2many'): model_external_id = get_external_id(model) with open('ir.model.access.csv', 'a') as v: v.writelines( 'access_%s_%s,%s_%s,%s,%s,%s\n' % (model.replace( '.', '_'), group, model.replace( '.', '_'), group, model_external_id, group, rule_one2many)) # for model in fields.get('many2one_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2one)) # # for model in fields.get('many2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, model_external_id, group, rule_many2many)) # # for model in fields.get('one2many_l'): # model_external_id = get_external_id(model) # with open('ir.model.access.csv', 'a') as v: # v.writelines('access_%s_%s,%s_%s,%s,%s,%s\n' % ( # model.replace('.','_'), group, model.replace('.','_'), group, # model_external_id, group, rule_one2many)) return True if __name__ == "__main__": model = 'ospp.instance' group = 'group_model_ospp_instance_' rwcd = {'r': 'read', 'w': 'write', 'c': 'create', 'd': 'delete'} for key, value in rwcd.items(): g = "%s%s" % (group, value) generate_access_file(model, g, key)