odoo-addon-odoo-repository 16.0.1.3.0.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odoo/addons/odoo_repository/README.rst +81 -0
- odoo/addons/odoo_repository/__init__.py +2 -0
- odoo/addons/odoo_repository/__manifest__.py +58 -0
- odoo/addons/odoo_repository/controllers/__init__.py +1 -0
- odoo/addons/odoo_repository/controllers/main.py +32 -0
- odoo/addons/odoo_repository/data/ir_cron.xml +38 -0
- odoo/addons/odoo_repository/data/odoo.repository.csv +216 -0
- odoo/addons/odoo_repository/data/odoo_branch.xml +82 -0
- odoo/addons/odoo_repository/data/odoo_module.xml +16 -0
- odoo/addons/odoo_repository/data/odoo_repository.xml +71 -0
- odoo/addons/odoo_repository/data/odoo_repository_addons_path.xml +59 -0
- odoo/addons/odoo_repository/data/odoo_repository_org.xml +14 -0
- odoo/addons/odoo_repository/data/queue_job.xml +56 -0
- odoo/addons/odoo_repository/lib/__init__.py +0 -0
- odoo/addons/odoo_repository/lib/scanner.py +1302 -0
- odoo/addons/odoo_repository/migrations/16.0.1.1.0/post-migration.py +26 -0
- odoo/addons/odoo_repository/migrations/16.0.1.2.0/pre-migration.py +43 -0
- odoo/addons/odoo_repository/migrations/16.0.1.3.0/post-migration.py +19 -0
- odoo/addons/odoo_repository/models/__init__.py +18 -0
- odoo/addons/odoo_repository/models/authentication_token.py +12 -0
- odoo/addons/odoo_repository/models/odoo_author.py +16 -0
- odoo/addons/odoo_repository/models/odoo_branch.py +111 -0
- odoo/addons/odoo_repository/models/odoo_license.py +16 -0
- odoo/addons/odoo_repository/models/odoo_maintainer.py +31 -0
- odoo/addons/odoo_repository/models/odoo_module.py +24 -0
- odoo/addons/odoo_repository/models/odoo_module_branch.py +873 -0
- odoo/addons/odoo_repository/models/odoo_module_branch_version.py +123 -0
- odoo/addons/odoo_repository/models/odoo_module_category.py +15 -0
- odoo/addons/odoo_repository/models/odoo_module_dev_status.py +15 -0
- odoo/addons/odoo_repository/models/odoo_python_dependency.py +16 -0
- odoo/addons/odoo_repository/models/odoo_repository.py +664 -0
- odoo/addons/odoo_repository/models/odoo_repository_addons_path.py +40 -0
- odoo/addons/odoo_repository/models/odoo_repository_branch.py +98 -0
- odoo/addons/odoo_repository/models/odoo_repository_org.py +23 -0
- odoo/addons/odoo_repository/models/res_company.py +23 -0
- odoo/addons/odoo_repository/models/res_config_settings.py +23 -0
- odoo/addons/odoo_repository/models/ssh_key.py +12 -0
- odoo/addons/odoo_repository/readme/CONTRIBUTORS.rst +2 -0
- odoo/addons/odoo_repository/readme/DESCRIPTION.rst +1 -0
- odoo/addons/odoo_repository/security/ir.model.access.csv +27 -0
- odoo/addons/odoo_repository/security/res_groups.xml +25 -0
- odoo/addons/odoo_repository/static/description/README +4 -0
- odoo/addons/odoo_repository/static/description/icon.png +0 -0
- odoo/addons/odoo_repository/static/description/index.html +430 -0
- odoo/addons/odoo_repository/tests/__init__.py +6 -0
- odoo/addons/odoo_repository/tests/common.py +162 -0
- odoo/addons/odoo_repository/tests/test_base_scanner.py +214 -0
- odoo/addons/odoo_repository/tests/test_odoo_module_branch.py +97 -0
- odoo/addons/odoo_repository/tests/test_odoo_repository_scan.py +242 -0
- odoo/addons/odoo_repository/tests/test_repository_scanner.py +215 -0
- odoo/addons/odoo_repository/tests/test_sync_node.py +55 -0
- odoo/addons/odoo_repository/tests/test_utils.py +25 -0
- odoo/addons/odoo_repository/utils/__init__.py +0 -0
- odoo/addons/odoo_repository/utils/github.py +30 -0
- odoo/addons/odoo_repository/utils/module.py +25 -0
- odoo/addons/odoo_repository/utils/scanner.py +90 -0
- odoo/addons/odoo_repository/views/authentication_token.xml +63 -0
- odoo/addons/odoo_repository/views/menu.xml +38 -0
- odoo/addons/odoo_repository/views/odoo_author.xml +54 -0
- odoo/addons/odoo_repository/views/odoo_branch.xml +84 -0
- odoo/addons/odoo_repository/views/odoo_license.xml +40 -0
- odoo/addons/odoo_repository/views/odoo_maintainer.xml +69 -0
- odoo/addons/odoo_repository/views/odoo_module.xml +90 -0
- odoo/addons/odoo_repository/views/odoo_module_branch.xml +353 -0
- odoo/addons/odoo_repository/views/odoo_module_category.xml +40 -0
- odoo/addons/odoo_repository/views/odoo_module_dev_status.xml +40 -0
- odoo/addons/odoo_repository/views/odoo_python_dependency.xml +40 -0
- odoo/addons/odoo_repository/views/odoo_repository.xml +165 -0
- odoo/addons/odoo_repository/views/odoo_repository_addons_path.xml +49 -0
- odoo/addons/odoo_repository/views/odoo_repository_branch.xml +60 -0
- odoo/addons/odoo_repository/views/odoo_repository_org.xml +54 -0
- odoo/addons/odoo_repository/views/res_config_settings.xml +123 -0
- odoo/addons/odoo_repository/views/ssh_key.xml +63 -0
- odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/METADATA +100 -0
- odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/RECORD +77 -0
- odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/WHEEL +5 -0
- odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from odoo import SUPERUSER_ID, api
|
|
4
|
+
|
|
5
|
+
_logger = logging.getLogger(__name__)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def migrate(cr, version):
|
|
9
|
+
if not version:
|
|
10
|
+
return
|
|
11
|
+
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
12
|
+
update_odoo_module_branch_specific(env)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def update_odoo_module_branch_specific(env):
|
|
16
|
+
_logger.info("Update '<odoo.module.branch>.specific' field...")
|
|
17
|
+
repos = env["odoo.repository"].with_context(active_test=False).search([])
|
|
18
|
+
for repo in repos:
|
|
19
|
+
modules = repo.branch_ids.module_ids
|
|
20
|
+
modules.write({"specific": repo.specific})
|
|
21
|
+
# Dependencies of generic modules should be aligned (to update orphaned
|
|
22
|
+
# dependencies if any, don't care about filtering here, updating
|
|
23
|
+
# thousands of records at once is OK)
|
|
24
|
+
if not repo.specific:
|
|
25
|
+
orphaned_deps = modules._get_recursive_dependencies()
|
|
26
|
+
orphaned_deps.write({"specific": False})
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from openupgradelib import openupgrade as ou
|
|
4
|
+
|
|
5
|
+
from odoo.tools import sql
|
|
6
|
+
|
|
7
|
+
_logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def migrate(cr, version):
|
|
11
|
+
if not version:
|
|
12
|
+
return
|
|
13
|
+
set_xml_ids_on_odoo_branch(cr)
|
|
14
|
+
migrate_repository_clone_branch_id_to_repository_branch(cr)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def set_xml_ids_on_odoo_branch(cr):
|
|
18
|
+
_logger.info("Add XML-ID on 'odoo.branch' 18.0...")
|
|
19
|
+
query = "SELECT id FROM odoo_branch WHERE name='18.0';"
|
|
20
|
+
cr.execute(query)
|
|
21
|
+
row = cr.fetchone()
|
|
22
|
+
if row:
|
|
23
|
+
branch_id = row[0]
|
|
24
|
+
ou.add_xmlid(cr, "odoo_repository", "odoo_branch_18", "odoo.branch", branch_id)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def migrate_repository_clone_branch_id_to_repository_branch(cr):
|
|
28
|
+
_logger.info(
|
|
29
|
+
"Migrate 'clone_branch_id' from 'odoo.repository' to 'odoo.repository.branch'..."
|
|
30
|
+
)
|
|
31
|
+
# Create 'odoo_repository_branch.cloned_branch'
|
|
32
|
+
if not sql.column_exists(cr, "odoo_repository_branch", "cloned_branch"):
|
|
33
|
+
sql.create_column(cr, "odoo_repository_branch", "cloned_branch", "varchar")
|
|
34
|
+
# Migrate values from 'odoo_repository.clone_branch_id' to this new column
|
|
35
|
+
query = """
|
|
36
|
+
UPDATE odoo_repository_branch
|
|
37
|
+
SET cloned_branch=br.name
|
|
38
|
+
FROM odoo_repository repo
|
|
39
|
+
JOIN odoo_branch br
|
|
40
|
+
ON repo.clone_branch_id=br.id
|
|
41
|
+
WHERE repo.id = odoo_repository_branch.repository_id;
|
|
42
|
+
"""
|
|
43
|
+
cr.execute(query)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
_logger = logging.getLogger(__name__)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def migrate(cr, version):
|
|
7
|
+
if not version:
|
|
8
|
+
return
|
|
9
|
+
set_manual_branches_on_odoo_repository(cr)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def set_manual_branches_on_odoo_repository(cr):
|
|
13
|
+
_logger.info("Set 'manual_branches = True' on specific repositories...")
|
|
14
|
+
query = """
|
|
15
|
+
UPDATE odoo_repository
|
|
16
|
+
SET manual_branches = true
|
|
17
|
+
WHERE specific = true;
|
|
18
|
+
"""
|
|
19
|
+
cr.execute(query)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from . import authentication_token
|
|
2
|
+
from . import ssh_key
|
|
3
|
+
from . import odoo_author
|
|
4
|
+
from . import odoo_branch
|
|
5
|
+
from . import odoo_license
|
|
6
|
+
from . import odoo_maintainer
|
|
7
|
+
from . import odoo_module
|
|
8
|
+
from . import odoo_module_category
|
|
9
|
+
from . import odoo_module_dev_status
|
|
10
|
+
from . import odoo_python_dependency
|
|
11
|
+
from . import odoo_repository_org
|
|
12
|
+
from . import odoo_repository_addons_path
|
|
13
|
+
from . import odoo_repository
|
|
14
|
+
from . import odoo_repository_branch
|
|
15
|
+
from . import odoo_module_branch
|
|
16
|
+
from . import odoo_module_branch_version
|
|
17
|
+
from . import res_company
|
|
18
|
+
from . import res_config_settings
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Copyright 2024 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
from odoo import fields, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AuthenticationToken(models.Model):
|
|
8
|
+
_name = "authentication.token"
|
|
9
|
+
_description = "Authentication Token"
|
|
10
|
+
|
|
11
|
+
name = fields.Char(required=True)
|
|
12
|
+
token = fields.Char(required=True)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright 2023 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
from odoo import fields, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class OdooAuthor(models.Model):
|
|
8
|
+
_name = "odoo.author"
|
|
9
|
+
_description = "Odoo Module Author"
|
|
10
|
+
_order = "name"
|
|
11
|
+
|
|
12
|
+
name = fields.Char(required=True, index=True)
|
|
13
|
+
|
|
14
|
+
_sql_constraints = [
|
|
15
|
+
("name_uniq", "UNIQUE (name)", "This author already exists."),
|
|
16
|
+
]
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Copyright 2023 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
from odoo import _, api, fields, models
|
|
7
|
+
from odoo.exceptions import ValidationError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class OdooBranch(models.Model):
|
|
11
|
+
_name = "odoo.branch"
|
|
12
|
+
_description = "Odoo Branch/Version"
|
|
13
|
+
_order = "sequence, name"
|
|
14
|
+
|
|
15
|
+
name = fields.Char(
|
|
16
|
+
string="Version",
|
|
17
|
+
required=True,
|
|
18
|
+
index=True,
|
|
19
|
+
help=(
|
|
20
|
+
"An Odoo version is also used as an Odoo branch name in generic "
|
|
21
|
+
"repositories (Odoo, OCA...)."
|
|
22
|
+
),
|
|
23
|
+
)
|
|
24
|
+
active = fields.Boolean(default=True)
|
|
25
|
+
repository_branch_ids = fields.One2many(
|
|
26
|
+
comodel_name="odoo.repository.branch",
|
|
27
|
+
inverse_name="branch_id",
|
|
28
|
+
string="Repositories",
|
|
29
|
+
readonly=True,
|
|
30
|
+
)
|
|
31
|
+
sequence = fields.Integer()
|
|
32
|
+
next_id = fields.Many2one(
|
|
33
|
+
comodel_name="odoo.branch",
|
|
34
|
+
compute="_compute_next_id",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
_sql_constraints = [
|
|
38
|
+
("name_uniq", "UNIQUE (name)", "This branch already exists."),
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
@api.constrains("name")
|
|
42
|
+
def _constrains_name(self):
|
|
43
|
+
odoo_version_pattern = r"^[0-9]+\.[0-9]$"
|
|
44
|
+
for rec in self:
|
|
45
|
+
version = re.search(odoo_version_pattern, rec.name)
|
|
46
|
+
if not version:
|
|
47
|
+
raise ValidationError(_("Version must match the pattern 'x.y'."))
|
|
48
|
+
|
|
49
|
+
@api.depends("sequence")
|
|
50
|
+
def _compute_next_id(self):
|
|
51
|
+
for rec in self:
|
|
52
|
+
rec.next_id = self.search(
|
|
53
|
+
[("sequence", ">", rec.sequence)],
|
|
54
|
+
order="sequence",
|
|
55
|
+
limit=1,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
@api.model
|
|
59
|
+
def _recompute_sequence(self):
|
|
60
|
+
"""Recompute the 'sequence' field to get release branches sorted."""
|
|
61
|
+
self.flush_recordset()
|
|
62
|
+
odoo_versions_to_recompute = self._get_all_odoo_versions()
|
|
63
|
+
for odoo_version in odoo_versions_to_recompute:
|
|
64
|
+
query = """
|
|
65
|
+
UPDATE odoo_branch
|
|
66
|
+
SET sequence = (
|
|
67
|
+
SELECT pos.position
|
|
68
|
+
FROM (
|
|
69
|
+
SELECT
|
|
70
|
+
id,
|
|
71
|
+
row_number() OVER (
|
|
72
|
+
ORDER BY string_to_array(name, '.')::int[]
|
|
73
|
+
) AS position
|
|
74
|
+
FROM odoo_branch
|
|
75
|
+
) as pos
|
|
76
|
+
WHERE pos.id = %(id)s
|
|
77
|
+
)
|
|
78
|
+
WHERE id = %(id)s;
|
|
79
|
+
"""
|
|
80
|
+
args = {
|
|
81
|
+
"id": odoo_version.id,
|
|
82
|
+
}
|
|
83
|
+
self.env.cr.execute(query, args)
|
|
84
|
+
self.invalidate_recordset(["sequence"])
|
|
85
|
+
|
|
86
|
+
@api.model_create_multi
|
|
87
|
+
def create(self, vals_list):
|
|
88
|
+
res = super().create(vals_list)
|
|
89
|
+
res._recompute_sequence()
|
|
90
|
+
return res
|
|
91
|
+
|
|
92
|
+
def write(self, values):
|
|
93
|
+
res = super().write(values)
|
|
94
|
+
self._recompute_sequence()
|
|
95
|
+
return res
|
|
96
|
+
|
|
97
|
+
def action_scan(self, force=False):
|
|
98
|
+
"""Scan this branch in all repositories."""
|
|
99
|
+
self.repository_branch_ids.action_scan(force=force)
|
|
100
|
+
|
|
101
|
+
def action_force_scan(self):
|
|
102
|
+
"""Force the scan of this branch in all repositories.
|
|
103
|
+
|
|
104
|
+
It will restart the scan without considering the last scanned commit,
|
|
105
|
+
overriding already collected module data if any.
|
|
106
|
+
"""
|
|
107
|
+
return self.action_scan(force=True)
|
|
108
|
+
|
|
109
|
+
def _get_all_odoo_versions(self, active_test=False):
|
|
110
|
+
"""Return all Odoo versions, even archived ones."""
|
|
111
|
+
return self.with_context(active_test=active_test).search([])
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright 2023 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
from odoo import fields, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class OdooLicense(models.Model):
|
|
8
|
+
_name = "odoo.license"
|
|
9
|
+
_description = "Odoo License"
|
|
10
|
+
_order = "name"
|
|
11
|
+
|
|
12
|
+
name = fields.Char(required=True, index=True)
|
|
13
|
+
|
|
14
|
+
_sql_constraints = [
|
|
15
|
+
("name_uniq", "UNIQUE (name)", "This license already exists."),
|
|
16
|
+
]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Copyright 2023 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
from odoo import api, fields, models
|
|
5
|
+
|
|
6
|
+
from ..utils.github import GITHUB_URL
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OdooMaintainer(models.Model):
|
|
10
|
+
_name = "odoo.maintainer"
|
|
11
|
+
_description = "Odoo Module Maintainer"
|
|
12
|
+
_order = "name"
|
|
13
|
+
|
|
14
|
+
name = fields.Char(required=True, index=True)
|
|
15
|
+
github_url = fields.Char(string="GitHub URL", compute="_compute_github_url")
|
|
16
|
+
module_branch_ids = fields.Many2many(
|
|
17
|
+
comodel_name="odoo.module.branch",
|
|
18
|
+
relation="module_branch_maintainer_rel",
|
|
19
|
+
column1="maintainer_id",
|
|
20
|
+
column2="module_branch_id",
|
|
21
|
+
string="Maintainers",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
@api.depends("name")
|
|
25
|
+
def _compute_github_url(self):
|
|
26
|
+
for rec in self:
|
|
27
|
+
rec.github_url = f"{GITHUB_URL}/{rec.name}"
|
|
28
|
+
|
|
29
|
+
_sql_constraints = [
|
|
30
|
+
("name_uniq", "UNIQUE (name)", "This maintainer already exists."),
|
|
31
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copyright 2023 Camptocamp SA
|
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
3
|
+
|
|
4
|
+
from odoo import fields, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class OdooModule(models.Model):
|
|
8
|
+
_name = "odoo.module"
|
|
9
|
+
_description = "Odoo Module Technical Name"
|
|
10
|
+
|
|
11
|
+
name = fields.Char(required=True, index=True, help="Technical Name")
|
|
12
|
+
module_branch_ids = fields.One2many(
|
|
13
|
+
comodel_name="odoo.module.branch",
|
|
14
|
+
inverse_name="module_id",
|
|
15
|
+
string="Modules",
|
|
16
|
+
readonly=True,
|
|
17
|
+
)
|
|
18
|
+
blacklisted = fields.Boolean(
|
|
19
|
+
help="Blacklisted modules won't be scanned.", readonly=True
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
_sql_constraints = [
|
|
23
|
+
("name_uniq", "UNIQUE (name)", "This module technical name already exists."),
|
|
24
|
+
]
|