Update
|
@ -1,4 +1,4 @@
|
|||
from datetime import datetime
|
||||
# from datetime import datetime
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
|
||||
|
||||
|
@ -14,11 +14,13 @@ class Model(DeclarativeBase):
|
|||
class DatingOrm(Model):
|
||||
__tablename__ = "datings"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
id: Mapped[int] = mapped_column(primary_key=True, unique=True, autoincrement=True)
|
||||
sessionkey: Mapped[str] = mapped_column(unique=True)
|
||||
theme_name: Mapped[str]
|
||||
sender_name: Mapped[str]
|
||||
sender_sex: Mapped[str]
|
||||
sender_age: Mapped[int]
|
||||
sender_city: Mapped[str]
|
||||
telegram_name: Mapped[str]
|
||||
interests_in_school_university: Mapped[str]
|
||||
interests_in_sports: Mapped[str]
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
# import pathlib
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.templating import Jinja2Templates
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import HTMLResponse
|
||||
import uuid
|
||||
|
||||
from contextlib import asynccontextmanager
|
||||
from .database import create_tables, delete_tables
|
||||
|
||||
from .router import router as datings_router
|
||||
from .validity import is_valid_uuid
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
|
@ -17,8 +22,22 @@ async def lifespan(app: FastAPI):
|
|||
pass
|
||||
|
||||
|
||||
app = FastAPI(lifespan=lifespan)
|
||||
# app = FastAPI(lifespan=lifespan)
|
||||
app = FastAPI(lifespan=lifespan, docs_url=None, redoc_url=None, openapi_url=None)
|
||||
|
||||
templates = Jinja2Templates(directory="templates")
|
||||
|
||||
app.include_router(datings_router)
|
||||
|
||||
app.mount("/", StaticFiles(directory="public", html=True))
|
||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
async def index(request: Request):
|
||||
response = templates.TemplateResponse("index.html", {"request": request})
|
||||
|
||||
sessionKey = request.cookies.get("sessionkey")
|
||||
if isinstance(sessionKey, str) and is_valid_uuid(sessionKey):
|
||||
pass
|
||||
else:
|
||||
response.set_cookie(key="sessionkey", value=str(uuid.uuid4()))
|
||||
return response
|
||||
|
|
|
@ -1,13 +1,22 @@
|
|||
from fastapi import APIRouter, FastAPI, Depends, Body, Form, Request, HTTPException
|
||||
from fastapi.responses import JSONResponse, HTMLResponse
|
||||
# from json import JSONDecodeError, dumps, loads
|
||||
|
||||
from fastapi import (
|
||||
APIRouter,
|
||||
Body,
|
||||
Cookie,
|
||||
Depends,
|
||||
FastAPI,
|
||||
Form,
|
||||
Header,
|
||||
HTTPException,
|
||||
Request,
|
||||
)
|
||||
from fastapi.responses import HTMLResponse, JSONResponse
|
||||
from starlette.datastructures import FormData
|
||||
from json import JSONDecodeError, dumps, loads
|
||||
import uuid
|
||||
|
||||
from .repository import DatingRepository
|
||||
from .schemas import SDating, SDatingAdd, SDatingId
|
||||
|
||||
|
||||
# async def get_body(request: Request):
|
||||
# content_type = request.headers.get('Content-Type')
|
||||
# if content_type is None:
|
||||
|
@ -43,11 +52,11 @@ router = APIRouter(
|
|||
# new_dating_id = await DatingRepository.add_dating(dating)
|
||||
# return {"id": new_dating_id} # type: ignore
|
||||
|
||||
|
||||
async def add_dating(dating: SDatingAdd = Body()) -> JSONResponse:
|
||||
new_dating_id = await DatingRepository.add_dating(dating)
|
||||
content = {"id": new_dating_id} # type: ignore
|
||||
response = JSONResponse(content=content)
|
||||
response.set_cookie(key="fakesession", value=str(uuid.uuid4()))
|
||||
return response
|
||||
|
||||
|
||||
|
@ -56,45 +65,10 @@ async def get_datings() -> list[SDating]:
|
|||
datings = await DatingRepository.get_datings()
|
||||
return datings
|
||||
|
||||
|
||||
# async def get_datings() -> JSONResponse:
|
||||
# datings = await DatingRepository.get_datings()
|
||||
# content = dumps(datings, default=lambda o: o.__dict__) # type: ignore
|
||||
# response = JSONResponse(content=content)
|
||||
# response.set_cookie(key="fakesession", value="fake-cookie-session-value")
|
||||
# return response
|
||||
|
||||
@router.post("/message")
|
||||
async def message_data(
|
||||
theme_name: str = Form(...),
|
||||
sender_name: str = Form(...),
|
||||
sender_sex: str = Form(...),
|
||||
sender_age: int = Form(...),
|
||||
telegram_name: str = Form(...),
|
||||
interests_in_school_university: str = Form(...),
|
||||
interests_in_sports: str = Form(...),
|
||||
interests_in_work: str = Form(...),
|
||||
interests_in_your_free_time: str = Form(...),
|
||||
pets_plants_fish: str = Form(...),
|
||||
relationships_with_relatives_and_friends: str = Form(...),
|
||||
past_relationships: str = Form(...),
|
||||
life_principles_values: str = Form(...),
|
||||
goals_in_life: str = Form(...),
|
||||
message_text: str = Form(...),
|
||||
):
|
||||
return {
|
||||
"theme_name": theme_name,
|
||||
"sender_name": sender_name,
|
||||
"sender_sex": sender_sex,
|
||||
"sender_age": sender_age,
|
||||
"telegram_name": telegram_name,
|
||||
"interests_in_school_university": interests_in_school_university,
|
||||
"interests_in_sports": interests_in_sports,
|
||||
"interests_in_work": interests_in_work,
|
||||
"interests_in_your_free_time": interests_in_your_free_time,
|
||||
"pets_plants_fish": pets_plants_fish,
|
||||
"relationships_with_relatives_and_friends": relationships_with_relatives_and_friends,
|
||||
"past_relationships": past_relationships,
|
||||
"life_principles_values": life_principles_values,
|
||||
"goals_in_life": goals_in_life,
|
||||
"message_text": message_text,
|
||||
}
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
from datetime import datetime
|
||||
# from datetime import datetime
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
class SDatingAdd(BaseModel):
|
||||
sessionkey: str
|
||||
theme_name: str
|
||||
sender_name: str
|
||||
sender_sex: str
|
||||
sender_age: int
|
||||
sender_city: str
|
||||
telegram_name: str
|
||||
interests_in_school_university: str
|
||||
interests_in_sports: str
|
||||
|
@ -22,7 +24,6 @@ class SDatingAdd(BaseModel):
|
|||
|
||||
class SDating(SDatingAdd):
|
||||
id: int
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
import uuid
|
||||
|
||||
|
||||
def is_valid_uuid(uuid_to_test, version=4):
|
||||
"""
|
||||
Check if uuid_to_test is a valid UUID.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
uuid_to_test : str
|
||||
version : {1, 2, 3, 4}
|
||||
|
||||
Returns
|
||||
-------
|
||||
`True` if uuid_to_test is a valid UUID, otherwise `False`.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
|
||||
True
|
||||
>>> is_valid_uuid('c9bf9e58')
|
||||
False
|
||||
"""
|
||||
|
||||
try:
|
||||
uuid_obj = uuid.UUID(uuid_to_test, version=version)
|
||||
except ValueError:
|
||||
return False
|
||||
return str(uuid_obj) == uuid_to_test
|
|
@ -27,6 +27,7 @@ dependencies = [
|
|||
"h11 (>=0.16.0,<0.17.0)",
|
||||
"idna (>=3.10,<4.0)",
|
||||
"sniffio (>=1.3.1,<2.0.0)",
|
||||
"jinja2 (>=3.1.6,<4.0.0)",
|
||||
]
|
||||
package-mode = false
|
||||
|
||||
|
|
1
start.sh
|
@ -3,6 +3,7 @@
|
|||
python -m venv .venv
|
||||
pyenv local 3.13
|
||||
poetry env activate
|
||||
poetry lock
|
||||
poetry install --no-root
|
||||
|
||||
#hypercorn LeraFoxQueen.main:app --reload --bind 0.0.0.0:8001
|
||||
|
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 697 B After Width: | Height: | Size: 697 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |