diff --git a/.gitignore b/.gitignore index baef7d8..6f6af75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .vscode -/SpreadsheetsService/client_secret.json -/SpreadsheetsService/token.json +SpreadsheetsService/client_secret.json +SpreadsheetsService/token.json +SpreadsheetsService/models/__pycache__/* +SpreadsheetsService/utils/__pycache__/* \ No newline at end of file diff --git a/SpreadsheetsService/models/__init__.py b/SpreadsheetsService/models/__init__.py new file mode 100644 index 0000000..70ea7bf --- /dev/null +++ b/SpreadsheetsService/models/__init__.py @@ -0,0 +1,2 @@ +from .student import * +from .group import * \ No newline at end of file diff --git a/SpreadsheetsService/models/assignment.py b/SpreadsheetsService/models/assignment.py new file mode 100644 index 0000000..9ecdf04 --- /dev/null +++ b/SpreadsheetsService/models/assignment.py @@ -0,0 +1,14 @@ +class Assignment: + """Задание.""" + + def __init__(self, weight: float, values: tuple): + self.weight = weight + self.values = values + + @property + def total(self) -> float: + """Получить общую оценку по заданию. + + `вес*СУММ(рез-ты)` + """ + return sum(self.values) * self.weight diff --git a/SpreadsheetsService/models/const.py b/SpreadsheetsService/models/const.py new file mode 100644 index 0000000..e69de29 diff --git a/SpreadsheetsService/models/group.py b/SpreadsheetsService/models/group.py new file mode 100644 index 0000000..7f7c250 --- /dev/null +++ b/SpreadsheetsService/models/group.py @@ -0,0 +1,64 @@ +from .student import Student + + +class StudentNotFound(Exception): + def __init__(self, message): + self.message = message + super().__init__(self.message) + + +class Group: + """Объект "Группа" для работы со списком студентов. + Используется для работы с множеством студентов. + """ + + def __init__(self, group_id: int): + self.group_id: int = group_id + self.students: Student = [] + + def __iter__(self): + """Делегирует итератор на список студентов. + + Так, можно использовать конструкцию + ```python + for student in group + ``` + """ + return iter(self.students) + + def add_student(self, student: Student): + """Добавить студента в группу.""" + self.students.append(student) + + def get_student_by_number(self, number: int) -> Student: + """Возвращает студента по его номеру, если номера нет, то поднимает + ошибку.""" + f = lambda s: number == s.number + try: + return next(filter(f, self.students)) + except StopIteration: + raise StudentNotFound("Не могу найти студента по номеру") + + def find_students(self, name: str) -> list: + """Найти студентов в группе по имени. + + Возвращает список найденных студентов. Если никого не найдет, вернет + пустой список. + + Arguments: + name (str): текстовое поле, часть имени. + """ + + f = lambda s: name.lower() in s.name.lower() + return list(filter(f, self.students)) + + def top(self, n: int = None) -> list: + """Топ N студентов группы по среднему баллу. Возвращает весь список, + если N не указано.""" + n = len(self.students) if n is None else n + return sorted(self.students, key=lambda student: student.grade)[:n] + + def between(self, a: float, b: float) -> list: + """Список студентов, у которых оценка между [a, b].""" + f = lambda student: a < student.average < b + return list(filter(f, self.students)) diff --git a/SpreadsheetsService/models/student.py b/SpreadsheetsService/models/student.py new file mode 100644 index 0000000..9f81b6b --- /dev/null +++ b/SpreadsheetsService/models/student.py @@ -0,0 +1,25 @@ +from .assignment import Assignment + + +class Student: + """Позволяет выполнять операции над студентами.""" + + def __init__(self, number: int, name: str): + self.number: int = number + self.name: str = name + self.tg_id = None + self.assignments = [] + + @property + def add_assignment(self, assignment: Assignment): + self.assignments.append(assignment) + + @property + def grade(self) -> float: + """Получить среднюю оценку студента по текущему контролю.""" + return 2 + + @property + def score(self): + """Количество баллов у студента.""" + return sum([a.total for a in self.assignments]) diff --git a/SpreadsheetsService/utils/__init__.py b/SpreadsheetsService/utils/__init__.py new file mode 100644 index 0000000..e69de29