diff --git a/Desktop/data/connect.py b/Desktop/data/connect.py index 3250456..8e3ab70 100644 --- a/Desktop/data/connect.py +++ b/Desktop/data/connect.py @@ -197,7 +197,6 @@ class Attendance(base): id = Column(Integer, primary_key=True, autoincrement=True) date = Column(Date) - is_attended = Column(Boolean) reason = Column(Text) user_id = Column(Integer, ForeignKey('users.id')) diff --git a/Desktop/events_list_dialog.py b/Desktop/events_list_dialog.py index 12a5587..1cb6a3a 100644 --- a/Desktop/events_list_dialog.py +++ b/Desktop/events_list_dialog.py @@ -1,5 +1,7 @@ +import datetime + from PyQt6 import uic -from PyQt6.QtWidgets import QDialog +from PyQt6.QtWidgets import QDialog, QWidget, QHBoxLayout, QLabel, QDateEdit, QMessageBox from data.connect import connect, Event, UserEvent, EventType, Attendance, VacationTimetable @@ -19,3 +21,322 @@ class EventsListDialog(QDialog): 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) diff --git a/Desktop/ui/events_dialog_window.ui b/Desktop/ui/events_dialog_window.ui index 8402ad0..fa3d22b 100644 --- a/Desktop/ui/events_dialog_window.ui +++ b/Desktop/ui/events_dialog_window.ui @@ -26,13 +26,91 @@ QPushButton { background-color: rgb(228, 244, 204); -} -QPushButton:hover { -background-color: #2f9836; } - + + + + true + + + + + 0 + 0 + 69 + 606 + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Назад + + + + true @@ -42,8 +120,8 @@ background-color: #2f9836; 0 0 - 923 - 606 + 897 + 504 @@ -82,8 +160,8 @@ background-color: #2f9836; 0 0 - 903 - 554 + 877 + 452 @@ -125,36 +203,7 @@ background-color: #2f9836; - - - - true - - - - - 0 - 0 - 69 - 606 - - - - - - - - - - - - - - Назад - - - - + Qt::Horizontal @@ -167,8 +216,111 @@ background-color: #2f9836; - - + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + true + + + + + 0 + 0 + 897 + 94 + + + + + + + + + + true + + + + + + + Добавить + + + + + + + Тип события + + + + + + + Дата начала + + + + + + + + Обучение + + + + + Отгул + + + + + Отпуск + + + + + + + + true + + + + + + + Краткое обоснование + + + + + + + Дата окончания + + + + + + + + + Qt::Horizontal @@ -180,15 +332,15 @@ background-color: #2f9836; - - + + - Qt::Horizontal + Qt::Vertical - 40 - 20 + 20 + 40