Add soft delete functionality for Event, SignupForm, Feed & JobAd
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 2.1.5 on 2021-01-14 19:55
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('webapp', '0074_signup_deleted'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='event',
|
||||||
|
name='deleted',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='feed',
|
||||||
|
name='deleted',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='jobad',
|
||||||
|
name='deleted',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='signupform',
|
||||||
|
name='deleted',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -55,6 +55,7 @@ class Feed(BaseFeed):
|
|||||||
publish_time = models.DateTimeField(default=timezone.now)
|
publish_time = models.DateTimeField(default=timezone.now)
|
||||||
autohide = models.DateTimeField(default=month_from_now)
|
autohide = models.DateTimeField(default=month_from_now)
|
||||||
autohide_enabled = models.BooleanField(default=False)
|
autohide_enabled = models.BooleanField(default=False)
|
||||||
|
deleted = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _('Feed: {}').format(self.title)
|
return _('Feed: {}').format(self.title)
|
||||||
@@ -72,6 +73,7 @@ class Event(BaseFeed):
|
|||||||
signupForm = models.ManyToManyField(
|
signupForm = models.ManyToManyField(
|
||||||
'SignupForm', blank=True, related_name="event")
|
'SignupForm', blank=True, related_name="event")
|
||||||
location = models.CharField(max_length=255, blank=True)
|
location = models.CharField(max_length=255, blank=True)
|
||||||
|
deleted = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _('Event: {}').format(self.title)
|
return _('Event: {}').format(self.title)
|
||||||
@@ -109,6 +111,7 @@ class SignupForm(models.Model):
|
|||||||
visible = models.BooleanField(default=True)
|
visible = models.BooleanField(default=True)
|
||||||
quota = models.PositiveIntegerField(blank=True, null=True)
|
quota = models.PositiveIntegerField(blank=True, null=True)
|
||||||
email_content = models.TextField(blank=True)
|
email_content = models.TextField(blank=True)
|
||||||
|
deleted = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _('#{} {}').format(self.id, self.title)
|
return _('#{} {}').format(self.id, self.title)
|
||||||
@@ -185,6 +188,7 @@ class JobAd(models.Model):
|
|||||||
created_at = models.DateTimeField(default=timezone.now)
|
created_at = models.DateTimeField(default=timezone.now)
|
||||||
autohide_at = models.DateTimeField(default=month_from_now)
|
autohide_at = models.DateTimeField(default=month_from_now)
|
||||||
autohide_enabled = models.BooleanField(default=False)
|
autohide_enabled = models.BooleanField(default=False)
|
||||||
|
deleted = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
|
||||||
auditlog.register(Tag)
|
auditlog.register(Tag)
|
||||||
|
|||||||
@@ -171,5 +171,7 @@ class EventTestCase(APITestCase):
|
|||||||
# Authenticate
|
# Authenticate
|
||||||
self.client.force_authenticate(user=self.authClient)
|
self.client.force_authenticate(user=self.authClient)
|
||||||
response = self.client.delete(f"{URL}{self.testEventId}/")
|
response = self.client.delete(f"{URL}{self.testEventId}/")
|
||||||
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
|
# Soft delete
|
||||||
self.assertEqual(Event.objects.count(), 3)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(Event.objects.count(), 4)
|
||||||
|
self.assertEqual(Event.objects.get(id=self.testEventId).deleted, True)
|
||||||
|
|||||||
+43
-7
@@ -39,7 +39,7 @@ class RootView(routers.APIRootView):
|
|||||||
|
|
||||||
|
|
||||||
class EventViewSet(ModelViewSet):
|
class EventViewSet(ModelViewSet):
|
||||||
queryset = Event.objects.all()
|
queryset = Event.objects.filter(deleted=False)
|
||||||
ordering = ["start_time"]
|
ordering = ["start_time"]
|
||||||
serializer_class = EventSerializer
|
serializer_class = EventSerializer
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
permission_classes = [IsAuthenticatedOrReadOnly]
|
||||||
@@ -54,16 +54,16 @@ class EventViewSet(ModelViewSet):
|
|||||||
self.request.method == 'POST' or \
|
self.request.method == 'POST' or \
|
||||||
self.request.method == 'PUT':
|
self.request.method == 'PUT':
|
||||||
return Event.objects.all().prefetch_related(
|
return Event.objects.all().prefetch_related(
|
||||||
Prefetch('signupForm', queryset=SignupForm.objects.all(), to_attr='filtered_signup_forms')
|
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False), to_attr='filtered_signup_forms')
|
||||||
)
|
)
|
||||||
|
|
||||||
since = self.request.query_params.get('since', None)
|
since = self.request.query_params.get('since', None)
|
||||||
if since:
|
if since:
|
||||||
return Event.objects.filter(visible=True, end_time__gt=since).order_by('start_time').prefetch_related(
|
return Event.objects.filter(visible=True, end_time__gt=since).order_by('start_time').prefetch_related(
|
||||||
Prefetch('signupForm', queryset=SignupForm.objects.filter(visible=True), to_attr='filtered_signup_forms')
|
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms')
|
||||||
)
|
)
|
||||||
return Event.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time').prefetch_related(
|
return Event.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time').prefetch_related(
|
||||||
Prefetch('signupForm', queryset=SignupForm.objects.filter(visible=True), to_attr='filtered_signup_forms')
|
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms')
|
||||||
)
|
)
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
@@ -84,9 +84,18 @@ class EventViewSet(ModelViewSet):
|
|||||||
})
|
})
|
||||||
return super().update(request, *args, **kwargs)
|
return super().update(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def destroy(self, request, pk=None, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
event = self.get_object()
|
||||||
|
event.deleted = True
|
||||||
|
event.save()
|
||||||
|
return JsonResponse(status=200, data={"message": "OK"})
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return JsonResponse(status=404, data={"error": f"Event {pk} not found"})
|
||||||
|
|
||||||
|
|
||||||
class SignupFormViewSet(ModelViewSet):
|
class SignupFormViewSet(ModelViewSet):
|
||||||
queryset = SignupForm.objects.all()
|
queryset = SignupForm.objects.filter(deleted=False)
|
||||||
ordering = ["start_time"]
|
ordering = ["start_time"]
|
||||||
serializer_class = SignupFormSerializer
|
serializer_class = SignupFormSerializer
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
permission_classes = [IsAuthenticatedOrReadOnly]
|
||||||
@@ -106,6 +115,15 @@ class SignupFormViewSet(ModelViewSet):
|
|||||||
return SignupForm.objects.all().order_by('start_time')
|
return SignupForm.objects.all().order_by('start_time')
|
||||||
return SignupForm.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')
|
return SignupForm.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')
|
||||||
|
|
||||||
|
def destroy(self, request, pk=None, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
form = self.get_object()
|
||||||
|
form.deleted = True
|
||||||
|
form.save()
|
||||||
|
return JsonResponse(status=200, data={"message": "OK"})
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return JsonResponse(status=404, data={"error": f"SignupForm {pk} not found"})
|
||||||
|
|
||||||
@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated])
|
@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated])
|
||||||
def sendemail(self, request, pk=None, *args, **kwargs):
|
def sendemail(self, request, pk=None, *args, **kwargs):
|
||||||
subject = request.data["subject"]
|
subject = request.data["subject"]
|
||||||
@@ -203,7 +221,7 @@ class SavedQuestionsViewSet(ModelViewSet):
|
|||||||
|
|
||||||
|
|
||||||
class FeedViewSet(ModelViewSet):
|
class FeedViewSet(ModelViewSet):
|
||||||
queryset = Feed.objects.all()
|
queryset = Feed.objects.filter(deleted=False)
|
||||||
serializer_class = FeedSerializer
|
serializer_class = FeedSerializer
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
permission_classes = [IsAuthenticatedOrReadOnly]
|
||||||
# filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
|
# filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
|
||||||
@@ -227,6 +245,15 @@ class FeedViewSet(ModelViewSet):
|
|||||||
|
|
||||||
return Feed.objects.filter(id__in=result_ids)
|
return Feed.objects.filter(id__in=result_ids)
|
||||||
|
|
||||||
|
def destroy(self, request, pk=None, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
post = self.get_object()
|
||||||
|
post.deleted = True
|
||||||
|
post.save()
|
||||||
|
return JsonResponse(status=200, data={"message": "OK"})
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return JsonResponse(status=404, data={"error": f"Post {pk} not found"})
|
||||||
|
|
||||||
|
|
||||||
class TagsViewSet(ReadOnlyModelViewSet):
|
class TagsViewSet(ReadOnlyModelViewSet):
|
||||||
queryset = Tag.objects.all()
|
queryset = Tag.objects.all()
|
||||||
@@ -235,7 +262,7 @@ class TagsViewSet(ReadOnlyModelViewSet):
|
|||||||
|
|
||||||
|
|
||||||
class JobAdViewSet(ModelViewSet):
|
class JobAdViewSet(ModelViewSet):
|
||||||
queryset = JobAd.objects.all()
|
queryset = JobAd.objects.filter(deleted=False)
|
||||||
serializer_class = JobAdSerializer
|
serializer_class = JobAdSerializer
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
permission_classes = [IsAuthenticatedOrReadOnly]
|
||||||
|
|
||||||
@@ -244,6 +271,15 @@ class JobAdViewSet(ModelViewSet):
|
|||||||
return JobAd.objects.all()
|
return JobAd.objects.all()
|
||||||
return JobAd.objects.filter(visible=True, autohide_at__gt=timezone.now())
|
return JobAd.objects.filter(visible=True, autohide_at__gt=timezone.now())
|
||||||
|
|
||||||
|
def destroy(self, request, pk=None, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
ad = self.get_object()
|
||||||
|
ad.deleted = True
|
||||||
|
ad.save()
|
||||||
|
return JsonResponse(status=200, data={"message": "OK"})
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return JsonResponse(status=404, data={"error": f"Job Ad {pk} not found"})
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def about_view(request, *args, **kwargs):
|
def about_view(request, *args, **kwargs):
|
||||||
|
|||||||
Reference in New Issue
Block a user