|
|
@@ -433,7 +433,7 @@ async def list_archives(
|
|
|
),
|
|
|
limit: int = 50,
|
|
|
offset: int = 0,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -561,7 +561,7 @@ async def list_archives(
|
|
|
|
|
|
@router.get("/last-per-printer", response_model=list[ArchiveResponse])
|
|
|
async def list_last_archive_per_printer(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -620,7 +620,7 @@ async def list_last_archive_per_printer(
|
|
|
|
|
|
@router.get("/no-3mf-warning")
|
|
|
async def no_3mf_warning(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -733,7 +733,7 @@ async def list_archives_slim(
|
|
|
created_by_id: int | None = Query(None, description="Filter by user who created the print (-1 for no user)"),
|
|
|
limit: int = Query(default=10000, le=50000),
|
|
|
offset: int = 0,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -850,7 +850,7 @@ async def search_archives(
|
|
|
status: str | None = None,
|
|
|
limit: int = 50,
|
|
|
offset: int = 0,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -981,7 +981,7 @@ async def search_archives(
|
|
|
|
|
|
@router.post("/search/rebuild-index")
|
|
|
async def rebuild_search_index(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
):
|
|
|
"""Rebuild the full-text search index from existing archives.
|
|
|
@@ -1032,7 +1032,7 @@ async def analyze_failures(
|
|
|
printer_id: int | None = None,
|
|
|
project_id: int | None = None,
|
|
|
created_by_id: int | None = Query(None, description="Filter by user who created the print (-1 for no user)"),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1074,7 +1074,7 @@ async def analyze_failures(
|
|
|
@router.get("/compare")
|
|
|
async def compare_archives(
|
|
|
archive_ids: str = Query(..., description="Comma-separated archive IDs (2-5)"),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1146,7 +1146,7 @@ async def export_archives(
|
|
|
None, max_length=64, description="IANA zone the dates are calendar days in; the server's when omitted"
|
|
|
),
|
|
|
search: str | None = None,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
@@ -1230,7 +1230,7 @@ async def export_stats(
|
|
|
printer_id: int | None = None,
|
|
|
project_id: int | None = None,
|
|
|
created_by_id: int | None = Query(None, description="Filter by user who created the print (-1 for no user)"),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.STATS_READ),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
actor: User | ApiKeyActor | None = RequestActor,
|
|
|
@@ -1273,7 +1273,7 @@ async def get_archive_stats(
|
|
|
None, max_length=64, description="IANA zone the dates are calendar days in; the server's when omitted"
|
|
|
),
|
|
|
created_by_id: int | None = Query(None, description="Filter by user who created the print (-1 for no user)"),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.STATS_READ),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
actor: User | ApiKeyActor | None = RequestActor,
|
|
|
@@ -1661,7 +1661,7 @@ async def _sum_snapshot_deltas(
|
|
|
|
|
|
@router.get("/tags")
|
|
|
async def get_all_tags(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1704,7 +1704,7 @@ async def get_all_tags(
|
|
|
async def rename_tag(
|
|
|
tag_name: str,
|
|
|
request: Request,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -1757,7 +1757,7 @@ async def rename_tag(
|
|
|
@router.delete("/tags/{tag_name}")
|
|
|
async def delete_tag(
|
|
|
tag_name: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -1793,7 +1793,7 @@ async def delete_tag(
|
|
|
@router.get("/{archive_id}", response_model=ArchiveResponse)
|
|
|
async def get_archive(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1823,7 +1823,7 @@ async def get_archive(
|
|
|
@router.get("/{archive_id}/delete-impact")
|
|
|
async def get_archive_delete_impact(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1853,7 +1853,7 @@ async def get_archive_delete_impact(
|
|
|
@router.get("/{archive_id}/runs", response_model=PrintLogResponse)
|
|
|
async def list_archive_runs(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1886,7 +1886,7 @@ async def list_archive_runs(
|
|
|
async def find_similar_archives(
|
|
|
archive_id: int,
|
|
|
limit: int = 10,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -1920,7 +1920,7 @@ async def find_similar_archives(
|
|
|
async def update_archive(
|
|
|
archive_id: int,
|
|
|
update_data: ArchiveUpdate,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -2079,7 +2079,7 @@ async def update_archive(
|
|
|
@router.post("/{archive_id}/favorite", response_model=ArchiveResponse)
|
|
|
async def toggle_favorite(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -2176,7 +2176,7 @@ async def _one_print_cost(db: AsyncSession, archive: PrintArchive, previous_gram
|
|
|
|
|
|
@router.post("/recalculate-costs")
|
|
|
async def recalculate_all_costs(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -2277,7 +2277,7 @@ async def recalculate_all_costs(
|
|
|
@router.get("/{archive_id}/duplicates")
|
|
|
async def get_archive_duplicates(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2304,7 +2304,7 @@ async def get_archive_duplicates(
|
|
|
|
|
|
@router.post("/backfill-hashes")
|
|
|
async def backfill_content_hashes(
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -2348,7 +2348,7 @@ async def delete_archive(
|
|
|
"drop the row from statistics (#1343)."
|
|
|
),
|
|
|
),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_DELETE_ALL,
|
|
|
@@ -2418,7 +2418,7 @@ async def delete_archive(
|
|
|
async def download_archive(
|
|
|
archive_id: int,
|
|
|
inline: bool = False,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2451,7 +2451,7 @@ async def download_archive(
|
|
|
async def download_archive_with_filename(
|
|
|
archive_id: int,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2479,7 +2479,7 @@ async def download_archive_with_filename(
|
|
|
@router.post("/{archive_id}/slicer-token")
|
|
|
async def create_archive_slicer_token(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2508,7 +2508,7 @@ async def download_archive_for_slicer(
|
|
|
archive_id: int,
|
|
|
token: str,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
):
|
|
|
"""Download 3MF file using a slicer download token.
|
|
|
|
|
|
@@ -2542,7 +2542,7 @@ async def download_archive_for_slicer(
|
|
|
@router.get("/{archive_id}/thumbnail")
|
|
|
async def get_thumbnail(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2782,7 +2782,7 @@ async def download_archive_media_with_token(
|
|
|
@router.get("/{archive_id}/timelapse")
|
|
|
async def get_timelapse(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -2828,7 +2828,7 @@ async def get_timelapse(
|
|
|
@router.delete("/{archive_id}/timelapse")
|
|
|
async def delete_timelapse(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_DELETE_ALL,
|
|
|
@@ -2883,7 +2883,7 @@ async def scan_timelapse(
|
|
|
|
|
|
# Read the archive + printer in a short session and release the pooled DB
|
|
|
# connection BEFORE the FTP scan/download below — a timelapse pull walks
|
|
|
- # several directories and fetches a 100MB+ video, so holding Depends(get_db)
|
|
|
+ # several directories and fetches a 100MB+ video, so holding Depends(get_db, scope="function")
|
|
|
# across it pinned one connection idle-in-transaction for minutes (#2572).
|
|
|
# Scalar columns stay readable on the detached rows (expire_on_commit=False);
|
|
|
# the attach at the end runs in its own fresh short session.
|
|
|
@@ -3265,7 +3265,7 @@ async def select_timelapse(
|
|
|
async def upload_timelapse(
|
|
|
archive_id: int,
|
|
|
file: UploadFile = File(...),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -3291,7 +3291,7 @@ async def upload_timelapse(
|
|
|
@router.get("/{archive_id}/timelapse/info")
|
|
|
async def get_timelapse_info(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -3328,7 +3328,7 @@ async def get_timelapse_thumbnails(
|
|
|
archive_id: int,
|
|
|
count: int = Query(10, ge=1, le=30),
|
|
|
width: int = Query(160, ge=80, le=320),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -3376,7 +3376,7 @@ async def process_timelapse(
|
|
|
save_mode: str = Form("new"),
|
|
|
output_filename: str = Form(None),
|
|
|
audio: UploadFile = File(None),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -3518,7 +3518,7 @@ async def _timelapse_job_archive(archive_id: int, db: AsyncSession, printer_scop
|
|
|
@router.get("/{archive_id}/timelapse/job")
|
|
|
async def get_timelapse_job(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -3536,7 +3536,7 @@ async def get_timelapse_job(
|
|
|
@router.delete("/{archive_id}/timelapse/job")
|
|
|
async def cancel_timelapse_job(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -3561,7 +3561,7 @@ async def cancel_timelapse_job(
|
|
|
async def upload_photo(
|
|
|
archive_id: int,
|
|
|
file: UploadFile = File(...),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -3609,7 +3609,7 @@ async def upload_photo(
|
|
|
async def get_photo(
|
|
|
archive_id: int,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -3661,7 +3661,7 @@ async def get_photo(
|
|
|
async def delete_photo(
|
|
|
archive_id: int,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_DELETE_ALL,
|
|
|
@@ -3851,7 +3851,7 @@ async def confirm_outcome_page(
|
|
|
request: Request,
|
|
|
token: str,
|
|
|
verdict: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
):
|
|
|
"""Open a one-tap verdict link. Reads only — the verdict is recorded by POST.
|
|
|
|
|
|
@@ -3886,7 +3886,7 @@ async def confirm_outcome_page(
|
|
|
async def confirm_outcome_by_token(
|
|
|
token: str,
|
|
|
verdict: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
):
|
|
|
"""Record a print-outcome verdict via the capability token from a push notification.
|
|
|
|
|
|
@@ -3946,7 +3946,7 @@ async def get_qrcode(
|
|
|
archive_id: int,
|
|
|
request: Request,
|
|
|
size: int = 200,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4009,7 +4009,7 @@ async def get_qrcode(
|
|
|
@router.get("/{archive_id}/capabilities")
|
|
|
async def get_archive_capabilities(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4237,7 +4237,7 @@ async def get_archive_capabilities(
|
|
|
async def get_gcode(
|
|
|
archive_id: int,
|
|
|
plate: int | None = None,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4295,7 +4295,7 @@ async def get_gcode(
|
|
|
@router.get("/{archive_id}/plate-preview")
|
|
|
async def get_plate_preview(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4381,7 +4381,7 @@ async def upload_archive(
|
|
|
"title is a stale name from whoever originally sliced it."
|
|
|
),
|
|
|
),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_CREATE),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -4444,7 +4444,7 @@ async def upload_archives_bulk(
|
|
|
"by default, which keeps the embedded name."
|
|
|
),
|
|
|
),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_CREATE),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -4522,7 +4522,7 @@ async def upload_archives_bulk(
|
|
|
@router.get("/{archive_id}/plates")
|
|
|
async def get_archive_plates(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4844,7 +4844,7 @@ async def get_archive_plates(
|
|
|
async def get_plate_thumbnail(
|
|
|
archive_id: int,
|
|
|
plate_index: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -4931,7 +4931,7 @@ async def get_filament_requirements(
|
|
|
plate_id: int | None = None,
|
|
|
request_id: str | None = None,
|
|
|
full_slots: bool = False,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5102,7 +5102,7 @@ async def get_filament_requirements(
|
|
|
async def slice_archive(
|
|
|
archive_id: int,
|
|
|
request: SliceRequest,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.LIBRARY_UPLOAD),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
actor: User | ApiKeyActor | None = RequestActor,
|
|
|
@@ -5245,7 +5245,7 @@ async def reprint_archive(
|
|
|
@router.get("/{archive_id}/project-page")
|
|
|
async def get_project_page(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5276,7 +5276,7 @@ async def get_project_page(
|
|
|
async def update_project_page(
|
|
|
archive_id: int,
|
|
|
update_data: dict,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -5311,7 +5311,7 @@ async def update_project_page(
|
|
|
async def get_project_image(
|
|
|
archive_id: int,
|
|
|
image_path: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_media_token_ownership(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5405,7 +5405,7 @@ def _resolve_source_3mf_path(archive: PrintArchive, source_filename: str) -> Pat
|
|
|
async def upload_source_3mf(
|
|
|
archive_id: int,
|
|
|
file: UploadFile = File(...),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -5457,7 +5457,7 @@ async def upload_source_3mf(
|
|
|
@router.get("/{archive_id}/source")
|
|
|
async def download_source_3mf(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5492,7 +5492,7 @@ async def download_source_3mf(
|
|
|
async def download_source_3mf_for_slicer(
|
|
|
archive_id: int,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5523,7 +5523,7 @@ async def download_source_3mf_for_slicer(
|
|
|
@router.post("/{archive_id}/source-slicer-token")
|
|
|
async def create_source_slicer_token(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5550,7 +5550,7 @@ async def download_source_3mf_for_slicer_with_token(
|
|
|
archive_id: int,
|
|
|
token: str,
|
|
|
filename: str,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
):
|
|
|
"""Download source 3MF using a slicer download token.
|
|
|
|
|
|
@@ -5586,7 +5586,7 @@ async def download_source_3mf_for_slicer_with_token(
|
|
|
async def upload_source_3mf_by_name(
|
|
|
file: UploadFile = File(...),
|
|
|
print_name: str = Query(None, description="Match archive by print name"),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
_: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_UPDATE_ALL),
|
|
|
printer_scope: PrinterScope = RequestPrinterScope,
|
|
|
):
|
|
|
@@ -5678,7 +5678,7 @@ async def upload_source_3mf_by_name(
|
|
|
@router.delete("/{archive_id}/source")
|
|
|
async def delete_source_3mf(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_DELETE_ALL,
|
|
|
@@ -5716,7 +5716,7 @@ async def delete_source_3mf(
|
|
|
async def upload_f3d(
|
|
|
archive_id: int,
|
|
|
file: UploadFile = File(...),
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_UPDATE_ALL,
|
|
|
@@ -5768,7 +5768,7 @@ async def upload_f3d(
|
|
|
@router.get("/{archive_id}/f3d")
|
|
|
async def download_f3d(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_READ_ALL,
|
|
|
@@ -5802,7 +5802,7 @@ async def download_f3d(
|
|
|
@router.delete("/{archive_id}/f3d")
|
|
|
async def delete_f3d(
|
|
|
archive_id: int,
|
|
|
- db: AsyncSession = Depends(get_db),
|
|
|
+ db: AsyncSession = Depends(get_db, scope="function"),
|
|
|
auth_result: tuple[User | ApiKeyActor | None, bool] = Depends(
|
|
|
require_ownership_permission(
|
|
|
Permission.ARCHIVES_DELETE_ALL,
|