From 73e95484e22e128e908984596cb3968fc4a97b0e Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:34:04 -0700 Subject: [PATCH 01/20] Add new file with functions to unpack dataclasses. --- sageranger/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sageranger/__init__.py b/sageranger/__init__.py index 6f0941e..c5b4376 100644 --- a/sageranger/__init__.py +++ b/sageranger/__init__.py @@ -7,3 +7,4 @@ from sageranger.post_monthly import post_monthly_obs from sageranger.post_camera_er import post_camera from sageranger.post_obs import post_observation +from sageranger.unpack_info import parse_args, get_config_info From 3ab1a1173681a1bb3b6a55383b102f4204157b15 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:36:00 -0700 Subject: [PATCH 02/20] Modify to work with different sensors. And add additional steps. --- sageranger/post_camera_er.py | 74 +++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/sageranger/post_camera_er.py b/sageranger/post_camera_er.py index 5ae08f1..8af373a 100644 --- a/sageranger/post_camera_er.py +++ b/sageranger/post_camera_er.py @@ -28,44 +28,47 @@ from datetime import datetime, UTC import requests import pandas as pd +from sageranger.unpack_info import get_config_info +from sageranger.sensor_class import SensorInfo from sageranger.post_obs import post_observation def post_camera(): # pylint: disable=too-many-locals """Adds Cameras to csv list of camera traps""" - auth = input('input authorization: ') + + config = get_config_info(SensorInfo) hdr = { - 'Authorization': auth, + 'Authorization': config.auth_token, 'Accept': 'application/json' } url = 'https://sagebrush.pamdas.org/api/v1.0/' - df = pd.read_csv('/path/to/csv', + df = pd.read_csv(config.path_csv, delimiter=' ', header=0) - cam = df.camera.tolist() + sen = df.sensor.tolist() lat = df.lat.tolist() longi = df.longi.tolist() - for i in enumerate(cam): + for i in enumerate(sen): i = i[0] current_time = datetime.now(UTC) formatted_time = current_time.strftime('%Y-%m-%dT%H:%M:%S.%f') + 'Z' # first create a source payload = { - "source_type": "seismic", - "manufacturer_id": cam[i], - "model_name": cam[i], + "source_type": config.source_type, + "manufacturer_id": sen[i], + "model_name": sen[i], "additional": {}, - "provider": "cougar_vision", + "provider": config.provider, "subject": { - "name": cam[i], - "subject_subtype": "camera_trap" + "name": sen[i], + "subject_subtype": config.subject_subtype }, "assigned_range": {} } @@ -73,14 +76,15 @@ def post_camera(): # pylint: disable=too-many-locals url_2 = url + 'sources/' source = requests.post(url_2, headers=hdr, json=payload, timeout=10) response_js = source.json() + # print(response_js) source_id = response_js['data']['id'] # Then create a subject payload = { - "content_type": "observations.subject", - "name": cam[i], - "subject_type": "stationary-object", - "subject_subtype": "camera_trap", + "content_type": config.content_type, + "name": sen[i], + "subject_type": config.subject_type, + "subject_subtype": config.subject_subtype, "additional": {}, "created_at": formatted_time, "updated_at": formatted_time, @@ -96,7 +100,7 @@ def post_camera(): # pylint: disable=too-many-locals payload = { "assigned_range": {}, "source": source_id, - "source_type": "tracking-device", + "source_type": config.source_type, "additional": {}, "location": { "latitude": lat[i], @@ -109,8 +113,44 @@ def post_camera(): # pylint: disable=too-many-locals response = requests.get(url_4, headers=hdr, timeout=10) source_2 = response.json() + + #get subject group id + url_5 = url +'/subjectgroups/?group_name=' + config.group_name + response = requests.get(url_5, headers=hdr, timeout=20) + response_json = response.json() + group_id = response_json['data'][0]['id'] + + #post subject to subject group + payload = [{ + "id": subject_id, + "name": sen[i], + "subject_type": config.subject_type, + "subject_subtype": config.subject_subtype, + "additional": {}, + "created_at": formatted_time, + "updated_at": formatted_time, + "is_active": 1, + }] + + url_6 = url + 'subjectgroup/' + group_id + '/subjects' + subject = requests.post(url_6, headers=hdr, json=payload, timeout=10) + response_json = subject.json() + + # get the id of the default subject group + url_7 = url +'/subjectgroups/?group_name=Subjects' + response = requests.get(url_7, headers=hdr, timeout=20) + response_json = response.json() + subject_default= response_json['data'][0]['id'] + + #delete from default subject group + url_8 = url + 'subjectgroup/' + subject_default + '/subjects' + _ = requests.delete(url_8, headers=hdr,json=payload, timeout=10) + #print("post?", response_json) + + #post observation post_observation(subject_id, "", formatted_time, hdr) + print("\nsubject id: " + subject_id) print("source id: " + source_2['data'][0]['id']) - print("camera trap " + cam[i] + " is uploaded to sagebrush\n") + print("sensor " + str(sen[i]) + " is uploaded to sagebrush\n") From 6373f364c579d59a1016304c57079807fc860f52 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:36:46 -0700 Subject: [PATCH 03/20] Add class for new config file. --- sageranger/sensor_class.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 sageranger/sensor_class.py diff --git a/sageranger/sensor_class.py b/sageranger/sensor_class.py new file mode 100644 index 0000000..58ab75d --- /dev/null +++ b/sageranger/sensor_class.py @@ -0,0 +1,17 @@ +from dataclasses import dataclass + +@dataclass +class SensorInfo: + path_csv:str + auth_token: str + source_type: str + provider: str + subject_subtype: str + subject_type: str + content_type: str + source_type: str + group_name: str + + + + From b64c68180bd1a31a4ef06476736a1398177f6eef Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:37:46 -0700 Subject: [PATCH 04/20] Add new config file. --- sageranger/config/sensor_info,yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 sageranger/config/sensor_info,yml diff --git a/sageranger/config/sensor_info,yml b/sageranger/config/sensor_info,yml new file mode 100644 index 0000000..292d4a2 --- /dev/null +++ b/sageranger/config/sensor_info,yml @@ -0,0 +1,10 @@ +path_csv: /path/to/file.csv # locally stored on your machine +event_type: '' +auth_token: 'Bearer ' # you must include bearer +source_type: 'seismic' +provider: ' # ex: Camera Trap +subject_type: 'stationary-object' +content_type: 'observations.subject' +source_type: 'tracking-device' +group_name: '' # ex: camera_trap From dc249bb8a40275b1ea42ff8ed2b6c3dc0a7cc078 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:38:26 -0700 Subject: [PATCH 05/20] Move functions from cougarvision to sageranger. --- sageranger/unpack_info.py | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 sageranger/unpack_info.py diff --git a/sageranger/unpack_info.py b/sageranger/unpack_info.py new file mode 100644 index 0000000..44b22c9 --- /dev/null +++ b/sageranger/unpack_info.py @@ -0,0 +1,48 @@ + +import argparse +import yaml +from dataclasses import fields + + +def parse_args(): + """Creates parser for config yaml. + + This function creates an arguement parser that creates an + args container with the arguement 'CONFIG'. + + Returns: + argsparse.Namespace: An object containing all parsed arguement + values as attributes (e.g., args.CONFIG). + """ + parser = argparse.ArgumentParser(description='Retrieves information from' \ + 'config and posts events and observations') + parser.add_argument('CONFIG', type=str, help='path to config file.') + + return parser.parse_args() + + +def get_config_info(class_type): + """Parses through config file. + + This function maps values to the dataclasses + found in get_info. + + Args: + class_type (str): get info has two dataclasses + config info and display info + + Return: + dict: unpacked and mapped values to + class type + """ + args = parse_args() + config_path = args.CONFIG + + with open(config_path, 'r', encoding='utf-8') as file: + config_dict = yaml.safe_load(file) + + # for direct mapping only use fields in the class fields + valid_keys = {f.name for f in fields(class_type)} + filtered_keys = {k: v for k, v in config_dict.items() if k in valid_keys} + + return class_type(**filtered_keys) \ No newline at end of file From 9a0d182ed6448677235599477427fbfdb1a0d96f Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:42:33 -0700 Subject: [PATCH 06/20] add docstring to module. --- sageranger/unpack_info.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sageranger/unpack_info.py b/sageranger/unpack_info.py index 44b22c9..6ffaf95 100644 --- a/sageranger/unpack_info.py +++ b/sageranger/unpack_info.py @@ -1,4 +1,14 @@ +"""Unpack Info +This module contains the logice for +unpacking the config file. It maps +all the values from the config file +to the corressponding values in the +data class sensor_info. These functions +are used in post_camera_er and in the repo +cougarvision. + +""" import argparse import yaml from dataclasses import fields From 181174edaf173d09f59b086d0626a0443c815111 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:46:27 -0700 Subject: [PATCH 07/20] Fix flake8 and pylint errors. --- sageranger/unpack_info.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sageranger/unpack_info.py b/sageranger/unpack_info.py index 6ffaf95..b91351d 100644 --- a/sageranger/unpack_info.py +++ b/sageranger/unpack_info.py @@ -1,17 +1,17 @@ """Unpack Info -This module contains the logice for +This module contains the logice for unpacking the config file. It maps -all the values from the config file -to the corressponding values in the +all the values from the config file +to the corressponding values in the data class sensor_info. These functions are used in post_camera_er and in the repo cougarvision. """ import argparse -import yaml from dataclasses import fields +import yaml def parse_args(): @@ -24,8 +24,9 @@ def parse_args(): argsparse.Namespace: An object containing all parsed arguement values as attributes (e.g., args.CONFIG). """ - parser = argparse.ArgumentParser(description='Retrieves information from' \ - 'config and posts events and observations') + parser = argparse.ArgumentParser(description='Retrieves information from' + 'config and posts events ' + 'and observations') parser.add_argument('CONFIG', type=str, help='path to config file.') return parser.parse_args() @@ -55,4 +56,4 @@ class type valid_keys = {f.name for f in fields(class_type)} filtered_keys = {k: v for k, v in config_dict.items() if k in valid_keys} - return class_type(**filtered_keys) \ No newline at end of file + return class_type(**filtered_keys) From b35276bfec258495048d5a644e4c6b5ca91c88fe Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 09:55:41 -0700 Subject: [PATCH 08/20] fix pylint and flake8 errors. --- sageranger/sensor_class.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/sageranger/sensor_class.py b/sageranger/sensor_class.py index 58ab75d..e55eba2 100644 --- a/sageranger/sensor_class.py +++ b/sageranger/sensor_class.py @@ -1,8 +1,26 @@ +"""Sensor Info + +This class holds the values from +the config file. Unpack_info +handles the logic of mapping the +variables to their values. +""" + from dataclasses import dataclass + @dataclass class SensorInfo: - path_csv:str + # pylint: disable=too-many-instance-attributes + """SensorInfo + + This dataclass declares the + config datatypes. The variable + names must match those in the + config file. + """ + + path_csv: str auth_token: str source_type: str provider: str @@ -11,7 +29,3 @@ class SensorInfo: content_type: str source_type: str group_name: str - - - - From cca5cc4c8198368c8ab06c380de3d2ba0930ad43 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 9 Jul 2026 10:03:32 -0700 Subject: [PATCH 09/20] Fix pylint and flake8 errors. --- sageranger/post_camera_er.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/sageranger/post_camera_er.py b/sageranger/post_camera_er.py index 8af373a..1bce56e 100644 --- a/sageranger/post_camera_er.py +++ b/sageranger/post_camera_er.py @@ -36,7 +36,6 @@ def post_camera(): # pylint: disable=too-many-locals """Adds Cameras to csv list of camera traps""" - config = get_config_info(SensorInfo) hdr = { @@ -113,14 +112,13 @@ def post_camera(): # pylint: disable=too-many-locals response = requests.get(url_4, headers=hdr, timeout=10) source_2 = response.json() - - #get subject group id - url_5 = url +'/subjectgroups/?group_name=' + config.group_name + # get subject group id + url_5 = url + '/subjectgroups/?group_name=' + config.group_name response = requests.get(url_5, headers=hdr, timeout=20) response_json = response.json() group_id = response_json['data'][0]['id'] - #post subject to subject group + # post subject to subject group payload = [{ "id": subject_id, "name": sen[i], @@ -137,19 +135,17 @@ def post_camera(): # pylint: disable=too-many-locals response_json = subject.json() # get the id of the default subject group - url_7 = url +'/subjectgroups/?group_name=Subjects' + url_7 = url + '/subjectgroups/?group_name=Subjects' response = requests.get(url_7, headers=hdr, timeout=20) response_json = response.json() - subject_default= response_json['data'][0]['id'] + subject_default = response_json['data'][0]['id'] - #delete from default subject group + # delete from default subject group url_8 = url + 'subjectgroup/' + subject_default + '/subjects' - _ = requests.delete(url_8, headers=hdr,json=payload, timeout=10) - #print("post?", response_json) - - #post observation - post_observation(subject_id, "", formatted_time, hdr) + _ = requests.delete(url_8, headers=hdr, json=payload, timeout=10) + # post observation + post_observation(subject_id, "", formatted_time, hdr) print("\nsubject id: " + subject_id) print("source id: " + source_2['data'][0]['id']) From 475c516af04ac5b1a6003c5522220a315224b6fb Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 14 Jul 2026 12:44:44 -0700 Subject: [PATCH 10/20] Delete wrong file type. --- sageranger/config/sensor_info,yml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 sageranger/config/sensor_info,yml diff --git a/sageranger/config/sensor_info,yml b/sageranger/config/sensor_info,yml deleted file mode 100644 index 292d4a2..0000000 --- a/sageranger/config/sensor_info,yml +++ /dev/null @@ -1,10 +0,0 @@ -path_csv: /path/to/file.csv # locally stored on your machine -event_type: '' -auth_token: 'Bearer ' # you must include bearer -source_type: 'seismic' -provider: ' # ex: Camera Trap -subject_type: 'stationary-object' -content_type: 'observations.subject' -source_type: 'tracking-device' -group_name: '' # ex: camera_trap From f3efa63720e0222f8ece3f9f15c8fa18f5e243b6 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 14 Jul 2026 12:45:26 -0700 Subject: [PATCH 11/20] Add config file template. --- sageranger/config/sensor_info.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 sageranger/config/sensor_info.yml diff --git a/sageranger/config/sensor_info.yml b/sageranger/config/sensor_info.yml new file mode 100644 index 0000000..f844ee1 --- /dev/null +++ b/sageranger/config/sensor_info.yml @@ -0,0 +1,11 @@ +path_csv: /path/to/file.csv # locally stored on your machine +event_type: '' +auth_token: 'Bearer ' # you must include bearer +source_type: 'seismic' +provider: ' # ex: Camera Trap +subject_type: 'stationary-object' +content_type: 'observations.subject' +source_type: 'tracking-device' +group_name: '' # ex: camera_trap + From a2502abe41e3700c1ec0ea1aff690fb95b7dc662 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 14 Jul 2026 12:51:38 -0700 Subject: [PATCH 12/20] Add sensor class. --- sageranger/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sageranger/__init__.py b/sageranger/__init__.py index c5b4376..4a54182 100644 --- a/sageranger/__init__.py +++ b/sageranger/__init__.py @@ -8,3 +8,4 @@ from sageranger.post_camera_er import post_camera from sageranger.post_obs import post_observation from sageranger.unpack_info import parse_args, get_config_info +from sageranger.sensor_class import SensorInfo From 06412669c76fb55ea9b37442a6a330abb14bbfa5 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 12:58:19 -0700 Subject: [PATCH 13/20] change spacing. --- sageranger/post_cougar_log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sageranger/post_cougar_log.py b/sageranger/post_cougar_log.py index d5f2cc8..c3bda57 100644 --- a/sageranger/post_cougar_log.py +++ b/sageranger/post_cougar_log.py @@ -34,7 +34,7 @@ def is_target(cam_name, authorization, label): current_time = datetime.now(UTC) formatted_time = current_time.strftime('%Y-%m-%dT%H:%M:%S.%f') + 'Z' - url = 'https://sagebrush.pamdas.org/api/v1.0/subjects/?name=' + cam_name + url = 'https://sagebrush.pamdas.org/api/v1.0/subjects/?name=' + str(cam_name) response = requests.get(url, headers=headers, timeout=10) response_json = response.json() From 62ba0d0c03ced3deab1080f0cce0f13046ba016d Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 13:05:01 -0700 Subject: [PATCH 14/20] Update to work with temperature sensors, --- sageranger/post_obs.py | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/sageranger/post_obs.py b/sageranger/post_obs.py index 3c7454c..ca5dba9 100644 --- a/sageranger/post_obs.py +++ b/sageranger/post_obs.py @@ -8,6 +8,8 @@ """ import requests +from unpack_info import get_config_info +from sensor_class import SensorInfo def post_observation(subject_id, label, time, hdr): @@ -26,15 +28,15 @@ def post_observation(subject_id, label, time, hdr): https://.pamdas.org/api/v1.0/docs/interactive/ ) """ + config = get_config_info(SensorInfo) url = 'https://sagebrush.pamdas.org/api/v1.0/' url_3 = url + 'subject/' + subject_id + '/sources/' response = requests.get(url_3, headers=hdr, timeout=10) response_json = response.json() - source_id = response_json['data'][0]['id'] - payload = { + payload_camera = { "location": { "longitude": 0, "latitude": 0}, @@ -44,6 +46,40 @@ def post_observation(subject_id, label, time, hdr): [{"value": "test", "label": "animal", "units": ""}], "additional": {"animal": label} } + + payload_temp = { + "location": { + "longitude": 0, + "latitude": 0}, + "recorded_at": time, + "source": source_id, + "device_status_properties": [{ + "value": "", + "label": "int_temperature", + "units": "C" + }, + {"value": "", + "label": "ext_temperature", + "units": "C"}, + {"value": "", + "label": "humidity", + "units": "%"}, + {"value": "", + "label": "bat_stat", + "units": "V"}], + "additional": { + "int_temperature": "", + "ext_temperature": "", + "humidity": "", + "bat_stat": "" + } + } + + if config.sensor_type: + payload = payload_camera + else: + payload = payload_temp + url_5 = url + 'observations/' obs = requests.post(url_5, headers=hdr, json=payload, timeout=20) print("Observation response: ", obs) From 0fa59f2d2f5318aca7c4d680668f98bc42939ed4 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 13:07:37 -0700 Subject: [PATCH 15/20] Add new config value. --- sageranger/sensor_class.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sageranger/sensor_class.py b/sageranger/sensor_class.py index e55eba2..92d5f27 100644 --- a/sageranger/sensor_class.py +++ b/sageranger/sensor_class.py @@ -29,3 +29,4 @@ class SensorInfo: content_type: str source_type: str group_name: str + sensor_type: bool From b1e288befe8c386694cb507ee74189e0f2a6ca8b Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 13:08:16 -0700 Subject: [PATCH 16/20] Add new config value for different sensors. --- sageranger/config/sensor_info.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sageranger/config/sensor_info.yml b/sageranger/config/sensor_info.yml index f844ee1..3241c89 100644 --- a/sageranger/config/sensor_info.yml +++ b/sageranger/config/sensor_info.yml @@ -8,4 +8,6 @@ subject_type: 'stationary-object' content_type: 'observations.subject' source_type: 'tracking-device' group_name: '' # ex: camera_trap - +# change for sensor type +# 1=camera 0= temp +sensor_type: 0 From f750e83ba5179970f67c8df7c14b1532332db412 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 13:21:23 -0700 Subject: [PATCH 17/20] Delete duplicate values. --- sageranger/config/sensor_info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/sageranger/config/sensor_info.yml b/sageranger/config/sensor_info.yml index 3241c89..32f7316 100644 --- a/sageranger/config/sensor_info.yml +++ b/sageranger/config/sensor_info.yml @@ -1,7 +1,6 @@ path_csv: /path/to/file.csv # locally stored on your machine event_type: '' auth_token: 'Bearer ' # you must include bearer -source_type: 'seismic' provider: ' # ex: Camera Trap subject_type: 'stationary-object' From 92fa3c3c313090e6a9f8826b532361132ed5403b Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 21 Jul 2026 13:22:51 -0700 Subject: [PATCH 18/20] Delete duplicate values. --- sageranger/sensor_class.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sageranger/sensor_class.py b/sageranger/sensor_class.py index 92d5f27..ee57d35 100644 --- a/sageranger/sensor_class.py +++ b/sageranger/sensor_class.py @@ -27,6 +27,5 @@ class SensorInfo: subject_subtype: str subject_type: str content_type: str - source_type: str group_name: str sensor_type: bool From de5fd8364910893702c36f8035a4ea437bac8d8a Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Thu, 23 Jul 2026 13:22:15 -0700 Subject: [PATCH 19/20] Fix line too long error. --- sageranger/post_cougar_log.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sageranger/post_cougar_log.py b/sageranger/post_cougar_log.py index c3bda57..bfebce2 100644 --- a/sageranger/post_cougar_log.py +++ b/sageranger/post_cougar_log.py @@ -34,7 +34,8 @@ def is_target(cam_name, authorization, label): current_time = datetime.now(UTC) formatted_time = current_time.strftime('%Y-%m-%dT%H:%M:%S.%f') + 'Z' - url = 'https://sagebrush.pamdas.org/api/v1.0/subjects/?name=' + str(cam_name) + url = ('https://sagebrush.pamdas.org/api/v1.0/subjects/?name=' + + str(cam_name)) response = requests.get(url, headers=headers, timeout=10) response_json = response.json() From 836ba2c821fae20561a6d7ff5fc6d79491041053 Mon Sep 17 00:00:00 2001 From: Montserrat Jara Date: Tue, 28 Jul 2026 10:18:04 -0700 Subject: [PATCH 20/20] update functions used. --- sageranger/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sageranger/__init__.py b/sageranger/__init__.py index 4a54182..385bc33 100644 --- a/sageranger/__init__.py +++ b/sageranger/__init__.py @@ -7,5 +7,5 @@ from sageranger.post_monthly import post_monthly_obs from sageranger.post_camera_er import post_camera from sageranger.post_obs import post_observation -from sageranger.unpack_info import parse_args, get_config_info +from sageranger.unpack_info import get_config_info from sageranger.sensor_class import SensorInfo