diff --git a/.gitignore b/.gitignore index 41818d1..6bd33c1 100644 --- a/.gitignore +++ b/.gitignore @@ -175,6 +175,3 @@ cython_debug/ # django static - -# JetBrains -.idea diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..779eda8 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,8 @@ + + + + mpaa + viewset + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f6f7e02 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..60235a5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/movie-night-py.iml b/.idea/movie-night-py.iml new file mode 100644 index 0000000..7a7a8e5 --- /dev/null +++ b/.idea/movie-night-py.iml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/movie_manager/serializers.py b/movie_manager/serializers.py index c9bb829..3b7a517 100644 --- a/movie_manager/serializers.py +++ b/movie_manager/serializers.py @@ -1,6 +1,6 @@ +from django.utils import timezone from gunicorn.config import User from rest_framework import serializers - from movie_manager.models import Movie, MovieList, Schedule, Showing @@ -28,7 +28,6 @@ class MovieSerializer(serializers.ModelSerializer): def get_has_been_scheduled(self, obj): return Showing.objects.filter(movie_id=obj.id).exists() - class MovieListListSerializer(serializers.ModelSerializer): movie_count = serializers.SerializerMethodField() @@ -46,13 +45,17 @@ class MovieListSerializer(serializers.ModelSerializer): owner = serializers.PrimaryKeyRelatedField(read_only=True) def get_queryset(self): - return MovieList.objects.prefetch_related("movies", "movies__showing_set") + return MovieList.objects.prefetch_related( + "movies", + "movies__showing_set" + ) class Meta: model = MovieList fields = ["id", "name", "owner", "public", "movies"] + class UserSerializer(serializers.Serializer): class Meta: model = User @@ -66,18 +69,19 @@ class ShowingSerializer(serializers.ModelSerializer): model = Showing fields = ["id", "public", "showtime", "movie", "owner"] - # def to_internal_value(self, data): - # validated_data = super().to_internal_value(data) + def to_internal_value(self, data): + validated_data = super().to_internal_value(data) - # if "showtime" in validated_data and timezone.is_naive( - # validated_data["showtime"] - # ): - # validated_data["showtime"] = timezone.make_aware(validated_data["showtime"]) + if "showtime" in validated_data and timezone.is_naive( + validated_data["showtime"] + ): + validated_data["showtime"] = timezone.make_aware(validated_data["showtime"]) - # return validated_data + return validated_data class ScheduleSerializer(serializers.ModelSerializer): + name = serializers.CharField(read_only=True) showings = ShowingSerializer(source="showing_set", read_only=True, many=True) class Meta: diff --git a/movie_manager/tests.py b/movie_manager/tests.py index 8ab499b..7ce503c 100644 --- a/movie_manager/tests.py +++ b/movie_manager/tests.py @@ -1,89 +1,3 @@ -import json +from django.test import TestCase -from django.contrib.auth.models import User -from django.utils import timezone -from freezegun import freeze_time -from rest_framework import status -from rest_framework.test import APITestCase, APIClient - -from movie_manager.models import Movie, Schedule, Showing - - -class ShowingViewsetTestCase(APITestCase): - def setUp(self): - self.client: APIClient = APIClient() - self.movie: Movie = Movie.objects.create(title="Test Movie") - self.owner: User = User.objects.create(id=1, username="test_user") - self.schedule: Schedule = Schedule.objects.create( - owner=self.owner, name="Test Schedule" - ) - - def test_it_creates_a_new_showing(self): - self.client.force_authenticate(user=self.owner) - - showing_time = timezone.now().isoformat().replace("+00:00", "Z") - response = self.client.post( - "/v1/showings/", - { - "movie": self.movie.id, - "public": True, - "schedule": self.schedule.id, - "showtime": showing_time, - }, - ) - - response_data = json.loads(response.content) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response_data.get("showtime"), showing_time) - self.assertEqual(response_data.get("movie").get("title"), "Test Movie") - - @freeze_time("2025-07-02 23:59:00", tz_offset=-5) - def test_it_returns_active_showings(self): - self.client.force_authenticate(user=self.schedule.owner) - - showtimes_america_chicago_utc = [ - "2025-07-03T04:00:59.000Z", # 7/2/25 11:59pm - "2025-07-01T04:00:59.000Z", # 6/30/25 11:59pm - "2025-07-08T04:00:59.000Z", # 7/7/25 11:59pm - ] - - for showtime in showtimes_america_chicago_utc: - Showing.objects.create( - movie=self.movie, - schedule=self.schedule, - showtime=showtime, - public=True, - owner=self.schedule.owner, - ) - - response = self.client.get(f"/v1/schedules/{self.schedule.id}/") - parsed_schedule = json.loads(response.content) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(len(parsed_schedule.get("showings")), 2) - - -class ScheduleViewsetTestCase(APITestCase): - def setUp(self): - self.client: APIClient = APIClient() - self.test_user: User = User.objects.create(id=1, username="test_user") - - def test_it_creates_a_new_schedule(self): - self.client.force_authenticate(user=self.test_user) - response = self.client.post( - "/v1/schedules/", - { - "name": "Test Schedule", - "owner": self.test_user.id, - "public": True, - "slug": "test-schedule", - }, - ) - - response_data = json.loads(response.content) - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response_data.get("name"), "Test Schedule") - self.assertEqual(response_data.get("owner"), 1) - self.assertEqual(response_data.get("public"), True) - self.assertEqual(response_data.get("slug"), "test-schedule") +# Create your tests here. diff --git a/movie_manager/viewsets/schedule.py b/movie_manager/viewsets/schedule.py index 57d5ec2..856605a 100644 --- a/movie_manager/viewsets/schedule.py +++ b/movie_manager/viewsets/schedule.py @@ -1,7 +1,6 @@ import datetime from django.http import JsonResponse -from django.utils import timezone from knox.auth import TokenAuthentication from rest_framework import viewsets, permissions @@ -24,14 +23,15 @@ class ScheduleViewset(viewsets.ModelViewSet): def retrieve(self, request, pk=None, *args, **kwargs): # Get the schedule instance instance = self.get_object() - now = timezone.now() + now = datetime.datetime.now() # get time from start of day - today = timezone.make_aware(datetime.datetime(now.year, now.month, now.day)) + today = datetime.datetime(now.year, now.month, now.day) upcoming_showings = Showing.objects.filter( showtime__gte=today, schedule=instance ) + # Create a serialized response serializer = self.get_serializer(instance) data = serializer.data diff --git a/movie_manager/viewsets/showing.py b/movie_manager/viewsets/showing.py index a52f7c1..1f3c887 100644 --- a/movie_manager/viewsets/showing.py +++ b/movie_manager/viewsets/showing.py @@ -33,4 +33,4 @@ class ShowingViewset(viewsets.ModelViewSet): owner=request.user, ) - return JsonResponse(ShowingSerializer(showing).data, status=201) + return JsonResponse(ShowingSerializer(showing).data) diff --git a/requirements.txt b/requirements.txt index 1a4cbee..7350802 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,5 +6,4 @@ django-filter gunicorn==23.0.0 psycopg2-binary==2.9.10 django-cors-headers==4.7.0 -requests==2.32.3 -freezegun==1.5.2 \ No newline at end of file +requests==2.32.3 \ No newline at end of file