from base_app.models import User from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from backend_app.custom import MySerializerWithJSON from backend_app.fields import JSONField from backend_app.utils import get_model_config, get_viewset_permissions from rest_framework import serializers, viewsets, mixins class PendingModeration(models.Model): """ Model to hold models that are pending moderation. """ model_config = get_model_config("PendingModeration") content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.CharField(max_length=100) # 100 should be ok referenced_object = GenericForeignKey("content_type", "object_id") updated_by = models.ForeignKey(User, on_delete=models.CASCADE) updated_on = models.DateTimeField(null=True) # Object pending moderation new_object = JSONField(default=dict) class Meta: unique_together = ("content_type", "object_id") class PendingModerationSerializer(MySerializerWithJSON): """ Serializer for the Pending Moderation Model """ content_type = serializers.CharField(read_only=True) object_id = serializers.CharField(read_only=True) updated_by = serializers.CharField(read_only=True) updated_on = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True) new_object = serializers.JSONField(read_only=True) class Meta: model = PendingModeration fields = "__all__" class PendingModerationViewSet(viewsets.ModelViewSet): """ Viewset for the pending moderation model. """ permission_classes = get_viewset_permissions("PendingModerationViewSet") queryset = PendingModeration.objects.all() # pylint: disable=E1101 serializer_class = PendingModerationSerializer class PendingModerationObjViewset(mixins.ListModelMixin, viewsets.GenericViewSet): """ Viewset to retrieve the pending moderation data for an object """ permission_classes = get_viewset_permissions("PendingModerationObjViewset") serializer_class = PendingModerationSerializer def get_queryset(self): content_type_id = self.kwargs["content_type_id"] object_pk = self.kwargs["object_pk"] return PendingModeration.objects.filter( content_type=content_type_id, object_id=object_pk )