AutoPercenty/login_widget.py

325 lines
15 KiB
Python

from werkzeug.security import check_password_hash
from PyQt5.QtCore import Qt, QSettings
from PyQt5 import QtWidgets, QtCore, QtWidgets
from datetime import datetime
from credentials import load_credentials, save_credentials
import sys
import logging
# 로거 인스턴스 가져오기
logger = logging.getLogger('default_logger')
class LoginWidget(QtWidgets.QWidget):
def __init__(self, mongo_config):
super().__init__()
self.mongoConfig = mongo_config
self.client = mongo_config.client
# self.login_db = self.mongoConfig.get_db() # mongo_config 인스턴스를 통해 데이터베이스 객체를 가져옴
self.login_db = self.client['taobao_project']
self.initUI()
# Initialize MongoDB client and select database
self.loadSettings()
self.master_email = "로그인 하세요"
self.result = False
self.per_email = None
self.per_password = None
self.per_em_email = None
self.per_em_password = None
self.per_mode = False
self.set_num_modify = 0
def initUI(self):
self.setGeometry(780, 420, 240, 200)
layout = QtWidgets.QVBoxLayout()
self.signupButton = QtWidgets.QPushButton("회원 가입")
self.signupButton.clicked.connect(self.showSignUpWindow)
self.infoLabel = QtWidgets.QLabel("로그인 정보를 입력하세요")
self.emailInput = QtWidgets.QLineEdit()
self.emailInput.setPlaceholderText("서버인증 사용자 이름(이메일형식)")
self.emailInput.returnPressed.connect(self.focusToPassword) # 사용자 이름에서 엔터 -> 암호칸으로 포커스
self.passwordInput = QtWidgets.QLineEdit()
self.passwordInput.setPlaceholderText("서버인증 비밀번호")
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
self.passwordInput.returnPressed.connect(self.login) # 암호에서 엔터 -> 로그인 시도
self.infoLabel2 = QtWidgets.QLabel("========퍼센티 로그인 정보 입력========")
self.per_emailInput = QtWidgets.QLineEdit()
self.per_emailInput.setPlaceholderText("퍼센티 사용자 이름(이메일형식)")
# self.per_emailInput.returnPressed.connect(self.focusToPassword) # 사용자 이름에서 엔터 -> 암호칸으로 포커스
self.per_em_emailInput = QtWidgets.QLineEdit()
self.per_em_emailInput.setPlaceholderText("퍼센티 직원 아이디")
# self.per_em_emailInput.returnPressed.connect(self.focusToPassword) # 사용자 이름에서 엔터 -> 암호칸으로 포커스
self.per_em_passwordInput = QtWidgets.QLineEdit()
self.per_em_passwordInput.setPlaceholderText("퍼센티 직원 비밀번호")
self.per_em_passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
# self.per_passwordInput.returnPressed.connect(self.login) # 암호에서 엔터 -> 로그인 시도
self.per_passwordInput = QtWidgets.QLineEdit()
self.per_passwordInput.setPlaceholderText("퍼센티 비밀번호")
self.per_passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
# self.per_passwordInput.returnPressed.connect(self.login) # 암호에서 엔터 -> 로그인 시도
self.infoLabel3 = QtWidgets.QLabel("=====================================")
# 토글 버튼 추가
self.changeModeButton = QtWidgets.QPushButton("관리자용용모드")
self.changeModeButton.setCheckable(True)
self.changeModeButton.clicked.connect(self.toggleMode)
# 초기 토글 상태 설정
self.toggleMode(False)
self.set_num_modifyInput = QtWidgets.QLineEdit()
self.set_num_modifyInput.setPlaceholderText("수정갯수 : 0이면 등록된 모든 신규상품 수정")
# self.per_em_emailInput.returnPressed.connect(self.focusToPassword) # 사용자 이름에서 엔터 -> 암호칸으로 포커스
self.infoLabel5 = QtWidgets.QLabel("[수정갯수가 0이면 등록된 모든 신규상품 수정]")
# 비밀번호 표시 토글 버튼
self.showPasswordCheckBox = QtWidgets.QCheckBox("비밀번호 표시")
self.showPasswordCheckBox.stateChanged.connect(self.togglePasswordVisibility)
self.loginButton = QtWidgets.QPushButton("로그인")
self.loginButton.clicked.connect(self.login)
self.infoLabel4 = QtWidgets.QLabel(" 퍼센티 자동화 by 리앤수Int.")
layout.addWidget(self.signupButton)
layout.addWidget(self.infoLabel)
layout.addWidget(self.emailInput)
layout.addWidget(self.passwordInput)
layout.addWidget(self.infoLabel2)
layout.addWidget(self.per_emailInput)
layout.addWidget(self.per_em_emailInput)
layout.addWidget(self.per_em_passwordInput)
layout.addWidget(self.per_passwordInput)
layout.addWidget(self.changeModeButton)
layout.addWidget(self.set_num_modifyInput)
layout.addWidget(self.infoLabel5)
layout.addWidget(self.infoLabel3)
layout.addWidget(self.showPasswordCheckBox)
layout.addWidget(self.loginButton)
layout.addWidget(self.infoLabel4)
self.setLayout(layout)
self.setWindowTitle('AutoPercenty')
def togglePasswordVisibility(self):
if self.showPasswordCheckBox.isChecked():
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Normal)
else:
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
def focusToPassword(self):
self.passwordInput.setFocus()
def toggleMode(self, checked):
if checked:
self.changeModeButton.setText("직원용모드")
self.per_em_emailInput.setVisible(True)
self.per_em_passwordInput.setVisible(True)
self.per_passwordInput.setVisible(False)
self.per_mode = False # False일 경우 관리자
else:
self.changeModeButton.setText("관리자용모드")
self.per_em_emailInput.setVisible(False)
self.per_em_passwordInput.setVisible(False)
self.per_passwordInput.setVisible(True)
self.per_mode = True # True일 경우 직원용
# def checkToggleButtonState(self):
# if self.changeModeButton.isChecked():
# logger.debug("직원용모드 활성화")
# else:
# logger.debug("관리자용모드 활성화")
def saveSettings(self, email, password):
settings = QSettings("리앤수", "퍼센티자동화")
settings.setValue("email", self.emailInput.text())
settings.setValue("password", self.passwordInput.text())
settings.setValue("per_email", self.per_email)
settings.setValue("per_password", self.per_password)
settings.setValue("per_em_email", self.per_em_email)
settings.setValue("per_em_password", self.per_em_password)
settings.setValue("per_mode", self.per_mode)
settings.setValue("set_num_modify", self.set_num_modify)
def loadSettings(self):
settings = QSettings("리앤수", "퍼센티자동화")
self.emailInput.setText(settings.value("email", ""))
self.passwordInput.setText(settings.value("password", ""))
self.per_emailInput.setText(settings.value("per_email", ""))
self.per_passwordInput.setText(settings.value("per_password", ""))
self.per_em_emailInput.setText(settings.value("per_em_email", ""))
self.per_em_passwordInput.setText(settings.value("per_em_password", ""))
self.set_num_modifyInput.setText(settings.value("set_num_modify", "0"))
toggle_state = settings.value("per_mode", "false").lower() in ('true', '1', 'yes')
self.toggleMode(toggle_state)
def login(self):
email = self.emailInput.text()
password = self.passwordInput.text()
self.per_email = self.per_emailInput.text()
self.per_password = self.per_passwordInput.text()
self.per_em_email = self.per_em_emailInput.text()
self.per_em_password = self.per_em_passwordInput.text()
self.set_num_modify = self.set_num_modifyInput.text()
# MongoDB에서 사용자 문서 조회
user_doc = self.login_db.users.find_one({"email": email})
if user_doc and check_password_hash(user_doc['password'], password):
# 비밀번호 검증 성공
self.email = email # 여기에서 사용자 이메일을 self.email 속성에 저장
# 마지막 로그인 시간, 총 작업량, 주별 및 월별 성과 조회
last_login = user_doc.get('lastLoginTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"\n마지막 로그인 시간: {last_login}\n마지막 작업량: {total_workload}\n주간성과: {weekly_performance}\n월간성과: {monthly_performance}"
#QtWidgets.QMessageBox.information(self, "로그인 성공", performance_msg)
if user_doc['userType'] in ['slave', 'manager']:
self.master_email = user_doc.get('master', None)
logger.debug(f"설정된 마스터 이메일 : {self.master_email}")
QtWidgets.QMessageBox.information(self, "로그인 성공", f"{self.master_email} 데이터베이스를 사용합니다.\n{performance_msg}")
else:
QtWidgets.QMessageBox.information(self, "로그인 성공", f"{email} 데이터베이스를 사용합니다.\n{performance_msg}")
self.saveSettings(email, password) # 로그인 성공 시 설정 저장
now = datetime.now()
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLoginTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
self.on_login_success()
else:
# 로그인 실패
QtWidgets.QMessageBox.warning(self, "로그인 실패", "이메일 또는 비밀번호가 잘못되었습니다.")
def on_login_success(self):
# MongoDB에서 사용자 문서 조회
user_doc = self.login_db.users.find_one({"email": self.email})
if user_doc['userType'] == 'master':
# 마스터 사용자 정보 표시
userInfo = f"등급: {user_doc['userGrade']}, 플랜 종료일: {user_doc['planEndDate']}"
# 종속된 사용자 정보 조회 및 표시
dependent_users = self.login_db.users.find({"master": user_doc['email']})
logger.debug(dependent_users)
#dependent_users = self.login_db.users.find({"master": self.email}) # 수정된 부분: user_doc['email'] 대신 self.email 사용
for user in dependent_users:
last_login = user.get('lastLoginTime', '로그인 기록 없음')
total_workload = user.get('totalWorkload', 0)
userInfo += f"\n종속 사용자: {user['email']}, 마지막 로그인: {last_login}, 총 작업량: {total_workload}"
elif user_doc['userType'] in ['slave', 'manager']:
userInfo = "해당 정보는 마스터 사용자만 볼 수 있습니다."
logger.debug(f"on_login_succes의 마스터 이메일 : {self.master_email}")
self.result = True
logger.debug(f"login_widget의 self.result : {self.result}")
# 로그인 시간 업데이트
now = datetime.now()
self.login_db.users.update_one(
{"email": self.email},
{"$set": {"lastLoginTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
logger.debug(f"사용자 {self.email}의 로그인 시간이 기록되었습니다.")
self.close() # 로그인 창 닫기
# sys.exit()
# self.close() # 로그인 창 닫기
def find_master_username(self, slave_username):
# 실제 애플리케이션에서는 여기서 MongoDB를 조회하여 master 사용자를 찾아야 합니다.
# 이 예시에서는 단순화를 위해 'master' 문자열을 반환합니다.
return self.master_email
def login_user(self, email, password):
# 로그인 검증 로직 (생략)
now = datetime.now()
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLoginTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
# 로그인 성공 메시지와 마지막 로그아웃 시간 표시 (구현 필요)
def logout(self, email):
logger.debug("로그아웃 프로세스 시작")
now = datetime.now()
# 로그아웃 시간 업데이트
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLogoutTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
logger.debug(f"사용자 {email}의 로그아웃 시간이 기록되었습니다.")
# 변경된 문서 다시 조회
user_doc = self.login_db.users.find_one({"email": email})
# 성과 메시지 생성
performance_msg = self.create_performance_message(user_doc)
# 로그아웃 메시지 박스 표시 및 5초 후 자동 닫기
msgBox = QtWidgets.QMessageBox(self)
msgBox.setWindowTitle("로그아웃")
msgBox.setText("성공적으로 로그아웃되었습니다.\n" + performance_msg)
msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
msgBox.buttonClicked.connect(msgBox.close)
QTimer = QtCore.QTimer(self)
QTimer.singleShot(3000, msgBox.close) # 5초 후 자동 닫기
msgBox.exec_()
def show_user_performance(self, email):
user_doc = self.login_db.users.find_one({"email": email}, {"totalWorkload": 1, "weeklyPerformance": 1, "monthlyPerformance": 1})
if user_doc:
logger.debug(f"총 작업량: {user_doc.get('totalWorkload', 0)}")
logger.debug("주별 성과:")
for week, workload in user_doc.get("weeklyPerformance", {}).items():
logger.debug(f"{week}: {workload}")
logger.debug("월별 성과:")
for month, workload in user_doc.get("monthlyPerformance", {}).items():
logger.debug(f"{month}: {workload}")
def create_performance_message(self, user_doc):
# 마지막 로그인 시간, 총 작업량, 주별 및 월별 성과 조회
last_login = user_doc.get('lastLoginTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"마지막 로그인 시간: {last_login}\n총 작업량: {total_workload}\n"
for week, workload in weekly_performance.items():
performance_msg += f"주별 성과 ({week}): {workload}\n"
for month, workload in monthly_performance.items():
performance_msg += f"월별 성과 ({month}): {workload}\n"
return performance_msg
def showSignUpWindow(self):
self.signUpWidget = SignUpWidget()
self.signUpWidget.show()