Compare commits

..

No commits in common. "ee79b9d4c5bfb1d883ff72aa7734677d3593a453" and "30cce3608ae05cb92f72a88d322ad68fbd89cc5c" have entirely different histories.

3 changed files with 36 additions and 44 deletions

View File

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

View File

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

View File

@ -4,7 +4,8 @@ from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
SQLALCHEMY_DATABASE_URL = "sqlite+aiosqlite:///./sql_app.db"
SQLALCHEMY_DATABASE_URL = 'postgresql+asyncpg://postgres:D560c34V112Ak@localhost/porridger'
engine = create_async_engine(SQLALCHEMY_DATABASE_URL, echo=True)
SessionLocal = sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False)