From f25ac9aa0de432e200b543f21fd9c9b626087e5d Mon Sep 17 00:00:00 2001 From: DmitryGantimurov Date: Fri, 11 Aug 2023 14:17:14 +0300 Subject: [PATCH] fixing trashbox --- back/api.py | 120 ++++++++++++++++++++++++++++-------------------- back/models.py | 2 +- back/service.py | 6 +++ 3 files changed, 78 insertions(+), 50 deletions(-) diff --git a/back/api.py b/back/api.py index 11030bd..1e8238f 100644 --- a/back/api.py +++ b/back/api.py @@ -41,23 +41,23 @@ app.mount("/uploads", StaticFiles(directory = "./uploads")) # 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, category: Union[str, None] = None): # параметры для сортировки (схема pydantic schemas.SortAnnouncements) 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 -@app.get("/api/announcement")#адрес объявления -def single_announcement(user_id:int): +@app.get("/api/announcement") # +def single_announcement(ann_id:int, db: Annotated[Session, Depends(utils.get_db)]): # передаем индекс обявления # Считываем данные из Body и отображаем их на странице. # В последствии будем вставлять данные в html-форму 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, "category": announcement.category, "best_by": announcement.best_by, "address": announcement.address, "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()], 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)], - 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: uploaded_name = "" 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, address=address, longtitude=longtitude, latitude=latitude, description=description, metro=metro, trashId=trashId, booked_by=0) - database.add(temp_ancmt) # добавляем в бд - database.commit() # сохраняем изменения - database.refresh(temp_ancmt) # обновляем состояние объекта + db.add(temp_ancmt) # добавляем в бд + db.commit() # сохраняем изменения + db.refresh(temp_ancmt) # обновляем состояние объекта return {"Answer" : True} except: return {"Answer" : False} @@ -99,11 +99,11 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be # Удалить объявления из базы @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: - to_delete = database.query(models.Announcement).filter(models.Announcement.id==announcement.id).first() - database.delete(to_delete) # удаление из БД - database.commit() # сохраняем изменения + to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first() + db.delete(to_delete) # удаление из БД + db.commit() # сохраняем изменения return {"Answer" : True} except: return {"Answer" : False} @@ -111,37 +111,45 @@ def delete_from_db(announcement: schemas.DelAnnouncement): # функция # Забронировать объявление @app.post("/api/book") -def change_book_status(data: schemas.Book): - try: - # Находим объявление по данному id - announcement_to_change = database.query(models.Announcement).filter(Announcement.id == data.id).first() - # Изменяем поле booked_status на полученный id - announcement_to_change.booked_status += 1 - return {"Success": True} - except: - return {"Success": False} +def change_book_status(data: schemas.Book, current_user: Annotated[schemas.User, Depends(utils.get_current_user)], + db: Annotated[Session, Depends(utils.get_db)], db: Annotated[Session, Depends(utils.get_db)]): + # Находим объявление по данному id + announcement_to_change = db.query(models.Announcement).filter(Announcement.id == data.id).first() + # Проверяем, что объявление с данным id существует + if not announcement_to_change: + raise HTTPException(status_code=404, detail="Item not found") + # Проверяем, что объявление бронирует не владелец + 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 @app.post("/api/signup") 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), name=name, surname=surname, reg_date=datetime.date.today()) - database.add(new_user) - database.commit() - database.refresh(new_user) # обновляем состояние объекта + db.add(new_user) + db.commit() + db.refresh(new_user) # обновляем состояние объекта return {"Success": True} return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"} @app.post("/api/token", response_model=schemas.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: raise HTTPException( 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 -@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") -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: - 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: 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.num_of_ratings += 1 - database.commit() - database.refresh(user) # обновляем состояние объекта + db.commit() + db.refresh(user) # обновляем состояние объекта 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") # пока не работает -def poems_to_front(): # db: Annotated[Session, Depends(utils.get_db)] - kolvo_stixov = database.query(models.Poems).count() # пока количество стихотворений = 101 +def poems_to_front(db: Annotated[Session, Depends(utils.get_db)]): # db: Annotated[Session, Depends(utils.get_db)] + kolvo_stixov = db.query(models.Poems).count() # пока количество стихотворений = 101 if kolvo_stixov > 1: rand_id = random.randint(1, kolvo_stixov) # номер стихотворения 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} return poem_json 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]) def get_trashboxes(data: schemas.TrashboxRequest):#крутая функция для работы с api - BASE_URL='https://geointelect2.gate.petersburg.ru'#адрес сайта и мой токин - my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A' - head = {'Authorization': 'Bearer {}'.format(my_token)} - + # json, передаваемый стороннему API + head = {'Authorization': 'Bearer {}'.format(service.my_token)} + # Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть) my_data={ 'x' : f"{data.Lng}", 'y' : f"{data.Lat}", '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() 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)], 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 # В полученном json переходим к данным мусорки diff --git a/back/models.py b/back/models.py index 01b314a..a6717d5 100644 --- a/back/models.py +++ b/back/models.py @@ -36,7 +36,7 @@ class Announcement(Base): #класс объявления src = Column(String, nullable=True) #изображение продукта в объявлении metro = Column(String) #ближайщее метро от адреса нахождения продукта trashId = Column(Integer, nullable=True) - booked_by = Column(Integer) #статус бронирования (либо -1, либо айди бронирующего) + booked_by = Column(Integer) #количество забронировавших (0 - никто не забронировал) # state = Column(Enum(State), default=State.published) # состояние объявления (опубликовано, забронировано, устарело) obsolete = Column(Boolean, default=False) # состояние объявления (по-умолчанию считаем его актуальным) diff --git a/back/service.py b/back/service.py index 0831f0f..6228552 100644 --- a/back/service.py +++ b/back/service.py @@ -5,6 +5,12 @@ from . import models, schemas, utils import random 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): f1 = open('text121.txt', encoding='utf-8', mode='r')#открыть фаил для чтения на русском