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,40 @@
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 OdooRepositoryAddonsPath(models.Model):
8
+ _name = "odoo.repository.addons_path"
9
+ _description = "Addons"
10
+
11
+ relative_path = fields.Char(required=True)
12
+ is_standard = fields.Boolean(
13
+ string="Standard?",
14
+ help="Does this folder contain modules from Odoo S.A.?",
15
+ default=False,
16
+ )
17
+ is_enterprise = fields.Boolean(
18
+ string="Enterprise?",
19
+ help=(
20
+ "Does this folder contain Enterprise modules?\n"
21
+ "(from Odoo S.A., a contributor or your organization)"
22
+ ),
23
+ default=False,
24
+ )
25
+ is_community = fields.Boolean(
26
+ string="Community Contribution?",
27
+ help=(
28
+ "Does this folder contain Odoo generic community modules?\n"
29
+ "(from OCA, a contributor or your organization)"
30
+ ),
31
+ default=False,
32
+ )
33
+
34
+ _sql_constraints = [
35
+ (
36
+ "addons_path_uniq",
37
+ "UNIQUE (relative_path, is_standard, is_enterprise, is_community)",
38
+ "This addons-path already exists.",
39
+ ),
40
+ ]
@@ -0,0 +1,98 @@
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
+
7
+ class OdooRepositoryBranch(models.Model):
8
+ _name = "odoo.repository.branch"
9
+ _description = "Odoo Modules Repository Branch"
10
+
11
+ name = fields.Char(compute="_compute_name", store=True, index=True)
12
+ repository_id = fields.Many2one(
13
+ comodel_name="odoo.repository",
14
+ ondelete="cascade",
15
+ string="Repository",
16
+ required=True,
17
+ index=True,
18
+ readonly=True,
19
+ )
20
+ manual_branches = fields.Boolean(
21
+ related="repository_id.manual_branches",
22
+ store=True,
23
+ )
24
+ specific = fields.Boolean(
25
+ related="repository_id.specific",
26
+ store=True,
27
+ )
28
+ branch_id = fields.Many2one(
29
+ comodel_name="odoo.branch",
30
+ ondelete="cascade",
31
+ string="Odoo Version",
32
+ required=True,
33
+ index=True,
34
+ )
35
+ cloned_branch = fields.Char(
36
+ help=(
37
+ "Force the branch to clone (optional). Used on repositories with "
38
+ "'Configure branches manually' option enabled."
39
+ ),
40
+ )
41
+ module_ids = fields.One2many(
42
+ comodel_name="odoo.module.branch",
43
+ inverse_name="repository_branch_id",
44
+ string="Modules",
45
+ readonly=True,
46
+ )
47
+ last_scanned_commit = fields.Char(readonly=True)
48
+ active = fields.Boolean(compute="_compute_active", store=True)
49
+
50
+ _sql_constraints = [
51
+ (
52
+ "repository_id_branch_id_uniq",
53
+ "UNIQUE (repository_id, branch_id)",
54
+ "This branch already exists for this repository.",
55
+ ),
56
+ ]
57
+
58
+ @api.depends("repository_id.display_name", "branch_id.name")
59
+ def _compute_name(self):
60
+ for rec in self:
61
+ rec.name = f"{rec.repository_id.display_name}#{rec.branch_id.name}"
62
+
63
+ @api.depends("repository_id.active", "branch_id.active")
64
+ def _compute_active(self):
65
+ for rec in self:
66
+ rec.active = all((rec.repository_id.active, rec.branch_id.active))
67
+
68
+ def action_scan(self, force=False, raise_exc=True):
69
+ """Scan the repository/branch."""
70
+ return self.repository_id.action_scan(
71
+ branch_ids=self.branch_id.ids, force=force, raise_exc=raise_exc
72
+ )
73
+
74
+ def action_force_scan(self, raise_exc=True):
75
+ """Force the scan of the repository/branch.
76
+
77
+ It will restart the scan without considering the last scanned commit,
78
+ overriding already collected module data if any.
79
+ """
80
+ return self.action_scan(force=True, raise_exc=raise_exc)
81
+
82
+ def _to_dict(self):
83
+ """Convert branch repository data to a dictionary."""
84
+ self.ensure_one()
85
+ return {
86
+ "org": self.repository_id.org_id.name,
87
+ "name": self.repository_id.name,
88
+ "repo_url": self.repository_id.repo_url,
89
+ "repo_type": self.repository_id.repo_type,
90
+ "active": self.repository_id.active,
91
+ "branch": self.branch_id.name,
92
+ "last_scanned_commit": self.last_scanned_commit,
93
+ }
94
+
95
+ def _update_last_scanned_commit(self, last_scanned_commit):
96
+ """Update the last scanned commit. Called by job."""
97
+ self.ensure_one()
98
+ self.last_scanned_commit = last_scanned_commit
@@ -0,0 +1,23 @@
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 OdooRepositoryOrg(models.Model):
10
+ _name = "odoo.repository.org"
11
+ _description = "Odoo Repository Organization"
12
+
13
+ name = fields.Char(required=True, index=True)
14
+ github_url = fields.Char(string="GitHub URL", compute="_compute_github_url")
15
+
16
+ @api.depends("name")
17
+ def _compute_github_url(self):
18
+ for rec in self:
19
+ rec.github_url = f"{GITHUB_URL}/{rec.name}"
20
+
21
+ _sql_constraints = [
22
+ ("name_uniq", "UNIQUE (name)", "This organization already exists."),
23
+ ]
@@ -0,0 +1,23 @@
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 ResCompany(models.Model):
8
+ _inherit = "res.company"
9
+
10
+ config_odoo_repository_default_token_id = fields.Many2one(
11
+ comodel_name="authentication.token",
12
+ string="Default token",
13
+ help="Default token used to clone repositories and authenticate on API like GitHub.",
14
+ )
15
+ config_odoo_repository_workaround_fs_errors = fields.Boolean(
16
+ string="Workaround FS errors",
17
+ help=(
18
+ "Fix file system permissions when cloning repositories. "
19
+ "Errors could be triggered on some file systems when git tries to "
20
+ "execute 'chown' commands on its internal configuration files. "
21
+ "This option will workaround this issue."
22
+ ),
23
+ )
@@ -0,0 +1,23 @@
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 ResConfigSettings(models.TransientModel):
8
+ _inherit = "res.config.settings"
9
+
10
+ config_odoo_repository_storage_path = fields.Char(
11
+ string="Storage local path", config_parameter="odoo_repository_storage_path"
12
+ )
13
+ config_odoo_repository_workaround_fs_errors = fields.Boolean(
14
+ related="company_id.config_odoo_repository_workaround_fs_errors",
15
+ readonly=False,
16
+ )
17
+ config_odoo_repository_default_token_id = fields.Many2one(
18
+ related="company_id.config_odoo_repository_default_token_id",
19
+ readonly=False,
20
+ )
21
+ config_odoo_repository_main_node_url = fields.Char(
22
+ string="Endpoint URL", config_parameter="odoo_repository_main_node_url"
23
+ )
@@ -0,0 +1,12 @@
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 SSHKey(models.Model):
8
+ _name = "ssh.key"
9
+ _description = "SSH private key"
10
+
11
+ name = fields.Char(required=True)
12
+ private_key = fields.Text(required=True, help="SSH private key without passphrase.")
@@ -0,0 +1,2 @@
1
+ * Camptocamp
2
+ * Sébastien Alix <sebastien.alix@camptocamp.com>
@@ -0,0 +1 @@
1
+ Base module to host data collected from Odoo repositories.
@@ -0,0 +1,27 @@
1
+ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2
+ access_authentication_token_user,authentication_token_user,model_authentication_token,group_odoo_repository_user,0,0,0,0
3
+ access_authentication_manager,authentication_token_manager,model_authentication_token,group_odoo_repository_manager,1,1,1,1
4
+ access_ssh_key_user,ssh_key_user,model_ssh_key,group_odoo_repository_user,0,0,0,0
5
+ access_ssh_key_manager,ssh_key_manager,model_ssh_key,group_odoo_repository_manager,1,1,1,1
6
+ access_odoo_author_user,odoo_author_user,model_odoo_author,group_odoo_repository_user,1,0,0,0
7
+ access_odoo_branch_user,odoo_branch_user,model_odoo_branch,group_odoo_repository_user,1,0,0,0
8
+ access_odoo_branch_manager,odoo_branch_manager,model_odoo_branch,group_odoo_repository_manager,1,1,1,1
9
+ access_odoo_license_user,odoo_license_user,model_odoo_license,group_odoo_repository_user,1,0,0,0
10
+ access_odoo_maintainer_user,odoo_maintainer_user,model_odoo_maintainer,group_odoo_repository_user,1,0,0,0
11
+ access_odoo_module_user,odoo_module_user,model_odoo_module,group_odoo_repository_user,1,0,0,0
12
+ access_odoo_module_manager,odoo_module_manager,model_odoo_module,group_odoo_repository_manager,1,0,1,1
13
+ access_odoo_module_category_user,odoo_module_category_user,model_odoo_module_category,group_odoo_repository_user,1,0,0,0
14
+ access_odoo_module_dev_status_user,odoo_module_dev_status_user,model_odoo_module_dev_status,group_odoo_repository_user,1,0,0,0
15
+ access_odoo_python_dependency_user,odoo_python_dependency_user,model_odoo_python_dependency,group_odoo_repository_user,1,0,0,0
16
+ access_odoo_repository_addons_path_user,odoo_repository_addons_path_user,model_odoo_repository_addons_path,group_odoo_repository_user,1,0,0,0
17
+ access_odoo_repository_addons_path_manager,odoo_repository_addons_path_manager,model_odoo_repository_addons_path,group_odoo_repository_manager,1,1,1,1
18
+ access_odoo_repository_org_user,odoo_repository_org_user,model_odoo_repository_org,group_odoo_repository_user,1,0,0,0
19
+ access_odoo_repository_org_manager,odoo_repository_org_manager,model_odoo_repository_org,group_odoo_repository_manager,1,1,1,1
20
+ access_odoo_repository_user,odoo_repository_user,model_odoo_repository,group_odoo_repository_user,1,0,0,0
21
+ access_odoo_repository_manager,odoo_repository_manager,model_odoo_repository,group_odoo_repository_manager,1,1,1,1
22
+ access_odoo_repository_branch_user,odoo_repository_branch_user,model_odoo_repository_branch,group_odoo_repository_user,1,0,0,0
23
+ access_odoo_repository_branch_manager,odoo_repository_branch_manager,model_odoo_repository_branch,group_odoo_repository_manager,1,1,1,1
24
+ access_odoo_module_branch_user,odoo_module_branch_user,model_odoo_module_branch,group_odoo_repository_user,1,0,0,0
25
+ access_odoo_module_branch_manager,odoo_module_branch_manager,model_odoo_module_branch,group_odoo_repository_manager,1,1,0,0
26
+ access_odoo_module_branch_version_user,odoo_module_branch_version_user,model_odoo_module_branch_version,group_odoo_repository_user,1,0,0,0
27
+ access_odoo_module_branch_version_manager,odoo_module_branch_version_manager,model_odoo_module_branch_version,group_odoo_repository_manager,1,1,1,1
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!-- Copyright 2024 Camptocamp SA
3
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
4
+ <odoo>
5
+
6
+ <record model="ir.module.category" id="module_category_odoo_repository">
7
+ <field name="name">Odoo Repository</field>
8
+ <field name="sequence">50</field>
9
+ </record>
10
+
11
+ <record id="group_odoo_repository_user" model="res.groups">
12
+ <field name="name">Odoo Repository User</field>
13
+ <field name="category_id" ref="module_category_odoo_repository" />
14
+ </record>
15
+
16
+ <record id="group_odoo_repository_manager" model="res.groups">
17
+ <field name="name">Odoo Repository Manager</field>
18
+ <field name="category_id" ref="module_category_odoo_repository" />
19
+ <field
20
+ name="implied_ids"
21
+ eval="[(4, ref('odoo_repository.group_odoo_repository_user'))]"
22
+ />
23
+ </record>
24
+
25
+ </odoo>
@@ -0,0 +1,4 @@
1
+ Icon generated with https://spilymp.github.io/ibo/
2
+ Set: Font Awesome 5 Solid & Regular
3
+ Class: fa-shapes
4
+ Background color: 255 / 104 / 10 (RGB)