SaaSERP3/addons/ospp_base/security/tools.py

408 lines
18 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- 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)