Skip to content

Commit 984d2a3

Browse files
committed
add management command to list and run saved dataservices
1 parent a6de7d6 commit 984d2a3

4 files changed

Lines changed: 103 additions & 9 deletions

File tree

tom_dataservices/dataservices.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,16 @@ def to_target(self, target_result=None, **kwargs):
360360
assign_perm('tom_targets.delete_target', group, target)
361361
except IntegrityError:
362362
target = Target.objects.get(name=target.name)
363-
messages.warning(request,
364-
mark_safe(
365-
f"""The target,
366-
<a href="{reverse('targets:detail', kwargs={'pk': target.id})}">
367-
{target.name}</a> already exists, any new data has been ingested.
368-
You can <a href="{reverse('targets:create') + '?' +
369-
urlencode(target.as_dict())}">create</a> a new target anyway.
370-
""")
371-
)
363+
message = f"""The target,
364+
<a href="{reverse('targets:detail', kwargs={'pk': target.id})}">
365+
{target.name}</a> already exists, any new data has been ingested.
366+
You can <a href="{reverse('targets:create') + '?' +
367+
urlencode(target.as_dict())}">create</a> a new target anyway.
368+
"""
369+
if request:
370+
messages.warning(request, mark_safe(message))
371+
else:
372+
logger.warning(f"The target, {target.name}, already exists. Any new data will be ingested.")
372373
# Save Aliases
373374
self.to_aliases(target, target_result.get('aliases', []))
374375
return target

tom_dataservices/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import logging
2+
3+
from django.core.management.base import BaseCommand
4+
from astropy.table import Table
5+
6+
from tom_dataservices.models import DataServiceQuery
7+
8+
9+
logger = logging.getLogger(__name__)
10+
11+
12+
class Command(BaseCommand):
13+
help = 'Creates a table of save data service queries.'
14+
15+
def handle(self, *args, **options):
16+
ids = []
17+
names = []
18+
services = []
19+
last_runs = []
20+
queries = DataServiceQuery.objects.all()
21+
for query in queries:
22+
ids.append(query.pk)
23+
names.append(query.name)
24+
services.append(query.data_service)
25+
last_runs.append(query.last_run)
26+
t = Table([ids, names, services, last_runs], names=('ID', 'Name', 'Data Service', 'Last Run'))
27+
print(t)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import logging
2+
from requests import HTTPError
3+
from requests.exceptions import ReadTimeout
4+
5+
from django.core.management.base import BaseCommand
6+
from django.core.exceptions import ValidationError
7+
from django.utils import timezone
8+
from astropy.table import Table
9+
10+
from tom_dataservices.models import DataServiceQuery
11+
from tom_dataservices.dataservices import get_data_service_class, NotConfiguredError
12+
from tom_dataservices.dataservices import MissingDataException, QueryServiceError
13+
14+
15+
16+
logger = logging.getLogger(__name__)
17+
18+
19+
class Command(BaseCommand):
20+
help = 'Runs saved dataservice queries and saves the results as Targets'
21+
22+
def add_arguments(self, parser):
23+
parser.add_argument(
24+
'query_id',
25+
help='ID of saved query to run. (i.e. 1 or 26). Run listqueries management command to see' \
26+
'IDs for saved queries'
27+
)
28+
29+
def handle(self, *args, **options):
30+
try:
31+
query = DataServiceQuery.objects.get(id=options['query_id'])
32+
dataservice_class = get_data_service_class(query.data_service)
33+
data_service_class = dataservice_class()
34+
query_parameters = data_service_class.build_query_parameters(query.parameters)
35+
query.last_run = timezone.now()
36+
query.save()
37+
38+
query_results = data_service_class.query_targets(query_parameters)
39+
40+
for result in query_results:
41+
try:
42+
target = data_service_class.to_target(result)
43+
if target:
44+
try:
45+
data_service_class.to_reduced_datums(target, result.get('reduced_datums'))
46+
except MissingDataException:
47+
try:
48+
data = data_service_class.query_reduced_data(target)
49+
data_service_class.to_reduced_datums(target, data)
50+
except QueryServiceError as e:
51+
logger.error(f'Error retrieving data from Data Service: {e}')
52+
except ValidationError as e:
53+
logger.error(f'Target Creation failed: {e}')
54+
self.stdout.write('Finished querying targets')
55+
except DataServiceQuery.DoesNotExist as e:
56+
logger.error(f"Failure to run query {options['query_id']}: {e}")
57+
except HTTPError as e:
58+
logger.error(f"Issue fetching query results, please try again.: {e}")
59+
except NotConfiguredError as e:
60+
logger.error(f"Configuration Error. Please contact your TOM Administrator: {e}")
61+
except QueryServiceError as e:
62+
logger.error(f"There was an error with the underlying query service: {e}")
63+
except ReadTimeout as e:
64+
logger.error(f"The query service connection timed out: {e}")
65+
except KeyboardInterrupt:
66+
self.stdout.write('Exiting...')

0 commit comments

Comments
 (0)