Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7a7f32f
First non-functional stub-out of new JPL Scout dataservice
talister Feb 3, 2026
c88b31f
Begin building query params dict
talister Feb 3, 2026
17363e4
First basic functional version: Multi & single-object query and Targe…
talister Feb 4, 2026
676d408
Updates for form-driven workflows.
talister Feb 5, 2026
f4760e1
Add ScoutDataService to data_services()
talister Feb 5, 2026
eb14bcd
Rewrite query_targets() to iterate over results table fetching orbita…
talister Feb 5, 2026
51371c0
Add a basic check for errors so it doesn't fall completely on its face
talister Feb 6, 2026
4008d86
Giving up on and commiting broken state when attempting to filter on …
talister Feb 6, 2026
a668789
Rename scout.py to jpl.py (Since we likely will have other JPL DataSe…
talister Feb 9, 2026
5613a8f
Additional updates for Scout service:
talister Feb 10, 2026
31f3ef1
All modes of form-filling should be functional now. Add auto-pluraliz…
talister Feb 10, 2026
b6dd1a1
First attempts at splitting form into simple and advanced sections. f…
talister Feb 10, 2026
e62f522
Implement filtering on PHA and GEO scores
talister Feb 10, 2026
59fb4ec
Add ability to filter on impact rating, CA distance and positional un…
talister Feb 11, 2026
560314a
Fix lint/flake errors
talister Feb 11, 2026
0561977
Add start of tests for ScoutDataService
talister Feb 12, 2026
1fdef28
Update indentation to placate flake8
talister Feb 12, 2026
933407a
First cut at canary tests for JPL Scout API
talister Feb 12, 2026
20ed3d0
Refactor overly complex query_targets() with the aid of Claude
talister Mar 4, 2026
7d2af44
Create ScoutDetail model and migration to store metadata about Scout/…
talister Mar 5, 2026
7af7cae
Fix dumb jet-lag-induced bug. Add tests
talister Mar 6, 2026
406a905
Add Meta and __str__ method
talister Mar 6, 2026
cf016d4
Fix migration dependency on phantom 0032 dependency
talister Mar 6, 2026
ac9f6b4
Change canary test objects to older ones which (hopefully) won't evol…
talister Mar 6, 2026
9a1bdbf
Change canary test objects to older ones which (hopefully) won't evol…
talister Mar 6, 2026
3a8ff30
Merge remote-tracking branch 'upstream/version-3-0-alpha' into 1326-n…
talister Mar 19, 2026
904c708
Restore functionality of advanced form after upstream changes
talister Mar 19, 2026
5e151ba
Remove now unneeded partials
talister Mar 19, 2026
ca41c40
Fix filtering logic bug that prevented filtering on geoScore=0. Updat…
talister Mar 19, 2026
84882f5
Lint fixes
talister Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions tom_base/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,11 @@
'tom_observations.cadences.resume_cadence_after_failure.ResumeCadenceAfterFailureStrategy'
]

DATA_SERVICES = {
'Scout': {
'base_url': 'https://ssd-api.jpl.nasa.gov/scout.api',
},
}
# Define extra target fields here. Types can be any of "number", "string", "boolean" or "datetime"
# See https://tomtoolkit.github.io/docs/target_fields for documentation on this feature
# For example:
Expand Down
37 changes: 19 additions & 18 deletions tom_catalogs/tests/harvesters/test_jplhorizons.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,37 @@ def setUp(self):
self.broker = JPLHorizonsHarvester()

def test_query_number_only(self):
self.broker.query('700000')
self.broker.query('69420')
target = self.broker.to_target()
target.save(names=getattr(target, 'extra_names', []))
# Only test things that are not likely to change (much) with time
self.assertEqual(target.name, '700000 (1994 UX10)')
self.assertEqual(target.names, ['700000 (1994 UX10)'])
self.assertEqual(target.name, '69420 (1995 YA1)')
self.assertEqual(target.names, ['69420 (1995 YA1)'])
self.assertEqual(target.type, 'NON_SIDEREAL')
self.assertEqual(target.scheme, 'MPC_MINOR_PLANET')
self.assertEqual(target.ra, None)
self.assertEqual(target.dec, None)
self.assertAlmostEqual(target.eccentricity, 0.093, places=3)
self.assertAlmostEqual(target.inclination, 4.1684084, places=3)
self.assertAlmostEqual(target.semimajor_axis, 2.657503, places=3)
self.assertAlmostEqual(target.abs_mag, 17.76, places=2)
self.assertAlmostEqual(target.eccentricity, 0.255042, places=4)
self.assertAlmostEqual(target.inclination, 13.208657, places=3)
self.assertAlmostEqual(target.semimajor_axis, 2.58835, places=3)
self.assertAlmostEqual(target.abs_mag, 15.09, places=2)
self.assertAlmostEqual(target.slope, 0.15, places=2)

def test_query_designation_only(self):
self.broker.query('2025 MB18')
self.broker.query('1995 YA1')
target = self.broker.to_target()
target.save(names=getattr(target, 'extra_names', []))
# Only test things that are not likely to change (much) with time
self.assertEqual(target.name, '(2025 MB18)')
self.assertEqual(target.names, ['(2025 MB18)'])
self.assertEqual(target.name, '69420 (1995 YA1)')
self.assertEqual(target.names, ['69420 (1995 YA1)'])
self.assertEqual(target.type, 'NON_SIDEREAL')
self.assertEqual(target.scheme, 'MPC_MINOR_PLANET')
self.assertEqual(target.ra, None)
self.assertEqual(target.dec, None)
self.assertAlmostEqual(target.eccentricity, 0.1386, places=4)
self.assertAlmostEqual(target.inclination, 19.2780, places=4)
self.assertAlmostEqual(target.abs_mag, 24.33, places=2)
self.assertAlmostEqual(target.eccentricity, 0.255042, places=4)
self.assertAlmostEqual(target.inclination, 13.208657, places=3)
self.assertAlmostEqual(target.semimajor_axis, 2.58835, places=3)
self.assertAlmostEqual(target.abs_mag, 15.09, places=2)
self.assertAlmostEqual(target.slope, 0.15, places=2)

def test_query_name(self):
Expand All @@ -58,15 +59,15 @@ def test_query_name(self):
self.assertAlmostEqual(target.slope, 0.60, places=2)

def test_comet_query_desig(self):
self.broker.query('C/2025 A6')
self.broker.query('P/2012 B1')
target = self.broker.to_target()
target.save(names=getattr(target, 'extra_names', []))
# Only test things that are not likely to change (much) with time
self.assertEqual(target.name, 'Lemmon (C/2025 A6)')
self.assertEqual(target.names, ['Lemmon (C/2025 A6)'])
self.assertEqual(target.name, 'PANSTARRS (P/2012 B1)')
self.assertEqual(target.names, ['PANSTARRS (P/2012 B1)'])
self.assertEqual(target.type, 'NON_SIDEREAL')
self.assertEqual(target.scheme, 'MPC_COMET')
self.assertEqual(target.ra, None)
self.assertEqual(target.dec, None)
self.assertAlmostEqual(target.eccentricity, 0.9956, places=4)
self.assertAlmostEqual(target.inclination, 143.663531, places=3)
self.assertAlmostEqual(target.eccentricity, 0.410531, places=4)
self.assertAlmostEqual(target.inclination, 7.605125, places=3)
28 changes: 14 additions & 14 deletions tom_catalogs/tests/harvesters/test_mpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,37 +185,37 @@ def setUp(self):
self.broker = MPCHarvester()

def test_query_number_only(self):
self.broker.query('700000')
self.broker.query('69420')
target = self.broker.to_target()
target.save(names=getattr(target, 'extra_names', []))
# Only test things that are not likely to change (much) with time
self.assertEqual(target.name, '700000')
self.assertEqual(target.names, ['700000'])
self.assertEqual(target.name, '69420')
self.assertEqual(target.names, ['69420'])
self.assertEqual(target.type, 'NON_SIDEREAL')
self.assertEqual(target.scheme, 'MPC_MINOR_PLANET')
self.assertEqual(target.ra, None)
self.assertEqual(target.dec, None)
self.assertAlmostEqual(target.eccentricity, 0.092, places=3)
self.assertAlmostEqual(target.inclination, 4.1688, places=4)
self.assertAlmostEqual(target.mean_anomaly, 315.8420, places=4)
self.assertAlmostEqual(target.semimajor_axis, 2.6555, places=4)
self.assertAlmostEqual(target.abs_mag, 17.76, places=2)
self.assertAlmostEqual(target.eccentricity, 0.255042, places=4)
self.assertAlmostEqual(target.inclination, 13.208657, places=3)
self.assertAlmostEqual(target.semimajor_axis, 2.58835, places=3)
self.assertAlmostEqual(target.abs_mag, 15.09, places=2)
self.assertAlmostEqual(target.slope, 0.15, places=2)

def test_query_designation_only(self):
self.broker.query('2025 MB18')
self.broker.query('1998 WB2')
target = self.broker.to_target()
target.save(names=getattr(target, 'extra_names', []))
# Only test things that are not likely to change (much) with time
self.assertEqual(target.name, '2025 MB18')
self.assertEqual(target.names, ['2025 MB18'])
self.assertEqual(target.name, '1998 WB2')
self.assertEqual(target.names, ['1998 WB2'])
self.assertEqual(target.type, 'NON_SIDEREAL')
self.assertEqual(target.scheme, 'MPC_MINOR_PLANET')
self.assertEqual(target.ra, None)
self.assertEqual(target.dec, None)
self.assertAlmostEqual(target.eccentricity, 0.1398, places=4)
self.assertAlmostEqual(target.inclination, 19.3561, places=4)
self.assertAlmostEqual(target.abs_mag, 24.33, places=2)
self.assertAlmostEqual(target.eccentricity, 0.586622, places=4)
self.assertAlmostEqual(target.inclination, 2.37248, places=3)
self.assertAlmostEqual(target.semimajor_axis, 1.97247, places=3)
self.assertAlmostEqual(target.abs_mag, 21.85, places=2)
self.assertAlmostEqual(target.slope, 0.15, places=2)

def test_query_name(self):
Expand Down
1 change: 1 addition & 0 deletions tom_dataservices/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ def data_services(self):
data_services = [
{'class': f'{self.name}.data_services.simbad.SimbadDataService'},
{'class': f'{self.name}.data_services.tns.TNSDataService'},
{'class': f'{self.name}.data_services.jpl.ScoutDataService'},
]
return data_services
Loading
Loading