예제 #1
0
    def parse(person_data: dict, person_id: int,
              edupage: EdupageModule) -> Optional[EduAccount]:
        account_type = EduAccount.recognize_account_type(person_data)

        if account_type == EduAccountType.STUDENT:
            class_id = ModuleHelper.parse_int(person_data.get("classid"))
            name = DbiHelper(edupage).fetch_student_name(person_id)
            gender = Gender.parse(person_data.get("gender"))
            student_since = ModuleHelper.strptime_or_none(
                person_data.get("datefrom"), "%Y-%m-%d")
            number_in_class = ModuleHelper.parse_int(
                person_data.get("numberinclass"))

            ModuleHelper.assert_none(name)

            return EduStudent(person_id, name, gender, student_since, class_id,
                              number_in_class)
        elif account_type == EduAccountType.TEACHER:
            classroom_id = person_data.get("classroomid")
            classroom_name = DbiHelper(edupage).fetch_classroom_number(
                classroom_id) if ModuleHelper.parse_int(classroom_id) else ""

            name = DbiHelper(edupage).fetch_teacher_name(person_id)

            gender = Gender.parse(person_data.get("gender"))
            if teacher_since_str := person_data.get("datefrom"):
                teacher_since = datetime.strptime(teacher_since_str,
                                                  "%Y-%m-%d")
            else:
                teacher_since = None

            if teacher_to_str := person_data.get("dateto"):
                teacher_to = datetime.strptime(teacher_to_str, "%Y-%m-%d")
예제 #2
0
    def get_teachers(self) -> Optional[list]:
        teachers = DbiHelper(self.edupage).fetch_teacher_list()
        if teachers is None:
            return None

        result = []
        for teacher_id_str in teachers:
            if not teacher_id_str:
                continue

            teacher_id = int(teacher_id_str)
            teacher_data = teachers.get(teacher_id_str)

            teacher = EduAccount.parse(teacher_data, teacher_id, self.edupage)
            result.append(teacher)

        return result
예제 #3
0
    def get_students(self) -> Optional[list]:
        students = DbiHelper(self.edupage).fetch_student_list()
        if students is None:
            return None

        result = []
        for student_id_str in students:
            if not student_id_str:
                continue

            student_id = int(student_id_str)
            student_data = students.get(student_id_str)

            student = EduAccount.parse(student_data, student_id, self.edupage)
            result.append(student)

        return result
예제 #4
0
    def get_timetable(self, date: datetime) -> Optional[Timetable]:
        dp = self.__get_dp()

        dates = dp.get("dates")
        date_plans = dates.get(date.strftime("%Y-%m-%d"))
        if date_plans is None:
            raise MissingDataException()

        plan = date_plans.get("plan")

        lessons = []
        for subject in plan:
            header = subject.get("header")
            if len(header) == 0:
                continue

            subject_id = int(subject.get("subjectid"))
            if subject_id:
                subject_name = DbiHelper(
                    self.edupage).fetch_subject_name(subject_id)
            else:
                subject_name = header[0].get("text")

            teachers = []
            teacher_ids = subject.get("teacherids")
            if teacher_ids is not None and len(teacher_ids) != 0:
                for teacher_id_str in teacher_ids:
                    if not teacher_id_str:
                        continue

                    teacher_id = int(teacher_id_str)
                    teacher = People(self.edupage).get_teacher(teacher_id)

                    teachers.append(teacher)

            classrooms = []
            classroom_ids = subject.get("classroomids")
            if classroom_ids is not None and len(classroom_ids) != 0:
                for classroom_id_str in classroom_ids:
                    if not classroom_id_str:
                        continue

                    classroom_id = int(classroom_id_str)
                    classroom_number = DbiHelper(
                        self.edupage).fetch_classroom_number(classroom_id)

                    classrooms.append(classroom_number)

            start_of_lesson_str = subject.get("starttime")
            end_of_lesson_str = subject.get("endtime")

            ModuleHelper.assert_none(start_of_lesson_str, end_of_lesson_str)

            start_of_lesson = datetime.strptime(start_of_lesson_str, "%H:%M")
            end_of_lesson = datetime.strptime(end_of_lesson_str, "%H:%M")

            online_lesson_link = subject.get("ol_url")

            lesson = Lesson(teachers, classrooms, start_of_lesson,
                            end_of_lesson, online_lesson_link, subject_id,
                            subject_name)
            lessons.append(lesson)

        return Timetable(lessons)
예제 #5
0
    def get_timetable_for_person(self, id: int,
                                 date: datetime) -> List[LessonSkeleton]:
        all_teachers = People(self.edupage).get_teachers()
        students = People(self.edupage).get_students()

        def teacher_by_id(id: int):
            filtered = list(filter(lambda x: x.person_id == id, all_teachers))
            if not filtered:
                raise MissingDataException(
                    f"Teacher with id {id} doesn't exist!")

            return filtered[0]

        def student_by_id(id: int):
            filtered = list(filter(lambda x: x.person_id == id, students))
            if not filtered:
                raise MissingDataException(
                    f"Student with id {id} doesn't exist!")

            return filtered[0]

        def classroom_by_id(id: int):
            return DbiHelper(self.edupage).fetch_classroom_number(id)

        table = None
        try:
            teacher_by_id(id)
            table = "teachers"
        except:
            try:
                student_by_id(id)
                table = "students"
            except:
                if classroom_by_id(id):
                    table = "classrooms"

        if not table:
            raise MissingDataException(
                f"Teacher, student or class with id {id} doesn't exist!")

        timetable_data = self.__get_timetable_data(id, table, date)

        skeletons = []
        for skeleton in timetable_data:
            date_str = skeleton.get("date")
            date = datetime.strptime(date_str, "%Y-%m-%d")

            start_time_str = skeleton.get("starttime")
            start_time_dt = datetime.strptime(start_time_str, "%H:%M")
            start_time = time(start_time_dt.hour, start_time_dt.minute)

            end_time_str = skeleton.get("endtime")
            end_time_dt = datetime.strptime(end_time_str, "%H:%M")
            end_time = time(end_time_dt.hour, end_time_dt.minute)

            subject_id_str = skeleton.get("subjectid")
            subject_id = int(
                subject_id_str) if subject_id_str.isdigit() else None

            subject_name = None
            if subject_id is not None:
                subject_name = DbiHelper(
                    self.edupage).fetch_subject_name(subject_id)

            classes = [int(id) for id in skeleton.get("classids")]
            groups = skeleton.get("groupnames")
            teachers = [
                teacher_by_id(int(id)) for id in skeleton.get("teacherids")
            ]
            classrooms = [
                classroom_by_id(int(id)) for id in skeleton.get("classroomids")
            ]

            duration = (skeleton.get("durationperiods")
                        if skeleton.get("durationperiods") is not None else 1)

            new_skeleton = LessonSkeleton(date.weekday(), start_time, end_time,
                                          subject_id, subject_name, classes,
                                          groups, classrooms, duration,
                                          teachers)
            skeletons.append(new_skeleton)
        return skeletons
예제 #6
0
 def classroom_by_id(id: int):
     return DbiHelper(self.edupage).fetch_classroom_number(id)
예제 #7
0
    def get_grades(self) -> list[EduGrade]:
        grade_data = self.__get_grade_data()

        grades = grade_data.get("vsetkyZnamky")
        grade_details = grade_data.get("vsetkyUdalosti").get("edupage")

        output = []
        for grade in grades:
            # ID
            event_id_str = grade.get("udalostid")
            if not event_id_str:
                continue

            event_id = int(event_id_str)

            # Title
            details = grade_details.get(event_id_str)
            title = details.get("p_meno")

            # Grade
            grade_raw = grade.get("data").split(" (", 1)
            grade_n = float(grade_raw[0])
            try:
                comment = grade_raw[1].rsplit(")", 1)[0]
            except IndexError:
                comment = None

            # Date
            date_str = grade.get("datum")
            date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")

            # Subject ID and name
            subject_id_str = details.get("PredmetID")
            if subject_id_str is None or subject_id_str == "vsetky":
                continue

            subject_id = int(subject_id_str)
            subject_name = DbiHelper(self.edupage).fetch_subject_name(subject_id)

            # Teacher
            teacher_id_str = details.get("UcitelID")
            if teacher_id_str is None:
                teacher = None
            else:
                teacher_id = int(teacher_id_str)
                teacher_data = DbiHelper(self.edupage).fetch_teacher_data(teacher_id)

                teacher = EduTeacher.parse(teacher_data, teacher_id, self.edupage)

            # Maximal points and importance
            grade_type = details.get("p_typ_udalosti")
            if grade_type == "1":
                # Normal grade (1 – 5)
                max_points = None
                importance = float(details.get("p_vaha")) / 20
            elif grade_type == "2":
                # Points grade (in points – e.g. 0 – 20 points)
                max_points = int(details.get("p_vaha"))
                importance = None
            elif grade_type == "3":
                # Percental grade (0 – 100 %)
                max_points = int(details.get("p_vaha_body"))
                importance = float(details.get("p_vaha")) / 20

            # Verbal and percents
            try:
                verbal = False

                if max_points:
                    percent = round(float(grade_n) / float(max_points) * 100, 2)
                elif max_points == 0:
                    percent = float("inf")
                else:
                    percent = None
            except:
                verbal = True

            grade = EduGrade(event_id, title, grade_n, comment, date, subject_id,
                             subject_name, teacher, max_points, importance, verbal, percent)
            output.append(grade)

        return output
예제 #8
0
    def get_notifications(self):
        output = []

        timeline_items = self.edupage.data.get("items")

        for event in timeline_items:
            event_id_str = event.get("timelineid")
            if not event_id_str:
                continue

            event_id = int(event_id_str)
            event_data = json.loads(event.get("data"))

            event_type_str = event.get("typ")
            if not event_id_str:
                continue
            event_type = EventType.parse(event_type_str)

            if event_type is None:
                print(event_type_str)

            event_timestamp = datetime.strptime(event.get("timestamp"),
                                                "%Y-%m-%d %H:%M:%S")
            text = event.get("text")

            # what about different languages?
            # for message event type
            if text.startswith("Dôležitá správa"):
                text = event_data.get("messageContent")

            if text == "":
                try:
                    text = event_data.get("nazov")
                except:
                    text = ""

            # todo: add support for "*"
            recipient_name = event.get("user_meno")
            recipient_data = DbiHelper(
                self.edupage).fetch_person_data_by_name(recipient_name)

            if recipient_name in ["*", "Celá škola"]:
                recipient = "*"
            elif type(recipient_name) == str:
                recipient = recipient_name
            else:
                ModuleHelper.assert_none(recipient_data)

                recipient = EduAccount.parse(recipient_data,
                                             recipient_data.get("id"),
                                             self.edupage)

            # todo: add support for "*"
            author_name = event.get("vlastnik_meno")
            author_data = DbiHelper(
                self.edupage).fetch_person_data_by_name(author_name)

            if author_name == "*":
                author = "*"
            elif type(author_name) == str:
                author = author_name
            else:
                ModuleHelper.assert_none(author_data)
                author = EduAccount.parse(author_data, author_data.get("id"),
                                          self.edupage)

            additional_data = event.get("data")
            if additional_data and type(additional_data) == str:
                additional_data = json.loads(additional_data)

            event = TimelineEvent(event_id, event_timestamp, text, author,
                                  recipient, event_type, additional_data)
            output.append(event)
        return output
예제 #9
0
    def get_student(self, student_id: int) -> Optional[EduStudent]:
        student_data = DbiHelper(self.edupage).fetch_student_data(student_id)
        if student_data is None:
            return None

        return EduAccount.parse(student_data, student_id, self.edupage)
예제 #10
0
    def get_teacher(self, teacher_id: int) -> Optional[EduTeacher]:
        teacher_data = DbiHelper(self.edupage).fetch_teacher_data(teacher_id)
        if teacher_data is None:
            return None

        return EduAccount.parse(teacher_data, teacher_id, self.edupage)