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 } })
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("유저에게 조랭이가 없습니다!!")
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 } })
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)
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("코인이 부족합니다.")
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("유저에게 오늘의 질문을 할당을 해주세요.")