diff --git a/server/webserver.py b/server/webserver.py index b52fde4..b9887d4 100644 --- a/server/webserver.py +++ b/server/webserver.py @@ -338,11 +338,14 @@ class WebServer: sources = query.get(k).split(",") spots = [s for s in spots if s.source and s.source in sources] case "sig": - # If a list of sigs is provided, the spot must have a sig and it must match one of them + # If a list of sigs is provided, the spot must have a sig and it must match one of them. + # The special "sig" "NO_SIG", when supplied in the list, mathches spots with no sig. sigs = query.get(k).split(",") - spots = [s for s in spots if s.sig and s.sig in sigs] + include_no_sig = "NO_SIG" in sigs + spots = [s for s in spots if (s.sig and s.sig in sigs) or (include_no_sig and not s.sig)] case "needs_sig": - # If true, a sig is required, regardless of what it is, it just can't be missing. + # If true, a sig is required, regardless of what it is, it just can't be missing. Mutually + # exclusive with supplying the special "NO_SIG" parameter to the "sig" query param. needs_sig = query.get(k).upper() == "TRUE" if needs_sig: spots = [s for s in spots if s.sig] @@ -441,8 +444,11 @@ class WebServer: sources = query.get(k).split(",") alerts = [a for a in alerts if a.source and a.source in sources] case "sig": + # If a list of sigs is provided, the alert must have a sig and it must match one of them. + # The special "sig" "NO_SIG", when supplied in the list, mathches alerts with no sig. sigs = query.get(k).split(",") - alerts = [a for a in alerts if a.sig and a.sig in sigs] + include_no_sig = "NO_SIG" in sigs + spots = [a for a in alerts if (a.sig and a.sig in sigs) or (include_no_sig and not a.sig)] case "dx_continent": dxconts = query.get(k).split(",") alerts = [a for a in alerts if a.dx_continent and a.dx_continent in dxconts] diff --git a/webassets/apidocs/openapi.yml b/webassets/apidocs/openapi.yml index 34aa61d..f23cf5f 100644 --- a/webassets/apidocs/openapi.yml +++ b/webassets/apidocs/openapi.yml @@ -58,13 +58,13 @@ paths: $ref: "#/components/schemas/Source" - name: sig in: query - description: "Limit the spots to only ones from one or more Special Interest Groups provided as an argument. To select more than one SIG, supply a comma-separated list." + description: "Limit the spots to only ones from one or more Special Interest Groups provided as an argument. To select more than one SIG, supply a comma-separated list. The special `sig` name `NO_SIG` matches spots with no sig set. You can use `sig=NO_SIG` to specifically only return generic spots with no associated SIG. You can also use combinations to request for example POTA + no SIG, but reject other SIGs. If you want to request 'every SIG and not No SIG', see the `needs_sig` query parameter for a shortcut." required: false schema: - $ref: "#/components/schemas/SIGName" + $ref: "#/components/schemas/SIGNameIncludingNoSIG" - name: needs_sig in: query - description: "Limit the spots to only ones with a Special Interest Group such as POTA. Because supplying all known SIGs as a `sigs` parameter is unwieldy, and leaving `sigs` blank will also return spots with *no* SIG, this parameter can be set true to return only spots with a SIG, regardless of what it is, so long as it's not blank. This is what Field Spotter uses to exclude generic cluster spots and only retrieve xOTA things." + description: "Limit the spots to only ones with a Special Interest Group such as POTA. Because supplying all known SIGs as a `sigs` parameter is unwieldy, and leaving `sigs` blank will also return spots with *no* SIG, this parameter can be set true to return only spots with a SIG, regardless of what it is, so long as it's not blank. This is the equivalent of supplying the `sig` query param with a list of every known SIG apart from the special `NO_SIG` value. This is what Field Spotter uses to exclude generic cluster spots and only retrieve xOTA things." required: false schema: type: boolean @@ -190,10 +190,10 @@ paths: $ref: "#/components/schemas/Source" - name: sig in: query - description: "Limit the alerts to only ones from one or more Special Interest Groups. To select more than one SIG, supply a comma-separated list." + description: "Limit the alerts to only ones from one or more Special Interest Groups. To select more than one SIG, supply a comma-separated list. The special value 'NO_SIG' can be included to return alerts specifically without an associated SIG (i.e. general DXpeditions)." required: false schema: - $ref: "#/components/schemas/SIGName" + $ref: "#/components/schemas/SIGNameIncludingNoSIG" - name: dx_continent in: query description: "Limit the alerts to only ones where the DX operator is on the given continent(s). To select more than one continent, supply a comma-separated list." @@ -591,6 +591,31 @@ components: - TOTA example: POTA + SIGNameIncludingNoSIG: + type: string + enum: + - POTA + - SOTA + - WWFF + - WWBOTA + - GMA + - HEMA + - WCA + - MOTA + - SIOTA + - ARLHS + - ILLW + - ZLOTA + - KRMNPA + - IOTA + - WOTA + - BOTA + - WAB + - WAI + - TOTA + - NO_SIG + example: POTA + Continent: type: string enum: