diff --git a/requirements.txt b/requirements.txt index 6678e3c..17a0bca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,4 +25,4 @@ requests==2.25.1 requests-oauthlib==1.3.0 six==1.15.0 sqlparse==0.4.1 -urllib3==1.26.2 +urllib3==1.26.2 \ No newline at end of file diff --git a/wadium/requirements.txt b/wadium/requirements.txt new file mode 100644 index 0000000..bc77d94 Binary files /dev/null and b/wadium/requirements.txt differ diff --git a/wadium/story/models.py b/wadium/story/models.py index edc4a01..8273ecd 100644 --- a/wadium/story/models.py +++ b/wadium/story/models.py @@ -1,6 +1,6 @@ from django.db import models from django.contrib.auth.models import User - +from django.utils import timezone class Story(models.Model): writer = models.ForeignKey(User, related_name='stories', on_delete=models.CASCADE) diff --git a/wadium/story/serializers.py b/wadium/story/serializers.py index 6925184..8edd994 100644 --- a/wadium/story/serializers.py +++ b/wadium/story/serializers.py @@ -3,6 +3,7 @@ from user.serializers import UserSerializer + class StorySerializer(serializers.ModelSerializer): writer = UserSerializer(read_only=True) title = serializers.CharField(max_length=100, allow_blank=True) @@ -48,7 +49,7 @@ def update(self, instance, validated_data): story = super(StorySerializer, self).update(instance, validated_data) return story - + class SimpleStorySerializer(serializers.ModelSerializer): writer = UserSerializer(read_only=True) @@ -86,4 +87,5 @@ def create(self, validated_data): validated_data['writer'] = self.context['user'] validated_data['story'] = self.context['story'] story = super(CommentSerializer, self).create(validated_data) - return story \ No newline at end of file + return story + diff --git a/wadium/story/views.py b/wadium/story/views.py index 1e606a2..6b389d0 100644 --- a/wadium/story/views.py +++ b/wadium/story/views.py @@ -197,4 +197,5 @@ def comment_list(self, request, pk=None): assert page is not None serializer = CommentSerializer(page, many=True) - return self.get_paginated_response(serializer.data) \ No newline at end of file + return self.get_paginated_response(serializer.data) + diff --git a/wadium/user/providers/facebook/views.py b/wadium/user/providers/facebook/views.py index 5915285..93180ad 100644 --- a/wadium/user/providers/facebook/views.py +++ b/wadium/user/providers/facebook/views.py @@ -32,4 +32,4 @@ def complete_login(self, request, app, access_token, **kwargs): oauth2_callback = TokenOAuth2CallbackView.adapter_view(FacebookOAuth2NoRedirectAdapter) -oauth2_login = TokenOAuth2LoginView.adapter_view(FacebookOAuth2NoRedirectAdapter) +oauth2_login = TokenOAuth2LoginView.adapter_view(FacebookOAuth2NoRedirectAdapter) \ No newline at end of file diff --git a/wadium/user/serializers.py b/wadium/user/serializers.py index aba4960..fa56117 100644 --- a/wadium/user/serializers.py +++ b/wadium/user/serializers.py @@ -42,11 +42,11 @@ class Meta: ) extra_kwargs = {'username': {'required': False}} - def validate_auth_type(self, value): - if value in (self.OAUTH,): - raise serializers.ValidationError(f'{value} is not yet implemented.') - else: - return value + #def validate_auth_type(self, value): + # if value in (self.OAUTH,): + # raise serializers.ValidationError(f'{value} is not yet implemented.') + # else: + # return value def validate(self, data): if data['auth_type'] == self.TEST: @@ -73,6 +73,11 @@ def validate(self, data): missing = required - set(data.get('userprofile', {})) if missing: raise serializers.ValidationError(f'{missing} is required') + elif data['auth_type'] == self.OAUTH: + required = {'name', 'email'} + missing = required - set(data.get('userprofile', {})) + if missing: + raise serializers.ValidationError(f'{missing} is required') return data def create(self, validated_data): @@ -86,6 +91,9 @@ def create(self, validated_data): if userprofile['email'] != email_auth.email_address.email: raise serializers.ValidationError({'email': 'Email does not match.'}) user = UserProfile.create_user(validated_data['username'], userprofile, test_user=False) + elif auth_type == self.OAUTH: + user = UserProfile.create_user(**validated_data, test_user=False) + else: raise ValueError() Token.objects.create(user=user) @@ -140,6 +148,9 @@ def validate(self, data): raise serializers.ValidationError('email is required') elif data['req_type'] == self.LOGIN and 'access_token' not in data: raise serializers.ValidationError('access_token is required') + elif data['auth_type'] == self.OATUH: + if 'username' not in data: + raise serializers.ValidationError('username is required') return data def get_user(self, validated_data): @@ -169,6 +180,10 @@ def get_user(self, validated_data): email_auth = get_object_or_404(EmailAuth, token=validated_data['access_token']) email_auth.is_valid(must_be_email=True) return email_auth.email_address.user + elif auth_type == self.OAUTH: + oauth = get_object_or_404(EmailAuth, token=validated_data['access_token']) + oauth.is_valid(must_be_email=True) + return oauth.email_address.user else: raise NotImplementedError() @@ -198,6 +213,7 @@ class UserSocialSerializer(serializers.ModelSerializer): google = serializers.CharField(source='user.usergoogle.google_sub', required=False) facebook = serializers.CharField(source='user.userfacebook.facebook_sub', required=False) + class Meta: model = User fields = ( @@ -206,6 +222,7 @@ class Meta: ) + class MyStorySerializer(serializers.ModelSerializer): class Meta: model = Story @@ -232,3 +249,4 @@ class Meta: 'published_at', ) read_only_fields = fields + diff --git a/wadium/user/views.py b/wadium/user/views.py index 0e73201..c4e4011 100644 --- a/wadium/user/views.py +++ b/wadium/user/views.py @@ -1,11 +1,9 @@ -from django.contrib.auth import login, logout +from django.contrib.auth import login, logout, authenticate from django.contrib.auth.models import User from django.db import transaction from django.utils import timezone from django.shortcuts import get_object_or_404 - -from .serializers import UserSerializer, UserLoginSerializer, UserSelfSerializer, UserSocialSerializer, \ - MyStorySerializer, UserStorySerializer +from .serializers import UserSerializer, UserLoginSerializer, UserSelfSerializer, UserSocialSerializer, MyStorySerializer, UserStorySerializer from .models import EmailAddress, EmailAuth, UserProfile from .permissions import UserAccessPermission from story.paginators import StoryPagination @@ -15,7 +13,10 @@ from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.authtoken.models import Token +import requests +from django.conf import settings +#from rest_framework.decorators import permission_classes class UserViewSet(viewsets.GenericViewSet): queryset = User.objects.all() @@ -76,6 +77,8 @@ def create(self, request): }) elif data['req_type'] == UserSerializer.CREATE: user = serializer.save() + elif data['auth_type'] == UserSerializer.OAUTH: + pass else: return Response(status=status.HTTP_501_NOT_IMPLEMENTED) @@ -84,6 +87,7 @@ def create(self, request): data['token'] = user.auth_token.key return Response(data=data, status=status.HTTP_201_CREATED) + @action(detail=False, methods=['POST']) def login(self, request): login_serializer = UserLoginSerializer(data=request.data) @@ -107,6 +111,8 @@ def login(self, request): return Response(status=status.HTTP_503_SERVICE_UNAVAILABLE) elif data['req_type'] == UserLoginSerializer.LOGIN: user = login_serializer.get_user(data) + elif data['auth_type'] == UserLoginSerializer.OAUTH: + pass else: return Response(status=status.HTTP_501_NOT_IMPLEMENTED) diff --git a/wadium/wadium/settings.py b/wadium/wadium/settings.py index 0d17953..46ad8b5 100644 --- a/wadium/wadium/settings.py +++ b/wadium/wadium/settings.py @@ -1,11 +1,8 @@ """ Django settings for wadium project. - Generated by 'django-admin startproject' using Django 3.1.3. - For more information on this file, see https://docs.djangoproject.com/en/3.1/topics/settings/ - For the full list of settings and their values, see https://docs.djangoproject.com/en/3.1/ref/settings/ """