This commit is contained in:
DmitryGantimurov 2023-08-12 23:46:17 +03:00
commit 6241fafbc6
5 changed files with 29 additions and 56 deletions

View File

@ -33,8 +33,8 @@ if not os.path.exists("./uploads"):
os.mkdir("./uploads")
app.mount("/uploads", StaticFiles(directory = "./uploads"))
## Записываем стихи в базу данных, если их еще нет (запускать только если стихов в базе нет).
# service.add_poems_to_db(database)
# Записываем стихи в базу данных, если их еще нет (запускать только если стихов в базе нет).
# add_poems_to_db(database)
@app.get("/api/announcements", response_model=List[schemas.Announcement])#адрес объявлений
@ -43,7 +43,7 @@ def announcements_list(db: Annotated[Session, Depends(utils.get_db)], obsolete:
# параметры для сортировки (схема pydantic schemas.SortAnnouncements)
params_to_sort = schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category)
# получаем результат
result = service.filter_ann(db=db, schema=params_to_sort)
result = get_query_results(db=db, schema=params_to_sort)
return result
@ -95,20 +95,14 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be
# Удалить объявления из базы
@app.delete("/api/announcement") #адрес объявления
def delete_from_db(announcement: schemas.DelAnnouncement, db: Annotated[Session, Depends(utils.get_db)],
current_user: Annotated[schemas.User, Depends(utils.get_current_active_user)]): # функция удаления объекта из БД
# находим объявление в бд по id
to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first()
# Проверяем, что объявление с данным id существует
if not to_delete:
raise HTTPException(status_code=404, detail="Item not found")
# Проверяем, что объявление удаляет владелец
if current_user.id == to_delete.user_id:
def delete_from_db(announcement: schemas.DelAnnouncement, db: Annotated[Session, Depends(utils.get_db)]): # функция удаления объекта из БД
try:
to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first()
db.delete(to_delete) # удаление из БД
db.commit() # сохраняем изменения
return {"Answer" : True}
else:
raise HTTPException(status_code=403, detail="Can't delete other user's announcements")
except:
return {"Answer" : False}
# Забронировать объявление
@ -202,25 +196,22 @@ def poems_to_front(db: Annotated[Session, Depends(utils.get_db)]): # db: Annotat
if not poem:
raise HTTPException(status_code=404, detail="Poem not found")
return poem
@app.get("/api/trashbox", response_model=List[schemas.TrashboxResponse])
def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая функция для работы с api
def get_trashboxes(Lat:float, Lng:float, Category:str):#крутая функция для работы с api
# json, передаваемый стороннему API
BASE_URL= "https://geointelect2.gate.petersburg.ru"
my_token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODYyMjUzMzMsImlhdCI6MTY5MTUzMDkzMywianRpIjoiYjU0MmU3MTQtYzJkMS00NTY2LWJkY2MtYmQ5NzA0ODY1ZjgzIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjJhOTgwMzUyLTY1M2QtNGZlZC1iMDI1LWQ1N2U0NDRjZmM3NiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyYTk4MDM1Mi02NTNkLTRmZWQtYjAyNS1kNTdlNDQ0Y2ZjNzYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.FTKiC1hpWcOkmSW9QZpC-RY7Ko50jw1mDMfXIWYxlQ-zehLm2CLmOnHvYoOoI39k2OzeCIAB9ZdRrrGZc6G9Z1eFELUjNGEqKxSC1Phj9ATemKgbOKEttk-OGc-rFr9VPA8_SnfvLts6wTI2YK33YBIxCF5nCbnr4Qj3LeEQ0d6Hy8PO4ATrBF5EOeuAZRprvIEjXe_f8N9ONKckCPB-xFB4P2pZlVXGoCNoewGEcY3zXH4khezN6zcVr6tpc6G8dBv9EqT_v92IDSg-aXQk6ysA0cO0-6x5w1-_qU0iHGIAPsLNV9IKBoFbjc0JH6cWabldPRH12NP1trvYfqKDGQ"
head = {'Authorization': 'Bearer {}'.format(my_token)}
# Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть)
my_data={
'x' : f"{data.Lng}",
'y' : f"{data.Lat}",
'x' : f"{Lng}",
'y' : f"{Lat}",
'limit' : '1'
}
list_of_category = [] # лист по которому будет отбираться uniq_trashboxes
match data.Category:
# Перевод категории с фронта на категорию с сайта
match Category:
case "PORRIDGE":
list_of_category = ["Опасные отходы", "Иное"]
case "Конспекты":
@ -238,9 +229,10 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу
case "Всякая всячина":
list_of_category = ["Металл", "Бумага", "Стекло", "Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины",
"Опасные отходы", "Лампочки", "Пластик"]
response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data)
# Получение ответа от стороннего апи
response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data, timeout=10)
infos = response.json()
# Чтение ответа
trashboxes = []
for trashbox in infos["results"]:
temp_dict = {}
@ -253,10 +245,11 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу
temp_dict["Name"] = properties["title"]
temp_dict["Address"] = properties["address"]
temp_dict["Categories"] = properties["content_text"].split(',')
trashboxes.append(temp_dict)
uniq_trashboxes = [schemas.TrashboxResponse(**ast.literal_eval(el1)) for el1 in set([str(el2) for el2 in trashboxes])]
return uniq_trashboxes
for a in list_of_category:
if a in temp_dict["Categories"] and temp_dict not in trashboxes:
trashboxes.append(temp_dict)
uniq_trashboxes = [ast.literal_eval(el1) for el1 in set([str(el2) for el2 in trashboxes])]
return JSONResponse(uniq_trashboxes)
@app.get("/{rest_of_path:path}")

View File

@ -6,9 +6,9 @@ import { Category } from '../../assets/category'
const composeTrashboxURL = (position: LatLng, category: Category) => (
API_URL + '/trashbox?' + new URLSearchParams({
lat: position.lat.toString(),
lng: position.lng.toString(),
category: category,
Lat: position.lat.toString(),
Lng: position.lng.toString(),
Category: category,
}).toString()
)

View File

@ -3,7 +3,7 @@ import { colors, lineNames, lineByName } from '../assets/metro'
function LineDot({ station }: { station: string }) {
const line = lineByName(station)
if (line == undefined) {
if (line === undefined) {
return <></>
}

View File

@ -26,7 +26,7 @@ function Poetry() {
}}
/>
<p><em>{poetry.data.author}</em></p>
<img src={`/poem_pic/${poetry.data.id}`} alt='Иллюстрация' />
<img src={`/poem_pic/${poetry.data.id}.jpg`} alt='Иллюстрация' />
</>
)
) : (

View File

@ -3,40 +3,20 @@ import { LatLng } from 'leaflet'
import { Trashbox, isTrashboxResponse } from '../../api/trashbox/types'
import useFetch, { UseFetchReturn } from '../useFetch'
import { faker } from '@faker-js/faker/locale/ru'
import { Category } from '../../assets/category'
import { useMemo } from 'react'
import { composeTrashboxURL, processTrashbox } from '../../api/trashbox'
function genMockTrashbox(pos: LatLng): Trashbox {
const loc = faker.location.nearbyGPSCoordinate({ origin: [pos.lat, pos.lng], radius: 1 })
return {
Name: faker.company.name(),
Address: faker.location.streetAddress(),
Categories: faker.lorem.words({ max: 3, min: 1 }).split(' '),
Lat: loc[0],
Lng: loc[1],
}
}
const useTrashboxes = (position: LatLng, category: Category): UseFetchReturn<Trashbox[]> => (
// TODO: Remove once available
// eslint-disable-next-line react-hooks/rules-of-hooks
import.meta.env.PROD ? useFetch(
useFetch(
composeTrashboxURL(position, category),
'GET',
true,
isTrashboxResponse,
processTrashbox,
[],
) : {
// eslint-disable-next-line react-hooks/rules-of-hooks
data: useMemo(() => new Array(3).fill(3).map(() => genMockTrashbox(position)), [position]),
loading: false,
error: null,
refetch: () => { return },
}
)
)
export default useTrashboxes