typing: graduate opencontractserver.annotations.* (refs #1447)#1474
typing: graduate opencontractserver.annotations.* (refs #1447)#1474
Conversation
Continues draining the mypy baseline. Graduates all seven annotations
modules.
Removed from mypy.ini
- opencontractserver.annotations.{admin,compact_json,models,
query_optimizer,utils}
- opencontractserver.annotations.management.commands.{
migrate_structural_annotations,populate_content_modalities}
Added to mypy.ini
- [mypy-opencontractserver.annotations.models] disable_error_code =
django-manager-missing (mirrors the existing users.models exception;
django-stubs / django-tree-queries cannot resolve the
Corpus.label_set -> LabelSet.used_by_corpuses reverse relation)
Pruned 27 baseline lines (7124 -> 7097).
Per-file fixes
- compact_json.py: collapsed `isinstance(bounds, dict)` re-binding into
a single `bounds_raw -> bounds` assignment; renamed `token_indices:
list[int]` to drop the redundant re-annotation.
- query_optimizer.py: narrowed `path_query.first()` into a separate
`first_path: DocumentPath | None` binding before the is-None guard so
the `DocumentPath | None` value doesn't flow into the previously
`DocumentPath`-typed `document_path` variable.
- models.py: added `author_obj: AbstractBaseUser` annotation in
Note.update_content_with_revision; scoped # type: ignore[misc] on
three manager-override `objects = ...Manager()` declarations
(Embedding, Annotation, Note); scoped # type: ignore[assignment] on
the `StructuralAnnotationSet.creator = ForeignKey(..., null=True)`
redeclaration (intentional override of BaseOCModel.creator); scoped
# type: ignore[misc] on the lambda inside transaction.on_commit(...)
and on `author=author_obj` passed to NoteRevision.objects.create();
dropped the `: str` re-annotation on
`embedder_path = CharField(...)`.
- utils.py: typed `all_tokens: list[Any] = []` accumulator.
- populate_content_modalities.py: typed
`all_token_refs: list[Any] = []`.
- migrate_structural_annotations.py: widened the heterogeneous `stats`
dict to `dict[str, Any]`.
Verification
- pre-commit run --all-files -> all hooks pass (mypy: Passed)
- docker compose -f test.yml run --rm django python -m mypy
--config-file mypy.ini opencontractserver config -> "no issues found
in 1019 source files"
Code ReviewSummary: Clean, mechanical typing PR that graduates all seven Code Quality & Style ✅
Genuine Behavioral Change (positive) 🔍
Minor suggestion: a comment noting the logical impossibility would help future readers understand why this guard exists, since it looks like dead code: except DocumentPath.MultipleObjectsReturned:
# Shouldn't happen with constraints, but handle safely.
# first() returns None only on an empty QS; unreachable here, but
# needed to narrow DocumentPath | None → DocumentPath for mypy.
first_path = path_query.first()
if first_path is None:
return Annotation.objects.none()
document_path = first_pathMinor Observations
Security & PerformanceNo security or performance implications — pure static analysis improvement. Test CoverageThis PR has no runtime behavior changes (the Verdict: Approve. The changes are correct, minimal, and follow established project conventions. The one suggestion (comment on the null guard) is non-blocking. |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
…ions # Conflicts: # CHANGELOG.md # docs/typing/mypy_baseline.txt
Code Review: PR #1474 — Graduate
|
…ions # Conflicts: # docs/assets/images/screenshots/auto/admin--pipeline-settings--secrets-modal.png # docs/assets/images/screenshots/auto/admin--pipeline-settings--stage-filter.png # docs/assets/images/screenshots/auto/annotations--pdf-canvas--with-labels.png # docs/assets/images/screenshots/auto/annotations--pdf-feed--with-soft-highlights.png # docs/assets/images/screenshots/auto/annotations--txt-document--with-spans.png # docs/assets/images/screenshots/auto/annotator--enhanced-label-selector--expanded.png # docs/assets/images/screenshots/auto/badges--celebration-modal--auto-award.png # docs/assets/images/screenshots/auto/badges--celebration-modal--manual-award.png # docs/assets/images/screenshots/auto/badges--criteria-config--with-type-selected.png # docs/assets/images/screenshots/auto/badges--management--create-modal.png # docs/assets/images/screenshots/auto/caml--editor--full-template.png # docs/assets/images/screenshots/auto/caml--editor--new-article.png # docs/assets/images/screenshots/auto/chat--approval-modal--pending.png # docs/assets/images/screenshots/auto/chat--context-meter--compacted.png # docs/assets/images/screenshots/auto/chat--context-meter--compaction-underway.png # docs/assets/images/screenshots/auto/chat--context-meter--green.png # docs/assets/images/screenshots/auto/chat--context-meter--red.png # docs/assets/images/screenshots/auto/chat--context-meter--yellow.png # docs/assets/images/screenshots/auto/chat--tool-badge--single.png # docs/assets/images/screenshots/auto/chat--tool-popover--multi-tool.png # docs/assets/images/screenshots/auto/chat--tool-popover--single-tool.png # docs/assets/images/screenshots/auto/community--leaderboard--filters.png # docs/assets/images/screenshots/auto/corpus--analytics--dashboard.png # docs/assets/images/screenshots/auto/corpus--bulk-import-modal--progress-step.png # docs/assets/images/screenshots/auto/corpus--corpus-modal--initial.png # docs/assets/images/screenshots/auto/corpus--description-editor--loaded.png # docs/assets/images/screenshots/auto/corpus--document-relationship-modal--initial.png # docs/assets/images/screenshots/auto/corpus--landing--clean-view.png # docs/assets/images/screenshots/auto/corpus--mcp-share-button--private.png # docs/assets/images/screenshots/auto/corpus--mcp-share-button--public.png # docs/assets/images/screenshots/auto/corpus--power-user--with-sidebar.png # docs/assets/images/screenshots/auto/corpus--toc--hybrid-index.png # docs/assets/images/screenshots/auto/corpus--upload-modal--initial.png # docs/assets/images/screenshots/auto/corpus--worker-tokens--create-modal.png # docs/assets/images/screenshots/auto/corpus--worker-tokens--key-display.png # docs/assets/images/screenshots/auto/corpus-actions--create-modal--agent-thread-existing.png # docs/assets/images/screenshots/auto/corpus-actions--create-modal--agent-thread-quick.png # docs/assets/images/screenshots/auto/corpus-actions--create-modal--initial.png # docs/assets/images/screenshots/auto/corpus-settings--template-picker-open.png # docs/assets/images/screenshots/auto/crud--modal-document--create-empty.png # docs/assets/images/screenshots/auto/crud--modal-document--edit-with-changes.png # docs/assets/images/screenshots/auto/crud--modal-document--view-readonly.png # docs/assets/images/screenshots/auto/crud--modal-labelset--create-empty.png # docs/assets/images/screenshots/auto/discussions--global--all-tabs.png # docs/assets/images/screenshots/auto/discussions--global--corpus-tab.png # docs/assets/images/screenshots/auto/discussions--global--document-tab.png # docs/assets/images/screenshots/auto/discussions--global--empty-state.png # docs/assets/images/screenshots/auto/export--config-modal--mobile.png # docs/assets/images/screenshots/auto/export--config-modal--rjsf-processor-form.png # docs/assets/images/screenshots/auto/exports--list--loading.png # docs/assets/images/screenshots/auto/extracts--create-column-modal--custom-model.png # docs/assets/images/screenshots/auto/extracts--create-column-modal--default.png # docs/assets/images/screenshots/auto/extracts--create-column-modal--edit-mode.png # docs/assets/images/screenshots/auto/extracts--create-column-modal--filled.png # docs/assets/images/screenshots/auto/extracts--detail-content--schema-tab.png # docs/assets/images/screenshots/auto/folders--create-folder-modal--initial.png # docs/assets/images/screenshots/auto/folders--edit-folder-modal--initial.png # docs/assets/images/screenshots/auto/folders--move-folder-modal--dropdown.png # docs/assets/images/screenshots/auto/folders--move-folder-modal--initial.png # docs/assets/images/screenshots/auto/icons--picker-modal--category-files.png # docs/assets/images/screenshots/auto/knowledge-base--docx-document--rendered.png # docs/assets/images/screenshots/auto/knowledge-base--index-tab--open.png # docs/assets/images/screenshots/auto/knowledge-base--sidebar-control-bar--sort-options.png # docs/assets/images/screenshots/auto/knowledge-base--sidebar-tabs--with-index.png # docs/assets/images/screenshots/auto/landing--call-to-action--anonymous.png # docs/assets/images/screenshots/auto/metadata--column-modal--initial.png # docs/assets/images/screenshots/auto/modals--select-documents--open.png # docs/assets/images/screenshots/auto/moderation--dashboard--time-filter.png # docs/assets/images/screenshots/auto/readme--document-annotator--with-pdf.png # docs/assets/images/screenshots/auto/threads--edit-message-modal--initial.png # docs/assets/images/screenshots/auto/threads--reply-form--nested-reply.png # docs/assets/images/screenshots/auto/versioning--history-panel--with-versions.png # docs/assets/images/screenshots/auto/widgets--chat-message--markdown.png # docs/assets/images/screenshots/auto/widgets--corpus-dropdown--with-options.png # docs/assets/images/screenshots/auto/widgets--fieldset-modal--create-empty.png # docs/assets/images/screenshots/auto/widgets--fieldset-modal--edit-populated.png # docs/assets/images/screenshots/auto/widgets--radial-button-cloud--collapsed.png # docs/assets/images/screenshots/auto/widgets--radial-button-cloud--confirmation-modal.png # docs/assets/images/screenshots/auto/widgets--radial-button-cloud--expanded.png
Code Review — PR #1474: Graduate
|
|
Thanks for the review. Addressing the three items: 1. How 2. 3. Comment on |
Continues draining the mypy baseline. Graduates all seven `opencontractserver.annotations.*` modules.
Removed from `mypy.ini`
Added to `mypy.ini`
```
[mypy-opencontractserver.annotations.models]
disable_error_code = django-manager-missing
```
Mirrors the existing `users.models` exception — django-stubs / django-tree-queries cannot resolve the `Corpus.label_set → LabelSet.used_by_corpuses` reverse relation.
Pruned from `docs/typing/mypy_baseline.txt`
27 lines (7124 → 7097).
Per-file fixes
Acceptance (per #1447)
```
$ docker compose -f test.yml run --rm django python -m mypy --config-file mypy.ini opencontractserver config
Success: no issues found in 1019 source files
$ pre-commit run --all-files
mypy.....................................................................Passed
```
Test plan