def get_user(self, obj):
        serializer = UserSerializer(obj)
        try:
            profile = Profile.objects.select_related('user').filter(user=obj).get()

            data = {
                "username": serializer.data['nickname'],
                "following_url": "/api/member/" + str(serializer.data['pk']) + "/follow/",
                "intro": profile.intro,
                "web": profile.web,
                "achevement": "",
                "instagram": profile.instagram,
                "facebook": profile.facebook,
                "twitter": profile.twitter,
                "img": self.image(obj)

            }

            return data
        except ObjectDoesNotExist:
            data = {
                "username": serializer.data['nickname'],
                "following_url": "/api/member/" + str(serializer.data['pk']) + "/follow/",
                "intro": "",
                "web": "",
                "achevement": "",
                "instagram": "",
                "facebook": "",
                "twitter": "",
                "img": self.image(obj)

            }
            return data
Example #2
0
class GroupSerializer(serializers.ModelSerializer):
    owner = UserSerializer(many=False, read_only=True)
    tags = TagSerializer(many=True, read_only=True)

    class Meta:
        model = MyGroup
        fields = (
            'pk',
            'name',
            'owner',
            'profile_img',
            'group_type',
            'description',
            'num_of_members',
            'tags',
        )
        read_only_fields = ('num_of_members', )

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        user = self.context['request'].user
        if user.is_authenticated:
            ret['is_member'] = user.membership_set.filter(
                group=instance).exists()
            if ret['is_member']:
                ret['is_owner'] = instance.owner == user
        return ret
 def post(self, request):
     # 프론트로부터 전달된 token값
     token = request.data.get('token')
     if not token:
         raise APIException('token require')
     # 전달받은 token을 debug
     result = self.debug_token(token)
     # debug후 is_valid가 True일 경우
     if result['data']['is_valid']:
         # Facebook user id를 가져옴
         facebook_user_id = result['data']['user_id']
         # 해당 user id가 username인 유저가 있는지 검사
         if User.objects.filter(username=facebook_user_id).exists():
             user = User.objects.get(username=facebook_user_id)
             created = False
         else:
             user = User.objects.create_user(username=facebook_user_id)
             created = True
         # user에 해당하는 Token을 가져오거나 새로 만듬
         token, _ = Token.objects.get_or_create(user=user)
         # 관련 정보들을 dict화
         ret = {
             'token': token.key,
             'user': UserSerializer(user).data,
             'user_created': created,
         }
         # API에서 돌려줌
         return Response(ret)
     else:
         raise APIException('token invalid')
Example #4
0
class PostListSerializer(serializers.ModelSerializer):
    # User 정보를 author에 표현하기 위해 멤버 모델 완성 후 바꿔줘야함
    author = UserSerializer()

    # PostList뷰에서 Post의 첫 사진을 커버로 이용하기 위한 필드
    # method필드가 아니라 릴레이션필드를 사용해야함.
    img = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'title',
            'start_date',
            'end_date',
            'img',
            'continent',
            'liked',
            'num_liked',
        )

    def get_img(self, obj):
        s = obj.img.url
        return s.split('?')[0]
Example #5
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    my_comment = CommentSerializer(read_only=True)
    comments = CommentSerializer(read_only=True,
                                 many=True,
                                 source='comment_set')

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo',
            'my_comment',
            'comments',
        )
        read_only_fields = (
            'author',
            'my_comment',
        )

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['is_like'] = self.context[
            'request'].user in instance.like_users.all()
Example #6
0
    def post(self, request):
        # request.data에 access_token, fackebook_user_id가 전달됨
        # Debug 결과의 NamedTuple
        class DebugTokenInfo(NamedTuple):
            app_id: str
            application: str
            expires_at: int
            is_valid: bool
            issued_at: int
            scopes: list
            type: str

        # token(access_token)을 받아 해당 토큰을 Debug
        def get_debug_token_info(token):
            app_id = settings.FACEBOOK_APP_ID
            app_secret_code = settings.FACEBOOK_APP_SECRET_CODE
            app_access_token = f'{app_id}|{app_secret_code}'
            url_debug_token = 'https://graph.facebook.com/debug_token'
            params_debug_token = {
                'input_token': token,
                'access_token': app_access_token,
            }
            response = requests.get(url_debug_token, params_debug_token)
            return DebugTokenInfo(**response.json()['data'])

            # request.data로 전달된 access_token값을 페이스북API쪽에 debug요청, 결과를 받아옴

        debug_token_info = get_debug_token_info(request.data['access_token'])
        if debug_token_info.user_id != request.data['facebook_user_id']:
            raise APIException('페이스북 토큰의 사용자와 전달받은 facebook_user_id가 일치하지 않음')
        if not debug_token_info.is_valid:
            raise APIException('페이스북 토큰이 유효하지 않음')

        user = authenticate(facebook_user_id=request.data['facebook_user_id'])
        if not user:
            user = User.objects.create_user(
                username=f'fb_{request.data["facebook_user_id"]}',
                user_type=User.USER_TYPE_FACEBOOK,
            )
        # 유저 시리얼라이즈 결과를 Response
        # token도 추가
        data = {'user': UserSerializer(user).data, 'token': user.token}
        return Response(UserSerializer(user).data)
Example #7
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo',
            'created_date',
        )
Example #8
0
class CommentUpdateSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    content = serializers.CharField(required=True)

    class Meta:
        model = Comment
        fields = ('pk', 'post', 'author', 'content', 'created_date')
        read_only_fields = (
            'post',
            'created_date',
        )
Example #9
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer()

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo',
            'created_at',
        )
Example #10
0
class PostSerializer(serializers.ModelSerializer):
    # author를 pk값이 아닌 user 객체로 올 수 있도록 세팅
    author = UserSerializer()

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo',
            'created_at',
        )
Example #11
0
class PostReplySerializer(serializers.ModelSerializer):

    author = UserSerializer()
    class Meta:
        model = PostReply
        fields = (
            'pk',
            'post',
            'author',
            'content',
            'created_at',
        )
Example #12
0
class PostSerializer(serializers.ModelSerializer):
    """
    목표 1.
        author필드의 값이 pk가 아닌, 하나의 Object(dict)로 나타나도록 수정
        http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

    1. 관련 테스트코드 작성
        post_list, post_create부분
    2. 해당 테스트코드가 작동하도록 PostSerializer를 수정 및 UserSerializer작성
    3. 테스트 및 포스트맨 작동 확인

    목표 2.
        Post에 연결된 PostPhoto를 리스트 내부의 Object형태로 리턴
        'author': {<author object>},
        'postphoto_set': [
            {
                'pk': <PostPhoto pk>,
                'photo': <PostPhoto photo field url>,
            },
            {
                'pk': <PostPhoto pk>,
                'photo': <PostPhoto photo field url>,
            },
        ]

        1. 관련 테스트코드 작성
            post_list, post_create부분
        2. 해당 테스트코드가 작동하도록 PostSerializer를 수정 및 PostPhotoSerializer작성
        3. 테스트 및 포스트맨 작동 확인
        4. postphoto_set의 이름을 photo_list로 변경
            http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

    목표 3.
        post-list요청시 Pagination될 수 있도록 변경

    1. 관련 테스트코드 작성 (가능하면)
    2. Pagination문서 보고 CustomPagination구현
    3. pagination_class에 지정
    4. 요청결과를 확인
    """
    author = UserSerializer(read_only=True)
    postphoto_set = PostPhotoSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'created_date',
            'postphoto_set',
        )
        read_only_fields = ('created_date', )
class CommentSerializer(serializers.ModelSerializer):
    post = PostSerializer(read_only=True)
    author = UserSerializer(read_only=True)

    class Meta:
        model = Comment
        fields = (
            'id',
            'post',
            'author',
            'content',
            'created_date',
        )
class AuthorSerializer(serializers.ModelSerializer):
    author = UserSerializer()

    class Meta:
        model = AuthorModel
        fields = (
            'pk',
            'author',
            'is_active',
            'intro',
            'blog',
            'created_at'
        )
Example #15
0
    def get(self, request, *args, **kwargs):
        import requests
        token = self.kwargs.get('token')

        def get_debug_token_info(token):
            headers = {"Authorization": "Bearer " + token}
            r = requests.post(url='https://kapi.kakao.com/v1/user/me',
                              headers=headers)
            # print(json.dumps(list(r)))
            return r.json()

        debug_token_info = get_debug_token_info(token)

        if debug_token_info.get('code'):

            return HttpResponseRedirect(redirect_to='/').delete_cookie()

        user_id = debug_token_info['id']

        user = KakaoBackend.authenticate(user_id=user_id)

        if not user:
            userinfo = User.objects.filter(
                username=debug_token_info['kaccount_email']).count()

            if not userinfo == 0:
                raise NotAcceptable('Already exists this email')

            user = User.objects.create_kakao_user(
                username=debug_token_info['kaccount_email'],
                nickname=debug_token_info['properties']['nickname'],
                social_id=f'k_{user_id}',
            )
            Profile.objects.create(user=user)
            ProfileImage.objects.create(user=user)
        else:
            user = User.objects.filter(social_id=f'k_{user_id}').get()

        data = {
            'user': UserSerializer(user).data,
            'token': jwt_token_generator(user)
        }

        response = Response(data, status=status.HTTP_200_OK)
        if api_settings.JWT_AUTH_COOKIE:
            response.set_cookie(api_settings.JWT_AUTH_COOKIE,
                                response.data['token'],
                                max_age=21600,
                                httponly=True)

        return response
Example #16
0
class CommentDetailSerializer(serializers.ModelSerializer):
    movie = MovieSerializer(read_only=True)
    author = UserSerializer(read_only=True)

    class Meta:
        model = Comment
        fields = (
            'id',
            'movie',
            'author',
            'star',
            'content',
            'created_date',
        )
Example #17
0
    def post(self, request):
        # request.data 에 facebook_user_id 와 access_token 이 전달되어 옴
        print(request.data)

        # token 값의 유효성을 검사하기 위한 정보를 저장하는 클래스
        class DebugTokenInfo(NamedTuple):
            app_id: str
            application: str
            expires_at: int
            is_valid: bool
            issued_at: int
            scopes: list
            type: str
            user_id: str

        # 받아온 토큰 값이 진짜 토큰인지 확인하는 메서드
        def get_debug_token_info(access_token):
            app_id = settings.FACEBOOK_APP_ID
            app_secret_code = settings.FACEBOOK_APP_SECRET_CODE
            app_access_token = f'{app_id}|{app_secret_code}'

            params = {
                'input_token': access_token,
                'access_token': app_access_token,
            }
            response = requests.get('https://graph.facebook.com/debug_token', params=params)
            return DebugTokenInfo(**response.json()['data'])

        debug_token_info = get_debug_token_info(request.data['access_token'])

        if debug_token_info.user_id != request.data['facebook_user_id']:
            raise APIException('페이스북 토큰의 사용자와 전달받은 facebook_user_id가 일치하지 않음')

        if not debug_token_info.is_valid:
            raise APIException('페이스북 토큰이 유효하지 않음')

        # FacebookBackend를 사용해서 유저 인증
        user = authenticate(facebook_user_id=request.data['facebook_user_id'])
        # 인증에 실패한 경우 페이스북유저 타입으로 유저를 만들어줌
        if not user:
            user = User.objects.create_user(
                username=f'fb_{request.data["facebook_user_id"]}',
                user_type=User.USER_TYPE_FACEBOOK,
            )
        # 유저 시리얼라이즈 결과를 Response
        data = {
            'user': UserSerializer(user).data,
            'token': user.token,
        }
        return Response(data)
Example #18
0
class PhotoCommentSerializer(serializers.ModelSerializer):
    """
    UserSerializer를 구현하고, author field를 Nested relation으로 나타냄
    author필드에서 UserSerializer를 사용하도록 설정
    """
    author = UserSerializer(read_only=True)

    class Meta:
        model = PhotoComment
        fields = (
            'id',
            'photo',
            'author',
            'content',
        )
Example #19
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'title',
            'thumbnail',
            'post',
            'date_created',
            'is_published',
            'category',
        )
Example #20
0
 def post(self, request, *args, **kwargs):
     instance = self.get_object()
     user = request.user
     if user.like_posts.filter(pk=instance.pk):
         user.like_posts.remove(instance)
         like_status = False
     else:
         user.like_posts.add(instance)
         like_status = True
     data = {
         'user': UserSerializer(user).data,
         'post': PostSerializer(instance).data,
         'result': like_status
     }
     return Response(data)
Example #21
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    photo_list = PostPhotoSerializer(many=True,
                                     read_only=True,
                                     source='postphoto_set')

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo_list',
            'created_date',
        )
        read_only_fields = ('created_date', )
Example #22
0
 def post(self, request, *args, **kwargs):
     instance = self.get_object()
     user = request.user
     # 이미 유저의 like_posts 목록에 현재 post(instance)가 존재할 경우
     if instance in user.like_posts.all():
         user.like_posts.remove(instance)
         like_status = False
     else:
         user.like_posts.add(instance)
         like_status = True
     data = {
         'user': UserSerializer(user).data,
         'post': PostSerializer(instance).data,
         'result': like_status,
     }
     return Response(data)
Example #23
0
 def post(self, request, *args, **kwargs):
     user = request.user
     post = self.get_object()
     filtered_like_posts = user.like_posts.filter(pk=post.pk)
     if filtered_like_posts.exists():
         user.like_posts.remove(post)
         like_status = False
     else:
         user.like_posts.add(post)
         like_status = True
     data = {
         'user': UserSerializer(user).data,
         'post': PostSerializer(post).data,
         'result': like_status,
     }
     return Response(data)
Example #24
0
 def post(self, request, format=None):
     data = request.data
     user = authenticate(username=username, password=password)
     if user is not None and user.is_active:
         user.ip_address = request.META.get('REMOTE_ADDR')
         user.save()
         login(request, user)
         serializer = UserSerializer(user, context={'request': request})
         return Response(serializer.data, status=HTTP_200_OK)
     return Response(
         {
             'msg': '用户名或密码错误',
             'code': HTTP_400_BAD_REQUEST,
             'result': 'FAIL'
         },
         status=HTTP_200_OK)
Example #25
0
class PostSerializer(serializers.ModelSerializer):
    """
    Mission 1. - 2017.03.17

        author필드의 값이 pk가 아닌, 하나의 Object(dict)로 나타나도록 수정
        http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

    1. 관련 테스트코드 작성
        post_list, post_create부분
    2. 해당 테스트코드가 작동하도록 PostSerializer를 수정 및 UserSerializer작성
    3. 테스트 및 postman 작동 확인

    Mission 2. - 2017.03.17
      Post에 연결된 PostPhoto를 리스트 내부의 Object형태로 리턴
        'author': {<author object>},
        'postphoto_set': [
            {
                'pk': <PostPhoto pk>,
                'photo': <PostPhoto photo field url>,
            },
            {
                'pk': <PostPhoto pk>,
                'photo': <PostPhoto photo field url>,
            },
        ]

        1. 관련 테스트코드 작성
            post_list, post_create부분
        2. 해당 테스트코드가 작동하도록 PostSerializer를 수정 및 PostPhotoSerializer작성
        3. 테스트 및 포스트맨 작동 확인
        4. postphoto_set의 이름을 photo_list로 변경
            http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

    """

    author = UserSerializer(read_only=True)
    postphoto_set = PostPhotoSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'created_date',
            'postphoto_set',
        )
        read_only_fields = ('created_date', )
Example #26
0
    def get(self, request, *args, **kwargs):
        try:
            talent = Talent.objects.get(pk=kwargs['pk'])
            talent.view_count += 1
            talent.save()
            talent_dict = TalentDetailSerializer(talent).data
            user = request.user
            try:
                user_dict = UserSerializer(user).data
                talent_dict["user"] = user_dict
            except:
                talent_dict["user"] = "******"

            return Response(talent_dict)
        except Talent.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND,
                            data={"detail": "찾을 수 없습니다."})
Example #27
0
class PostSerializer(serializers.ModelSerializer):

    author = UserSerializer(read_only=True)
    my_comment = CommentSerializer(read_only=True)

    class Meta:
        model = Post
        fields = (
            'pk',
            'author',
            'photo',
            'my_comment',
        )
        read_only_fields = (
            'author',
            'my_comment',
        )
Example #28
0
    def post(self, request, *args, **kwargs):
        print(request.data)
        username = request.data['username']
        password = request.data['password']

        user = authenticate(username=username, password=password)
        if user:
            token, is_token_created = Token.objects.get_or_create(user=user)
            data = {
                'token': token.key,
                'user': UserSerializer(user).data,
            }
            return Response(data, status=status.HTTP_200_OK)
        else:
            data = {
                'message': 'Invalid credentials'
            }
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)
Example #29
0
    def post(self, request, *args, **kwargs):
        username = request.data['username']
        password = request.data['password']
        # 전달받은 username, password값으로 authenticate실행
        user = authenticate(
            username=username,
            password=password,
        )
        # user가 존재할 경우 (authenticate성공)
        if user:
            # 'user'키에 다른 dict로 user에 대한 모든 정보를 보내줌
            token, token_created = Token.objects.get_or_create(user=user)
            data = {'token': token.key, 'user': UserSerializer(user).data}
            return Response(data, status=status.HTTP_200_OK)
        # 인증에 실패한 경우

        data = {'message': 'Invalid credentials'}
        return Response(data)
Example #30
0
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    group = GroupSerializer(read_only=True)

    class Meta:
        model = Post
        fields = ('pk', 'author', 'group', 'content', 'image', 'video',
                  'like_count', 'comment_count', 'created_date')
        read_only_fields = (
            'author',
            'group',
            'like_count',
            'comment_count',
        )

    def to_representation(self, obj):
        ret = super().to_representation(obj)
        ret['is_like'] = self.context['request'].user in obj.like_users.all()
        return ret