408 lines
18 KiB
Python
Executable File
408 lines
18 KiB
Python
Executable File
# -*- 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)
|