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.
Files changed (77) hide show
  1. odoo/addons/odoo_repository/README.rst +81 -0
  2. odoo/addons/odoo_repository/__init__.py +2 -0
  3. odoo/addons/odoo_repository/__manifest__.py +58 -0
  4. odoo/addons/odoo_repository/controllers/__init__.py +1 -0
  5. odoo/addons/odoo_repository/controllers/main.py +32 -0
  6. odoo/addons/odoo_repository/data/ir_cron.xml +38 -0
  7. odoo/addons/odoo_repository/data/odoo.repository.csv +216 -0
  8. odoo/addons/odoo_repository/data/odoo_branch.xml +82 -0
  9. odoo/addons/odoo_repository/data/odoo_module.xml +16 -0
  10. odoo/addons/odoo_repository/data/odoo_repository.xml +71 -0
  11. odoo/addons/odoo_repository/data/odoo_repository_addons_path.xml +59 -0
  12. odoo/addons/odoo_repository/data/odoo_repository_org.xml +14 -0
  13. odoo/addons/odoo_repository/data/queue_job.xml +56 -0
  14. odoo/addons/odoo_repository/lib/__init__.py +0 -0
  15. odoo/addons/odoo_repository/lib/scanner.py +1302 -0
  16. odoo/addons/odoo_repository/migrations/16.0.1.1.0/post-migration.py +26 -0
  17. odoo/addons/odoo_repository/migrations/16.0.1.2.0/pre-migration.py +43 -0
  18. odoo/addons/odoo_repository/migrations/16.0.1.3.0/post-migration.py +19 -0
  19. odoo/addons/odoo_repository/models/__init__.py +18 -0
  20. odoo/addons/odoo_repository/models/authentication_token.py +12 -0
  21. odoo/addons/odoo_repository/models/odoo_author.py +16 -0
  22. odoo/addons/odoo_repository/models/odoo_branch.py +111 -0
  23. odoo/addons/odoo_repository/models/odoo_license.py +16 -0
  24. odoo/addons/odoo_repository/models/odoo_maintainer.py +31 -0
  25. odoo/addons/odoo_repository/models/odoo_module.py +24 -0
  26. odoo/addons/odoo_repository/models/odoo_module_branch.py +873 -0
  27. odoo/addons/odoo_repository/models/odoo_module_branch_version.py +123 -0
  28. odoo/addons/odoo_repository/models/odoo_module_category.py +15 -0
  29. odoo/addons/odoo_repository/models/odoo_module_dev_status.py +15 -0
  30. odoo/addons/odoo_repository/models/odoo_python_dependency.py +16 -0
  31. odoo/addons/odoo_repository/models/odoo_repository.py +664 -0
  32. odoo/addons/odoo_repository/models/odoo_repository_addons_path.py +40 -0
  33. odoo/addons/odoo_repository/models/odoo_repository_branch.py +98 -0
  34. odoo/addons/odoo_repository/models/odoo_repository_org.py +23 -0
  35. odoo/addons/odoo_repository/models/res_company.py +23 -0
  36. odoo/addons/odoo_repository/models/res_config_settings.py +23 -0
  37. odoo/addons/odoo_repository/models/ssh_key.py +12 -0
  38. odoo/addons/odoo_repository/readme/CONTRIBUTORS.rst +2 -0
  39. odoo/addons/odoo_repository/readme/DESCRIPTION.rst +1 -0
  40. odoo/addons/odoo_repository/security/ir.model.access.csv +27 -0
  41. odoo/addons/odoo_repository/security/res_groups.xml +25 -0
  42. odoo/addons/odoo_repository/static/description/README +4 -0
  43. odoo/addons/odoo_repository/static/description/icon.png +0 -0
  44. odoo/addons/odoo_repository/static/description/index.html +430 -0
  45. odoo/addons/odoo_repository/tests/__init__.py +6 -0
  46. odoo/addons/odoo_repository/tests/common.py +162 -0
  47. odoo/addons/odoo_repository/tests/test_base_scanner.py +214 -0
  48. odoo/addons/odoo_repository/tests/test_odoo_module_branch.py +97 -0
  49. odoo/addons/odoo_repository/tests/test_odoo_repository_scan.py +242 -0
  50. odoo/addons/odoo_repository/tests/test_repository_scanner.py +215 -0
  51. odoo/addons/odoo_repository/tests/test_sync_node.py +55 -0
  52. odoo/addons/odoo_repository/tests/test_utils.py +25 -0
  53. odoo/addons/odoo_repository/utils/__init__.py +0 -0
  54. odoo/addons/odoo_repository/utils/github.py +30 -0
  55. odoo/addons/odoo_repository/utils/module.py +25 -0
  56. odoo/addons/odoo_repository/utils/scanner.py +90 -0
  57. odoo/addons/odoo_repository/views/authentication_token.xml +63 -0
  58. odoo/addons/odoo_repository/views/menu.xml +38 -0
  59. odoo/addons/odoo_repository/views/odoo_author.xml +54 -0
  60. odoo/addons/odoo_repository/views/odoo_branch.xml +84 -0
  61. odoo/addons/odoo_repository/views/odoo_license.xml +40 -0
  62. odoo/addons/odoo_repository/views/odoo_maintainer.xml +69 -0
  63. odoo/addons/odoo_repository/views/odoo_module.xml +90 -0
  64. odoo/addons/odoo_repository/views/odoo_module_branch.xml +353 -0
  65. odoo/addons/odoo_repository/views/odoo_module_category.xml +40 -0
  66. odoo/addons/odoo_repository/views/odoo_module_dev_status.xml +40 -0
  67. odoo/addons/odoo_repository/views/odoo_python_dependency.xml +40 -0
  68. odoo/addons/odoo_repository/views/odoo_repository.xml +165 -0
  69. odoo/addons/odoo_repository/views/odoo_repository_addons_path.xml +49 -0
  70. odoo/addons/odoo_repository/views/odoo_repository_branch.xml +60 -0
  71. odoo/addons/odoo_repository/views/odoo_repository_org.xml +54 -0
  72. odoo/addons/odoo_repository/views/res_config_settings.xml +123 -0
  73. odoo/addons/odoo_repository/views/ssh_key.xml +63 -0
  74. odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/METADATA +100 -0
  75. odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/RECORD +77 -0
  76. odoo_addon_odoo_repository-16.0.1.3.0.13.dist-info/WHEEL +5 -0
  77. 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
+ ]