fixing trashbox

This commit is contained in:
DmitryGantimurov 2023-08-11 14:17:14 +03:00
parent 73eaf00b96
commit f25ac9aa0d
3 changed files with 78 additions and 50 deletions

View File

@ -41,23 +41,23 @@ app.mount("/uploads", StaticFiles(directory = "./uploads"))
# add_poems_to_db(database) # add_poems_to_db(database)
@app.get("/api/announcements", response_model=List[schemas.Announcement])#адрес объявлений @app.get("/api/announcements", response_model=List[schemas.Announcement], db: Annotated[Session, Depends(utils.get_db)])#адрес объявлений
def announcements_list(obsolete: Union[bool, None] = False, user_id: Union[int, None] = None, metro: Union[str, None] = None, def announcements_list(obsolete: Union[bool, None] = False, user_id: Union[int, None] = None, metro: Union[str, None] = None,
category: Union[str, None] = None): category: Union[str, None] = None):
# параметры для сортировки (схема pydantic schemas.SortAnnouncements) # параметры для сортировки (схема pydantic schemas.SortAnnouncements)
params_to_sort = schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category) params_to_sort = schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category)
# получаем результат # получаем результат
result = get_query_results(db=database, schema=params_to_sort) result = get_query_results(db=db, schema=params_to_sort)
return result return result
@app.get("/api/announcement")#адрес объявления @app.get("/api/announcement") #
def single_announcement(user_id:int): def single_announcement(ann_id:int, db: Annotated[Session, Depends(utils.get_db)]): # передаем индекс обявления
# Считываем данные из Body и отображаем их на странице. # Считываем данные из Body и отображаем их на странице.
# В последствии будем вставлять данные в html-форму # В последствии будем вставлять данные в html-форму
try: try:
announcement = database.get(models.Announcement, user_id) announcement = db.get(models.Announcement, ann_id)
return {"id": announcement.id, "user_id": announcement.user_id, "name": announcement.name, return {"id": announcement.id, "user_id": announcement.user_id, "name": announcement.name,
"category": announcement.category, "best_by": announcement.best_by, "address": announcement.address, "category": announcement.category, "best_by": announcement.best_by, "address": announcement.address,
"description": announcement.description, "metro": announcement.metro, "latitude": announcement.latitude, "description": announcement.description, "metro": announcement.metro, "latitude": announcement.latitude,
@ -72,7 +72,7 @@ def single_announcement(user_id:int):
def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], bestBy: Annotated[datetime.date, Form()], def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], bestBy: Annotated[datetime.date, Form()],
address: Annotated[str, Form()], longtitude: Annotated[float, Form()], latitude: Annotated[float, Form()], address: Annotated[str, Form()], longtitude: Annotated[float, Form()], latitude: Annotated[float, Form()],
description: Annotated[str, Form()], metro: Annotated[str, Form()], current_user: Annotated[schemas.User, Depends(utils.get_current_active_user)], description: Annotated[str, Form()], metro: Annotated[str, Form()], current_user: Annotated[schemas.User, Depends(utils.get_current_active_user)],
src: Union[UploadFile, None] = None, trashId: Annotated[int, Form()] = None): src: Union[UploadFile, None] = None, trashId: Annotated[int, Form()] = None, db: Annotated[Session, Depends(utils.get_db)]):
try: try:
uploaded_name = "" uploaded_name = ""
if src: if src:
@ -89,9 +89,9 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be
temp_ancmt = models.Announcement(user_id=current_user.id, name=name, category=category, best_by=bestBy, temp_ancmt = models.Announcement(user_id=current_user.id, name=name, category=category, best_by=bestBy,
address=address, longtitude=longtitude, latitude=latitude, description=description, metro=metro, address=address, longtitude=longtitude, latitude=latitude, description=description, metro=metro,
trashId=trashId, booked_by=0) trashId=trashId, booked_by=0)
database.add(temp_ancmt) # добавляем в бд db.add(temp_ancmt) # добавляем в бд
database.commit() # сохраняем изменения db.commit() # сохраняем изменения
database.refresh(temp_ancmt) # обновляем состояние объекта db.refresh(temp_ancmt) # обновляем состояние объекта
return {"Answer" : True} return {"Answer" : True}
except: except:
return {"Answer" : False} return {"Answer" : False}
@ -99,11 +99,11 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be
# Удалить объявления из базы # Удалить объявления из базы
@app.delete("/api/announcement") #адрес объявления @app.delete("/api/announcement") #адрес объявления
def delete_from_db(announcement: schemas.DelAnnouncement): # функция удаления объекта из БД def delete_from_db(announcement: schemas.DelAnnouncement, db: Annotated[Session, Depends(utils.get_db)]): # функция удаления объекта из БД
try: try:
to_delete = database.query(models.Announcement).filter(models.Announcement.id==announcement.id).first() to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first()
database.delete(to_delete) # удаление из БД db.delete(to_delete) # удаление из БД
database.commit() # сохраняем изменения db.commit() # сохраняем изменения
return {"Answer" : True} return {"Answer" : True}
except: except:
return {"Answer" : False} return {"Answer" : False}
@ -111,37 +111,45 @@ def delete_from_db(announcement: schemas.DelAnnouncement): # функция
# Забронировать объявление # Забронировать объявление
@app.post("/api/book") @app.post("/api/book")
def change_book_status(data: schemas.Book): def change_book_status(data: schemas.Book, current_user: Annotated[schemas.User, Depends(utils.get_current_user)],
try: db: Annotated[Session, Depends(utils.get_db)], db: Annotated[Session, Depends(utils.get_db)]):
# Находим объявление по данному id # Находим объявление по данному id
announcement_to_change = database.query(models.Announcement).filter(Announcement.id == data.id).first() announcement_to_change = db.query(models.Announcement).filter(Announcement.id == data.id).first()
# Изменяем поле booked_status на полученный id # Проверяем, что объявление с данным id существует
announcement_to_change.booked_status += 1 if not announcement_to_change:
return {"Success": True} raise HTTPException(status_code=404, detail="Item not found")
except: # Проверяем, что объявление бронирует не владелец
return {"Success": False} if current_user.id == announcement_to_change.user_id:
raise HTTPException(status_code=403, detail="A user can't book his announcement")
else:
# Инкрементируем поле booked_by на 1
announcement_to_change.booked_by += 1
db.commit()
db.refresh(announcement_to_change)
return {"Success": True}
# reginstration # reginstration
@app.post("/api/signup") @app.post("/api/signup")
def create_user(nickname: Annotated[str, Form()], password: Annotated[str, Form()], name: Annotated[str, Form()]=None, def create_user(nickname: Annotated[str, Form()], password: Annotated[str, Form()], name: Annotated[str, Form()]=None,
surname: Annotated[str, Form()]=None, avatar: Annotated[UploadFile, Form()]=None): surname: Annotated[str, Form()]=None, avatar: Annotated[UploadFile, Form()]=None, db: Annotated[Session, Depends(utils.get_db)]):
if database.query(models.User).filter(models.User.nickname == nickname).first() == None: if db.query(models.User).filter(models.User.nickname == nickname).first() == None:
new_user = models.User(nickname=nickname, hashed_password=utils.get_password_hash(password), new_user = models.User(nickname=nickname, hashed_password=utils.get_password_hash(password),
name=name, surname=surname, reg_date=datetime.date.today()) name=name, surname=surname, reg_date=datetime.date.today())
database.add(new_user) db.add(new_user)
database.commit() db.commit()
database.refresh(new_user) # обновляем состояние объекта db.refresh(new_user) # обновляем состояние объекта
return {"Success": True} return {"Success": True}
return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"} return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"}
@app.post("/api/token", response_model=schemas.Token) @app.post("/api/token", response_model=schemas.Token)
async def login_for_access_token( async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()] form_data: Annotated[OAuth2PasswordRequestForm, Depends()], db: Annotated[Session, Depends(utils.get_db)]
): ):
user = utils.authenticate_user(database, form_data.username, form_data.password) user = utils.authenticate_user(db, form_data.username, form_data.password)
if not user: if not user:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
@ -160,24 +168,17 @@ async def read_users_me(current_user: Annotated[schemas.User, Depends(utils.get_
return current_user return current_user
@app.get("/api/users/me/items")
async def read_own_items(
current_user: Annotated[schemas.User, Depends(utils.get_current_active_user)]
):
return [{"Current user name": current_user.name, "Current user surname": current_user.surname}]
# изменяем рейтинг пользователя # изменяем рейтинг пользователя
@app.post("/api/user/rating") @app.post("/api/user/rating")
def add_points(data: schemas.AddRating, current_user: Annotated[schemas.User, Depends(utils.get_current_user)]): def add_points(data: schemas.AddRating, current_user: Annotated[schemas.User, Depends(utils.get_current_user)], db: Annotated[Session, Depends(utils.get_db)]):
if current_user.id != data.user_id: if current_user.id != data.user_id:
user = utils.get_user_by_id(db=database, user_id=data.user_id) user = utils.get_user_by_id(db, data.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")
user.rating = (user.rating*user.num_of_ratings + data.rate)/(user.num_of_ratings + 1) user.rating = (user.rating*user.num_of_ratings + data.rate)/(user.num_of_ratings + 1)
user.num_of_ratings += 1 user.num_of_ratings += 1
database.commit() db.commit()
database.refresh(user) # обновляем состояние объекта db.refresh(user) # обновляем состояние объекта
return {"Success": True} return {"Success": True}
@ -192,12 +193,12 @@ def add_points(user_id: int, db: Annotated[Session, Depends(utils.get_db)]):
# Отправляем стихи # Отправляем стихи
@app.get("/api/user/poem") # пока не работает @app.get("/api/user/poem") # пока не работает
def poems_to_front(): # db: Annotated[Session, Depends(utils.get_db)] def poems_to_front(db: Annotated[Session, Depends(utils.get_db)]): # db: Annotated[Session, Depends(utils.get_db)]
kolvo_stixov = database.query(models.Poems).count() # пока количество стихотворений = 101 kolvo_stixov = db.query(models.Poems).count() # пока количество стихотворений = 101
if kolvo_stixov > 1: if kolvo_stixov > 1:
rand_id = random.randint(1, kolvo_stixov) # номер стихотворения rand_id = random.randint(1, kolvo_stixov) # номер стихотворения
poem_json = dict() poem_json = dict()
poem = database.query(models.Poems).filter(models.Poems.id == rand_id).first() poem = db.query(models.Poems).filter(models.Poems.id == rand_id).first()
poem_json = {"id": rand_id, "title": poem.title, "text": poem.text, "author": poem.author} poem_json = {"id": rand_id, "title": poem.title, "text": poem.text, "author": poem.author}
return poem_json return poem_json
else: else:
@ -206,17 +207,38 @@ def poems_to_front(): # db: Annotated[Session, Depends(utils.get_db)]
@app.get("/api/trashbox", response_model=List[schemas.TrashboxResponse]) @app.get("/api/trashbox", response_model=List[schemas.TrashboxResponse])
def get_trashboxes(data: schemas.TrashboxRequest):#крутая функция для работы с api def get_trashboxes(data: schemas.TrashboxRequest):#крутая функция для работы с api
BASE_URL='https://geointelect2.gate.petersburg.ru'#адрес сайта и мой токин # json, передаваемый стороннему API
my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A' head = {'Authorization': 'Bearer {}'.format(service.my_token)}
head = {'Authorization': 'Bearer {}'.format(my_token)} # Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть)
my_data={ my_data={
'x' : f"{data.Lng}", 'x' : f"{data.Lng}",
'y' : f"{data.Lat}", 'y' : f"{data.Lat}",
'limit' : '1' 'limit' : '1'
} }
response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data)
list_of_category = [] # лист по которому будет отбираться uniq_trashboxes
match category:
case "PORRIDGE":
list_of_category=["Опасные отходы", "Иное"]
case "Конспекты":
list_of_category=["Бумага"]
case "Молочные продукты":
list_of_category=["Стекло","Тетра Пак", "Иное"]
case "Хлебобулочные изделия":
list_of_category=["Пластик", "Иное"]
case "Моющие средства":
list_of_category=["Пластик", "Опасные отходы", "Иное"]
case "Одежда":
list_of_category=["Одежда"]
case "Фрукты и овощи":
list_of_category=["Иное"]
case "Всякая всячина":
list_of_category=["Металл", "Бумага", "Стекло","Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины", "Опасные отходы", "Лампочки", "Пластик"]
response = requests.post(f"{service.BASE_URL}/nearest_recycling/get", headers=head, data=my_data)
infos = response.json() infos = response.json()
trashboxes = [] trashboxes = []
@ -246,7 +268,7 @@ async def react_app(req: Request, rest_of_path: str):
def dispose(data: schemas.DisposeRequest, current_user_schema: Annotated[schemas.User, Depends(utils.get_current_user)], def dispose(data: schemas.DisposeRequest, current_user_schema: Annotated[schemas.User, Depends(utils.get_current_user)],
db: Annotated[Session, Depends(utils.get_db)]): db: Annotated[Session, Depends(utils.get_db)]):
# Находим в бд текущего юзера # Находим в бд текущего юзера
current_user = utils.get_user_by_id(database, current_user_schema.id) current_user = utils.get_user_by_id(db, current_user_schema.id)
# Начисляем баллы пользователю за утилизацию # Начисляем баллы пользователю за утилизацию
current_user.points += 60 current_user.points += 60
# В полученном json переходим к данным мусорки # В полученном json переходим к данным мусорки

View File

@ -36,7 +36,7 @@ class Announcement(Base): #класс объявления
src = Column(String, nullable=True) #изображение продукта в объявлении src = Column(String, nullable=True) #изображение продукта в объявлении
metro = Column(String) #ближайщее метро от адреса нахождения продукта metro = Column(String) #ближайщее метро от адреса нахождения продукта
trashId = Column(Integer, nullable=True) trashId = Column(Integer, nullable=True)
booked_by = Column(Integer) #статус бронирования (либо -1, либо айди бронирующего) booked_by = Column(Integer) #количество забронировавших (0 - никто не забронировал)
# state = Column(Enum(State), default=State.published) # состояние объявления (опубликовано, забронировано, устарело) # state = Column(Enum(State), default=State.published) # состояние объявления (опубликовано, забронировано, устарело)
obsolete = Column(Boolean, default=False) # состояние объявления (по-умолчанию считаем его актуальным) obsolete = Column(Boolean, default=False) # состояние объявления (по-умолчанию считаем его актуальным)

View File

@ -5,6 +5,12 @@ from . import models, schemas, utils
import random import random
import datetime import datetime
# Переменные для получения данных о мусорках с внешнего API
# url API
BASE_URL='https://geointelect2.gate.petersburg.ru/nearest_recycling/get'#адрес сайта и мой токин
# токен для получения данных
my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A'
# Загружаем стихи # Загружаем стихи
def add_poems_to_db(db: Session): 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')#открыть фаил для чтения на русском