Metadata-Version: 2.4
Name: posco-lp
Version: 1.2.2
Summary: POSCO Learning Platform Crawling Code Library
Home-page: https://github.com/hrdkdh
Author: Duhwan Kim
Author-email: hrdkdh@naver.com
Project-URL: Bug Tracker, https://github.com/hrdkdh
Keywords: POSCO,learning platform,lp
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Requires-Dist: requests
Requires-Dist: urllib3
Requires-Dist: numpy
Requires-Dist: pandas
Requires-Dist: openpyxl
Requires-Dist: bs4
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license-file
Dynamic: project-url
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# posco-lp

포스코 Learning Platform(LP) 관리자 기능을 자동화하기 위한 파이썬 패키지입니다.
관리자 권한이 있는 계정으로만 정상적인 사용이 가능합니다.

## 설치

```bash
pip install posco-lp
```

소스 폴더에서 직접 설치하려면 아래와 같이 실행합니다.

```bash
pip install .
```

주요 의존성은 `requests`, `pandas`, `numpy`, `bs4`, `openpyxl`입니다.

## 빠른 시작

```python
from poscolp import LP, __version__

print(__version__)  # 1.2.2

lp = LP(lp_id="your_id", lp_pw="your_password")

company_df = lp.getCompanyList()
user_df = lp.getUserList(search_text="홍길동")
cha_df = lp.getChaList(search_text="리더십", start_date="20260101", end_date="20261231")
```

메시지 출력이 필요한 경우에만 `verbose=True`를 사용하면 됩니다.

```python
lp = LP(lp_id="your_id", lp_pw="your_password", verbose=True)

# 또는 메서드별로만 출력 활성화
user_df = lp.getUserList(search_text="홍길동", verbose=True)
```

엑셀 저장이 필요한 경우 `filename_to_save` 파라미터를 사용하면 되며, 확장자를 생략하면 `.xlsx`가 자동으로 붙습니다.

## 1.2.2에서 달라진 점

- `getChaList()` 요청을 최신 LP 화면 기준 payload로 정리했습니다. 차수명 검색어는 `courseCsName`으로 전송하고, 기간 구분은 `eduPeriodFlag='M'`으로 조회합니다.
- `getStudentRegisterList()` 요청을 최신 LP 화면 기준 payload로 보강했습니다. 응답에 `hpNo`가 있으면 `휴대폰` 컬럼으로 함께 반환합니다.
- `getUserList()` 요청을 최신 사용자 검색 화면 기준으로 정리했습니다. `stay_type` 파라미터로 재직/퇴직 조회를 구분할 수 있고, 퇴직자 응답처럼 일부 컬럼이 축약된 경우에도 안전하게 반환합니다.
- `getUserHistory(search_type="NUM")`는 POSCO 고정 필터를 강제로 쓰지 않고, 최신 사용자 검색 결과에서 LP관리ID를 확인한 뒤 교육이력을 조회합니다.

## 1.2.1에서 달라진 점

- `getLectureRoomInfo()` 요청의 `searchEduArea`, `searchEduPlaceCode`를 공란으로 전송하도록 수정했습니다.
- 강의실 예약 조회는 특정 교육지역/교육장 코드에 묶이지 않고 LP 기본 조회 범위를 따릅니다.

## 1.2.0에서 달라진 점

- `pyautogui` 의존성을 제거했습니다.
- 로그인 정보가 없을 때 더 이상 GUI 입력창을 띄우지 않습니다.
- 로그인 필요한 메서드는 내부적으로 자동 로그인 시도를 먼저 수행합니다.
- `getUserList()`는 `search_text`와 `company_code`를 모두 비우면 최신 LP 화면과 동일하게 전체 조회를 수행합니다. `company_code=''`는 전체, `company_code='0'`는 POSCO를 의미합니다.
- 수료자 조회/일괄 수료 처리에서 LP HTML 파싱 실패 시 안전하게 종료하도록 보강했습니다.
- `getLectureRoomInfo()`의 잘못된 요청 코드와 빈 결과 처리 로직을 정리했습니다.
- `print()` 기반 안내 메시지는 기본적으로 출력하지 않으며, `verbose=True`일 때만 출력합니다.
- 버전 정보는 `poscolp/__version__.py`를 단일 원본으로 사용하고, `setup.py`는 그 값을 읽어 배포합니다.

## 로그인 및 메시지 동작

- `LP(lp_id, lp_pw)` 형태로 생성하면 인증이 필요한 메서드에서 자동 로그인됩니다.
- `LP()`처럼 로그인 정보 없이 객체를 생성할 수는 있지만, 인증이 필요한 메서드는 실패 처리됩니다.
- 기본 동작은 조용한 모드이며, 안내/경고/오류 메시지는 출력하지 않습니다.
- 생성자에서 `verbose=True`를 주면 해당 객체의 메서드 전반에 출력이 활성화됩니다.
- 특정 호출에서만 메시지가 필요하면 각 메서드의 `verbose=True`를 사용하면 됩니다.
- 대부분의 조회 메서드는 로그인 실패 시 `False`를 반환합니다.
- `getUserHistory()`는 `search_text`가 비어 있으면 `None`을 반환합니다.
- `updateStudentToPassed()`, `resetUserPassword()`는 반환값 구조를 바꾸지 않으며 `None`을 반환합니다. 처리 메시지는 `verbose=True`일 때만 출력합니다.

## 메서드 명세

### 공통

- `login(verbose=False)`
  - LP 로그인 세션을 생성합니다.
  - 로그인 진행 및 실패 메시지는 `verbose=True`일 때만 출력합니다.

### 회사/사용자 조회

- `getCompanyList(company_cate="그룹사", filename_to_save="", verbose=False)`
  - 그룹사, 협력사, 해외법인 목록을 `DataFrame`으로 반환합니다.
- `getUserList(search_text="", search_type="NAME", company_code="", filename_to_save="", verbose=False, stay_type="N")`
  - 사용자 검색 결과를 `DataFrame`으로 반환합니다.
  - `search_type`은 `NAME`, `ID`, `NUM`을 지원합니다.
  - `stay_type`은 `N`/`재직`, `Y`/`퇴사`/`퇴직`을 지원합니다.
  - 최신 LP 화면 기준으로 `searchCompType`, `searchDepartText`, `searchPiumTagtCdText`, `searchStayType`를 포함한 요청을 사용합니다.
  - `search_text`와 `company_code`를 모두 비우면 전체 조회를 수행합니다. `company_code=''`는 전체, `company_code='0'`는 POSCO를 의미합니다.
  - 퇴직자 조회 응답은 일부 상세 컬럼이 없을 수 있으며, `retrDt`가 있으면 `퇴직일` 컬럼으로 함께 반환합니다.
- `getUserHistory(search_type="LP_USER_ID", search_text="", filename_to_save="", verbose=False)`
  - 특정 사용자의 교육 이력을 반환합니다.
  - `search_type="NUM"`일 때는 최신 사용자 검색 결과에서 LP관리ID를 먼저 확인한 뒤 조회하며, POSCO 고정 필터를 강제로 사용하지 않습니다.
  - `search_text`가 비어 있으면 조회를 수행하지 않고 `None`을 반환합니다.
- `resetUserPassword(lp_user_id, verbose=False)`
  - 특정 사용자의 LP 비밀번호를 초기화합니다.
  - 처리 결과 메시지는 `verbose=True`일 때만 출력합니다.

### 과정/차수/교육생

- `getChaList(group_name="", search_text="", start_date="", end_date="", simple=True, filename_to_save="", verbose=False)`
  - 차수 목록을 반환합니다.
  - 최신 LP 화면 기준으로 `courseCsName`, `eduMngtDeptName`, `searchStartDt/searchEndDt`, `eduPeriodFlag='M'` 형태의 조회 요청을 사용합니다.
- `getChaDetail(courseId, chaId, verbose=False)`
  - 차수 상세 정보를 `dict`로 반환합니다.
- `getStudentRegisterList(courseId, chaId, filename_to_save="", verbose=False)`
  - 차수 등록자 목록을 반환합니다.
  - 최신 LP 화면 기준으로 `draw`, `search[value]`, `searchPropStatCode`, `searchClassSeq`, `companyInfo`, `keyword`, `courseOpenScope`, `eduMngtDept`, `showOthGrpYn`을 포함한 조회 요청을 사용합니다.
  - 반복되는 `columns[n][...]` 메타데이터는 서버에서 생략 가능하여 포함하지 않습니다.
  - LP 응답에 성별(sexdstn) 또는 휴대폰(hpNo) 컬럼이 없으면 해당 컬럼을 제외하고 반환합니다.
- `getStudentPassedList(courseId, chaId, filename_to_save="", verbose=False)`
  - 차수 수료자 목록을 반환합니다.
  - LP 화면 구조가 바뀌어 파싱에 실패하면 `False`를 반환할 수 있으며, 관련 메시지는 `verbose=True`일 때만 출력합니다.
- `updateStudentToPassed(courseId, chaId, verbose=False)`
  - 수료 조건 대상자를 일괄 수료 처리합니다.
  - 처리 결과 메시지는 `verbose=True`일 때만 출력합니다.

### 설문/강의실

- `getSurveyMeanScore(courseId, chaId, filename_to_save="", verbose=False)`
  - 설문별 평균 점수와 응답자 수를 반환합니다.
- `getSurveyAnswerList(courseId, chaId, filename_to_save="", verbose=False)`
  - 설문 응답 원본 데이터를 반환합니다.
- `getLectureRoomInfo(date, filename_to_save="", verbose=False)`
  - 특정 날짜의 강의실 예약 정보를 반환합니다.
  - 요청 시 `searchEduArea`, `searchEduPlaceCode`는 공란으로 전달합니다.
  - 날짜 형식 오류 메시지는 `verbose=True`일 때만 출력합니다.

## 반환 규칙 요약

- 조회 성공: 주로 `pandas.DataFrame` 또는 `dict`
- 조회 실패: 주로 `False`
- 입력이 비어 조회 자체를 진행하지 않는 경우: 일부 메서드는 `None`
- 처리형 메서드: 반환값은 그대로 `None`, 처리 메시지는 `verbose=True`일 때만 출력

## 주요 변경 이력

- `1.2.2` | 2026-07-03
  - `getChaList()`, `getStudentRegisterList()`, `getUserList()` 요청을 최신 LP 화면 기준으로 갱신
  - `getUserList()`에 `stay_type` 지원 및 퇴직자 응답 안전 처리 추가
  - `getStudentRegisterList()` 휴대폰 컬럼 지원
  - `getUserHistory(search_type="NUM")`의 POSCO 고정 필터 제거
- `1.2.1` | 2026-06-26
  - `getLectureRoomInfo()`의 강의실 조회 요청에서 교육지역/교육장 하드코딩 제거
- `1.2.0` | 2026-06-26
  - `pyautogui` 제거
  - 공통 로그인 가드 추가
  - 로그인 정보 미입력 시 경고 후 실패 처리
  - `openpyxl` 의존성 추가
  - `verbose` 기반 메시지 출력 제어 추가
  - README 및 docstring 정비
- `1.1.3` | 2023-09-21
  - `getStudentRegisterList()`에서 성별 컬럼 누락 시 발생하던 오류 수정
- `1.1.2` | 2023-08-31
  - `getStudentRegisterList()` 결과에 신청/변경일시와 성별 컬럼 추가
- `1.1.1` | 2023-07-16
  - `getUserHistory()` 메서드 추가
- `1.0.9` | 2023-06-01
  - `getChaList()` 결과에 교육지역 정보 추가
- `1.0.8`
  - `getSurveyAnswerList()` 메서드 추가
  - 저장 파일명에 확장자가 없으면 `.xlsx` 자동 추가

## 주의 사항

- POSCO Learning Platform 관리자 권한이 있는 계정이 필요합니다.
- 일부 메서드는 LP 관리자 페이지의 HTML 구조에 의존합니다.
- 패키지 내부 요청은 기존 구현과 동일하게 `verify=False`로 동작합니다.
- 자동화 코드에 이미 이전 버전을 사용 중이라면, 업그레이드 전 `verbose` 사용 여부와 실패 시 반환값 흐름을 한 번 점검하는 것을 권장합니다.
