Skip to content

Commit

Permalink
draft events for ui
Browse files Browse the repository at this point in the history
  • Loading branch information
jrycw committed Feb 29, 2024
1 parent f71c307 commit 1f447c6
Show file tree
Hide file tree
Showing 23 changed files with 527 additions and 241 deletions.
30 changes: 22 additions & 8 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,27 @@ class UserID(BaseModel):


class UserBase(BaseModel):
name: str = Field(max_length=50)
name: str = Field(title="Username", description="max length: 50", max_length=50)


class UserCreate(UserBase):
pass


class UserUpdate(UserCreate):
new_name: str = Field(max_length=50)
new_name: str = Field(
title="New Username", description="max length: 50", max_length=50
)


class UserFull(Auditable, UserID, UserBase):
class UserFull(Auditable, UserBase, UserID):
pass


class UserRepr(UserFull):
n_events: int


################################
# Event
################################
Expand All @@ -44,20 +50,28 @@ class EventID(BaseModel):


class EventBase(BaseModel):
name: str
name: str = Field(title="Eventname", description="max length: 50", max_length=50)


class EventCreate(EventBase):
host_name: str | None = Field(
title="Hostname", description="max length: 50", max_length=50
)
address: str | None
schedule: datetime.datetime | None
host_name: str = Field(max_length=50)
schedule: str | None


class EventUpdate(EventCreate):
new_name: str = Field(max_length=50)
new_name: str | None = Field(
title="New Eventname", description="max length: 50", max_length=50
)


class EventFull(Auditable, EventCreate, EventID):
pass


class EventFull(Auditable, EventID, EventCreate):
class EventRepr(EventFull):
pass


Expand Down
17 changes: 10 additions & 7 deletions app/queries/create_event.edgeql
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
with name := <str>$name,
address := <str>$address,
schedule := <datetime>$schedule,
host_name := <str>$host_name

address := <optional str>$address ?? <str>{},
schedule := <datetime>(<optional str>$schedule ?? <str>{}),
host_name := <str>$host_name,
select (
insert Event {
name := name,
address := address,
schedule := schedule,
host := assert_single(
(select detached User filter .name = host_name)
host := (
with u:= assert_single((select User filter .name = host_name)),
select
if exists u then (u)
else if exists host_name then (insert User {name:= host_name})
else (<User>{})
)
}
) {name, address, schedule, host: {name}};
) {name, address, schedule, host: {name}};
21 changes: 12 additions & 9 deletions app/queries/create_event_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class CreateEventResult(NoPydanticValidation):
name: str
address: str | None
schedule: datetime.datetime | None
host: CreateEventResultHost | None
host: CreateEventResultHost


@dataclasses.dataclass
Expand All @@ -44,24 +44,27 @@ async def create_event(
executor: edgedb.AsyncIOExecutor,
*,
name: str,
address: str,
schedule: datetime.datetime,
address: str | None,
schedule: str | None,
host_name: str,
) -> CreateEventResult:
return await executor.query_single(
"""\
with name := <str>$name,
address := <str>$address,
schedule := <datetime>$schedule,
host_name := <str>$host_name
address := <optional str>$address ?? <str>{},
schedule := <datetime>(<optional str>$schedule ?? <str>{}),
host_name := <str>$host_name,
select (
insert Event {
name := name,
address := address,
schedule := schedule,
host := assert_single(
(select detached User filter .name = host_name)
host := (
with u:= assert_single((select User filter .name = host_name)),
select
if exists u then (u)
else if exists host_name then (insert User {name:= host_name})
else (<User>{})
)
}
) {name, address, schedule, host: {name}};\
Expand Down
2 changes: 1 addition & 1 deletion app/queries/delete_event_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class DeleteEventResult(NoPydanticValidation):
name: str
address: str | None
schedule: datetime.datetime | None
host: DeleteEventResultHost | None
host: DeleteEventResultHost


@dataclasses.dataclass
Expand Down
2 changes: 1 addition & 1 deletion app/queries/get_event_by_name_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class GetEventByNameResult(NoPydanticValidation):
created_at: datetime.datetime
address: str | None
schedule: datetime.datetime | None
host: GetEventByNameResultHost | None
host: GetEventByNameResultHost


@dataclasses.dataclass
Expand Down
2 changes: 1 addition & 1 deletion app/queries/get_events_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class GetEventsResult(NoPydanticValidation):
created_at: datetime.datetime
address: str | None
schedule: datetime.datetime | None
host: GetEventsResultHost | None
host: GetEventsResultHost


@dataclasses.dataclass
Expand Down
4 changes: 4 additions & 0 deletions app/queries/search_users_by_name_ilike.edgeql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
with name:= <optional str>$name ?? "%",
name:= "%" ++ <str>$name ++ "%",
users:= (select User filter .name ilike name),
select users.name;
22 changes: 22 additions & 0 deletions app/queries/search_users_by_name_ilike_async_edgeql.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# AUTOGENERATED FROM 'app/queries/search_users_by_name_ilike.edgeql' WITH:
# $ edgedb-py


from __future__ import annotations
import edgedb


async def search_users_by_name_ilike(
executor: edgedb.AsyncIOExecutor,
*,
name: str | None,
) -> list[str]:
return await executor.query(
"""\
with name:= <optional str>$name ?? "%",
name:= "%" ++ <str>$name ++ "%",
users:= (select User filter .name ilike name),
select users.name;\
""",
name=name,
)
22 changes: 16 additions & 6 deletions app/queries/update_event.edgeql
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
with name := <str>$name,
new_name := <str>$new_name,
address := <str>$address,
schedule := <datetime>$schedule,
host_name := <str>$host_name

orig_event := assert_exists(assert_single((select Event filter .name=name))),
orig_event_name:= orig_event.name,
orig_event_address:= orig_event.address,
orig_event_schedule:= orig_event.schedule,
orig_event_host_name:= orig_event.host.name,
new_name := <optional str>$new_name ?? orig_event_name,
address := <optional str>$address ?? orig_event_address,
schedule := <datetime>(<optional str>$schedule) ?? orig_event_schedule,
host_name := <optional str>$host_name ?? orig_event_host_name,
select (
update Event filter .name = name
set {
name := new_name,
address := address,
schedule := schedule,
host := (select User filter .name = host_name)
host := (
with u:= assert_single((select detached User filter .name = host_name)),
select
if exists u then (u)
else if exists host_name then (insert User {name:= host_name})
else (<User>{})
)
}
) {name, address, schedule, host: {name}};
32 changes: 21 additions & 11 deletions app/queries/update_event_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class UpdateEventResult(NoPydanticValidation):
name: str
address: str | None
schedule: datetime.datetime | None
host: UpdateEventResultHost | None
host: UpdateEventResultHost


@dataclasses.dataclass
Expand All @@ -44,26 +44,36 @@ async def update_event(
executor: edgedb.AsyncIOExecutor,
*,
name: str,
new_name: str,
address: str,
schedule: datetime.datetime,
host_name: str,
new_name: str | None,
address: str | None,
schedule: str | None,
host_name: str | None,
) -> UpdateEventResult | None:
return await executor.query_single(
"""\
with name := <str>$name,
new_name := <str>$new_name,
address := <str>$address,
schedule := <datetime>$schedule,
host_name := <str>$host_name
orig_event := assert_exists(assert_single((select Event filter .name=name))),
orig_event_name:= orig_event.name,
orig_event_address:= orig_event.address,
orig_event_schedule:= orig_event.schedule,
orig_event_host_name:= orig_event.host.name,
new_name := <optional str>$new_name ?? orig_event_name,
address := <optional str>$address ?? orig_event_address,
schedule := <datetime>(<optional str>$schedule) ?? orig_event_schedule,
host_name := <optional str>$host_name ?? orig_event_host_name,
select (
update Event filter .name = name
set {
name := new_name,
address := address,
schedule := schedule,
host := (select User filter .name = host_name)
host := (
with u:= assert_single((select detached User filter .name = host_name)),
select
if exists u then (u)
else if exists host_name then (insert User {name:= host_name})
else (<User>{})
)
}
) {name, address, schedule, host: {name}};\
""",
Expand Down
24 changes: 24 additions & 0 deletions app/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,35 @@
from .queries import delete_user_async_edgeql as delete_user_qry
from .queries import get_user_by_name_async_edgeql as get_user_by_name_qry
from .queries import get_users_async_edgeql as get_users_qry
from .queries import (
search_users_by_name_ilike_async_edgeql as search_users_by_name_ilike_qry,
)
from .queries import update_user_async_edgeql as update_user_qry

router = APIRouter()


################################
# Search users
################################


@router.get(
"/users/search",
response_model=list[str],
tags=["users"],
)
async def search_users_ilike(
services: svcs.fastapi.DepContainer,
name: Annotated[str | None, Query(max_length=50)] = None,
):
client = await services.aget(AsyncIOClient)
result = await search_users_by_name_ilike_qry.search_users_by_name_ilike(
client, name=name
)
return result


################################
# Get users
################################
Expand Down
2 changes: 1 addition & 1 deletion dbschema/default.esdl
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ module default {
}
address : str;
schedule : datetime;
host : User;
required host : User;
}
}
4 changes: 2 additions & 2 deletions dbschema/migrations/00001.edgeql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CREATE MIGRATION m1t4s2zsgjiurqmwgfreo6wt7duc2h44fes3m3qych2rirxwmklgqa
CREATE MIGRATION m1hap22pa54folvlgr5w4iwft7xhw43nd32txuobmaf2b7rbkfujzq
ONTO initial
{
CREATE ABSTRACT TYPE default::Auditable {
Expand All @@ -14,7 +14,7 @@ CREATE MIGRATION m1t4s2zsgjiurqmwgfreo6wt7duc2h44fes3m3qych2rirxwmklgqa
};
};
CREATE TYPE default::Event EXTENDING default::Auditable {
CREATE LINK host: default::User;
CREATE REQUIRED LINK host: default::User;
CREATE PROPERTY address: std::str;
CREATE REQUIRED PROPERTY name: std::str {
CREATE CONSTRAINT std::exclusive;
Expand Down
Empty file added fastui_app/__init__.py
Empty file.
17 changes: 17 additions & 0 deletions fastui_app/_lifespan.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import edgedb
import svcs
from edgedb.asyncio_client import AsyncIOClient
from fastapi import FastAPI
from httpx import AsyncClient

Expand All @@ -18,6 +20,21 @@ async def setup_httpx_client():
AsyncClient,
setup_httpx_client,
)
if settings.frontenddebug:
# EdgeDB client
db_client = edgedb.create_async_client()

async def setup_db_client():
yield db_client

async def ping_db_callable(_db_client):
return await _db_client.query("select 1;")

registry.register_factory(
AsyncIOClient,
setup_db_client,
ping=ping_db_callable,
)

yield

Expand Down
8 changes: 1 addition & 7 deletions fastui_app/common.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
from fastapi import (
APIRouter,
HTTPException, # noqa: F401
)
from fastapi import APIRouter
from fastapi.responses import HTMLResponse
from fastui import AnyComponent, FastUI, prebuilt_html
from fastui import components as c
from fastui.events import BackEvent, GoToEvent, PageEvent # noqa:F401

from .models import EventFull, UserFull # noqa: F401
from .shared import demo_page
from .utils import _raise_for_status # noqa: F401

router = APIRouter(include_in_schema=False)

Expand Down
Loading

0 comments on commit 1f447c6

Please sign in to comment.