diff --git a/SpreadsheetsService/app.py b/SpreadsheetsService/app.py index 5cbacde..7a4e52b 100644 --- a/SpreadsheetsService/app.py +++ b/SpreadsheetsService/app.py @@ -1,7 +1,9 @@ -from flask import Flask +import flask import time +import models +from manager import * -app = Flask(__name__) +app = flask.Flask(__name__) @app.route("/") @@ -11,8 +13,12 @@ def hello_world(): @app.route("/auth") def auth(): - is_auth = int(time.time()) - return f"{is_auth % 2 == 0}" + # TODO: return json text instead of text/html. + token = flask.request.args.get("token") + tg_id = flask.request.args.get("tg_id") + manager = Manager() + student = manager.get_student_by_name("Дзюба") + return str(student) if __name__ == "__main__": diff --git a/SpreadsheetsService/manager/manager.py b/SpreadsheetsService/manager/manager.py index 6a40287..abd374a 100644 --- a/SpreadsheetsService/manager/manager.py +++ b/SpreadsheetsService/manager/manager.py @@ -1,4 +1,6 @@ import os.path +import pathlib +from sys import path from googleapiclient.discovery import _MEDIA_SIZE_BIT_SHIFTS, build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request @@ -11,54 +13,61 @@ from models.assignment import Assignment STUDENT_NUMBERS = 0 STUDENT_NAMES = 1 -GROUP_IDS = 2 # for StudentList and AssignmentList +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 +TOKEN_FILE = pathlib.Path() / "manager" / "token.json" +CLIENT_SECRET_FILE = pathlib.Path() / "manager" / "client_secret.json" + class Manager: """Позволяет выполнять операции с Google таблицами.""" - def __init__(self, spreadsheet_id: str='1GKfmLwDVGjcpXFQAUyxM4RMQ5Nx6HAZ5VWenz2z--d0', - scopes: list=['https://www.googleapis.com/auth/spreadsheets.readonly']): - + def __init__( + self, + spreadsheet_id: str = "1GKfmLwDVGjcpXFQAUyxM4RMQ5Nx6HAZ5VWenz2z--d0", + scopes: list = ["https://www.googleapis.com/auth/spreadsheets.readonly"], + ): + self.spreadsheet_id = spreadsheet_id creds = None - if os.path.exists('token.json'): - creds = Credentials.from_authorized_user_file('token.json', scopes) + if os.path.exists(TOKEN_FILE): + creds = Credentials.from_authorized_user_file(TOKEN_FILE, scopes) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: + print(CLIENT_SECRET_FILE) flow = InstalledAppFlow.from_client_secrets_file( - 'client_secret.json', scopes) + str(CLIENT_SECRET_FILE), scopes + ) creds = flow.run_local_server(port=0) # Save the credentials for the next run - with open('token.json', 'w') as token: + with TOKEN_FILE.open("w") as token: token.write(creds.to_json()) - service = build('sheets', 'v4', credentials=creds) + service = build("sheets", "v4", credentials=creds) self.sheet = service.spreadsheets() - - - - def get_values(self, range_name: str = 'StudentList') -> list: # TODO: change subject + 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', []) - - + 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: """Получить группу со студентами.""" @@ -69,30 +78,31 @@ class Manager: 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_id, row[TELEGRAM_IDS])) + 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] + f = lambda row: name in row[STUDENT_NAMES] try: row = next(filter(f, values)) - return Student(int(row[STUDENT_NUMBERS]), name, - row[GROUP_IDS], row[TELEGRAM_IDS]) + 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.""" @@ -101,31 +111,21 @@ class Manager: 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) + 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') + values = self.get_values("AssignmentList") - f = lambda row: student.group_id == int(row[GROUP_IDS]) # TODO add subject - for row in filter(f,values): + 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])) - - - - - - - - - + student.add_assignment( + Assignment(row[ASSIGNMENT_NAMES], ass_values, row[ASSIGNMENT_WEIGHTS]) + ) diff --git a/SpreadsheetsService/models/student.py b/SpreadsheetsService/models/student.py index 75be056..6040665 100644 --- a/SpreadsheetsService/models/student.py +++ b/SpreadsheetsService/models/student.py @@ -1,10 +1,11 @@ from .assignment import Assignment +import json class Student: """Позволяет выполнять операции над студентами.""" - def __init__(self, number: int, name: str, group_id : int, tg_id : int = None): + def __init__(self, number: int, name: str, group_id: int, tg_id: int = None): self.number: int = number self.name: str = name self.group_id: int = group_id @@ -23,3 +24,13 @@ class Student: def score(self): """Количество баллов у студента.""" return sum([a.total for a in self.assignments]) + + def __str__(self): + return json.dumps( + { + "number": self.number, + "name": self.name, + "group_id": self.group_id, + "tg_id": self.tg_id, + } + ) diff --git a/TelegramBot/bot.py b/TelegramBot/bot.py index 0dba322..3254a81 100644 --- a/TelegramBot/bot.py +++ b/TelegramBot/bot.py @@ -24,11 +24,21 @@ def start(update, context): p = context.args[0] if len(context.args) > 0 else None - data = requests.get("http://127.0.0.1:5000/auth").text + if p is None: + context.bot.send_message( + chat_id=update.effective_chat.id, + text="Нет доступа к боту", + ) + return + + data = requests.get( + "http://127.0.0.1:5000/auth", + params={"token": p, "tg_id": update.effective_chat.id}, + ).json() context.bot.send_message( chat_id=update.effective_chat.id, - text=f"Hello World! {context.args} Authorized? {data}", + text=f"Привет, {data}", ) diff --git a/TelegramBot/requirements.txt b/TelegramBot/requirements.txt index 5b5d3aa..42c3376 100644 --- a/TelegramBot/requirements.txt +++ b/TelegramBot/requirements.txt @@ -1 +1,2 @@ -python-telegram-bot==13.7 \ No newline at end of file +python-telegram-bot==13.7 +requests==2.26.0 \ No newline at end of file