import datetime from PyQt6 import uic from PyQt6.QtWidgets import QDialog, QWidget, QHBoxLayout, QLabel, QDateEdit, QMessageBox, QVBoxLayout, QPushButton from data.connect import connect, Event, UserEvent, EventType, Attendance, VacationTimetable, WorkingCalendar, User class EventsListDialog(QDialog): def __init__(self, user, parent, department): 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.parent = parent self.department = department 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.pushButton_6.clicked.connect(self.dismiss_employee) self.change_future() self.change_current() def dismiss_employee(self): future_curser = list( filter( lambda x: x.datetime_event.date() > datetime.date.today(), self.curses ) ) if future_curser: QMessageBox.warning( self, 'Внимание', 'Увольнение сотрудников с предстоящими обучениями запрещено!' ) return self.accept_dissmiss = AcceptDismissEmployee(self.user, self) self.accept_dissmiss.exec() 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 AcceptDismissEmployee(QDialog): def __init__(self, user, parent): super().__init__() self.setWindowTitle('Увольнение сотрудника') self.lyt = QVBoxLayout() self.user = user self.parent = parent lbl1 = QLabel(f'Вы уверены, что хотите уволить сотрудника: {user.last_name} {user.first_name}?') self.lyt.addWidget(lbl1) h_lyt = QHBoxLayout() button1 = QPushButton('Уволить') button1.clicked.connect(self.dismiss_employee) h_lyt.addWidget(button1) button2 = QPushButton('Отмена') h_lyt.addWidget(button2) button2.clicked.connect(self.close) self.lyt.addLayout(h_lyt) self.setLayout(self.lyt) def dismiss_employee(self): with connect() as session: user = session.query(User).filter(User.id == self.user.id).first() user.is_dismissed = True user.dismiss_date = datetime.date.today() session.commit() QMessageBox.information( self, 'Внимание', 'Сотрудник был уволен' ) future_attendances = list( filter( lambda x: x.date > datetime.date.today(), self.parent.attendances ) ) future_vacations = list( filter( lambda x: x.start_date > datetime.date.today(), self.parent.vacations ) ) with connect() as session: for i in future_attendances: session.delete(i) for i in future_vacations: session.delete(i) self.parent.parent.select_department(self.parent.department.id) self.parent.close() self.close() 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)