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
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
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
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
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)
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)
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
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