개발일기

유저 피드백 반영하기(채팅, 마이페이지 업그레이드, 주문취소와 환불처리) 본문

Project Portfolio

유저 피드백 반영하기(채팅, 마이페이지 업그레이드, 주문취소와 환불처리)

츄98 2023. 7. 7. 21:03

- 포인트 통계

  • 원래는 이번달 리워드, 총 포인트 이렇게 되어있었는데, 사용자 중 이해하기 어렵다는 피드백이 있었다.
  • 그래서 이번달 획득포인트, 이용포인트, 현재포인트총액으로 직관적으로 이해할 수 있도록 바꾸었다.


- 채팅

  • 비밀채팅방 기능: 비밀채팅방 기능이 있으면 좋겠다는 평이 있어서 추가했다.
  • make_password을 사용하여 비밀번호 해싱
  • check_password을 사용해 프론트 요청 온 비밀번호와 db에 담긴 해싱된 비밀번호 비교
  • super(): 파이썬에서 부모 클래스의 메소드나 속성을 직접 참조하기 위해 사용하는 내장함수
  • super(ChatRoom, self)는 ChatRoom 클래스의 부모클래스를 의미한다.
  • super(ChatRoom, self).save(*args,**kwargs)는 ChatRoom클래스의 부모클래스인 Model 클래스의 save()메소드를 호출한다. 즉, 코드에서 save() 메소드가 호출되면 먼저 password 필드에 저장된 값을 암호화하고, 부모클래스인 Model 클래스의 save()를 호출하여 해당 ChatRoom 객체를 데이터베이스에 저장한다.
  • 코드중복을 줄이고 상속 구조에 따른 코드의 확장성과 유연성을 제공할 수 있다.
# 모델 
class ChatRoom(CommonModel):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(unique=True, max_length=10, blank=False, null=False)
    desc = models.CharField(max_length=50, blank=False)
    password = models.CharField(max_length=128, null=True, blank=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.name
    
    def save(self, *args, **kwargs):
        if self.password:
            self.password = make_password(self.password)
        super(ChatRoom, self).save(*args, **kwargs)
        
        
 # views.py
 def checkpassword(self, request, room_id, password):
        room = get_object_or_404(ChatRoom, pk=room_id)
        if check_password(password, room.password):
            return Response(status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_403_FORBIDDEN)

 

- 마이페이지 팔로우한 스토어 오류 수정

  • 팔로우한 스토어가 제대로 작동하지 않았고, 페이지네이션도 존재하지 않았다.
  • 페이지네이션 및 오류를 해결하고, css와 모바일 반응형도 추가했다.

 

-  주문취소와 환불처리 구현

  • 원래는 주문취소와 환불처리 기능이 없었다.
  • 유저피드백에서 구현요청이 있어서 추가로 구현을 했다.
  • 주문 상태 카테고리를 추가하여 구현하였다.
def order_point_refund(user: object, total_buy_price: int):
    """환불 포인트 생성"""
    Point.objects.create(user=user, point_type_id=9, point=total_buy_price)
    
def product_amount_restock(product: object, buy_amount: int):
    """환불 시 상품 재고량 복구"""
    product.amount += buy_amount
    product.item_state = 1 # 판매중(1)상태로 변경
    product.save()
    

class StatusChangeView(UpdateAPIView):
    """주문 상태 변경"""
    '''결제대기(1) 주문확인중(2) 배송준비중(3) 발송완료(4) 배송완료(5) 구매확정(6) 주문취소(7) 환불요청중(8) 환불완료(9)'''

    permission_classes = [IsAuthenticated]
    serializer_class = OrderStatusSerializer
    queryset = OrderItem.objects.all()

    def perform_update(self, serializer):
        order_item = self.get_object()
        cur_status = order_item.order_status.id
        new_status = self.request.data.get("order_status")
        # 배송완료(5)상태에서 구매확정(6)이 되었을 때
        if cur_status == 5 and new_status == 6:
            seller = order_item.seller.user
            total_point = order_item.amount * order_item.price
            
            # 유저 포인트 적립 및 판매자 포인트 지급
            order_point_create(self.request.user, seller, total_point)
        
        # 주문취소(7), 환불완료(9) 되었을 때
        if new_status in [7,9] :
            
            # 유저 포인트 환불
            total_point = order_item.amount * order_item.price
            order_point_refund(self.request.user, total_point)
            
            # 상품 수량 복구
            product = get_object_or_404(Product, id=order_item.product_id)
            product_amount_restock(product=product, buy_amount=order_item.amount)
            
        serializer.save()