Skip to content

Enabling ESO facility breaks updatestatus management command #38

@talister

Description

@talister

Clicking the 'Update Observations Status' e.g. on this FOMO Target with tom_eso.eso.ESOFacility in the TOM_FACILITY_CLASSES of settings.py breaks with the following stack trace:

Environment:


Request Method: GET
Request URL: http://tlister-thinkmate.lco.gtn:6729/targets/30/?update_status=True

Django Version: 4.2.29
Python Version: 3.11.13
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'django_extensions',
 'guardian',
 'tom_common',
 'django_comments',
 'bootstrap4',
 'crispy_bootstrap4',
 'crispy_forms',
 'rest_framework',
 'rest_framework.authtoken',
 'django_filters',
 'django_gravatar',
 'django_htmx',
 'tom_targets',
 'tom_alerts',
 'tom_catalogs',
 'tom_observations',
 'tom_dataproducts',
 'solsys_code',
 'solsys_code.solsys_code_observatory.apps.SolsysCodeObservatoryConfig',
 'tom_alertstreams',
 'tom_fink',
 'tom_registration',
 'tom_eso']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django_htmx.middleware.HtmxMiddleware',
 'tom_common.middleware.Raise403Middleware',
 'tom_common.middleware.ExternalServiceMiddleware',
 'tom_common.middleware.AuthStrategyMiddleware',
 'tom_common.middleware.AuthStrategyMiddleware',
 'tom_registration.middleware.RedirectAuthenticatedUsersFromRegisterMiddleware']



Traceback (most recent call last):
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/handlers/base.py", line 199, in _get_response
    response = self.process_exception_by_middleware(e, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/handlers/base.py", line 362, in process_exception_by_middleware
    response = middleware_method(request, exception)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/tom_common/middleware.py", line 29, in process_exception
    raise exception
    ^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 105, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 144, in dispatch
    return handler(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/tom_targets/views.py", line 493, in get
    call_command('updatestatus', target_id=target_id, stdout=out)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/management/__init__.py", line 194, in call_command
    return command.execute(*args, **defaults)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/core/management/base.py", line 458, in execute
    output = self.handle(*args, **options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/tom_observations/management/commands/updatestatus.py", line 46, in handle
    failed_records[facility_name] = instance.update_all_observation_statuses(target=target)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/tom_observations/facility.py", line 528, in update_all_observation_statuses
    records = records.exclude(status__in=self.get_terminal_observing_states())
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/query.py", line 1446, in exclude
    return self._filter_or_exclude(True, args, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/query.py", line 1456, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/query.py", line 1464, in _filter_or_exclude_inplace
    self._query.add_q(~Q(*args, **kwargs))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/sql/query.py", line 1548, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/sql/query.py", line 1579, in _add_q
    child_clause, needed_inner = self.build_filter(
                                 
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/sql/query.py", line 1494, in build_filter
    condition = self.build_lookup(lookups, col, value)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/sql/query.py", line 1321, in build_lookup
    lookup = lookup_class(lhs, rhs)
             ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/lookups.py", line 27, in __init__
    self.rhs = self.get_prep_lookup()
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/lookups.py", line 426, in get_prep_lookup
    return super().get_prep_lookup()
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tlister/venv/fomo311_venv/lib64/python3.11/site-packages/django/db/models/lookups.py", line 270, in get_prep_lookup
    for rhs_value in self.rhs:
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Exception Type: TypeError at /targets/30/
Exception Value: 'NoneType' object is not iterable

This is breaking within the chain of calls from tom_observations/management/commands/updatestatus.py which loops over all facilities and calls failed_records[facility_name] = instance.update_all_observation_statuses(target=target).
This works for the LCOFacility, GEMFacility and SOARFacility but breaks with tom_eso.eso.ESOFacility.
This is because of the records = records.exclude(status__in=self.get_terminal_observing_states()) line as tom_eso.eso.ESOFacility.get_terminal_observing_states() only contains a pass which isn't the list-like iterable that status__in needs.

Changing tom_eso.eso.ESOFacility.get_terminal_observing_states() (lines 626--627) to:

    def get_terminal_observing_states(self):
        return []

fixed it for me.

Metadata

Metadata

Assignees

Labels

UserIssue Raised by a userbugSomething isn't working

Type

Projects

Status

Closed

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions