diff --git a/webapp/serializers.py b/webapp/serializers.py index c756a7e..6a4dd14 100644 --- a/webapp/serializers.py +++ b/webapp/serializers.py @@ -2,6 +2,14 @@ from rest_framework import serializers from webapp.models import * +class SavedQuestionsSerializer(serializers.ModelSerializer): + questions = serializers.JSONField() + + class Meta: + model = TemplateQuestion + fields = ("id", "name", "questions") + + class SignupSerializer(serializers.ModelSerializer): signupForm_id = serializers.PrimaryKeyRelatedField( source="signupForm", queryset=SignupForm.objects.all() @@ -68,6 +76,46 @@ class SignupFormSerializer(serializers.ModelSerializer): ) +class TagSerializer(serializers.ModelSerializer): + class Meta: + model = Tag + fields = ("id", "slug", "name_fi", "name_en", "icon") + + +class FeedSerializer(serializers.ModelSerializer): + tag_id = serializers.PrimaryKeyRelatedField( + many=True, source="tags", queryset=Tag.objects.all() + ) + + class Meta: + model = Feed + fields = ( + "id", + "tags", + "tag_id", + "visible", + "image", + "title_fi", + "title_en", + "description_fi", + "description_en", + "content_fi", + "content_en", + "publish_time", + "autohide", + "autohide_enabled", + ) + depth = 1 + + def create(self, validated_data): + tags_data = validated_data.pop("tags") + feed = Feed.objects.create(**validated_data) + for tag in tags_data: + feed.tags.add(tag) + feed.save() + return feed + + class EventSerializer(serializers.ModelSerializer): signupForm = SignupFormSerializer( source="filtered_signup_forms", @@ -134,54 +182,6 @@ class EventSerializer(serializers.ModelSerializer): return instance -class SavedQuestionsSerializer(serializers.ModelSerializer): - questions = serializers.JSONField() - - class Meta: - model = TemplateQuestion - fields = ("id", "name", "questions") - - -class TagSerializer(serializers.ModelSerializer): - class Meta: - model = Tag - fields = ("id", "slug", "name_fi", "name_en", "icon") - - -class FeedSerializer(serializers.ModelSerializer): - tag_id = serializers.PrimaryKeyRelatedField( - many=True, source="tags", queryset=Tag.objects.all() - ) - - class Meta: - model = Feed - fields = ( - "id", - "tags", - "tag_id", - "visible", - "image", - "title_fi", - "title_en", - "description_fi", - "description_en", - "content_fi", - "content_en", - "publish_time", - "autohide", - "autohide_enabled", - ) - depth = 1 - - def create(self, validated_data): - tags_data = validated_data.pop("tags") - feed = Feed.objects.create(**validated_data) - for tag in tags_data: - feed.tags.add(tag) - feed.save() - return feed - - class JobAdSerializer(serializers.ModelSerializer): class Meta: model = JobAd diff --git a/webapp/views.py b/webapp/views.py index 5fd4009..7e6c36e 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -46,6 +46,49 @@ class RootView(routers.APIRootView): permission_classes = [IsAuthenticatedOrReadOnly] +class TagsViewSet(ReadOnlyModelViewSet): + queryset = Tag.objects.all() + serializer_class = TagSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + + +class FeedViewSet(ModelViewSet): + queryset = Feed.objects.filter(deleted=False) + serializer_class = FeedSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) + filter_fields = ("id", "tags", "visible") + search_fields = ("id", "tags", "visible") + + def get_queryset(self): + if self.request.user.is_authenticated: + return Feed.objects.filter(deleted=False).order_by("-publish_time") + else: + objs = Feed.objects.filter(deleted=False, visible=True).order_by( + "-publish_time" + ) + + # TODO: Bad filtering. Rewrite! + result_ids = [] + for obj in objs: + if obj.autohide_enabled: + if obj.autohide > timezone.now(): + result_ids.append(obj.id) + else: + result_ids.append(obj.id) + + return Feed.objects.filter(id__in=result_ids).order_by("-publish_time") + + 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 EventViewSet(ModelViewSet): queryset = Event.objects.filter(deleted=False) ordering = ["start_time"] @@ -122,6 +165,45 @@ class EventViewSet(ModelViewSet): return JsonResponse(status=404, data={"error": f"Event {pk} not found"}) +class JobAdViewSet(ModelViewSet): + queryset = JobAd.objects.filter(deleted=False) + serializer_class = JobAdSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + + def get_queryset(self): + if self.request.user.is_authenticated: + return JobAd.objects.filter(deleted=False) + return JobAd.objects.filter( + deleted=False, visible=True, autohide__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"}) + + +class SavedQuestionsViewSet(ModelViewSet): + queryset = TemplateQuestion.objects.filter(deleted=False) + serializer_class = SavedQuestionsSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + + def destroy(self, request, pk=None, *args, **kwargs): + try: + question = self.get_object() + question.deleted = True + question.save() + return JsonResponse(status=200, data={"message": "OK"}) + except ObjectDoesNotExist: + return JsonResponse( + status=404, data={"error": f"Template question {pk} not found"} + ) + + class SignupFormViewSet(ModelViewSet): queryset = SignupForm.objects.filter(deleted=False) ordering = ["start_time"] @@ -264,88 +346,6 @@ class SignupViewSet(ModelViewSet): return JsonResponse(status=404, data={"error": f"Signup {pk} not found"}) -class SavedQuestionsViewSet(ModelViewSet): - queryset = TemplateQuestion.objects.filter(deleted=False) - serializer_class = SavedQuestionsSerializer - permission_classes = [IsAuthenticatedOrReadOnly] - - def destroy(self, request, pk=None, *args, **kwargs): - try: - question = self.get_object() - question.deleted = True - question.save() - return JsonResponse(status=200, data={"message": "OK"}) - except ObjectDoesNotExist: - return JsonResponse( - status=404, data={"error": f"Template question {pk} not found"} - ) - - -class FeedViewSet(ModelViewSet): - queryset = Feed.objects.filter(deleted=False) - serializer_class = FeedSerializer - permission_classes = [IsAuthenticatedOrReadOnly] - filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) - filter_fields = ("id", "tags", "visible") - search_fields = ("id", "tags", "visible") - - def get_queryset(self): - if self.request.user.is_authenticated: - return Feed.objects.filter(deleted=False).order_by("-publish_time") - else: - objs = Feed.objects.filter(deleted=False, visible=True).order_by( - "-publish_time" - ) - - # TODO: Bad filtering. Rewrite! - result_ids = [] - for obj in objs: - if obj.autohide_enabled: - if obj.autohide > timezone.now(): - result_ids.append(obj.id) - else: - result_ids.append(obj.id) - - return Feed.objects.filter(id__in=result_ids).order_by("-publish_time") - - 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): - queryset = Tag.objects.all() - serializer_class = TagSerializer - permission_classes = [IsAuthenticatedOrReadOnly] - - -class JobAdViewSet(ModelViewSet): - queryset = JobAd.objects.filter(deleted=False) - serializer_class = JobAdSerializer - permission_classes = [IsAuthenticatedOrReadOnly] - - def get_queryset(self): - if self.request.user.is_authenticated: - return JobAd.objects.filter(deleted=False) - return JobAd.objects.filter( - deleted=False, visible=True, autohide__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"]) def nginx_jwt_resp(request, *args, **kwargs): accessKey = request.COOKIES.get("jwt_access", None)