class LessonLoadingWidget(AbstractLoadingWizard, IAcceptDrop, ISelectFile): label = "Загрузить занятия" description = "Открывает интерфейс загрузки занятия" steps = [ Step('Выбрать дату начала семестра', ''), Step('Загрузить файл с расписанием', 'требуется загрузить файл с распсианием занятий', False), Step('Загрузить данные для всех групп', '', False) ] group_steps: Dict[str, Step] def setupUi(self): main_layout = QVBoxLayout() date_input_layout = QHBoxLayout() self.select_date_label = QLabel("Выберите дату начала семестра") self.date_input = QDateTimeEdit( Semester.closest_semester_start().date()) self.date_input.setCalendarPopup(True) self.accept_date_button = QPushButton("Подтвердить") date_input_layout.addWidget(self.select_date_label) date_input_layout.addWidget(self.date_input, stretch=9) date_input_layout.addWidget(self.accept_date_button) self.hello_message = QLabel( "Выберите файл с расписанием или перетащите его в окно.") self.select_button = QPushButton("Выбрать") main_layout.addLayout(date_input_layout) main_layout.addWidget(self.hello_message, alignment=Qt.AlignHCenter | Qt.AlignVCenter) main_layout.addWidget(self.select_button, alignment=Qt.AlignHCenter | Qt.AlignTop) self.setLayout(main_layout) def __init__(self, professor, loading_session, parent=None): QWidget.__init__(self, parent) IAcceptDrop.__init__(self) ISelectFile.__init__(self) self.professor = professor self.session = professor.session() self.loading_session = loading_session self.setupUi() def change_date(): self.date_input.setEnabled(True) self.revoke_step.emit(self.steps[0]) self.accept_date_button.setText("Подтвердить") self.accept_date_button.clicked.connect(accept_date) with suppress(TypeError): self.accept_date_button.clicked.disconnect(change_date) self.select_button.setEnabled(False) self.select_button.setToolTip("Укажите дату начала семестра") def accept_date(): self.date_input.setEnabled(False) self.step.emit(self.steps[0]) self.accept_date_button.setText("Изменить") self.accept_date_button.clicked.connect(change_date) self.accept_date_button.clicked.disconnect(accept_date) self.select_button.setEnabled(True) self.select_button.setToolTip( "Выберите файл с расписанием занятий") self.accept_date_button.clicked.connect(accept_date) self.select_button.clicked.connect( lambda: self.select_file.emit(self.read_file)) self.drop.connect(self.on_drop) self.requested = False self.group_steps: Dict[Group, Step] = dict() change_date() def on_drop(self, files): if not self.date_input.isEnabled(): for file in files: self.read_file(file) else: QMessageBox().information(self, "", "Сначала укажите дату начала семестра.") def read_file(self, file: QUrl): self.worker = LessonLoader.auto(file=file.path(), start_day=datetime( self.date_input.date().year(), self.date_input.date().month(), self.date_input.date().day()), professor=self.professor, session=self.loading_session) main_layout = self.layout() main_layout.removeWidget(self.hello_message) main_layout.removeWidget(self.select_button) self.hello_message.deleteLater() self.select_button.deleteLater() self.info_message = QLabel( "Предоставте необходимые данные для завершения загрузки") data_layout = QHBoxLayout() discipline_layout = QVBoxLayout() self.discipline_title = QLabel("Обнаружены следующие дисциплины") self.discipline_list = QNewItemsTable(self.session, self.loading_session) for discipline in self.worker.get_disciplines(): self.discipline_list.addItem(discipline) discipline_layout.addWidget(self.discipline_title) discipline_layout.addWidget(self.discipline_list) group_layout = QVBoxLayout() self.group_title = QLabel("Обнаружены следующие группы") self.group_list = QNewItemsTable(self.session, self.loading_session) self.steps = self.steps[:-1] for group in self.worker.get_groups(): self.group_list.addItem(group) group_step = Step(f'Загрузить данные группы {group.name}', '') self.group_steps[group.name]: Dict[str, Step] = group_step self.steps.append(group_step) self.steps_changed.emit(self.steps) student_layout = QHBoxLayout() control_student_layout = QVBoxLayout() self.description_label = QLabel( "Необходимо загрузить информацию о группах.") self.server_load_button = QPushButton("Загрузить с сервера") self.server_load_button.clicked.connect(self.request_students) self.client_load_button = QPushButton("Выбрать файл") self.client_load_button.clicked.connect( lambda x: self.select_file.emit(self.load_group)) list_student_layout = QVBoxLayout() self.tabs = QTabWidget() self.students_lists: Dict[Group, QListWidget] = dict() for group in self.worker.get_groups(): list_widget = QNewItemsTable(self.session, self.loading_session) self.students_lists[group] = list_widget self.tabs.addTab(list_widget, group.name) for group in self.worker.get_groups(): if len(group.students): self._apply_group(group_name=group.name, students=group.students) self.step.emit(self.group_steps[group.name]) list_student_layout.addWidget(QLabel("Списки групп")) list_student_layout.addWidget(self.tabs) control_student_layout.addWidget(self.description_label) control_student_layout.addWidget(self.server_load_button) control_student_layout.addWidget(self.client_load_button) student_layout.addLayout(control_student_layout) student_layout.addLayout(list_student_layout) group_layout.addWidget(self.group_title) group_layout.addWidget(self.group_list) data_layout.addLayout(discipline_layout) data_layout.addLayout(group_layout) main_layout.addLayout(data_layout, stretch=1) main_layout.addWidget(QSeparator(Qt.Horizontal)) main_layout.addLayout(student_layout, stretch=10) self.step.emit(self.steps[1]) def check_groups(self, groups: List[Group]): for index, group in enumerate(groups): existing_group = self.session.query(Group).filter( Group.name == group.name).first() if existing_group is not None: students = Student.of(existing_group) if len(students) > 0: self._apply_group(existing_group.name, existing_group.students) def load_group(self, file: QUrl): group_loader = GroupLoader.auto(file=file.path(), professor=self.professor, session=self.loading_session) group = group_loader.get_group() self._apply_group(group.name, group_loader.get_students_list()) def _apply_group(self, group_name: str, students: List[Student]): group: Group = list( filter(lambda x: x.name == group_name, self.students_lists.keys()))[0] list_widget = self.students_lists[group] list_widget.clear() for student in students: self.loading_session.add(student) list_widget.addItem(student) self.loading_session.flush() self.step.emit(self.group_steps[group.name]) def request_students(self): def apply_response(group: GroupAPI.GroupResponse): self._apply_group(group_name=group.name, students=group.students) if not self.requested: self.managers = list() for group in self.students_lists.keys(): self.managers.append( QBisitorRequest(address='/api/group', user=self.professor, data={'name': group.name}, on_finish=apply_response)) self.requested = True else: QMessageBox().information( self, "", "Вы уже запросили информацию с сервера.")