Skip to content

Commit

Permalink
Merge pull request #615 from praekeltfoundation/aaq-v2-content-feedback
Browse files Browse the repository at this point in the history
aaq content response endpoint
  • Loading branch information
Hlamallama committed Aug 6, 2024
2 parents 0db6510 + cad6ebe commit ee2a1fd
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 3 deletions.
10 changes: 10 additions & 0 deletions aaq/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,13 @@ class SearchSerializer(serializers.Serializer):
query_text = serializers.CharField(required=True)
generate_llm_response = serializers.BooleanField(required=False)
query_metadata = serializers.JSONField(required=False)


class ContentFeedbackSerializer(serializers.Serializer):
feedback_secret_key = serializers.CharField(required=True)
feedback_sentiment = serializers.ChoiceField(
required=False, choices=["negative", "positive"]
)
feedback_text = serializers.CharField(required=False)
query_id = serializers.IntegerField(required=True)
content_id = serializers.IntegerField(required=True)
9 changes: 7 additions & 2 deletions aaq/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,23 @@ def send_feedback_task(secret_key, inbound_id, feedback_type, **kwargs):
soft_time_limit=10,
time_limit=15,
)
def send_feedback_task_v2(feedback_secret_key, query_id, **kwargs):
def send_feedback_task_v2(feedback_secret_key, query_id, content_id=None, **kwargs):
data = {
"feedback_secret_key": feedback_secret_key,
"query_id": query_id,
}

path = "/response-feedback"

if "feedback_sentiment" in kwargs:
data["feedback_sentiment"] = kwargs["feedback_sentiment"]
if "feedback_text" in kwargs:
data["feedback_text"] = kwargs["feedback_text"]
if content_id:
data["content_id"] = content_id
path = "/content-feedback"

url = urljoin(settings.AAQ_V2_API_URL, "/response-feedback")
url = urljoin(settings.AAQ_V2_API_URL, path)
headers = {
"Authorization": settings.AAQ_V2_AUTH,
"Content-Type": "application/json",
Expand Down
83 changes: 83 additions & 0 deletions aaq/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,3 +444,86 @@ def test_search_invalid_request_body(self):

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), {"query_text": ["This field is required."]})


class ContentFeedbackViewTests(APITestCase):
url = reverse("aaq-content-feedback")

@responses.activate
def test_content_feedback_view(self):
"""Test that we can submit content feedback on an FAQ"""
payload = {
"feedback_secret_key": "secret-key-12345-abcde",
"query_id": 1,
"content_id": 1,
"feedback_sentiment": "negative",
"feedback_text": "Not helpful",
}
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeTask = FakeTask()
responses.add_callback(
responses.POST,
"http://aaq_v2/content-feedback",
callback=fakeTask.call_add_feedback_task_v2,
content_type="application/json",
)

response = self.client.post(self.url, data=payload, format="json")

assert response.status_code == 200

def test_content_feedback_invalid_view(self):
"""Test that we can submit content feedback"""
payload = json.dumps(
{
"feedback_secret_key": "secret-key-12345-abcde",
"query_id": 1,
}
)
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeTask = FakeTask()
responses.add_callback(
responses.POST,
"http://aaq_v2/content-feedback",
callback=fakeTask.call_add_feedback_task_v2,
content_type="application/json",
)

response = self.client.post(
self.url, data=payload, content_type="application/json"
)

assert response.status_code == 400
assert response.json() == {"content_id": ["This field is required."]}

def test_response_feedback_invalid_feedback_text_view(self):
"""Test that we can submit response feedback"""
payload = json.dumps(
{
"feedback_secret_key": "secret-key-12345-abcde",
"query_id": 1,
"content_id": 1,
"feedback_sentiment": "test",
"feedback_text": "feedback test",
}
)
user = get_user_model().objects.create_user("test")
self.client.force_authenticate(user)
fakeTask = FakeTask()
responses.add_callback(
responses.POST,
"http://aaq_v2/response-feedback",
callback=fakeTask.call_add_feedback_task_v2,
content_type="application/json",
)

response = self.client.post(
self.url, data=payload, content_type="application/json"
)

assert response.status_code == 400
assert response.json() == {
"feedback_sentiment": ['"test" is not a valid choice.']
}
5 changes: 5 additions & 0 deletions aaq/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
views.response_feedback,
name="aaq-response-feedback",
),
re_path(
r"^api/v2/content-feedback",
views.content_feedback,
name="aaq-content-feedback",
),
re_path(
r"^api/v2/search",
views.search,
Expand Down
28 changes: 27 additions & 1 deletion aaq/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from aaq.serializers import (
AddFeedbackSerializer,
ContentFeedbackSerializer,
InboundCheckSerializer,
ResponseFeedbackSerializer,
SearchSerializer,
Expand Down Expand Up @@ -122,9 +123,34 @@ def check_urgency(request, *args, **kwargs):

@api_view(("POST",))
@renderer_classes((JSONRenderer,))
def response_feedback(request, *args, **kwargs):
def content_feedback(request, *args, **kwargs):
serializer = ContentFeedbackSerializer(data=request.data)

serializer.is_valid(raise_exception=True)
feedback_secret_key = serializer.validated_data["feedback_secret_key"]
query_id = serializer.validated_data["query_id"]
content_id = serializer.validated_data["content_id"]

task_kwargs = {}
if "feedback_sentiment" in serializer.validated_data:
task_kwargs["feedback_sentiment"] = serializer.validated_data[
"feedback_sentiment"
]
if "feedback_text" in serializer.validated_data:
task_kwargs["feedback_text"] = serializer.validated_data["feedback_text"]

send_feedback_task_v2.delay(
feedback_secret_key, query_id, content_id, **task_kwargs
)

return Response(status=status.HTTP_200_OK)


@api_view(("POST",))
@renderer_classes((JSONRenderer,))
def response_feedback(request, *args, **kwargs):
serializer = ResponseFeedbackSerializer(data=request.data)

serializer.is_valid(raise_exception=True)
feedback_secret_key = serializer.validated_data["feedback_secret_key"]
query_id = serializer.validated_data["query_id"]
Expand Down

0 comments on commit ee2a1fd

Please sign in to comment.