From 5daa0178607c31852e3315a95411c8195629da4a Mon Sep 17 00:00:00 2001 From: Edward Tirado Jr Date: Sun, 20 Apr 2025 16:49:52 -0500 Subject: [PATCH] updated movie fields and added movies to admin --- movie_db/serializers.py | 3 +- movie_manager/admin.py | 21 ++++++ ...itic_score_movie_critic_scores_and_more.py | 65 +++++++++++++++++++ .../0009_alter_schedule_showings.py | 18 +++++ .../0010_alter_schedule_showings.py | 18 +++++ .../0011_alter_movie_mpaa_rating.py | 18 +++++ movie_manager/models.py | 21 +++--- movie_manager/serializers.py | 13 +++- movie_manager/views.py | 25 +++++-- 9 files changed, 184 insertions(+), 18 deletions(-) create mode 100644 movie_manager/migrations/0008_rename_critic_score_movie_critic_scores_and_more.py create mode 100644 movie_manager/migrations/0009_alter_schedule_showings.py create mode 100644 movie_manager/migrations/0010_alter_schedule_showings.py create mode 100644 movie_manager/migrations/0011_alter_movie_mpaa_rating.py diff --git a/movie_db/serializers.py b/movie_db/serializers.py index 0f5eca2..7d7b570 100644 --- a/movie_db/serializers.py +++ b/movie_db/serializers.py @@ -5,7 +5,8 @@ class MovieSerializer(serializers.Serializer): director = serializers.CharField(source="Director") genre = serializers.CharField(source="Genre") imdb_id = serializers.CharField(source="imdbID") - imdb_rating = serializers.CharField(source="imdbRating") + critic_scores = serializers.CharField(source="Ratings") + mpaa_rating = serializers.CharField(source="Rated") media_type = serializers.CharField(source="Type") plot = serializers.CharField(source="Plot") poster = serializers.CharField(source="Poster") diff --git a/movie_manager/admin.py b/movie_manager/admin.py index 8c38f3f..b199e47 100644 --- a/movie_manager/admin.py +++ b/movie_manager/admin.py @@ -1,3 +1,24 @@ from django.contrib import admin +from movie_manager.models import Movie, MovieList, Schedule, Showing + + # Register your models here. +@admin.register(Movie) +class MovieAdmin(admin.ModelAdmin): + pass + + +@admin.register(MovieList) +class MovieListAdmin(admin.ModelAdmin): + pass + + +@admin.register(Schedule) +class ScheduleAdmin(admin.ModelAdmin): + pass + + +@admin.register(Showing) +class ShowingAdmin(admin.ModelAdmin): + pass diff --git a/movie_manager/migrations/0008_rename_critic_score_movie_critic_scores_and_more.py b/movie_manager/migrations/0008_rename_critic_score_movie_critic_scores_and_more.py new file mode 100644 index 0000000..225eeaf --- /dev/null +++ b/movie_manager/migrations/0008_rename_critic_score_movie_critic_scores_and_more.py @@ -0,0 +1,65 @@ +# Generated by Django 5.1.4 on 2025-04-20 21:20 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('movie_manager', '0007_alter_movie_critic_score'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RenameField( + model_name='movie', + old_name='critic_score', + new_name='critic_scores', + ), + migrations.RemoveField( + model_name='movie', + name='last_watched', + ), + migrations.AddField( + model_name='movie', + name='mpaa_rating', + field=models.CharField(blank=True, max_length=5, null=True), + ), + migrations.AlterField( + model_name='movie', + name='actors', + field=models.CharField(blank=True, max_length=500, null=True), + ), + migrations.AlterField( + model_name='movie', + name='added_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='movie', + name='director', + field=models.CharField(blank=True, max_length=500, null=True), + ), + migrations.AlterField( + model_name='movie', + name='genre', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='movie', + name='plot', + field=models.CharField(blank=True, max_length=500, null=True), + ), + migrations.AlterField( + model_name='movie', + name='poster', + field=models.CharField(blank=True, max_length=500, null=True), + ), + migrations.AlterField( + model_name='movie', + name='year', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/movie_manager/migrations/0009_alter_schedule_showings.py b/movie_manager/migrations/0009_alter_schedule_showings.py new file mode 100644 index 0000000..9ff71e4 --- /dev/null +++ b/movie_manager/migrations/0009_alter_schedule_showings.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2025-04-20 21:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('movie_manager', '0008_rename_critic_score_movie_critic_scores_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='schedule', + name='showings', + field=models.ManyToManyField(blank=True, null=True, to='movie_manager.showing'), + ), + ] diff --git a/movie_manager/migrations/0010_alter_schedule_showings.py b/movie_manager/migrations/0010_alter_schedule_showings.py new file mode 100644 index 0000000..281f96d --- /dev/null +++ b/movie_manager/migrations/0010_alter_schedule_showings.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2025-04-20 21:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('movie_manager', '0009_alter_schedule_showings'), + ] + + operations = [ + migrations.AlterField( + model_name='schedule', + name='showings', + field=models.ManyToManyField(blank=True, to='movie_manager.showing'), + ), + ] diff --git a/movie_manager/migrations/0011_alter_movie_mpaa_rating.py b/movie_manager/migrations/0011_alter_movie_mpaa_rating.py new file mode 100644 index 0000000..3140a04 --- /dev/null +++ b/movie_manager/migrations/0011_alter_movie_mpaa_rating.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2025-04-20 21:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('movie_manager', '0010_alter_schedule_showings'), + ] + + operations = [ + migrations.AlterField( + model_name='movie', + name='mpaa_rating', + field=models.CharField(blank=True, max_length=20, null=True), + ), + ] diff --git a/movie_manager/models.py b/movie_manager/models.py index 1b0c9bf..09d2db2 100644 --- a/movie_manager/models.py +++ b/movie_manager/models.py @@ -1,19 +1,20 @@ from django.db import models from django.contrib.auth.models import User +from django.db.models import SET_NULL class Movie(models.Model): title = models.CharField(max_length=100) imdb_id = models.CharField(max_length=100) - year = models.IntegerField() - critic_score = models.CharField(max_length=500, null=True, blank=True) - genre = models.CharField(max_length=100) - director = models.CharField(max_length=500) - actors = models.CharField(max_length=500) - plot = models.CharField(max_length=500) - poster = models.CharField(max_length=500) - last_watched = models.DateTimeField(null=True, blank=True) - added_by = models.ForeignKey(User, on_delete=models.CASCADE) + year = models.IntegerField(null=True, blank=True) + director = models.CharField(max_length=500, null=True, blank=True) + actors = models.CharField(max_length=500, null=True, blank=True) + plot = models.CharField(max_length=500, null=True, blank=True) + genre = models.CharField(max_length=100, null=True, blank=True) + mpaa_rating = models.CharField(max_length=20, null=True, blank=True) + critic_scores = models.CharField(max_length=500, null=True, blank=True) + poster = models.CharField(max_length=500, null=True, blank=True) + added_by = models.ForeignKey(User, on_delete=SET_NULL, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) deleted_at = models.DateTimeField(null=True, blank=True) @@ -45,7 +46,7 @@ class Schedule(models.Model): name = models.CharField(max_length=100) owner = models.ForeignKey(User, on_delete=models.CASCADE) public = models.BooleanField(default=False) - showings = models.ManyToManyField("Showing") + showings = models.ManyToManyField("Showing", blank=True) slug = models.SlugField(max_length=100, default="") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) diff --git a/movie_manager/serializers.py b/movie_manager/serializers.py index 2118dc1..d2b472c 100644 --- a/movie_manager/serializers.py +++ b/movie_manager/serializers.py @@ -1,3 +1,4 @@ +from django.utils import timezone from gunicorn.config import User from rest_framework import serializers from movie_manager.models import Movie, MovieList, Schedule, Showing @@ -32,7 +33,17 @@ class ShowingSerializer(serializers.ModelSerializer): class Meta: model = Showing - fields = ["public", "showtime", "movie", "owner"] + fields = ["id", "public", "showtime", "movie", "owner"] + + 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"]) + + return validated_data class ScheduleSerializer(serializers.ModelSerializer): diff --git a/movie_manager/views.py b/movie_manager/views.py index 1b98766..dbb91e0 100644 --- a/movie_manager/views.py +++ b/movie_manager/views.py @@ -3,6 +3,7 @@ import json from django.http import JsonResponse from django.contrib.auth.models import User +from django.utils.dateparse import parse_datetime from rest_framework import permissions, viewsets from knox.auth import TokenAuthentication from rest_framework.decorators import action, api_view @@ -40,6 +41,14 @@ class MovieListViewset(viewsets.ModelViewSet): serializer_class = MovieListSerializer + def create(self, request, *args, **kwargs): + movie_list = MovieList.objects.create( + name=request.data.get("name"), + owner=request.user, + ) + + return JsonResponse(MovieListSerializer(movie_list).data) + def retrieve(self, request, pk=None, *args, **kwargs): movie_list = MovieList.objects.get(pk=pk) return JsonResponse(MovieListSerializer(movie_list).data) @@ -87,17 +96,18 @@ class MovieListViewset(viewsets.ModelViewSet): poster=movie["poster"], plot=movie["plot"], genre=movie["genre"], - critic_score=movie["imdb_rating"], + critic_scores=movie["critic_scores"], + mpaa_rating=movie["mpaa_rating"], director=movie["director"], added_by_id=request.user.id, ) - movie_list.movies.add(new_movie) + movie_list.movies.add(new_movie) return JsonResponse(MovieListSerializer(movie_list).data) - def remove_movie(self, request, pk=None, movie_id=None, *args, **kwargs): - movie = Movie.objects.get(pk=movie_id) + def remove_movie(self, request, pk=None, imdb_id=None, *args, **kwargs): + movie = Movie.objects.filter(imdb_id=imdb_id).first() movie_list = MovieList.objects.get(pk=pk) movie_list.movies.remove(movie) @@ -158,12 +168,15 @@ class ShowingViewset(viewsets.ModelViewSet): schedule_id = request.data.get("schedule") schedule = Schedule.objects.get(pk=schedule_id) + showtime_str = request.data.get("showtime") + showtime = parse_datetime(showtime_str) + showing = Showing.objects.create( movie=movie, schedule=schedule, - showtime=request.data.get("showtime"), + showtime=showtime, public=request.data.get("public"), - owner=User.objects.get(pk=request.data.get("owner")), + owner=request.user, ) schedule.showings.add(showing)