Skip to content

Commit 4e329de

Browse files
committed
aaq content response endpoint
1 parent 0db6510 commit 4e329de

File tree

5 files changed

+132
-3
lines changed

5 files changed

+132
-3
lines changed

aaq/serializers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,13 @@ class SearchSerializer(serializers.Serializer):
4343
query_text = serializers.CharField(required=True)
4444
generate_llm_response = serializers.BooleanField(required=False)
4545
query_metadata = serializers.JSONField(required=False)
46+
47+
48+
class ContentFeedbackSerializer(serializers.Serializer):
49+
feedback_secret_key = serializers.CharField(required=True)
50+
feedback_sentiment = serializers.ChoiceField(
51+
required=False, choices=["negative", "positive"]
52+
)
53+
feedback_text = serializers.CharField(required=False)
54+
query_id = serializers.IntegerField(required=True)
55+
content_id = serializers.IntegerField(required=True)

aaq/tasks.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,23 @@ def send_feedback_task(secret_key, inbound_id, feedback_type, **kwargs):
4444
soft_time_limit=10,
4545
time_limit=15,
4646
)
47-
def send_feedback_task_v2(feedback_secret_key, query_id, **kwargs):
47+
def send_feedback_task_v2(feedback_secret_key, query_id, content_id=None, **kwargs):
4848
data = {
4949
"feedback_secret_key": feedback_secret_key,
5050
"query_id": query_id,
5151
}
5252

53+
endpoint = "/response-feedback"
54+
5355
if "feedback_sentiment" in kwargs:
5456
data["feedback_sentiment"] = kwargs["feedback_sentiment"]
5557
if "feedback_text" in kwargs:
5658
data["feedback_text"] = kwargs["feedback_text"]
59+
if "content_id" in kwargs:
60+
data["content_id"] = kwargs["content_id"]
61+
endpoint = "/content-feedback"
5762

58-
url = urljoin(settings.AAQ_V2_API_URL, "/response-feedback")
63+
url = urljoin(settings.AAQ_V2_API_URL, endpoint)
5964
headers = {
6065
"Authorization": settings.AAQ_V2_AUTH,
6166
"Content-Type": "application/json",

aaq/tests/test_views.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,3 +444,86 @@ def test_search_invalid_request_body(self):
444444

445445
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
446446
self.assertEqual(response.json(), {"query_text": ["This field is required."]})
447+
448+
449+
class ContentFeedbackViewTests(APITestCase):
450+
url = reverse("aaq-content-feedback")
451+
452+
@responses.activate
453+
def test_content_feedback_view(self):
454+
"""Test that we can submit content feedback on an FAQ"""
455+
payload = {
456+
"feedback_secret_key": "secret-key-12345-abcde",
457+
"query_id": 1,
458+
"content_id": 1,
459+
"feedback_sentiment": "negative",
460+
"feedback_text": "Not helpful",
461+
}
462+
user = get_user_model().objects.create_user("test")
463+
self.client.force_authenticate(user)
464+
fakeTask = FakeTask()
465+
responses.add_callback(
466+
responses.POST,
467+
"http://aaq_v2/content-feedback",
468+
callback=fakeTask.call_add_feedback_task_v2,
469+
content_type="application/json",
470+
)
471+
472+
response = self.client.post(self.url, data=payload, format="json")
473+
474+
assert response.status_code == 200
475+
476+
def test_content_feedback_invalid_view(self):
477+
"""Test that we can submit content feedback"""
478+
payload = json.dumps(
479+
{
480+
"feedback_secret_key": "secret-key-12345-abcde",
481+
"query_id": 1,
482+
}
483+
)
484+
user = get_user_model().objects.create_user("test")
485+
self.client.force_authenticate(user)
486+
fakeTask = FakeTask()
487+
responses.add_callback(
488+
responses.POST,
489+
"http://aaq_v2/content-feedback",
490+
callback=fakeTask.call_add_feedback_task_v2,
491+
content_type="application/json",
492+
)
493+
494+
response = self.client.post(
495+
self.url, data=payload, content_type="application/json"
496+
)
497+
498+
assert response.status_code == 400
499+
assert response.json() == {"content_id": ["This field is required."]}
500+
501+
def test_response_feedback_invalid_feedback_text_view(self):
502+
"""Test that we can submit response feedback"""
503+
payload = json.dumps(
504+
{
505+
"feedback_secret_key": "secret-key-12345-abcde",
506+
"query_id": 1,
507+
"content_id": 1,
508+
"feedback_sentiment": "test",
509+
"feedback_text": "feedback test",
510+
}
511+
)
512+
user = get_user_model().objects.create_user("test")
513+
self.client.force_authenticate(user)
514+
fakeTask = FakeTask()
515+
responses.add_callback(
516+
responses.POST,
517+
"http://aaq_v2/response-feedback",
518+
callback=fakeTask.call_add_feedback_task_v2,
519+
content_type="application/json",
520+
)
521+
522+
response = self.client.post(
523+
self.url, data=payload, content_type="application/json"
524+
)
525+
526+
assert response.status_code == 400
527+
assert response.json() == {
528+
"feedback_sentiment": ['"test" is not a valid choice.']
529+
}

aaq/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
views.response_feedback,
2929
name="aaq-response-feedback",
3030
),
31+
re_path(
32+
r"^api/v2/content-feedback",
33+
views.content_feedback,
34+
name="aaq-content-feedback",
35+
),
3136
re_path(
3237
r"^api/v2/search",
3338
views.search,

aaq/views.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from aaq.serializers import (
1212
AddFeedbackSerializer,
13+
ContentFeedbackSerializer,
1314
InboundCheckSerializer,
1415
ResponseFeedbackSerializer,
1516
SearchSerializer,
@@ -122,9 +123,34 @@ def check_urgency(request, *args, **kwargs):
122123

123124
@api_view(("POST",))
124125
@renderer_classes((JSONRenderer,))
125-
def response_feedback(request, *args, **kwargs):
126+
def content_feedback(request, *args, **kwargs):
127+
serializer = ContentFeedbackSerializer(data=request.data)
128+
129+
serializer.is_valid(raise_exception=True)
130+
feedback_secret_key = serializer.validated_data["feedback_secret_key"]
131+
query_id = serializer.validated_data["query_id"]
132+
content_id = serializer.validated_data["content_id"]
126133

134+
task_kwargs = {}
135+
if "feedback_sentiment" in serializer.validated_data:
136+
task_kwargs["feedback_sentiment"] = serializer.validated_data[
137+
"feedback_sentiment"
138+
]
139+
if "feedback_text" in serializer.validated_data:
140+
task_kwargs["feedback_text"] = serializer.validated_data["feedback_text"]
141+
142+
send_feedback_task_v2.delay(
143+
feedback_secret_key, query_id, content_id, **task_kwargs
144+
)
145+
146+
return Response(status=status.HTTP_200_OK)
147+
148+
149+
@api_view(("POST",))
150+
@renderer_classes((JSONRenderer,))
151+
def response_feedback(request, *args, **kwargs):
127152
serializer = ResponseFeedbackSerializer(data=request.data)
153+
128154
serializer.is_valid(raise_exception=True)
129155
feedback_secret_key = serializer.validated_data["feedback_secret_key"]
130156
query_id = serializer.validated_data["query_id"]

0 commit comments

Comments
 (0)