Simon Willison’s Weblog


APIs for importing locations

9th March 2021

Originally posted to my internal blog at VaccinateCA

An important aspect of the new backend is the ability to import new locations.

These can come from a bunch of different sources. I’ve previously written Django management command scripts for this, but these are fiddly to run from a permissions perspective and don’t necessarily play well with Cloud Run.

So I decided to build an /api/importLocations API. This can take a single or multiple locations, and can either create new locations or update existing locations based on a provided unique import reference (import_ref) value.

The API is documented in full here:

You can see how it developed in issue 98

API keys

As part of building this API I needed a simple authentication mechanism. I’ve added a Django admin page for creating API keys, with a required description field. This can be used to create an API key for use with the new API.

This mechanism differs from the JWT tokens used by the caller app API, mainly because API tokens used for import scripts need to not expire—and also don’t need to be tied to specific users.

A few more APIs

Some of the fields that can be passed to the import location API need to accept values from a specific list: county, location_type and provider_type all have this requirement.

I added APIs that return valid values for these:

This is APIs for importing locations by Simon Willison, posted on 9th March 2021.

Part of series VaccinateCA internal blog

  1. Replaying logs to exercise the new API - March 3, 2021, 5 p.m.
  2. The simplest possible call queue - March 6, 2021, 5 p.m.
  3. New call queue ready to test. Also geography. - March 7, 2021, 5 p.m.
  4. APIs for importing locations - March 9, 2021, 5 p.m.
  5. VIAL is now live, plus django-sql-dashboard - March 15, 2021, 5 p.m.
  6. The Airtable formulas at the heart of everything - March 23, 2021, 5 p.m.
  7. VIAL: Preparing for some collaborative testing - April 1, 2021, 5 p.m.
  8. … more

Next: Weeknotes: tableau-to-sqlite, django-sql-dashboard

Previous: New call queue ready to test. Also geography.