Skip to content

Commit

Permalink
Merge branch 'master' into feature/retromigrations
Browse files Browse the repository at this point in the history
  • Loading branch information
bnznamco committed May 31, 2021
2 parents e41b822 + 1ee30d6 commit 0c8b966
Show file tree
Hide file tree
Showing 16 changed files with 89 additions and 64 deletions.
8 changes: 4 additions & 4 deletions camomilla/serializers/article.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
from ..models import Article, Category, Tag
from .fields import RelatedField
from .media import MediaSerializer
from .mixins import CamomillaBaseTranslatableModelSerializer
from .base import BaseTranslatableModelSerializer


class TagSerializer(CamomillaBaseTranslatableModelSerializer):
class TagSerializer(BaseTranslatableModelSerializer):
class Meta:
model = Tag
fields = "__all__"


class CategorySerializer(CamomillaBaseTranslatableModelSerializer):
class CategorySerializer(BaseTranslatableModelSerializer):
class Meta:
model = Category
fields = "__all__"


class ArticleSerializer(CamomillaBaseTranslatableModelSerializer):
class ArticleSerializer(BaseTranslatableModelSerializer):

highlight_image = RelatedField(serializer=MediaSerializer, allow_null=True)
tags = RelatedField(serializer=TagSerializer, many=True, allow_null=True)
Expand Down
13 changes: 13 additions & 0 deletions camomilla/serializers/base/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from ..mixins import LangInfoMixin, SetupEagerLoadingMixin, TranslationSetMixin
from rest_framework import serializers
from hvad.contrib.restframework import TranslatableModelSerializer


class BaseModelSerializer(SetupEagerLoadingMixin, serializers.ModelSerializer):
pass


class BaseTranslatableModelSerializer(
LangInfoMixin, TranslationSetMixin, TranslatableModelSerializer
):
pass
12 changes: 9 additions & 3 deletions camomilla/serializers/media.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
from rest_framework import serializers

from ..models import Media, MediaFolder
from .mixins import CamomillaBaseTranslatableModelSerializer
from .base import BaseTranslatableModelSerializer


class MediaSerializer(CamomillaBaseTranslatableModelSerializer):
class MediaListSerializer(BaseTranslatableModelSerializer):
class Meta:
model = Media
fields = "__all__"


class MediaSerializer(BaseTranslatableModelSerializer):
links = serializers.SerializerMethodField("get_linked_instances")

class Meta:
Expand All @@ -30,7 +36,7 @@ def get_linked_instances(self, obj):
return result


class MediaFolderSerializer(CamomillaBaseTranslatableModelSerializer):
class MediaFolderSerializer(BaseTranslatableModelSerializer):
icon = MediaSerializer(read_only=True)

class Meta:
Expand Down
10 changes: 5 additions & 5 deletions camomilla/serializers/mixins/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.conf import settings
from hvad.contrib.restframework import TranslatableModelSerializer, TranslationsMixin
from hvad.contrib.restframework import TranslationsMixin
from rest_framework import serializers
from django.utils import translation

Expand Down Expand Up @@ -39,7 +39,7 @@ def get_default_field_names(self, *args):
return field_names


class CamomillaBaseTranslatableModelSerializer(
LangInfoMixin, TranslationSetMixin, TranslatableModelSerializer
):
pass
class SetupEagerLoadingMixin:
@staticmethod
def setup_eager_loading(queryset):
return queryset
6 changes: 3 additions & 3 deletions camomilla/serializers/page.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from ..models import Content, Page
from .fields import RelatedField
from .media import MediaSerializer
from .mixins import CamomillaBaseTranslatableModelSerializer
from .base import BaseTranslatableModelSerializer


class ContentSerializer(CamomillaBaseTranslatableModelSerializer):
class ContentSerializer(BaseTranslatableModelSerializer):
class Meta:
model = Content
fields = "__all__"


class PageSerializer(CamomillaBaseTranslatableModelSerializer):
class PageSerializer(BaseTranslatableModelSerializer):
og_image = RelatedField(serializer=MediaSerializer, allow_null=True)
contents = RelatedField(serializer=ContentSerializer, many=True, allow_null=True)

Expand Down
7 changes: 4 additions & 3 deletions camomilla/serializers/user.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
from .base import BaseModelSerializer
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _


class PermissionSerializer(serializers.ModelSerializer):
class PermissionSerializer(BaseModelSerializer):
class Meta:
model = Permission
fields = "__all__"


class UserProfileSerializer(serializers.ModelSerializer):
class UserProfileSerializer(BaseModelSerializer):

user_permissions = PermissionSerializer(read_only=True, many=True)

Expand All @@ -19,7 +20,7 @@ class Meta:
fields = "__all__"


class UserSerializer(serializers.ModelSerializer):
class UserSerializer(BaseModelSerializer):

id = serializers.IntegerField(read_only=True)
password = serializers.CharField(
Expand Down
6 changes: 3 additions & 3 deletions camomilla/views/articles.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from .mixins import GetUserLanguageMixin, BulkDeleteMixin, PaginateStackMixin
from rest_framework import viewsets
from .base import BaseModelViewset
from .mixins import GetUserLanguageMixin, BulkDeleteMixin

from ..models import Article
from ..serializers import ArticleSerializer
from ..permissions import CamomillaBasePermissions


class ArticleViewSet(PaginateStackMixin, GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class ArticleViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Article.objects.all()
serializer_class = ArticleSerializer
Expand Down
6 changes: 6 additions & 0 deletions camomilla/views/base/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from ..mixins import OptimViewMixin, PaginateStackMixin
from rest_framework import viewsets


class BaseModelViewset(OptimViewMixin, PaginateStackMixin, viewsets.ModelViewSet):
pass
6 changes: 3 additions & 3 deletions camomilla/views/categories.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from .mixins import GetUserLanguageMixin, BulkDeleteMixin, PaginateStackMixin
from .base import BaseModelViewset
from .mixins import GetUserLanguageMixin, BulkDeleteMixin
from ..models import Category
from ..serializers import CategorySerializer
from ..permissions import CamomillaBasePermissions
from rest_framework import viewsets


class CategoryViewSet(PaginateStackMixin, GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class CategoryViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Category.objects.all()
serializer_class = CategorySerializer
Expand Down
6 changes: 3 additions & 3 deletions camomilla/views/contents.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
from .base import BaseModelViewset
import json

from django.http import JsonResponse
from django.utils.translation import get_language
from rest_framework import viewsets
from rest_framework.decorators import action

from ..models import Content
from ..permissions import CamomillaBasePermissions
from ..serializers import ContentSerializer
from .mixins import BulkDeleteMixin, GetUserLanguageMixin, PaginateStackMixin
from .mixins import BulkDeleteMixin, GetUserLanguageMixin


class ContentViewSet(PaginateStackMixin, GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class ContentViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Content.objects.all()
serializer_class = ContentSerializer
Expand Down
12 changes: 6 additions & 6 deletions camomilla/views/medias.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
from .mixins import BulkDeleteMixin, GetUserLanguageMixin, PaginateStackMixin
from .base import BaseModelViewset
from .mixins import BulkDeleteMixin, GetUserLanguageMixin
from ..parsers import MultipartJsonParser
from django.shortcuts import redirect


from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.decorators import action

from ..models import Media, MediaFolder
from ..serializers import MediaSerializer, MediaFolderSerializer
from ..serializers import MediaSerializer, MediaFolderSerializer, MediaListSerializer
from ..permissions import CamomillaBasePermissions


class MediaFolderViewSet(
PaginateStackMixin, GetUserLanguageMixin, viewsets.ModelViewSet
GetUserLanguageMixin, BaseModelViewset
):
model = MediaFolder
serializer_class = MediaFolderSerializer
Expand All @@ -37,7 +37,7 @@ def get_mixed_response(self, request, *args, **kwargs):
).data
media_data = self.format_output(
*self.handle_pagination_stack(media_queryset),
SerializerClass=MediaSerializer
SerializerClass=MediaListSerializer
)
return {
"folders": folder_data,
Expand All @@ -52,7 +52,7 @@ def retrieve(self, request, *args, **kwargs):
return Response(self.get_mixed_response(request, *args, **kwargs))


class MediaViewSet(GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class MediaViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Media.objects.all()
serializer_class = MediaSerializer
Expand Down
19 changes: 19 additions & 0 deletions camomilla/views/mixins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,25 @@ def get_queryset(self):
)


class OptimViewMixin:
def get_serializer_class(self):
if hasattr(self, "action_serializers"):
if self.action in self.action_serializers:
return self.action_serializers[self.action]
return super().get_serializer_class()

def get_serializer_context(self):
return {"request": self.request, "action": self.action}

def get_queryset(self):
queryset = super().get_queryset()
serializer = self.get_serializer_class()
if hasattr(serializer, "setup_eager_loading"):
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset



class BulkDeleteMixin(object):
@action(detail=False, methods=['post'], permission_classes=(CamomillaBasePermissions,))
def bulk_delete(self, request):
Expand Down
21 changes: 1 addition & 20 deletions camomilla/views/mixins/pagination.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,9 @@
from rest_framework import viewsets
from rest_framework.response import Response
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.contrib.postgres.search import SearchVector, SearchQuery


class BaseModelViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if hasattr(self, "action_serializers"):
if self.action in self.action_serializers:
return self.action_serializers[self.action]
return super(BaseModelViewSet, self).get_serializer_class()

def get_serializer_context(self):
return {"request": self.request, "action": self.action}

def get_queryset(self):
queryset = super(BaseModelViewSet, self).get_queryset()
serializer = self.get_serializer_class()
if hasattr(serializer, "setup_eager_loading"):
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset


class PaginateStackMixin(BaseModelViewSet):
class PaginateStackMixin:
def parse_qs_value(self, string: str):
if string and string.startswith("[") and string.endswith("]"):
string = [self.parse_qs_value(substr) for substr in string[1:-1].split(",")]
Expand Down
6 changes: 3 additions & 3 deletions camomilla/views/pages.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from .mixins import GetUserLanguageMixin, BulkDeleteMixin, PaginateStackMixin
from .base import BaseModelViewset
from .mixins import GetUserLanguageMixin, BulkDeleteMixin
from ..models import Page
from ..serializers import PageSerializer
from ..permissions import CamomillaBasePermissions
from rest_framework import viewsets


class PageViewSet(PaginateStackMixin, GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class PageViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Page.objects.all()
serializer_class = PageSerializer
Expand Down
6 changes: 3 additions & 3 deletions camomilla/views/tags.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from .mixins import GetUserLanguageMixin, BulkDeleteMixin, PaginateStackMixin
from .base import BaseModelViewset
from .mixins import GetUserLanguageMixin, BulkDeleteMixin
from ..models import Tag
from ..serializers import TagSerializer
from ..permissions import CamomillaBasePermissions
from rest_framework import viewsets


class TagViewSet(PaginateStackMixin, GetUserLanguageMixin, BulkDeleteMixin, viewsets.ModelViewSet):
class TagViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):

queryset = Tag.objects.all()
serializer_class = TagSerializer
Expand Down
9 changes: 4 additions & 5 deletions camomilla/views/users.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from .base import BaseModelViewset
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission

from django.db.models import Q

from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.decorators import action

Expand All @@ -15,7 +15,6 @@
PermissionSerializer,
)
from ..permissions import CamomillaSuperUser
from .mixins import PaginateStackMixin


class CamomillaObtainAuthToken(ObtainAuthToken):
Expand All @@ -30,7 +29,7 @@ def post(self, request, *args, **kwargs):
return Response({"token": token.key})


class UserViewSet(PaginateStackMixin, viewsets.ModelViewSet):
class UserViewSet(BaseModelViewset):

queryset = get_user_model().objects.all()
serializer_class = UserSerializer
Expand All @@ -55,7 +54,7 @@ def kickout(self, request, pk=None):
return Response({})


class PermissionViewSet(viewsets.ModelViewSet):
class PermissionViewSet(BaseModelViewset):

queryset = Permission.objects.all()
serializer_class = PermissionSerializer
Expand All @@ -73,7 +72,7 @@ def get_queryset(self):
return permissions


class UserProfileViewSet(PaginateStackMixin, viewsets.ModelViewSet):
class UserProfileViewSet(BaseModelViewset):

queryset = get_user_model().objects.all()
serializer_class = UserProfileSerializer
Expand Down

0 comments on commit 0c8b966

Please sign in to comment.