Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos / models / rest.py
Size: Mime:
from typing import Type

from rest_framework import serializers, viewsets, mixins

from .models import KaosModel


class KaosModelSerializer(serializers.ModelSerializer):
    def get_field_names(self, declared_fields, info):
        meta_fields = getattr(self.Meta, 'fields', None)
        if meta_fields is None:
            self.Meta.fields = self.Meta.model.config.get_flat_fields()
        return super().get_field_names(declared_fields, info)

    class Meta:
        model: Type[KaosModel]


class GenericKaosModelViewSet(viewsets.GenericViewSet):
    model: Type[KaosModel] = None
    lookup_field = 'uuid'

    def get_queryset(self):
        if self.queryset is None:
            return self.model.objects.all()
        return super().get_queryset()

    def _get_model(self):
        if self.model is not None:
            return self.model
        if self.queryset is not None:
            return self.queryset.model
        raise Exception("Set at least one of model or queryset")

    @property
    def search_fields(self):
        return self._get_model().config.search_fields

    @property
    def filterset_fields(self):
        return self._get_model().config.filterset_fields


class KaosModelViewSet(mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       mixins.ListModelMixin,
                       GenericKaosModelViewSet):
    pass


__all__ = (
    'KaosModelSerializer',
    'GenericKaosModelViewSet',
    'KaosModelViewSet',
)