Added CRUDKit registry functionality.
This commit is contained in:
parent
cb74511677
commit
64e8d6871f
5 changed files with 67 additions and 23 deletions
25
crudkit/integration.py
Normal file
25
crudkit/integration.py
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
from typing import Type
|
||||||
|
from flask import Flask
|
||||||
|
|
||||||
|
from crudkit.engines import CRUDKitRuntime
|
||||||
|
|
||||||
|
from .registry import CRUDRegistry
|
||||||
|
|
||||||
|
class CRUDKit:
|
||||||
|
def __init__(self, app: Flask, runtime: CRUDKitRuntime):
|
||||||
|
self.app = app
|
||||||
|
self.runtime = runtime
|
||||||
|
self.registry = CRUDRegistry(runtime)
|
||||||
|
|
||||||
|
def register(self, model: Type, **kwargs):
|
||||||
|
return self.registry.register_class(self.app, model, **kwargs)
|
||||||
|
|
||||||
|
def register_many(self, models: list[Type], **kwargs):
|
||||||
|
return self.registry.register_many(self.app, models, **kwargs)
|
||||||
|
|
||||||
|
def get_model(self, key: str):
|
||||||
|
return self.registry.get_model(key)
|
||||||
|
|
||||||
|
def get_service(self, model: Type):
|
||||||
|
return self.registry.get_service(model)
|
||||||
|
|
@ -92,4 +92,29 @@ class CRUDRegistry:
|
||||||
bp.name = bp_name
|
bp.name = bp_name
|
||||||
app.register_blueprint(bp, url_prefix=prefix)
|
app.register_blueprint(bp, url_prefix=prefix)
|
||||||
|
|
||||||
reg = Registered(model=model, service=)
|
reg = Registered(model=model, service=svc, blueprint_name=bp_name, url_prefix=prefix)
|
||||||
|
self._bps_by_model[model] = reg
|
||||||
|
return reg
|
||||||
|
|
||||||
|
def register_many(
|
||||||
|
self,
|
||||||
|
app: Flask,
|
||||||
|
models: list[Type[Any]],
|
||||||
|
*,
|
||||||
|
base_prefix: str = "/api",
|
||||||
|
polymorphic: bool = False,
|
||||||
|
service_kwargs: Optional[dict] = None,
|
||||||
|
) -> list[Registered]:
|
||||||
|
out: list[Registered] = []
|
||||||
|
for m in models:
|
||||||
|
key = self._key(m)
|
||||||
|
out.append(
|
||||||
|
self.register_class(
|
||||||
|
app,
|
||||||
|
m,
|
||||||
|
url_prefix=f"{base_prefix}/{key}",
|
||||||
|
polymorphic=polymorphic,
|
||||||
|
service_kwargs=service_kwargs,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return out
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ def _build_href(spec: Dict[str, Any], row: Dict[str, Any], obj) -> Optional[str]
|
||||||
print(f"[render_table] url_for failed: endpoint={spec}: params={params}")
|
print(f"[render_table] url_for failed: endpoint={spec}: params={params}")
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
return url_for(spec["endpoint"], **params)
|
return url_for('crudkit.' + spec["endpoint"], **params)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[render_table] url_for failed: endpoint={spec['endpoint']} params={params} err={e}")
|
print(f"[render_table] url_for failed: endpoint={spec['endpoint']} params={params} err={e}")
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ from flask import Flask
|
||||||
from crudkit import ProdConfig
|
from crudkit import ProdConfig
|
||||||
from crudkit.api.flask_api import generate_crud_blueprint
|
from crudkit.api.flask_api import generate_crud_blueprint
|
||||||
from crudkit.core.service import CRUDService
|
from crudkit.core.service import CRUDService
|
||||||
|
from crudkit.integration import CRUDKit
|
||||||
from crudkit.integrations.flask import init_app
|
from crudkit.integrations.flask import init_app
|
||||||
|
|
||||||
from .config import DevConfig
|
from .config import DevConfig
|
||||||
|
|
@ -17,6 +18,7 @@ def create_app(config_cls=DevConfig) -> Flask:
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
runtime = init_app(app, config=ProdConfig)
|
runtime = init_app(app, config=ProdConfig)
|
||||||
|
crud = CRUDKit(app, runtime)
|
||||||
print(f"Effective DB URL: {str(runtime.engine.url)}")
|
print(f"Effective DB URL: {str(runtime.engine.url)}")
|
||||||
|
|
||||||
from . import models as _models
|
from . import models as _models
|
||||||
|
|
@ -30,27 +32,19 @@ def create_app(config_cls=DevConfig) -> Flask:
|
||||||
|
|
||||||
session = Session
|
session = Session
|
||||||
|
|
||||||
area_service = CRUDService(_models.Area, session)
|
crud.register_many([
|
||||||
brand_service = CRUDService(_models.Brand, session)
|
_models.Area,
|
||||||
device_type_service = CRUDService(_models.DeviceType, session)
|
_models.Brand,
|
||||||
image_service = CRUDService(_models.Image, session)
|
_models.DeviceType,
|
||||||
inventory_service = CRUDService(_models.Inventory, session)
|
_models.Image,
|
||||||
room_function_service = CRUDService(_models.RoomFunction, session)
|
_models.Inventory,
|
||||||
room_service = CRUDService(_models.Room, session)
|
_models.RoomFunction,
|
||||||
user_service = CRUDService(_models.User, session)
|
_models.Room,
|
||||||
work_log_service = CRUDService(_models.WorkLog, session)
|
_models.User,
|
||||||
work_note_service = CRUDService(_models.WorkNote, session)
|
_models.WorkLog,
|
||||||
|
_models.WorkNote,
|
||||||
|
])
|
||||||
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.Area, area_service), url_prefix="/api/area")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.Brand, brand_service), url_prefix="/api/brand")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.DeviceType, device_type_service), url_prefix="/api/device_type")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.Image, image_service), url_prefix="/api/image")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.Inventory, inventory_service), url_prefix="/api/inventory")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.RoomFunction, room_function_service), url_prefix="/api/room_function")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.Room, room_service), url_prefix="/api/room")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.User, user_service), url_prefix="/api/user")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.WorkLog, work_log_service), url_prefix="/api/work_log")
|
|
||||||
app.register_blueprint(generate_crud_blueprint(_models.WorkNote, work_note_service), url_prefix="/api/work_note")
|
|
||||||
app.register_blueprint(bp_reports)
|
app.register_blueprint(bp_reports)
|
||||||
|
|
||||||
init_index_routes(app)
|
init_index_routes(app)
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
{% if rows %}
|
{% if rows %}
|
||||||
{% for row in rows %}
|
{% for row in rows %}
|
||||||
<tr onclick="location.href='{{ url_for(kwargs['opts']['object_class'] + '.get_item', id=row.id) }}'" style="cursor: pointer;">
|
<tr onclick="location.href='{{ url_for( 'crudkit.' + kwargs['opts']['object_class'] + '.get_item', id=row.id) }}'" style="cursor: pointer;">
|
||||||
{% for cell in row.cells %}
|
{% for cell in row.cells %}
|
||||||
{% if cell.href %}
|
{% if cell.href %}
|
||||||
<td class="{{ cell.class or '' }}"><a href="{{ cell.href }}" class="link-success link-underline link-underline-opacity-0 fw-semibold">{{ cell.text if cell.text is not none else '-' }}</a></td>
|
<td class="{{ cell.class or '' }}"><a href="{{ cell.href }}" class="link-success link-underline link-underline-opacity-0 fw-semibold">{{ cell.text if cell.text is not none else '-' }}</a></td>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue