"Finished."

This commit is contained in:
Yaro Kasear 2025-08-26 13:28:01 -05:00
parent 34928e794d
commit d6ba934955
7 changed files with 11 additions and 9 deletions

View file

@ -1,6 +1,6 @@
{% macro options(items, value_attr="id", label_path="name", getp=None) -%} {% macro options(items, value_attr="id", label_path="name", getp=None) -%}
{%- for obj in items -%} {%- for obj in items -%}
<option value="{{ getattr(obj, value_attr) }}">{{ getp(obj, label_path) }}</option> <option value="{{ getp(obj, value_attr) }}">{{ getp(obj, label_path) }}</option>
{%- endfor -%} {%- endfor -%}
{% endmacro %} {% endmacro %}

View file

@ -1,4 +1,4 @@
{% import "crudkit/_macros.html" as ui %} {% import "_macros.html" as ui %}
{# The action points at your JSON endpoints. Adjust 'crud' if you named it differently. #} {# The action points at your JSON endpoints. Adjust 'crud' if you named it differently. #}
{% if obj %} {% if obj %}
{% set action = url_for('crud.update_item', model=model, id=obj.id) %} {% set action = url_for('crud.update_item', model=model, id=obj.id) %}

View file

@ -1,2 +1,2 @@
{% import "crudkit/_macros.html" as ui %} {% import "_macros.html" as ui %}
{{ ui.lis(items, label_path=label_path, sublabel_path=sublabel_path, getp=getp) }} {{ ui.lis(items, label_path=label_path, sublabel_path=sublabel_path, getp=getp) }}

View file

@ -1,3 +1,3 @@
{# Renders only <option>...</option> rows #} {# Renders only <option>...</option> rows #}
{% import "crudkit/_macros.html" as ui %} {% import "_macros.html" as ui %}
{{ ui.options(items, value_attr=value_attr, label_path=label_path, getp=getp) }} {{ ui.options(items, value_attr=value_attr, label_path=label_path, getp=getp) }}

View file

@ -1,3 +1,3 @@
{% import "crudkit/_macros.html" as ui %} {% import "_macros.html" as ui %}
{{ ui.rows(items, fields, getp=getp) }} {{ ui.rows(items, fields, getp=getp) }}
{{ ui.pager(model, page, pages, per_page, sort, filters) }} {{ ui.pager(model, page, pages, per_page, sort, filters) }}

View file

@ -18,7 +18,7 @@ def make_fragments_blueprint(db_session_factory, registry: Dict[str, Any], *, na
GET /<model>/frag/rows -> <tr>...</tr> + pager markup if wanted GET /<model>/frag/rows -> <tr>...</tr> + pager markup if wanted
GET /<model>/frag/form -> <form>...</form> (auto-generated) GET /<model>/frag/form -> <form>...</form> (auto-generated)
""" """
bp = Blueprint(name, __name__, template_folder="../templates/crudkit") bp = Blueprint(name, __name__, template_folder="templates/crudkit")
def session(): return scoped_session(db_session_factory)() def session(): return scoped_session(db_session_factory)()
def _parse_filters(args): def _parse_filters(args):

View file

@ -1,8 +1,9 @@
from flask import Flask from flask import Flask, render_template
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from .models import Base, Author, Book from .models import Base, Author, Book
from crudkit import make_blueprint from crudkit.blueprint import make_blueprint as make_json_blueprint
from crudkit.html import make_fragments_blueprint
engine = create_engine("sqlite:///example.db", echo=True, future=True) engine = create_engine("sqlite:///example.db", echo=True, future=True)
SessionLocal = sessionmaker(bind=engine, expire_on_commit=False) SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
@ -15,7 +16,8 @@ registry = {"author": Author, "book": Book}
def create_app(): def create_app():
app = Flask(__name__) app = Flask(__name__)
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
app.register_blueprint(make_blueprint(session_factory, registry), url_prefix="/api") app.register_blueprint(make_json_blueprint(session_factory, registry), url_prefix="/api")
app.register_blueprint(make_fragments_blueprint(session_factory, registry), url_prefix="/ui")
return app return app
if __name__ == "__main__": if __name__ == "__main__":