Наработки вовы и димы

This commit is contained in:
MatManSky 2023-08-31 21:05:38 +03:00
parent 30cce3608a
commit c43814ccd4
2 changed files with 43 additions and 34 deletions

View File

@ -1,6 +1,7 @@
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import Annotated from typing import Annotated
from fastapi import Depends from fastapi import Depends
from sqlalchemy import select
from . import auth_utils, orm_models, pydantic_schemas from . import auth_utils, orm_models, pydantic_schemas
import datetime import datetime
@ -11,7 +12,7 @@ BASE_URL='https://geointelect2.gate.petersburg.ru'#адрес сайта и мо
my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A' my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A'
# Загружаем стихи # Загружаем стихи
def add_poems_to_db(db: Session): async def add_poems_to_db(db: Session):
f1 = open('text121.txt', encoding='utf-8', mode='r')#открыть фаил для чтения на русском f1 = open('text121.txt', encoding='utf-8', mode='r')#открыть фаил для чтения на русском
for a in range(1, 110): for a in range(1, 110):
f1.seek(0)#перейти к началу f1.seek(0)#перейти к началу
@ -42,10 +43,9 @@ def add_poems_to_db(db: Session):
# close the file # close the file
f1.close() f1.close()
async def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: Annotated[Session, Depends(auth_utils.get_session)]):
def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: Annotated[Session, Depends(auth_utils.get_session)]):
"""Функция для последовательного применения различных фильтров (через схему SortAnnouncements)""" """Функция для последовательного применения различных фильтров (через схему SortAnnouncements)"""
res = db.query(orm_models.Announcement) res = await db.execute(select(orm_models.Announcement)).scalars().all()
fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения) fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения)
# проходим по названиям фильтров и их значениям # проходим по названиям фильтров и их значениям
for name, filt in fields.items(): for name, filt in fields.items():
@ -53,17 +53,17 @@ def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: Annotated[Session
if filt is not None: if filt is not None:
d = {name: filt} d = {name: filt}
# фильтруем # фильтруем
res = res.filter_by(**d) res = await res.filter_by(**d)
# возвращаем все подходящие объявления # возвращаем все подходящие объявления
return res.all() await res.all()
def check_obsolete(db: Annotated[Session, Depends(auth_utils.get_session)], current_date: datetime.date): async def check_obsolete(db: Annotated[Session, Depends(auth_utils.get_session)], current_date: datetime.date):
""" """
Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки
""" """
# обращаемся ко всем объявлениям бд # обращаемся ко всем объявлениям бд
announcements = db.query(orm_models.Announcement).all() announcements = await db.execute(select(orm_models.Announcement)).scalars().all()
# для каждого объявления # для каждого объявления
for ann in announcements: for ann in announcements:
# если просрочено # если просрочено

View File

@ -10,6 +10,7 @@ from fastapi.requests import Request
from typing import Any, Annotated, List, Union from typing import Any, Annotated, List, Union
from starlette.staticfiles import StaticFiles from starlette.staticfiles import StaticFiles
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy import select
import requests import requests
from uuid import uuid4 from uuid import uuid4
@ -48,9 +49,9 @@ async def announcements_list(db: Annotated[Session, Depends(auth_utils.get_sessi
# параметры для сортировки (схема pydantic schemas.SortAnnouncements) # параметры для сортировки (схема pydantic schemas.SortAnnouncements)
params_to_sort = pydantic_schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category) params_to_sort = pydantic_schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category)
# получаем результат # получаем результат
result = add_poems_and_filters.filter_ann(db=db, schema=params_to_sort) result = await add_poems_and_filters.filter_ann(db=db, schema=params_to_sort)
return result await result
# получаем данные одного объявления # получаем данные одного объявления
@ -60,9 +61,10 @@ async def single_announcement(ann_id:int, db: Annotated[Session, Depends(auth_ut
# В последствии будем вставлять данные в html-форму # В последствии будем вставлять данные в html-форму
try: try:
announcement = db.get(orm_models.Announcement, ann_id) announcement = db.get(orm_models.Announcement, ann_id)
return announcement #announcement = await db.execute(select(orm_models.Announcement)).scalars().all()
await announcement
except: except:
return {"Answer" : False} #если неуданый доступ, то сообщаем об этом await {"Answer" : False} #если неуданый доступ, то сообщаем об этом
# Занести объявление в базу данных # Занести объявление в базу данных
@ -95,9 +97,9 @@ async def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form(
db.add(temp_ancmt) # добавляем в бд db.add(temp_ancmt) # добавляем в бд
db.commit() # сохраняем изменения db.commit() # сохраняем изменения
db.refresh(temp_ancmt) # обновляем состояние объекта db.refresh(temp_ancmt) # обновляем состояние объекта
return {"Answer" : True} await {"Answer" : True}
except: except:
return {"Answer" : False} await {"Answer" : False}
# Удалить объявления из базы # Удалить объявления из базы
@ -105,12 +107,13 @@ async def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form(
async def delete_from_db(announcement: pydantic_schemas.DelAnnouncement, db: Annotated[Session, Depends(auth_utils.get_session)]): # функция удаления объекта из БД async def delete_from_db(announcement: pydantic_schemas.DelAnnouncement, db: Annotated[Session, Depends(auth_utils.get_session)]): # функция удаления объекта из БД
try: try:
# находим объект с заданным id в бд # находим объект с заданным id в бд
to_delete = db.query(orm_models.Announcement).filter(orm_models.Announcement.id==announcement.id).first() #to_delete = db.query(orm_models.Announcement).filter(orm_models.Announcement.id==announcement.id).first()
to_delete = await db.execute(select(orm_models.Announcement)).scalars().filter(orm_models.Announcement.id==announcement.id).first()
db.delete(to_delete) # удаление из БД db.delete(to_delete) # удаление из БД
db.commit() # сохраняем изменения db.commit() # сохраняем изменения
return {"Answer" : True} await {"Answer" : True}
except: except:
return {"Answer" : False} await {"Answer" : False}
# Забронировать объявление # Забронировать объявление
@ -118,7 +121,8 @@ async def delete_from_db(announcement: pydantic_schemas.DelAnnouncement, db: Ann
async def change_book_status(data: pydantic_schemas.Book, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], async def change_book_status(data: pydantic_schemas.Book, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)],
db: Annotated[Session, Depends(auth_utils.get_session)]): db: Annotated[Session, Depends(auth_utils.get_session)]):
# Находим объявление по данному id # Находим объявление по данному id
announcement_to_change = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.id).first() #announcement_to_change = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.id).first()
announcement_to_change = await db.execute(select(orm_models.Announcement).where(orm_models.Announcement.id == data.id)).scalars().first()
# Проверяем, что объявление с данным id существует # Проверяем, что объявление с данным id существует
if not announcement_to_change: if not announcement_to_change:
raise HTTPException(status_code=404, detail="Item not found") raise HTTPException(status_code=404, detail="Item not found")
@ -131,7 +135,7 @@ async def change_book_status(data: pydantic_schemas.Book, current_user: Annotate
# фиксируем изменения в бд # фиксируем изменения в бд
db.commit() db.commit()
db.refresh(announcement_to_change) db.refresh(announcement_to_change)
return {"Success": True} await {"Success": True}
# reginstration # reginstration
@ -140,7 +144,8 @@ async def create_user(nickname: Annotated[str, Form()], password: Annotated[str,
name: Annotated[str, Form()]=None, surname: Annotated[str, Form()]=None, avatar: Annotated[UploadFile, Form()]=None): name: Annotated[str, Form()]=None, surname: Annotated[str, Form()]=None, avatar: Annotated[UploadFile, Form()]=None):
# проверяем, что юзера с введенным никнеймом не существует в бд # проверяем, что юзера с введенным никнеймом не существует в бд
if db.query(orm_models.User).filter(orm_models.User.nickname == nickname).first() == None: #if db.query(orm_models.User).filter(orm_models.User.nickname == nickname).first() == None:
if await db.execute(select(orm_models.User).where(orm_models.User.nickname == nickname)).scalars().first() == None:
# создаем нового юзера # создаем нового юзера
new_user = orm_models.User(nickname=nickname, hashed_password=auth_utils.get_password_hash(password), new_user = orm_models.User(nickname=nickname, hashed_password=auth_utils.get_password_hash(password),
name=name, surname=surname, reg_date=datetime.date.today()) name=name, surname=surname, reg_date=datetime.date.today())
@ -148,8 +153,8 @@ async def create_user(nickname: Annotated[str, Form()], password: Annotated[str,
db.add(new_user) db.add(new_user)
db.commit() db.commit()
db.refresh(new_user) # обновляем состояние объекта db.refresh(new_user) # обновляем состояние объекта
return {"Success": True} await {"Success": True}
return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"} await {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"}
# функция для генерации токена после успешного входа пользователя # функция для генерации токена после успешного входа пользователя
@ -172,13 +177,13 @@ async def login_for_access_token(
access_token = auth_utils.create_access_token( access_token = auth_utils.create_access_token(
data={"user_id": user.id}, expires_delta=access_token_expires data={"user_id": user.id}, expires_delta=access_token_expires
) )
return {"access_token":access_token} await {"access_token":access_token}
# получаем данные успешно вошедшего пользователя # получаем данные успешно вошедшего пользователя
@app.get("/api/users/me", response_model=pydantic_schemas.User) # @app.get("/api/users/me", response_model=pydantic_schemas.User) #
async def read_users_me(current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_active_user)]): async def read_users_me(current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_active_user)]):
return current_user await current_user
# изменяем рейтинг пользователя # изменяем рейтинг пользователя
@ -193,7 +198,7 @@ async def add_points(data: pydantic_schemas.AddRating, current_user: Annotated[p
user.num_of_ratings += 1 user.num_of_ratings += 1
db.commit() db.commit()
db.refresh(user) # обновляем состояние объекта db.refresh(user) # обновляем состояние объекта
return {"Success": True} await {"Success": True}
# получаем рейтинг пользователя # получаем рейтинг пользователя
@ -202,22 +207,25 @@ async def add_points(user_id: int, db: Annotated[Session, Depends(auth_utils.get
user = auth_utils.get_user_by_id(db, user_id=user_id) user = auth_utils.get_user_by_id(db, user_id=user_id)
if not user: if not user:
raise HTTPException(status_code=404, detail="Item not found") raise HTTPException(status_code=404, detail="Item not found")
return {"rating": user.rating} await {"rating": user.rating}
# Отправляем стихи # Отправляем стихи
@app.get("/api/user/poem", response_model=pydantic_schemas.Poem) @app.get("/api/user/poem", response_model=pydantic_schemas.Poem)
async def poems_to_front(db: Annotated[Session, Depends(auth_utils.get_session)]): async def poems_to_front(db: Annotated[Session, Depends(auth_utils.get_session)]):
num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд #num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд
num_of_poems = await db.execute(select(orm_models.Poems)).scalars().count() # определяем кол-во стихов в бд
# если стихов в бд нет # если стихов в бд нет
if num_of_poems < 1: if num_of_poems < 1:
add_poems_and_filters.add_poems_to_db(db) # добавляем поэмы в базу данных add_poems_and_filters.add_poems_to_db(db) # добавляем поэмы в базу данных
num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд num_of_poems = await db.execute(select(orm_models.Poems)).scalars().count() # определяем кол-во стихов в бд
#num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд
rand_id = random.randint(1, num_of_poems) # генерируем номер стихотворения rand_id = random.randint(1, num_of_poems) # генерируем номер стихотворения
poem = db.query(orm_models.Poems).filter(orm_models.Poems.id == rand_id).first() # находим стих в бд #poem = db.query(orm_models.Poems).filter(orm_models.Poems.id == rand_id).first() # находим стих в бд
poem = await db.execute(select(orm_models.Poems).where(orm_models.Poems.id == rand_id)).scalars().first() # находим стих в бд
if not poem: if not poem:
raise HTTPException(status_code=404, detail="Poem not found") raise HTTPException(status_code=404, detail="Poem not found")
return poem await poem
@app.get("/api/trashbox", response_model=List[pydantic_schemas.TrashboxResponse]) @app.get("/api/trashbox", response_model=List[pydantic_schemas.TrashboxResponse])
@ -271,12 +279,12 @@ async def get_trashboxes(data: pydantic_schemas.TrashboxRequest = Depends()):#к
if a in temp_dict["Categories"] and temp_dict not in trashboxes: if a in temp_dict["Categories"] and temp_dict not in trashboxes:
trashboxes.append(temp_dict) trashboxes.append(temp_dict)
uniq_trashboxes = [pydantic_schemas.TrashboxResponse(**ast.literal_eval(el1)) for el1 in set([str(el2) for el2 in trashboxes])] uniq_trashboxes = [pydantic_schemas.TrashboxResponse(**ast.literal_eval(el1)) for el1 in set([str(el2) for el2 in trashboxes])]
return uniq_trashboxes await uniq_trashboxes
@app.get("/{rest_of_path:path}") @app.get("/{rest_of_path:path}")
async def react_app(req: Request, rest_of_path: str): async def react_app(req: Request, rest_of_path: str):
return templates.TemplateResponse('index.html', { 'request': req }) await templates.TemplateResponse('index.html', { 'request': req })
@app.post("/api/announcement/dispose") @app.post("/api/announcement/dispose")
@ -295,12 +303,13 @@ async def dispose(data: pydantic_schemas.DisposeRequest, current_user_schema: An
db.add(new_trashox) db.add(new_trashox)
# в соответствии с логикой api, после утилизации объявление пользователя удаляется # в соответствии с логикой api, после утилизации объявление пользователя удаляется
# находим объявление с айди data.ann_id # находим объявление с айди data.ann_id
ann_to_del = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.ann_id).first() # находим стих в бд #ann_to_del = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.ann_id).first() # находим стих в бд
ann_to_del = await db.execute(select(orm_models.Announcement).where(orm_models.Announcement.id == data.ann_id)).scalars().first() # находим стих в бд
if not ann_to_del: if not ann_to_del:
raise HTTPException(status_code=404, detail="Announcement not found") raise HTTPException(status_code=404, detail="Announcement not found")
# удаляем объявление из бд # удаляем объявление из бд
db.delete(ann_to_del) db.delete(ann_to_del)
db.commit() db.commit()
db.refresh(new_trashox) # обновляем состояние объекта db.refresh(new_trashox) # обновляем состояние объекта
return {"Success": True} await {"Success": True}