From d563f255c3fa8e0d22e6b17b4b689268301890ba Mon Sep 17 00:00:00 2001 From: Dan Kiplangat Date: Thu, 26 Feb 2026 00:27:30 +0300 Subject: [PATCH] [DEL] Dependency on github_connector, apps_product_creator --- website_oca_integrator/README.rst | 6 +- website_oca_integrator/__manifest__.py | 8 - website_oca_integrator/controllers/main.py | 49 +--- website_oca_integrator/controllers/portal.py | 50 ---- website_oca_integrator/data/ir_cron.xml | 17 -- .../i18n/website_oca_integrator.pot | 2 +- website_oca_integrator/models/__init__.py | 2 - .../models/contributor_module_line.py | 19 -- website_oca_integrator/models/odoo_author.py | 15 - website_oca_integrator/models/res_partner.py | 266 +----------------- .../security/ir.model.access.csv | 2 - .../static/description/index.html | 24 +- .../static/src/js/integrator_portal.js | 39 --- .../static/src/js/integrator_portal_tour.js | 19 -- .../tests/test_github_contributor_module.py | 1 - .../tests/test_integrator.py | 18 -- .../tests/test_ui_portal.py | 12 - .../views/view_odoo_author.xml | 19 -- .../views/view_portal_templates.xml | 27 -- .../views/view_res_partner.xml | 42 --- ...e_oca_integrator_contributor_templates.xml | 57 +--- .../website_oca_integrator_templates.xml | 88 ------ 22 files changed, 17 insertions(+), 765 deletions(-) delete mode 100644 website_oca_integrator/data/ir_cron.xml delete mode 100644 website_oca_integrator/models/contributor_module_line.py delete mode 100644 website_oca_integrator/models/odoo_author.py delete mode 100644 website_oca_integrator/static/src/js/integrator_portal_tour.js delete mode 100644 website_oca_integrator/views/view_odoo_author.xml diff --git a/website_oca_integrator/README.rst b/website_oca_integrator/README.rst index 2c0b6c81..dec0ac2c 100644 --- a/website_oca_integrator/README.rst +++ b/website_oca_integrator/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ====================== Website OCA Integrator ====================== @@ -17,7 +13,7 @@ Website OCA Integrator .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Foca--custom-lightgray.png?logo=github diff --git a/website_oca_integrator/__manifest__.py b/website_oca_integrator/__manifest__.py index 55a9e968..e5b2daf3 100644 --- a/website_oca_integrator/__manifest__.py +++ b/website_oca_integrator/__manifest__.py @@ -17,9 +17,6 @@ "membership", "website_membership", "website_customer", - "github_connector", - "github_connector_odoo", - "apps_product_creator", ], "data": [ "security/ir.model.access.csv", @@ -28,8 +25,6 @@ "views/view_portal_templates.xml", "views/website_oca_integrator_data.xml", "views/view_res_partner.xml", - "views/view_odoo_author.xml", - "data/ir_cron.xml", ], "external_dependencies": {"python": ["responses"]}, "assets": { @@ -37,9 +32,6 @@ "website_oca_integrator/static/src/js/integrator_portal.js", "website_oca_integrator/static/src/scss/website_oca_integrator.scss", ], - "web.assets_tests": [ - "website_oca_integrator/static/src/js/integrator_portal_tour.js", - ], }, "installable": True, } diff --git a/website_oca_integrator/controllers/main.py b/website_oca_integrator/controllers/main.py index 34a21e02..fc999dc0 100644 --- a/website_oca_integrator/controllers/main.py +++ b/website_oca_integrator/controllers/main.py @@ -96,9 +96,7 @@ def integrators(self, country=None, page=0, **post): # search integrators matching current search parameters integrator_ids = partner_obj.sudo().search( base_integrator_domain, - order="grade_id ASC, implemented_partner_count DESC," - "contributor_count DESC, member_count DESC," - "name ASC", + order="grade_id ASC, member_count DESC, name ASC", offset=pager["offset"], limit=self._references_per_page, ) @@ -126,42 +124,6 @@ def integrators(self, country=None, page=0, **post): status=integrators and 200 or 404, ) - def get_integrator_modules_list(self, integrator): - """ - Returns 5 favourite modules selected by integrator. If integrator has - not selected 5 modules, then returns latest 5 developed modules. - """ - module_display_count = 5 - favourite_modules = integrator.favourite_module_ids.filtered("is_published") - developed_modules = integrator.developed_module_ids.filtered("is_published") - favourite_module_count = len(favourite_modules) - developed_module_count = len(developed_modules) - - remaining_modules = module_display_count - favourite_module_count - - # if integrator has developed less than 5 modules then - # remaining modules are just other than favourite modules. - if developed_module_count < module_display_count: - remaining_modules = developed_module_count - favourite_module_count - - if remaining_modules: - remaining_product_tmpl_ids = list( - set(developed_modules.ids) - set(favourite_modules.ids) - ) - # search latest product variant of module. - sorted_modules = request.env["product.product"].search( - [("product_tmpl_id", "in", remaining_product_tmpl_ids)], - order="create_date desc", - ) - - sorted_modules = sorted_modules.mapped("product_tmpl_id")[ - :remaining_modules - ] - - favourite_modules += sorted_modules - - return favourite_modules, developed_module_count - def get_integrator_references(self, integrator): # sort integrator references by implemented date. references = integrator.implemented_partner_ids.sorted( @@ -197,26 +159,18 @@ def integrators_detail(self, integrator_id, **post): if integrator.sudo().exists() and ( integrator.website_published or is_website_publisher ): - modules_list, developed_module_count = self.get_integrator_modules_list( - integrator - ) - references = self.get_integrator_references(integrator) sponsorship_lines = integrator.sponsorship_line_ids.sorted( key=lambda r: r.date_end, reverse=True )[:5] - display_all_modules = True if developed_module_count > 5 else False - values = { "main_object": integrator, "integrator": integrator, "current_country": current_country, "references": references, - "modules_list": modules_list, "sponsorship_lines": sponsorship_lines, - "display_all_modules": display_all_modules, } return request.render("website_oca_integrator.integrators", values) return self.integrators(**post) @@ -259,7 +213,6 @@ def integrator_contributors( country_domain = [ "|", ("membership_state", "=", "paid"), - ("github_name", "!=", False), ("website_published", "=", True), ("parent_id", "=", integrator_id), ] diff --git a/website_oca_integrator/controllers/portal.py b/website_oca_integrator/controllers/portal.py index d448766d..bf0b1167 100644 --- a/website_oca_integrator/controllers/portal.py +++ b/website_oca_integrator/controllers/portal.py @@ -1,61 +1,11 @@ # Copyright 2018 Surekha Technologies (https://www.surekhatech.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import http -from odoo.http import request, route from odoo.addons.portal.controllers.portal import CustomerPortal class IntegratorPortal(CustomerPortal): - @route() - def account(self, redirect=None, **post): - if post: - modules = request.httprequest.form.getlist("favourite_module_ids") - if not modules: - modules = post.get("favourite_module_ids") - if modules: - modules = modules.split(",") - if modules: - post["favourite_module_ids"] = [int(id) for id in modules] - else: - post["favourite_module_ids"] = False - return super().account(redirect=redirect, **post) - - @http.route( - "/my/account/get_developed_modules", - type="http", - auth="user", - methods=["GET"], - website=True, - sitemap=False, - ) - def integrator_developed_module_read(self, query="", limit=25, **post): - integrator = request.env.user.partner_id - modules_data = request.env["product.template"].search_read( - [ - ("id", "in", integrator.developed_module_ids.ids), - ("name", "=ilike", "%" + (query or "") + "%"), - ], - fields=["id", "name"], - limit=int(limit), - ) - return request.make_json_response(modules_data) - - @http.route( - "/my/account/get_favourite_modules", - type="http", - auth="user", - methods=["GET"], - website=True, - sitemap=False, - ) - def integrator_favourite_module_read(self): - integrator = request.env.user.partner_id - modules = integrator.favourite_module_ids - modules_data = [{"id": m.id, "name": m.name} for m in modules] - return request.make_json_response(modules_data) - def details_form_validate(self, data): # after adding HTML editor in portal page, if we click on # 'Confirm' button then, 'files' key is passed in post data. diff --git a/website_oca_integrator/data/ir_cron.xml b/website_oca_integrator/data/ir_cron.xml deleted file mode 100644 index 2bd4cc32..00000000 --- a/website_oca_integrator/data/ir_cron.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Synchronize Contributor Modules - 1 - - - days - code - - model.cron_create_github_user_module() - - diff --git a/website_oca_integrator/i18n/website_oca_integrator.pot b/website_oca_integrator/i18n/website_oca_integrator.pot index efc9faea..c1d4b68b 100644 --- a/website_oca_integrator/i18n/website_oca_integrator.pot +++ b/website_oca_integrator/i18n/website_oca_integrator.pot @@ -398,4 +398,4 @@ msgstr "" #. module: website_oca_integrator #: model_terms:ir.ui.view,arch_db:website_oca_integrator.integrators msgid "to view Contributors/Members" -msgstr "" +msgstr "" \ No newline at end of file diff --git a/website_oca_integrator/models/__init__.py b/website_oca_integrator/models/__init__.py index 48879143..fa307030 100644 --- a/website_oca_integrator/models/__init__.py +++ b/website_oca_integrator/models/__init__.py @@ -1,4 +1,2 @@ -from . import contributor_module_line -from . import odoo_author from . import res_partner from . import sponsorship diff --git a/website_oca_integrator/models/contributor_module_line.py b/website_oca_integrator/models/contributor_module_line.py deleted file mode 100644 index 1beec541..00000000 --- a/website_oca_integrator/models/contributor_module_line.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2018 Surekha Technologies (https://www.surekhatech.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import fields, models - - -class ContributorModuleLine(models.Model): - _name = "contributor.module.line" - _description = "Contributor Line" - - product_template_id = fields.Many2one( - string="Odoo Module", comodel_name="product.template", required=True - ) - - partner_id = fields.Many2one( - comodel_name="res.partner", string="Partner", required=True - ) - - date_pr_merged = fields.Datetime(string="Merged date of PR", required=True) diff --git a/website_oca_integrator/models/odoo_author.py b/website_oca_integrator/models/odoo_author.py deleted file mode 100644 index 4af48427..00000000 --- a/website_oca_integrator/models/odoo_author.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2018 Surekha Technologies (https://www.surekhatech.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import fields, models - - -class OdooAuthor(models.Model): - _inherit = "odoo.author" - - partner_id = fields.Many2one( - comodel_name="res.partner", - string="Company", - domain="[('is_company','=', True),('website_published', '=', True)]", - help="Select company which is linked to this author.", - ) diff --git a/website_oca_integrator/models/res_partner.py b/website_oca_integrator/models/res_partner.py index f5bc797f..679be76d 100644 --- a/website_oca_integrator/models/res_partner.py +++ b/website_oca_integrator/models/res_partner.py @@ -11,118 +11,40 @@ class ResPartner(models.Model): _inherit = "res.partner" - github_organization = fields.Char() - - github_organization_url = fields.Char( - string="Github Organization URL", - compute="_compute_github_organization_url", - store=True, - ) - is_integrator = fields.Boolean( string="Integrator", compute="_compute_integrator", store=True, ) - contributor_count = fields.Integer( - string="Number of contributors", - compute="_compute_contributor_count", - store=True, - ) - member_count = fields.Integer( string="Number of members", compute="_compute_member_count", store=True, ) - module_count = fields.Integer( - string="Number of modules", - compute="_compute_module_count", - store=True, - ) - implemented_date = fields.Date() - author_ids = fields.One2many( - comodel_name="odoo.author", - string="Authors", - inverse_name="partner_id", - readonly=True, - ) - - developed_module_ids = fields.Many2many( - string="Developed Modules", - comodel_name="product.template", - relation="product_module_res_partner_rel", - column1="partner_id", - column2="product_template_id", - compute="_compute_developed_modules", - store=True, - ) - - favourite_module_ids = fields.Many2many( - string="Favourite Modules", - comodel_name="product.template", - relation="favourite_product_module_res_partner_rel", - column1="partner_id", - column2="product_template_id", - readonly=True, - ) - sponsorship_line_ids = fields.One2many( string="Sponsorship Activities", comodel_name="sponsorship.line", inverse_name="partner_id", ) - contributor_module_line_ids = fields.One2many( - string="Contributed Modules", - comodel_name="contributor.module.line", - inverse_name="partner_id", - readonly=True, - ) - - @api.depends("github_organization") - def _compute_github_organization_url(self): - github_url = "https://github.com/" - for record in self: - if record.is_company and record.github_organization: - record.github_organization_url = github_url + record.github_organization - else: - record.github_organization_url = False - @api.depends( "child_ids", - "child_ids.github_name", "child_ids.membership_state", "child_ids.parent_id", ) def _compute_integrator(self): """ - Integrators are partners who have any contact with a commit to OCA repositories - or a current OCA membership. + Integrators are partners who have any contact a current OCA membership. """ for partner in self: partner.is_integrator = any( - (child.github_name or child.membership_state == "paid") - for child in partner.child_ids + child.membership_state == "paid" for child in partner.child_ids ) - @api.depends("child_ids.github_name", "child_ids.parent_id") - def _compute_contributor_count(self): - contributor_data = self.read_group( - domain=[("parent_id", "in", self.ids), ("github_name", "!=", False)], - fields=["parent_id"], - groupby=["parent_id"], - ) - contributor_mapped_data = { - item["parent_id"][0]: item["parent_id_count"] for item in contributor_data - } - for partner in self: - partner.contributor_count = contributor_mapped_data.get(partner.id, 0) - @api.depends("child_ids.membership_state", "child_ids.parent_id") def _compute_member_count(self): member_data = self.read_group( @@ -135,187 +57,3 @@ def _compute_member_count(self): } for partner in self: partner.member_count = member_mapped_data.get(partner.id, 0) - - @api.depends("author_ids", "author_ids.partner_id", "author_ids.module_qty") - def _compute_module_count(self): - for partner in self: - partner.module_count = sum( - author.module_qty for author in partner.author_ids - ) - - @api.depends( - "is_integrator", - "author_ids", - "author_ids.module_ids", - "author_ids.module_ids.technical_name", - ) - def _compute_developed_modules(self): - OdooModule = self.env["odoo.module"] - ProductTemplate = self.env["product.template"] - - for partner in self: - if not partner.is_integrator or not partner.author_ids: - partner.developed_module_ids = [(5, 0, 0)] - continue - - module_list = OdooModule.search( - [("author_ids", "in", partner.author_ids.ids)] - ) - products = ProductTemplate.search( - [("odoo_module_id", "in", module_list.ids)] - ) - partner.developed_module_ids = [(6, 0, products.ids)] - - def write(self, vals): - # clear github organization data if partner is not company - if not vals.get("is_company", True): - vals["github_organization"] = False - return super().write(vals) - - def update_contributor_modules(self, contributor, modules): - """ - Update contributor with fetched modules from Github. - - `modules` is a dict: {technical_name: merged_datetime} - """ - OdooModule = self.env["odoo.module"] - ProductTemplate = self.env["product.template"] - - if not modules: - return - - module_rs = OdooModule.search([("technical_name", "in", list(modules.keys()))]) - - github_templates = ProductTemplate.search( - [("odoo_module_id", "in", module_rs.ids)] - ) - - contributor_module_lines = contributor.contributor_module_line_ids - product_mapped_data = { - line.product_template_id.id: line.id for line in contributor_module_lines - } - - current_templates = contributor_module_lines.mapped("product_template_id") - total_templates = github_templates | current_templates - common_templates = github_templates & current_templates - new_templates = github_templates - current_templates - - update_records = [ - ( - 1, - product_mapped_data[product.id], - {"date_pr_merged": modules[product.odoo_module_id.technical_name]}, - ) - for product in common_templates - ] - - new_records = [ - ( - 0, - 0, - { - "product_template_id": product.id, - "date_pr_merged": modules[product.odoo_module_id.technical_name], - }, - ) - for product in new_templates - ] - - delete_records = [] - if len(total_templates) > 5: - remove_products_count = len(total_templates) - 5 - delete_records = [ - (2, line.id, False) - for line in contributor_module_lines.sorted(key="date_pr_merged")[ - :remove_products_count - ] - ] - - contributor.write( - { - "contributor_module_line_ids": update_records - + new_records - + delete_records - } - ) - - def get_github_user_modules(self, gh_events, github_orgs): - """ - Find latest 5 technical name of the modules based on the PR which are opened - for OCA organization by github user. - """ - current_page_modules = {} # holds module name and merged date of PR. - - for gh_event in gh_events: - org = gh_event.org and gh_event.org.login - if not ( - gh_event.type == "PullRequestEvent" - and org in github_orgs - and gh_event.payload["action"] == "opened" - ): - continue - - pr_number = gh_event.payload["pull_request"]["number"] - try: - gh_pull_request = gh_event.repo.get_pull(pr_number) - except Exception: - _logger.warning( - "Error while fetching pull request #'%s' of repository '%s'/'%s'.", - pr_number, - org, - gh_event.repo, - ) - continue - - if not gh_pull_request.merged: - continue - - commit_sha = gh_pull_request.head.sha - gh_commit = gh_event.repo.get_commit(commit_sha) - - for commit_file in gh_commit.files: - file_name = commit_file.filename.split("/")[0].split(".") - - if len(file_name) != 1: - continue - - technical_name = file_name[0] - if technical_name in current_page_modules: - continue - - odoo_module = self.env["odoo.module"].search( - [("technical_name", "=", technical_name)], limit=1 - ) - if odoo_module: - current_page_modules[technical_name] = gh_pull_request.merged_at - if len(current_page_modules) == 5: - return current_page_modules - - return current_page_modules - - def get_github_organization(self): - return self.env["github.organization"].search([]).mapped("github_name") - - def get_contributors(self): - return self.env["res.partner"].search( - [("github_name", "!=", False), ("website_published", "=", True)] - ) - - def contributors_fetch_modules(self): - gh_api = self.get_github_connector() - contributors = self.get_contributors() - github_orgs = self.get_github_organization() - - for contributor in contributors: - try: - gh_user = gh_api.get_user(contributor.github_name) - except Exception: - _logger.warning("Error while fetching user '%s'.", contributor.name) - continue - - gh_events = gh_user.get_events() - modules = self.get_github_user_modules(gh_events, github_orgs) - self.update_contributor_modules(contributor, modules) - - def cron_create_github_user_module(self): - self.contributors_fetch_modules() diff --git a/website_oca_integrator/security/ir.model.access.csv b/website_oca_integrator/security/ir.model.access.csv index 2bb8f28e..de1e7169 100644 --- a/website_oca_integrator/security/ir.model.access.csv +++ b/website_oca_integrator/security/ir.model.access.csv @@ -2,5 +2,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sponsorship_line_partner_manager,sponsorship_line partner_manager,model_sponsorship_line,base.group_partner_manager,1,1,1,1 access_sponsorship_line_portal,sponsorship_line portal,model_sponsorship_line,base.group_portal,1,0,0,0 access_sponsorship_line_user,sponsorship_line user,model_sponsorship_line,base.group_user,1,0,0,0 -access_contributor_module_reader_portal,contributor_module reader portal,model_contributor_module_line,base.group_portal,1,0,0,0 -access_contributor_module_reader_user,contributor_module reader user,model_contributor_module_line,base.group_user,1,0,0,0 diff --git a/website_oca_integrator/static/description/index.html b/website_oca_integrator/static/description/index.html index 44feb71f..f4d07db6 100644 --- a/website_oca_integrator/static/description/index.html +++ b/website_oca_integrator/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Website OCA Integrator -
+
+

Website OCA Integrator

- - -Odoo Community Association - -
-

Website OCA Integrator

-

Beta License: AGPL-3 OCA/oca-custom Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/oca-custom Translate me on Weblate Try me on Runboat

This module adds menu “Integrators” in website, which displays integrators, contributors, members and modules related information.

Table of contents

@@ -390,7 +385,7 @@

Website OCA Integrator

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -398,15 +393,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Surekha Technologies
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -430,6 +425,5 @@

Maintainers

-
diff --git a/website_oca_integrator/static/src/js/integrator_portal.js b/website_oca_integrator/static/src/js/integrator_portal.js index cc899b33..8e428d30 100644 --- a/website_oca_integrator/static/src/js/integrator_portal.js +++ b/website_oca_integrator/static/src/js/integrator_portal.js @@ -9,45 +9,6 @@ function hasPlugin($el, name) { return Boolean($el && typeof $el[name] === "function"); } -publicWidget.registry.integratorModuleSelector = publicWidget.Widget.extend({ - selector: ".module_js_select2", - - async start() { - // Odoo 18: do NOT call this._super() here (it's not available). - // Keep code resilient to missing jQuery plugins. - - try { - if (hasPlugin(this.$el, "select2")) { - this.$el.select2({ - tags: false, - maximumInputLength: 25, - maximumSelectionLength: 5, - ajax: { - url: "/my/account/get_developed_modules", - dataType: "json", - data: (params) => ({query: params.term, limit: 25}), - processResults: (data) => ({ - results: data.map((x) => ({id: x.id, text: x.name})), - }), - }, - }); - } - } catch { - // Fallback: plain - -
- - -
-
diff --git a/website_oca_integrator/views/view_res_partner.xml b/website_oca_integrator/views/view_res_partner.xml index 382b0f13..b6f92cc6 100644 --- a/website_oca_integrator/views/view_res_partner.xml +++ b/website_oca_integrator/views/view_res_partner.xml @@ -4,48 +4,6 @@ Copyright 2018 Surekha Technologies (https://www.surekhatech.com) License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> - - - res.partner - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - res.partner diff --git a/website_oca_integrator/views/website_oca_integrator_contributor_templates.xml b/website_oca_integrator/views/website_oca_integrator_contributor_templates.xml index d4eaea7a..d9173bef 100644 --- a/website_oca_integrator/views/website_oca_integrator_contributor_templates.xml +++ b/website_oca_integrator/views/website_oca_integrator_contributor_templates.xml @@ -215,21 +215,13 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - + - diff --git a/website_oca_integrator/views/website_oca_integrator_templates.xml b/website_oca_integrator/views/website_oca_integrator_templates.xml index 72607364..a9dbfd42 100644 --- a/website_oca_integrator/views/website_oca_integrator_templates.xml +++ b/website_oca_integrator/views/website_oca_integrator_templates.xml @@ -149,18 +149,6 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - - - - - contributor(s) - - - - - - - - module(s) - - -
@@ -325,33 +303,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). t-call="website_oca_integrator.integrator_references_block" /> -
- -
- - - -