Skip to content

Commit 196b54c

Browse files
committed
feat(orders): add action for delivered order, fix details in paths
1 parent b0a0376 commit 196b54c

File tree

3 files changed

+58
-14
lines changed

3 files changed

+58
-14
lines changed

apps/deliveries/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ class DeliveryAdmin(BaseAdmin):
1414
list_display = ["pk", "order_id", "is_completed", "is_available"]
1515
list_filter = ["status"]
1616
list_editable = ["is_completed", "is_available"]
17-
readonly_fields = ["pk", "created_at", "updated_at"]
17+
readonly_fields = ["pk", "picked_up_at", "delivered_at", "created_at", "updated_at"]
1818
autocomplete_fields = ["order_id", "driver_id"]

apps/orders/viewsets.py

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ def perform_create(self, serializer):
6060
serializer.save(user_id=self.request.user)
6161

6262
@action(
63-
detail=True,
6463
methods=["post"],
65-
permission_classes=[IsClient],
64+
detail=True,
6665
url_path="report",
66+
permission_classes=[IsClient],
6767
)
6868
def report_order(self, request, *args, **kwargs):
6969
"""
@@ -90,10 +90,10 @@ def report_order(self, request, *args, **kwargs):
9090
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
9191

9292
@action(
93-
detail=True,
9493
methods=["patch"],
95-
permission_classes=[IsDispatcher],
94+
detail=True,
9695
url_path="asign_driver",
96+
permission_classes=[IsDispatcher],
9797
)
9898
def assign_driver(self, request, *args, **kwargs):
9999
"""
@@ -123,10 +123,10 @@ def assign_driver(self, request, *args, **kwargs):
123123
)
124124

125125
@action(
126-
detail=True,
127-
permission_classes=[IsDriver],
128126
methods=["patch"],
127+
detail=True,
129128
url_path="accept",
129+
permission_classes=[IsDriver],
130130
)
131131
def accept_order(self, request, *args, **kwargs):
132132
"""
@@ -171,10 +171,10 @@ def accept_order(self, request, *args, **kwargs):
171171
)
172172

173173
@action(
174+
methods=["patch"],
174175
detail=True,
175-
methods=["post"],
176-
permission_classes=[IsDriver],
177176
url_path="reject",
177+
permission_classes=[IsDriver],
178178
)
179179
def reject_order(self, request, *args, **kwargs):
180180
"""
@@ -205,10 +205,10 @@ def reject_order(self, request, *args, **kwargs):
205205
)
206206

207207
@action(
208-
detail=True,
209208
methods=["patch"],
210-
permission_classes=[IsDriver],
209+
detail=True,
211210
url_path="picked_up",
211+
permission_classes=[IsDriver],
212212
)
213213
def picked_up_order(self, request, *args, **kwargs):
214214
"""
@@ -243,6 +243,51 @@ def picked_up_order(self, request, *args, **kwargs):
243243
status=status.HTTP_400_BAD_REQUEST,
244244
)
245245

246+
@action(
247+
methods=["post"],
248+
detail=True,
249+
url_path="delivered",
250+
permission_classes=[IsDriver],
251+
)
252+
def delivered_order(self, request, *args, **kwargs):
253+
"""
254+
Action to mark a delivery status to delivered.
255+
256+
Endpoints:
257+
- PATCH api/v1/orders/{id}/delivered/
258+
"""
259+
order = self.get_object()
260+
driver = request.user.driver
261+
signature = request.data.get("signature")
262+
263+
# The driver is required to submit the user's signature to change the status.
264+
if not signature:
265+
return Response(
266+
{"detail": "Signature is required to mark the delivery as delivered."},
267+
status=status.HTTP_400_BAD_REQUEST,
268+
)
269+
270+
delivery = Delivery.objects.get(
271+
order_id=order,
272+
driver_id=driver,
273+
)
274+
275+
if delivery.status == StatusChoices.PICKED_UP:
276+
# TODO: Add verification code
277+
delivery.signature = signature
278+
delivery.status = StatusChoices.DELIVERED
279+
delivery.delivered_at = timezone.now()
280+
delivery.is_completed = True
281+
delivery.save()
282+
return Response(
283+
{"detail": "Order successfully delivered."},
284+
status=status.HTTP_200_OK,
285+
)
286+
return Response(
287+
{"detail": "The status could not be changed, please try again."},
288+
status=status.HTTP_400_BAD_REQUEST,
289+
)
290+
246291

247292
class OrderItemViewSet(ModelViewSet):
248293
"""

apps/utilities/paths.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""Paths for Utilities App."""
22

33
import os
4-
from django.utils import timezone
54
from django.utils.text import slugify
65

76

@@ -44,9 +43,9 @@ def docs_path(instance, filename):
4443

4544
def signature_path(instance, filename):
4645
"""Generate the upload path for the signature."""
47-
timestamp = timezone.now().strftime("%Y%m%d_%H%M%S")
46+
extension = filename.split(".")[-1]
4847
return os.path.join(
4948
"deliveries",
5049
"signatures",
51-
f"order_{instance.order_id.id}_driver_{instance.driver_id.id}_{timestamp}",
50+
f"order_{instance.order_id.id}.{extension}",
5251
)

0 commit comments

Comments
 (0)