diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index cd84115ec9011aad8e555d066d0f2eaadc0ccc8c..76dcf035973dffaa048b6f73cd049355b191d387 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -29,6 +29,8 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): 'place_id': self.lokasi.place_id, 'kegiatan_id': self.kegiatan.id, } + self.kwargs_search_kegiatan = {'query': 'mock',} + self.kwargs_search_kegiatan_fail = {'query': 'this shouldnt exist',} self.kwargs_kegiatan_id = {'kegiatan_id' : self.kegiatan.lokasi.place_id} @@ -52,8 +54,10 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): reverse('add-kegiatan', kwargs=self.kwargs_place_id) self.update_kegiatan_url = reverse('update-kegiatan', kwargs=self.kwargs_add_or_update_kegiatan) - - + self.search_kegiatan_url = reverse('search-kegiatan', + kwargs=self.kwargs_search_kegiatan) + self.search_kegiatan_fail_url = reverse('search-kegiatan', + kwargs=self.kwargs_search_kegiatan_fail) self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) @@ -212,3 +216,27 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertIn("test"+str(counter), item["foto"]) self.assertEqual(item["kegiatan"], self.kegiatan.id) counter += 1 + + def test_can_search_kegiatan(self): + response = Client().get(self.search_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + content = json.loads(response.content.decode('utf-8')) + expected_json = { + str(self.kegiatan.id): { + 'id': self.kegiatan.id, + 'place_id': self.kegiatan.lokasi.place_id, + 'creator': self.kegiatan.user.last_name, + 'nama_kegiatan' : self.kegiatan.nama_kegiatan, + 'penyelenggara': self.kegiatan.penyelenggara, + 'deskripsi': self.kegiatan.deskripsi, + 'links': self.kegiatan.links, + 'narahubung': self.kegiatan.narahubung, + 'time_start': self.kegiatan.time_start, + 'time_end': self.kegiatan.time_end, + }, + } + self.assertEqual(content, expected_json) + + def test_search_kegiatan_empty_result_or_fail(self): + response = Client().get(self.search_kegiatan_fail_url) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 9529f3ef9a6a7449b40c28efd77076ccae8a29f9..64425174db41a8d5240dc4587cbc527edbf27f68 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -38,6 +38,9 @@ urlpatterns = [ path('lokasi/kegiatan-terdekat', views_kegiatan.nearest_kegiatan, name='nearest-kegiatan'), + + path('lokasi/search-kegiatan/', + views_kegiatan.search_kegiatan, name='search-kegiatan'), path('lokasi/add-kegiatan//', views_kegiatan.add_kegiatan, name='add-kegiatan'), diff --git a/informasi_fasilitas/views_kegiatan.py b/informasi_fasilitas/views_kegiatan.py index 7bf9c2c23586bf21abefabda55b57230bc495f28..3228f1a71e6674b9e8d60c626f67050d0aa3bfc5 100644 --- a/informasi_fasilitas/views_kegiatan.py +++ b/informasi_fasilitas/views_kegiatan.py @@ -95,11 +95,24 @@ def list_foto_kegiatan(request, place_id, kegiatan_id): new_dict = {item['id']: dict(item) for item in data_response} return JsonResponse(new_dict, status=HTTPStatus.OK) +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def search_kegiatan(request, query): + query_by_nama = Kegiatan.objects.filter(nama_kegiatan__icontains=query) + query_by_deskripsi = Kegiatan.objects.filter(deskripsi__icontains=query) + query_by_penyelenggara = Kegiatan.objects.filter(penyelenggara__icontains=query) + queryset = query_by_nama | query_by_deskripsi | query_by_penyelenggara + if not queryset.exists(): + raise NotFound(detail="No Kegiatan available") + serializer = KegiatanSerializer(queryset, many=True) + new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} + return JsonResponse(new_dict, status=HTTPStatus.OK) def _clean_json_kegiatan(kegiatan): - kegiatan.pop("user") - kegiatan.pop("lokasi") - return kegiatan + kegiatan.pop("user") + kegiatan.pop("lokasi") + return kegiatan def _add_foto_kegiatan(kegiatan, list_image): @@ -114,9 +127,3 @@ def _create_list_kegiatan_foto(kegiatan, list_image): foto = FotoKegiatan.objects.create(kegiatan=kegiatan, foto=image) list_kegiatan_foto.append(foto) return list_kegiatan_foto - - - - - -