diff --git a/.idea/misc.xml b/.idea/misc.xml index 9f60641..3684797 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,7 +3,7 @@ - + \ No newline at end of file diff --git a/.idea/movie-night-py.iml b/.idea/movie-night-py.iml index f13645b..cdbb1e7 100644 --- a/.idea/movie-night-py.iml +++ b/.idea/movie-night-py.iml @@ -15,9 +15,8 @@ - - + diff --git a/movie_manager/migrations/0004_alter_movie_last_watched_showing_schedule.py b/movie_manager/migrations/0004_alter_movie_last_watched_showing_schedule.py deleted file mode 100644 index 9895ec9..0000000 --- a/movie_manager/migrations/0004_alter_movie_last_watched_showing_schedule.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 5.1.4 on 2025-04-08 03:39 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('movie_manager', '0003_movie_added_by'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AlterField( - model_name='movie', - name='last_watched', - field=models.DateTimeField(blank=True, null=True), - ), - migrations.CreateModel( - name='Showing', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('public', models.BooleanField(default=False)), - ('showtime', models.DateTimeField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('deleted_at', models.DateTimeField(blank=True, null=True)), - ('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movie_manager.movie')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['showtime'], - }, - ), - migrations.CreateModel( - name='Schedule', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('public', models.BooleanField(default=False)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('deleted_at', models.DateTimeField(blank=True, null=True)), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('showings', models.ManyToManyField(to='movie_manager.showing')), - ], - ), - ] diff --git a/movie_manager/migrations/0005_showing_slug.py b/movie_manager/migrations/0005_showing_slug.py deleted file mode 100644 index 4d5c0b1..0000000 --- a/movie_manager/migrations/0005_showing_slug.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.4 on 2025-04-08 03:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('movie_manager', '0004_alter_movie_last_watched_showing_schedule'), - ] - - operations = [ - migrations.AddField( - model_name='showing', - name='slug', - field=models.SlugField(default='', max_length=100), - ), - ] diff --git a/movie_manager/migrations/0006_remove_showing_slug_schedule_slug.py b/movie_manager/migrations/0006_remove_showing_slug_schedule_slug.py deleted file mode 100644 index dfe8b61..0000000 --- a/movie_manager/migrations/0006_remove_showing_slug_schedule_slug.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.1.4 on 2025-04-08 04:03 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('movie_manager', '0005_showing_slug'), - ] - - operations = [ - migrations.RemoveField( - model_name='showing', - name='slug', - ), - migrations.AddField( - model_name='schedule', - name='slug', - field=models.SlugField(default='', max_length=100), - ), - ] diff --git a/movie_manager/models.py b/movie_manager/models.py index 171e9e2..1fcb1ba 100644 --- a/movie_manager/models.py +++ b/movie_manager/models.py @@ -1,6 +1,7 @@ from django.db import models from django.contrib.auth.models import User +# Create your models here. class Movie(models.Model): title = models.CharField(max_length=100) imdb_id = models.CharField(max_length=100) @@ -11,7 +12,7 @@ class Movie(models.Model): 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) + 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) @@ -38,25 +39,3 @@ class MovieList(models.Model): def __str__(self): return self.name - -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") - slug = models.SlugField(max_length=100, default="") - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - deleted_at = models.DateTimeField(null=True, blank=True) - -class Showing(models.Model): - movie = models.ForeignKey(Movie, on_delete=models.CASCADE) - owner = models.ForeignKey(User, on_delete=models.CASCADE) - public = models.BooleanField(default=False) - showtime = models.DateTimeField() - 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 = ["showtime"] diff --git a/movie_manager/serializers.py b/movie_manager/serializers.py index bebebb0..e79ceff 100644 --- a/movie_manager/serializers.py +++ b/movie_manager/serializers.py @@ -1,7 +1,7 @@ -from gunicorn.config import User -from rest_framework import serializers -from movie_manager.models import Movie, MovieList, Schedule, Showing +from itertools import count +from rest_framework import serializers +from movie_manager.models import Movie, MovieList class MovieSerializer(serializers.ModelSerializer): class Meta: @@ -20,26 +20,3 @@ class MovieListSerializer(serializers.ModelSerializer): def get_movie_count(self, obj): return len(obj.movies.all()) - -class UserSerializer(serializers.Serializer): - class Meta: - model = User - fields = ["id", "username"] - - -class ShowingSerializer(serializers.ModelSerializer): - movie = MovieSerializer(read_only=True) - - class Meta: - model = Showing - fields = ["public", "showtime", "movie", "owner"] - - -class ScheduleSerializer(serializers.ModelSerializer): - name = serializers.CharField(read_only=True) - showings = ShowingSerializer(read_only=True, many=True) - - class Meta: - model = Schedule - fields = ["name", "owner","public","slug", "showings"] - diff --git a/movie_manager/views.py b/movie_manager/views.py index e08d86e..d814302 100644 --- a/movie_manager/views.py +++ b/movie_manager/views.py @@ -1,18 +1,17 @@ -import datetime - -from django.http import JsonResponse +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, Schedule, Showing -from movie_manager.serializers import MovieListSerializer, MovieSerializer, ScheduleSerializer, ShowingSerializer +from movie_manager.models import Movie, MovieList +from movie_manager.serializers import MovieListSerializer, MovieSerializer # Create your views here. class MovieViewset(viewsets.ModelViewSet): + fields = '__all__' queryset = Movie.objects.all().order_by("title") authentication_classes = [TokenAuthentication] permission_classes = [permissions.IsAuthenticated] @@ -20,6 +19,7 @@ class MovieViewset(viewsets.ModelViewSet): serializer_class = MovieSerializer class MovieListViewset(viewsets.ModelViewSet): + fields = '__all__' queryset = MovieList.objects.all().order_by("name") authentication_classes = [TokenAuthentication] permission_classes = [permissions.IsAuthenticated] @@ -66,73 +66,8 @@ class MovieListViewset(viewsets.ModelViewSet): 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) - 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) - -class ScheduleViewset(viewsets.ModelViewSet): - queryset = Schedule.objects.all().order_by("name") - authentication_classes = [TokenAuthentication] - permission_classes = [permissions.IsAuthenticated] - - serializer_class = ScheduleSerializer - - def retrieve(self, request, pk=None, *args, **kwargs): - # Get the schedule instance - instance = self.get_object() - today = datetime.datetime.now() - - upcoming_showings = instance.showings.filter(showtime__gte=today) - - # Create a serialized response - serializer = self.get_serializer(instance) - data = serializer.data - - # Replace all showings with only future showings - data['showings'] = ShowingSerializer(upcoming_showings, many=True).data - - - if request.GET.get('past_showings') == 'true': - past_showings = instance.showings.filter(showtime__lt=today) - - # Add both to the response - data['past_showings'] = [ - {'id': showing.id, 'showtime': showing.showtime.isoformat(), "movie": MovieSerializer(showing.movie).data} - for showing in past_showings - ] - else: - data['past_showings'] = [] - - return JsonResponse(data) - - -class ShowingViewset(viewsets.ModelViewSet): - queryset = Showing.objects.all().order_by("showtime") - authentication_classes = [TokenAuthentication] - permission_classes = [permissions.IsAuthenticated] - - serializer_class = ShowingSerializer - - def create(self, request, *args, **kwargs): - movie_id = request.data.get('movie') - movie = Movie.objects.get(pk=movie_id) - - schedule_id = request.data.get('schedule') - schedule = Schedule.objects.get(pk=schedule_id) - - showing = Showing.objects.create( - movie=movie, - schedule=schedule, - showtime=request.data.get("showtime"), - public=request.data.get("public"), - owner=User.objects.get(pk=request.data.get("owner")) - ) - - schedule.showings.add(showing) - - return JsonResponse(ShowingSerializer(showing).data) - - diff --git a/movienight/urls.py b/movienight/urls.py index 6889ee7..1cb7bfd 100644 --- a/movienight/urls.py +++ b/movienight/urls.py @@ -19,8 +19,6 @@ router.register(r"api/users", user_views.UserViewSet) router.register(r"api/groups", user_views.GroupViewSet) router.register(r"api/movies", movie_views.MovieViewset) router.register(r"api/lists", movie_views.MovieListViewset) -router.register(r"api/schedules", movie_views.ScheduleViewset) -router.register(r"api/showings", movie_views.ShowingViewset) urlpatterns = [ path("", include(router.urls)),