Skip to content

[M1975] transect endpoint PUT/PATCH cleanup#689

Merged
gridcell merged 5 commits into
devfrom
M1975
May 29, 2026
Merged

[M1975] transect endpoint PUT/PATCH cleanup#689
gridcell merged 5 commits into
devfrom
M1975

Conversation

@saanobhaai
Copy link
Copy Markdown
Member

@saanobhaai saanobhaai commented May 21, 2026

Summary by CodeRabbit

  • Bug Fixes
    • Transect API endpoints (benthic, fish belt, invert belt) now enforce allowed HTTP methods, rejecting unsupported update operations (PUT/PATCH) and OPTIONS. Clients will receive proper method-not-allowed responses for disallowed requests, preventing accidental or unsupported updates and improving API predictability and error handling.

Review Change Stack

@saanobhaai saanobhaai requested a review from gridcell May 21, 2026 11:27
@saanobhaai
Copy link
Copy Markdown
Member Author

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 21, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ce0d986f-5658-4ae7-887d-f022809b5805

📥 Commits

Reviewing files that changed from the base of the PR and between 1738d0c and b0ff18d.

📒 Files selected for processing (3)
  • src/api/resources/benthic_transect.py
  • src/api/resources/fish_belt_transect.py
  • src/api/resources/invert_belt_transect.py

📝 Walkthrough

Walkthrough

This PR adds explicit http_method_names = ["get", "post", "head", "delete"] to three transect viewsets, restricting accepted HTTP verbs to GET, POST, HEAD, and DELETE (omitting OPTIONS, PUT, and PATCH).

Changes

Transect HTTP method allowlist

Layer / File(s) Summary
Add http_method_names to transect viewsets
src/api/resources/benthic_transect.py, src/api/resources/fish_belt_transect.py, src/api/resources/invert_belt_transect.py
Each viewset now defines http_method_names = ["get", "post", "head", "delete"], explicitly whitelisting those HTTP methods and preventing others (e.g., OPTIONS, PUT, PATCH) from being routed to the viewsets.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '[M1975] transect endpoint PUT/PATCH cleanup' directly and clearly describes the main change: removing/restricting PUT and PATCH HTTP methods from transect endpoints.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch M1975

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

cdk-nag report

No unsuppressed errors.


See iac/nag_suppressions.py to add suppressions for accepted risks.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 21, 2026

cdk diff ✅ Success

Show Output
start: Building GithubAccess Template
success: Built GithubAccess Template
start: Publishing GithubAccess Template (554812291621-us-east-1-403885e2)
success: Published GithubAccess Template (554812291621-us-east-1-403885e2)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack GithubAccess
There were no differences

start: Building mermaid-api-infra-common Template
success: Built mermaid-api-infra-common Template
start: Publishing mermaid-api-infra-common Template (554812291621-us-east-1-37993ba8)
success: Published mermaid-api-infra-common Template (554812291621-us-east-1-37993ba8)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack mermaid-api-infra-common
There were no differences

start: Building dev-mermaid-static-site Template
success: Built dev-mermaid-static-site Template
start: Publishing dev-mermaid-static-site Template (554812291621-us-east-1-705b66ee)
success: Published dev-mermaid-static-site Template (554812291621-us-east-1-705b66ee)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack dev-mermaid-static-site
There were no differences

start: Building dev-mermaid-api-django Template
success: Built dev-mermaid-api-django Template
start: Publishing dev-mermaid-api-django Template (554812291621-us-east-1-519635ad)
success: Published dev-mermaid-api-django Template (554812291621-us-east-1-519635ad)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack dev-mermaid-api-django
Resources
[~] AWS::ECS::TaskDefinition ScheduledBackupTaskDef ScheduledBackupTaskDef48789D5A replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -147,7 +147,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:4e93ce3a07e9c8f5f3e0a64a4c9778f0b3ec19091fb11cfbabaaaa2cb2445f73"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition SummaryCacheTaskDef SummaryCacheTaskDefFAAC683D replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -151,7 +151,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:4e93ce3a07e9c8f5f3e0a64a4c9778f0b3ec19091fb11cfbabaaaa2cb2445f73"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition ApiTaskDefinition ApiTaskDefinition51EA709E replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -145,7 +145,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:4e93ce3a07e9c8f5f3e0a64a4c9778f0b3ec19091fb11cfbabaaaa2cb2445f73"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition General/Worker/QueueProcessingTaskDef GeneralWorkerQueueProcessingTaskDef1C2A1522 replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -158,7 +158,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:4e93ce3a07e9c8f5f3e0a64a4c9778f0b3ec19091fb11cfbabaaaa2cb2445f73"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition ImageProcess/Worker/QueueProcessingTaskDef ImageProcessWorkerQueueProcessingTaskDefACA5B138 replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -158,7 +158,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:4e93ce3a07e9c8f5f3e0a64a4c9778f0b3ec19091fb11cfbabaaaa2cb2445f73"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",


start: Building dev-mermaid-sagemaker Template
success: Built dev-mermaid-sagemaker Template
start: Publishing dev-mermaid-sagemaker Template (554812291621-us-east-1-32848cce)
success: Published dev-mermaid-sagemaker Template (554812291621-us-east-1-32848cce)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack dev-mermaid-sagemaker
There were no differences

start: Building prod-mermaid-static-site Template
success: Built prod-mermaid-static-site Template
start: Publishing prod-mermaid-static-site Template (554812291621-us-east-1-b2d960b0)
success: Published prod-mermaid-static-site Template (554812291621-us-east-1-b2d960b0)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack prod-mermaid-static-site
There were no differences

start: Building prod-mermaid-api-django Template
success: Built prod-mermaid-api-django Template
start: Publishing prod-mermaid-api-django Template (554812291621-us-east-1-953bbb25)
success: Published prod-mermaid-api-django Template (554812291621-us-east-1-953bbb25)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)

Stack prod-mermaid-api-django
Resources
[~] AWS::ECS::TaskDefinition ScheduledBackupTaskDef ScheduledBackupTaskDef48789D5A replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -147,7 +147,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:38b11ecd7a34356ccac91b8c61f892e5a4b598bfeed13f480a5dfde2538bcce5"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition SummaryCacheTaskDef SummaryCacheTaskDefFAAC683D replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -151,7 +151,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:38b11ecd7a34356ccac91b8c61f892e5a4b598bfeed13f480a5dfde2538bcce5"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition ApiTaskDefinition ApiTaskDefinition51EA709E replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -145,7 +145,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:38b11ecd7a34356ccac91b8c61f892e5a4b598bfeed13f480a5dfde2538bcce5"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition General/Worker/QueueProcessingTaskDef GeneralWorkerQueueProcessingTaskDef1C2A1522 replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -158,7 +158,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:38b11ecd7a34356ccac91b8c61f892e5a4b598bfeed13f480a5dfde2538bcce5"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",
[~] AWS::ECS::TaskDefinition ImageProcess/Worker/QueueProcessingTaskDef ImageProcessWorkerQueueProcessingTaskDefACA5B138 replace
 └─ [~] ContainerDefinitions (requires replacement)
     └─ @@ -158,7 +158,7 @@
        [ ] ],
        [ ] "Essential": true,
        [ ] "Image": {
        [-]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:38b11ecd7a34356ccac91b8c61f892e5a4b598bfeed13f480a5dfde2538bcce5"
        [+]   "Fn::Sub": "554812291621.dkr.ecr.us-east-1.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-554812291621-us-east-1:de1f9752e1e349d38de2a8ec2f6d962aa3e2926e44afc4008af20b4032b82c6b"
        [ ] },
        [ ] "LogConfiguration": {
        [ ]   "LogDriver": "awslogs",



✨  Number of stacks with differences: 2


Workflow: pr

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/api/resources/benthic_transect.py (1)

38-43: 💤 Low value

Use http_method_names to disable PUT/PATCH on these transect viewsets.

BenthicTransectViewSet (and the same pattern in FishBeltTransectViewSet / InvertBeltTransectViewSet) currently overrides update/partial_update just to raise MethodNotAllowed. This repo already uses http_method_names in other DRF resources (e.g. src/api/resources/sampleunitmethods/* and src/api/resources/notification.py), so switching would make method support/schema/OPTIONS more declarative.

♻️ Suggested alternative
-import django_filters
-from rest_framework.exceptions import MethodNotAllowed
+import django_filters

 from ..models import BenthicTransect
 from .base import BaseProjectApiViewSet
 from .sample_units_base import SampleUnitFilterSet, SampleUnitSerializer
@@
 class BenthicTransectViewSet(BaseProjectApiViewSet):
     serializer_class = BenthicTransectSerializer
     queryset = BenthicTransect.objects.all()
     filterset_class = BenthicTransectFilterSet
-
-    def update(self, request, *args, **kwargs):
-        raise MethodNotAllowed("PUT")
-
-    def partial_update(self, request, *args, **kwargs):
-        raise MethodNotAllowed("PATCH")
+    http_method_names = [m for m in BaseProjectApiViewSet.http_method_names if m not in ("put", "patch")]

The same change would apply to FishBeltTransectViewSet and InvertBeltTransectViewSet. Feel free to disregard if the explicit-override style is preferred for consistency with the rest of the codebase.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/api/resources/benthic_transect.py` around lines 38 - 43, The viewsets
currently override update/partial_update to raise MethodNotAllowed; instead
remove those overrides in BenthicTransectViewSet (and apply the same change to
FishBeltTransectViewSet and InvertBeltTransectViewSet) and declare
http_method_names on each class to explicitly list supported methods (e.g. omit
'put' and 'patch' while keeping 'get','post','delete','head','options' as
appropriate) so DRF and schema/OPTIONS reflect the allowed methods
declaratively.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/api/resources/benthic_transect.py`:
- Around line 38-43: The viewsets currently override update/partial_update to
raise MethodNotAllowed; instead remove those overrides in BenthicTransectViewSet
(and apply the same change to FishBeltTransectViewSet and
InvertBeltTransectViewSet) and declare http_method_names on each class to
explicitly list supported methods (e.g. omit 'put' and 'patch' while keeping
'get','post','delete','head','options' as appropriate) so DRF and schema/OPTIONS
reflect the allowed methods declaratively.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2a3bcbe6-7d52-478f-a2ec-412c02dc4214

📥 Commits

Reviewing files that changed from the base of the PR and between c2a0520 and 708dd71.

📒 Files selected for processing (3)
  • src/api/resources/benthic_transect.py
  • src/api/resources/fish_belt_transect.py
  • src/api/resources/invert_belt_transect.py

@saanobhaai
Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 21, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@gridcell gridcell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Code Review

Assessment: Clean, well-scoped bug fix that correctly removes PUT and PATCH from three transect ViewSets using the standard DRF http_method_names mechanism. The main gap is the absence of regression tests asserting 405 on the newly restricted endpoints. Two minor style issues (redundant options entry, verb ordering) and a missing changelog entry round out the findings.

Severe Warning Question Info Praise
0 1 1 3 1

Files reviewed: 3 / 3

Cross-Cutting Concerns

  • No regression tests assert 405 for PUT/PATCH on the three restricted transect endpoints. A parametrized test covering all three viewsets would provide CI-level protection against the restriction being accidentally undone.
  • No CHANGELOG or API documentation update accompanies this breaking API contract change. Downstream consumers will discover the method restriction at runtime rather than through release notes or updated OpenAPI docs.
  • The sibling sampleunitmethods ViewSets retain put while the transect ViewSets now support only create/read/delete. This asymmetric model is architecturally intentional but currently undocumented; a brief comment on each ViewSet or a note in new_protocol_readme.md would prevent future drift.
CR-001 · warning · test_gap — No regression tests assert 405 for PUT/PATCH on the three restricted transect endpoints

The PR adds http_method_names to BenthicTransectViewSet, FishBeltTransectViewSet, and InvertBeltTransectViewSet to block PUT and PATCH, but the diff contains no test changes. DRF resolves http_method_names at dispatch time before any view logic runs, so the restriction is reliable today, but it is invisible to CI. A future refactor that removes or overrides http_method_names (e.g., a mixin override, base-class change, or override in a child class) would silently re-expose the blocked methods and pass all tests.

Suggestion: Add a small parametrized test asserting 405 Method Not Allowed for PUT and PATCH against each of the three endpoints (benthictransect-detail, fishbelttransect-detail, invertbelttransect-detail). Mirror the structure of existing API tests in src/api/tests/.

Why it matters: Without a test, the method restriction is invisible to CI. Any future change that widens http_method_names back to include PUT or PATCH would pass all tests while silently re-exposing an endpoint that was deliberately locked down.

Applies to: src/api/resources/benthic_transect.py, src/api/resources/fish_belt_transect.py, src/api/resources/invert_belt_transect.py

Found by: reviewer-tests

CR-002 · question · api_contract — Confirm no existing client code issues PUT or PATCH to these transect endpoints

Worth confirming: (a) is there any client code — including the mobile app or sync payloads — that currently issues PUT or PATCH to these bare transect endpoints and will now receive 405 Method Not Allowed? (b) are there any in-flight mobile sync payloads that rely on PUT semantics for upsert on these endpoints? If so, a coordinated client release would be needed alongside this server-side change.

Applies to: src/api/resources/benthic_transect.py, src/api/resources/fish_belt_transect.py, src/api/resources/invert_belt_transect.py

Found by: reviewer-backend-python

CR-005 · info · docs — Breaking API change has no accompanying changelog or doc update

Removing PUT and PATCH from these three endpoints is a breaking change to the public API contract. No changelog or release-notes entry accompanies the PR. The auto-generated OpenAPI documentation at https://mermaid-api.readthedocs.io/ will also need to be regenerated so downstream API consumers see the updated allowed methods.

Applies to: src/api/resources/benthic_transect.py, src/api/resources/fish_belt_transect.py, src/api/resources/invert_belt_transect.py

Found by: reviewer-docs

CR-006 · praise · maintainability — Correct, minimal mechanism for restricting HTTP methods with clear intent

Disabling PUT and PATCH via DRF's http_method_names is the right approach: disallowed verbs are rejected at dispatch time with 405 before any permission or serializer code is reachable, so there is no authorization regression. It avoids overriding update()/partial_update() in application code, keeps the restriction visible at the class level, and the three-file change is perfectly parallel, making intent obvious.

Applies to: src/api/resources/benthic_transect.py, src/api/resources/fish_belt_transect.py, src/api/resources/invert_belt_transect.py

Found by: reviewer-security, reviewer-backend-python

Agent Coverage

Agent Role Files Findings Blocking
reviewer-security security 3 3 0
reviewer-backend-python backend 3 3 0
reviewer-python-quality code_quality 3 2 0
reviewer-tests testing 3 2 0
reviewer-docs documentation 3 1 0

Generated by AI Review Team

Comment thread src/api/resources/benthic_transect.py Outdated
Comment thread src/api/resources/benthic_transect.py Outdated
@gridcell gridcell merged commit ff34305 into dev May 29, 2026
4 checks passed
@gridcell gridcell deleted the M1975 branch May 29, 2026 18:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants