Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion pandahub/api/internal/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@
BeanieBaseAccessToken,
)

from pandahub.api.internal.settings import REGISTRATION_ADMIN_APPROVAL, MONGODB_URL, MONGODB_USER, MONGODB_PASSWORD
from pandahub.api.internal.settings import (
REGISTRATION_ADMIN_APPROVAL,
MONGODB_URL,
MONGODB_USER,
MONGODB_PASSWORD,
)
from pydantic import Field

mongo_client_args = {"host": MONGODB_URL, "uuidRepresentation": "standard", "connect": False}
Expand All @@ -20,20 +25,25 @@
client.get_io_loop = asyncio.get_event_loop
db = client["user_management"]


class User(BeanieBaseUser, Document):
id: uuid.UUID = Field(default_factory=uuid.uuid4)
is_active: bool = not REGISTRATION_ADMIN_APPROVAL

class Settings(BeanieBaseUser.Settings):
name = "users"


class AccessToken(BeanieBaseAccessToken, Document):
user_id: uuid.UUID = Field(default_factory=uuid.uuid4)

class Settings(BeanieBaseAccessToken.Settings):
name = "access_tokens"


async def get_user_db():
yield BeanieUserDatabase(User)


async def get_access_token_db():
yield BeanieAccessTokenDatabase(AccessToken)
14 changes: 2 additions & 12 deletions pandahub/api/internal/toolbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,7 @@ async def send_password_reset_mail(user, token):
someone is trying to reset your password!
"""

message = MessageSchema(
subject=subject,
recipients=[to_address],
body=template,
subtype="plain"
)
message = MessageSchema(subject=subject, recipients=[to_address], body=template, subtype="plain")

await fast_mail.send_message(message)

Expand All @@ -50,11 +45,6 @@ async def send_verification_email(user, token):
{verification_link}
"""

message = MessageSchema(
subject=subject,
recipients=[to_address],
body=template,
subtype="plain"
)
message = MessageSchema(subject=subject, recipients=[to_address], body=template, subtype="plain")

await fast_mail.send_message(message)
14 changes: 4 additions & 10 deletions pandahub/api/internal/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@

class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]):
if settings.SECRET is None:
raise UserWarning(
"You must specify a SECRET in the environment variables or .env file"
)
raise UserWarning("You must specify a SECRET in the environment variables or .env file")
reset_password_token_secret = settings.SECRET
verification_token_secret = settings.SECRET

Expand All @@ -29,23 +27,19 @@ async def on_after_register(self, user: User, request: Optional[Request] = None)
await self.request_verify(user)
print(f"User {user.id} has registered.")

async def on_after_forgot_password(
self, user: User, token: str, request: Optional[Request] = None
):
async def on_after_forgot_password(self, user: User, token: str, request: Optional[Request] = None):
await send_password_reset_mail(user, token)

# print(f"User {user.id} has forgot their password. Reset token: {token}")

async def on_after_request_verify(
self, user: User, token: str, request: Optional[Request] = None
):
async def on_after_request_verify(self, user: User, token: str, request: Optional[Request] = None):
await send_verification_email(user, token)


# print(f"Verification requested for user {user.id}. Verification token: {token}")


async def get_user_manager(user_db:BeanieUserDatabase = Depends(get_user_db)):
async def get_user_manager(user_db: BeanieUserDatabase = Depends(get_user_db)):
yield UserManager(user_db)


Expand Down
23 changes: 13 additions & 10 deletions pandahub/api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,16 @@
from pandahub.api.internal import settings
from beanie import init_beanie


@asynccontextmanager
async def lifespan(app: FastAPI):
await init_beanie(
database=db,
document_models=[
User,
AccessToken
],
document_models=[User, AccessToken],
)
yield


app = FastAPI(lifespan=lifespan)

origins = [
Expand Down Expand Up @@ -52,18 +51,22 @@ async def pandahub_exception_handler(request: Request, exc: PandaHubError):
content=str(exc),
)


@app.get("/")
async def ready():
if settings.DEBUG:
import os

return os.environ
return "Hello World!"


if __name__ == "__main__":
uvicorn.run("pandahub.api.main:app",
host=settings.PANDAHUB_SERVER_URL,
port=settings.PANDAHUB_SERVER_PORT,
log_level="info",
reload=True,
workers=settings.WORKERS)
uvicorn.run(
"pandahub.api.main:app",
host=settings.PANDAHUB_SERVER_URL,
port=settings.PANDAHUB_SERVER_PORT,
log_level="info",
reload=True,
workers=settings.WORKERS,
)
23 changes: 18 additions & 5 deletions pandahub/api/routers/net.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@

from pandahub.api.dependencies import pandahub

router = APIRouter(
prefix="/net",
tags=["net"]
)
router = APIRouter(prefix="/net", tags=["net"])


# -------------------------
# Net handling
# -------------------------


class GetNetFromDB(BaseModel):
project_id: str
name: str
Expand Down Expand Up @@ -47,62 +45,77 @@ def write_network_to_db(data: WriteNetwork, ph=Depends(pandahub)):
# Element CRUD
# -------------------------


class BaseCRUDModel(BaseModel):
project_id: str
net: str
element_type: str


class GetNetValueModel(BaseCRUDModel):
element_index: int
parameter: str


@router.post("/get_net_value_from_db")
def get_net_value_from_db(data: GetNetValueModel, ph=Depends(pandahub)):
return ph.get_net_value_from_db(**data.model_dump())


class SetNetValueModel(BaseCRUDModel):
element_index: int
parameter: str
value: Any = None


@router.post("/set_net_value_in_db")
def set_net_value_in_db(data: SetNetValueModel, ph=Depends(pandahub)):
return ph.set_net_value_in_db(**data.model_dump())


class CreateElementModel(BaseCRUDModel):
element_index: int
element_data: dict


@router.post("/create_element")
def create_element_in_db(data: CreateElementModel, ph=Depends(pandahub)):
return ph.create_element(**data.model_dump())


class CreateElementsModel(BaseCRUDModel):
elements_data: list[dict[str,Any]]
elements_data: list[dict[str, Any]]


@router.post("/create_elements")
def create_elements_in_db(data: CreateElementsModel, ph=Depends(pandahub)):
return ph.create_elements(**data.model_dump())


class DeleteElementModel(BaseCRUDModel):
element_index: int


@router.post("/delete_element")
def delete_net_element(data: DeleteElementModel, ph=Depends(pandahub)):
return ph.delete_element(**data.model_dump())


class DeleteElementsModel(BaseCRUDModel):
element_indexes: list[int]


@router.post("/delete_elements")
def delete_net_elements(data: DeleteElementsModel, ph=Depends(pandahub)):
return ph.delete_elements(**data.model_dump())


### deprecated routes
@router.post("/create_element_in_db")
def create_element_in_db(*args, **kwargs):
raise RuntimeError("create_element_in_db was deprecated - use create_element instead!")


@router.post("/create_elements_in_db")
def create_elements_in_db(*args, **kwargs):
raise RuntimeError("create_elements_in_db was deprecated - use create_elements instead!")
Expand Down
23 changes: 19 additions & 4 deletions pandahub/api/routers/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,36 @@

from pandahub.api.dependencies import pandahub

router = APIRouter(
prefix="/projects",
tags=["projects"]
)
router = APIRouter(prefix="/projects", tags=["projects"])


# -------------------------
# Projects
# -------------------------


class CreateProject(BaseModel):
name: str
settings: Optional[dict] = None


@router.post("/create_project")
def create_project(data: CreateProject, ph=Depends(pandahub)):
ph.create_project(**data.model_dump(), realm=ph.user_id)
return {"message": f"Project {data.name} created !"}


class DeleteProject(BaseModel):
project_id: str
i_know_this_action_is_final: bool


@router.post("/delete_project")
def delete_project(data: DeleteProject, ph=Depends(pandahub)):
ph.delete_project(**data.model_dump())
return True


@router.post("/get_projects")
def get_projects(ph=Depends(pandahub)):
return ph.get_projects()
Expand All @@ -41,6 +43,7 @@ def get_projects(ph=Depends(pandahub)):
class Project(BaseModel):
name: str


@router.post("/project_exists")
def project_exists(data: Project, ph=Depends(pandahub)):
return ph.project_exists(**data.model_dump(), realm=ph.user_id)
Expand All @@ -49,6 +52,7 @@ def project_exists(data: Project, ph=Depends(pandahub)):
class SetActiveProjectModel(BaseModel):
project_name: str


@router.post("/set_active_project")
def set_active_project(data: SetActiveProjectModel, ph=Depends(pandahub)):
ph.set_active_project(**data.model_dump())
Expand All @@ -59,47 +63,58 @@ def set_active_project(data: SetActiveProjectModel, ph=Depends(pandahub)):
# Settings
# -------------------------


class GetProjectSettingsModel(BaseModel):
project_id: str


@router.post("/get_project_settings")
def get_project_settings(data: GetProjectSettingsModel, ph=Depends(pandahub)):
settings = ph.get_project_settings(**data.model_dump())
return settings


class SetProjectSettingsModel(BaseModel):
project_id: str
settings: dict


@router.post("/set_project_settings")
def set_project_settings(data: SetProjectSettingsModel, ph=Depends(pandahub)):
ph.set_project_settings(**data.model_dump())


class SetProjectSettingsValueModel(BaseModel):
project_id: str
parameter: str
value: Any = None


@router.post("/set_project_settings_value")
def set_project_settings_value(data: SetProjectSettingsValueModel, ph=Depends(pandahub)):
ph.set_project_settings_value(**data.model_dump())


# -------------------------
# Metadata
# -------------------------


class GetProjectMetadataModel(BaseModel):
project_id: str


@router.post("/get_project_metadata")
def get_project_metadata(data: GetProjectMetadataModel, ph=Depends(pandahub)):
metadata = ph.get_project_metadata(**data.model_dump())
return metadata


class SetProjectMetadataModel(BaseModel):
project_id: str
metadata: dict


@router.post("/set_project_metadata")
def set_project_metadata(data: SetProjectMetadataModel, ph=Depends(pandahub)):
return ph.set_project_metadata(**data.model_dump())
8 changes: 2 additions & 6 deletions pandahub/api/routers/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,8 @@
from pandahub.api.internal.schemas import UserRead, UserUpdate
from pandahub.api.internal.users import fastapi_users

router = APIRouter(
prefix="/users",
tags=["users"]
)
router = APIRouter(prefix="/users", tags=["users"])

router.include_router(
fastapi_users.get_users_router(UserRead, UserUpdate,
requires_verification=settings.EMAIL_VERIFICATION_REQUIRED),
fastapi_users.get_users_router(UserRead, UserUpdate, requires_verification=settings.EMAIL_VERIFICATION_REQUIRED),
)
Loading