Skip to content

Commit 60df929

Browse files
authored
Merge pull request #603 from praekeltfoundation/capi-backend-changes
Api to view/update WhatsAppTemplateSendStatus
2 parents 1a930a3 + a9422e9 commit 60df929

File tree

4 files changed

+94
-1
lines changed

4 files changed

+94
-1
lines changed

eventstore/serializers.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
PrebirthRegistration,
2828
PublicRegistration,
2929
ResearchOptinSwitch,
30+
WhatsAppTemplateSendStatus,
3031
)
3132

3233
from .validators import posix_timestamp
@@ -466,3 +467,17 @@ class DeliveryFailureSerializer(serializers.Serializer):
466467
contact_id = serializers.CharField()
467468
timestamp = serializers.DateTimeField()
468469
number_of_failures = serializers.IntegerField(required=False, read_only=True)
470+
471+
472+
class WhatsAppTemplateSendStatusSerializer(serializers.ModelSerializer):
473+
class Meta:
474+
model = WhatsAppTemplateSendStatus
475+
fields = "__all__"
476+
read_only_fields = (
477+
"id",
478+
"message_id",
479+
"sent_at",
480+
"event_received_at",
481+
"preferred_channel",
482+
"status",
483+
)

eventstore/tests/test_views.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
PrebirthRegistration,
4747
PublicRegistration,
4848
ResearchOptinSwitch,
49+
WhatsAppTemplateSendStatus,
4950
)
5051
from eventstore.serializers import (
5152
Covid19TriageSerializer,
@@ -3183,3 +3184,62 @@ def test_dont_update_existing_deliveryfailure(self):
31833184
[df] = DeliveryFailure.objects.all()
31843185
self.assertEqual(str(df.contact_id), "27820001001")
31853186
self.assertEqual(df.number_of_failures, 1)
3187+
3188+
3189+
class WhatsAppTemplateSendStatusViewTests(APITestCase):
3190+
def setUp(self):
3191+
self.status = WhatsAppTemplateSendStatus.objects.create(
3192+
message_id="test-message-id"
3193+
)
3194+
self.url = reverse("whatsapptemplatesendstatus-detail", args=[self.status.id])
3195+
3196+
def test_authentication_required(self):
3197+
"""
3198+
There must be an authenticated user to make the request
3199+
"""
3200+
response = self.client.post(self.url)
3201+
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
3202+
3203+
def test_permission_required(self):
3204+
"""
3205+
The authenticated user must have the correct permissions to make the request
3206+
"""
3207+
user = get_user_model().objects.create_user("test")
3208+
self.client.force_authenticate(user)
3209+
response = self.client.post(self.url)
3210+
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
3211+
3212+
def test_get_object(self):
3213+
"""
3214+
Should be able to get a single object
3215+
"""
3216+
user = get_user_model().objects.create_user("test")
3217+
3218+
user.user_permissions.add(
3219+
Permission.objects.get(codename="view_whatsapptemplatesendstatus")
3220+
)
3221+
self.client.force_authenticate(user)
3222+
3223+
response = self.client.get(self.url)
3224+
self.assertEqual(response.status_code, status.HTTP_200_OK)
3225+
self.assertEqual(response.json()["id"], str(self.status.id))
3226+
self.assertEqual(response.json()["message_id"], self.status.message_id)
3227+
3228+
def test_change_object(self):
3229+
"""
3230+
Should be able to update an object
3231+
"""
3232+
user = get_user_model().objects.create_user("test")
3233+
3234+
user.user_permissions.add(
3235+
Permission.objects.get(codename="change_whatsapptemplatesendstatus")
3236+
)
3237+
self.client.force_authenticate(user)
3238+
3239+
response = self.client.patch(
3240+
self.url, {"registration_completed_at": timezone.now()}
3241+
)
3242+
3243+
self.status.refresh_from_db()
3244+
self.assertEqual(response.status_code, status.HTTP_200_OK)
3245+
self.assertIsNotNone(self.status.registration_completed_at)

eventstore/views.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
from rest_framework import generics, permissions, serializers, status
99
from rest_framework.authentication import TokenAuthentication
1010
from rest_framework.exceptions import ValidationError
11-
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin
11+
from rest_framework.mixins import (
12+
CreateModelMixin,
13+
ListModelMixin,
14+
RetrieveModelMixin,
15+
UpdateModelMixin,
16+
)
1217
from rest_framework.pagination import CursorPagination
1318
from rest_framework.permissions import DjangoModelPermissions
1419
from rest_framework.response import Response
@@ -40,6 +45,7 @@
4045
PrebirthRegistration,
4146
PublicRegistration,
4247
ResearchOptinSwitch,
48+
WhatsAppTemplateSendStatus,
4349
)
4450
from eventstore.serializers import (
4551
AdaAssessmentNotificationSerializer,
@@ -74,6 +80,7 @@
7480
PublicRegistrationSerializer,
7581
ResearchOptinSwitchSerializer,
7682
TurnOutboundSerializer,
83+
WhatsAppTemplateSendStatusSerializer,
7784
WhatsAppWebhookSerializer,
7885
)
7986
from eventstore.tasks import (
@@ -654,3 +661,12 @@ def post(self, request, *args, **kwargs):
654661
return Response({}, status=status.HTTP_201_CREATED)
655662

656663
return Response({}, status=status.HTTP_200_OK)
664+
665+
666+
class WhatsAppTemplateSendStatusViewSet(
667+
GenericViewSet, RetrieveModelMixin, UpdateModelMixin
668+
):
669+
queryset = WhatsAppTemplateSendStatus.objects.all()
670+
serializer_class = WhatsAppTemplateSendStatusSerializer
671+
permission_classes = (DjangoViewModelPermissions,)
672+
filter_backends = [filters.DjangoFilterBackend]

ndoh_hub/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
PublicRegistrationViewSet,
3838
ResearchOptinSwitchViewSet,
3939
WhatsAppEventsViewSet,
40+
WhatsAppTemplateSendStatusViewSet,
4041
)
4142
from ndoh_hub.decorators import internal_only
4243

@@ -74,6 +75,7 @@
7475
)
7576
v2router.register("deliveryfailure", DeliveryFailureViewSet)
7677
v2router.register("events", WhatsAppEventsViewSet)
78+
v2router.register("whatsapptemplatesendstatus", WhatsAppTemplateSendStatusViewSet)
7779

7880
v3router = routers.DefaultRouter()
7981
v3router.register("covid19triage", Covid19TriageV2ViewSet, basename="covid19triagev2")

0 commit comments

Comments
 (0)