Merge branch 'main' of https://github.com/dm1sh/porridger_tmp
This commit is contained in:
commit
6241fafbc6
51
back/api.py
51
back/api.py
@ -33,8 +33,8 @@ if not os.path.exists("./uploads"):
|
|||||||
os.mkdir("./uploads")
|
os.mkdir("./uploads")
|
||||||
app.mount("/uploads", StaticFiles(directory = "./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])#адрес объявлений
|
@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)
|
# параметры для сортировки (схема 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 = service.filter_ann(db=db, schema=params_to_sort)
|
result = get_query_results(db=db, schema=params_to_sort)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@ -95,20 +95,14 @@ 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, db: Annotated[Session, Depends(utils.get_db)],
|
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)]): # функция удаления объекта из БД
|
try:
|
||||||
# находим объявление в бд по id
|
to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first()
|
||||||
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:
|
|
||||||
db.delete(to_delete) # удаление из БД
|
db.delete(to_delete) # удаление из БД
|
||||||
db.commit() # сохраняем изменения
|
db.commit() # сохраняем изменения
|
||||||
return {"Answer" : True}
|
return {"Answer" : True}
|
||||||
else:
|
except:
|
||||||
raise HTTPException(status_code=403, detail="Can't delete other user's announcements")
|
return {"Answer" : False}
|
||||||
|
|
||||||
|
|
||||||
# Забронировать объявление
|
# Забронировать объявление
|
||||||
@ -202,25 +196,22 @@ def poems_to_front(db: Annotated[Session, Depends(utils.get_db)]): # db: Annotat
|
|||||||
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
|
return poem
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.get("/api/trashbox", response_model=List[schemas.TrashboxResponse])
|
@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
|
# json, передаваемый стороннему API
|
||||||
BASE_URL= "https://geointelect2.gate.petersburg.ru"
|
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"
|
my_token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODYyMjUzMzMsImlhdCI6MTY5MTUzMDkzMywianRpIjoiYjU0MmU3MTQtYzJkMS00NTY2LWJkY2MtYmQ5NzA0ODY1ZjgzIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjJhOTgwMzUyLTY1M2QtNGZlZC1iMDI1LWQ1N2U0NDRjZmM3NiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyYTk4MDM1Mi02NTNkLTRmZWQtYjAyNS1kNTdlNDQ0Y2ZjNzYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.FTKiC1hpWcOkmSW9QZpC-RY7Ko50jw1mDMfXIWYxlQ-zehLm2CLmOnHvYoOoI39k2OzeCIAB9ZdRrrGZc6G9Z1eFELUjNGEqKxSC1Phj9ATemKgbOKEttk-OGc-rFr9VPA8_SnfvLts6wTI2YK33YBIxCF5nCbnr4Qj3LeEQ0d6Hy8PO4ATrBF5EOeuAZRprvIEjXe_f8N9ONKckCPB-xFB4P2pZlVXGoCNoewGEcY3zXH4khezN6zcVr6tpc6G8dBv9EqT_v92IDSg-aXQk6ysA0cO0-6x5w1-_qU0iHGIAPsLNV9IKBoFbjc0JH6cWabldPRH12NP1trvYfqKDGQ"
|
||||||
head = {'Authorization': 'Bearer {}'.format(my_token)}
|
head = {'Authorization': 'Bearer {}'.format(my_token)}
|
||||||
|
# Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть)
|
||||||
my_data={
|
my_data={
|
||||||
'x' : f"{data.Lng}",
|
'x' : f"{Lng}",
|
||||||
'y' : f"{data.Lat}",
|
'y' : f"{Lat}",
|
||||||
'limit' : '1'
|
'limit' : '1'
|
||||||
}
|
}
|
||||||
|
# Перевод категории с фронта на категорию с сайта
|
||||||
|
match Category:
|
||||||
list_of_category = [] # лист по которому будет отбираться uniq_trashboxes
|
|
||||||
match data.Category:
|
|
||||||
case "PORRIDGE":
|
case "PORRIDGE":
|
||||||
list_of_category = ["Опасные отходы", "Иное"]
|
list_of_category = ["Опасные отходы", "Иное"]
|
||||||
case "Конспекты":
|
case "Конспекты":
|
||||||
@ -238,9 +229,10 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу
|
|||||||
case "Всякая всячина":
|
case "Всякая всячина":
|
||||||
list_of_category = ["Металл", "Бумага", "Стекло", "Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины",
|
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()
|
infos = response.json()
|
||||||
|
# Чтение ответа
|
||||||
trashboxes = []
|
trashboxes = []
|
||||||
for trashbox in infos["results"]:
|
for trashbox in infos["results"]:
|
||||||
temp_dict = {}
|
temp_dict = {}
|
||||||
@ -253,10 +245,11 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу
|
|||||||
temp_dict["Name"] = properties["title"]
|
temp_dict["Name"] = properties["title"]
|
||||||
temp_dict["Address"] = properties["address"]
|
temp_dict["Address"] = properties["address"]
|
||||||
temp_dict["Categories"] = properties["content_text"].split(',')
|
temp_dict["Categories"] = properties["content_text"].split(',')
|
||||||
trashboxes.append(temp_dict)
|
for a in list_of_category:
|
||||||
|
if a in temp_dict["Categories"] and temp_dict not in trashboxes:
|
||||||
uniq_trashboxes = [schemas.TrashboxResponse(**ast.literal_eval(el1)) for el1 in set([str(el2) for el2 in trashboxes])]
|
trashboxes.append(temp_dict)
|
||||||
return uniq_trashboxes
|
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}")
|
@app.get("/{rest_of_path:path}")
|
||||||
|
@ -6,9 +6,9 @@ import { Category } from '../../assets/category'
|
|||||||
|
|
||||||
const composeTrashboxURL = (position: LatLng, category: Category) => (
|
const composeTrashboxURL = (position: LatLng, category: Category) => (
|
||||||
API_URL + '/trashbox?' + new URLSearchParams({
|
API_URL + '/trashbox?' + new URLSearchParams({
|
||||||
lat: position.lat.toString(),
|
Lat: position.lat.toString(),
|
||||||
lng: position.lng.toString(),
|
Lng: position.lng.toString(),
|
||||||
category: category,
|
Category: category,
|
||||||
}).toString()
|
}).toString()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { colors, lineNames, lineByName } from '../assets/metro'
|
|||||||
function LineDot({ station }: { station: string }) {
|
function LineDot({ station }: { station: string }) {
|
||||||
const line = lineByName(station)
|
const line = lineByName(station)
|
||||||
|
|
||||||
if (line == undefined) {
|
if (line === undefined) {
|
||||||
return <></>
|
return <></>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ function Poetry() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<p><em>{poetry.data.author}</em></p>
|
<p><em>{poetry.data.author}</em></p>
|
||||||
<img src={`/poem_pic/${poetry.data.id}`} alt='Иллюстрация' />
|
<img src={`/poem_pic/${poetry.data.id}.jpg`} alt='Иллюстрация' />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
) : (
|
) : (
|
||||||
|
@ -3,40 +3,20 @@ import { LatLng } from 'leaflet'
|
|||||||
import { Trashbox, isTrashboxResponse } from '../../api/trashbox/types'
|
import { Trashbox, isTrashboxResponse } from '../../api/trashbox/types'
|
||||||
import useFetch, { UseFetchReturn } from '../useFetch'
|
import useFetch, { UseFetchReturn } from '../useFetch'
|
||||||
|
|
||||||
import { faker } from '@faker-js/faker/locale/ru'
|
|
||||||
import { Category } from '../../assets/category'
|
import { Category } from '../../assets/category'
|
||||||
import { useMemo } from 'react'
|
|
||||||
import { composeTrashboxURL, processTrashbox } from '../../api/trashbox'
|
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[]> => (
|
const useTrashboxes = (position: LatLng, category: Category): UseFetchReturn<Trashbox[]> => (
|
||||||
// TODO: Remove once available
|
// TODO: Remove once available
|
||||||
// eslint-disable-next-line react-hooks/rules-of-hooks
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||||||
import.meta.env.PROD ? useFetch(
|
useFetch(
|
||||||
composeTrashboxURL(position, category),
|
composeTrashboxURL(position, category),
|
||||||
'GET',
|
'GET',
|
||||||
true,
|
true,
|
||||||
isTrashboxResponse,
|
isTrashboxResponse,
|
||||||
processTrashbox,
|
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
|
export default useTrashboxes
|
||||||
|
Loading…
x
Reference in New Issue
Block a user