diff --git a/revelio/urls.py b/revelio/urls.py index 6ad0e3e..16b8b02 100644 --- a/revelio/urls.py +++ b/revelio/urls.py @@ -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')), ] diff --git a/venue/migrations/0003_alter_venue_status.py b/venue/migrations/0003_alter_venue_status.py new file mode 100644 index 0000000..05df8ee --- /dev/null +++ b/venue/migrations/0003_alter_venue_status.py @@ -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), + ), + ] diff --git a/venue/models.py b/venue/models.py index 66a1436..9558a8c 100644 --- a/venue/models.py +++ b/venue/models.py @@ -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() diff --git a/venue/serializers.py b/venue/serializers.py index c08a404..94f263f 100644 --- a/venue/serializers.py +++ b/venue/serializers.py @@ -12,3 +12,8 @@ class VenueSerializer(serializers.ModelSerializer): class Meta: model = Venue fields = '__all__' + +class VenueStatusSerializer(serializers.ModelSerializer): + class Meta: + model = Venue + fields = ['status'] \ No newline at end of file diff --git a/venue/tests.py b/venue/tests.py index d4644e5..3c249d6 100644 --- a/venue/tests.py +++ b/venue/tests.py @@ -12,6 +12,7 @@ from .models import Venue, Photo from .serializers import VenueSerializer, PhotoSerializer + class BaseTestCase(TestCase): def setUp(self): self.client = APIClient() @@ -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, @@ -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, @@ -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, @@ -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") @@ -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@email.com',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) + diff --git a/venue/urls.py b/venue/urls.py index a3d49c2..9bf603a 100644 --- a/venue/urls.py +++ b/venue/urls.py @@ -5,12 +5,14 @@ VenueRetrieveUpdateDestroyView, PhotoCreateView, PhotoRetrieveUpdateDestroyView, + VenueStatusUpdateAPIView ) 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('', VenueListCreateView.as_view(), name='venue-list-create'), + path('/', VenueRetrieveUpdateDestroyView.as_view(), name='venue-retrieve-update-destroy'), + path('/status/', VenueStatusUpdateAPIView.as_view(), name='venue-status-update'), + path('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 bfcb5f1..42d7867 100644 --- a/venue/views.py +++ b/venue/views.py @@ -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() @@ -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) \ No newline at end of file