From 5bdf5cd5eead08df0b651d5d9cbd8b828cda07e1 Mon Sep 17 00:00:00 2001 From: xtremxpert Date: Mon, 29 Apr 2024 20:04:14 -0400 Subject: [PATCH] git modules --- bemade_git_repos_addons/__init__.py | 2 + bemade_git_repos_addons/__manifest__.py | 63 ++++++++++++++ .../data/default_directories_data.xml | 26 ++++++ bemade_git_repos_addons/models/__init__.py | 4 + bemade_git_repos_addons/models/git_addons.py | 28 +++++++ bemade_git_repos_addons/models/git_branch.py | 18 ++++ bemade_git_repos_addons/models/git_repos.py | 84 +++++++++++++++++++ .../models/res_settings.py | 23 +++++ .../security/ir.model.access.csv | 11 +++ .../button_create_repos.xml | 12 +++ .../button_create_repos_controller.js | 21 +++++ .../button_create_repos_view.js | 13 +++ .../views/action_and_menu.xml | 31 +++++++ .../views/git_addons_views.xml | 36 ++++++++ .../views/git_repos_views.xml | 34 ++++++++ .../views/res_settings_views.xml | 44 ++++++++++ bemade_git_repos_addons/wizard/__init__.py | 2 + .../wizard/directory_wizard.py | 76 +++++++++++++++++ .../wizard/directory_wizard_views.xml | 31 +++++++ .../wizard/git_repos_wizard.py | 36 ++++++++ .../wizard/git_repos_wizard_views.xml | 21 +++++ 21 files changed, 616 insertions(+) create mode 100644 bemade_git_repos_addons/__init__.py create mode 100644 bemade_git_repos_addons/__manifest__.py create mode 100644 bemade_git_repos_addons/data/default_directories_data.xml create mode 100644 bemade_git_repos_addons/models/__init__.py create mode 100644 bemade_git_repos_addons/models/git_addons.py create mode 100644 bemade_git_repos_addons/models/git_branch.py create mode 100644 bemade_git_repos_addons/models/git_repos.py create mode 100644 bemade_git_repos_addons/models/res_settings.py create mode 100644 bemade_git_repos_addons/security/ir.model.access.csv create mode 100644 bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos.xml create mode 100644 bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_controller.js create mode 100644 bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_view.js create mode 100644 bemade_git_repos_addons/views/action_and_menu.xml create mode 100644 bemade_git_repos_addons/views/git_addons_views.xml create mode 100644 bemade_git_repos_addons/views/git_repos_views.xml create mode 100644 bemade_git_repos_addons/views/res_settings_views.xml create mode 100644 bemade_git_repos_addons/wizard/__init__.py create mode 100644 bemade_git_repos_addons/wizard/directory_wizard.py create mode 100644 bemade_git_repos_addons/wizard/directory_wizard_views.xml create mode 100644 bemade_git_repos_addons/wizard/git_repos_wizard.py create mode 100644 bemade_git_repos_addons/wizard/git_repos_wizard_views.xml diff --git a/bemade_git_repos_addons/__init__.py b/bemade_git_repos_addons/__init__.py new file mode 100644 index 0000000..c536983 --- /dev/null +++ b/bemade_git_repos_addons/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard \ No newline at end of file diff --git a/bemade_git_repos_addons/__manifest__.py b/bemade_git_repos_addons/__manifest__.py new file mode 100644 index 0000000..d9bf17b --- /dev/null +++ b/bemade_git_repos_addons/__manifest__.py @@ -0,0 +1,63 @@ +# +# Bemade Inc. +# +# Copyright (C) July 2023 Bemade Inc. (). +# Author: Marc Durepos (Contact : marc@bemade.org) +# +# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) +# It is forbidden to publish, distribute, sublicense, or sell copies of the Software +# or modified copies of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +{ + 'name': 'Bemade Addons from Git Repositories', + 'version': '17.0.1.0.0', + 'summary': 'A way to install addons from git repositories.', + 'description': """ + This module allows you to install addons from git repositories. + + Configuration: + + Set the directory where the repository will be cloned and the directory where the activated addons are located. + + + Usage: + + You can add a git repository in the Apps application and then enabled the addons from it. + + In the Apps application, you will see a new option to add git repositories. + This will allow you to select the repository and the branch you want to install. + + You can then navigate to apps and in the menu, you will see a new option to enabled addons from git repositories. + """, + 'category': 'Generic Modules/Others', + 'author': 'Bemade Inc.', + 'website': 'https://www.bemade.org', + 'license': 'OPL-1', + 'depends': [ + 'base_import_module' + ], + 'data': [ + # 'data/default_directories_data.xml', + 'security/ir.model.access.csv', + 'views/git_repos_views.xml', + 'views/res_settings_views.xml', + 'views/action_and_menu.xml', + 'wizard/directory_wizard_views.xml', + 'wizard/git_repos_wizard_views.xml', + ], 'demo': [], + 'assets': { + 'web.assets_backend': [ + '/bemade_git_repos_addons/static/src/views/*/*', + ], + }, + 'installable': True, + 'auto_install': False, +} diff --git a/bemade_git_repos_addons/data/default_directories_data.xml b/bemade_git_repos_addons/data/default_directories_data.xml new file mode 100644 index 0000000..ee92eba --- /dev/null +++ b/bemade_git_repos_addons/data/default_directories_data.xml @@ -0,0 +1,26 @@ + + + + + + + Set Default Directories + + code + + env['ir.config_parameter'].sudo().set_param('bemade_git_repos_addons.clone_dir', '.repos') + env['ir.config_parameter'].sudo().set_param('bemade_git_repos_addons.addons_dir', 'addons') + + + + + + On Module Installation + + on_create + [('name', '=', 'bemade_git_repos_addons'), ('state', '=', 'installed')] + + + + + \ No newline at end of file diff --git a/bemade_git_repos_addons/models/__init__.py b/bemade_git_repos_addons/models/__init__.py new file mode 100644 index 0000000..c0ea0c7 --- /dev/null +++ b/bemade_git_repos_addons/models/__init__.py @@ -0,0 +1,4 @@ +from . import git_repos +from . import git_branch +from . import git_addons +from . import res_settings diff --git a/bemade_git_repos_addons/models/git_addons.py b/bemade_git_repos_addons/models/git_addons.py new file mode 100644 index 0000000..d167128 --- /dev/null +++ b/bemade_git_repos_addons/models/git_addons.py @@ -0,0 +1,28 @@ +from odoo import api, fields, models +import os + + +class GitAddons(models.Model): + _name = 'git.addons' + _description = 'Git Addons' + + name = fields.Char(string='Addon Name') + branch_id = fields.Many2one('git.branch', string='Branch') + + @api.model + def get_addons(self): + self.search([]).unlink() # Remove old records + branches = self.env['git.branch'].search([]) + for branch in branches: + repos = branch.repos + addons_path = repos.addons_path + if os.path.isdir(addons_path): + addons = next(os.walk(addons_path))[1] + for addon in addons: + self.create({ + 'name': addon, + 'branch_id': branch.id, + }) + + def action_update_addons(self): + self.get_addons() diff --git a/bemade_git_repos_addons/models/git_branch.py b/bemade_git_repos_addons/models/git_branch.py new file mode 100644 index 0000000..181ed84 --- /dev/null +++ b/bemade_git_repos_addons/models/git_branch.py @@ -0,0 +1,18 @@ +from odoo import models, fields + + +class GitBranch(models.Model): + _name = 'git.branch' + _description = 'Git Branch' + + name = fields.Char(string='Branch Name', required=True) + repo_id = fields.Many2one('git.repos', string='Repository') + active = fields.Boolean(string='Active', default=False) + branch_addons = fields.One2many( + comodel_name='git.addons', + inverse_name='branch_id', + string='Addons', + readonly=True) + + + # If there are additional fields or relations you need, please define them here \ No newline at end of file diff --git a/bemade_git_repos_addons/models/git_repos.py b/bemade_git_repos_addons/models/git_repos.py new file mode 100644 index 0000000..f95e5d4 --- /dev/null +++ b/bemade_git_repos_addons/models/git_repos.py @@ -0,0 +1,84 @@ +from odoo import models, fields, api, exceptions + + +class GitRepos(models.Model): + _name = 'git.repos' + _description = 'Git Repositories' + + name = fields.Char(string='Name', required=True) + url = fields.Char(string='URL') + branches = fields.One2many('git.branch', 'repo_id', string='Branches', readonly=True) + active_branch = fields.Many2one('git.branch', string='Active Branch') + + @api.onchange('url') + def _check_repo(self): + self.branches = [(5, 0, 0)] # clear existing branches + try: + branches_list = self.get_branches(self.url) # a function you need to implement to get branches from git + for branch in branches_list: + self.env['git.branch'].create({ + 'name': branch, + 'repo_id': self.id + }) + except: + return { + 'warning': { + 'title': "URL validation", + 'message': "The URL is not valid or the repository is not accessible.", + }, + } + + @api.model + def get_branches(self, url): + try: + repo = Repo.clone_from(url, '/tmp/repo') # clone repository to a temp folder + branches = [str(branch) for branch in repo.branches] + return branches + except Exception as e: + # Log the error and return an empty list or handle the exception + return [] + + @api.model + def action_create_repo(self, vals_list=None): + """ + This method will be called from button that we have created using owl js + """ + if not vals_list: + vals_list = [{'name': 'Test Repo', 'url': 'http://example.com', 'active_branch': 'master'}] + repo = self.create(vals_list) + return repo + + @api.model + def action_clone_repos(self): + try: + # Choose active branch + repo = Repo('/tmp/repos/' + self.name) + repo.git.checkout(self.active_branch.name) + except Exception as e: + # Log the error and handle the exception appropriately + pass + + @api.model + def action_switch_branch(self, branch_id): + try: + # Choose a branch + repo = Repo('/tmp/repos/' + self.name) + repo.git.checkout(branch_id) + # Update active_branch field + self.active_branch = self.env['git.branch'].browse(branch_id) + except Exception as e: + # Log the error and handle the exception appropriately + pass + + @api.model + def action_update_repos(self): + self._check_repo() + + @api.model + def action_delete_repos(self): + # Delete the physical directory '/tmp/repos/'+self.name + # There is a lot of ways to do this. Here is one: + import shutil + shutil.rmtree('/tmp/repos/' + self.name) + # Delete the DB record + self.unlink() \ No newline at end of file diff --git a/bemade_git_repos_addons/models/res_settings.py b/bemade_git_repos_addons/models/res_settings.py new file mode 100644 index 0000000..4ac495a --- /dev/null +++ b/bemade_git_repos_addons/models/res_settings.py @@ -0,0 +1,23 @@ +from odoo import models, fields, api + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + _description = 'Directory Settings' + + clone_dir = fields.Char(string='Clone Directory') + addons_dir = fields.Char(string='Addons Directory') + + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + + addons_dir = self.env['ir.config_parameter'].get_param('bemade_git_repos_addons.addons_dir') + clone_dir = self.env['ir.config_parameter'].get_param('bemade_git_repos_addons.clone_dir') + + if 'addons_dir' in fields and addons_dir: + res['addons_dir'] = addons_dir + if 'clone_dir' in fields and clone_dir: + res['clone_dir'] = clone_dir + return res \ No newline at end of file diff --git a/bemade_git_repos_addons/security/ir.model.access.csv b/bemade_git_repos_addons/security/ir.model.access.csv new file mode 100644 index 0000000..0bc75d6 --- /dev/null +++ b/bemade_git_repos_addons/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +bemade_git_repos_addons.access_git_repos,bemade_git_repos.access_git_repos_user,bemade_git_repos_addons.model_git_repos,base.group_user,1,0,0,0 +bemade_git_repos_addons.access_git_repos_admin,bemade_git_repos.access_git_repos_admin,bemade_git_repos_addons.model_git_repos,base.group_system,1,1,1,1 +bemade_git_repos_addons.access_git_branch,bemade_git_repos.access_git_branch_user,bemade_git_repos_addons.model_git_branch,base.group_user,1,0,0,0 +bemade_git_repos_addons.access_git_branch_admin,bemade_git_repos.access_git_branch_admin,bemade_git_repos_addons.model_git_branch,base.group_system,1,1,1,1 +bemade_git_repos_addons.access_git_addons,bemade_git_repos.access_git_addons_user,bemade_git_repos_addons.model_git_addons,base.group_user,1,0,0,0 +bemade_git_repos_addons.access_git_addons_admin,bemade_git_repos.access_git_addons_admin,bemade_git_repos_addons.model_git_addons,base.group_system,1,1,1,1 +bemade_git_repos_addons.access_directory_wizard,bemade_git_repos.access_directory_wizard_user,bemade_git_repos_addons.model_directory_wizard,base.group_user,1,0,0,0 +bemade_git_repos_addons.access_directory_wizard_admin,bemade_git_repos.access_directory_wizard_admin,bemade_git_repos_addons.model_directory_wizard,base.group_system,1,1,1,1 +bemade_git_repos_addons.access_git_repos_wizard,bemade_git_repos.access_git_repos_wizard_user,bemade_git_repos_addons.model_git_repos_wizard,base.group_user,1,0,0,0 +bemade_git_repos_addons.access_git_repos_wizard_admin,bemade_git_repos.access_git_repos_wizard_admin,bemade_git_repos_addons.model_git_repos_wizard,base.group_system,1,1,1,1 diff --git a/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos.xml b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos.xml new file mode 100644 index 0000000..a481fbd --- /dev/null +++ b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_controller.js b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_controller.js new file mode 100644 index 0000000..e197e43 --- /dev/null +++ b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_controller.js @@ -0,0 +1,21 @@ +/** @odoo-module */ + +import { useService } from "@web/core/utils/hooks"; +import { ListController } from "@web/views/list/list_controller"; + +export class ButtonCreateReposController extends ListController { + setup() { + super.setup(); + this.orm = useService("orm"); + } + + async onCreateRepos() { + this.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: 'git.repos.wizard', // Replace 'your.wizard.model' with the model of your wizard + views: [[false, 'form']], + target: 'new', + }); + } + +} diff --git a/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_view.js b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_view.js new file mode 100644 index 0000000..483d274 --- /dev/null +++ b/bemade_git_repos_addons/static/src/views/button_create_repos_list/button_create_repos_view.js @@ -0,0 +1,13 @@ +/** @odoo-module */ + +import { listView } from "@web/views/list/list_view"; +import { registry } from "@web/core/registry"; +import { ButtonCreateReposController as Controller } from './button_create_repos_controller'; + +export const ButtonCreateReposView = { + ...listView, + Controller, + buttonTemplate: 'bemade_git_repos_addons.ButtonCreateReposView.Buttons', +}; + +registry.category("views").add("button_create_repos", ButtonCreateReposView); diff --git a/bemade_git_repos_addons/views/action_and_menu.xml b/bemade_git_repos_addons/views/action_and_menu.xml new file mode 100644 index 0000000..d64bedd --- /dev/null +++ b/bemade_git_repos_addons/views/action_and_menu.xml @@ -0,0 +1,31 @@ + + + + + Git Repositories + ir.actions.act_window + git.repos + tree,form + [] + + + + Git Addons + ir.actions.act_window + git.addons + tree,form + [] + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bemade_git_repos_addons/views/git_addons_views.xml b/bemade_git_repos_addons/views/git_addons_views.xml new file mode 100644 index 0000000..caa21c4 --- /dev/null +++ b/bemade_git_repos_addons/views/git_addons_views.xml @@ -0,0 +1,36 @@ + + + + + + git.addons.tree + git.addons + + + + + + + + + + + + git.addons.form + git.addons + +
+ + + + + + + +
+
+
+ + +
+
\ No newline at end of file diff --git a/bemade_git_repos_addons/views/git_repos_views.xml b/bemade_git_repos_addons/views/git_repos_views.xml new file mode 100644 index 0000000..24469ab --- /dev/null +++ b/bemade_git_repos_addons/views/git_repos_views.xml @@ -0,0 +1,34 @@ + + + + + + git.repos.tree + git.repos + + + + + + + + + + + + git.repos.form + git.repos + +
+ + + + + + + +
+
+
+
+
\ No newline at end of file diff --git a/bemade_git_repos_addons/views/res_settings_views.xml b/bemade_git_repos_addons/views/res_settings_views.xml new file mode 100644 index 0000000..b9e04d2 --- /dev/null +++ b/bemade_git_repos_addons/views/res_settings_views.xml @@ -0,0 +1,44 @@ + + + + + Choose Directories + ir.actions.act_window + directory.wizard + form + new + + + + res.config.settings.view.form + res.config.settings + + + + + + + +
+
+
+
+
+
+
+
+ + +
+
+
+ + +
+
\ No newline at end of file diff --git a/bemade_git_repos_addons/wizard/__init__.py b/bemade_git_repos_addons/wizard/__init__.py new file mode 100644 index 0000000..a7d6bdd --- /dev/null +++ b/bemade_git_repos_addons/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import directory_wizard +from . import git_repos_wizard \ No newline at end of file diff --git a/bemade_git_repos_addons/wizard/directory_wizard.py b/bemade_git_repos_addons/wizard/directory_wizard.py new file mode 100644 index 0000000..d47d073 --- /dev/null +++ b/bemade_git_repos_addons/wizard/directory_wizard.py @@ -0,0 +1,76 @@ +from odoo import models, fields, api +import os + + +class DirectoryWizard(models.TransientModel): + _name = 'directory.wizard' + _description = 'Directory Wizard' + + # Directories to exclude from the list, including hidden directories and directories that are not relevant + EXCLUDED_DIRS = [ + '.idea', + '.git', + '.odoo-deploy', + '.testing', + 'conf', + 'design-themes', + 'enterprise', + 'Notes', + 'odoo', + 'tools', + 'venv', + ] + + def _get_directory_list(self): + # Fetch all directories in the current working directory + directories = [(d, d) for d in os.listdir(os.getcwd()) + if os.path.isdir(d) and d not in self.EXCLUDED_DIRS] + return directories + + addons_dir = fields.Selection(_get_directory_list, string='Addons Directory') + repos_dir = fields.Selection(_get_directory_list, string='Repos Directory') + new_directory = fields.Char(string='New Directory') + + def create_directory(self): + for record in self: + if not os.path.exists(record.new_directory): + os.makedirs(record.new_directory) + wizard = self.create({'new_directory': False}) # reset the value of new_directory + return { + 'name': 'Directory Wizard', + 'res_model': self._name, + 'res_id': wizard.id, + 'views': [(False, 'form')], + 'type': 'ir.actions.act_window', + 'target': 'new', + } + else: + return { + 'warning': { + 'title': "Directory Exists", + 'message': "The directory already exists, please choose another name or directory.", + } + } + + def apply_selections(self): + IrConfigParameter = self.env['ir.config_parameter'] + + if self.addons_dir: + IrConfigParameter.set_param('bemade_git_repos_addons.addons_dir', self.addons_dir) + if self.repos_dir: + IrConfigParameter.set_param('bemade_git_repos_addons.clone_dir', self.repos_dir) + + return {} + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + + addons_dir = self.env['ir.config_parameter'].get_param('bemade_git_repos_addons.addons_dir') + repos_dir = self.env['ir.config_parameter'].get_param('bemade_git_repos_addons.clone_dir') + + if 'addons_dir' in fields and addons_dir: + res['addons_dir'] = addons_dir + if 'repos_dir' in fields and repos_dir: + res['repos_dir'] = repos_dir + return res \ No newline at end of file diff --git a/bemade_git_repos_addons/wizard/directory_wizard_views.xml b/bemade_git_repos_addons/wizard/directory_wizard_views.xml new file mode 100644 index 0000000..26ef455 --- /dev/null +++ b/bemade_git_repos_addons/wizard/directory_wizard_views.xml @@ -0,0 +1,31 @@ + + + + directory.wizard.form + directory.wizard + +
+ + + + + + + + + + + +