diff --git a/backend/apps/owasp/models/project.py b/backend/apps/owasp/models/project.py index e2279d8af..30cb5cb4a 100644 --- a/backend/apps/owasp/models/project.py +++ b/backend/apps/owasp/models/project.py @@ -230,15 +230,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..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.models.project import Project 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: @@ -35,10 +35,10 @@ 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) + 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 a77438786..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.models.project.Project.get_gsoc_projects", + "apps.slack.utils.get_gsoc_projects", return_value=mock_projects, ): gsoc_handler(ack=MagicMock(), command=command, client=mock_slack_client)