tryton-upgrades/check

180 lines
5.6 KiB
Python
Executable File

#!/usr/bin/env python
import sys
dbname = sys.argv[1]
config_file = sys.argv[2]
dbname2 = sys.argv[3]
from trytond.config import config as CONFIG
CONFIG.update_etc(config_file)
from trytond.transaction import Transaction
from trytond.pool import Pool
import logging
from lxml import etree
import yaml
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
from blessings import Terminal
t = Terminal()
Pool.start()
pool = Pool(dbname)
pool.init()
context = {'company': 1}
try:
# Using LibYaml-based parser if available because it is much faster.
from yaml import CSafeDumper as SafeDumper
except ImportError:
from yaml import SafeDumper
def to_yaml(obj, output_file, padding=None, separator=None):
res = yaml.dump(obj, output_file, Dumper=SafeDumper, default_flow_style=False)
if padding:
res = '\n'.join([padding + x for x in
res.splitlines()])
if separator:
res = separator.join(res.splitlines())
return res
def download_fields_view_get():
'''
Create a file with result of fields_view_get to can diff easily
'''
logger.info(t.yellow('Checking fields_view_get...'))
version = '4.8'
filename = "%s_%s"%(dbname, version)
log_file = open(filename, 'w')
with Transaction().start(dbname, 1):
View = pool.get('ir.ui.view')
views = View.search([
('model', '!=', ''),
], order=[('id', 'asc')])
for view in views:
if view.inherit and view.inherit.model == view.model:
view_id = view.inherit.id
else:
view_id = view.id
model = view.model
Model = pool.get(model)
res = None
if model in ('project.test.build.group'):
continue
try:
res = Model.fields_view_get(view_id)
except ValueError:
logging.error(t.red('ERROR PROCESSING VIEW'))
logging.error(t.red('View ID: %d; Model: %s' % (view.id,
view.model)))
logging.error(t.red('Arch:\n%s' % view.arch))
raise
r = res.copy()
del r['arch']
r['fields'] = r['fields'].keys()
to_yaml(r, log_file)
def check_data():
'''
Test that all records can be read
'''
logger.info(t.yellow('Checking data...'))
with Transaction().start(dbname, 0):
Company = pool.get('company.company')
companies = [x.id for x in Company.search([])]
for company in companies:
logger.info('Checking data on %s...' % company)
with Transaction().start(dbname, 0, context={
'company': company,
}):
for model in pool._pool[dbname]['model'].keys():
logger.info('Company: %d, Model: %s...' % (model, company))
Model = pool.get(model)
if not hasattr(Model, 'search'):
continue
for x in Model.search([]):
# We're not loading lazy fields
pass
def check_view():
'Test validity of all views of the module'
logger.info(t.yellow('Checking views...'))
with Transaction().start(dbname, 1):
View = pool.get('ir.ui.view')
views = View.search([
('model', '!=', ''),
])
for view in views:
if view.inherit and view.inherit.model == view.model:
view_id = view.inherit.id
else:
view_id = view.id
model = view.model
Model = pool.get(model)
try:
res = Model.fields_view_get(view_id)
except ValueError:
logging.error(t.red('ERROR PROCESSING VIEW'))
logging.error(t.red('View ID: %d; Model: %s' % (view.id,
view.model)))
logging.error(t.red('Arch:\n%s' % view.arch))
raise
assert res['model'] == model
tree = etree.fromstring(res['arch'])
validator = etree.RelaxNG(etree=View.get_rng(res['type']))
# Don't use assert_ because 2to3 convert to assertTrue
validator.assertValid(tree)
tree_root = tree.getroottree().getroot()
for element in tree_root.iter():
if element.tag in ('field', 'label', 'separator', 'group'):
for attr in ('name', 'icon'):
field = element.get(attr)
if field:
assert field in res['fields'], (
'Missing field: %s' % field)
def check_model_access():
'Test missing default model access'
logger.info(t.yellow('Checking model access...'))
with Transaction().start(dbname, 1):
Access = pool.get('ir.model.access')
no_groups = {a.model.name for a in Access.search([
('group', '=', None),
])}
with_groups = {a.model.name for a in Access.search([
('group', '!=', None),
])}
assert no_groups >= with_groups, (
'Model "%(models)s" are missing a default access' % {
'models': list(with_groups - no_groups), })
for check in (download_fields_view_get, check_model_access, check_view, check_data):
try:
check()
except:
logging.exception(t.red('Check failed.'))
pass