Skip to content

Commit

Permalink
Revert "Revert "GSR Revamp"" (#237)
Browse files Browse the repository at this point in the history
  • Loading branch information
vcai122 authored Jan 26, 2024
1 parent d5bbcda commit df7b8ee
Show file tree
Hide file tree
Showing 9 changed files with 512 additions and 603 deletions.
763 changes: 371 additions & 392 deletions backend/gsr_booking/api_wrapper.py

Large diffs are not rendered by default.

106 changes: 0 additions & 106 deletions backend/gsr_booking/group_logic.py

This file was deleted.

24 changes: 24 additions & 0 deletions backend/gsr_booking/migrations/0011_alter_reservation_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 3.2.19 on 2023-11-12 19:21

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("gsr_booking", "0010_remove_gsrbooking_reminder_sent_and_more"),
]

operations = [
migrations.AlterField(
model_name="reservation",
name="group",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="gsr_booking.group",
),
),
]
24 changes: 6 additions & 18 deletions backend/gsr_booking/models.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import requests
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
from django.utils import timezone
from requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout


User = get_user_model()
Expand Down Expand Up @@ -45,20 +42,7 @@ def save(self, *args, **kwargs):
super().save(*args, **kwargs)

def check_wharton(self):
# not using api_wrapper.py to prevent circular dependency
url = f"https://apps.wharton.upenn.edu/gsr/api/v1/{self.user.username}/privileges"
try:
response = requests.get(
url, headers={"Authorization": f"Token {settings.WHARTON_TOKEN}"}
)

if response.status_code != 200:
return None

res_json = response.json()
return res_json.get("type") == "whartonMBA" or res_json.get("type") == "whartonUGR"
except (ConnectTimeout, ReadTimeout, KeyError, ConnectionError):
return None
return WhartonGSRBooker.is_wharton(self.user)

class Meta:
verbose_name = "Group Membership"
Expand Down Expand Up @@ -120,7 +104,7 @@ class Reservation(models.Model):
start = models.DateTimeField(default=timezone.now)
end = models.DateTimeField(default=timezone.now)
creator = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE, null=True, blank=True)
is_cancelled = models.BooleanField(default=False)
reminder_sent = models.BooleanField(default=False)

Expand All @@ -136,3 +120,7 @@ class GSRBooking(models.Model):
start = models.DateTimeField(default=timezone.now)
end = models.DateTimeField(default=timezone.now)
is_cancelled = models.BooleanField(default=False)


# import at end to prevent circular dependency
from gsr_booking.api_wrapper import WhartonGSRBooker # noqa: E402
2 changes: 0 additions & 2 deletions backend/gsr_booking/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
BookRoom,
CancelRoom,
CheckWharton,
CreditsView,
GroupMembershipViewSet,
GroupViewSet,
Locations,
Expand All @@ -33,5 +32,4 @@
path("book/", BookRoom.as_view(), name="book"),
path("cancel/", CancelRoom.as_view(), name="cancel"),
path("reservations/", ReservationsView.as_view(), name="reservations"),
path("credits/", CreditsView.as_view(), name="credits"),
]
61 changes: 30 additions & 31 deletions backend/gsr_booking/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
from rest_framework.response import Response
from rest_framework.views import APIView

from gsr_booking.api_wrapper import APIError, BookingWrapper
from gsr_booking.group_logic import GroupBook
from gsr_booking.api_wrapper import APIError, GSRBooker, WhartonGSRBooker
from gsr_booking.models import GSR, Group, GroupMembership, GSRBooking
from gsr_booking.serializers import (
GroupMembershipSerializer,
Expand Down Expand Up @@ -164,11 +163,6 @@ def get_queryset(self):
)


# umbrella class used for accessing GSR API's (needed for token authentication)
BW = BookingWrapper()
GB = GroupBook()


class Locations(generics.ListAPIView):
"""Lists all available locations to book from"""

Expand All @@ -192,8 +186,11 @@ def get_queryset(self):


class CheckWharton(APIView):

permission_classes = [IsAuthenticated]

def get(self, request):
return Response({"is_wharton": BW.is_wharton(request.user)})
return Response({"is_wharton": WhartonGSRBooker.is_wharton(request.user)})


class Availability(APIView):
Expand All @@ -211,11 +208,16 @@ def get(self, request, lid, gid):
end = request.GET.get("end")

try:
group = Group.objects.get(name="Penn Labs")
if request.user in group.members.all():
return Response(GB.get_availability(lid, gid, start, end, request.user, group))
else:
return Response(BW.get_availability(lid, gid, start, end, request.user))
return Response(
GSRBooker.get_availability(
lid,
gid,
start,
end,
request.user,
request.user.booking_groups.filter(name="Penn Labs").first(),
)
)
except APIError as e:
return Response({"error": str(e)}, status=400)

Expand All @@ -233,11 +235,15 @@ def post(self, request):
room_name = request.data["room_name"]

try:
group = Group.objects.get(name="Penn Labs")
if request.user in group.members.all():
GB.book_room(gid, room_id, room_name, start, end, request.user, group)
else:
BW.book_room(gid, room_id, room_name, start, end, request.user)
GSRBooker.book_room(
gid,
room_id,
room_name,
start,
end,
request.user,
request.user.booking_groups.filter(name="Penn Labs").first(),
)
return Response({"detail": "success"})
except APIError as e:
return Response({"error": str(e)}, status=400)
Expand All @@ -254,7 +260,7 @@ def post(self, request):
booking_id = request.data["booking_id"]

try:
BW.cancel_room(booking_id, request.user)
GSRBooker.cancel_room(booking_id, request.user)
return Response({"detail": "success"})
except APIError as e:
return Response({"error": str(e)}, status=400)
Expand All @@ -268,15 +274,8 @@ class ReservationsView(APIView):
permission_classes = [IsAuthenticated]

def get(self, request):
return Response(BW.get_reservations(request.user))


class CreditsView(APIView):
"""
Gets credits for a User
"""

permission_classes = [IsAuthenticated]

def get(self, request):
return Response(BW.check_credits(request.user))
return Response(
GSRBooker.get_reservations(
request.user, request.user.booking_groups.filter(name="Penn Labs").first()
)
)
1 change: 1 addition & 0 deletions backend/setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
max-line-length = 100
exclude = .venv, migrations
inline-quotes = double
ignore = E203, W503

[isort]
default_section = THIRDPARTY
Expand Down
16 changes: 8 additions & 8 deletions backend/tests/gsr_booking/test_gsr_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,21 +92,21 @@ def test_recent(self):
self.assertIn("image_url", res_json[0])
self.assertNotEqual(res_json[0]["id"], res_json[1]["id"])

@mock.patch("gsr_booking.views.BW.is_wharton", is_wharton_false)
@mock.patch("gsr_booking.api_wrapper.WhartonBookingWrapper.is_wharton", is_wharton_false)
def test_get_wharton_false(self):
response = self.client.get(reverse("is-wharton"))
res_json = json.loads(response.content)
self.assertEqual(1, len(res_json))
self.assertFalse(res_json["is_wharton"])

@mock.patch("gsr_booking.views.BW.is_wharton", is_wharton_true)
@mock.patch("gsr_booking.api_wrapper.WhartonBookingWrapper.is_wharton", is_wharton_true)
def test_get_wharton_true(self):
response = self.client.get(reverse("is-wharton"))
res_json = json.loads(response.content)
self.assertEqual(1, len(res_json))
self.assertTrue(res_json["is_wharton"])

@mock.patch("gsr_booking.views.BW.get_availability", libcal_availability)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.get_availability", libcal_availability)
def test_availability_libcal(self):
response = self.client.get(reverse("availability", args=["1086", "1889"]))
res_json = json.loads(response.content)
Expand All @@ -120,7 +120,7 @@ def test_availability_libcal(self):
self.assertIn("id", room)
self.assertIn("availability", room)

@mock.patch("gsr_booking.views.BW.get_availability", wharton_availability)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.get_availability", wharton_availability)
def test_availability_wharton(self):
response = self.client.get(reverse("availability", args=["JMHH", "1"]))
res_json = json.loads(response.content)
Expand All @@ -134,7 +134,7 @@ def test_availability_wharton(self):
self.assertIn("id", room)
self.assertIn("availability", room)

@mock.patch("gsr_booking.views.BW.book_room", book_cancel_room)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.book_room", book_cancel_room)
def test_book_libcal(self):
payload = {
"start_time": "2021-11-21T18:30:00-05:00",
Expand All @@ -150,7 +150,7 @@ def test_book_libcal(self):
self.assertEqual(1, len(res_json))
self.assertEqual("success", res_json["detail"])

@mock.patch("gsr_booking.views.BW.book_room", book_cancel_room)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.book_room", book_cancel_room)
def test_book_wharton(self):
payload = {
"start_time": "2021-11-21T18:30:00-05:00",
Expand All @@ -166,7 +166,7 @@ def test_book_wharton(self):
self.assertEqual(1, len(res_json))
self.assertEqual("success", res_json["detail"])

@mock.patch("gsr_booking.views.BW.cancel_room", book_cancel_room)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.cancel_room", book_cancel_room)
def test_cancel_room(self):
payload = {"booking_id": "booking id"}
response = self.client.post(
Expand All @@ -176,7 +176,7 @@ def test_cancel_room(self):
self.assertEqual(1, len(res_json))
self.assertEqual("success", res_json["detail"])

@mock.patch("gsr_booking.views.BW.get_reservations", reservations)
@mock.patch("gsr_booking.api_wrapper.BookingHandler.get_reservations", reservations)
def test_reservations(self):
response = self.client.get(reverse("reservations"))
res_json = json.loads(response.content)
Expand Down
Loading

0 comments on commit df7b8ee

Please sign in to comment.