Skip to content

Commit

Permalink
Fix incorrect passenger type on reserve_standby (#267)
Browse files Browse the repository at this point in the history
* Fix passenger info

* Add test

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fix type

* type

* changelog

* type

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
ryanking13 and pre-commit-ci[bot] authored Aug 26, 2024
1 parent 92383b3 commit e59f4a2
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 36 deletions.
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
## Unreleased

## v2.5.0 (2024/08/26)

- 잘못된 승객 타입이 지정되는 문제 수정
([#267](https://github.com/ryanking13/SRT/pull/267))

## v2.4.1 (2024/02/09)

- Add exception handling
([#259](https://github.com/ryanking13/SRT/issues/259))
([#259](https://github.com/ryanking13/SRT/pull/259))

## v2.4.0 (2024/01/11)

Expand Down
52 changes: 27 additions & 25 deletions SRT/passenger.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,32 @@ def __init_internal__(self, name, type_code, count):
def __repr__(self):
return f"{self.name} {self.count}명"

def __add__(self, other):
assert isinstance(other, self.__class__)
def __add__(self, other: "Passenger") -> "Passenger":
if not isinstance(other, self.__class__):
raise TypeError("Passenger types must be the same")

if self.type_code == other.type_code:
new_count = self.count + other.count
return self.__class__(count=new_count)

raise ValueError("Passenger types must be the same")

@classmethod
def combine(cls, passengers):
def combine(cls, passengers: list["Passenger"]) -> list["Passenger"]:
if list(filter(lambda x: not isinstance(x, Passenger), passengers)):
raise TypeError("Passengers must be based on Passenger")

tmp_passengers = passengers.copy()
combined_passengers = []
while tmp_passengers:
passenger = tmp_passengers.pop()
same_class = list(
filter(
lambda x, base_passenger=passenger: isinstance(
x, base_passenger.__class__
),
tmp_passengers,
)
)
new_passenger = None
if not same_class:
new_passenger = passenger
else:
same_class: list[Passenger] = []
for p in tmp_passengers:
if isinstance(p, passenger.__class__):
same_class.append(p)

new_passenger = passenger
if same_class:
for same in same_class:
new_passenger = passenger + same
tmp_passengers.remove(same)
Expand All @@ -69,29 +68,32 @@ def total_count(passengers):
return str(total_count)

@staticmethod
def get_passenger_dict(passengers, special_seat=False, window_seat=None):
def get_passenger_dict(
passengers, special_seat=False, window_seat=None
) -> dict[str, str]:
if list(filter(lambda x: not isinstance(x, Passenger), passengers)):
raise TypeError("Passengers must be based on Passenger")

data = {
"totPrnb": Passenger.total_count(passengers),
"psgGridcnt": str(len(passengers)),
}
for i, passenger in enumerate(passengers):
data[f"psgTpCd{i + 1}"] = passenger.type_code
data[f"psgInfoPerPrnb{i + 1}"] = str(passenger.count)
for _, passenger in enumerate(passengers):
code = passenger.type_code
data[f"psgTpCd{code}"] = passenger.type_code
data[f"psgInfoPerPrnb{code}"] = str(passenger.count)
# seat location ('000': 기본, '012': 창측, '013': 복도측)
data[f"locSeatAttCd{i + 1}"] = WINDOW_SEAT[window_seat]
data[f"locSeatAttCd{code}"] = WINDOW_SEAT[window_seat]
# seat requirement ('015': 일반, '021': 휠체어)
# TODO: 선택 가능하게
data[f"rqSeatAttCd{i + 1}"] = "015"
data[f"rqSeatAttCd{code}"] = "015"
# seat direction ('009': 정방향)
data[f"dirSeatAttCd{i + 1}"] = "009"
data[f"dirSeatAttCd{code}"] = "009"

data[f"smkSeatAttCd{i + 1}"] = "000"
data[f"etcSeatAttCd{i + 1}"] = "000"
data[f"smkSeatAttCd{code}"] = "000"
data[f"etcSeatAttCd{code}"] = "000"
# seat type: ('1': 일반실, '2': 특실)
data[f"psrmClCd{i + 1}"] = "2" if special_seat else "1"
data[f"psrmClCd{code}"] = "2" if special_seat else "1"

return data

Expand Down
14 changes: 4 additions & 10 deletions SRT/srt.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,10 +395,6 @@ def _reserve(
"dirSeatAttCd1": "009", # 방향좌석속성코드
"locSeatAttCd1": "000", # 위치좌석속성코드1
"rqSeatAttCd1": "015", # 요구좌석속성코드1
"etcSeatAttCd1": "000", # 기타좌석속성코드1
"smkSeatAttCd2": "000", # 흡연좌석속성코드2
"dirSeatAttCd2": "009", # 방향좌석속성코드2
"rqSeatAttCd2": "015", # 요구좌석속성코드2
"mblPhone": mblPhone,
}

Expand All @@ -410,13 +406,11 @@ def _reserve(
}
)

# jobid가 RESERVE_JOBID["PERSONAL"]일 경우, data에 windowSeat 추가
if jobid == RESERVE_JOBID["PERSONAL"]:
data.update(
Passenger.get_passenger_dict(
passengers, special_seat=is_special_seat, window_seat=window_seat
)
data.update(
Passenger.get_passenger_dict(
passengers, special_seat=is_special_seat, window_seat=window_seat
)
)

r = self._session.post(url=url, data=data)
parser = SRTResponseData(r.text)
Expand Down
44 changes: 44 additions & 0 deletions tests/test_passenger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from SRT.passenger import (
Adult,
Child,
Disability1To3,
Disability4To6,
Passenger,
Senior,
)


def test_get_passenger_dict():
passengers = [
Adult(),
Child(),
Child(),
]

passengers = Passenger.combine(passengers)

data = Passenger.get_passenger_dict(passengers)
assert data["totPrnb"] == "3"
assert data["psgGridcnt"] == "2"
assert data["psgTpCd1"] == "1"
assert data["psgInfoPerPrnb1"] == "1"
assert data["psgTpCd5"] == "5"
assert data["psgInfoPerPrnb5"] == "2"

passengers2 = [
Senior(),
Disability1To3(),
Disability4To6(),
]

passengers2 = Passenger.combine(passengers2)

data = Passenger.get_passenger_dict(passengers2)
assert data["totPrnb"] == "3"
assert data["psgGridcnt"] == "3"
assert data["psgTpCd4"] == "4"
assert data["psgInfoPerPrnb4"] == "1"
assert data["psgTpCd2"] == "2"
assert data["psgInfoPerPrnb2"] == "1"
assert data["psgTpCd3"] == "3"
assert data["psgInfoPerPrnb3"] == "1"

0 comments on commit e59f4a2

Please sign in to comment.