관리자 모드가 추가되면서 main.py에 클래스가 2개 추가되었습니다.
Class PasswordDialog : 이 클래스는 사용자에게 비밀번호를 입력받는 다이얼로그 창을 생성하는 클래스입니다. 이 클래스는 PyQt의 QDialog를 상속하여 구현되었으며, 사용자가 비밀번호를 올바르게 입력하면 다이얼로그 창을 닫고, 그렇지 않으면 경고 메시지를 표시합니다.
Class AdminWindow : 이 클래스는 QMainWindow를 상속받아 구축된 GUI 기반의 도구 창입니다. 이 클래스는 다양한 데이터베이스 작업, 파일 내보내기, 테이블 위젯 관리 등 테이터 입력 및 검색 기능을 제공합니다. 관리자는 이 창을 통해 데이터베이스의 정보를 수정하고 저장할 수 있으며, 특정 날자 범위의 데이터를 검색하여 UI에 표시하고, 엑셀 파일로 내보내는 등의 작업을 수행할 수 있습니다.
관리자 기능은 크게 두 가지로 구성됩니다. 첫 번째는 입력된 기간에 따른 데이터 확인 기능이며, 두 번째는 제품 정보를 추가, 삭제 및 수정하는 기능입니다.
데이터를 확인 화면입니다.
코드는 다음과같이 작성했습니다.
검색 버튼 클릭시 searchdata() 메서드가 실행됩니다. 이 메서드는 PostgreSQL 데이터베이스와 연결하여 쿼리문을 실행합니다. 쿼리 조건은 다음과 같습니다. 제품 선택 칸의 값이 “전체”가 아닌 경우, 선택한 제품의 데이터만 출력하며, “전체”로 선택된 경우에는 모든 제품의 기록을 출력합니다. 다음은 검색된 데이터를 엑셀로 저장하는 메서드입니다.
이 메서드는 QtableWidget에 표시된 데이터를 Excel파일로 저장하는 기능을 수행합니다. 사용자가 테이블 위젯에 있는 데이터를 특정 날짜 형식에 맞춰 지정된 경로에 .xlsx파일로 내보낼 수 있도록 설계되었습니다. 또한, 중복 기록을 방지하기 위해 동일한 경로에 동일한 이름의 파일이 이미 존재할 경우 해당 파일을 삭제한 뒤 새 파일로 저장합니다. 생성된 Excel 파일의 내용은 테이블 위젯의 데이터를 그대로 반영합니다. Excel파일의 결과는 다음과같습니다.
다음은 제품의 정보 등록,수정,삭제 페이지입니다.
제품 테이블 하단 추가 버튼 클릭시 메서드 실행 tableWidget_2(제품 테이블)의 행이 추가됩니다.
제품 테이블 하단 삭제 버튼 클릭시 메서드 실행 tableWidget_2의 현재 선택된 행을 삭제합니다.
제품 테이블 하단 저장 버튼 클릭시 메서드 실행 이 메서드는 PostgreSQL 데이터베이스 테이블에 데이터를 업데이트 하는 기능을합니다. 메서드의 단계별 해석은 다음과 같습니다.
- 데이터베이스 연결 설정 : 메서드를 통해 PostgreSQL 데이터베이스에 연결합니다. 이때 host, dbname, user, password, port 정보가 사용됩니다.
- 기존데이터 삭제 : 삭제 쿼리를 실행하여 core_name_table의 기존 데이터를 삭제하고 변경 사항을 커밋하여 데이터베이스에 반영합니다. 이는 데이터의 중복 입력을 방지합니다.
- 각 행의 데이터 처리 : 각 행을 순회하며 각 셀의 데이터를 확인합니다. 셀이 비어 있지 않다면 해당값을 변수 values에 추가하고, 비어있는 셀이라면 행을 무효화 하고 루프를 종료합니다.
- 유효한 데이터 삽입 : valid_row가 True인 행만 쿼리로 core_name_table에 삽입합니다.
- UI업데이트 : 삽입이 완료되면 self.print_model-table()메서드를 호출하여 tableWidget_2에 저장된 모델 데이터를 다시 불러옵니다.
다음은 제품 측정항목 출력 메서드입니다. 이 메서드는 제품 테이블의 행을 눌렀을때 오른쪽에 출력되는 제품의 측정 기준값을 표기하는 메서드입니다. 메서드의 단계별 해석은 다음과 같습니다.
- 첫 번째 셀의 텍스트 값 가져오기 : 매개변수 row와 colum을 사용하여 클릭된 셀의 행과 열을 확인합니다. 클릭된 행의 첫 번째 열 (코어 이름)을 가져옵니다.
- 데이터베이스 연결 : PostgreSQL 데이터베이스에 연결합니다.
- 쿼리 실행 : core_name 값으로 public.core_modle_item 테이블을 조회하는 쿼리를 실행합니다. 이때 첫 번째 셀의 값을 쿼리에 반영해 일치하는 데이터만 요청합니다.
- 결과 데이터 처리 : ok_result 변수에 조회된 데이터를 저장합니다. self.tableWidget_3의 내용을 초기화하고, 행 수를 조회 결과에 맞게 설정합니다. header_labels 리스트에 열 제목을 설정하고, 이를 tableWidget_3의 헤더로 지정합니다.
- 조회 결과 테이블에 출력 : ok_result의 데이터를 순회하며 tableWidget_3의 각 셀에 값을 삽입합니다
제품 측정 항목 테이블의 추가 버튼을 누르면 위 메서드가 실행됩니다. 해당 메서드는 행을 추가함과 동시에 첫번째 값을 선택한 제품의 이름으로 작성합니다.
제품 테이블의 삭제와 마찬가지로 선택한 행을 삭제합니다.
마지막으로 제품 측정 항목 테이블의 저장 메서드 입니다. 위 메서드의 단계별 설명은 다음과 같습니다.
- 현재 선택된 행의 인덱스 가져오기 : 테이블에서 현재 선택된 행의 인덱스를 가져옵니다. 사용자가 선택한 행이 유효한지 확인하기 위해 current_row값을 확인합니다.
- 유효한 행인지 확인 : current_row가 0 이상이라면 유효한 행이 선택된 것으로 간주합니다. 그렇지 않으면 오류 메시지를 출력하고 작업을 종료합니다.
- 선택된 행의 첫 번째 열 값(core_name) 가져오기 : 선택된 행의 첫 번째 열에서 core_name값을 가져옵니다. 만약 첫 번째 열이 비어 있거나 none이면 core_name을 none으로 설정합니다.
- core_name이 유효한지 확인 : core_name(제품명)이 유효하다면, 데이터베이스 작업을 진행합니다. 그렇지 않으면 오류 메시지를 출력합니다.
- 데이터베이스 연결 : PostgreSQL 데이터베이스에 연결합니다. 다음으로 SQL 쿼리르 실행합니다.
- 기존 데이터 삭제 : core_name을 기준으로 core_model_item 테이블에서 기존 데이터를 삭제합니다. 이는 중복 삽입 방지를 위한 작업입니다.
- 새로운 데이터를 준비 : tableWidget_3에서 현재 행의 개수를 가져옵니다. 이 값은 삽입할 데이터 개수를 의미합니다.
- 각 셀에 값이 있는지 확인 : 각 열을 순회하며 해당 셀에 값이 있는지 확인합니다. 비어 있다면 해당 행을 유효하지 않다고 판단하고 삽입을 중지합니다.
- 새로운 데이터 삽입 : valid_wor가 Ture일 경우, 해당 행의 데이터를 core_model_item테이블에 삽입니다. values리스트를 튜플로 변환하여 쿼리에 전달합니다.