From f5963ebf2a1d9922996b670b2215d81c1a20952b Mon Sep 17 00:00:00 2001 From: Dishant1804 Date: Sun, 2 Feb 2025 14:02:42 +0530 Subject: [PATCH 1/4] gsoc command data fetch from algolia --- backend/apps/owasp/api/search/gsoc.py | 25 +++++++++++++++++++++++ backend/apps/owasp/models/project.py | 9 -------- backend/apps/slack/commands/gsoc.py | 4 ++-- backend/tests/slack/commands/gsoc_test.py | 2 +- 4 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 backend/apps/owasp/api/search/gsoc.py diff --git a/backend/apps/owasp/api/search/gsoc.py b/backend/apps/owasp/api/search/gsoc.py new file mode 100644 index 000000000..011704154 --- /dev/null +++ b/backend/apps/owasp/api/search/gsoc.py @@ -0,0 +1,25 @@ +"""OWASP app project gsoc search API """ + +from functools import lru_cache + +from algoliasearch_django import raw_search + +@lru_cache +def get_gsoc_projects(year, attributes=None): + """Return GSoC projects from Algolia.""" + from apps.owasp.models.project import Project + query = f"gsoc{year}" + searchable_attributes = ["idx_custom_tags"] + + params = { + "attributesToHighlight": [], + "restrictSearchableAttributes": searchable_attributes, + } + + if attributes: + params["attributesToRetrieve"] = attributes + + results = raw_search(Project, query, params) + projects = results.get('hits', []) + + return projects diff --git a/backend/apps/owasp/models/project.py b/backend/apps/owasp/models/project.py index 6db5b3248..c99a8b124 100644 --- a/backend/apps/owasp/models/project.py +++ b/backend/apps/owasp/models/project.py @@ -235,15 +235,6 @@ def bulk_save(projects, fields=None): """Bulk save projects.""" BulkSaveModel.bulk_save(Project, projects, fields=fields) - @staticmethod - def get_gsoc_projects(year, attributes=None): - """Return GSoC projects.""" - projects = Project.objects.filter(custom_tags__contains=[f"gsoc{year}"]) - if attributes: - projects = projects.values(*attributes) - - return projects - @staticmethod def update_data(gh_repository, repository, save=True): """Update project data.""" diff --git a/backend/apps/slack/commands/gsoc.py b/backend/apps/slack/commands/gsoc.py index d7c4bc440..dbeb7021e 100644 --- a/backend/apps/slack/commands/gsoc.py +++ b/backend/apps/slack/commands/gsoc.py @@ -18,7 +18,7 @@ def gsoc_handler(ack, command, client): """Slack /gsoc command handler.""" - from apps.owasp.models.project import Project + from apps.owasp.api.search.gsoc import get_gsoc_projects from apps.slack.common.gsoc import GSOC_GENERAL_INFORMATION_BLOCKS ack() @@ -35,7 +35,7 @@ def gsoc_handler(ack, command, client): elif command_text.isnumeric(): year = int(command_text) if year in SUPPORTED_YEARS: - gsoc_projects = Project.get_gsoc_projects(year) + gsoc_projects = get_gsoc_projects(year) gsoc_projects_markdown = f"{NL}".join( f" • <{gp.nest_url}|{gp.owasp_name}>" for gp in sorted(gsoc_projects, key=lambda p: p.owasp_name) diff --git a/backend/tests/slack/commands/gsoc_test.py b/backend/tests/slack/commands/gsoc_test.py index a77438786..8bfcc119d 100644 --- a/backend/tests/slack/commands/gsoc_test.py +++ b/backend/tests/slack/commands/gsoc_test.py @@ -77,7 +77,7 @@ def test_handler_with_projects(self, mock_slack_client): settings.SLACK_COMMANDS_ENABLED = True with patch( - "apps.owasp.models.project.Project.get_gsoc_projects", + "apps.owasp.api.search.gsoc.get_gsoc_projects", return_value=mock_projects, ): gsoc_handler(ack=MagicMock(), command=command, client=mock_slack_client) From 5df0727fdf34cc7a25f49c96b9949f3bfe2ecdde Mon Sep 17 00:00:00 2001 From: Dishant1804 Date: Sun, 2 Feb 2025 14:31:07 +0530 Subject: [PATCH 2/4] pre-commit and format checks --- backend/apps/owasp/api/search/gsoc.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/apps/owasp/api/search/gsoc.py b/backend/apps/owasp/api/search/gsoc.py index 011704154..f860c2472 100644 --- a/backend/apps/owasp/api/search/gsoc.py +++ b/backend/apps/owasp/api/search/gsoc.py @@ -1,13 +1,15 @@ -"""OWASP app project gsoc search API """ +"""OWASP app project gsoc search API.""" from functools import lru_cache from algoliasearch_django import raw_search + @lru_cache def get_gsoc_projects(year, attributes=None): """Return GSoC projects from Algolia.""" from apps.owasp.models.project import Project + query = f"gsoc{year}" searchable_attributes = ["idx_custom_tags"] @@ -15,11 +17,9 @@ def get_gsoc_projects(year, attributes=None): "attributesToHighlight": [], "restrictSearchableAttributes": searchable_attributes, } - + if attributes: params["attributesToRetrieve"] = attributes results = raw_search(Project, query, params) - projects = results.get('hits', []) - - return projects + return results.get("hits", []) From 916ae5293a388cf9fdd0ba347c8741b601633c3a Mon Sep 17 00:00:00 2001 From: Dishant1804 Date: Tue, 4 Feb 2025 13:37:43 +0530 Subject: [PATCH 3/4] moved get_gsoc_projects to search project file --- backend/apps/owasp/api/search/gsoc.py | 25 ----------------------- backend/apps/owasp/api/search/project.py | 22 ++++++++++++++++++++ backend/apps/slack/commands/gsoc.py | 2 +- backend/tests/slack/commands/gsoc_test.py | 2 +- 4 files changed, 24 insertions(+), 27 deletions(-) delete mode 100644 backend/apps/owasp/api/search/gsoc.py diff --git a/backend/apps/owasp/api/search/gsoc.py b/backend/apps/owasp/api/search/gsoc.py deleted file mode 100644 index f860c2472..000000000 --- a/backend/apps/owasp/api/search/gsoc.py +++ /dev/null @@ -1,25 +0,0 @@ -"""OWASP app project gsoc search API.""" - -from functools import lru_cache - -from algoliasearch_django import raw_search - - -@lru_cache -def get_gsoc_projects(year, attributes=None): - """Return GSoC projects from Algolia.""" - from apps.owasp.models.project import Project - - query = f"gsoc{year}" - searchable_attributes = ["idx_custom_tags"] - - params = { - "attributesToHighlight": [], - "restrictSearchableAttributes": searchable_attributes, - } - - if attributes: - params["attributesToRetrieve"] = attributes - - results = raw_search(Project, query, params) - return results.get("hits", []) diff --git a/backend/apps/owasp/api/search/project.py b/backend/apps/owasp/api/search/project.py index 5b13eae5d..fcbfea22a 100644 --- a/backend/apps/owasp/api/search/project.py +++ b/backend/apps/owasp/api/search/project.py @@ -1,5 +1,7 @@ """OWASP app project search API.""" +from functools import lru_cache + from algoliasearch_django import raw_search from apps.owasp.models.project import Project @@ -34,3 +36,23 @@ def get_projects(query, attributes=None, limit=25, page=1, searchable_attributes params["restrictSearchableAttributes"] = searchable_attributes return raw_search(Project, query, params) + + +@lru_cache +def get_gsoc_projects(year, attributes=None): + """Return GSoC projects from Algolia.""" + from apps.owasp.models.project import Project + + query = f"gsoc{year}" + searchable_attributes = ["idx_custom_tags", "idx_topics", "idx_tags"] + + params = { + "attributesToHighlight": [], + "restrictSearchableAttributes": searchable_attributes, + } + + if attributes: + params["attributesToRetrieve"] = attributes + + results = raw_search(Project, query, params) + return results.get("hits", []) diff --git a/backend/apps/slack/commands/gsoc.py b/backend/apps/slack/commands/gsoc.py index dbeb7021e..18fd1e7a4 100644 --- a/backend/apps/slack/commands/gsoc.py +++ b/backend/apps/slack/commands/gsoc.py @@ -18,7 +18,7 @@ def gsoc_handler(ack, command, client): """Slack /gsoc command handler.""" - from apps.owasp.api.search.gsoc import get_gsoc_projects + from apps.owasp.api.search.project import get_gsoc_projects from apps.slack.common.gsoc import GSOC_GENERAL_INFORMATION_BLOCKS ack() diff --git a/backend/tests/slack/commands/gsoc_test.py b/backend/tests/slack/commands/gsoc_test.py index 8bfcc119d..afb114a07 100644 --- a/backend/tests/slack/commands/gsoc_test.py +++ b/backend/tests/slack/commands/gsoc_test.py @@ -77,7 +77,7 @@ def test_handler_with_projects(self, mock_slack_client): settings.SLACK_COMMANDS_ENABLED = True with patch( - "apps.owasp.api.search.gsoc.get_gsoc_projects", + "apps.owasp.api.search.project.get_gsoc_projects", return_value=mock_projects, ): gsoc_handler(ack=MagicMock(), command=command, client=mock_slack_client) From 81f6ae85986f2b0482b5163a373293467c05e9c6 Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets Date: Tue, 4 Feb 2025 14:45:54 -0800 Subject: [PATCH 4/4] Update code --- backend/apps/owasp/api/search/project.py | 22 ---------------------- backend/apps/slack/commands/gsoc.py | 6 +++--- backend/apps/slack/utils.py | 17 +++++++++++++++++ backend/tests/slack/commands/gsoc_test.py | 14 ++++++++------ 4 files changed, 28 insertions(+), 31 deletions(-) diff --git a/backend/apps/owasp/api/search/project.py b/backend/apps/owasp/api/search/project.py index fcbfea22a..5b13eae5d 100644 --- a/backend/apps/owasp/api/search/project.py +++ b/backend/apps/owasp/api/search/project.py @@ -1,7 +1,5 @@ """OWASP app project search API.""" -from functools import lru_cache - from algoliasearch_django import raw_search from apps.owasp.models.project import Project @@ -36,23 +34,3 @@ def get_projects(query, attributes=None, limit=25, page=1, searchable_attributes params["restrictSearchableAttributes"] = searchable_attributes return raw_search(Project, query, params) - - -@lru_cache -def get_gsoc_projects(year, attributes=None): - """Return GSoC projects from Algolia.""" - from apps.owasp.models.project import Project - - query = f"gsoc{year}" - searchable_attributes = ["idx_custom_tags", "idx_topics", "idx_tags"] - - params = { - "attributesToHighlight": [], - "restrictSearchableAttributes": searchable_attributes, - } - - if attributes: - params["attributesToRetrieve"] = attributes - - results = raw_search(Project, query, params) - return results.get("hits", []) diff --git a/backend/apps/slack/commands/gsoc.py b/backend/apps/slack/commands/gsoc.py index 18fd1e7a4..1a644fcbe 100644 --- a/backend/apps/slack/commands/gsoc.py +++ b/backend/apps/slack/commands/gsoc.py @@ -18,8 +18,8 @@ def gsoc_handler(ack, command, client): """Slack /gsoc command handler.""" - from apps.owasp.api.search.project import get_gsoc_projects from apps.slack.common.gsoc import GSOC_GENERAL_INFORMATION_BLOCKS + from apps.slack.utils import get_gsoc_projects ack() if not settings.SLACK_COMMANDS_ENABLED: @@ -37,8 +37,8 @@ def gsoc_handler(ack, command, client): if year in SUPPORTED_YEARS: gsoc_projects = get_gsoc_projects(year) gsoc_projects_markdown = f"{NL}".join( - f" • <{gp.nest_url}|{gp.owasp_name}>" - for gp in sorted(gsoc_projects, key=lambda p: p.owasp_name) + f" • <{gp['idx_url']}|{gp['idx_name']}>" + for gp in sorted(gsoc_projects, key=lambda p: p["idx_name"]) ) additional_info = [] blocks = [ diff --git a/backend/apps/slack/utils.py b/backend/apps/slack/utils.py index 4a67adb4c..539df3c28 100644 --- a/backend/apps/slack/utils.py +++ b/backend/apps/slack/utils.py @@ -20,6 +20,23 @@ def escape(content): return escape_html(content, quote=False) +@lru_cache +def get_gsoc_projects(year): + """Get GSoC projects.""" + from apps.owasp.api.search.project import get_projects + + return get_projects( + attributes=["idx_name", "idx_url"], + query=f"gsoc{year}", + searchable_attributes=[ + "idx_custom_tags", + "idx_languages", + "idx_tags", + "idx_topics", + ], + )["hits"] + + @lru_cache def get_news_data(limit=10, timeout=30): """Get news data.""" diff --git a/backend/tests/slack/commands/gsoc_test.py b/backend/tests/slack/commands/gsoc_test.py index afb114a07..c8e3e011a 100644 --- a/backend/tests/slack/commands/gsoc_test.py +++ b/backend/tests/slack/commands/gsoc_test.py @@ -1,4 +1,4 @@ -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import MagicMock, patch import pytest from django.conf import settings @@ -68,16 +68,18 @@ def test_handler_responses( def test_handler_with_projects(self, mock_slack_client): """Test handler when projects are found for a valid year.""" - mock_project = Mock() - mock_project.nest_url = "https://owasp.org/www-project-bug-logging-tool/" - mock_project.owasp_name = "Test Project" - mock_projects = [mock_project] + mock_projects = [ + { + "idx_name": "Test Project", + "idx_url": "https://owasp.org/www-project-bug-logging-tool/", + } + ] command = {"text": "2024", "user_id": "U123456"} settings.SLACK_COMMANDS_ENABLED = True with patch( - "apps.owasp.api.search.project.get_gsoc_projects", + "apps.slack.utils.get_gsoc_projects", return_value=mock_projects, ): gsoc_handler(ack=MagicMock(), command=command, client=mock_slack_client)