def prepare_data(root, semester, group_by: Type[_DBObject]): data = [] year = None for user in root: user_name = user.short_name() lessons = Lesson.of(user) groups = set(group_by.of(user)) for lesson in lessons: if (lesson.semester == semester or (isinstance(semester, (set, list)) and lesson.semester in semester)) \ and lesson.completed: year = lesson.date.year lesson_visitation = set(Visitation.of(lesson)) & set(Visitation.of(user)) lesson_students = set(Student.of(lesson)) & set(Student.of(user)) for item in list(set(group_by.of(lesson)) & groups): data.append({ 'user': user_name, 'visit': len(set(Visitation.of(item)) & lesson_visitation), 'total': len(set(Student.of(item)) & lesson_students), 'date': lesson.date, 'group_by': item.short_name(), 'day': lesson.date.timetuple().tm_yday, 'week': lesson.week }) return data, year
def __init__(self, file_name, group, discipline, session): file = xlrd.open_workbook(file_name) self.file = file.sheet_by_index(0) assert set([g.name for g in group]) == set(self.group_name()) assert discipline.name.lower() == self.discipline_name().lower() lessons = lessons_of(group, discipline) year = sorted(lessons, key=lambda x: x.date)[0].date.year student_of_group = Student.of(group) for col in range(3, self.file.ncols): if self.file.cell(1, col).value in ['', None]: print((1, col), 'is None') break date = self.get_date(col, year) lesson = list(filter(lambda x: x.date == date, lessons)) if len(lesson) == 0: continue lesson = lesson[0] for row in range(self.file.nrows): student = self.get_student(row, student_of_group) if student is None: break print('new_visit', student, lesson) Visitation.get_or_create(session, student_id=student.id, lesson_id=lesson.id)
def user_start_lesson(self, status): students = Student.of(self.group.current()) lesson = self.lesson.current() self.visit_marker = MarkVisitProcess( students, lesson, error_callback=self.lesson_finished.emit) self.visit_marker.new_visit.connect(self.table.new_visit) self.lesson_started.emit(lesson)
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 show_stats(): visits = Visitation.of(lesson) students = Student.of(lesson) if lesson.completed: msg = f"Посетило {len(visits)} из {len(students)} ({round(len(visits) * 100 / (len(students)))}%)." else: msg = "Занятие не проведено." QMessageBox().information( self, "Статистика", msg )
def post(self, data: dict, auth: Auth, **kwargs): session = auth.session() group = session.query(Group).filter_by(**data, _is_deleted=False).first() if group is not None: students = Student.of(group) return { 'name': group.name, 'id': group.id, 'students': sorted(students, key=lambda x: x.full_name()) } else: raise NoDataError(f"группа с параметрами ({data}) не найдена")
def setData(self, lessons, groups): if groups is None or len(groups) == 0 or lessons is None or len( lessons) == 0: return students = sorted(Student.of(groups), key=lambda x: x.full_name()) model = VisitModel(lessons, students) self.new_visit.connect(model.on_new_visit) self.lesson_start.connect(model.on_lesson_start) self.view.setModel(model) percent_vertical_model = PercentVerticalModel(lessons, students) percent_vertical_model.mimic(self.view.model()) self.view_show_color_rate.connect( percent_vertical_model.view_show_color_rate) self.percent_vertical_view.setModel(percent_vertical_model) percent_horizontal_model = PercentHorizontalModel(lessons, students) percent_horizontal_model.mimic(self.view.model()) self.percent_horizontal_view.setModel(percent_horizontal_model) model.item_changed.connect(percent_horizontal_model.data_updated) model.item_changed.connect(percent_vertical_model.data_updated) self.view.select_row.connect(model.select_row)
def _get_students(self, lesson_groups, groups): students = Student.of(lesson_groups) if groups is not None: students &= Student.of(groups) return students
item.setCheckState(Qt.Unchecked) item.setSizeHint(QSize(self.width(), 25)) def setItems(self, items): for item in items: self.addItem(item) def clear(self): super().clear() self.setModel(QStandardItemModel(self)) self.items = [] if self.with_all: self.addItem('All') # def addItem(self, *__args): # model: QStandardItemModel = self.model() # model.appendRow() if __name__ == '__main__': app = QApplication(sys.argv) widget = CheckableComboBox() for st in Student.of(Professor.get(id=1)): widget.addItem(st) widget.show() widget.checked.connect(lambda x: print(widget.current())) sys.exit(app.exec_())
percent_vertical_model = PercentVerticalModel(lessons, students) percent_vertical_model.mimic(self.view.model()) self.view_show_color_rate.connect( percent_vertical_model.view_show_color_rate) self.percent_vertical_view.setModel(percent_vertical_model) percent_horizontal_model = PercentHorizontalModel(lessons, students) percent_horizontal_model.mimic(self.view.model()) self.percent_horizontal_view.setModel(percent_horizontal_model) model.item_changed.connect(percent_horizontal_model.data_updated) model.item_changed.connect(percent_vertical_model.data_updated) self.view.select_row.connect(model.select_row) # self.view.select_row.connect(percent_vertical_model.select_row) if __name__ == '__main__': app = QApplication(sys.argv) auth = Auth.log_in('VAE', '123456') group = Group.of(auth.user)[0] v = VisitTableWidget() v.setData(Lesson.of(group), Student.of(group)) v.view.selectColumn(2) v.show() sys.exit(app.exec_())