예제 #1
0
    def validate_password(self, password):
        confirm_password = self.initial_data.get('confirm_password')
        errors = dict()

        if password != confirm_password:
            raise CustomException(detail='비밀번호가 일치하지 않습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # Patch 예외처리
        if self.initial_data.get('username'):
            username = self.initial_data.get('username')
        else:
            username = self.instance.username

        if password.lower() in username.lower() or username.lower(
        ) in password.lower():
            raise CustomException(detail='아이디와 비밀번호는 유사하게 설정할 수 없습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        try:
            validate_password(password=password)
        except ValidationError as e:
            errors['detail'] = list(e.messages)
            raise CustomException(errors,
                                  status_code=status.HTTP_400_BAD_REQUEST)

        return password
예제 #2
0
    def validate(self, attrs):

        if self.initial_data.get('house'):
            house_pk = self.initial_data.get('house')
            house = get_object_or_404(House, pk=house_pk)
            attrs['house'] = house
            # attrs에 'house' 객체를 넣어주면 def update() 에서 기존 'house'를
            # 업데이트 하게 된다.
        else:
            # Patch 예외처리 (1)
            house = self.instance.house

        # 숙박 인원 validation
        if attrs.get('guest_num') and house.personnel < attrs['guest_num']:
            raise CustomException(detail='숙박 허용인원을 초과했습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # 기존 disable_days 찾기
        disabled_days = []
        for i in house.disable_days.all():
            disabled_days.append(i.date)

        # 기존 예약일 찾기
        reserved_days = []
        reservation_instance = house.reservation_set.filter(~Q(
            pk=self.instance.pk))
        # Put / Patch일 경우(2) - 자신의 예약은 예외처리에서 제외

        for i in reservation_instance:
            staying_days = i.check_out_date - i.check_in_date
            reserved_days += [
                i.check_in_date + timedelta(n)
                for n in range(staying_days.days + 1)
            ]

        # 기존 disable_days + 예약일
        disabled_and_reserved_days = disabled_days + reserved_days

        # check_in_date & check_out_date 기본 validation
        check_in_date = attrs.get('check_in_date', self.instance.check_in_date)
        check_out_date = attrs.get('check_out_date',
                                   self.instance.check_out_date)
        if check_in_date > check_out_date or check_in_date == check_out_date:
            raise CustomException(detail='체크인, 체크아웃 날짜를 잘못 선택하셨습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # check_in_date & check_out_date 연관 validation
        for day in disabled_and_reserved_days:
            if day < check_in_date or day > check_out_date:
                pass
            else:
                raise CustomException(detail='예약할 수 없는 날짜를 선택하셨습니다.',
                                      status_code=status.HTTP_400_BAD_REQUEST)

        return attrs
예제 #3
0
    def validate(self, attrs):
        access_token = attrs.get('access_token')
        if access_token:
            user = authenticate(access_token=access_token)
            if not user:
                raise CustomException(detail='페이스북 액세스 토큰이 올바르지 않습니다.',
                                      status_code=status.HTTP_401_UNAUTHORIZED)
        else:
            raise CustomException(detail='페이스북 액세스 토큰이 필요합니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        attrs['user'] = user
        return attrs
예제 #4
0
    def validate_email(self, email):
        # 내 이 메일은 중복검사 하면 안되서 ~Q(username=self.instance) 추가
        if User.objects.filter(~Q(username=self.instance.username),
                               Q(email=email)).exists():
            raise CustomException(detail='이미 존재 하는 메일주소 입니다.',
                                  status_code=status.HTTP_409_CONFLICT)

        return email
예제 #5
0
    def create_image(self, image):
        try:
            Image.open(image).verify()
        except OSError:
            raise CustomException(f'올바른 이미지 파일 형식이 아닙니다. ({image.name})',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        return self.create(image=image)
예제 #6
0
    def get_or_create(self, date):
        try:
            datetime.datetime.strptime(date, '%Y-%m-%d')
        except ValueError:
            raise CustomException(f'올바른 날짜 형식이 아닙니다 ({date})',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        return super().get_or_create(date=date)
예제 #7
0
    def validate_username(self, username):
        # if User.objects.filter(username=username).exists():
        if User.objects.filter(Q(username=username)
                               | Q(email=username)).exists():
            # Facebook으로 가입한 유저가 email 주소를 입력할 경우 위 쿼리문에서 에외처리를 하지 못해서
            # UNIQUE constraint failed: members_user.email 에러가 발생
            raise CustomException(detail='이미 존재하는 메일주소 입니다.',
                                  status_code=status.HTTP_409_CONFLICT)

        return username
예제 #8
0
    def validate(self, attrs):

        if self.initial_data.get('house'):
            house_pk = self.initial_data.get('house')
            house = get_object_or_404(House, pk=house_pk)
            # house instance를 validated_data에 넣어주기
            # (pk로 house 값을 받았기 때문에 이 값을 인스턴스로 바꾸어주어야 한다.)
            attrs['house'] = house
        else:
            # Create 예외처리 (1)
            raise CustomException(detail='house 정보가 입력되지 않았습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # 숙박 인원 validation
        if attrs.get('guest_num') and house.personnel < attrs['guest_num']:
            raise CustomException(detail='숙박 허용인원을 초과했습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # 기존 disable_days 찾기
        disabled_days = []
        for i in house.disable_days.all():
            disabled_days.append(i.date)

        # 기존 예약일 찾기
        reserved_days = []
        reservation_instance = house.reservation_set.all()

        for i in reservation_instance:
            staying_days = i.check_out_date - i.check_in_date
            reserved_days += [
                i.check_in_date + timedelta(n)
                for n in range(staying_days.days + 1)
            ]

        # 기존 disable_days + 예약일
        disabled_and_reserved_days = disabled_days + reserved_days

        # check_in_date & check_out_date 기본 validation
        check_in_date = attrs.get('check_in_date')
        check_out_date = attrs.get('check_out_date')
        # # Reservation create 예외처리 (2)
        if not check_in_date:
            raise CustomException(detail='check-in 정보가 입력되지 않았습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)
        elif not check_out_date:
            raise CustomException(detail='check-out 정보가 입력되지 않았습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        if check_in_date > check_out_date or check_in_date == check_out_date:
            raise CustomException(detail='체크인, 체크아웃 날짜를 잘못 선택하셨습니다.',
                                  status_code=status.HTTP_400_BAD_REQUEST)

        # check_in_date & check_out_date 연관 validation
        for day in disabled_and_reserved_days:
            if day < check_in_date or day > check_out_date:
                pass
            else:
                raise CustomException(detail='예약할 수 없는 날짜를 선택하셨습니다.',
                                      status_code=status.HTTP_400_BAD_REQUEST)

        return attrs