feat(commcare): lookup_table get + create atoms#390
Merged
Conversation
First two atoms in the REST-clean commcare_* atom matrix. Both verified
end-to-end against connect-ace-prod (round-trip: get→404, create, get→
returns the same fields back).
- commcare_get_lookup_table: GET /a/<domain>/api/v0.5/lookup_table/,
finds the table whose `tag` matches, normalizes to {id, tag,
is_global, fields, item_attributes}. Returns {table: null} if no
match — used by verifier to grade "interview_schedule exists".
- commcare_create_lookup_table: POST /a/<domain>/api/v0.5/lookup_table/
with the LookupTable schema. Returns new UUID hex id. Used by the
domain-bootstrap skill to create the interview_schedule table for
the cohort flow.
Both endpoints require API-key auth (Tastypie LookupTableResource sets
`RequirePermissionAuthentication(edit_apps)` WITHOUT allow_session_auth,
unlike `application` and `case` which permit sessions). Extended
CommCareBackendOptions with optional `hqUsername` + `hqApiKey`; new
private helper `apiKeyAuthHeader()` builds the `ApiKey
<username>:<key>` value. Server bootstrap reads from ACE_HQ_USERNAME +
ACE_HQ_API_KEY env. Atoms that need API key but don't have it throw a
typed error pointing at /ace:doctor.
Atom code verified against /tmp/ace-refs/hq/corehq/apps/fixtures/
resources/v0_1.py:111-244 — fields, request body shape, and the
`tag already exists` BadRequest case.
Cannot yet round-trip on ace-interviews-master itself because Pro
Edition (LOOKUP_TABLES privilege) hasn't been provisioned yet
(accounts@ email out, awaiting response). Tested on connect-ace-prod
where ACE already has the privilege — proves atom correctness without
blocking on subscription.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
jjackson
added a commit
that referenced
this pull request
May 22, 2026
Continues the REST commcare atom batch. All verified end-to-end against
connect-ace-prod.
- commcare_get_lookup_table_rows: GETs all rows in domain and
filters by data_type_id. Flattens fields to {col: first-value}.
- commcare_lookup_table_append_rows: POSTs one row per call (Tastypie
doesn't support list POST for this resource). Round-trip verified
by appending 3 interview_schedule rows.
- commcare_list_users: GET /a/<domain>/api/v0.5/user/ with pagination
and optional group filter. Returns each user's id, username, basic
profile, and full user_data.
- commcare_get_user: GET single user by couch id.
- commcare_update_user_field: GET → mutate user_data → PUT. V0_5
resource doesn't expose PATCH so we PUT the merged user_data dict.
Pass value=null to clear.
All five atoms use the new API-key auth pattern (introduced in PR #390).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First 2/14 of the REST-clean `commcare_*` atom batch (task #4). Both verified end-to-end against `connect-ace-prod` (round-trip: get→404, create, get→returns).
Auth model change
`LookupTableResource` requires API-key auth (no `allow_session_auth`). Other Tastypie resources (`application`, `case`) accept session — different per-resource. To handle both:
Tested on
Test plan
🤖 Generated with Claude Code