from base_app.models import User from django.db import models from backend_app.fields import JSONField from backend_app.models.abstract.my_model import ( MyModel, MyModelSerializer, MyModelViewSet, ) from backend_app.permissions.__list_user_post_permission import ( list_user_post_permission, ) from backend_app.utils import get_model_config, get_user_level, get_viewset_permissions from rest_framework import serializers class UserData(MyModel): model_config = get_model_config("UserData") owner = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) contact_info = JSONField(default=dict) contact_info_is_public = models.BooleanField(default=False) config = JSONField(default=dict) other_data = JSONField(default=dict) class UserDataSerializer(MyModelSerializer): owner = serializers.CharField(read_only=True) owner_level = serializers.SerializerMethodField() owner_can_post_to = serializers.SerializerMethodField() def get_owner_level(self, obj): return get_user_level(obj.owner) def get_owner_can_post_to(self, obj): return list_user_post_permission(obj.owner) def do_before_save(self): """ For safety: enforce (for sure) that we update the model corresponding to the user/owner. """ super().do_before_save() user = self.get_user_from_request() self.override_validated_data({"owner": user}) # we try to recover the correct instance query = UserData.objects.filter(owner=user) if len(query) == 1: self.instance = query[0] class Meta: model = UserData fields = "__all__" class UserDataViewSet(MyModelViewSet): permission_classes = get_viewset_permissions("UserDataViewSet") serializer_class = UserDataSerializer LIST_SHOULD_BE_DETAIL = True def get_queryset(self): def get_for_querier(): return UserData.objects.filter( owner=self.request.user ) # pylint: disable=E1101 queryset = get_for_querier() if len(queryset) == 0: UserData.objects.update_or_create(owner=self.request.user) queryset = get_for_querier() return queryset