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

343 lines
11 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
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()
)
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,
)
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()
)
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)