[IMP] make resilient the call estimate-workload if some modules are unknown

This commit is contained in:
Sylvain LE GAL 2022-06-25 00:36:08 +02:00
parent 5e3b7d51bf
commit 8836c2c656
3 changed files with 83 additions and 40 deletions

View File

@ -213,6 +213,11 @@ ANALYSIS_HTML_TEMPLATE = """
<td>{{ analysis.get_module_qty("custom") }}</td>
<td>{{ analysis.workload_hour_text("custom") }}</td>
</tr>
<tr>
<td>Not Found</td>
<td>{{ analysis.get_module_qty("custom") }}</td>
<td>&nbsp;</td>
</tr>
</tbody>
<tfood>
<tr>
@ -262,11 +267,14 @@ ANALYSIS_HTML_TEMPLATE = """
{% if ns.current_repository != odoo_module.repository %}
{% set ns.current_repository = odoo_module.repository %}
{% if ns.current_repository %}
<tr>
<th colspan="{{1 + ctx.obj["config"]["odoo_versions"]|length}}">
{{ ns.current_repository}}
</th>
<tr>
{% endif %}
{% endif %}
<!-- -------------------- -->
@ -275,6 +283,20 @@ ANALYSIS_HTML_TEMPLATE = """
<tr>
<td>{{odoo_module.name}}
{% if odoo_module.module_type == "not_found" %}
{% set odoo_apps_url = odoo_module.get_odoo_apps_url() %}
{% if odoo_apps_url %}
<a href="{{odoo_apps_url}}" target="_blank">AppsStore</a>
{% else %}
{% set odoo_code_search_url = odoo_module.get_odoo_code_search_url() %}
{% if odoo_code_search_url %}
<a href="{{odoo_code_search_url}}" target="_blank">
OdooCodeSearch
</a>
{% endif %}
{% endif %}
{% endif %}
</td>
{% for version in odoo_module.analyse.all_versions %}
{% set module_version = odoo_module.get_module_version(version) %}

View File

@ -3,6 +3,7 @@ import os
from functools import total_ordering
from pathlib import Path
import requests
from git import Repo
from loguru import logger
from pygount import SourceAnalysis
@ -109,7 +110,6 @@ class Analysis(object):
module_version.estimate_workload(ctx)
def _generate_module_version_first_version(self, ctx, module_list):
not_found_modules = []
logger.info(
"Analyse version %s. (First version)" % self.initial_version
)
@ -130,31 +130,22 @@ class Analysis(object):
"Discovering module '%s' in %s for version %s"
% (module_name, repository_name, self.initial_version)
)
new_odoo_module = OdooModule(
ctx, self, module_name, repository_name
)
new_module_version = OdooModuleVersion(
self.initial_version, new_odoo_module, addon_path
)
new_odoo_module.module_versions.update(
{self.initial_version: new_module_version}
)
self.modules.append(new_odoo_module)
else:
repository_name = False
logger.error(
"Module %s not found for version %s."
% (module_name, self.initial_version)
)
not_found_modules.append(module_name)
if not_found_modules:
raise ValueError(
"The modules %s have not been found in the version %s."
" Analyse can not be done. Please update your repos.yml"
" of your initial version to add repositories that"
" include the modules, then run again the command."
% (",".join(not_found_modules), self.initial_version)
new_odoo_module = OdooModule(
ctx, self, module_name, repository_name
)
new_module_version = OdooModuleVersion(
self.initial_version, new_odoo_module, addon_path
)
new_odoo_module.module_versions.update(
{self.initial_version: new_module_version}
)
self.modules.append(new_odoo_module)
def _generate_module_version_next_version(
self, ctx, previous_version, current_version
@ -327,7 +318,9 @@ class OdooModule(object):
self.repository = repository_name
self.unique_name = "%s.%s" % (repository_name, module_name)
self.module_versions = {}
if repository_name == "odoo/odoo":
if not repository_name:
self.module_type = "not_found"
elif repository_name == "odoo/odoo":
self.module_type = "odoo"
elif repository_name.startswith("OCA"):
self.module_type = "OCA"
@ -338,6 +331,24 @@ class OdooModule(object):
res = self.module_versions.get(current_version, False)
return res
def get_odoo_apps_url(self):
logger.info("Searching %s in the Odoo appstore ..." % self.name)
url = f"https://apps.odoo.com/apps/modules/14.0/{self.name}/"
if requests.get(url).status_code == 200:
return url
return False
def get_odoo_code_search_url(self):
logger.info("Searching %s in Odoo-Code-Search ..." % self.name)
url = (
f"https://odoo-code-search.com/ocs/search?"
f"q=name%3A%3D{self.name}+version%3A{self.analyse.initial_version}"
)
result = requests.get(url)
if '<td class="code">404</td>' in result.text:
return False
return url
@classmethod
def get_addon_path(cls, ctx, module_name, current_version):
"""Search the module in all the addons path of a given version
@ -399,7 +410,15 @@ class OdooModule(object):
if self.module_type != other.module_type:
if self.module_type == "odoo":
return True
elif self.module_type == "OCA" and other.module_type == "custom":
elif self.module_type == "OCA" and other.module_type in [
"custom",
"not_found",
]:
return True
elif (
self.module_type == "custom"
and other.module_type == "not_found"
):
return True
else:
return False
@ -447,8 +466,11 @@ class OdooModuleVersion(object):
self.openupgrade_xml_lines = 0
def get_last_existing_version(self):
versions = list(self.odoo_module.module_versions.values())
return [x for x in filter(lambda x: x.addon_path, versions)][-1]
if self.odoo_module.module_type != "not_found":
versions = list(self.odoo_module.module_versions.values())
return [x for x in filter(lambda x: x.addon_path, versions)][-1]
else:
return False
def estimate_workload(self, ctx):
settings = ctx.obj["config"]["workload_settings"]
@ -508,6 +530,8 @@ class OdooModuleVersion(object):
return
previous_module_version = self.get_last_existing_version()
if not previous_module_version:
return
self.workload = (
# Minimal port time
port_minimal_time
@ -636,6 +660,8 @@ class OdooModuleVersion(object):
def analyse_missing_module(self):
last_existing_version = self.get_last_existing_version()
if not last_existing_version:
return
last_existing_version.analyse_size()
def get_bg_color(self):
@ -670,6 +696,8 @@ class OdooModuleVersion(object):
return "red"
elif self.version != self.odoo_module.analyse.final_version:
return "lightgray"
elif self.odoo_module.module_type == "not_found":
return "lightgray"
else:
return "orange"
@ -695,10 +723,11 @@ class OdooModuleVersion(object):
# A core module disappeared and has not been merged
# or renamed
return "Module lost"
elif self.version != self.odoo_module.analyse.final_version:
return "Unported"
else:
return (
"To port from %s"
% self.get_last_existing_version().version
)
last_existing_version = self.get_last_existing_version()
if not last_existing_version:
return "Unknown"
elif self.version != self.odoo_module.analyse.final_version:
return "Unported"
else:
return "To port from %s" % last_existing_version.version

View File

@ -32,19 +32,11 @@ class TestCliEstimateWorkload(unittest.TestCase):
",web_view_calendar_list"
",web_widget_child_selector"
",web_widget_one2many_tree_line_duplicate"
",web_widget_dropdown_dynamic_example",
",web_widget_dropdown_dynamic_example"
",my_module_that_doesnt_exist",
]
)
# We check file has been created
# parsing this file is a mess, so we don't do it ;-)
assert Path("./analysis.html").exists()
with self.assertRaises(ValueError):
cli_runner_invoke(
[
"--log-level=DEBUG",
"estimate-workload",
"--extra-modules=my_module_that_doesnt_exist",
]
)