from django.conf import settings from rest_framework import fields from rest_framework.exceptions import PermissionDenied from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin from rest_framework.viewsets import GenericViewSet from rest_framework.serializers import ModelSerializer from social_django.models import UserSocialAuth from ..sponsors import check_is_sponsor_cached from ..models import User class UserSerializer(ModelSerializer): id = fields.IntegerField() is_pro = fields.SerializerMethodField() is_sponsor = fields.SerializerMethodField() github_username = fields.SerializerMethodField() class Meta: model = User fields = ( "id", "username", "active_config", "custom_connection_gateway", "custom_connection_gateway_token", "config_sync_token", "is_pro", "is_sponsor", "github_username", ) read_only_fields = ("id", "username") def get_is_pro(self, obj): return ( obj.force_pro or not settings.GITHUB_ELIGIBLE_SPONSORSHIPS or check_is_sponsor_cached(obj) ) def get_is_sponsor(self, obj): return check_is_sponsor_cached(obj) def get_github_username(self, obj): social_auth = UserSocialAuth.objects.filter(user=obj, provider="github").first() if not social_auth: return None return social_auth.extra_data.get("login") class UserViewSet(RetrieveModelMixin, UpdateModelMixin, GenericViewSet): queryset = User.objects.all() serializer_class = UserSerializer def get_object(self): if self.request.user.is_authenticated: return self.request.user raise PermissionDenied()