diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e622973..992b7a6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,10 @@ Change Log Unreleased +[1.54.0] - 2024-10-02 +--------------------- +* perf: Added caching to `XBlockSkillsViewSet` list endpoint to improve performance and reduce redundant database queries + [1.53.0] - 2024-08-22 --------------------- * perf: Introduced db_index on the `created` and `is_blacklisted` fields in `XBlockSkillData` model diff --git a/taxonomy/__init__.py b/taxonomy/__init__.py index d450b26..738ee11 100644 --- a/taxonomy/__init__.py +++ b/taxonomy/__init__.py @@ -15,6 +15,6 @@ # 2. MINOR version when you add functionality in a backwards compatible manner, and # 3. PATCH version when you make backwards compatible bug fixes. # More details can be found at https://semver.org/ -__version__ = '1.53.0' +__version__ = '1.54.0' default_app_config = 'taxonomy.apps.TaxonomyConfig' # pylint: disable=invalid-name diff --git a/taxonomy/api/v1/views.py b/taxonomy/api/v1/views.py index fd1db4c..8d31fbf 100644 --- a/taxonomy/api/v1/views.py +++ b/taxonomy/api/v1/views.py @@ -15,6 +15,8 @@ from django.db.models import Count, Prefetch, Sum from django.shortcuts import get_object_or_404 +from edx_django_utils.cache import TieredCache, get_cache_key + from taxonomy.api.filters import SkillNameFilter, XBlocksFilter from taxonomy.api.permissions import IsOwner from taxonomy.api.v1.serializers import ( @@ -40,6 +42,8 @@ XBlockSkills, ) +CACHE_TIMEOUT_XBLOCK_SKILLS_SECONDS = 60 * 60 + class TaxonomyAPIViewSetMixin: """ @@ -320,6 +324,18 @@ def get_queryset(self): ), ).only('id', 'skills', 'usage_key', 'requires_verification', 'auto_processed', 'hash_content') + def list(self, request, *args, **kwargs): + cache_key = get_cache_key(domain='taxonomy', subdomain='xblock_skills', params=request.query_params) + + cached_response = TieredCache.get_cached_response(cache_key) + if cached_response.is_found: + return Response(cached_response.value) + + response = super().list(request, *args, **kwargs) + + TieredCache.set_all_tiers(cache_key, response.data, CACHE_TIMEOUT_XBLOCK_SKILLS_SECONDS) + + return response class JobPathAPIView(TaxonomyAPIViewSetMixin, RetrieveAPIView): """