diff --git a/SpreadsheetsService/manager/manager.py b/SpreadsheetsService/manager/manager.py index 0bdd664..6a40287 100644 --- a/SpreadsheetsService/manager/manager.py +++ b/SpreadsheetsService/manager/manager.py @@ -6,6 +6,18 @@ from google.oauth2.credentials import Credentials from models.student import Student from models.group import Group +from models.group import StudentNotFound +from models.assignment import Assignment + +STUDENT_NUMBERS = 0 +STUDENT_NAMES = 1 +GROUP_IDS = 2 # for StudentList and AssignmentList +TELEGRAM_IDS = 3 +ASSIGNMENT_NAMES = 1 +ASSIGNMENT_SUBJECT = 3 +ASSIGNMENT_WEIGHTS = 4 +ASSIGNMENT_RANGES = 5 +ASSIGNMENT_ALLOWS = 6 class Manager: """Позволяет выполнять операции с Google таблицами.""" @@ -35,22 +47,85 @@ class Manager: self.sheet = service.spreadsheets() + + + def get_values(self, range_name: str = 'StudentList') -> list: # TODO: change subject + """Получить значения с таблицы.""" + + result = self.sheet.values().get(spreadsheetId=self.spreadsheet_id, + range=range_name).execute() + + return result.get('values', []) + + + + def get_group(self, group_id: int) -> Group: """Получить группу со студентами.""" - GROUPS = 2 - STUDENT_NUMBERS = 0 - STUDENT_NAMES = 1 - - result = self.sheet.values().get(spreadsheetId=self.spreadsheet_id, - range='Студенты!A2:Z').execute() - values = result.get('values', []) + values = self.get_values() group = Group(group_id) - f = lambda row: group_id == int(row[GROUPS]) + f = lambda row: group_id == int(row[GROUP_IDS]) for row in filter(f, values): - group.add_student(Student(int(row[STUDENT_NUMBERS]), row[STUDENT_NAMES])) + group.add_student(Student(int(row[STUDENT_NUMBERS]), row[STUDENT_NAMES], + group_id, row[TELEGRAM_IDS])) return group + + + + def get_student_by_name(self, name: str) -> Student: + """Получить студента по имени.""" + + values = self.get_values() + + f = lambda row: name == row[STUDENT_NAMES] + try: + row = next(filter(f, values)) + return Student(int(row[STUDENT_NUMBERS]), name, + row[GROUP_IDS], row[TELEGRAM_IDS]) + except StopIteration: + raise StudentNotFound("Не могу найти студента по имени") + + + + + def get_student_by_tg_id(self, tg_id: int) -> Student: + """Получить студента по telegram id.""" + + values = self.get_values() + + f = lambda row: tg_id == row[TELEGRAM_IDS] + try: + row = next(filter(f, values)) + return Student(int(row[STUDENT_NUMBERS]), row[STUDENT_NAMES], + row[GROUP_IDS], tg_id) + except StopIteration: + raise StudentNotFound("Не могу найти студента по telegram id") + + + + + def set_assignments_for_student(self, student: Student): + """Добавить задания студенту.""" + + values = self.get_values('AssignmentList') + + f = lambda row: student.group_id == int(row[GROUP_IDS]) # TODO add subject + for row in filter(f,values): + assignment_value = self.get_values(row[ASSIGNMENT_RANGES]) + ass_values = list(map(float, assignment_value[student.number])) + student.add_assignment(Assignment(row[ASSIGNMENT_NAMES], ass_values, + row[ASSIGNMENT_WEIGHTS])) + + + + + + + + +