feat: add page admin market CRUD and update shared_lib
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 43s

- Market create/delete routes in post admin blueprint
- markets.py service (create_market, soft_delete_market)
- _markets_panel.html admin template with HTMX create/delete
- Update shared_lib submodule (MarketPlace model, migration, URLs)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-10 18:08:32 +00:00
parent 632df29356
commit 24d3860952
4 changed files with 227 additions and 1 deletions

View File

@@ -533,4 +533,98 @@ def register():
return redirect(redirect_url)
@bp.get("/markets/")
@require_admin
async def markets(slug: str):
"""List markets for this page."""
from models.market_place import MarketPlace
from sqlalchemy import select as sa_select
post = (g.post_data or {}).get("post", {})
post_id = post.get("id")
if not post_id:
return await make_response("Post not found", 404)
page_markets = (await g.s.execute(
sa_select(MarketPlace).where(
MarketPlace.post_id == post_id,
MarketPlace.deleted_at.is_(None),
).order_by(MarketPlace.name)
)).scalars().all()
html = await render_template(
"_types/post/admin/_markets_panel.html",
markets=page_markets,
post=post,
)
return await make_response(html)
@bp.post("/markets/new/")
@require_admin
async def create_market(slug: str):
"""Create a new market for this page."""
from ..services.markets import create_market as _create_market, MarketError
from models.market_place import MarketPlace
from sqlalchemy import select as sa_select
from quart import jsonify
post = (g.post_data or {}).get("post", {})
post_id = post.get("id")
if not post_id:
return jsonify({"error": "Post not found"}), 404
form = await request.form
name = (form.get("name") or "").strip()
try:
await _create_market(g.s, post_id, name)
except MarketError as e:
return jsonify({"error": str(e)}), 400
# Return updated markets list
page_markets = (await g.s.execute(
sa_select(MarketPlace).where(
MarketPlace.post_id == post_id,
MarketPlace.deleted_at.is_(None),
).order_by(MarketPlace.name)
)).scalars().all()
html = await render_template(
"_types/post/admin/_markets_panel.html",
markets=page_markets,
post=post,
)
return await make_response(html)
@bp.delete("/markets/<market_slug>/")
@require_admin
async def delete_market(slug: str, market_slug: str):
"""Soft-delete a market."""
from ..services.markets import soft_delete_market
from models.market_place import MarketPlace
from sqlalchemy import select as sa_select
from quart import jsonify
post = (g.post_data or {}).get("post", {})
post_id = post.get("id")
deleted = await soft_delete_market(g.s, slug, market_slug)
if not deleted:
return jsonify({"error": "Market not found"}), 404
# Return updated markets list
page_markets = (await g.s.execute(
sa_select(MarketPlace).where(
MarketPlace.post_id == post_id,
MarketPlace.deleted_at.is_(None),
).order_by(MarketPlace.name)
)).scalars().all()
html = await render_template(
"_types/post/admin/_markets_panel.html",
markets=page_markets,
post=post,
)
return await make_response(html)
return bp