Shared base logic used across AldanDev projects.
- v1 (legacy):
notora.v1 - v2 (next-gen toolkit):
notora.v2
from notora.v2.repositories import Repository, RepoConfig
from notora.v2.services import RepositoryService, ServiceConfig
repo = Repository(
User,
config=RepoConfig(default_limit=50),
)
service = RepositoryService(
repo,
config=ServiceConfig(detail_schema=UserSchema, list_schema=UserListSchema),
)docs/v2/index.mddocs/v2/models.mddocs/v2/repositories.mddocs/v2/services.mddocs/v2/query-dsl.mddocs/v2/pagination.mddocs/v2/m2m.mddocs/v2/recipes.md
from notora.v2.repositories import QueryParams, PaginationParams
rows = await service.list_raw(
session,
limit=None, # no limit
)
params = QueryParams(filters=[...], ordering=[...], limit=None)
rows = await service.list_raw_params(session, params)
page = await service.paginate_params(
session,
PaginationParams(limit=20, offset=0, filters=[...]),
)from notora.v2.repositories import build_repository, RepoConfig
from notora.v2.services import build_service, ServiceConfig
repo = build_repository(User, config=RepoConfig(default_limit=25))
service = build_service(User, repo=repo, service_config=ServiceConfig(detail_schema=UserSchema))from fastapi import Depends
from notora.v2.repositories import (
FilterField,
QueryParams,
QueryInput,
SortField,
build_query_params,
make_query_params_dependency,
)
filter_fields = {
'name': FilterField(resolver=lambda m: m.name, value_type=str),
'age': FilterField(resolver=lambda m: m.age, value_type=int, operators={'eq', 'gte', 'lte'}),
}
sort_fields = {
'name': SortField(resolver=lambda m: m.name),
'created_at': SortField(resolver=lambda m: m.created_at),
}
def query_params(query: QueryInput = Depends()) -> QueryParams[User]:
return build_query_params(
query,
model=User,
filter_fields=filter_fields,
sort_fields=sort_fields,
)
query_params_dep = make_query_params_dependency(
model=User,
filter_fields=filter_fields,
sort_fields=sort_fields,
)
# Example request:
# /users?filter=name:eq:john&filter=age:gte:18&sort=-created_at&limit=20&offset=0Supported operators: eq, ne, lt, lte, gt, gte, in, ilike, isnull.
from notora.v2.services import M2MSyncMode
class UserService(RepositoryService[UUID, User, UserSchema]):
m2m_sync_mode: M2MSyncMode = M2MSyncMode.ADD