V3 fix document delete issue

This commit is contained in:
Jim Lancaster
2026-08-08 21:58:19 -05:00
parent 4bf6c9e2f3
commit b59d3da23e
4 changed files with 39 additions and 5 deletions
+4
View File
@@ -128,6 +128,7 @@ class DocumentService(ServiceBase):
options=( options=(
selectinload(Document.jobs), # pyright: ignore[reportArgumentType] selectinload(Document.jobs), # pyright: ignore[reportArgumentType]
selectinload(Document.sources), # pyright: ignore[reportArgumentType] selectinload(Document.sources), # pyright: ignore[reportArgumentType]
selectinload(Document.document_people), # pyright: ignore[reportArgumentType]
), ),
) )
if existing is None: if existing is None:
@@ -151,6 +152,9 @@ class DocumentService(ServiceBase):
suggestion="Remove related Sources and Jobs first, then retry deletion.", suggestion="Remove related Sources and Jobs first, then retry deletion.",
) )
for link in list(existing.document_people):
await _session.delete(link)
await _session.delete(existing) await _session.delete(existing)
await self._finalize(session=_session, caller_session=session) await self._finalize(session=_session, caller_session=session)
+1 -5
View File
@@ -450,8 +450,4 @@ def _parse_uuid(value: str | None) -> UUID | None:
def _latest_prompt_name(job: Job) -> str | None: def _latest_prompt_name(job: Job) -> str | None:
ordered = sorted(job.job_sources, key=lambda item: item.executed_at, reverse=True) return job.prompt_name
for job_source in ordered:
if job_source.job and job_source.job.prompt_name:
return job_source.job.prompt_name
return None
+1
View File
@@ -41,6 +41,7 @@ async def default_settings():
"""Provide default settings for tests.""" """Provide default settings for tests."""
settings = get_settings(database_url="sqlite:///:memory:") settings = get_settings(database_url="sqlite:///:memory:")
db_url = get_database_url(settings) db_url = get_database_url(settings)
await dispose_session_factory(db_url)
engine = get_engine(database_url=db_url) engine = get_engine(database_url=db_url)
# Cached in-memory engines persist across tests; reset schema per test for isolation. # Cached in-memory engines persist across tests; reset schema per test for isolation.
+33
View File
@@ -114,6 +114,39 @@ async def test_delete_document_succeeds_when_unlinked(default_session_factory, t
await service.read_document_detail(document.id) await service.read_document_detail(document.id)
@pytest.mark.asyncio
async def test_delete_document_removes_person_links(default_session_factory, tmp_path):
service = DocumentService(session_factory=default_session_factory)
service.settings.upload_dir = tmp_path
document = await service.create_document(
Document(
id=uuid4(),
name="person-linked-delete",
document_type="memo",
)
)
person = await service.create_person(Person(full_name="Linked Person"))
await service.create_document_person(
DocumentPerson(
document_id=document.id,
person_id=person.id,
role=DocumentPersonRole.AUTHOR,
)
)
document_dir = service.settings.upload_dir / "documents" / str(document.id)
document_dir.mkdir(parents=True, exist_ok=True)
await service.delete_document(document)
assert not document_dir.exists()
assert await service.list_document_people(document_id=document.id) == []
with pytest.raises(DocumentError):
await service.read_document_detail(document.id)
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_delete_document_removes_populated_storage_tree(default_session_factory, tmp_path): async def test_delete_document_removes_populated_storage_tree(default_session_factory, tmp_path):
service = DocumentService(session_factory=default_session_factory) service = DocumentService(session_factory=default_session_factory)