newTao/modules/login_widget.py

224 lines
10 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
import sys
from modules.SignUpWidget import SignUpWidget
from modules.main_window import MainWindow
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()
master_email = "로그인 하세요"
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.showPasswordCheckBox = QtWidgets.QCheckBox("비밀번호 표시")
self.showPasswordCheckBox.stateChanged.connect(self.togglePasswordVisibility)
self.loginButton = QtWidgets.QPushButton("로그인")
self.loginButton.clicked.connect(self.login)
layout.addWidget(self.signupButton)
layout.addWidget(self.infoLabel)
layout.addWidget(self.emailInput)
layout.addWidget(self.passwordInput)
layout.addWidget(self.showPasswordCheckBox)
layout.addWidget(self.loginButton)
self.setLayout(layout)
self.setWindowTitle('로그인')
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 saveSettings(self, email, password):
settings = QSettings("혜리수샵", "쏘서러")
settings.setValue("email", email)
settings.setValue("password", password)
def loadSettings(self):
settings = QSettings("혜리수샵", "쏘서러")
email = settings.value("email", "")
password = settings.value("password", "")
self.emailInput.setText(email)
self.passwordInput.setText(password)
def login(self):
email = self.emailInput.text()
password = self.passwordInput.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_logout = user_doc.get('lastLogoutTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"\n마지막 로그아웃 시간: {last_logout}\n마지막 작업량: {total_workload}\n주간성과: {weekly_performance}\n월간성과: {monthly_performance}"
#QtWidgets.QMessageBox.information(self, "로그인 성공", performance_msg)
if user_doc['userType'] in ['slave', 'manager']:
master_email = user_doc.get('master', None)
QtWidgets.QMessageBox.information(self, "로그인 성공", f"{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']})
print(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 = "해당 정보는 마스터 사용자만 볼 수 있습니다."
main_window = MainWindow(self.mongoConfig, self.email, userInfo)
if main_window:
main_window.set_user_email(self.email) # 메인 윈도우의 메서드를 호출하여 현재 로그인된 사용자 표시
main_window.set_User_Info(userInfo) # 메인 윈도우의 메서드를 호출하여 현재 로그인된 사용자 표시
# 메인 윈도우를 클래스 멤버 변수에 할당
self.main_window = main_window
self.close() # 로그인 창 닫기
main_window.show() # 메인 윈도우 표시
# 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):
print("로그아웃 프로세스 시작")
now = datetime.now()
# 로그아웃 시간 업데이트
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLogoutTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
print(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:
print(f"총 작업량: {user_doc.get('totalWorkload', 0)}")
print("주별 성과:")
for week, workload in user_doc.get("weeklyPerformance", {}).items():
print(f"{week}: {workload}")
print("월별 성과:")
for month, workload in user_doc.get("monthlyPerformance", {}).items():
print(f"{month}: {workload}")
def create_performance_message(self, user_doc):
# 마지막 로그아웃 시간, 총 작업량, 주별 및 월별 성과 조회
last_logout = user_doc.get('lastLogoutTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"마지막 로그아웃 시간: {last_logout}\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()