From a116f5dd63da471a7fbfdc03753edbad68b2cfc4 Mon Sep 17 00:00:00 2001 From: Edward Tirado Jr Date: Mon, 7 Apr 2025 21:05:05 -0500 Subject: [PATCH] added support for list management --- .gitignore | 3 --- .../migrations/0003_movie_added_by.py | 22 ++++++++++++++++ movie_manager/models.py | 13 +++++----- movie_manager/serializers.py | 3 ++- movie_manager/views.py | 25 +++++++++++++++++++ 5 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 movie_manager/migrations/0003_movie_added_by.py diff --git a/.gitignore b/.gitignore index 52435de..0a19790 100644 --- a/.gitignore +++ b/.gitignore @@ -26,9 +26,6 @@ share/python-wheels/ *.egg MANIFEST -# django -static - # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/movie_manager/migrations/0003_movie_added_by.py b/movie_manager/migrations/0003_movie_added_by.py new file mode 100644 index 0000000..94fee8e --- /dev/null +++ b/movie_manager/migrations/0003_movie_added_by.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.4 on 2025-04-08 00:18 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('movie_manager', '0002_alter_movie_options_alter_movielist_options_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='movie', + name='added_by', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + preserve_default=False, + ), + ] diff --git a/movie_manager/models.py b/movie_manager/models.py index 976d611..1fcb1ba 100644 --- a/movie_manager/models.py +++ b/movie_manager/models.py @@ -3,9 +3,6 @@ from django.contrib.auth.models import User # Create your models here. class Movie(models.Model): - class Meta: - ordering = ["title"] - title = models.CharField(max_length=100) imdb_id = models.CharField(max_length=100) year = models.IntegerField() @@ -16,18 +13,19 @@ class Movie(models.Model): plot = models.CharField(max_length=500) poster = models.CharField(max_length=500) last_watched = models.DateTimeField() + added_by = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) deleted_at = models.DateTimeField(null=True, blank=True) + class Meta: + ordering = ["title"] + def __str__(self): return self.title class MovieList(models.Model): - class Meta: - ordering = ["name"] - name = models.CharField(max_length=100) public = models.BooleanField(default=False) owner = models.ForeignKey(User, on_delete=models.CASCADE) @@ -36,5 +34,8 @@ class MovieList(models.Model): updated_at = models.DateTimeField(auto_now=True) deleted_at = models.DateTimeField(null=True, blank=True) + class Meta: + ordering = ["name"] + def __str__(self): return self.name diff --git a/movie_manager/serializers.py b/movie_manager/serializers.py index 4a31cd4..e79ceff 100644 --- a/movie_manager/serializers.py +++ b/movie_manager/serializers.py @@ -11,10 +11,11 @@ class MovieSerializer(serializers.ModelSerializer): class MovieListSerializer(serializers.ModelSerializer): movie_count = serializers.SerializerMethodField() + movies = MovieSerializer(read_only=True, many=True) class Meta: model = MovieList - fields = ["id","name","owner","public", "movie_count"] + fields = ["id","name","owner","public", "movies", "movie_count"] def get_movie_count(self, obj): diff --git a/movie_manager/views.py b/movie_manager/views.py index 7d1f3f0..d814302 100644 --- a/movie_manager/views.py +++ b/movie_manager/views.py @@ -2,6 +2,7 @@ from django.http import HttpResponse, JsonResponse from django.contrib.auth.models import User from rest_framework import permissions, viewsets from knox.auth import TokenAuthentication +from rest_framework.decorators import action from rest_framework.exceptions import NotFound from movie_manager.models import Movie, MovieList @@ -25,6 +26,12 @@ class MovieListViewset(viewsets.ModelViewSet): serializer_class = MovieListSerializer + + def retrieve(self, request, pk=None, *args, **kwargs): + movie_list = MovieList.objects.get(pk=pk) + return JsonResponse(MovieListSerializer(movie_list).data) + + def update(self, request, pk=None, *args, **kwargs): movie_list = MovieList.objects.get(pk=pk) movie_list.name = request.data.get('name') @@ -46,3 +53,21 @@ class MovieListViewset(viewsets.ModelViewSet): movie_list.save() return JsonResponse(MovieListSerializer(movie_list).data) + + @action(detail=True, methods=['put', 'delete'], url_path='movie/(?P[0-9]+)') + def add_movie(self, request, pk=None, movie_id=None, *args, **kwargs): + if request.method == 'DELETE': + return self.remove_movie(request, pk, movie_id) + + movie_list = MovieList.objects.get(pk=pk) + movie = Movie.objects.get(pk=movie_id) + movie_list.movies.add(movie) + + return JsonResponse(MovieListSerializer(movie_list).data) + + def remove_movie(self, request, pk=None, movie_id=None, *args, **kwargs): + movie_list = MovieList.objects.get(pk=pk) + movie = Movie.objects.get(pk=movie_id) + movie_list.movies.remove(movie) + + return JsonResponse(MovieListSerializer(movie_list).data)