feat(market): enable/disable like any other games

This commit is contained in:
2026-10-16 00:23:27 +02:00
parent 107fe8b69b
commit 919e611895
17 changed files with 112 additions and 97 deletions
+9
View File
@@ -1,11 +1,13 @@
from typing import List
from ninja import Router
from ninja.decorators import decorate_view
from ninja.errors import HttpError
from django.shortcuts import get_object_or_404
from django.db.models import Sum, Prefetch
from django.db.models.functions import Coalesce
from django.db import transaction
from games.decorators import require_game_enabled
from market.models import (
Market,
MarketOption,
@@ -29,6 +31,7 @@ PREFIX = "/events/{event_path}/market"
@router.get(f"{PREFIX}/", response=List[MarketListSchema])
@decorate_view(require_game_enabled(path="market"))
def list_markets(request, event_path: str):
"""List all markets (excludes draft markets)."""
markets = Market.for_event.exclude(status=Market.Status.DRAFT)
@@ -41,6 +44,7 @@ def list_markets(request, event_path: str):
@router.get(f"{PREFIX}/user/bets", response=List[UserBetSchema])
@decorate_view(require_game_enabled(path="market"))
def list_user_bets(request, event_path: str):
"""List all bets placed by the current user."""
if not request.user.is_authenticated:
@@ -54,6 +58,7 @@ def list_user_bets(request, event_path: str):
@router.get(f"{PREFIX}/user/points", response=UserPointsSchema)
@decorate_view(require_game_enabled(path="market"))
def get_user_points(request, event_path: str):
"""Get the current user's points balance for this event."""
if not request.user.is_authenticated:
@@ -63,6 +68,7 @@ def get_user_points(request, event_path: str):
@router.get(f"{PREFIX}/{{market_uuid}}/history", response=List[BetHistoryPointSchema])
@decorate_view(require_game_enabled(path="market"))
def bet_history(request, event_path: str, market_uuid: str):
"""Points added to each option over time (anonymous, one entry per bet placed/increased)."""
market = get_object_or_404(
@@ -93,6 +99,7 @@ def bet_history(request, event_path: str, market_uuid: str):
@router.post(f"{PREFIX}/{{market_uuid}}/actions/close")
@decorate_view(require_game_enabled(path="market"))
def close_market(request, event_path: str, market_uuid: str):
"""Close a market. Admin only."""
if not request.user.is_staff:
@@ -105,6 +112,7 @@ def close_market(request, event_path: str, market_uuid: str):
@router.post(f"{PREFIX}/{{market_uuid}}/actions/resolve", response=MarketListSchema)
@decorate_view(require_game_enabled(path="market"))
def resolve_market(
request, event_path: str, market_uuid: str, payload: ResolveMarketSchema
):
@@ -172,6 +180,7 @@ def resolve_market(
@router.post(f"{PREFIX}/{{market_uuid}}/bets", response=UserBetSchema)
@decorate_view(require_game_enabled(path="market"))
def create_bet(
request, event_path: str, market_uuid: str, payload: UserBetCreateSchema
):