Skip to content

Commit

Permalink
Merge pull request #73 from RevelioStartup/staging
Browse files Browse the repository at this point in the history
Sprint #4 II
  • Loading branch information
catherineeangel authored May 26, 2024
2 parents cc927e0 + 11b5dac commit 4d08246
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 24 deletions.
22 changes: 20 additions & 2 deletions event/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ def setUp(self):
self.client.force_authenticate(user=self.free_user)

self.event_attributes = {
"user": self.free_user,
"name": "Revelio Onboarding",
"date": date.today(),
"budget": Decimal('20000000'),
Expand All @@ -25,7 +24,8 @@ def setUp(self):
"theme": "Harry Potter",
"services": "Catering, Decorations, Music"
}
self.model = Event.objects.create(**self.event_attributes)

self.model = Event.objects.create(user= self.free_user, **self.event_attributes)
self.serializer = EventSerializer(instance = self.model)

self.EVENT_DETAIL_LINK = reverse('event:detail', kwargs={'id': self.model.id})
Expand Down Expand Up @@ -93,6 +93,24 @@ def test_post_missing_event(self):
self.assertEqual(Event.objects.count(), 1)
self.assertEqual(response.data['name'], ['This field is required.'])

def test_post_event_limit_exceeded_free_user(self):
for _ in range(2):
Event.objects.create(user=self.free_user, **self.event_attributes)

response = self.client.post(EVENT_LIST_LINK, self.event_attributes)
self.assertEqual(response.status_code, 403)
self.assertEqual(Event.objects.filter(user=self.free_user).count(), 3)
self.assertIn("Non-premium users cannot have more than 3 events.", response.data['error'])

def test_post_event_limit_exceeded_premium_user(self):
self.client.force_authenticate(user=self.premium_user)
for _ in range(3):
Event.objects.create(user=self.premium_user, **self.event_attributes)

response = self.client.post(EVENT_LIST_LINK, self.event_attributes)
self.assertEqual(response.status_code, 201)
self.assertEqual(Event.objects.filter(user=self.premium_user).count(), 4)

def test_post_unauthenticated_event(self):
self.client.force_authenticate(user=None)
response = self.client.post(EVENT_LIST_LINK, self.event_attributes)
Expand Down
38 changes: 35 additions & 3 deletions event/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
from rest_framework.views import APIView
from event.models import Event
from event.serializers import EventSerializer
from utils.permissions import IsOwner, HasEventPlanner
from utils.permissions import IsOwner, HasEventPlanner, IsPremiumUser
from rest_framework import generics

from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
class EventList(APIView):
permission_classes = [IsAuthenticated, IsOwner, HasEventPlanner]

Expand All @@ -18,9 +19,40 @@ def get(self, request):

return Response(serializer.data)

@swagger_auto_schema(
request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
required=['name', 'date', 'location'], # Update these fields based on your actual Event model
properties={
'name': openapi.Schema(type=openapi.TYPE_STRING, description='Name of the event'),
'date': openapi.Schema(type=openapi.TYPE_STRING, format='date', description='Date of the event'),
'budget': openapi.Schema(type=openapi.TYPE_NUMBER, description='Budget of the event in Rupiah'),
'objective': openapi.Schema(type=openapi.TYPE_STRING, description='Objective of the event'),
'attendees': openapi.Schema(type=openapi.TYPE_NUMBER, description='Number of attendees for the event'),
'theme': openapi.Schema(type=openapi.TYPE_STRING, description='Theme of the event'),
'services': openapi.Schema(type=openapi.TYPE_STRING, description='Service of the event'),
},
),
responses={
201: openapi.Response('Event created successfully', EventSerializer),
400: 'Bad request',
403: 'Forbidden - Non-premium users cannot have more than 3 events'
},
operation_summary="Register a new event",
operation_description="Allows users to register a new event. Non-premium users are restricted to a maximum of 3 events."
)
def post(self, request):
user = request.user
events = Event.objects.filter(user=user)
event_count = events.count()

is_premium = IsPremiumUser().has_permission(request, view=self)

if not is_premium and event_count >= 3:
return Response({"error": "Non-premium users cannot have more than 3 events."}, status=status.HTTP_403_FORBIDDEN)

serializer = EventSerializer(data=request.data, context={'request': request})

if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Expand Down
2 changes: 1 addition & 1 deletion subscription/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ class Subscription(models.Model):

@property
def is_active(self):
return self.end_date > timezone.now() and self.plan_id==2
return self.end_date > timezone.now() and self.plan.name != 'Free'
7 changes: 3 additions & 4 deletions subscription/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
from subscription.serializers import SubscriptionSerializer

# Create your views here.
class SubscriptionHistory(generics.RetrieveAPIView):
class SubscriptionHistory(generics.RetrieveAPIView):
serializer_class = SubscriptionSerializer
def get(self, request):
subscription = Subscription.objects.filter(user=request.user).order_by('-start_date') # Ordering

serializer = SubscriptionSerializer(subscription, many=True)

serializer = self.serializer_class(subscription, many=True)
return Response(serializer.data)

class LatestSubscription(generics.RetrieveAPIView):
Expand Down
1 change: 1 addition & 0 deletions task_steps/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ def put(self, request, *args, **kwargs):

class TaskStepAppendView(generics.CreateAPIView):
permission_classes = [IsOwner, IsAuthenticated]
serializer_class = TaskStepSerializer

def post(self, request, *args, **kwargs):
task_id = kwargs['task_id']
Expand Down
12 changes: 10 additions & 2 deletions timeline/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from revelio.utils import get_validation_error_detail
from utils.permissions import IsEventOwner, HasEventTimeline, IsTaskStepOwner, IsOwner
from rest_framework.permissions import IsAuthenticated
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import PermissionDenied, MethodNotAllowed

class TimelineCreateView(generics.CreateAPIView):
permission_classes=[IsAuthenticated, IsTaskStepOwner, HasEventTimeline]
Expand Down Expand Up @@ -69,7 +69,6 @@ class TimelineDetailView(generics.RetrieveUpdateDestroyAPIView):
404: 'Not found - Timeline does not exist'
}
)

def patch(self, request, *args, **kwargs):
try:
instance = self.get_object()
Expand All @@ -84,6 +83,15 @@ def patch(self, request, *args, **kwargs):
error_message = get_validation_error_detail(e)
return Response({"error": error_message}, status=status.HTTP_404_NOT_FOUND)

@swagger_auto_schema(auto_schema=None)
def put(self, request, *args, **kwargs):
raise MethodNotAllowed('PUT', detail='This method is not allowed.')

@swagger_auto_schema(auto_schema=None)
def delete(self, request, *args, **kwargs):
raise MethodNotAllowed('DELETE', detail='This method is not allowed.')


def get_object(self):
try:
timeline = Timeline.objects.get(pk=self.kwargs['pk'])
Expand Down
34 changes: 22 additions & 12 deletions utils/base_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,36 @@ class BaseTestCase(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.free_package = cls.create_package('Free Package', 0, 365, ai_assistant=False)
cls.premium_package = cls.create_package('Premium Package', 10000, 30, ai_assistant=True)
cls.free_package = cls.create_package( name='Free',
price=0,
duration=0,
event_planner=True,
event_tracker=True,
event_timeline=True,
event_rundown=True,
ai_assistant=False)

cls.premium_package = cls.create_package(
name='Premium',
price=10000,
duration=30,
event_planner=True,
event_tracker=True,
event_timeline=True,
event_rundown=True,
ai_assistant=True
)

cls.free_user = cls.create_user('[email protected]', 'freeuser')
cls.premium_user = cls.create_user('[email protected]', 'premiumuser')
cls.another_user = cls.create_user('[email protected]', 'anonymous')

Subscription.objects.create(user=cls.free_user, plan=cls.free_package, end_date=timezone.now() + timedelta(days=365))
Subscription.objects.create(user=cls.premium_user, plan=cls.premium_package, end_date=timezone.now() + timedelta(days=30))
Subscription.objects.create(user=cls.free_user, plan=cls.free_package, start_date=timezone.now(), end_date=timezone.now() + timedelta(days=365))
Subscription.objects.create(user=cls.premium_user, plan=cls.premium_package, start_date=timezone.now(), end_date=timezone.now() + timedelta(days=30))

@staticmethod
def create_package(name, price, duration, **features):
def create_package(**features):
return Package.objects.create(
name=name,
price=price,
duration=duration,
event_planner=True,
event_tracker=True,
event_timeline=True,
event_rundown=True,
**features
)

Expand Down

0 comments on commit 4d08246

Please sign in to comment.