From 5b78c16a10537aba0654fd4b9a7ccddaf0a6e4df Mon Sep 17 00:00:00 2001 From: Natania Deandra Date: Sun, 25 Feb 2024 19:57:22 +0700 Subject: [PATCH] [GREEN] feat: Venue feature --- venue/migrations/0001_initial.py | 36 ++++++++++++++++++++++ venue/migrations/0002_alter_photo_image.py | 18 +++++++++++ venue/migrations/__init__.py | 0 venue/models.py | 21 +++++++++++++ venue/serializers.py | 14 +++++++++ venue/urls.py | 16 ++++++++++ venue/views.py | 30 ++++++++++++++++++ 7 files changed, 135 insertions(+) create mode 100644 venue/migrations/0001_initial.py create mode 100644 venue/migrations/0002_alter_photo_image.py create mode 100644 venue/migrations/__init__.py diff --git a/venue/migrations/0001_initial.py b/venue/migrations/0001_initial.py new file mode 100644 index 0000000..b744821 --- /dev/null +++ b/venue/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 4.2.9 on 2024-02-25 02:58 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Venue', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('address', models.CharField(max_length=255)), + ('price', models.IntegerField()), + ('status', models.CharField(max_length=255)), + ('contact_name', models.CharField(max_length=255)), + ('contact_phone_number', models.CharField(max_length=15)), + ('event', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Photo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='venue_photos/')), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='venue.venue')), + ], + ), + ] diff --git a/venue/migrations/0002_alter_photo_image.py b/venue/migrations/0002_alter_photo_image.py new file mode 100644 index 0000000..86c7011 --- /dev/null +++ b/venue/migrations/0002_alter_photo_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.9 on 2024-02-25 03:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venue', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='photo', + name='image', + field=models.URLField(), + ), + ] diff --git a/venue/migrations/__init__.py b/venue/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venue/models.py b/venue/models.py index 71a8362..66a1436 100644 --- a/venue/models.py +++ b/venue/models.py @@ -1,3 +1,24 @@ from django.db import models # Create your models here. + +from django.db import models + +class Venue(models.Model): + name = models.CharField(max_length=255) + address = models.CharField(max_length=255) + price = models.IntegerField() + status = models.CharField(max_length=255) + contact_name = models.CharField(max_length=255) + contact_phone_number = models.CharField(max_length=15) + event = models.IntegerField() + + def __str__(self): + return self.name + +class Photo(models.Model): + venue = models.ForeignKey(Venue, related_name='photos', on_delete=models.CASCADE) + image = models.URLField() + + def __str__(self): + return self.image diff --git a/venue/serializers.py b/venue/serializers.py index e69de29..c08a404 100644 --- a/venue/serializers.py +++ b/venue/serializers.py @@ -0,0 +1,14 @@ +from rest_framework import serializers +from .models import Venue, Photo + +class PhotoSerializer(serializers.ModelSerializer): + class Meta: + model = Photo + fields = '__all__' + +class VenueSerializer(serializers.ModelSerializer): + photos = PhotoSerializer(many=True, read_only=True) + + class Meta: + model = Venue + fields = '__all__' diff --git a/venue/urls.py b/venue/urls.py index e69de29..a3d49c2 100644 --- a/venue/urls.py +++ b/venue/urls.py @@ -0,0 +1,16 @@ +from django.urls import path +from .views import ( + VenueEventListView, + VenueListCreateView, + VenueRetrieveUpdateDestroyView, + PhotoCreateView, + PhotoRetrieveUpdateDestroyView, +) + +urlpatterns = [ + path('venues/', VenueListCreateView.as_view(), name='venue-list-create'), + path('venues//', VenueRetrieveUpdateDestroyView.as_view(), name='venue-retrieve-update-destroy'), + path('venues/event//', VenueEventListView.as_view(), name='venue-event-list'), + path('photos/', PhotoCreateView.as_view(), name='photo-create'), + path('photos//', PhotoRetrieveUpdateDestroyView.as_view(), name='photo-retrieve-update-destroy'), +] diff --git a/venue/views.py b/venue/views.py index 91ea44a..bfcb5f1 100644 --- a/venue/views.py +++ b/venue/views.py @@ -1,3 +1,33 @@ from django.shortcuts import render # Create your views here. + +from rest_framework import generics +from rest_framework.views import APIView +from rest_framework.response import Response +from .models import Venue, Photo +from .serializers import VenueSerializer, PhotoSerializer + + +class VenueListCreateView(generics.ListCreateAPIView): + queryset = Venue.objects.all() + serializer_class = VenueSerializer + +class VenueRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + queryset = Venue.objects.all() + serializer_class = VenueSerializer + +class VenueEventListView(APIView): + def get(self, request, *args, **kwargs): + event_id = kwargs.get('event_id') + venues = Venue.objects.filter(event=event_id) + serializer = VenueSerializer(venues, many=True) + return Response(serializer.data) + +class PhotoCreateView(generics.CreateAPIView): + queryset = Photo.objects.all() + serializer_class = PhotoSerializer + +class PhotoRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + queryset = Photo.objects.all() + serializer_class = PhotoSerializer