diff --git a/care/facility/api/viewsets/prescription.py b/care/facility/api/viewsets/prescription.py index 5877df588d..91690da11e 100644 --- a/care/facility/api/viewsets/prescription.py +++ b/care/facility/api/viewsets/prescription.py @@ -1,9 +1,9 @@ +from django.db.models.query import QuerySet from django.shortcuts import get_object_or_404 from django_filters import rest_framework as filters from drf_spectacular.utils import extend_schema from rest_framework import mixins, status from rest_framework.decorators import action -from rest_framework.filters import SearchFilter from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet @@ -143,8 +143,10 @@ class MedicineViewSet( GenericViewSet, ): serializer_class = MedibaseMedicineSerializer - permission_classes = (IsAuthenticated,) + # permission_classes = (IsAuthenticated,) queryset = MedibaseMedicine.objects.all() lookup_field = "external_id" - filter_backends = (SearchFilter,) - search_fields = ("name", "generic", "company", "contents", "cims_class") + + def get_queryset(self) -> QuerySet: + search_term = self.request.query_params.get("search_text", "") + return self.queryset.filter(search_vector=search_term) diff --git a/care/facility/migrations/0371_medibasemedicine_search_idx.py b/care/facility/migrations/0371_medibasemedicine_search_idx.py deleted file mode 100644 index 88520555bd..0000000000 --- a/care/facility/migrations/0371_medibasemedicine_search_idx.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.2 on 2023-07-06 11:18 - -import django.contrib.postgres.indexes -from django.contrib.postgres.operations import BtreeGinExtension -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("facility", "0370_merge_20230705_1500"), - ] - - operations = [ - BtreeGinExtension(), - migrations.AddIndex( - model_name="medibasemedicine", - index=django.contrib.postgres.indexes.GinIndex( - fields=["name", "generic", "company", "contents", "cims_class"], - name="search_idx", - ), - ), - ] diff --git a/care/facility/migrations/0371_medibasemedicine_search_vector.py b/care/facility/migrations/0371_medibasemedicine_search_vector.py new file mode 100644 index 0000000000..14eb1d2d3d --- /dev/null +++ b/care/facility/migrations/0371_medibasemedicine_search_vector.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-07-06 17:00 + +import django.contrib.postgres.search +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("facility", "0370_merge_20230705_1500"), + ] + + operations = [ + migrations.AddField( + model_name="medibasemedicine", + name="search_vector", + field=django.contrib.postgres.search.SearchVectorField(null=True), + ), + ] diff --git a/care/facility/models/prescription.py b/care/facility/models/prescription.py index 66bab35a56..7dfb6029b1 100644 --- a/care/facility/models/prescription.py +++ b/care/facility/models/prescription.py @@ -1,6 +1,6 @@ import enum -from django.contrib.postgres.indexes import GinIndex +from django.contrib.postgres.search import SearchVectorField from django.core.exceptions import ValidationError from django.db import models from django.db.models import JSONField @@ -64,17 +64,11 @@ class MedibaseMedicine(BaseModel): cims_class = models.CharField(max_length=255, blank=True, null=True) atc_classification = models.TextField(blank=True, null=True) + search_vector = SearchVectorField(null=True) + def __str__(self): return " - ".join([self.name, self.generic, self.company]) - class Meta: - indexes = [ - GinIndex( - fields=["name", "generic", "company", "contents", "cims_class"], - name="search_idx", - ) - ] - class Prescription(BaseModel): consultation = models.ForeignKey( diff --git a/care/facility/tests/test_medibase_api.py b/care/facility/tests/test_medibase_api.py index 34ce13d7d5..3b3624ed24 100644 --- a/care/facility/tests/test_medibase_api.py +++ b/care/facility/tests/test_medibase_api.py @@ -5,21 +5,21 @@ class TestMedibaseApi(TestBase): def get_url(self, query=None): - return f"/api/v1/medibase/?query={query}" + return f"/api/v1/medicine/?search_text={query}" def test_search_by_name_exact_word(self): response = self.client.get(self.get_url(query="dolo")) self.assertEquals(response.status_code, status.HTTP_200_OK) - self.assertEquals(response.data[0]["name"], "DOLO") + self.assertEquals(response.data.results[0]["name"], "DOLO") def test_search_by_generic_exact_word(self): response = self.client.get(self.get_url(query="pAraCetAmoL")) self.assertEquals(response.status_code, status.HTTP_200_OK) - self.assertEquals(response.data[0]["generic"], "paracetamol") + self.assertEquals(response.data.results[0]["generic"], "paracetamol") def test_search_by_name_and_generic_exact_word(self): response = self.client.get(self.get_url(query="panadol paracetamol")) self.assertEquals(response.status_code, status.HTTP_200_OK) - self.assertEquals(response.data[0]["name"], "PANADOL") - self.assertEquals(response.data[0]["generic"], "paracetamol") - self.assertEquals(response.data[0]["company"], "GSK") + self.assertEquals(response.data.results[0]["name"], "PANADOL") + self.assertEquals(response.data.results[0]["generic"], "paracetamol") + self.assertEquals(response.data.results[0]["company"], "GSK")