From 10ced6941dea8f1ad8ca13ca16c72fd379ce2a4c Mon Sep 17 00:00:00 2001 From: "serafim.urukov" Date: Mon, 26 Jul 2021 23:47:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B,=20=D1=87=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=BB=D0=B5=D0=B3=D1=87=D0=B5=20=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB=D0=BE=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=81=D0=BE=20=D1=81=D1=82=D1=83=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0=B8=20=D0=B8=20=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=BF=D0=BF=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 ++- SpreadsheetsService/models/__init__.py | 2 + SpreadsheetsService/models/assignment.py | 14 ++++++ SpreadsheetsService/models/const.py | 0 SpreadsheetsService/models/group.py | 64 ++++++++++++++++++++++++ SpreadsheetsService/models/student.py | 25 +++++++++ SpreadsheetsService/utils/__init__.py | 0 7 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 SpreadsheetsService/models/__init__.py create mode 100644 SpreadsheetsService/models/assignment.py create mode 100644 SpreadsheetsService/models/const.py create mode 100644 SpreadsheetsService/models/group.py create mode 100644 SpreadsheetsService/models/student.py create mode 100644 SpreadsheetsService/utils/__init__.py 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