Skip to content

Commit

Permalink
Merge pull request #12 from RevelioStartup/PBI-MengubahStatus
Browse files Browse the repository at this point in the history
PBI Mengubah Status Venue
  • Loading branch information
catherineeangel authored Feb 25, 2024
2 parents 8ef691a + 4a285b4 commit b9a307e
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 16 deletions.
4 changes: 2 additions & 2 deletions revelio/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
path('', include('authentication.urls')),
path('ai/', include('ai.urls')),
path('admin/', admin.site.urls),
path('venue/', include('venue.urls')),
path('event/', include('event.urls')),
path('venues/', include('venue.urls')),
path('events/', include('event.urls')),
]
18 changes: 18 additions & 0 deletions venue/migrations/0003_alter_venue_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-02-25 15:01

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('venue', '0002_alter_photo_image'),
]

operations = [
migrations.AlterField(
model_name='venue',
name='status',
field=models.CharField(choices=[('NONE', 'NONE'), ('PENDING', 'PENDING'), ('WAITLIST', 'WAITLIST'), ('CONFIRMED', 'CONFIRMED'), ('CANCELLED', 'CANCELLED')], default='NONE', max_length=16),
),
]
8 changes: 7 additions & 1 deletion venue/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ 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)
status = models.CharField(max_length=16, default='NONE', choices=[
('NONE', 'NONE'),
('PENDING', 'PENDING'),
('WAITLIST', 'WAITLIST'),
('CONFIRMED', 'CONFIRMED'),
('CANCELLED', 'CANCELLED'),
])
contact_name = models.CharField(max_length=255)
contact_phone_number = models.CharField(max_length=15)
event = models.IntegerField()
Expand Down
5 changes: 5 additions & 0 deletions venue/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,8 @@ class VenueSerializer(serializers.ModelSerializer):
class Meta:
model = Venue
fields = '__all__'

class VenueStatusSerializer(serializers.ModelSerializer):
class Meta:
model = Venue
fields = ['status']
37 changes: 33 additions & 4 deletions venue/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from .models import Venue, Photo
from .serializers import VenueSerializer, PhotoSerializer


class BaseTestCase(TestCase):
def setUp(self):
self.client = APIClient()
Expand All @@ -21,7 +22,7 @@ def setUp(self):
"name": "Test Venue",
"address": "123 Test St",
"price": 50,
"status": "Active",
"status": "PENDING",
"contact_name": "John Doe",
"contact_phone_number": "123-456-7890",
"event": 1,
Expand All @@ -34,7 +35,7 @@ def setUp(self):
"name": "Venue 1",
"address": "123 Test St",
"price": 50,
"status": "Active",
"status": "PENDING",
"contact_name": "John Doe",
"contact_phone_number": "123-456-7890",
"event": self.event_id,
Expand All @@ -45,7 +46,7 @@ def setUp(self):
"name": "Venue 2",
"address": "456 Test St",
"price": 60,
"status": "Inactive",
"status": "NONE",
"contact_name": "Jane Doe",
"contact_phone_number": "987-654-3210",
"event": self.event_id,
Expand Down Expand Up @@ -94,7 +95,7 @@ def test_get_venue_detail(self):

def test_update_venue(self):
url = reverse('venue-retrieve-update-destroy', args=[self.venue.id])
updated_data = {"name": "Updated Venue", "address": "123 Test St", "price": 50, "status": "Active", "contact_name": "John Doe", "contact_phone_number": "123-456-7890", "event": 1,}
updated_data = {"name": "Updated Venue", "address": "123 Test St", "price": 50, "status": "PENDING", "contact_name": "John Doe", "contact_phone_number": "123-456-7890", "event": 1,}
response = self.client.put(url, updated_data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['name'], "Updated Venue")
Expand Down Expand Up @@ -219,3 +220,31 @@ def test_delete_photo_does_not_exist(self):
url = reverse('photo-retrieve-update-destroy', args=[999])
response = self.client.delete(url)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

class VenueStatusUpdateAPITest(BaseTestCase):
def setUp(self):
self.client = APIClient()
self.user = AppUser.objects.create_user(email='[email protected]',username='testuser',password='test')
self.client.force_authenticate(user=self.user)
self.venue = Venue.objects.create(name='Test Venue', address='Test Address', price=100, status='PENDING',
contact_name='Test Contact', contact_phone_number='123456789', event=1)

def test_venue_status_update(self):
url = reverse('venue-status-update', kwargs={'pk': self.venue.pk})
data = {'status': 'CONFIRMED'}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['status'], 'CONFIRMED')

def test_venue_status_update_invalid_venue_id(self):
url = reverse('venue-status-update', kwargs={'pk': 999})
data = {'status': 'CONFIRMED'}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_venue_status_update_invalid_status(self):
url = reverse('venue-status-update', kwargs={'pk': self.venue.pk})
data = {'status': 'INVALID_STATUS'}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

8 changes: 5 additions & 3 deletions venue/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
VenueRetrieveUpdateDestroyView,
PhotoCreateView,
PhotoRetrieveUpdateDestroyView,
VenueStatusUpdateAPIView
)

urlpatterns = [
path('venues/', VenueListCreateView.as_view(), name='venue-list-create'),
path('venues/<int:pk>/', VenueRetrieveUpdateDestroyView.as_view(), name='venue-retrieve-update-destroy'),
path('venues/event/<int:event_id>/', VenueEventListView.as_view(), name='venue-event-list'),
path('', VenueListCreateView.as_view(), name='venue-list-create'),
path('<int:pk>/', VenueRetrieveUpdateDestroyView.as_view(), name='venue-retrieve-update-destroy'),
path('<int:pk>/status/', VenueStatusUpdateAPIView.as_view(), name='venue-status-update'),
path('event/<int:event_id>/', VenueEventListView.as_view(), name='venue-event-list'),
path('photos/', PhotoCreateView.as_view(), name='photo-create'),
path('photos/<int:pk>/', PhotoRetrieveUpdateDestroyView.as_view(), name='photo-retrieve-update-destroy'),
]
22 changes: 16 additions & 6 deletions venue/views.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
from django.shortcuts import render

# Create your views here.

from rest_framework import status
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

from .serializers import VenueSerializer, PhotoSerializer, VenueStatusSerializer
from rest_framework.permissions import IsAuthenticated

class VenueListCreateView(generics.ListCreateAPIView):
queryset = Venue.objects.all()
Expand All @@ -31,3 +28,16 @@ class PhotoCreateView(generics.CreateAPIView):
class PhotoRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
queryset = Photo.objects.all()
serializer_class = PhotoSerializer

class VenueStatusUpdateAPIView(APIView):
def patch(self, request, pk):
try:
venue = Venue.objects.get(pk=pk)
except Venue.DoesNotExist:
return Response({'message': 'Venue not found'}, status=status.HTTP_404_NOT_FOUND)

serializer = VenueStatusSerializer(venue, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

0 comments on commit b9a307e

Please sign in to comment.