Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "3.0.3",
"version": "3.1.7",
"configurations": [

{
Expand Down
2 changes: 1 addition & 1 deletion backend/hr/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"""

__title__ = 'booking-sys'
__version__ = '3.1.6'
__version__ = '3.1.7'
__author__ = 'Conor Heffron'

# Version synonym
Expand Down
23 changes: 22 additions & 1 deletion backend/hr/test_apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,30 @@ def test_bookings_by_id_put_conflict(self):
data = json.loads(response.content.decode())
assert "Already Reserved" in data["error"]

def test_bookings_by_id_delete_success(self):
"""HR Test case test_bookings_by_id_delete_success"""
# Ensure the reservation exists
assert Reservation.objects.filter(id=self.reservation.id).exists()
request = self.factory.delete(f"/api/reservations/{self.reservation.id}/")
response = self.views.bookings_by_id(request, self.reservation.id)
assert response.status_code == 200
data = json.loads(response.content.decode())
assert data["success"] is True
assert "deleted" in data["message"].lower()
# Confirm it's deleted from the database
assert not Reservation.objects.filter(id=self.reservation.id).exists()

def test_bookings_by_id_delete_404(self):
"""HR Test case test_bookings_by_id_delete_404"""
# Attempt to delete a reservation that does not exist
request = self.factory.delete("/api/reservations/9999/")
with pytest.raises(Exception):
self.views.bookings_by_id(request, 9999)

def test_bookings_by_id_method_not_allowed(self):
"""HR Test case test_bookings_by_id_method_not_allowed"""
request = self.factory.delete(f"/api/reservations/{self.reservation.id}/")
# PATCH is not allowed
request = self.factory.patch(f"/api/reservations/{self.reservation.id}/")
response = self.views.bookings_by_id(request, self.reservation.id)
assert response.status_code == 405
data = json.loads(response.content.decode())
Expand Down
2 changes: 1 addition & 1 deletion backend/hr/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

path('bookings', table_view, name='bookings_by_date'),

# Get or update a booking by ID (GET, PUT): /bookingsById/<reservation_id>
# Get, Delete or update a booking by ID (GET, PUT): /bookingsById/<reservation_id>
path('bookingsById/<int:reservation_id>', bookings_by_id_view, name='bookingsById'),

path('reservations', save_reservation_view, name='save_reservation'),
Expand Down
25 changes: 21 additions & 4 deletions backend/hr/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ def bookings_by_id(cls, request, reservation_id):
"""
GET: Return booking info by id as JSON
PUT: Update booking info by id from JSON body
DELETE: Delete booking by id
- Do not allow editing of past bookings
- Do not allow updating to a past date/time
"""
Expand Down Expand Up @@ -190,6 +191,9 @@ def bookings_by_id(cls, request, reservation_id):
"success": True
}
return JsonResponse(data, status=200)
elif request.method == "DELETE":
reservation.delete()
return JsonResponse({"success": True, "message": "Booking deleted."}, status=200)
else:
return JsonResponse({"error": "Method not allowed."}, status=405)

Expand Down Expand Up @@ -269,7 +273,7 @@ def _find_bookings_by_date(self, date):
# Order by reservation_date DESC, reservation_slot DESC for most recent to top
queryset = Reservation.objects.filter(
reservation_date=query_date
).order_by('-reservation_date', '-reservation_slot')
).order_by('reservation_date', 'reservation_slot')
logger.info('GET by date (%s) Query set results: %s',
query_date,
list(queryset.values('id',
Expand All @@ -279,7 +283,7 @@ def _find_bookings_by_date(self, date):
except (TypeError, ValueError):
queryset = Reservation.objects.filter(
reservation_date__gt=today
).order_by('-reservation_date', '-reservation_slot')
).order_by('reservation_date', 'reservation_slot')
logger.info('GET by future date (after %s) Query set results: %s',
today,
list(queryset.values('id',
Expand Down Expand Up @@ -343,9 +347,22 @@ def table_view(request):
],
responses={200: OpenApiTypes.OBJECT, 404: OpenApiTypes.OBJECT}
),
put=extend_schema(exclude=True) # <--- this hides PUT in Swagger!
put=extend_schema(exclude=True), # <--- this hides PUT in Swagger!
delete=extend_schema(exclude=True)
# delete=extend_schema(
# description="DELETE: Delete booking by id",
# parameters=[
# OpenApiParameter(
# name="reservation_id",
# type=OpenApiTypes.INT,
# location=OpenApiParameter.PATH,
# description="Reservation ID"
# )
# ],
# responses={200: OpenApiTypes.OBJECT, 404: OpenApiTypes.OBJECT}
# )
)
@api_view(['GET', 'PUT'])
@api_view(['GET', 'PUT', 'DELETE'])
def bookings_by_id_view(request, reservation_id):
return Views.bookings_by_id(request, reservation_id)

Expand Down
Loading