Skip to content

Commit a9d98a2

Browse files
committed
Endpoint to retrieve all the connected social accounts
1 parent 807d606 commit a9d98a2

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

readthedocs/restapi/serializers.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from __future__ import absolute_import
44

55
from builtins import object
6+
7+
from allauth.socialaccount.models import SocialAccount
68
from rest_framework import serializers
79

810
from readthedocs.builds.models import Build, BuildCommandResult, Version
@@ -157,3 +159,26 @@ def get_matches(self, obj):
157159
request = self.context['request']
158160
if request.user is not None and request.user.is_authenticated():
159161
return obj.matches(request.user)
162+
163+
164+
class ProviderSerializer(serializers.Serializer):
165+
166+
name = serializers.CharField(max_length=20)
167+
168+
169+
class SocialAccountSerializer(serializers.ModelSerializer):
170+
171+
username = serializers.SerializerMethodField()
172+
avatar_url = serializers.URLField(source='get_avatar_url')
173+
provider = ProviderSerializer(source='get_provider')
174+
175+
class Meta(object):
176+
model = SocialAccount
177+
exclude = ('extra_data',)
178+
179+
def get_username(self, obj):
180+
return (
181+
obj.extra_data.get('username') or
182+
obj.extra_data.get('login')
183+
# FIXME: which one is GitLab?
184+
)

readthedocs/restapi/urls.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
ProjectViewSet, NotificationViewSet,
1818
VersionViewSet, DomainViewSet,
1919
RemoteOrganizationViewSet,
20-
RemoteRepositoryViewSet)
20+
RemoteRepositoryViewSet,
21+
SocialAccountViewSet)
2122

2223
router = routers.DefaultRouter()
2324
router.register(r'build', BuildViewSet, base_name='build')
@@ -30,6 +31,8 @@
3031
r'remote/org', RemoteOrganizationViewSet, base_name='remoteorganization')
3132
router.register(
3233
r'remote/repo', RemoteRepositoryViewSet, base_name='remoterepository')
34+
router.register(
35+
r'remote/account', SocialAccountViewSet, base_name='remoteaccount')
3336
router.register(r'comments', CommentViewSet, base_name="comments")
3437

3538
urlpatterns = [

readthedocs/restapi/views/model_views.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import absolute_import
44
import logging
55

6+
from allauth.socialaccount.models import SocialAccount
67
from django.shortcuts import get_object_or_404
78
from rest_framework import decorators, permissions, viewsets, status
89
from rest_framework.decorators import detail_route
@@ -26,7 +27,7 @@
2627
ProjectSerializer, ProjectAdminSerializer,
2728
VersionSerializer, VersionAdminSerializer,
2829
DomainSerializer, RemoteOrganizationSerializer,
29-
RemoteRepositorySerializer)
30+
RemoteRepositorySerializer, SocialAccountSerializer)
3031
from .. import utils as api_utils
3132

3233
log = logging.getLogger(__name__)
@@ -274,3 +275,13 @@ def get_queryset(self):
274275

275276
def get_paginate_by(self):
276277
return self.request.query_params.get('page_size', 25)
278+
279+
280+
class SocialAccountViewSet(viewsets.ReadOnlyModelViewSet):
281+
permission_classes = [IsOwner]
282+
renderer_classes = (JSONRenderer,)
283+
serializer_class = SocialAccountSerializer
284+
model = SocialAccount
285+
286+
def get_queryset(self):
287+
return self.model.objects.filter(user=self.request.user.pk)

0 commit comments

Comments
 (0)