Подключил менеджер в app.py

This commit is contained in:
serafim.urukov 2021-07-29 22:15:40 +03:00
parent eec8d1b2d5
commit 815bb0e471
5 changed files with 85 additions and 57 deletions

View File

@ -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__":

View File

@ -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])
)

View File

@ -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,
}
)

View File

@ -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}",
)

View File

@ -1 +1,2 @@
python-telegram-bot==13.7
python-telegram-bot==13.7
requests==2.26.0