prb_1/Desktop/events_list_dialog.py
2025-01-16 20:50:50 +05:00

394 lines
13 KiB
Python

import datetime
from PyQt6 import uic
from PyQt6.QtWidgets import QDialog, QWidget, QHBoxLayout, QLabel, QDateEdit, QMessageBox
from data.connect import connect, Event, UserEvent, EventType, Attendance, VacationTimetable, WorkingCalendar
class EventsListDialog(QDialog):
def __init__(self, user):
super().__init__()
uic.loadUi('ui/events_dialog_window.ui', self)
with connect() as session:
self.curses = session.query(Event).join(UserEvent).join(EventType).filter(
UserEvent.user_id == user.id,
EventType.title == 'Обучение'
).all()
self.attendances = session.query(Attendance).filter(Attendance.user_id == user.id).all()
self.vacations = session.query(VacationTimetable).filter(VacationTimetable.user_id == user.id).all()
self.past = False
self.current = False
self.future = False
self.user = user
self.dateEdit.dateChanged.connect(self.set_minimum_date)
self.dateEdit.setDate(datetime.date.today())
self.pushButton_3.clicked.connect(self.change_past)
self.pushButton_2.clicked.connect(self.change_current)
self.pushButton_4.clicked.connect(self.change_future)
self.label_6.setVisible(False)
self.dateEdit_2.setVisible(False)
self.label_7.setVisible(False)
self.lineEdit.setVisible(False)
self.comboBox.currentTextChanged.connect(self.change_type_event)
self.pushButton_5.clicked.connect(self.add_new_event)
self.change_future()
self.change_current()
def add_new_event(self):
if self.comboBox.currentText() == 'Обучение':
with connect() as session:
type_edu_event = session.query(EventType).filter(EventType.title == 'Обучение').first()
new_event = Event(
type_id=type_edu_event.id,
datetime_event=self.dateEdit.date().toPyDate()
)
for attendance in self.attendances:
if self.dateEdit.date().toPyDate() == attendance.date:
QMessageBox.warning(
self,
'Внимание',
'Обучение и отгул не могут быть в одни и те же даты'
)
return
session.add(new_event)
session.flush()
new_user_event = UserEvent(
event_id=new_event.id,
user_id=self.user.id
)
session.add(new_user_event)
session.commit()
elif self.comboBox.currentText() == 'Отгул':
new_attendance = Attendance(
date=self.dateEdit.date().toPyDate(),
reason=self.lineEdit.text() if self.lineEdit.text() else None,
user_id=self.user.id,
)
for vacation in self.vacations:
if vacation.start_date <= new_attendance.date <= vacation.end_date:
QMessageBox.warning(
self,
'Внимание',
'Отпуск и отгул не могут быть в одни и те же даты'
)
return
for curse in self.curses:
if curse.datetime_event.date() == vacation.date:
QMessageBox.warning(
self,
'Внимание',
'Обучение и отгул не могут быть в одни и те же даты'
)
return
with connect() as session:
calendars = session.query(WorkingCalendar).all()
for calendar in calendars:
if not calendar.isworkingday and calendar.exceptiondate == vacation.date:
QMessageBox.warning(
self,
'Внимание',
'Отгул не может быть взят на выходной день'
)
return
with connect() as session:
session.add(new_attendance)
session.commit()
elif self.comboBox.currentText() == 'Отпуск':
new_vacation = VacationTimetable(
user_id=self.user.id,
start_date=self.dateEdit.date().toPyDate(),
end_date=self.dateEdit_2.date().toPyDate()
)
for attendance in self.attendances:
if new_vacation.start_date <= attendance.date <= new_vacation.end_date:
QMessageBox.warning(
self,
'Внимание',
'Отпуск и отгул не могут быть в одни и те же даты'
)
return
with connect() as session:
session.add(new_vacation)
session.commit()
self.lineEdit.clear()
QMessageBox.information(
self,
'Данные сохранены',
'Новое событие было добавлено'
)
with connect() as session:
self.curses = session.query(Event).join(UserEvent).join(EventType).filter(
UserEvent.user_id == self.user.id,
EventType.title == 'Обучение'
).all()
self.attendances = session.query(Attendance).filter(Attendance.user_id == self.user.id).all()
self.vacations = session.query(VacationTimetable).filter(VacationTimetable.user_id == self.user.id).all()
self.display_list()
def set_minimum_date(self):
self.dateEdit_2.setMinimumDate(
self.dateEdit.date().toPyDate() + datetime.timedelta(days=1)
)
def change_type_event(self):
if self.comboBox.currentText() == 'Обучение':
self.label_6.setVisible(False)
self.dateEdit_2.setVisible(False)
self.label_7.setVisible(False)
self.lineEdit.setVisible(False)
elif self.comboBox.currentText() == 'Отгул':
self.label_6.setVisible(False)
self.dateEdit_2.setVisible(False)
self.label_7.setVisible(True)
self.lineEdit.setVisible(True)
elif self.comboBox.currentText() == 'Отпуск':
self.label_6.setVisible(True)
self.dateEdit_2.setVisible(True)
self.label_7.setVisible(False)
self.lineEdit.setVisible(False)
def change_future(self):
self.future = not self.future
if self.future:
self.pushButton_4.setStyleSheet('''
QPushButton {
background-color: #2f9836;
}
''')
else:
self.pushButton_4.setStyleSheet('''
QPushButton {
background-color: rgb(228, 244, 204);
}
''')
self.display_list()
def change_current(self):
self.current = not self.current
if self.current:
self.pushButton_2.setStyleSheet('''
QPushButton {
background-color: #2f9836;
}
''')
else:
self.pushButton_2.setStyleSheet('''
QPushButton {
background-color: rgb(228, 244, 204);
}
''')
self.display_list()
def change_past(self):
self.past = not self.past
if self.past:
self.pushButton_3.setStyleSheet('''
QPushButton {
background-color: #2f9836;
}
''')
else:
self.pushButton_3.setStyleSheet('''
QPushButton {
background-color: rgb(228, 244, 204);
}
''')
self.display_list()
def display_list(self):
for i in range(self.verticalLayout.count()):
self.verticalLayout.itemAt(i).widget().close()
for i in range(self.verticalLayout_2.count()):
self.verticalLayout_2.itemAt(i).widget().close()
for i in range(self.verticalLayout_3.count()):
self.verticalLayout_3.itemAt(i).widget().close()
curses = sorted(self.curses, key=lambda x: x.datetime_event)
attendances = sorted(self.attendances, key=lambda x: x.date)
vacations = sorted(self.vacations, key=lambda x: x.start_date)
if self.past:
past_curser = list(
filter(
lambda x: x.datetime_event.date() < datetime.date.today(),
curses
)
)
for i in past_curser:
event_widget = EventWidget(i.datetime_event)
self.verticalLayout.addWidget(event_widget)
past_attendances = list(
filter(
lambda x: x.date < datetime.date.today(),
attendances
)
)
for i in past_attendances:
event_widget = EventWidget(i.date, reason=i.reason)
self.verticalLayout_2.addWidget(event_widget)
past_vacations = list(
filter(
lambda x: x.start_date < datetime.date.today(),
vacations
)
)
for i in past_vacations:
event_widget = EventWidget(i.start_date, i.end_date)
self.verticalLayout_3.addWidget(event_widget)
if self.current:
current_curser = list(
filter(
lambda x: x.datetime_event.date() == datetime.date.today(),
curses
)
)
for i in current_curser:
event_widget = EventWidget(i.datetime_event)
self.verticalLayout.addWidget(event_widget)
current_attendances = list(
filter(
lambda x: x.date == datetime.date.today(),
attendances
)
)
for i in current_attendances:
event_widget = EventWidget(i.date, reason=i.reason)
self.verticalLayout_2.addWidget(event_widget)
current_vacations = list(
filter(
lambda x: x.start_date <= datetime.date.today() <= x.end_date,
vacations
)
)
for i in current_vacations:
event_widget = EventWidget(i.start_date, i.end_date)
self.verticalLayout_3.addWidget(event_widget)
if self.future:
future_curser = list(
filter(
lambda x: x.datetime_event.date() > datetime.date.today(),
curses
)
)
for i in future_curser:
event_widget = EventWidget(i.datetime_event)
self.verticalLayout.addWidget(event_widget)
future_attendances = list(
filter(
lambda x: x.date > datetime.date.today(),
attendances
)
)
for i in future_attendances:
event_widget = EventWidget(i.date, reason=i.reason)
self.verticalLayout_2.addWidget(event_widget)
future_vacations = list(
filter(
lambda x: x.start_date > datetime.date.today(),
vacations
)
)
for i in future_vacations:
event_widget = EventWidget(i.start_date, i.end_date)
self.verticalLayout_3.addWidget(event_widget)
class EventWidget(QWidget):
def __init__(self, start_date, end_date=None, reason=None):
super().__init__()
self.setMinimumHeight(90)
self.setMaximumHeight(90)
self.layout = QHBoxLayout()
label1 = QLabel(
str(start_date) if end_date is None else 'Дата начала:\n' + str(start_date)
)
self.layout.addWidget(label1)
if not end_date is None:
label2 = QLabel(
'Дата окончания:\n' + str(end_date)
)
self.layout.addWidget(label2)
if not reason is None:
label3 = QLabel('Причина:\n' + reason)
self.layout.addWidget(label3)
wdg = QWidget()
wdg.setLayout(self.layout)
wdg.setStyleSheet('''
QWidget {
border: 1px solid black;
}
QLabel {
border: none;
}
''')
lyt = QHBoxLayout()
lyt.addWidget(wdg)
self.setLayout(lyt)