def post(self, request, *args, **kwargs):
        """
            신규 사용자의 email 과 password 를 받아.
            새로운 Profile 을 만들어준다.
            {
                "profile": {
                    "email": "*****@*****.**",
                    "password": "******"
                }
            }
            email 전송 성공 -> 잘 되었다고 응답.
            email 전송 실패 -> 만든 profile 삭제.
        """

        data = request.data.get('profile')
        if not data:
            raise GlobalErrorMessage("profile 파라미터가 없습니다.")

        signup_serializer = SignUpSerializer(data=data)
        if signup_serializer.is_valid():
            profile = signup_serializer.save()
        else:
            raise GlobalErrorMessage(str(signup_serializer.errors))

        email_result = send_email_for_active(profile, request)

        if email_result:
            return Response({
                'response': 'success',
                'message': '이메일을 전송하였습니다.'
            })
        profile.delete()
        raise GlobalErrorMessage("이메일을 전송에 실패하였습니다.")
    def post(self, request):
        """
            today_post_id : 오늘 작성한 포스트 id 반환
                * 오늘 작성한 일기가 있는 경우 : 해당 id
                * 오늘 작성한 일기가 없는 경우 : -1
        """
        # 계정 활성화 check
        email = request.data.get('email', '')
        try:
            profile = Profile.objects.get(email=email)
            if not profile.is_active:
                raise GlobalErrorMessage(
                    '활성화 되지 않은 계정입니다. 메일을 확인하고, 본인인증을 해주세요.')
        except Profile.DoesNotExist:
            raise GlobalErrorMessage('유효하지않은 계정입니다.')

        # jwt token get
        response = super().post(request, content_type='application/json')
        if response.status_code != 200:
            raise GlobalErrorMessage('JWT token 생성에 실패하였습니다.')

        # 처음 로그인일 경우
        if profile.last_login is None:
            UserQuestion.objects.create(profile=profile)
            UserCoin.objects.create(profile=profile)
        if str(profile.last_login).split()[0] < str(date.today()):
            downgrade_jorang_status(profile)

        # 조랭이 check
        try:
            jorang = Jorang.objects.get(profile=profile)
            has_jorang = True
            jorang_nickname = jorang.nickname
            jorang_items = JorangSerializer(jorang).data.get("items")
        except Jorang.DoesNotExist:
            has_jorang = False
            jorang_nickname = None
            jorang_items = None

        update_last_login(None, profile)
        today_post_id = get_id_of_today_post(profile)

        return Response({
            'response': 'success',
            'message': {
                'token': response.data['token'],
                'profile_id': profile.id,
                'has_jorang': has_jorang,
                'jorang': {
                    'nickname': jorang_nickname,
                    'items': jorang_items
                },
                'today_post_id': today_post_id
            }
        })
    def post(self, request, profile_id):
        """
        조랭이의 상세 정보, nickname 과 title 을 input 으로 받아
        그것을 저장하고, 그 값을 돌려보내준다.
        """
        # 본인의 정보만 가져와야 한다.
        if int(request.user.pk) != int(profile_id):
            raise GlobalErrorMessage('본인의 정보를 들고 오는 것이 아닙니다.')

        profile = self.get_object(profile_id)
        user_coin = UserCoin.objects.get(profile=profile.id)

        try:
            post = Post.objects.get(
                profile=profile.id, created_at=user_coin.last_date)
            continuity = post.continuity
        except Post.DoesNotExist:
            continuity = 0

        nickname = request.data.get('nickname')
        title = request.data.get('title')

        try:
            jorang = Jorang.objects.get(profile=profile.id)
            jorang_serializer = JorangSerializer(jorang)
        except Jorang.DoesNotExist:
            raise GlobalErrorMessage('해당 유저는 조랭이를 만들지 않았습니다. 조랭이를 만들어 주세요.')

        jorang.nickname = nickname
        jorang.title = title
        jorang.save()

        return Response({
            'response': 'success',
            'message': {
                'email': profile.email,
                'title': jorang.title,
                'jorang_nickname': jorang.nickname,
                'jorang_items': jorang_serializer.data.get('items'),
                'jorang_status': jorang.status,
                'user_continuity': continuity,
                'user_coin': user_coin.coin
            }
        })
Esempio n. 4
0
def upgrade_jorang_status(profile):
    try:
        jorang = Jorang.objects.get(profile=profile)
        if jorang.status == 0:
            jorang.status = 1
        elif jorang.status == 1:
            jorang.status = 2
        jorang.save()
        return jorang.status
    except Jorang.DoesNotExist:
        raise GlobalErrorMessage("유저에게 조랭이가 없습니다!!")
Esempio n. 5
0
def create(request):
    """
        우리의 마스코트 조랭이
        조랭이의 경우, 생성될 때, 유저와 1:1 [OneToOneField] 로 mapping 이 되기 떄문에
        유저(Profile) 당 딱 한번 밖에 생성이 되지 않는다.
        그렇기에 유의를 할 필요가 있다.
        {
            "nickname": "산림수"
        }

        1. Jorang 생성
            -> 조랭이는 profile 당 하나만 생성을 할 수 있다.
        2. UserItem 과 Jorang 의 color 를 의미하는 Item 과 매칭.
            -> Item 에 jorang_color 라는 item 객체들이 있고,
            이를 UserItem 을 통해서, User 가 구입한 Item 으로 하나 만들어 주는 것이다.(스타트 보너스)
            -> 만약 아이템이 존재 하지 않을 경우, 조랭이 생성에 실패한다. 미리미리 상점에 Upload 하자.

    """
    try:
        nickname = request.data['nickname']
    except KeyError:
        raise GlobalErrorMessage('request body 의 파라미터가 잘못되었습니다.')

    profile = request.user

    if is_jorang_exist(profile_pk=profile.pk):
        raise GlobalErrorMessage('이미 조랭이를 가지고 있는 계정입니다.')

    color, background = add_jorang_default_items(profile)

    user_jorang = Jorang.objects.create(
        nickname=nickname,
        profile=profile
    )
    user_jorang.items.add(color)
    user_jorang.items.add(background)

    return Response({
        'response': 'success',
        'message': 'Jorang이 성공적으로 생성되었습니다.'
    })
    def get(self, request, profile_id):
        """
        profile_id 에 해당하는 profile 객체에 대하여,
        profile, user_coin, user_continuity, jorang 에 관한 정보들을 넘겨준다.

        TODO: orm 개선
        TODO: permission denined 를 custom 해서 할 수 있게 해야한다.
        """
        # 본인의 정보만 가져와야 한다.
        if int(request.user.pk) != int(profile_id):
            raise GlobalErrorMessage('본인의 정보를 들고 오는 것이 아닙니다.')

        profile = self.get_object(profile_id)

        try:
            jorang = Jorang.objects.get(profile=profile.id)
            jorang_serializer = JorangSerializer(jorang)
        except Jorang.DoesNotExist:
            raise GlobalErrorMessage('해당 유저는 조랭이를 만들지 않았습니다. 조랭이를 만들어 주세요.')

        user_coin = UserCoin.objects.get(profile=profile.id)

        try:
            post = Post.objects.get(
                profile=profile.id, created_at=user_coin.last_date)
            continuity = post.continuity
        except Post.DoesNotExist:
            continuity = 0

        return Response({
            'response': 'success',
            'message': {
                'email': profile.email,
                'title': jorang.title,
                'jorang_nickname': jorang.nickname,
                'jorang_items': jorang_serializer.data.get('items'),
                'jorang_status': jorang.status,
                'user_continuity': continuity,
                'user_coin': user_coin.coin
            }
        })
Esempio n. 7
0
    def delete(self, request, pk, format=None):
        post = self.get_object(pk)
        email = request.user.email
        profile = Profile.objects.get(email=email)
        user_coin = UserCoin.objects.get(profile=profile.id)

        if post.created_at == user_coin.last_date:
            raise GlobalErrorMessage("마지막 기록은 지울 수 없습니다.")
        post.delete()
        return Response({
            'response': 'success',
            'message': '기록을 삭제하였습니다.'
        }, status=status.HTTP_204_NO_CONTENT)
Esempio n. 8
0
def user_buy_item(request):
    """
        Item 에 pk를 통해서 접근을 하여 해당 Item 을 돌려준다.
    """

    try:
        item_pk = int(request.data["item"])
    except KeyError:
        raise GlobalErrorMessage('item : pk 가 존재 하지 않습니다.')

    except ValueError:
        raise GlobalErrorMessage('pk에 숫자가 들어 있지 않습니다.')

    try:
        item = Item.objects.get(pk=item_pk)
    except Item.DoesNotExist:
        raise GlobalErrorMessage('pk 에 해당하는 Item 이 없습니다.')

    price = item.item_price
    user_coin = UserCoin.objects.get(profile=request.user.pk)

    if user_coin.coin >= price:
        request.data['profile'] = request.user.pk
        serializer = UserItemSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            user_coin.coin -= price
            user_coin.save()
            return Response({
                "response": "success",
                "coin": user_coin.coin,
                "message": "아이템을 성공적으로 구매했습니다."
            })
        raise GlobalErrorMessage(str(serializer.errors))

    raise GlobalErrorMessage("코인이 부족합니다.")
Esempio n. 9
0
def downgrade_jorang_status(profile):
    if profile.post.last() is None:
        return 
        # raise GlobalErrorMessage("유저에게 작성된 일기가 없습니다!!")

    last_post_date = profile.post.last().created_at
    timedelta_last_post_and_today = date.today() - last_post_date

    if timedelta_last_post_and_today > timedelta(days=5):
        try:
            jorang = Jorang.objects.get(profile=profile)
            if int(jorang.status) > 0:
                jorang.status = str(int(jorang.status) - 1)
                jorang.save()
        except Jorang.DoesNotExist:
            raise GlobalErrorMessage("유저에게 조랭이가 없습니다!!")
def get_question_of_user_question(profile_pk):
    try:
        return UserQuestion.objects.get(profile=profile_pk).question
    except UserQuestion.DoesNotExist:
        raise GlobalErrorMessage("유저에게 오늘의 질문을 할당을 해주세요.")