diff --git a/Dockerfile b/Dockerfile index 04f9205..07fd692 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,18 +6,9 @@ ENV TZ=Asia/Seoul # Copy requirements.txt COPY requirements.txt ${LAMBDA_TASK_ROOT} -#Set aws credentials -ARG AWS_REGION_NAME -ENV AWS_REGION_NAME=$AWS_REGION_NAME - -ARG AWS_ACCESS_KEY_ID -ENV AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID - -ARG AWS_SECRET_ACCESS_KEY -ENV AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY - #Copy code COPY *.py ${LAMBDA_TASK_ROOT} +COPY .env ${LAMBDA_TASK_ROOT} # Install the specified packages RUN pip install -r requirements.txt diff --git a/api.py b/api.py new file mode 100644 index 0000000..4dd72ed --- /dev/null +++ b/api.py @@ -0,0 +1,98 @@ +from functools import wraps +import json +import typing + + +import aiohttp +from aiohttp_retry import RetryClient, ExponentialRetry + +from env import * + + +def create_retry_client(func) -> typing.Callable: + """ + 연결에 문제가 발생했을 경우 재시도를 시도할 수 있게 하는 기능을 + 세션에 추가합니다. + + Args: + session (aiohttp.ClientSession): 세션 + + Returns: + RetryClient: 재시도가 가능한 세션 래핑 객체 + """ + + @wraps(func) + async def wrapper(*args, **kwargs) -> RetryClient: + session: aiohttp.ClientSession = await func(*args, **kwargs) + retry_options = ExponentialRetry( + attempts=3, statuses={400, 401, 403, 404, 408, 429} + ) # 리퀘스트가 너무 많은 경우, 연결 시간이 너무 긴 경우 + # 명확하게 해당 코드가 전달된 경우만 재시도 + retry_client = RetryClient( + raise_for_status=True, retry_options=retry_options, client_session=session + ) + return retry_client + + return wrapper + + +async def read_response(response: aiohttp.ClientResponse) -> dict: + try: + data = await response.json() + + except aiohttp.ContentTypeError: + data = json.loads(await response.text()) + + is_success = data.get("success") # 도서관 api의 자체 응답 코드 + if is_success: # 예약 데이터가 존재하는 경우 + return data + else: + raise AssertionError("Token expired") + + +@create_retry_client +async def create_logined_session( + student_id: str, usaint_secret: str, token: str +) -> aiohttp.ClientSession: + """ + 로그인을 진행하고 인증 토큰을 발급합니다. + + Returns: + str: 인증 토큰 값 + """ + + session = aiohttp.ClientSession( + base_url="https://oasis.ssu.ac.kr", + timeout=aiohttp.ClientTimeout(total=5), + raise_for_status=True, + ) + + login_url = "/pyxis-api/api/login" # 로그인 api + payload = { + "loginId": student_id, + "password": usaint_secret, + "isFamilyLogin": False, + "isMobile": False, + } + + if not token: + async with session.post(login_url, json=payload) as response: + data = await read_response(response) + token = data["data"]["accessToken"] + + headers = { + "Accept": "application/json", + "pyxis-auth-token": token, + } + + session.headers.update(headers) + return session + + +async def call_reservation_api( + session: RetryClient, room_type_id: int, date: str +) -> dict: + url = f"/pyxis-api/1/api/rooms?roomTypeId={room_type_id}&smufMethodCode=PC&hopeDate={date}" + async with session.get(url) as response: + data = await read_response(response) + return data diff --git a/cache/cache_getter.py b/cache/cache_getter.py new file mode 100644 index 0000000..e237b3a --- /dev/null +++ b/cache/cache_getter.py @@ -0,0 +1,39 @@ +import json +import redis +import traceback + + +def create_response(status_code: str | int, cache: str | bytes) -> dict: + response = dict( + { + "isBase64Encoded": False, + "headers": {"Content-Type": "application/json"}, + "statusCode": status_code, + "body": cache, + }, + ) + return response + + +def lambda_handler(event: dict, context: dict): + try: + rd = redis.Redis( + # host="ssudobi-cache-001.96ug1w.0001.apn2.cache.amazonaws.com", + host="localhost", + port=6379, + socket_timeout=3, + ) + room_type_id = event["pathParameters"].get("room_type_id", "1") + cache = rd.get(room_type_id) # set data to redis + response = create_response(200, cache) + + except Exception as e: + response = create_response(500, str(e)) + print(traceback.format_exc()) + + finally: + return response + + +if __name__ == "__main__": + print(lambda_handler({"pathParameters": {"room_type_id": "1"}}, {})) diff --git a/cache/cache_refresher.py b/cache/cache_refresher.py new file mode 100644 index 0000000..53bb1f2 --- /dev/null +++ b/cache/cache_refresher.py @@ -0,0 +1,67 @@ +import redis +import boto3 +import json +import traceback + + +def invoke_function(function_name: str, payload: dict | str): + """ + Invokes the specified function and returns the result. + """ + client = boto3.client("lambda") + response = client.invoke(FunctionName=function_name, Payload=json.dumps(payload)) + return response + + +def get_payload(response) -> dict | None: + try: + payload = json.loads(response["Payload"].read().decode("utf-8")) + status_code = payload.pop("statusCode") + assert status_code == 200 + return payload + + except AssertionError as e: + print("Error occured in request: ", str(e)) + raise e + + +def create_response(status_code: str | int, msg: str) -> dict: + response = { + "isBase64Encoded": False, + "headers": {"Content-Type": "application/json"}, + "statusCode": status_code, + "body": msg, + } + return response + + +def lambda_handler(event: dict, context: dict): + try: + rd = redis.Redis( + host="ssudobi-cache-001.96ug1w.0001.apn2.cache.amazonaws.com", + port=6379, + socket_timeout=3, + ) + + for room_type_id in (1, 5): + response = invoke_function("cache", {"room_type_id": room_type_id}) + if payload := get_payload(response): + rd.set( + str(room_type_id), json.dumps(payload) + ) # set data to redis, room_type_id is key + + response = create_response( + 200, + "Cache Success", + ) + + except Exception as e: + response = create_response(500, str(e)) + print(traceback.format_exc()) + + finally: + return response + + +# if __name__ == "__main__": +# lambda_handler({}, {}) diff --git a/caching.py b/caching.py index 5f7eb93..1ed6dfb 100644 --- a/caching.py +++ b/caching.py @@ -1,163 +1,222 @@ import asyncio -import datetime as dt - -from datetime import datetime -from functools import partial +from dataclasses import dataclass, field, asdict +import datetime from aiohttp_retry import RetryClient +from api import create_logined_session, call_reservation_api -async def call_api(retry_client: RetryClient, date: str, room_number: int) -> dict: - """ - 특정 날짜의 특정 세미나실의 예약현황을 조회 api를 호출해 결과를 반환한다. - Args: - date (str): 조회할 날짜 2023-08-20 - room_number (int): 룸 번호(1 ~ 8) 개방형 (18, 21 ~ 26) - Return: - dict: 예약 현황 응답 객체 - """ - status_url = f"https://oasis.ssu.ac.kr/smufu-api/api/pc/rooms/{room_number}/reservations?date={date}" - async with retry_client.get(status_url) as resp: - json_data = await resp.json(content_type=None) # 응답 바이트를 읽음 +HOLIDAY = 5 +SEMINA_ROOMS = (1, 2, 3, 4, 5, 6, 7, 9) +OPEN_SEMINA_ROOMS = (18, 21, 22, 23, 24, 25, 26) - return json_data +@dataclass +class DateReservations: + # 예약 정보 저장을 위한 클래스 + def init_room_number(self): + if self.room_type_id == 1: + return SEMINA_ROOMS + elif self.room_type_id == 5: + return OPEN_SEMINA_ROOMS + else: + raise ValueError( + "Room type id is wrong 1 for semina room 5 for open semina room" + ) -def parse_resravtion_status(res: dict) -> list | None: - """ - json 데이터를 파싱해 시간대 별 예약 가능 여부를 갖고 있는 불리언 딕셔너리를 생성합니다. + room_type_id: int + date: str + is_open: bool = True + data: dict[int, list[tuple]] = field(default_factory=dict) - Args: - time_table (dict): 예약 가능 시간 테이블 - res (requests.Response): 예약 조회 api 응답 결과 + def __post_init__(self): # 값 초기화 + self.data = { + x: [] for x in self.init_room_number() + } # 룸 타입에 맞게 방 번호 초기화 - Returns: - dict: True인 경우 해당 시간대에 예약 가능을 의미하고 False인 경우 예약 불가능을 의미합니다. - ex) {10: True, 11: True, 12: True, 13: True, 14: True, 15: True, 16: True, 17: True, 18: True} - """ - str_to_datetime = lambda x: datetime.strptime( - x, "%Y-%m-%d %H:%M:%S" - ) # str -> datetime으로 - code = res.get("code", "") # 도서관 api의 자체 응답 코드 +def parse_reserved_times( + room_time_lines: list, +) -> list[tuple]: + begin_hour = None # 예약 시작 시간 + reserved_times = [] + for time_line in room_time_lines: + minutes: list[dict] = time_line["minutes"] + hour = time_line["hour"] + is_reserved = ( + True + if minutes[0]["class"] + else False # 첫번째 시간대만 파악하면 예약 여부를 확인 할 수 있다. + ) # 예약 여부 확인 - if res.get("success") == False: # 요청이 실패한 경우 - raise ValueError(code) + if is_reserved: # 현재 예약이 이미 차있는 경우 + if begin_hour is None: + begin_hour = hour # 예약 시작 시간 - if code == "success.retrieved": # 예약이 존재하는 경우 - reservation_list = res["data"]["list"] - reserved_times = [] + elif begin_hour is not None: # 0시인 경우도 존재 + reserved_times.append((begin_hour, hour)) + begin_hour = None - now = datetime.now() # 현재 시간 - for rsv in reservation_list: - begin_time = str_to_datetime(rsv["beginTime"]) # 예약 시작시간 - end_time = str_to_datetime(rsv["endTime"]) # 예약 종료시간 + if begin_hour and begin_hour != hour: # 추가적으로 더 반영할 예약이 존재하는 경우 + reserved_times.append((begin_hour, hour)) - start_hour = ( - begin_time.hour if begin_time >= now else now.hour - ) # 예약일이 오늘일 경우 현재 시간을 기준으로 한다 + return reserved_times - reserved_times.append((start_hour, end_time.hour)) # 예약이 차있는 시간대 추출 - return reserved_times +def parse_resravtions(room_type_id: int, date: str, response: dict) -> DateReservations: + """ + json 데이터를 파싱해 방 별로 예약이 존재하는 시간 들을 반환합니다. + (10,13) => 10 ~ 13시까지 예약이 존재 -async def get_reservation_status( - retry_client: RetryClient, date: str, room_number: int -) -> list | None: + Args: + room_type_id (int): 룸 타입 + response(dict): 예약 현황 정보 + + """ + + room_reservations: list = response["data"]["list"] # 예약 정보 + date_reservations = DateReservations(room_type_id=room_type_id, date=date) + hope_date = room_reservations[0].get("hopeDate") # 예약 희망 일 + + if hope_date: + for room in room_reservations: + is_chargeable: bool = room["isChargeable"] # 예약 가능 여부 + if not is_chargeable: + continue + room_id: int = room["id"] + room_time_lines: list = room["timeLine"] + reserved_times: list[tuple] = parse_reserved_times(room_time_lines) + date_reservations.data[room_id] = reserved_times + else: + date_reservations.is_open = False + + return date_reservations + + +async def get_date_reservations( + session: RetryClient, + room_type_id: int, + date: str, +) -> DateReservations | None: """ - 해당일의 세미나실 예약 현황을 반환한다 + 특정 세미나실의 1일간 예약 정보를 반환한다. Args: - sess (RetryClient): 세션 - date (str): 날짜 - room_number (int): 방 번호 + session (RetryClient): 세션 + room_type_id (int): 룸 타입 번호 + date (str): 일자 + + Raises: + ValueError: 리퀘스트가 잘못 요청된 경우 + TypeError: 리스폰스가 잘못 온 경우 + KeyError: 파싱이 잘못된 경우 Returns: - dict: 예약현황 + DateReservations | None: 예약 정보 """ try: - response: dict = await call_api(retry_client, date, room_number) # api 호출 값 - reservation_status: list | None = parse_resravtion_status(response) # 예약 정보 추출 - return reservation_status + response = await call_reservation_api(session, room_type_id, date) + date_reservations = parse_resravtions(room_type_id, date, response) + return date_reservations + + except AssertionError as e: + raise AssertionError( + f"Bad token in response date:{date} room_type:{room_type_id} {str(e)}" + ) - except asyncio.CancelledError: - print(f">> Canceled date:{date} room_number:{room_number}") # 실행중 에러가 발생한 경우 + except KeyError as e: + raise KeyError( + f"Bad key in parse response date:{date} room_type:{room_type_id} {str(e)}" + ) -async def get_all_rooms_reservation_status( - retry_client: RetryClient, date: str -) -> dict: +def create_results( + reservations: list[DateReservations | BaseException], +) -> list[dict]: """ - 주어진 날짜에 해당하는 모든 세미나실의 예약 정보를 반환한다. + 예약 정보에서 예외를 제거하고 필요한 결과만 반환한다. + 이후 날짜를 키로 하는 딕셔너리 형태의 데이터로 변환해 전송한다. Args: - date (str): 조회할 날짜 + reservations (list[DateReservations | BaseException]): 예약 정보 Returns: - list[dict]:하루 동안 모든 세미나실의 예약 현황 리스트 + dict: 날짜 별 예약 데이터 """ - semina_room_numbers = [1, 2, 3, 4, 5, 6, 7, 9] - opend_room_numbers = [18, 21, 22, 23, 24, 25, 26] - all_room_numbers = semina_room_numbers + opend_room_numbers - reservations_in_day = {} # 하루동안의 총 예약 - - def update_res(task: asyncio.Task, room_number: int): - reservations_in_day[room_number] = task.result() # task의 실행 결과를 기록한다 - - tasks = [] # 비동기로 처리할 테스크 집합 - for i in all_room_numbers: - task = asyncio.create_task( - get_reservation_status(retry_client, date, i) - ) # task 생성 - call_back = partial(update_res, room_number=i) # 결과 기록을 위한 call back - task.add_done_callback(call_back) # 콜백 등록 - tasks.append(task) - - await asyncio.gather(*tasks, return_exceptions=False) # 등록된 테스크 비동기 실행 - return reservations_in_day + results = [] + for reserv in reservations: + if isinstance(reserv, DateReservations): + results.append(asdict(reserv)) + return results -async def get_all_days_reservation_status(retry_client: RetryClient) -> dict: +async def get_all_date_reservations( + session: RetryClient, room_type_id: int +) -> list[dict]: """ 모든 날짜와 모든 세미나 실의 예약 현황을 조회해 현재의 예약 현황을 반환 합니다. 예약 조회는 예약 가능일 기준 14일을 조회하며 이후는 조회를 하여도 예약이 불가하기 때문에 조회하지 않습니다. - 사용 가능일은 기준으로 하기 때문에 주말과 공휴일은 포함되지 않습니다. + 사용 가능일은 기준으로 하기 때문에 휴관일과 공휴일은 포함되지 않습니다. #TODO 공휴일 지원안됨 Args: - retry_client (RetryClient): 세션 객체 + session (RetryClient): 세션 객체 + room_type_id (int): 룸 타입 번호 + Returns: dict: 모든 날짜 모든 세미나 실의 예약 현황 객체를 반환 합니다. """ - now_date = datetime.today() - MAX_RESERVATION_DAY = 14 # 최대 예약 가능 시점은 현재부터 14일 뒤까지 + now_date = datetime.datetime.today() + + if room_type_id == 1: + max_resvation_range = 15 # 최대 예약 가능 시점은 오늘부터 14일 뒤까지 + + elif room_type_id == 5: + max_resvation_range = 6 # 개방형인 경우에는 오늘부터 5일 + available_day_count = 0 # 사용 가능 일수 - day_diff = iter(range(30)) # 최대 일자 탐색 범위 - result = {} - while available_day_count < MAX_RESERVATION_DAY: # 사용 가능일이 14일을 넘으면 종료 - current_date = now_date + dt.timedelta(days=next(day_diff)) # 하루 씩 이동 + + # 주말이나 공휴일 등이 탐색 범위에 포함될 수 있다. + # 예약 가능 14일, 5일을 찾기 위해선 좀 더 탐색할 필요가 존재한다. + day_diff = iter(range(max_resvation_range + 10)) # 최대 일자 탐색 범위 + tasks = [] + + while available_day_count < max_resvation_range: # 사용 가능일이 14일을 넘으면 종료 + current_date = now_date + datetime.timedelta( + days=next(day_diff) + ) # 하루 씩 이동 day = current_date.weekday() # 요일 추출 - if day > 5: # 토:5 일:6 방학에는 주말 양일 이용이 불가하고 학기 중에는 일요일만 예약이 불가하다. + if ( + day > HOLIDAY + ): # 토:5 일:6 방학에는 주말 양일 이용이 불가하고 학기 중에는 일요일만 예약이 불가하다. continue current_date_str = current_date.strftime("%Y-%m-%d") - all_reservation_status = await get_all_rooms_reservation_status( - retry_client, current_date_str # 오늘 날짜 - ) # 모든 예약 현황 - - result[current_date_str] = all_reservation_status + task = asyncio.create_task( + get_date_reservations(session, room_type_id, current_date_str) + ) + tasks.append(task) available_day_count += 1 - return result + results = create_results(await asyncio.gather(*tasks)) + + return results -async def get_cache_data(retry_client: RetryClient): - # date = "2023-08-28" # 조회 날짜 - # room_number = 1 - async with retry_client: - # res = await get_reservation_status(retry_client, date, room_number) - # res = await get_all_rooms_reservation_status(retry_client, date) - res = await get_all_days_reservation_status(retry_client) +# 테스트 용 +from env import * + + +async def get_cache_data(): + # date = "2024-04-18" # 조회 날짜 + room_type_id = 5 + session = await create_logined_session(STUDENT_ID, USAINT_SECRET, []) + res = await get_all_date_reservations(session, room_type_id) + await session.close() return res + + +if __name__ == "__main__": + print(asyncio.run(get_cache_data())) diff --git a/env.py b/env.py new file mode 100644 index 0000000..71b51c1 --- /dev/null +++ b/env.py @@ -0,0 +1,13 @@ +from dotenv import load_dotenv +import os + +# load .env +load_dotenv() + +AWS_REGION_NAME = os.environ["AWS_REGION_NAME"] +AWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"] +AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"] +CACHE_BUCKET = os.environ["CACHE_BUCKET"] + +STUDENT_ID = os.environ["STUDENT_ID"] +USAINT_SECRET = os.environ["USAINT_SECRET"] diff --git a/lambda_function.py b/lambda_function.py index 1366d62..f918345 100644 --- a/lambda_function.py +++ b/lambda_function.py @@ -1,45 +1,53 @@ import asyncio -import json +from contextlib import suppress +import datetime +import traceback -import boto3 -import json -from caching import get_cache_data -from login_session import * +from env import * +from api import create_logined_session +from caching import get_all_date_reservations -async def update_cache(student_id: str, password: str) -> dict: +token = "" + + +async def update_cache(room_type_id: int) -> list[dict] | None: """ - 캐싱 로직을 전부 실행해 현재 예약 현황을 반환 합니다. + 람다를 따뜻하게 유지해 세션을 최대한 재활용 합니다. + 세션이 만료된 경우에만 로그인을 재시도 합니다. + 이후 해당 세션을 활용해 캐싱 로직을 수행합니다. Args: - student_number (str): 학번 - student_name (str): 이름 + room_type_id (str): 방 번호 Returns: dict: """ - session = await get_logined_session(student_id, password) # 로그인 세션 생성 - retry_client = await create_retry_client(session) # 세션에 retry 기능 추가 - cache_data = await get_cache_data(retry_client) # 예약 현황 추출 - await retry_client.close() - - return cache_data - - -def put_cache_s3(cache: dict): - s3 = boto3.client("s3") - s3.put_object( - Bucket="ssudobi-cache", Key="cache", Body=json.dumps(cache) - ) # 캐시 업데이트 - - -def create_response(status_code: str | int, msg: str) -> dict: + global token + + for _ in range(3): + session = await create_logined_session(STUDENT_ID, USAINT_SECRET, token) + async with session: + try: + with suppress(TimeoutError): # 타임아웃인 경우 그냥 다시 진행 + cache_data: list[dict] = await get_all_date_reservations( + session, room_type_id + ) # 예약 현황 추출 + token = session._client.headers["pyxis-auth-token"] # 기존 토큰 재활용 + return cache_data + + except AssertionError: # 인증 오류가 발생한 경우 + token = None # 토큰 리셋 + + +def create_cache(status_code: str | int, body) -> dict: + now = datetime.datetime.now() + last_cached_time = datetime.datetime.strftime(now, "%Y-%m-%d %H:%M:%S") response = { - "isBase64Encoded": False, - "headers": {"Content-Type": "application/json"}, "statusCode": status_code, - "body": msg, + "last_cached_time": last_cached_time, + "body": body, } return response @@ -55,21 +63,25 @@ def handler(event: dict, context: dict) -> dict: Returns: dict: 람다 함수 실행 결과 값 """ - response = create_response(200, "empty") - try: - body = json.loads(event["body"]) - student_id = body["student_id"] - password = body["password"] - res = asyncio.run(update_cache(student_id, password)) # 예약 현황 조회 - put_cache_s3(res) - response = create_response(200, json.dumps({"data": res})) + room_type_id = event.get("room_type_id") + assert room_type_id, "Room type id is missing" + res = asyncio.run(update_cache(int(room_type_id))) # 예약 현황 조회 - except AssertionError as e: - response = create_response(401, json.dumps({"data": str(e)})) + if res: + response = create_cache(200, res) except Exception as e: - response = create_response(500, json.dumps({"data": str(e)})) + response = create_cache(500, str(e)) + print(f"error: {traceback.format_exc()}") finally: return response + + +if __name__ == "__main__": + res = asyncio.run(update_cache(5)) # 예약 현황 조회 + print(res) + # token = "ofvmjhurg9afr8j2sh5lsb035u0kdms8" + # res = asyncio.run(update_cache(1)) # 예약 현황 조회 + # print(token) diff --git a/login_session.py b/login_session.py deleted file mode 100644 index 1d5da91..0000000 --- a/login_session.py +++ /dev/null @@ -1,50 +0,0 @@ -import aiohttp -from aiohttp_retry import RetryClient, ExponentialRetry - - -async def create_retry_client(session: aiohttp.ClientSession) -> RetryClient: - """ - 연결에 문제가 발생했을 경우 재시도를 시도할 수 있게 하는 기능을 - 세션에 추가합니다. - - Args: - session (aiohttp.ClientSession): 세션 - - Returns: - RetryClient: 재시도가 가능한 세션 래핑 객체 - """ - retry_options = ExponentialRetry( - attempts=3, statuses={401, 403, 404, 408, 429} - ) # 리퀘스트가 너무 많은 경우, 연결 시간이 너무 긴 경우 - retry_client = RetryClient( - raise_for_status=True, retry_options=retry_options, client_session=session - ) - return retry_client - - -async def get_logined_session(usaint_id: str, password: str) -> aiohttp.ClientSession: - """ - 로그인을 진행하고 인증 토큰을 발급합니다. - - Returns: - str: 인증 토큰 값 - """ - session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) - try: - login_url = "https://oasis.ssu.ac.kr/pyxis-api/api/login" # 로그인 api - data = {"loginId": usaint_id, "password": password} - async with session.post(login_url, json=data) as resp: - json_res = await resp.json() # 토큰 추출 - - assert json_res["code"] == "success.loggedIn", "Login Failed" # 로그인 검증 - - headers = { - "Accept": "application/json, text/plain, */*", - "pyxis-auth-token": json_res["data"]["accessToken"], - } - session.headers.update(headers) - return session - - except AssertionError as e: - await session.close() - raise e diff --git a/test/cache_test.py b/test/cache_test.py new file mode 100644 index 0000000..2e1d48d --- /dev/null +++ b/test/cache_test.py @@ -0,0 +1,75 @@ +import time + +import pytest +import requests + +from api import create_logined_session +from case import CASEDICT, SUCCESSICT +from caching import get_date_reservations, parse_resravtions +from env import * +from logger_ import logger + + +ERROR_CODES = (401, 500) + + +class TestParser: + async def run(self, room_type_id: int, date: str): + session = await create_logined_session(STUDENT_ID, USAINT_SECRET, []) + res = await get_date_reservations(session, room_type_id, date) + return res + + @pytest.mark.parametrize( + "room_type_id, date", + [ + (1, "2024-04-26"), + (5, "2024-04-26"), + (1, "2024-04-27"), + (5, "2024-04-27"), + (1, "2024-04-29"), + (5, "2024-04-29"), + ], + ) # (룸 타입, 날짜) + def test_parse(self, room_type_id: int, date: str): + response: dict = CASEDICT[date][room_type_id] + success_case: dict = SUCCESSICT[date][room_type_id] + res = parse_resravtions(room_type_id, date, response) + parsed_data = res.data + assert parsed_data == success_case, "Result mismatched!" + + +class TestDocker: + # URL 및 데이터 설정 + base_url = "http://localhost:9000/2015-03-31/functions/function/invocations" + + # POST 요청을 테스트하는 기능 + def send_post_request(self, url, data): + response = requests.post(url, json=data) + return response + + # 각 시간 단위에 대한 테스트 + @pytest.mark.parametrize( + "duration, interval", [(1, 5), (5, 5), (10, 5)] + ) # (분, 초) + def test_periodic_requests(self, duration, interval): + total_duration = duration * 60 # 분을 초로 변환 + end_time = time.time() + total_duration + error_cnt = 0 + room_types = ("1", "5") + while time.time() < end_time: + try: + payload = {"room_type_id": room_types[(int(time.time()) % 2)]} + response = self.send_post_request(self.base_url, payload) + status_code = response.json()["statusCode"] + assert status_code not in ERROR_CODES, "Bad Reqeust" + logger.info(f"Success: {response.text}") + time.sleep(interval) + + except Exception as e: + logger.error(f"{str(e)}, payload {payload}") + error_cnt += 1 + + assert error_cnt == 0, "ERROR OCCURED!" + + +# class TestLambda: diff --git a/test/case.py b/test/case.py new file mode 100644 index 0000000..8d6b468 --- /dev/null +++ b/test/case.py @@ -0,0 +1,7775 @@ +CASE04261 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 8, + "list": [ + { + "id": 1, + "name": "세미나룸1", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 2, + "name": "세미나룸2", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 4, + "quota": "3 ~ 4", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 3, + "name": "세미나룸3", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 4, + "name": "세미나룸4", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 5, + "quota": "3 ~ 5", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 5, + "name": "세미나룸5", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 6, + "name": "세미나룸6", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 7, + "name": "세미나룸7", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 9, + "name": "세미나룸9", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 4, + "maxQuota": 8, + "quota": "4 ~ 8", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + ], + }, +} + +CASE04265 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 7, + "list": [ + { + "id": 18, + "name": "개방형 테이블1", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 21, + "name": "개방형 테이블2", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 22, + "name": "개방형 테이블3", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 23, + "name": "개방형 테이블4", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 24, + "name": "개방형 테이블5", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 25, + "name": "개방형 테이블6", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 26, + "name": "개방형 테이블7", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-26", + "isChargeable": True, + "timeLine": [ + { + "hour": 0, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 1, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 2, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 3, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 4, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 5, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 24, "minutes": [{"class": "end"}]}, + ], + }, + ], + }, +} +CASE04271 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 8, + "list": [ + { + "id": 1, + "name": "세미나룸1", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 2, + "name": "세미나룸2", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 4, + "quota": "3 ~ 4", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 3, + "name": "세미나룸3", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 4, + "name": "세미나룸4", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 5, + "quota": "3 ~ 5", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 5, + "name": "세미나룸5", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 6, + "name": "세미나룸6", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 7, + "name": "세미나룸7", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 9, + "name": "세미나룸9", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 4, + "maxQuota": 8, + "quota": "4 ~ 8", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 15, "minutes": [{"class": "end"}]}, + ], + }, + ], + }, +} + +CASE04275 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 7, + "list": [ + { + "id": 18, + "name": "개방형 테이블1", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 21, + "name": "개방형 테이블2", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 22, + "name": "개방형 테이블3", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 23, + "name": "개방형 테이블4", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 24, + "name": "개방형 테이블5", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 25, + "name": "개방형 테이블6", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 26, + "name": "개방형 테이블7", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-27", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + ], + }, +} +CASE04291 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 8, + "list": [ + { + "id": 1, + "name": "세미나룸1", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 2, + "name": "세미나룸2", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 4, + "quota": "3 ~ 4", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 3, + "name": "세미나룸3", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 4, + "name": "세미나룸4", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 5, + "quota": "3 ~ 5", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 5, + "name": "세미나룸5", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 6, + "name": "세미나룸6", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 6, + "quota": "3 ~ 6", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 7, + "name": "세미나룸7", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 3, + "maxQuota": 8, + "quota": "3 ~ 8", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + { + "id": 9, + "name": "세미나룸9", + "roomType": {"id": 1, "name": "세미나룸1층", "sortOrder": 0}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 4, + "maxQuota": 8, + "quota": "4 ~ 8", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "reserved", "selectable": True}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + {"class": "reserved"}, + ], + }, + {"hour": 21, "minutes": [{"class": "end"}]}, + ], + }, + ], + }, +} +CASE04295 = { + "success": True, + "code": "success.retrieved", + "message": "조회되었습니다.", + "data": { + "totalCount": 7, + "list": [ + { + "id": 18, + "name": "개방형 테이블1", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 21, + "name": "개방형 테이블2", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 22, + "name": "개방형 테이블3", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 23, + "name": "개방형 테이블4", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 24, + "name": "개방형 테이블5", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 25, + "name": "개방형 테이블6", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + { + "id": 26, + "name": "개방형 테이블7", + "roomType": {"id": 5, "name": "숭실스퀘어(1F)", "sortOrder": 1}, + "floor": {"value": 1, "label": "1층"}, + "minQuota": 2, + "maxQuota": 3, + "quota": "2 ~ 3", + "hopeDate": "2024-04-29", + "isChargeable": True, + "timeLine": [ + { + "hour": 6, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 7, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 8, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 9, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 10, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 11, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 12, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 13, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 14, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 15, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 16, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 17, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 18, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 19, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 20, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 21, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 22, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + {"class": ""}, + ], + }, + { + "hour": 23, + "minutes": [ + {"class": "", "selectable": True}, + {"class": ""}, + {"class": ""}, + {"class": "end"}, + ], + }, + ], + }, + ], + }, +} + + +CASEDICT = { + "2024-04-26": {1: CASE04261, 5: CASE04265}, + "2024-04-27": {1: CASE04271, 5: CASE04275}, + "2024-04-29": {1: CASE04291, 5: CASE04295}, +} + + +SUCCESS04261 = { + 1: [(19, 20)], + 2: [], + 3: [], + 4: [], + 5: [], + 6: [(11, 14)], + 7: [(13, 16)], + 9: [(12, 15)], +} +SUCCESS04265 = {18: [], 21: [], 22: [], 23: [], 24: [], 25: [], 26: []} + +SUCCESS04271 = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 9: []} +SUCCESS04275 = {18: [], 21: [], 22: [], 23: [], 24: [], 25: [], 26: []} + +SUCCESS04291 = { + 1: [], + 2: [], + 3: [(17, 19)], + 4: [], + 5: [], + 6: [], + 7: [(13, 15), (19, 21)], + 9: [(18, 21)], +} +SUCCESS04295 = {18: [], 21: [], 22: [], 23: [], 24: [], 25: [], 26: []} + +SUCCESSICT = { + "2024-04-26": {1: SUCCESS04261, 5: SUCCESS04265}, + "2024-04-27": {1: SUCCESS04271, 5: SUCCESS04275}, + "2024-04-29": {1: SUCCESS04291, 5: SUCCESS04295}, +} diff --git a/test/logger_.py b/test/logger_.py new file mode 100644 index 0000000..e716a83 --- /dev/null +++ b/test/logger_.py @@ -0,0 +1,35 @@ +import logging + + +class MyFilter(logging.Filter): + """Allow only LogRecords whose severity levels are below ERROR.""" + + def filter(self, log): + if log.levelno < logging.ERROR: + return 1 + else: + return 0 + + +logger = logging.getLogger("TestLogger") +logger.setLevel(logging.DEBUG) # DEBUG 레벨 이상의 모든 이벤트 기록 +# 로그 핸들러 설정 +error_handler = logging.FileHandler( + "log/errors.log", mode="w" +) # 실패한 테스트 로그 파일 +error_handler.setLevel(logging.ERROR) # ERROR 이상 로그 기록 + +success_handler = logging.FileHandler( + "log/success.log", mode="w" +) # 성공한 테스트 로그 파일 +success_handler.setLevel(logging.INFO) # INFO 이상 로그 기록 +success_handler.addFilter(MyFilter()) + +# 로그 형식 설정 +formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") +error_handler.setFormatter(formatter) +success_handler.setFormatter(formatter) + +# 로거에 핸들러 추가 +logger.addHandler(error_handler) +logger.addHandler(success_handler)