224 lines
10 KiB
Python
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() |