diff --git a/Dockerfile-static b/Dockerfile-static new file mode 100644 index 00000000..acc79897 --- /dev/null +++ b/Dockerfile-static @@ -0,0 +1,34 @@ +FROM python:3.8.2-buster as builder + +# Install required packages +RUN apt-get update && \ + apt-get install -y \ + libsasl2-dev \ + python-dev \ + libldap2-dev \ + libssl-dev &&\ + rm -rf /var/lib/apt/lists/* + +# Set workdir and install python requirements +WORKDIR /usr/src/love +COPY manager/requirements.txt . +RUN pip install -r requirements.txt + +# Copy source code and collect statics +COPY manager ./manager +WORKDIR /usr/src/love/manager +RUN find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf +RUN python manage.py collectstatic --noinput + +# Copy media data +RUN mkdir -p media/thumbnails +RUN cp -u ui_framework/fixtures/thumbnails/* media/thumbnails +RUN mkdir -p media/configs +RUN cp -u api/fixtures/configs/* media/configs + +# copy compiled files to smaller image +FROM alpine:3.8 +COPY --from=builder /usr/src/love/manager/static /usr/src/love/manager/static +COPY --from=builder /usr/src/love/manager/media /usr/src/love/manager/media +VOLUME /usr/src/love/manager/static +VOLUME /usr/src/love/manager/media diff --git a/Jenkinsfile b/Jenkinsfile index 5fde6ee1..488acf7d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -18,6 +18,7 @@ pipeline { branch "bugfix/*" branch "hotfix/*" branch "release/*" + branch "tickets/*" } } steps { @@ -29,7 +30,7 @@ pipeline { if (slashPosition > 0) { git_tag = git_branch.substring(slashPosition + 1, git_branch.length()) git_branch = git_branch.substring(0, slashPosition) - if (git_branch == "release" || git_branch == "hotfix" || git_branch == "bugfix") { + if (git_branch == "release" || git_branch == "hotfix" || git_branch == "bugfix" || git_branch == "tickets") { image_tag = git_tag } } @@ -64,6 +65,7 @@ pipeline { branch "bugfix/*" branch "hotfix/*" branch "release/*" + branch "tickets/*" } } steps { diff --git a/docs/doctrees/apidoc/api.doctree b/docs/doctrees/apidoc/api.doctree index db159d6c..8ecf1b0e 100644 Binary files a/docs/doctrees/apidoc/api.doctree and b/docs/doctrees/apidoc/api.doctree differ diff --git a/docs/doctrees/apidoc/api.tests.doctree b/docs/doctrees/apidoc/api.tests.doctree index d7d9e3be..1b234601 100644 Binary files a/docs/doctrees/apidoc/api.tests.doctree and b/docs/doctrees/apidoc/api.tests.doctree differ diff --git a/docs/doctrees/apidoc/ui_framework.doctree b/docs/doctrees/apidoc/ui_framework.doctree index 4692f1aa..50951e8e 100644 Binary files a/docs/doctrees/apidoc/ui_framework.doctree and b/docs/doctrees/apidoc/ui_framework.doctree differ diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle index bce87e0f..ad5dd7d3 100644 Binary files a/docs/doctrees/environment.pickle and b/docs/doctrees/environment.pickle differ diff --git a/docs/doctrees/modules/how_to_use_it.doctree b/docs/doctrees/modules/how_to_use_it.doctree index 65903122..f610d0c6 100644 Binary files a/docs/doctrees/modules/how_to_use_it.doctree and b/docs/doctrees/modules/how_to_use_it.doctree differ diff --git a/docs/html/_sources/modules/how_to_use_it.rst.txt b/docs/html/_sources/modules/how_to_use_it.rst.txt index 8811e5cc..386c6fb2 100644 --- a/docs/html/_sources/modules/how_to_use_it.rst.txt +++ b/docs/html/_sources/modules/how_to_use_it.rst.txt @@ -1202,3 +1202,106 @@ Delete WorkspaceView { "status": 204 } + + +EFD +============ + +Timeseries +~~~~~~~~~~~~~~~~~~~~ +Endpoint to request EFD timeseries. + +- Url: :code:`/manager/efd/timeseries` +- HTTP Operation: POST +- Message Payload: + +.. code-block:: json + + { + "start_date": "2020-03-16T12:00:00", + "time_window": 15, + "cscs": { + "ATDome": { + 0: { + "topic1": ["field1"] + }, + }, + "ATMCS": { + 1: { + "topic2": ["field2", "field3"] + }, + } + }, + "resample": "1min", + } + + +- Expected Response, if command successful: + +.. code-block:: json + + { + "status": 200, + "data": { + "ATDome-0-topic1": { + "field1": [ + { ts: "2020-03-06 21:49:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:50:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:51:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:52:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:53:41.471000", value: 0.21 } + ] + }, + "ATMCS-1-topic2": { + "field2": [ + { ts: "2020-03-06 21:49:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:50:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:51:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:52:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:53:41.471000", value: 0.21 } + ], + "field3": [ + { ts: "2020-03-06 21:49:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:50:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:51:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:52:41.471000", value: 0.21 }, + { ts: "2020-03-06 21:53:41.471000", value: 0.21 } + ] + } + } + } + + + +TCS +============ + +aux +~~~~~~~~~~~~~~~~~~~~ +Endpoint to send ATCS commands. + +- Url: :code:`/manager/tcs/aux` +- HTTP Operation: POST +- Message Payload: + +.. code-block:: json + + { + "command_name": "point_azel", + "params": { + "az": 30, + "el": 50 + } + } + + +- Expected Response, if command successful: + +.. code-block:: json + + { + "status": 200, + "data": { + "ack": "Done", + } + } \ No newline at end of file diff --git a/docs/html/apidoc/api.html b/docs/html/apidoc/api.html index 3227f2c4..338bce80 100644 --- a/docs/html/apidoc/api.html +++ b/docs/html/apidoc/api.html @@ -662,6 +662,11 @@

5.1.2. Submodules

final_validator: a standard validator that does not alter the data being validated.

+
+
+static set_default_properties(properties, skip_properties, instance)
+
+
validate(data_dict)
@@ -812,7 +817,7 @@

5.1.2. SubmodulesCustom Serializer for responses to validate and get token requests.

-get_config(token) → dict
+get_config(token) → Optional[dict]

Return the config file. If the ‘no_config’ flag is present in the url of the original request, then the file is not read and the return value is None

@@ -1261,6 +1266,50 @@

5.1.2. Submodules

+
+
+api.views.query_efd(self, request, *args, **kwargs)
+

Queries data from an EFD timeseries by redirecting the request to the Commander

+
+
request: Request

The Request object

+
+
args: list

List of addittional arguments. Currently unused

+
+
kwargs: dict
+
Dictionary with request arguments. Request should contain the following:

start_date (required): String specifying the start of the query range. Default current date minus 10 minutes +timewindow (required): Int specifying the number of minutes to query starting from start_date. Default 10 +topics (required): Dictionary of the form

+
+
+
{
+
CSC1: {

index: [topic1, topic2…],

+
+
+

}, +CSC2: {

+
+

index: [topic1, topic2…],

+
+

},

+
+
+

}

+
+

resample (optional): The offset string representing target resample conversion, e.g. ‘15min’, ‘10S’

+
+
+
+
+
+
Returns
+

The response and status code of the request to the LOVE-Commander

+
+
Return type
+

Response

+
+
+
+
api.views.salinfo_metadata(self, request, *args, **kwargs)
@@ -1320,6 +1369,40 @@

5.1.2. Submodules

+
+
+api.views.tcs_aux_command(self, request, *args, **kwargs)
+

Sends command to the ATCS

+
+
request: Request

The Request object

+
+
args: list

List of addittional arguments. Currently unused

+
+
kwargs: dict
+
Dictionary with request arguments. Request should contain the following:

command_name (required): The name of the command to be run. It should be a field of the lsst.ts.observatory.control.auxtel.ATCS class +params (required): Parameters to be passed to the command method, e.g.

+
+
+
{

ra: 80, +dec: 30,

+
+
+

}

+
+
+
+
+
+
+
Returns
+

The response and status code of the request to the LOVE-Commander

+
+
Return type
+

Response

+
+
+
+
api.views.validate_config_schema(self, request, *args, **kwargs)
diff --git a/docs/html/apidoc/api.tests.html b/docs/html/apidoc/api.tests.html index a01d9fdb..66ca4ab5 100644 --- a/docs/html/apidoc/api.tests.html +++ b/docs/html/apidoc/api.tests.html @@ -216,6 +216,29 @@

5.1.1.1.1. Submodules +
+class api.tests.test_commander.EFDTestCase(methodName='runTest')
+

Bases: django.test.testcases.TestCase

+
+
+maxDiff = None
+
+ +
+
+setUp()
+

Define the test suite setup.

+
+ +
+
+test_timeseries_query(mock_requests, mock_environ)
+

Test authorized user can query and get a timeseries

+
+ +

+
class api.tests.test_commander.SalinfoTestCase(methodName='runTest')
@@ -263,6 +286,29 @@

5.1.1.1.1. Submodules +
+class api.tests.test_commander.TCSTestCase(methodName='runTest')
+

Bases: django.test.testcases.TestCase

+
+
+maxDiff = None
+
+ +
+
+setUp()
+

Define the test suite setup.

+
+ +
+
+test_command_query(mock_requests, mock_environ)
+

Test authorized user can send a TCS command

+
+ +

+

5.1.1.1.3. api.tests.test_lovecsc module

@@ -484,6 +530,11 @@

5.1.1.1.1. Submodules +
+api.tests.tests_configfile.setUp(self)
+

+

5.1.1.1.7. api.tests.tests_emergencycontact module

diff --git a/docs/html/apidoc/ui_framework.html b/docs/html/apidoc/ui_framework.html index 587882ca..76b17842 100644 --- a/docs/html/apidoc/ui_framework.html +++ b/docs/html/apidoc/ui_framework.html @@ -932,7 +932,7 @@

5.5.2. Submodules
-queryset = <QuerySet [<View: sqqtest>, <View: CSCSummary>, <View: Random view>, <View: CSCSummary + CSCG>, <View: Dome & Mount>, <View: HealthStatusSummary>, <View: LATISS + Camera>, <View: Network + Scheduler>, <View: TimeDisplay>, <View: Watcher + ObsLogs>, <View: WeatherStation>, <View: Dome-Mount test>, <View: logslogs>, <View: LATISS>, <View: ATCamera>, <View: AT Lightpath>, <View: ATMount overview>, <View: HealthStatusSummary>, <View: ObservingLog>, <View: Time Displays>, '...(remaining elements truncated)...']>
+queryset = <QuerySet [<View: fdsfdsddsda>, <View: TimeSeriesPlot>, <View: CSCSummary>, <View: sqqtest>, <View: Random view>, <View: CSCSummary + CSCG>, <View: Dome & Mount>, <View: HealthStatusSummary>, <View: LATISS + Camera>, <View: Network + Scheduler>, <View: TimeDisplay>, <View: Watcher + ObsLogs>, <View: WeatherStation>, <View: Dome-Mount test>, <View: logslogs>, <View: LATISS>, <View: ATCamera>, <View: AT Lightpath>, <View: ATMount overview>, <View: HealthStatusSummary>, '...(remaining elements truncated)...']>

Set of objects to be accessed by queries to this viewsets endpoints

diff --git a/docs/html/genindex.html b/docs/html/genindex.html index 127b15c5..0c05c63a 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -376,6 +376,8 @@

D

E

    +
  • EmergencyContactApiTestCase (class in api.tests.tests_emergencycontact) +
  • EmergencyContactSerializer (class in api.serializers)
  • EmergencyContactSerializer.Meta (class in api.serializers) @@ -669,7 +671,11 @@

    M

  • maxDiff (api.tests.test_commander.CommanderTestCase attribute)
      +
    • (api.tests.test_commander.EFDTestCase attribute) +
    • (api.tests.test_commander.SalinfoTestCase attribute) +
    • +
    • (api.tests.test_commander.TCSTestCase attribute)
    • (api.tests.test_lovecsc.LOVECscTestCase attribute)
    • @@ -784,6 +790,8 @@

      P

      Q

        +
      • query_efd() (in module api.views) +
      • queryset (api.views.ConfigFileViewSet attribute)
      • +
      • set_default_properties() (api.schema_validator.DefaultingValidator static method) +
      • setUp() (api.tests.test_commander.CommanderTestCase method)
          +
        • (api.tests.test_commander.EFDTestCase method) +
        • (api.tests.test_commander.SalinfoTestCase method) +
        • +
        • (api.tests.test_commander.TCSTestCase method)
        • (api.tests.test_lovecsc.LOVECscTestCase method)
        • @@ -862,6 +876,8 @@

          S

        • (api.tests.tests_configfile.ConfigFileApiTestCase method)
        • (api.tests.tests_emergencycontact.EmergencyContactApiTestCase method) +
        • +
        • (in module api.tests.tests_configfile)
        • (ui_framework.tests.test_view_thumbnail.ViewThumbnailTestCase method)
        • @@ -934,6 +950,10 @@

          S

          T

          + -
        • 3. How it works
            diff --git a/docs/html/modules/how_to_use_it.html b/docs/html/modules/how_to_use_it.html index 1e7e94cf..cf4c45bd 100644 --- a/docs/html/modules/how_to_use_it.html +++ b/docs/html/modules/how_to_use_it.html @@ -147,6 +147,8 @@
        • +
        • 2.6. EFD
        • +
        • 2.7. TCS
        • 3. How it works
        • @@ -1377,6 +1379,98 @@

          2.5.5.4. Delete WorkspaceView +

          2.6. EFD

          +

          Endpoint to request EFD timeseries.

          +
            +
          • Url: <IP>/manager/efd/timeseries

          • +
          • HTTP Operation: POST

          • +
          • Message Payload:

          • +
          +
          {
          +  "start_date": "2020-03-16T12:00:00",
          +  "time_window": 15,
          +  "cscs": {
          +    "ATDome": {
          +      0: {
          +        "topic1": ["field1"]
          +      },
          +    },
          +    "ATMCS": {
          +      1: {
          +        "topic2": ["field2", "field3"]
          +      },
          +    }
          +  },
          +  "resample": "1min",
          +}
          +
          +
          +
            +
          • Expected Response, if command successful:

          • +
          +
          {
          +  "status": 200,
          +  "data": {
          +    "ATDome-0-topic1": {
          +      "field1": [
          +        { ts: "2020-03-06 21:49:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:50:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:51:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:52:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:53:41.471000", value: 0.21 }
          +      ]
          +    },
          +    "ATMCS-1-topic2": {
          +      "field2": [
          +        { ts: "2020-03-06 21:49:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:50:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:51:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:52:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:53:41.471000", value: 0.21 }
          +      ],
          +      "field3": [
          +        { ts: "2020-03-06 21:49:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:50:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:51:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:52:41.471000", value: 0.21 },
          +        { ts: "2020-03-06 21:53:41.471000", value: 0.21 }
          +      ]
          +    }
          +  }
          +}
          +
          +
          + +
          +

          2.7. TCS

          +

          Endpoint to send ATCS commands.

          +
            +
          • Url: <IP>/manager/tcs/aux

          • +
          • HTTP Operation: POST

          • +
          • Message Payload:

          • +
          +
          {
          +  "command_name": "point_azel",
          +  "params": {
          +    "az": 30,
          +    "el": 50
          +  }
          +}
          +
          +
          +
            +
          • Expected Response, if command successful:

          • +
          +
          {
          +  "status": 200,
          +  "data": {
          +    "ack": "Done",
          +  }
          +}
          +
          +
          +
          diff --git a/docs/html/objects.inv b/docs/html/objects.inv index 6bf88ebc..c15f78e2 100644 Binary files a/docs/html/objects.inv and b/docs/html/objects.inv differ diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index 187d49dc..42d280f1 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["apidoc/api","apidoc/api.tests","apidoc/manage","apidoc/manager","apidoc/modules","apidoc/subscription","apidoc/ui_framework","apidoc/ui_framework.tests","index","modules/how_it_works","modules/how_to_use_it","modules/overview","modules/readme_link"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["apidoc/api.rst","apidoc/api.tests.rst","apidoc/manage.rst","apidoc/manager.rst","apidoc/modules.rst","apidoc/subscription.rst","apidoc/ui_framework.rst","apidoc/ui_framework.tests.rst","index.rst","modules/how_it_works.rst","modules/how_to_use_it.rst","modules/overview.rst","modules/readme_link.rst"],objects:{"":{api:[0,0,0,"-"],manage:[2,0,0,"-"],manager:[3,0,0,"-"],subscription:[5,0,0,"-"],ui_framework:[6,0,0,"-"]},"api.apps":{ApiConfig:[0,1,1,""]},"api.apps.ApiConfig":{name:[0,2,1,""],ready:[0,3,1,""]},"api.authentication":{ExpiringTokenAuthentication:[0,1,1,""],TokenAuthentication:[0,1,1,""]},"api.authentication.ExpiringTokenAuthentication":{authenticate_credentials:[0,3,1,""],expires_in:[0,3,1,""],is_token_expired:[0,3,1,""],model:[0,2,1,""],token_expire_handler:[0,3,1,""]},"api.authentication.TokenAuthentication":{model:[0,2,1,""]},"api.middleware":{GetTokenMiddleware:[0,1,1,""]},"api.models":{BaseModel:[0,1,1,""],ConfigFile:[0,1,1,""],EmergencyContact:[0,1,1,""],GlobalPermissions:[0,1,1,""],Token:[0,1,1,""]},"api.models.BaseModel":{Meta:[0,1,1,""],creation_timestamp:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],update_timestamp:[0,2,1,""]},"api.models.BaseModel.Meta":{"abstract":[0,2,1,""]},"api.models.ConfigFile":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],config_file:[0,2,1,""],file_name:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],id:[0,2,1,""],objects:[0,2,1,""],user:[0,2,1,""],user_id:[0,2,1,""],validate_file_extension:[0,3,1,""]},"api.models.EmergencyContact":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],contact_info:[0,2,1,""],email:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],id:[0,2,1,""],name:[0,2,1,""],objects:[0,2,1,""],subsystem:[0,2,1,""]},"api.models.GlobalPermissions":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],id:[0,2,1,""],objects:[0,2,1,""]},"api.models.Token":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],get_next_by_created:[0,3,1,""],get_previous_by_created:[0,3,1,""],id:[0,2,1,""],objects:[0,2,1,""],user:[0,2,1,""]},"api.schema_validator":{DefaultingValidator:[0,1,1,""]},"api.schema_validator.DefaultingValidator":{validate:[0,3,1,""]},"api.serializers":{ConfigFileContentSerializer:[0,1,1,""],ConfigFileSerializer:[0,1,1,""],ConfigSerializer:[0,1,1,""],EmergencyContactSerializer:[0,1,1,""],TimeDataSerializer:[0,1,1,""],TokenSerializer:[0,1,1,""],UserPermissionsSerializer:[0,1,1,""],UserSerializer:[0,1,1,""]},"api.serializers.ConfigFileContentSerializer":{Meta:[0,1,1,""],get_content:[0,3,1,""],get_filename:[0,3,1,""]},"api.serializers.ConfigFileContentSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.ConfigFileSerializer":{Meta:[0,1,1,""],get_filename:[0,3,1,""],get_username:[0,3,1,""]},"api.serializers.ConfigFileSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.EmergencyContactSerializer":{Meta:[0,1,1,""]},"api.serializers.EmergencyContactSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.TokenSerializer":{get_config:[0,3,1,""],get_permissions:[0,3,1,""],get_time_data:[0,3,1,""],get_token:[0,3,1,""]},"api.serializers.UserPermissionsSerializer":{can_execute_commands:[0,3,1,""]},"api.serializers.UserSerializer":{Meta:[0,1,1,""]},"api.serializers.UserSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.signals":{handle_token_deletion:[0,5,1,""]},"api.tests":{test_commander:[1,0,0,"-"],test_lovecsc:[1,0,0,"-"],test_schema_validation:[1,0,0,"-"],tests_auth_api:[1,0,0,"-"],tests_configfile:[1,0,0,"-"],tests_emergencycontact:[1,0,0,"-"]},"api.tests.test_commander":{CommanderTestCase:[1,1,1,""],SalinfoTestCase:[1,1,1,""]},"api.tests.test_commander.CommanderTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_authorized_commander_data:[1,3,1,""],test_unauthorized_commander:[1,3,1,""]},"api.tests.test_commander.SalinfoTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_salinfo_metadata:[1,3,1,""],test_salinfo_topic_data:[1,3,1,""],test_salinfo_topic_data_with_param:[1,3,1,""],test_salinfo_topic_names:[1,3,1,""],test_salinfo_topic_names_with_param:[1,3,1,""]},"api.tests.test_lovecsc":{LOVECscTestCase:[1,1,1,""]},"api.tests.test_lovecsc.LOVECscTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_authorized_lovecsc_data:[1,3,1,""],test_unauthorized_lovecsc:[1,3,1,""]},"api.tests.test_schema_validation":{SchemaValidationTestCase:[1,1,1,""]},"api.tests.test_schema_validation.SchemaValidationTestCase":{maxDiff:[1,2,1,""],script_schema:[1,2,1,""],setUp:[1,3,1,""],test_invalid_config:[1,3,1,""],test_syntax_error:[1,3,1,""],test_valid_config:[1,3,1,""]},"api.tests.tests_auth_api":{AuthApiTestCase:[1,1,1,""]},"api.tests.tests_auth_api.AuthApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_user_fails_to_validate_deleted_token:[1,3,1,""],test_user_fails_to_validate_expired_token:[1,3,1,""],test_user_login:[1,3,1,""],test_user_login_failed:[1,3,1,""],test_user_login_twice:[1,3,1,""],test_user_logout:[1,3,1,""],test_user_swap:[1,3,1,""],test_user_swap_forbidden:[1,3,1,""],test_user_swap_no_config:[1,3,1,""],test_user_swap_wrong_credentials:[1,3,1,""],test_user_validate_token:[1,3,1,""],test_user_validate_token_fail:[1,3,1,""],test_user_validate_token_no_config:[1,3,1,""]},"api.tests.tests_configfile":{ConfigFileApiTestCase:[1,1,1,""]},"api.tests.tests_configfile.ConfigFileApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_get_config_file:[1,3,1,""],test_get_config_file_content:[1,3,1,""],test_get_config_files_list:[1,3,1,""],test_unauthenticated_cannot_get_config_file:[1,3,1,""]},"api.tests.tests_emergencycontact":{EmergencyContactApiTestCase:[1,1,1,""]},"api.tests.tests_emergencycontact.EmergencyContactApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_list_emergency_contacts:[1,3,1,""]},"api.views":{ConfigFileViewSet:[0,1,1,""],CustomObtainAuthToken:[0,1,1,""],CustomSwapAuthToken:[0,1,1,""],EmergencyContactViewSet:[0,1,1,""],commander:[0,5,1,""],get_config:[0,5,1,""],logout:[0,5,1,""],lovecsc_observinglog:[0,5,1,""],salinfo_metadata:[0,5,1,""],salinfo_topic_data:[0,5,1,""],salinfo_topic_names:[0,5,1,""],validate_config_schema:[0,5,1,""],validate_token:[0,5,1,""]},"api.views.ConfigFileViewSet":{basename:[0,2,1,""],content:[0,3,1,""],description:[0,2,1,""],detail:[0,2,1,""],name:[0,2,1,""],queryset:[0,2,1,""],serializer_class:[0,2,1,""],suffix:[0,2,1,""]},"api.views.CustomObtainAuthToken":{login_failed_response:[0,2,1,""],login_response:[0,2,1,""],post:[0,3,1,""]},"api.views.CustomSwapAuthToken":{login_failed_response:[0,2,1,""],login_response:[0,2,1,""],post:[0,3,1,""]},"api.views.EmergencyContactViewSet":{basename:[0,2,1,""],description:[0,2,1,""],detail:[0,2,1,""],name:[0,2,1,""],queryset:[0,2,1,""],serializer_class:[0,2,1,""],suffix:[0,2,1,""]},"manager.settings":{ALLOWED_HOSTS:[3,6,1,""],AUTH_LDAP_SERVER_URI:[3,6,1,""],CHANNEL_LAYERS:[3,6,1,""],DATABASES:[3,6,1,""],LANGUAGE_CODE:[3,6,1,""],MEDIA_URL:[3,6,1,""],PROCESS_CONNECTION_PASS:[3,6,1,""],SECRET_KEY:[3,6,1,""],STATIC_ROOT:[3,6,1,""],STATIC_URL:[3,6,1,""],TESTING:[3,6,1,""],TIME_ZONE:[3,6,1,""],TOKEN_EXPIRED_AFTER_DAYS:[3,6,1,""],TRACE_TIMESTAMPS:[3,6,1,""]},"manager.utils":{assert_time_data:[3,5,1,""],get_tai_to_utc:[3,5,1,""],get_times:[3,5,1,""]},"subscription.apps":{SubscriptionConfig:[5,1,1,""]},"subscription.apps.SubscriptionConfig":{name:[5,2,1,""]},"subscription.auth":{TokenAuthMiddleware:[5,1,1,""],TokenAuthMiddlewareInstance:[5,1,1,""],get_user:[5,2,1,""]},"subscription.consumers":{SubscriptionConsumer:[5,1,1,""]},"subscription.consumers.SubscriptionConsumer":{connect:[5,3,1,""],disconnect:[5,3,1,""],handle_action_message:[5,3,1,""],handle_data_message:[5,3,1,""],handle_heartbeat_message:[5,3,1,""],handle_subscription_message:[5,3,1,""],logout:[5,3,1,""],receive_json:[5,3,1,""],send_heartbeat:[5,3,1,""],subscription_all_data:[5,3,1,""],subscription_data:[5,3,1,""]},"subscription.heartbeat_manager":{HeartbeatManager:[5,1,1,""]},"subscription.heartbeat_manager.HeartbeatManager":{instance:[5,2,1,""]},"subscription.routing":{websocket_urlpatterns:[5,6,1,""]},"ui_framework.apps":{UiFrameworkConfig:[6,1,1,""]},"ui_framework.apps.UiFrameworkConfig":{name:[6,2,1,""],ready:[6,3,1,""]},"ui_framework.models":{BaseModel:[6,1,1,""],OverwriteStorage:[6,1,1,""],View:[6,1,1,""],Workspace:[6,1,1,""],WorkspaceView:[6,1,1,""]},"ui_framework.models.BaseModel":{Meta:[6,1,1,""],creation_timestamp:[6,2,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],update_timestamp:[6,2,1,""]},"ui_framework.models.BaseModel.Meta":{"abstract":[6,2,1,""]},"ui_framework.models.OverwriteStorage":{get_available_name:[6,3,1,""]},"ui_framework.models.View":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],data:[6,2,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],id:[6,2,1,""],name:[6,2,1,""],objects:[6,2,1,""],thumbnail:[6,2,1,""],workspace_views:[6,2,1,""],workspaces:[6,2,1,""]},"ui_framework.models.Workspace":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],get_sorted_views:[6,3,1,""],has_read_permission:[6,3,1,""],id:[6,2,1,""],name:[6,2,1,""],objects:[6,2,1,""],views:[6,2,1,""],workspace_views:[6,2,1,""]},"ui_framework.models.WorkspaceView":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],id:[6,2,1,""],objects:[6,2,1,""],sort_value:[6,2,1,""],view:[6,2,1,""],view_id:[6,2,1,""],view_name:[6,2,1,""],workspace:[6,2,1,""],workspace_id:[6,2,1,""]},"ui_framework.serializers":{Base64ImageField:[6,1,1,""],ViewSerializer:[6,1,1,""],ViewSummarySerializer:[6,1,1,""],WorkspaceFullSerializer:[6,1,1,""],WorkspaceSerializer:[6,1,1,""],WorkspaceViewSerializer:[6,1,1,""],WorkspaceWithViewNameSerializer:[6,1,1,""]},"ui_framework.serializers.Base64ImageField":{get_file_extension:[6,3,1,""],to_internal_value:[6,3,1,""],to_representation:[6,3,1,""]},"ui_framework.serializers.ViewSerializer":{Meta:[6,1,1,""],thumbnail:[6,2,1,""]},"ui_framework.serializers.ViewSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.ViewSummarySerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.ViewSummarySerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceFullSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceFullSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceViewSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceViewSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceWithViewNameSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceWithViewNameSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.signals":{hanlde_view_deletion:[6,5,1,""]},"ui_framework.tests":{test_view_thumbnail:[7,0,0,"-"],tests_api:[7,0,0,"-"],tests_custom_api:[7,0,0,"-"],tests_models:[7,0,0,"-"],utils:[7,0,0,"-"]},"ui_framework.tests.test_view_thumbnail":{ViewThumbnailTestCase:[7,1,1,""]},"ui_framework.tests.test_view_thumbnail.ViewThumbnailTestCase":{setUp:[7,3,1,""],test_delete_view:[7,3,1,""],test_new_view:[7,3,1,""]},"ui_framework.tests.tests_api":{AuthorizedCrudTestCase:[7,1,1,""],UnauthenticatedCrudTestCase:[7,1,1,""],UnauthorizedCrudTestCase:[7,1,1,""]},"ui_framework.tests.tests_api.AuthorizedCrudTestCase":{setUp:[7,3,1,""],test_authorized_create_objects:[7,3,1,""],test_authorized_delete_objects:[7,3,1,""],test_authorized_list_objects:[7,3,1,""],test_authorized_retrieve_objects:[7,3,1,""],test_authorized_update_objects:[7,3,1,""]},"ui_framework.tests.tests_api.UnauthenticatedCrudTestCase":{setUp:[7,3,1,""],test_unauthenticated_create_objects:[7,3,1,""],test_unauthenticated_delete_objects:[7,3,1,""],test_unauthenticated_list_objects:[7,3,1,""],test_unauthenticated_retrieve_objects:[7,3,1,""],test_unauthenticated_update_objects:[7,3,1,""]},"ui_framework.tests.tests_api.UnauthorizedCrudTestCase":{setUp:[7,3,1,""],test_unauthorized_create_objects:[7,3,1,""],test_unauthorized_delete_objects:[7,3,1,""],test_unauthorized_list_objects:[7,3,1,""],test_unauthorized_retrieve_objects:[7,3,1,""],test_unauthorized_update_objects:[7,3,1,""]},"ui_framework.tests.tests_custom_api":{AuthorizedCrudTestCase:[7,1,1,""]},"ui_framework.tests.tests_custom_api.AuthorizedCrudTestCase":{setUp:[7,3,1,""],test_get_full_workspace:[7,3,1,""],test_get_workspaces_with_view_name:[7,3,1,""]},"ui_framework.tests.tests_models":{ViewModelTestCase:[7,1,1,""],WorkspaceAndViewsRelationsTestCase:[7,1,1,""],WorkspaceModelTestCase:[7,1,1,""],WorkspaceViewModelTestCase:[7,1,1,""]},"ui_framework.tests.tests_models.ViewModelTestCase":{setUp:[7,3,1,""],test_create_view:[7,3,1,""],test_delete_view:[7,3,1,""],test_retrieve_view:[7,3,1,""],test_update_view:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceAndViewsRelationsTestCase":{setUp:[7,3,1,""],test_add_and_get_views_to_workspace:[7,3,1,""],test_get_workspaces_from_a_view:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceModelTestCase":{setUp:[7,3,1,""],test_create_workspace:[7,3,1,""],test_delete_workspace:[7,3,1,""],test_retrieve_workspace:[7,3,1,""],test_update_workspace:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceViewModelTestCase":{setUp:[7,3,1,""],test_create_workspace_view:[7,3,1,""],test_delete_workspace_view:[7,3,1,""],test_retrieve_workspace_view:[7,3,1,""],test_update_workspace_view:[7,3,1,""]},"ui_framework.tests.utils":{BaseTestCase:[7,1,1,""],get_dict:[7,5,1,""]},"ui_framework.tests.utils.BaseTestCase":{setUp:[7,3,1,""]},"ui_framework.views":{ViewViewSet:[6,1,1,""],WorkspaceViewSet:[6,1,1,""],WorkspaceViewViewSet:[6,1,1,""]},"ui_framework.views.ViewViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],name:[6,2,1,""],queryset:[6,2,1,""],search:[6,3,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""],summary:[6,3,1,""]},"ui_framework.views.WorkspaceViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],full:[6,3,1,""],name:[6,2,1,""],queryset:[6,2,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""],with_view_name:[6,3,1,""]},"ui_framework.views.WorkspaceViewViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],name:[6,2,1,""],queryset:[6,2,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""]},api:{admin:[0,0,0,"-"],apps:[0,0,0,"-"],authentication:[0,0,0,"-"],middleware:[0,0,0,"-"],models:[0,0,0,"-"],schema_validator:[0,0,0,"-"],serializers:[0,0,0,"-"],signals:[0,0,0,"-"],tests:[1,0,0,"-"],urls:[0,0,0,"-"],views:[0,0,0,"-"]},manager:{asgi:[3,0,0,"-"],routing:[3,0,0,"-"],settings:[3,0,0,"-"],urls:[3,0,0,"-"],utils:[3,0,0,"-"],wsgi:[3,0,0,"-"]},subscription:{apps:[5,0,0,"-"],auth:[5,0,0,"-"],consumers:[5,0,0,"-"],heartbeat_manager:[5,0,0,"-"],routing:[5,0,0,"-"]},ui_framework:{admin:[6,0,0,"-"],apps:[6,0,0,"-"],models:[6,0,0,"-"],serializers:[6,0,0,"-"],signals:[6,0,0,"-"],tests:[7,0,0,"-"],urls:[6,0,0,"-"],views:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","exception","Python exception"],"5":["py","function","Python function"],"6":["py","data","Python data"]},objtypes:{"0":"py:module","1":"py:class","2":"py:attribute","3":"py:method","4":"py:exception","5":"py:function","6":"py:data"},terms:{"abstract":[0,6],"boolean":[0,1],"byte":6,"case":[0,5,6,9],"class":[0,1,3,5,6,7],"default":[0,1,3,9,10,12],"final":0,"float":3,"function":[0,3,5,6],"import":[0,3,6],"int":[0,3,6],"new":[6,7,10],"null":10,"public":12,"return":[0,3,5,6,7,10],"static":[1,3,6],"super":6,"true":[0,1,3,6,10],"try":[6,10],"while":9,And:[0,10],For:[0,3,6,9,10,11],The:[0,3,5,6,9,10,11,12],Then:9,These:[4,9],Use:[0,8,10],Uses:5,__all__:[0,6],abort:10,abov:9,accept:10,access:[0,3,6,9,11],accessor:6,accord:[0,5],ack:10,acknowledg:[9,10,11],act:[9,12],action:[5,8,9],actual:0,add:[0,3,6,7],added:[7,10],adding:7,addit:9,addition:9,additionalproperti:1,additt:0,admin123:3,admin:[3,4,10,12],admin_user_pass:12,afer:1,against:[0,10],alarm:10,alarms_sound:0,alia:[0,6],all:[5,7,9,10,11,12],allow:[3,10],allowed_host:3,allski:10,also:[9,11],alter:0,among:9,ani:[0,10,11],anonymousus:5,anoth:[0,3,6,11],api:[4,5,6,7,8,11],apiconfig:0,apidoc:[0,8,9,10],app:[3,4,9],app_modul:[0,5,6],app_nam:[0,5,6],appconfig:[0,5,6],append:10,appli:[0,9],applic:[0,2,3,5,9,10,12],appliedsettingsmatchstart:10,arg:[0,5,6],argument:[0,6],as_view:[0,3,6],asgi:4,asgi_appl:3,assert:3,assert_time_data:3,associ:[5,6],async:5,asynchron:10,asyncjsonwebsocketconsum:5,atcamera:6,atmount:6,atomic_request:3,atpneumat:10,atptg:10,attach:10,attribut:[0,6],auth:[0,4],auth_ldap_server_uri:[3,12],authapitestcas:1,authent:[1,4,5,8,9,11,12],authenticate_credenti:0,authenticationfail:0,authlist:10,author:[0,1,7,10,11],authorizedcrudtestcas:7,authtoken:0,autocommit:3,autocomplet:0,autogener:[0,6],autoupd:[0,6],avail:[0,6,7,10],back:11,backend:[3,10],base64:6,base64imagefield:6,base:[0,1,3,5,6,7,10,11],base_url:6,basemodel:[0,6],basenam:[0,6],basetestcas:7,bash:12,basic:9,becaus:9,been:0,befor:[0,1,12],behavior:7,behind:10,being:[0,3],below:[6,9],between:[0,3,5,10,11],blog:[0,3,6],bool:[0,3,6],both:11,browsabl:10,build:5,built:6,call:5,callabl:3,camera:[6,10],camfe:10,can:[0,1,7,9,10,12],can_execute_command:0,cannot:[1,7,12],categori:[5,10],ceh:3,cell:0,central:6,certain:10,chang:10,channel:[3,5,10,11,12],channel_lay:3,channels_redi:3,character:10,charg:9,charset:3,check:[0,6,11],checkpoint:1,child:6,children:6,classmethod:0,cleanup:1,client:[7,9,10,11],close:5,close_cod:5,cmd:[10,12],cmd_acknowledg:10,cmd_user_pass:12,code:[0,6,8,10,12],collat:3,com:[0,1,3,6],combin:10,command:[0,1,5,8,11,12],command_data:[0,10],command_nam:[0,10],command_name_1:10,command_name_2:10,commandertestcas:1,common:7,commun:[9,11],compar:9,compon:[5,9,10],compos:[9,10,12],concaten:6,conext:10,confi:0,config:[0,1,3,5,6],config_fil:0,config_path:10,configfil:[0,9],configfileapitestcas:1,configfilecontentseri:0,configfileseri:0,configfileviewset:0,configseri:0,configur:[0,1,3,5,6,9,10,12],confirm:10,conn_max_ag:3,connect:[3,5,8,9,11,12],constitut:6,consum:[0,4,10,11],contact:0,contact_info:0,contain:[0,3,5,6,9,10,12],content:[4,8,9,10],contian:10,contrib:[0,6],copi:[0,12],core:[0,3,6],correct:3,correspond:[0,5,6,9,10,12],could:[0,10],creat:[0,3,7,9],create_doc:12,create_forward_many_to_many_manag:6,creation:[0,6,10],creation_timestamp:[0,6,10],credenti:[1,9,10,11],critic:[0,10],crud:[7,9,10],csc:[0,5,10,11],csc_1:10,csc_2:10,cscg:6,cscsummari:6,currenlti:0,current:[0,3,5,6,9,10],custom:[0,5,6,7],customobtainauthtoken:0,customswapauthtoken:0,dai:3,dalet:7,data1:10,data2:10,data:[0,1,3,5,6,9,11],data_dict:0,databas:[0,3,7,12],date:[0,3,5,10],datetimefield:[0,6],db_engin:12,db_host:12,db_name:12,db_pass:12,db_port:12,db_user:12,debug:12,decod:6,decoded_fil:6,def:6,defaultingvalid:0,defaults_valid:0,defer:[0,6],defin:[0,1,3,5,6,7,9,10,12],deleg:6,delet:[0,1,6,7,9],deploy:[3,12],deprec:12,describ:[0,10,12],descript:[0,1,6],detail:[0,6,9,10,11],dev:9,develop:[8,9],dict:[0,3,5,6],dictionari:[0,3,5,6,7,10],diffent:9,differ:[0,1,3,5,9,10,11],directory_permissions_mod:6,disabl:10,disconnect:5,disk:6,dispatch:5,displai:6,divid:9,django:[0,1,2,3,5,6,7,9,11,12],djangoproject:[0,3,6],djangosnippet:6,djangpo:[0,6],doc:[0,3,6],docker:9,docsrc:12,doe:[0,12],doesnotexist:[0,6],dome:6,done:[9,10,11],draft7valid:0,draft:1,drf:[0,11],durat:3,dynam:6,each:[0,1,5,6,9,10],edit:[10,12],either:10,element:6,email:[0,10],emergencycontact:[0,9],emergencycontactapitestcas:1,emergencycontactseri:0,emergencycontactviewset:0,empti:[0,6,10,12],enabl:10,encod:6,end:10,endpoint:[0,6,9,10],engin:[3,12],enhanc:[0,6],entercontrol:10,entrypoint:3,env:12,environ:[3,11],error:[0,9,10],errorcod:10,establish:[9,10,11,12],etc:9,event:[5,11],event_data:[0,10],event_nam:[0,10],event_name_1:10,event_name_2:10,everi:[0,6,9,11,12],exampl:[0,3,6,8,10],except:[0,1,6],exec:12,execut:[0,2,6,9,11,12],execute_command:10,exitcontrol:10,expect:[3,5,6,10],expet:0,expir:[0,1],expires_in:0,expiringtokenauthent:0,explain:9,expos:[0,3,6],extens:6,fail:[0,1],fail_cleanup:1,fail_run:1,failur:10,fals:[0,1,3,6,10],fer:11,field:[0,6,7,10],field_11:10,field_12:10,field_21:10,field_22:10,figur:[9,11],file:[0,1,3,6,7,8,9],file_nam:[0,6],file_permissions_mod:6,filenam:[0,6],filesystemstorag:6,final_valid:0,first:[0,6],fixtur:9,flag:[0,10],folder:12,follow:[0,3,5,9,10,11,12],foreignkei:[0,6],format:[0,3,5,9,10],forward:[6,9,10,11],found:[5,6],framework:[6,7,8,11],free:6,frequenc:10,frmework:9,from:[0,3,5,6,7,9,10,11,12],frontend:[9,11,12],full:[3,6],fulli:[6,7,10],further:11,gencam:10,gener:[0,3,5,6,10,11],genera:9,get:[0,1,3,5,6],get_available_nam:6,get_config:0,get_config_file_sampl:1,get_cont:0,get_dict:7,get_file_extens:6,get_filenam:0,get_next_by_cr:0,get_next_by_creation_timestamp:[0,6],get_next_by_update_timestamp:[0,6],get_permiss:0,get_previous_by_cr:0,get_previous_by_creation_timestamp:[0,6],get_previous_by_update_timestamp:[0,6],get_respons:0,get_sorted_view:6,get_tai_to_utc:3,get_tim:3,get_time_data:[0,5,10],get_token:0,get_us:5,get_usernam:0,gettokenmiddlewar:0,github:[1,6,12],given:[0,5,6,7,9,10],globalpermiss:0,greenwich:[0,3,5,10],group:[0,5,9,10,11],handl:[0,1,5,6,9,11],handle_action_messag:5,handle_data_messag:5,handle_heartbeat_messag:5,handle_subscription_messag:5,handle_token_delet:0,handler:9,hanlde_view_delet:6,has:[0,3,6,9,11,12],has_read_permiss:6,have:[0,5,10,11],header:10,healthstatussummari:6,heartbeat:5,heartbeat_manag:4,heartbeatmanag:5,heavili:6,here:12,hola:10,home:[0,3,6],host:[3,12],hourangl:[0,3,5,10],how:[8,11],howto:3,html:12,http:[0,1,3,6,9,10,11,12],identifi:10,ids:[7,10],imag:[6,9],imagefield:6,implement:[6,12],includ:[0,3,6,10,11],incom:5,index:[0,3,8,10,12],info:[9,11],inform:[0,3,6,9,10],inherit:7,ini:9,initi:9,inner:5,input:[5,10],insid:[9,12],instanc:[0,3,5,6,9,10,11],instead:[10,12],instruct:[0,12],integr:12,intend:[5,10],interfac:[0,6],intermediari:[10,11],intern:[5,6,10],invalid:[0,1,9,10],is_next:[0,6],is_token_expir:0,iso:10,its:[6,7,9,10,12],ivalid:0,join:5,jpg:6,json:[0,1,5,6,9,10],jsonschema:0,julian:[0,3,5,10],kei:[0,3,6],key11:5,key12:5,key1:10,key21:5,key22:5,key2:10,keyword:0,kwarg:[0,5,6],languag:3,language_cod:3,last:[5,10],lastli:11,latiss:6,latter:9,layer:[3,10,12],layout:9,ldap:[3,12],leav:5,length:6,less:0,level:[0,3],librari:9,lightpath:6,like:[6,9,10],list:[0,3,5,6,7,10],load:[0,6,8],local:[0,8],localhost:3,locat:[0,3,5,6,10,12],log:[0,1,11],login:[0,9],login_failed_respons:0,login_respons:0,loglevel:10,logmessag:10,logout:[0,1,5],logslog:6,love:[0,1,3,5,11],love_csc:10,lovecsc_observinglog:0,lovecsctestcas:1,lsst:[1,11,12],mai:10,main:[2,9],make:[0,5,6,9],manag:[0,4,5,6,7,11,12],manager_rcv:5,mani:[6,10],manytomanydescriptor:6,manytomanyfield:6,map:[0,6],match:[0,5,6],max_length:6,maxdiff:1,maximum:6,measur:[0,3],mechan:10,media:[3,10],media_url:[3,6],messag:[0,3,5,8,9,11],meta:[0,6],metadata:[0,1],method:[1,6],methodnam:[1,7],middlewar:[4,5,12],migrat:9,minimum:1,minseveritynotif:10,minseveritysound:10,mirror:3,miss:0,mjd:[0,3,5,10],mock_environ:1,mock_request:1,mode:12,model:[4,7,9,10],modelseri:[0,6],modelviewset:[0,6],modifi:[0,3,5,10],modul:[4,8,9],moment:10,more:[0,3,6,9,11],most:6,mostli:9,mount:[3,6,12],move:12,mtm1m3:10,multipleobjectsreturn:[0,6],must:[9,10,12],mute:10,my_app:[0,3,6],my_dev_password:3,myimagefieldnam:6,mymodelnam:6,name:[0,1,3,5,6,7,12],necessari:10,need:[6,11,12],network:6,never:9,nginx:3,no_config:[0,1,10],no_debug:12,none:[0,1,3,5,6,10],note:0,number:[0,1,3,5,10],numer:10,obj:[0,7],object:[0,1,5,6,7],objectdoesnotexist:[0,6],observ:[0,1,11],observinglog:[6,10],obslog:6,obtain:0,obtainauthtoken:0,off:12,onc:[9,11,12],one:[0,6,10],onli:[5,6,9,10,12],oper:[9,10,11],option:[0,3,5,10],order:[0,5,6,9,10,12],org:[1,6],organ:8,origin:[0,11],other:[0,8,9,11],other_app:[0,3,6],otherwis:[5,12],our:0,out:[10,12],output:[0,1,5,10],outsid:12,over:[6,9,10],overrid:[6,12],overview:[6,8],overwrit:6,overwritestorag:6,packag:[4,8],page:[0,6,8],param:[1,10],paramet:[0,3,5,6,10],parameter_1:10,parameter_2:10,parent:6,pars:5,part:[5,8,11],particular:[5,9,10,11],pass:[1,5,6,10],password:[1,3,9,12],patch:[0,6],path:[0,3,6,10],pattern:5,payload:10,perform:[9,10],period:5,permiss:[0,6,9,10,12],pipe:11,pizza:6,pleas:[0,3,6,9,11,12],plu:10,png:10,port:[3,12],post:[0,6,10],postgr:[3,12],postgresql:[3,9,12],prefer:0,present:0,problem:6,process_connection_pass:[3,12],produc:[3,9,10,11,12],project:[3,4,11,12],properli:7,properti:1,propos:6,provid:[0,9,10,11,12],pull:6,purpos:[7,9,12],put:[0,6,10],pytest:[9,12],python:[9,11],queri:[0,1,6,10],queryset:[0,6],rais:[0,1],random:6,raw:6,react:5,read:[0,3,6,10],readi:[0,6],readm:8,readonli:12,reason:10,rebuild:12,receiv:[0,1,5,6,9,10,11],receive_json:5,recept:5,recommend:12,redi:[3,12],redirect:11,redis_host:12,redis_pass:12,redischannellay:3,redoc:10,ref:[0,3,6],refer:[0,6,9],regist:[0,6],regular:10,reject:5,rel:10,relat:[0,6,10],related_nam:6,relationship:[7,10],relev:[0,3],remain:[0,6],remian:0,remov:0,repli:[10,11],repo:12,repons:11,repositori:12,repres:10,represent:6,request:[0,1,5,6,7,9,11],request_tim:[5,10],requet:[0,6],requier:9,requir:[1,9,10],respect:[0,3,5,9,10],respond:9,respons:[0,6,9,11],rest:[0,6,7,9,10,11],rest_framework:[0,6],restart:12,result:[0,10],retriev:[7,9],revers:6,reversemanytoonedescriptor:6,rout:[0,4,6,9],rule:[3,5],run:[1,3,5,9],runserv:9,runtest:[1,7],sal:[9,11],sal_vers:[0,10],salindex:[5,10],salinfo:[0,1,10],salinfo_metadata:0,salinfo_topic_data:0,salinfo_topic_nam:0,salinfotestcas:1,salobj:9,save:[6,9],scale:[0,3,5,10],schedul:6,schema:[0,1],schema_path:10,schema_valid:4,schemavalidationtestcas:1,scope:5,script:9,script_schema:1,scriptqueu:[5,10],search:[6,8,9],search_text:10,second:[0,1,3,5,10],secret:3,secret_kei:[3,12],section:[9,11],see:[0,3,6,9,10,12],select:10,self:[0,6],send:[0,1,5,9,10,11],send_heartbeat:5,sender:[0,6],sent:[0,1,5,6,10,11],separ:10,serial:4,serializer_class:[0,6],seriou:[0,10],server:[3,9,10,12],server_tim:10,set:[0,4,5,6,7],setauthlist:10,setloglevel:10,settingsappli:10,settingvers:10,setup:[1,7],setvalu:10,sever:0,should:[10,12],showalarm:10,shown:11,side:6,sider:[9,10],sidereal_greenwich:10,sidereal_summit:[0,3,5,10],sidereal_tim:[0,3,5,10],signal:4,similarli:[9,11],simpl:9,simulationmod:10,sky:10,skycam:10,snippet:6,softwar:[5,9],softwarevers:10,solut:6,solv:6,some:[9,10,12],sort:[6,10],sort_valu:[6,10],sound:0,sourc:10,specifi:10,sqlite3:12,sqqtest:6,src:[3,12],stablish:10,standard:[0,10],standbi:10,start:[1,7,10],startproject:3,state:0,static_root:3,static_url:3,statu:[0,10],still:7,storag:6,store:[5,6,9,10],stream1:[5,10],stream2:5,stream:[5,10],string:[0,1,3,5,6,9,10],structur:[3,5,10],submodul:4,subpackag:4,subscirpt:5,subscrib:[0,5,9,10,11],subscript:[4,8,9],subscription_all_data:5,subscription_data:5,subscriptionconfig:5,subscriptionconsum:5,subseri:[6,7,10],subsystem:0,succes:0,succesfulli:10,success:10,suffix:[0,6],suit:1,summar:[6,10],summari:6,summaryst:10,summit:[0,3,5,10],support:5,sure:9,swagger:10,swap:[0,1],symmetric_encryption_kei:3,system:[6,8,10],tabl:10,tai:[0,3,5,9,10],tai_to_utc:[0,3,5,10],target:6,task:5,tbder3gzppu:3,teelemetri:10,tel1:9,tel2:9,telemetri:[5,9,11],telemetry_data:[0,10],telemetry_nam:[0,10],telemetry_name_1:10,telemetry_name_2:10,test:[0,3,4,6,9],test_add_and_get_views_to_workspac:7,test_authorized_commander_data:1,test_authorized_create_object:7,test_authorized_delete_object:7,test_authorized_list_object:7,test_authorized_lovecsc_data:1,test_authorized_retrieve_object:7,test_authorized_update_object:7,test_command:[0,4],test_create_view:7,test_create_workspac:7,test_create_workspace_view:7,test_delete_view:7,test_delete_workspac:7,test_delete_workspace_view:7,test_get_config_fil:1,test_get_config_file_cont:1,test_get_config_files_list:1,test_get_full_workspac:7,test_get_workspaces_from_a_view:7,test_get_workspaces_with_view_nam:7,test_invalid_config:1,test_list_emergency_contact:1,test_lovecsc:[0,4],test_new_view:7,test_retrieve_view:7,test_retrieve_workspac:7,test_retrieve_workspace_view:7,test_salinfo_metadata:1,test_salinfo_topic_data:1,test_salinfo_topic_data_with_param:1,test_salinfo_topic_nam:1,test_salinfo_topic_names_with_param:1,test_schema_valid:[0,4],test_syntax_error:1,test_unauthenticated_cannot_get_config_fil:1,test_unauthenticated_create_object:7,test_unauthenticated_delete_object:7,test_unauthenticated_list_object:7,test_unauthenticated_retrieve_object:7,test_unauthenticated_update_object:7,test_unauthorized_command:1,test_unauthorized_create_object:7,test_unauthorized_delete_object:7,test_unauthorized_list_object:7,test_unauthorized_lovecsc:1,test_unauthorized_retrieve_object:7,test_unauthorized_update_object:7,test_update_view:7,test_update_workspac:7,test_update_workspace_view:7,test_user_fails_to_validate_deleted_token:1,test_user_fails_to_validate_expired_token:1,test_user_login:1,test_user_login_fail:1,test_user_login_twic:1,test_user_logout:1,test_user_swap:1,test_user_swap_forbidden:1,test_user_swap_no_config:1,test_user_swap_wrong_credenti:1,test_user_validate_token:1,test_user_validate_token_fail:1,test_user_validate_token_no_config:1,test_valid_config:1,test_view_thumbnail:[4,6],testcas:[1,7],tests_api:[4,6],tests_auth_api:[0,4],tests_configfil:[0,4],tests_custom_api:[4,6],tests_emergencycontact:[0,4],tests_model:[4,6],testscript:1,text:10,than:0,thei:[0,10],them:[0,10],therefor:11,thi:[0,3,5,6,9,10,11,12],those:0,though:5,throgh:[0,6],through:[1,6,7,9,10,11],thumbnail:[6,7,10],ticket:6,time:[0,1,3,5,6,9,10],time_data:[3,5,10],time_zon:3,timedataseri:0,timedisplai:6,timestamp:[0,3,5,6,10],timezon:3,titl:[0,1,10],to_internal_valu:6,to_represent:6,token:[0,1,3,5,9,11],token_expire_handl:0,token_expired_after_dai:3,tokenauthent:0,tokenauthmiddlewar:5,tokenauthmiddlewareinst:5,tokenseri:0,tokn:0,tomchristi:6,tool:12,top:6,topic:[0,3,6],topic_data:[0,1,10],topic_nam:[0,1,10],trace:3,trace_timestamp:3,transfer:10,transform:6,treat:10,tri:9,trigger:10,truncat:6,ts_salobj:1,turn:[9,11],twie:1,two:0,txt:9,type:[0,1,3,5,6],u3awhhg:3,ui_framework:[4,8,9,10],uiframeworkconfig:6,unacknowledg:10,unauthent:[1,7],unauthenticatedcrudtestcas:7,unauthor:[1,7],unauthorizedcrudtestcas:7,uniqu:9,unix:[0,3,5,10],unmut:10,unpars:1,unsubscrib:[5,10],unsubscript:5,unus:[0,6],updat:[0,6,7,9],update_timestamp:[0,6,10],upload:6,upon:[0,6],url:[4,5,9,10],urlconf:[0,3,6],urlpattern:[0,3,5,6],use:[0,3,5,7,8,12],used:[0,5,6,7,9,10,12],user:[0,1,3,5,6,7,9,12],user_id:0,user_user_pass:12,usernam:[0,9,10],userpermissionsseri:0,userseri:0,uses:[6,11],using:[0,1,3,9,11,12],usr:[3,12],utc:[0,3,5,9,10],util:[4,6],v0d38sjx43s8:3,valid:[0,1,9],validate_config_schema:0,validate_file_extens:0,validate_token:0,validationerror:0,validatorclass:0,valu:[0,3,6,9,10,12],value11:5,value12:5,value1:10,value21:5,value22:5,value2:10,value_11:10,value_12:10,value_21:10,value_22:10,variabl:[3,10],variou:10,vaue:10,version:10,vetween:7,via:10,view:[3,4,7,9],view_1:10,view_2:10,view_3:10,view_i:7,view_id1:10,view_id2:10,view_id3:10,view_id:[6,10],view_nam:[6,10],viewmodeltestcas:7,viewseri:6,viewset:[0,6],viewsummaryseri:6,viewthumbnailtestcas:7,viewviewset:6,visual:11,wai:[10,12],wait:[1,9],wait_tim:1,warn:[0,10],watcher:[6,10],weatherst:6,websocket:[3,5,8,9,11,12],websocket_urlpattern:5,well:10,wether:[0,3,12],when:[0,6,7,9,11],where:[10,11,12],which:[0,9,10,11,12],whise:10,who:[0,10],whole:3,with_view_nam:[6,10],within:[6,10],without:[6,10],work:[0,1,6,8,11],workflow:11,workspac:[6,7],workspace_i:7,workspace_id1:10,workspace_id:[6,10],workspace_view:[6,7],workspaceandviewsrelationstestcas:7,workspacefullseri:6,workspacemodeltestcas:7,workspaceseri:6,workspaceview:[6,7],workspaceviewmodeltestcas:7,workspaceviewseri:6,workspaceviewset:6,workspaceviewviewset:6,workspacewithviewnameseri:6,workview:6,wrapper:[0,6],write:11,written:[6,11],wsgi:4,xml:10,xml_version:[0,10],yaml:[0,1,10],you:[10,12],zuj:3},titles:["5.1. api package","5.1.1.1. api.tests package","5.2. manage module","5.3. manager package","5. ApiDoc","5.4. subscription package","5.5. ui_framework package","5.5.1.1. ui_framework.tests package","Welcome to LOVE-manager\u2019s documentation!","3. How it works","2. How to use it","1. Overview","4. Readme File"],titleterms:{Use:12,action:10,admin:[0,6],api:[0,1,9,10],apidoc:4,app:[0,5,6],asgi:3,auth:[5,9],authent:[0,10],build:12,channel:9,code:9,command:[9,10],config:10,connect:10,consum:[5,9],content:[0,1,3,5,6,7],creat:10,data:10,databas:9,delet:10,develop:12,docker:12,document:[8,12],environ:12,event:10,exampl:9,file:[10,12],framework:[9,10],full:10,get:[10,12],heartbeat:10,heartbeat_manag:5,how:[9,10],imag:12,indic:8,info:10,initi:12,layer:9,load:12,local:12,log:10,logout:10,love:[8,9,10,12],manag:[2,3,8,9,10],messag:10,metadata:10,middlewar:0,model:[0,6],modul:[0,1,2,3,5,6,7],name:10,observ:10,organ:9,other:10,overview:11,packag:[0,1,3,5,6,7],part:[9,12],password:10,readm:12,request:10,respons:10,retriev:10,rout:[3,5],run:12,sal:10,schema:10,schema_valid:0,scheme:10,search:10,serial:[0,6],set:3,signal:[0,6],submodul:[0,1,3,5,6,7],subpackag:[0,6],subscript:[5,10],summari:10,swap:10,system:12,tabl:8,telemetri:10,test:[1,7,12],test_command:1,test_lovecsc:1,test_schema_valid:1,test_view_thumbnail:7,tests_api:7,tests_auth_api:1,tests_configfil:1,tests_custom_api:7,tests_emergencycontact:1,tests_model:7,token:10,topic:10,type:10,ui_framework:[6,7],unauthent:10,unauthor:10,updat:10,url:[0,3,6],use:10,user:10,util:[3,7],valid:10,variabl:12,view:[0,6,10],websocket:10,welcom:8,work:9,workspac:10,workspaceview:10,wsgi:3}}) \ No newline at end of file +Search.setIndex({docnames:["apidoc/api","apidoc/api.tests","apidoc/manage","apidoc/manager","apidoc/modules","apidoc/subscription","apidoc/ui_framework","apidoc/ui_framework.tests","index","modules/how_it_works","modules/how_to_use_it","modules/overview","modules/readme_link"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["apidoc/api.rst","apidoc/api.tests.rst","apidoc/manage.rst","apidoc/manager.rst","apidoc/modules.rst","apidoc/subscription.rst","apidoc/ui_framework.rst","apidoc/ui_framework.tests.rst","index.rst","modules/how_it_works.rst","modules/how_to_use_it.rst","modules/overview.rst","modules/readme_link.rst"],objects:{"":{api:[0,0,0,"-"],manage:[2,0,0,"-"],manager:[3,0,0,"-"],subscription:[5,0,0,"-"],ui_framework:[6,0,0,"-"]},"api.apps":{ApiConfig:[0,1,1,""]},"api.apps.ApiConfig":{name:[0,2,1,""],ready:[0,3,1,""]},"api.authentication":{ExpiringTokenAuthentication:[0,1,1,""],TokenAuthentication:[0,1,1,""]},"api.authentication.ExpiringTokenAuthentication":{authenticate_credentials:[0,3,1,""],expires_in:[0,3,1,""],is_token_expired:[0,3,1,""],model:[0,2,1,""],token_expire_handler:[0,3,1,""]},"api.authentication.TokenAuthentication":{model:[0,2,1,""]},"api.middleware":{GetTokenMiddleware:[0,1,1,""]},"api.models":{BaseModel:[0,1,1,""],ConfigFile:[0,1,1,""],EmergencyContact:[0,1,1,""],GlobalPermissions:[0,1,1,""],Token:[0,1,1,""]},"api.models.BaseModel":{Meta:[0,1,1,""],creation_timestamp:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],update_timestamp:[0,2,1,""]},"api.models.BaseModel.Meta":{"abstract":[0,2,1,""]},"api.models.ConfigFile":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],config_file:[0,2,1,""],file_name:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],id:[0,2,1,""],objects:[0,2,1,""],user:[0,2,1,""],user_id:[0,2,1,""],validate_file_extension:[0,3,1,""]},"api.models.EmergencyContact":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],contact_info:[0,2,1,""],email:[0,2,1,""],get_next_by_creation_timestamp:[0,3,1,""],get_next_by_update_timestamp:[0,3,1,""],get_previous_by_creation_timestamp:[0,3,1,""],get_previous_by_update_timestamp:[0,3,1,""],id:[0,2,1,""],name:[0,2,1,""],objects:[0,2,1,""],subsystem:[0,2,1,""]},"api.models.GlobalPermissions":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],id:[0,2,1,""],objects:[0,2,1,""]},"api.models.Token":{DoesNotExist:[0,4,1,""],MultipleObjectsReturned:[0,4,1,""],get_next_by_created:[0,3,1,""],get_previous_by_created:[0,3,1,""],id:[0,2,1,""],objects:[0,2,1,""],user:[0,2,1,""]},"api.schema_validator":{DefaultingValidator:[0,1,1,""]},"api.schema_validator.DefaultingValidator":{set_default_properties:[0,3,1,""],validate:[0,3,1,""]},"api.serializers":{ConfigFileContentSerializer:[0,1,1,""],ConfigFileSerializer:[0,1,1,""],ConfigSerializer:[0,1,1,""],EmergencyContactSerializer:[0,1,1,""],TimeDataSerializer:[0,1,1,""],TokenSerializer:[0,1,1,""],UserPermissionsSerializer:[0,1,1,""],UserSerializer:[0,1,1,""]},"api.serializers.ConfigFileContentSerializer":{Meta:[0,1,1,""],get_content:[0,3,1,""],get_filename:[0,3,1,""]},"api.serializers.ConfigFileContentSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.ConfigFileSerializer":{Meta:[0,1,1,""],get_filename:[0,3,1,""],get_username:[0,3,1,""]},"api.serializers.ConfigFileSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.EmergencyContactSerializer":{Meta:[0,1,1,""]},"api.serializers.EmergencyContactSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.serializers.TokenSerializer":{get_config:[0,3,1,""],get_permissions:[0,3,1,""],get_time_data:[0,3,1,""],get_token:[0,3,1,""]},"api.serializers.UserPermissionsSerializer":{can_execute_commands:[0,3,1,""]},"api.serializers.UserSerializer":{Meta:[0,1,1,""]},"api.serializers.UserSerializer.Meta":{fields:[0,2,1,""],model:[0,2,1,""]},"api.signals":{handle_token_deletion:[0,5,1,""]},"api.tests":{test_commander:[1,0,0,"-"],test_lovecsc:[1,0,0,"-"],test_schema_validation:[1,0,0,"-"],tests_auth_api:[1,0,0,"-"],tests_configfile:[1,0,0,"-"],tests_emergencycontact:[1,0,0,"-"]},"api.tests.test_commander":{CommanderTestCase:[1,1,1,""],EFDTestCase:[1,1,1,""],SalinfoTestCase:[1,1,1,""],TCSTestCase:[1,1,1,""]},"api.tests.test_commander.CommanderTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_authorized_commander_data:[1,3,1,""],test_unauthorized_commander:[1,3,1,""]},"api.tests.test_commander.EFDTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_timeseries_query:[1,3,1,""]},"api.tests.test_commander.SalinfoTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_salinfo_metadata:[1,3,1,""],test_salinfo_topic_data:[1,3,1,""],test_salinfo_topic_data_with_param:[1,3,1,""],test_salinfo_topic_names:[1,3,1,""],test_salinfo_topic_names_with_param:[1,3,1,""]},"api.tests.test_commander.TCSTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_command_query:[1,3,1,""]},"api.tests.test_lovecsc":{LOVECscTestCase:[1,1,1,""]},"api.tests.test_lovecsc.LOVECscTestCase":{maxDiff:[1,2,1,""],setUp:[1,3,1,""],test_authorized_lovecsc_data:[1,3,1,""],test_unauthorized_lovecsc:[1,3,1,""]},"api.tests.test_schema_validation":{SchemaValidationTestCase:[1,1,1,""]},"api.tests.test_schema_validation.SchemaValidationTestCase":{maxDiff:[1,2,1,""],script_schema:[1,2,1,""],setUp:[1,3,1,""],test_invalid_config:[1,3,1,""],test_syntax_error:[1,3,1,""],test_valid_config:[1,3,1,""]},"api.tests.tests_auth_api":{AuthApiTestCase:[1,1,1,""]},"api.tests.tests_auth_api.AuthApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_user_fails_to_validate_deleted_token:[1,3,1,""],test_user_fails_to_validate_expired_token:[1,3,1,""],test_user_login:[1,3,1,""],test_user_login_failed:[1,3,1,""],test_user_login_twice:[1,3,1,""],test_user_logout:[1,3,1,""],test_user_swap:[1,3,1,""],test_user_swap_forbidden:[1,3,1,""],test_user_swap_no_config:[1,3,1,""],test_user_swap_wrong_credentials:[1,3,1,""],test_user_validate_token:[1,3,1,""],test_user_validate_token_fail:[1,3,1,""],test_user_validate_token_no_config:[1,3,1,""]},"api.tests.tests_configfile":{ConfigFileApiTestCase:[1,1,1,""],setUp:[1,5,1,""]},"api.tests.tests_configfile.ConfigFileApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_get_config_file:[1,3,1,""],test_get_config_file_content:[1,3,1,""],test_get_config_files_list:[1,3,1,""],test_unauthenticated_cannot_get_config_file:[1,3,1,""]},"api.tests.tests_emergencycontact":{EmergencyContactApiTestCase:[1,1,1,""]},"api.tests.tests_emergencycontact.EmergencyContactApiTestCase":{get_config_file_sample:[1,3,1,""],setUp:[1,3,1,""],test_list_emergency_contacts:[1,3,1,""]},"api.views":{ConfigFileViewSet:[0,1,1,""],CustomObtainAuthToken:[0,1,1,""],CustomSwapAuthToken:[0,1,1,""],EmergencyContactViewSet:[0,1,1,""],commander:[0,5,1,""],get_config:[0,5,1,""],logout:[0,5,1,""],lovecsc_observinglog:[0,5,1,""],query_efd:[0,5,1,""],salinfo_metadata:[0,5,1,""],salinfo_topic_data:[0,5,1,""],salinfo_topic_names:[0,5,1,""],tcs_aux_command:[0,5,1,""],validate_config_schema:[0,5,1,""],validate_token:[0,5,1,""]},"api.views.ConfigFileViewSet":{basename:[0,2,1,""],content:[0,3,1,""],description:[0,2,1,""],detail:[0,2,1,""],name:[0,2,1,""],queryset:[0,2,1,""],serializer_class:[0,2,1,""],suffix:[0,2,1,""]},"api.views.CustomObtainAuthToken":{login_failed_response:[0,2,1,""],login_response:[0,2,1,""],post:[0,3,1,""]},"api.views.CustomSwapAuthToken":{login_failed_response:[0,2,1,""],login_response:[0,2,1,""],post:[0,3,1,""]},"api.views.EmergencyContactViewSet":{basename:[0,2,1,""],description:[0,2,1,""],detail:[0,2,1,""],name:[0,2,1,""],queryset:[0,2,1,""],serializer_class:[0,2,1,""],suffix:[0,2,1,""]},"manager.settings":{ALLOWED_HOSTS:[3,6,1,""],AUTH_LDAP_SERVER_URI:[3,6,1,""],CHANNEL_LAYERS:[3,6,1,""],DATABASES:[3,6,1,""],LANGUAGE_CODE:[3,6,1,""],MEDIA_URL:[3,6,1,""],PROCESS_CONNECTION_PASS:[3,6,1,""],SECRET_KEY:[3,6,1,""],STATIC_ROOT:[3,6,1,""],STATIC_URL:[3,6,1,""],TESTING:[3,6,1,""],TIME_ZONE:[3,6,1,""],TOKEN_EXPIRED_AFTER_DAYS:[3,6,1,""],TRACE_TIMESTAMPS:[3,6,1,""]},"manager.utils":{assert_time_data:[3,5,1,""],get_tai_to_utc:[3,5,1,""],get_times:[3,5,1,""]},"subscription.apps":{SubscriptionConfig:[5,1,1,""]},"subscription.apps.SubscriptionConfig":{name:[5,2,1,""]},"subscription.auth":{TokenAuthMiddleware:[5,1,1,""],TokenAuthMiddlewareInstance:[5,1,1,""],get_user:[5,2,1,""]},"subscription.consumers":{SubscriptionConsumer:[5,1,1,""]},"subscription.consumers.SubscriptionConsumer":{connect:[5,3,1,""],disconnect:[5,3,1,""],handle_action_message:[5,3,1,""],handle_data_message:[5,3,1,""],handle_heartbeat_message:[5,3,1,""],handle_subscription_message:[5,3,1,""],logout:[5,3,1,""],receive_json:[5,3,1,""],send_heartbeat:[5,3,1,""],subscription_all_data:[5,3,1,""],subscription_data:[5,3,1,""]},"subscription.heartbeat_manager":{HeartbeatManager:[5,1,1,""]},"subscription.heartbeat_manager.HeartbeatManager":{instance:[5,2,1,""]},"subscription.routing":{websocket_urlpatterns:[5,6,1,""]},"ui_framework.apps":{UiFrameworkConfig:[6,1,1,""]},"ui_framework.apps.UiFrameworkConfig":{name:[6,2,1,""],ready:[6,3,1,""]},"ui_framework.models":{BaseModel:[6,1,1,""],OverwriteStorage:[6,1,1,""],View:[6,1,1,""],Workspace:[6,1,1,""],WorkspaceView:[6,1,1,""]},"ui_framework.models.BaseModel":{Meta:[6,1,1,""],creation_timestamp:[6,2,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],update_timestamp:[6,2,1,""]},"ui_framework.models.BaseModel.Meta":{"abstract":[6,2,1,""]},"ui_framework.models.OverwriteStorage":{get_available_name:[6,3,1,""]},"ui_framework.models.View":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],data:[6,2,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],id:[6,2,1,""],name:[6,2,1,""],objects:[6,2,1,""],thumbnail:[6,2,1,""],workspace_views:[6,2,1,""],workspaces:[6,2,1,""]},"ui_framework.models.Workspace":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],get_sorted_views:[6,3,1,""],has_read_permission:[6,3,1,""],id:[6,2,1,""],name:[6,2,1,""],objects:[6,2,1,""],views:[6,2,1,""],workspace_views:[6,2,1,""]},"ui_framework.models.WorkspaceView":{DoesNotExist:[6,4,1,""],MultipleObjectsReturned:[6,4,1,""],get_next_by_creation_timestamp:[6,3,1,""],get_next_by_update_timestamp:[6,3,1,""],get_previous_by_creation_timestamp:[6,3,1,""],get_previous_by_update_timestamp:[6,3,1,""],id:[6,2,1,""],objects:[6,2,1,""],sort_value:[6,2,1,""],view:[6,2,1,""],view_id:[6,2,1,""],view_name:[6,2,1,""],workspace:[6,2,1,""],workspace_id:[6,2,1,""]},"ui_framework.serializers":{Base64ImageField:[6,1,1,""],ViewSerializer:[6,1,1,""],ViewSummarySerializer:[6,1,1,""],WorkspaceFullSerializer:[6,1,1,""],WorkspaceSerializer:[6,1,1,""],WorkspaceViewSerializer:[6,1,1,""],WorkspaceWithViewNameSerializer:[6,1,1,""]},"ui_framework.serializers.Base64ImageField":{get_file_extension:[6,3,1,""],to_internal_value:[6,3,1,""],to_representation:[6,3,1,""]},"ui_framework.serializers.ViewSerializer":{Meta:[6,1,1,""],thumbnail:[6,2,1,""]},"ui_framework.serializers.ViewSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.ViewSummarySerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.ViewSummarySerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceFullSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceFullSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceViewSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceViewSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.serializers.WorkspaceWithViewNameSerializer":{Meta:[6,1,1,""]},"ui_framework.serializers.WorkspaceWithViewNameSerializer.Meta":{fields:[6,2,1,""],model:[6,2,1,""]},"ui_framework.signals":{hanlde_view_deletion:[6,5,1,""]},"ui_framework.tests":{test_view_thumbnail:[7,0,0,"-"],tests_api:[7,0,0,"-"],tests_custom_api:[7,0,0,"-"],tests_models:[7,0,0,"-"],utils:[7,0,0,"-"]},"ui_framework.tests.test_view_thumbnail":{ViewThumbnailTestCase:[7,1,1,""]},"ui_framework.tests.test_view_thumbnail.ViewThumbnailTestCase":{setUp:[7,3,1,""],test_delete_view:[7,3,1,""],test_new_view:[7,3,1,""]},"ui_framework.tests.tests_api":{AuthorizedCrudTestCase:[7,1,1,""],UnauthenticatedCrudTestCase:[7,1,1,""],UnauthorizedCrudTestCase:[7,1,1,""]},"ui_framework.tests.tests_api.AuthorizedCrudTestCase":{setUp:[7,3,1,""],test_authorized_create_objects:[7,3,1,""],test_authorized_delete_objects:[7,3,1,""],test_authorized_list_objects:[7,3,1,""],test_authorized_retrieve_objects:[7,3,1,""],test_authorized_update_objects:[7,3,1,""]},"ui_framework.tests.tests_api.UnauthenticatedCrudTestCase":{setUp:[7,3,1,""],test_unauthenticated_create_objects:[7,3,1,""],test_unauthenticated_delete_objects:[7,3,1,""],test_unauthenticated_list_objects:[7,3,1,""],test_unauthenticated_retrieve_objects:[7,3,1,""],test_unauthenticated_update_objects:[7,3,1,""]},"ui_framework.tests.tests_api.UnauthorizedCrudTestCase":{setUp:[7,3,1,""],test_unauthorized_create_objects:[7,3,1,""],test_unauthorized_delete_objects:[7,3,1,""],test_unauthorized_list_objects:[7,3,1,""],test_unauthorized_retrieve_objects:[7,3,1,""],test_unauthorized_update_objects:[7,3,1,""]},"ui_framework.tests.tests_custom_api":{AuthorizedCrudTestCase:[7,1,1,""]},"ui_framework.tests.tests_custom_api.AuthorizedCrudTestCase":{setUp:[7,3,1,""],test_get_full_workspace:[7,3,1,""],test_get_workspaces_with_view_name:[7,3,1,""]},"ui_framework.tests.tests_models":{ViewModelTestCase:[7,1,1,""],WorkspaceAndViewsRelationsTestCase:[7,1,1,""],WorkspaceModelTestCase:[7,1,1,""],WorkspaceViewModelTestCase:[7,1,1,""]},"ui_framework.tests.tests_models.ViewModelTestCase":{setUp:[7,3,1,""],test_create_view:[7,3,1,""],test_delete_view:[7,3,1,""],test_retrieve_view:[7,3,1,""],test_update_view:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceAndViewsRelationsTestCase":{setUp:[7,3,1,""],test_add_and_get_views_to_workspace:[7,3,1,""],test_get_workspaces_from_a_view:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceModelTestCase":{setUp:[7,3,1,""],test_create_workspace:[7,3,1,""],test_delete_workspace:[7,3,1,""],test_retrieve_workspace:[7,3,1,""],test_update_workspace:[7,3,1,""]},"ui_framework.tests.tests_models.WorkspaceViewModelTestCase":{setUp:[7,3,1,""],test_create_workspace_view:[7,3,1,""],test_delete_workspace_view:[7,3,1,""],test_retrieve_workspace_view:[7,3,1,""],test_update_workspace_view:[7,3,1,""]},"ui_framework.tests.utils":{BaseTestCase:[7,1,1,""],get_dict:[7,5,1,""]},"ui_framework.tests.utils.BaseTestCase":{setUp:[7,3,1,""]},"ui_framework.views":{ViewViewSet:[6,1,1,""],WorkspaceViewSet:[6,1,1,""],WorkspaceViewViewSet:[6,1,1,""]},"ui_framework.views.ViewViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],name:[6,2,1,""],queryset:[6,2,1,""],search:[6,3,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""],summary:[6,3,1,""]},"ui_framework.views.WorkspaceViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],full:[6,3,1,""],name:[6,2,1,""],queryset:[6,2,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""],with_view_name:[6,3,1,""]},"ui_framework.views.WorkspaceViewViewSet":{basename:[6,2,1,""],description:[6,2,1,""],detail:[6,2,1,""],name:[6,2,1,""],queryset:[6,2,1,""],serializer_class:[6,2,1,""],suffix:[6,2,1,""]},api:{admin:[0,0,0,"-"],apps:[0,0,0,"-"],authentication:[0,0,0,"-"],middleware:[0,0,0,"-"],models:[0,0,0,"-"],schema_validator:[0,0,0,"-"],serializers:[0,0,0,"-"],signals:[0,0,0,"-"],tests:[1,0,0,"-"],urls:[0,0,0,"-"],views:[0,0,0,"-"]},manager:{asgi:[3,0,0,"-"],routing:[3,0,0,"-"],settings:[3,0,0,"-"],urls:[3,0,0,"-"],utils:[3,0,0,"-"],wsgi:[3,0,0,"-"]},subscription:{apps:[5,0,0,"-"],auth:[5,0,0,"-"],consumers:[5,0,0,"-"],heartbeat_manager:[5,0,0,"-"],routing:[5,0,0,"-"]},ui_framework:{admin:[6,0,0,"-"],apps:[6,0,0,"-"],models:[6,0,0,"-"],serializers:[6,0,0,"-"],signals:[6,0,0,"-"],tests:[7,0,0,"-"],urls:[6,0,0,"-"],views:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","exception","Python exception"],"5":["py","function","Python function"],"6":["py","data","Python data"]},objtypes:{"0":"py:module","1":"py:class","2":"py:attribute","3":"py:method","4":"py:exception","5":"py:function","6":"py:data"},terms:{"10S":0,"15min":0,"16t12":10,"1min":10,"abstract":[0,6],"boolean":[0,1],"byte":6,"case":[0,5,6,9],"class":[0,1,3,5,6,7],"default":[0,1,3,9,10,12],"final":0,"float":3,"function":[0,3,5,6],"import":[0,3,6],"int":[0,3,6],"new":[6,7,10],"null":10,"public":12,"return":[0,3,5,6,7,10],"static":[0,1,3,6],"super":6,"true":[0,1,3,6,10],"try":[6,10],"while":9,And:[0,10],For:[0,3,6,9,10,11],TCS:[1,8],The:[0,3,5,6,9,10,11,12],Then:9,These:[4,9],Use:[0,8,10],Uses:5,__all__:[0,6],abort:10,abov:9,accept:10,access:[0,3,6,9,11],accessor:6,accord:[0,5],ack:10,acknowledg:[9,10,11],act:[9,12],action:[5,8,9],actual:0,add:[0,3,6,7],added:[7,10],adding:7,addit:9,addition:9,additionalproperti:1,additt:0,admin123:3,admin:[3,4,10,12],admin_user_pass:12,afer:1,against:[0,10],alarm:10,alarms_sound:0,alia:[0,6],all:[5,7,9,10,11,12],allow:[3,10],allowed_host:3,allski:10,also:[9,11],alter:0,among:9,ani:[0,10,11],anonymousus:5,anoth:[0,3,6,11],api:[4,5,6,7,8,11],apiconfig:0,apidoc:[0,8,9,10],app:[3,4,9],app_modul:[0,5,6],app_nam:[0,5,6],appconfig:[0,5,6],append:10,appli:[0,9],applic:[0,2,3,5,9,10,12],appliedsettingsmatchstart:10,arg:[0,5,6],argument:[0,6],as_view:[0,3,6],asgi:4,asgi_appl:3,assert:3,assert_time_data:3,associ:[5,6],async:5,asynchron:10,asyncjsonwebsocketconsum:5,atc:[0,10],atcamera:6,atdom:10,atmc:10,atmount:6,atomic_request:3,atpneumat:10,atptg:10,attach:10,attribut:[0,6],auth:[0,4],auth_ldap_server_uri:[3,12],authapitestcas:1,authent:[1,4,5,8,9,11,12],authenticate_credenti:0,authenticationfail:0,authlist:10,author:[0,1,7,10,11],authorizedcrudtestcas:7,authtoken:0,autocommit:3,autocomplet:0,autogener:[0,6],autoupd:[0,6],aux:10,auxtel:0,avail:[0,6,7,10],back:11,backend:[3,10],base64:6,base64imagefield:6,base:[0,1,3,5,6,7,10,11],base_url:6,basemodel:[0,6],basenam:[0,6],basetestcas:7,bash:12,basic:9,becaus:9,been:0,befor:[0,1,12],behavior:7,behind:10,being:[0,3],below:[6,9],between:[0,3,5,10,11],blog:[0,3,6],bool:[0,3,6],both:11,browsabl:10,build:5,built:6,call:5,callabl:3,camera:[6,10],camfe:10,can:[0,1,7,9,10,12],can_execute_command:0,cannot:[1,7,12],categori:[5,10],ceh:3,cell:0,central:6,certain:10,chang:10,channel:[3,5,10,11,12],channel_lay:3,channels_redi:3,character:10,charg:9,charset:3,check:[0,6,11],checkpoint:1,child:6,children:6,classmethod:0,cleanup:1,client:[7,9,10,11],close:5,close_cod:5,cmd:[10,12],cmd_acknowledg:10,cmd_user_pass:12,code:[0,6,8,10,12],collat:3,com:[0,1,3,6],combin:10,command:[0,1,5,8,11,12],command_data:[0,10],command_nam:[0,10],command_name_1:10,command_name_2:10,commandertestcas:1,common:7,commun:[9,11],compar:9,compon:[5,9,10],compos:[9,10,12],concaten:6,conext:10,confi:0,config:[0,1,3,5,6],config_fil:0,config_path:10,configfil:[0,9],configfileapitestcas:1,configfilecontentseri:0,configfileseri:0,configfileviewset:0,configseri:0,configur:[0,1,3,5,6,9,10,12],confirm:10,conn_max_ag:3,connect:[3,5,8,9,11,12],constitut:6,consum:[0,4,10,11],contact:0,contact_info:0,contain:[0,3,5,6,9,10,12],content:[4,8,9,10],contian:10,contrib:[0,6],control:0,convers:0,copi:[0,12],core:[0,3,6],correct:3,correspond:[0,5,6,9,10,12],could:[0,10],creat:[0,3,7,9],create_doc:12,create_forward_many_to_many_manag:6,creation:[0,6,10],creation_timestamp:[0,6,10],credenti:[1,9,10,11],critic:[0,10],crud:[7,9,10],csc1:0,csc2:0,csc:[0,5,10,11],csc_1:10,csc_2:10,cscg:6,cscsummari:6,currenlti:0,current:[0,3,5,6,9,10],custom:[0,5,6,7],customobtainauthtoken:0,customswapauthtoken:0,dai:3,dalet:7,data1:10,data2:10,data:[0,1,3,5,6,9,11],data_dict:0,databas:[0,3,7,12],date:[0,3,5,10],datetimefield:[0,6],db_engin:12,db_host:12,db_name:12,db_pass:12,db_port:12,db_user:12,debug:12,dec:0,decod:6,decoded_fil:6,def:6,defaultingvalid:0,defaults_valid:0,defer:[0,6],defin:[0,1,3,5,6,7,9,10,12],deleg:6,delet:[0,1,6,7,9],deploy:[3,12],deprec:12,describ:[0,10,12],descript:[0,1,6],detail:[0,6,9,10,11],dev:9,develop:[8,9],dict:[0,3,5,6],dictionari:[0,3,5,6,7,10],diffent:9,differ:[0,1,3,5,9,10,11],directory_permissions_mod:6,disabl:10,disconnect:5,disk:6,dispatch:5,divid:9,django:[0,1,2,3,5,6,7,9,11,12],djangoproject:[0,3,6],djangosnippet:6,djangpo:[0,6],doc:[0,3,6],docker:9,docsrc:12,doe:[0,12],doesnotexist:[0,6],dome:6,done:[9,10,11],draft7valid:0,draft:1,drf:[0,11],durat:3,dynam:6,each:[0,1,5,6,9,10],edit:[10,12],efd:[0,8],efdtestcas:1,either:10,element:6,email:[0,10],emergencycontact:[0,9],emergencycontactapitestcas:1,emergencycontactseri:0,emergencycontactviewset:0,empti:[0,6,10,12],enabl:10,encod:6,end:10,endpoint:[0,6,9,10],engin:[3,12],enhanc:[0,6],entercontrol:10,entrypoint:3,env:12,environ:[3,11],error:[0,9,10],errorcod:10,establish:[9,10,11,12],etc:9,event:[5,11],event_data:[0,10],event_nam:[0,10],event_name_1:10,event_name_2:10,everi:[0,6,9,11,12],exampl:[0,3,6,8,10],except:[0,1,6],exec:12,execut:[0,2,6,9,11,12],execute_command:10,exitcontrol:10,expect:[3,5,6,10],expet:0,expir:[0,1],expires_in:0,expiringtokenauthent:0,explain:9,expos:[0,3,6],extens:6,fail:[0,1],fail_cleanup:1,fail_run:1,failur:10,fals:[0,1,3,6,10],fdsfdsddsda:6,fer:11,field1:10,field2:10,field3:10,field:[0,6,7,10],field_11:10,field_12:10,field_21:10,field_22:10,figur:[9,11],file:[0,1,3,6,7,8,9],file_nam:[0,6],file_permissions_mod:6,filenam:[0,6],filesystemstorag:6,final_valid:0,first:[0,6],fixtur:9,flag:[0,10],folder:12,follow:[0,3,5,9,10,11,12],foreignkei:[0,6],form:0,format:[0,3,5,9,10],forward:[6,9,10,11],found:[5,6],framework:[6,7,8,11],free:6,frequenc:10,frmework:9,from:[0,3,5,6,7,9,10,11,12],frontend:[9,11,12],full:[3,6],fulli:[6,7,10],further:11,gencam:10,gener:[0,3,5,6,10,11],genera:9,get:[0,1,3,5,6],get_available_nam:6,get_config:0,get_config_file_sampl:1,get_cont:0,get_dict:7,get_file_extens:6,get_filenam:0,get_next_by_cr:0,get_next_by_creation_timestamp:[0,6],get_next_by_update_timestamp:[0,6],get_permiss:0,get_previous_by_cr:0,get_previous_by_creation_timestamp:[0,6],get_previous_by_update_timestamp:[0,6],get_respons:0,get_sorted_view:6,get_tai_to_utc:3,get_tim:3,get_time_data:[0,5,10],get_token:0,get_us:5,get_usernam:0,gettokenmiddlewar:0,github:[1,6,12],given:[0,5,6,7,9,10],globalpermiss:0,greenwich:[0,3,5,10],group:[0,5,9,10,11],handl:[0,1,5,6,9,11],handle_action_messag:5,handle_data_messag:5,handle_heartbeat_messag:5,handle_subscription_messag:5,handle_token_delet:0,handler:9,hanlde_view_delet:6,has:[0,3,6,9,11,12],has_read_permiss:6,have:[0,5,10,11],header:10,healthstatussummari:6,heartbeat:5,heartbeat_manag:4,heartbeatmanag:5,heavili:6,here:12,hola:10,home:[0,3,6],host:[3,12],hourangl:[0,3,5,10],how:[8,11],howto:3,html:12,http:[0,1,3,6,9,10,11,12],identifi:10,ids:[7,10],imag:[6,9],imagefield:6,implement:[6,12],includ:[0,3,6,10,11],incom:5,index:[0,3,8,10,12],info:[9,11],inform:[0,3,6,9,10],inherit:7,ini:9,initi:9,inner:5,input:[5,10],insid:[9,12],instanc:[0,3,5,6,9,10,11],instead:[10,12],instruct:[0,12],integr:12,intend:[5,10],interfac:[0,6],intermediari:[10,11],intern:[5,6,10],invalid:[0,1,9,10],is_next:[0,6],is_token_expir:0,iso:10,its:[6,7,9,10,12],ivalid:0,join:5,jpg:6,json:[0,1,5,6,9,10],jsonschema:0,julian:[0,3,5,10],kei:[0,3,6],key11:5,key12:5,key1:10,key21:5,key22:5,key2:10,keyword:0,kwarg:[0,5,6],languag:3,language_cod:3,last:[5,10],lastli:11,latiss:6,latter:9,layer:[3,10,12],layout:9,ldap:[3,12],leav:5,length:6,less:0,level:[0,3],librari:9,lightpath:6,like:[6,9,10],list:[0,3,5,6,7,10],load:[0,6,8],local:[0,8],localhost:3,locat:[0,3,5,6,10,12],log:[0,1,11],login:[0,9],login_failed_respons:0,login_respons:0,loglevel:10,logmessag:10,logout:[0,1,5],logslog:6,love:[0,1,3,5,11],love_csc:10,lovecsc_observinglog:0,lovecsctestcas:1,lsst:[0,1,11,12],mai:10,main:[2,9],make:[0,5,6,9],manag:[0,4,5,6,7,11,12],manager_rcv:5,mani:[6,10],manytomanydescriptor:6,manytomanyfield:6,map:[0,6],match:[0,5,6],max_length:6,maxdiff:1,maximum:6,measur:[0,3],mechan:10,media:[3,10],media_url:[3,6],messag:[0,3,5,8,9,11],meta:[0,6],metadata:[0,1],method:[0,1,6],methodnam:[1,7],middlewar:[4,5,12],migrat:9,minimum:1,minseveritynotif:10,minseveritysound:10,minu:0,minut:0,mirror:3,miss:0,mjd:[0,3,5,10],mock_environ:1,mock_request:1,mode:12,model:[4,7,9,10],modelseri:[0,6],modelviewset:[0,6],modifi:[0,3,5,10],modul:[4,8,9],moment:10,more:[0,3,6,9,11],most:6,mostli:9,mount:[3,6,12],move:12,mtm1m3:10,multipleobjectsreturn:[0,6],must:[9,10,12],mute:10,my_app:[0,3,6],my_dev_password:3,myimagefieldnam:6,mymodelnam:6,name:[0,1,3,5,6,7,12],necessari:10,need:[6,11,12],network:6,never:9,nginx:3,no_config:[0,1,10],no_debug:12,none:[0,1,3,5,6,10],note:0,number:[0,1,3,5,10],numer:10,obj:[0,7],object:[0,1,5,6,7],objectdoesnotexist:[0,6],observ:[0,1,11],observatori:0,observinglog:10,obslog:6,obtain:0,obtainauthtoken:0,off:12,offset:0,onc:[9,11,12],one:[0,6,10],onli:[5,6,9,10,12],oper:[9,10,11],option:[0,3,5,10],order:[0,5,6,9,10,12],org:[1,6],organ:8,origin:[0,11],other:[0,8,9,11],other_app:[0,3,6],otherwis:[5,12],our:0,out:[10,12],output:[0,1,5,10],outsid:12,over:[6,9,10],overrid:[6,12],overview:[6,8],overwrit:6,overwritestorag:6,packag:[4,8],page:[0,6,8],param:[0,1,10],paramet:[0,3,5,6,10],parameter_1:10,parameter_2:10,parent:6,pars:5,part:[5,8,11],particular:[5,9,10,11],pass:[0,1,5,6,10],password:[1,3,9,12],patch:[0,6],path:[0,3,6,10],pattern:5,payload:10,perform:[9,10],period:5,permiss:[0,6,9,10,12],pipe:11,pizza:6,pleas:[0,3,6,9,11,12],plu:10,png:10,point_azel:10,port:[3,12],post:[0,6,10],postgr:[3,12],postgresql:[3,9,12],prefer:0,present:0,problem:6,process_connection_pass:[3,12],produc:[3,9,10,11,12],project:[3,4,11,12],properli:7,properti:[0,1],propos:6,provid:[0,9,10,11,12],pull:6,purpos:[7,9,12],put:[0,6,10],pytest:[9,12],python:[9,11],queri:[0,1,6,10],query_efd:0,queryset:[0,6],rais:[0,1],random:6,rang:0,raw:6,react:5,read:[0,3,6,10],readi:[0,6],readm:8,readonli:12,reason:10,rebuild:12,receiv:[0,1,5,6,9,10,11],receive_json:5,recept:5,recommend:12,redi:[3,12],redirect:[0,11],redis_host:12,redis_pass:12,redischannellay:3,redoc:10,ref:[0,3,6],refer:[0,6,9],regist:[0,6],regular:10,reject:5,rel:10,relat:[0,6,10],related_nam:6,relationship:[7,10],relev:[0,3],remain:[0,6],remian:0,remov:0,repli:[10,11],repo:12,repons:11,repositori:12,repres:[0,10],represent:6,request:[0,1,5,6,7,9,11],request_tim:[5,10],requet:[0,6],requier:9,requir:[0,1,9,10],resampl:[0,10],respect:[0,3,5,9,10],respond:9,respons:[0,6,9,11],rest:[0,6,7,9,10,11],rest_framework:[0,6],restart:12,result:[0,10],retriev:[7,9],revers:6,reversemanytoonedescriptor:6,rout:[0,4,6,9],rule:[3,5],run:[0,1,3,5,9],runserv:9,runtest:[1,7],sal:[9,11],sal_vers:[0,10],salindex:[5,10],salinfo:[0,1,10],salinfo_metadata:0,salinfo_topic_data:0,salinfo_topic_nam:0,salinfotestcas:1,salobj:9,save:[6,9],scale:[0,3,5,10],schedul:6,schema:[0,1],schema_path:10,schema_valid:4,schemavalidationtestcas:1,scope:5,script:9,script_schema:1,scriptqueu:[5,10],search:[6,8,9],search_text:10,second:[0,1,3,5,10],secret:3,secret_kei:[3,12],section:[9,11],see:[0,3,6,9,10,12],select:10,self:[0,1,6],send:[0,1,5,9,10,11],send_heartbeat:5,sender:[0,6],sent:[0,1,5,6,10,11],separ:10,serial:4,serializer_class:[0,6],seriou:[0,10],server:[3,9,10,12],server_tim:10,set:[0,4,5,6,7],set_default_properti:0,setauthlist:10,setloglevel:10,settingsappli:10,settingvers:10,setup:[1,7],setvalu:10,sever:0,should:[0,10,12],showalarm:10,shown:11,side:6,sider:[9,10],sidereal_greenwich:10,sidereal_summit:[0,3,5,10],sidereal_tim:[0,3,5,10],signal:4,similarli:[9,11],simpl:9,simulationmod:10,skip_properti:0,sky:10,skycam:10,snippet:6,softwar:[5,9],softwarevers:10,solut:6,solv:6,some:[9,10,12],sort:[6,10],sort_valu:[6,10],sound:0,sourc:10,specifi:[0,10],sqlite3:12,sqqtest:6,src:[3,12],stablish:10,standard:[0,10],standbi:10,start:[0,1,7,10],start_dat:[0,10],startproject:3,state:0,static_root:3,static_url:3,statu:[0,10],still:7,storag:6,store:[5,6,9,10],stream1:[5,10],stream2:5,stream:[5,10],string:[0,1,3,5,6,9,10],structur:[3,5,10],submodul:4,subpackag:4,subscirpt:5,subscrib:[0,5,9,10,11],subscript:[4,8,9],subscription_all_data:5,subscription_data:5,subscriptionconfig:5,subscriptionconsum:5,subseri:[6,7,10],subsystem:0,succes:0,succesfulli:10,success:10,suffix:[0,6],suit:1,summar:[6,10],summari:6,summaryst:10,summit:[0,3,5,10],support:5,sure:9,swagger:10,swap:[0,1],symmetric_encryption_kei:3,system:[6,8,10],tabl:10,tai:[0,3,5,9,10],tai_to_utc:[0,3,5,10],target:[0,6],task:5,tbder3gzppu:3,tcs:10,tcs_aux_command:0,tcstestcas:1,teelemetri:10,tel1:9,tel2:9,telemetri:[5,9,11],telemetry_data:[0,10],telemetry_nam:[0,10],telemetry_name_1:10,telemetry_name_2:10,test:[0,3,4,6,9],test_add_and_get_views_to_workspac:7,test_authorized_commander_data:1,test_authorized_create_object:7,test_authorized_delete_object:7,test_authorized_list_object:7,test_authorized_lovecsc_data:1,test_authorized_retrieve_object:7,test_authorized_update_object:7,test_command:[0,4],test_command_queri:1,test_create_view:7,test_create_workspac:7,test_create_workspace_view:7,test_delete_view:7,test_delete_workspac:7,test_delete_workspace_view:7,test_get_config_fil:1,test_get_config_file_cont:1,test_get_config_files_list:1,test_get_full_workspac:7,test_get_workspaces_from_a_view:7,test_get_workspaces_with_view_nam:7,test_invalid_config:1,test_list_emergency_contact:1,test_lovecsc:[0,4],test_new_view:7,test_retrieve_view:7,test_retrieve_workspac:7,test_retrieve_workspace_view:7,test_salinfo_metadata:1,test_salinfo_topic_data:1,test_salinfo_topic_data_with_param:1,test_salinfo_topic_nam:1,test_salinfo_topic_names_with_param:1,test_schema_valid:[0,4],test_syntax_error:1,test_timeseries_queri:1,test_unauthenticated_cannot_get_config_fil:1,test_unauthenticated_create_object:7,test_unauthenticated_delete_object:7,test_unauthenticated_list_object:7,test_unauthenticated_retrieve_object:7,test_unauthenticated_update_object:7,test_unauthorized_command:1,test_unauthorized_create_object:7,test_unauthorized_delete_object:7,test_unauthorized_list_object:7,test_unauthorized_lovecsc:1,test_unauthorized_retrieve_object:7,test_unauthorized_update_object:7,test_update_view:7,test_update_workspac:7,test_update_workspace_view:7,test_user_fails_to_validate_deleted_token:1,test_user_fails_to_validate_expired_token:1,test_user_login:1,test_user_login_fail:1,test_user_login_twic:1,test_user_logout:1,test_user_swap:1,test_user_swap_forbidden:1,test_user_swap_no_config:1,test_user_swap_wrong_credenti:1,test_user_validate_token:1,test_user_validate_token_fail:1,test_user_validate_token_no_config:1,test_valid_config:1,test_view_thumbnail:[4,6],testcas:[1,7],tests_api:[4,6],tests_auth_api:[0,4],tests_configfil:[0,4],tests_custom_api:[4,6],tests_emergencycontact:[0,4],tests_model:[4,6],testscript:1,text:10,than:0,thei:[0,10],them:[0,10],therefor:11,thi:[0,3,5,6,9,10,11,12],those:0,though:5,throgh:[0,6],through:[1,6,7,9,10,11],thumbnail:[6,7,10],ticket:6,time:[0,1,3,5,6,9,10],time_data:[3,5,10],time_window:10,time_zon:3,timedataseri:0,timedisplai:6,timeseri:[0,1,10],timeseriesplot:6,timestamp:[0,3,5,6,10],timewindow:0,timezon:3,titl:[0,1,10],to_internal_valu:6,to_represent:6,token:[0,1,3,5,9,11],token_expire_handl:0,token_expired_after_dai:3,tokenauthent:0,tokenauthmiddlewar:5,tokenauthmiddlewareinst:5,tokenseri:0,tokn:0,tomchristi:6,tool:12,top:6,topic1:[0,10],topic2:[0,10],topic:[0,3,6],topic_data:[0,1,10],topic_nam:[0,1,10],trace:3,trace_timestamp:3,transfer:10,transform:6,treat:10,tri:9,trigger:10,truncat:6,ts_salobj:1,turn:[9,11],twie:1,two:0,txt:9,type:[0,1,3,5,6],u3awhhg:3,ui_framework:[4,8,9,10],uiframeworkconfig:6,unacknowledg:10,unauthent:[1,7],unauthenticatedcrudtestcas:7,unauthor:[1,7],unauthorizedcrudtestcas:7,uniqu:9,unix:[0,3,5,10],unmut:10,unpars:1,unsubscrib:[5,10],unsubscript:5,unus:[0,6],updat:[0,6,7,9],update_timestamp:[0,6,10],upload:6,upon:[0,6],url:[4,5,9,10],urlconf:[0,3,6],urlpattern:[0,3,5,6],use:[0,3,5,7,8,12],used:[0,5,6,7,9,10,12],user:[0,1,3,5,6,7,9,12],user_id:0,user_user_pass:12,usernam:[0,9,10],userpermissionsseri:0,userseri:0,uses:[6,11],using:[0,1,3,9,11,12],usr:[3,12],utc:[0,3,5,9,10],util:[4,6],v0d38sjx43s8:3,valid:[0,1,9],validate_config_schema:0,validate_file_extens:0,validate_token:0,validationerror:0,validatorclass:0,valu:[0,3,6,9,10,12],value11:5,value12:5,value1:10,value21:5,value22:5,value2:10,value_11:10,value_12:10,value_21:10,value_22:10,variabl:[3,10],variou:10,vaue:10,version:10,vetween:7,via:10,view:[3,4,7,9],view_1:10,view_2:10,view_3:10,view_i:7,view_id1:10,view_id2:10,view_id3:10,view_id:[6,10],view_nam:[6,10],viewmodeltestcas:7,viewseri:6,viewset:[0,6],viewsummaryseri:6,viewthumbnailtestcas:7,viewviewset:6,visual:11,wai:[10,12],wait:[1,9],wait_tim:1,warn:[0,10],watcher:[6,10],weatherst:6,websocket:[3,5,8,9,11,12],websocket_urlpattern:5,well:10,wether:[0,3,12],when:[0,6,7,9,11],where:[10,11,12],which:[0,9,10,11,12],whise:10,who:[0,10],whole:3,with_view_nam:[6,10],within:[6,10],without:[6,10],work:[0,1,6,8,11],workflow:11,workspac:[6,7],workspace_i:7,workspace_id1:10,workspace_id:[6,10],workspace_view:[6,7],workspaceandviewsrelationstestcas:7,workspacefullseri:6,workspacemodeltestcas:7,workspaceseri:6,workspaceview:[6,7],workspaceviewmodeltestcas:7,workspaceviewseri:6,workspaceviewset:6,workspaceviewviewset:6,workspacewithviewnameseri:6,workview:6,wrapper:[0,6],write:11,written:[6,11],wsgi:4,xml:10,xml_version:[0,10],yaml:[0,1,10],you:[10,12],zuj:3},titles:["5.1. api package","5.1.1.1. api.tests package","5.2. manage module","5.3. manager package","5. ApiDoc","5.4. subscription package","5.5. ui_framework package","5.5.1.1. ui_framework.tests package","Welcome to LOVE-manager\u2019s documentation!","3. How it works","2. How to use it","1. Overview","4. Readme File"],titleterms:{TCS:10,Use:12,action:10,admin:[0,6],api:[0,1,9,10],apidoc:4,app:[0,5,6],asgi:3,auth:[5,9],authent:[0,10],build:12,channel:9,code:9,command:[9,10],config:10,connect:10,consum:[5,9],content:[0,1,3,5,6,7],creat:10,data:10,databas:9,delet:10,develop:12,docker:12,document:[8,12],efd:10,environ:12,event:10,exampl:9,file:[10,12],framework:[9,10],full:10,get:[10,12],heartbeat:10,heartbeat_manag:5,how:[9,10],imag:12,indic:8,info:10,initi:12,layer:9,load:12,local:12,log:10,logout:10,love:[8,9,10,12],manag:[2,3,8,9,10],messag:10,metadata:10,middlewar:0,model:[0,6],modul:[0,1,2,3,5,6,7],name:10,observ:10,organ:9,other:10,overview:11,packag:[0,1,3,5,6,7],part:[9,12],password:10,readm:12,request:10,respons:10,retriev:10,rout:[3,5],run:12,sal:10,schema:10,schema_valid:0,scheme:10,search:10,serial:[0,6],set:3,signal:[0,6],submodul:[0,1,3,5,6,7],subpackag:[0,6],subscript:[5,10],summari:10,swap:10,system:12,tabl:8,telemetri:10,test:[1,7,12],test_command:1,test_lovecsc:1,test_schema_valid:1,test_view_thumbnail:7,tests_api:7,tests_auth_api:1,tests_configfil:1,tests_custom_api:7,tests_emergencycontact:1,tests_model:7,token:10,topic:10,type:10,ui_framework:[6,7],unauthent:10,unauthor:10,updat:10,url:[0,3,6],use:10,user:10,util:[3,7],valid:10,variabl:12,view:[0,6,10],websocket:10,welcom:8,work:9,workspac:10,workspaceview:10,wsgi:3}}) \ No newline at end of file diff --git a/docsrc/source/modules/how_to_use_it.rst b/docsrc/source/modules/how_to_use_it.rst index 8916c723..386c6fb2 100644 --- a/docsrc/source/modules/how_to_use_it.rst +++ b/docsrc/source/modules/how_to_use_it.rst @@ -1269,4 +1269,39 @@ Endpoint to request EFD timeseries. ] } } + } + + + +TCS +============ + +aux +~~~~~~~~~~~~~~~~~~~~ +Endpoint to send ATCS commands. + +- Url: :code:`/manager/tcs/aux` +- HTTP Operation: POST +- Message Payload: + +.. code-block:: json + + { + "command_name": "point_azel", + "params": { + "az": 30, + "el": 50 + } + } + + +- Expected Response, if command successful: + +.. code-block:: json + + { + "status": 200, + "data": { + "ack": "Done", + } } \ No newline at end of file diff --git a/manager/api/tests/test_commander.py b/manager/api/tests/test_commander.py index 6fdb4e62..2a9c8a51 100644 --- a/manager/api/tests/test_commander.py +++ b/manager/api/tests/test_commander.py @@ -9,6 +9,7 @@ #python manage.py test api.tests.test_commander.CommanderTestCase #python manage.py test api.tests.test_commander.SalinfoTestCase #python manage.py test api.tests.test_commander.EFDTestCase +#python manage.py test api.tests.test_commander.TCSTestCase @override_settings(DEBUG=True) class CommanderTestCase(TestCase): @@ -258,3 +259,98 @@ def test_timeseries_query(self, mock_requests, mock_environ): self.client.post(url, data, format="json") expected_url = f"http://fakehost:fakeport/efd/timeseries" self.assertEqual(mock_requests.call_args, call(expected_url, json=data)) + + +@override_settings(DEBUG=True) +class TCSTestCase(TestCase): + maxDiff = None + + def setUp(self): + """Define the test suite setup.""" + # Arrange + self.client = APIClient() + self.user = User.objects.create_user( + username="user", + password="password", + email="test@user.cl", + first_name="First", + last_name="Last", + ) + self.token = Token.objects.create(user=self.user) + self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key) + self.user.user_permissions.add( + Permission.objects.get(codename="view_view"), + Permission.objects.get(codename="add_view"), + Permission.objects.get(codename="delete_view"), + Permission.objects.get(codename="change_view"), + ) + + @patch( + "os.environ.get", + side_effect=lambda arg: "fakehost" + if arg == "COMMANDER_HOSTNAME" + else "fakeport", + ) + @patch("requests.post") + def test_command_query(self, mock_requests, mock_environ): + """Test authorized user can send a TCS command""" + self.user.user_permissions.add(Permission.objects.get(name="Execute Commands")) + # Act: + data = { + "command_name": "atcs_command", + "params": { + "param1": "value1", + "param2": 2, + "param3": True, + } + } + url = reverse("TCS-aux") + + with self.assertRaises(ValueError): + self.client.post(url, data, format="json") + expected_url = f"http://fakehost:fakeport/tcs/aux" + self.assertEqual(mock_requests.call_args, call(expected_url, json=data)) + + @patch( + "os.environ.get", + side_effect=lambda arg: "fakehost" + if arg == "COMMANDER_HOSTNAME" + else "fakeport", + ) + @patch("requests.post") + def test_command_query_unauthorized(self, mock_requests, mock_environ): + """Test unauthorized user cannot send a TCS command""" + self.user.user_permissions.remove(Permission.objects.get(name="Execute Commands")) + # Act: + data = { + "command_name": "atcs_command", + "params": { + "param1": "value1", + "param2": 2, + "param3": True, + } + } + url = reverse("TCS-aux") + response = self.client.post(url, data, format="json") + result = response.json() + self.assertEqual(response.status_code, 401) + self.assertEqual( + result, {"ack": "User does not have permissions to execute commands."} + ) + + @patch( + "os.environ.get", + side_effect=lambda arg: "fakehost" + if arg == "COMMANDER_HOSTNAME" + else "fakeport", + ) + @patch("requests.post") + def test_command_query(self, mock_requests, mock_environ): + """Test authorized user can send a TCS command""" + # Act: + url = reverse("TCS-docstrings") + + with self.assertRaises(ValueError): + self.client.get(url) + expected_url = f"http://fakehost:fakeport/tcs/docstrings" + self.assertEqual(mock_requests.call_args, call(expected_url, json={})) diff --git a/manager/api/urls.py b/manager/api/urls.py index 9a6de855..0c13b8c8 100644 --- a/manager/api/urls.py +++ b/manager/api/urls.py @@ -52,6 +52,8 @@ path("salinfo/topic-data", api.views.salinfo_topic_data, name="salinfo-topic-data"), path("config", api.views.get_config, name="config"), path("efd/timeseries", api.views.query_efd, name="EFD-timeseries"), + path("tcs/aux", api.views.tcs_aux_command, name="TCS-aux"), + path("tcs/docstrings", api.views.tcs_docstrings, name="TCS-docstrings"), ] router.register("configfile", ConfigFileViewSet) router.register("emergencycontact", EmergencyContactViewSet) diff --git a/manager/api/views.py b/manager/api/views.py index 8ffa522f..482dba2e 100644 --- a/manager/api/views.py +++ b/manager/api/views.py @@ -528,3 +528,60 @@ def query_efd(request, *args, **kwargs): url = f"http://{os.environ.get('COMMANDER_HOSTNAME')}:{os.environ.get('COMMANDER_PORT')}/efd/timeseries" response = requests.post(url, json=request.data) return Response(response.json(), status=response.status_code) + +@api_view(["POST"]) +@permission_classes((IsAuthenticated,)) +def tcs_aux_command(request, *args, **kwargs): + """Sends command to the ATCS + + Params + ------ + request: Request + The Request object + args: list + List of addittional arguments. Currently unused + kwargs: dict + Dictionary with request arguments. Request should contain the following: + command_name (required): The name of the command to be run. It should be a field of the lsst.ts.observatory.control.auxtel.ATCS class + params (required): Parameters to be passed to the command method, e.g. + { + ra: 80, + dec: 30, + } + + Returns + ------- + Response + The response and status code of the request to the LOVE-Commander + """ + if not request.user.has_perm("api.command.execute_command"): + return Response( + {"ack": "User does not have permissions to execute commands."}, 401 + ) + url = f"http://{os.environ.get('COMMANDER_HOSTNAME')}:{os.environ.get('COMMANDER_PORT')}/tcs/aux" + response = requests.post(url, json=request.data) + return Response(response.json(), status=response.status_code) + +@api_view(["GET"]) +@permission_classes((IsAuthenticated,)) +def tcs_docstrings(request, *args, **kwargs): + """Requests TCS commands docstrings + + Params + ------ + request: Request + The Request object + args: list + List of addittional arguments. Currently unused + kwargs: dict + Dictionary with request arguments. Currently unused + + Returns + ------- + Response + The response and status code of the request to the LOVE-Commander + """ + url = f"http://{os.environ.get('COMMANDER_HOSTNAME')}:{os.environ.get('COMMANDER_PORT')}/tcs/docstrings" + response = requests.get(url) + return Response(response.json(), status=response.status_code) + diff --git a/manager/manager/settings.py b/manager/manager/settings.py index 59aa35de..85d9b1a8 100644 --- a/manager/manager/settings.py +++ b/manager/manager/settings.py @@ -221,8 +221,6 @@ + "/0" ], "symmetric_encryption_keys": [SECRET_KEY], - "capacity": 1500, - "expiry": 10, }, }, } @@ -258,3 +256,8 @@ if os.environ.get("HIDE_TRACE_TIMESTAMPS", False): TRACE_TIMESTAMPS = False + + +# LOVE-CSC-PRODUCER +"""Defines wether or not ussing the new LOVE-producer version, i.e. LOVE CSC Producer""" +LOVE_CSC_PRODUCER = os.environ.get("LOVE_CSC_PRODUCER", False) diff --git a/manager/requirements.txt b/manager/requirements.txt index e13cf0fa..5511c6a3 100644 --- a/manager/requirements.txt +++ b/manager/requirements.txt @@ -1,29 +1,29 @@ aioredis==1.3.1 alabaster==0.7.12 -asgiref==3.2.5 +asgiref==3.3.1 asn1crypto==1.3.0 astropy==4.0 async-timeout==3.0.1 atomicwrites==1.3.0 attrs==19.3.0 -autobahn==20.3.1 +autobahn==20.12.3 Automat==20.2.0 Babel==2.8.0 certifi==2019.11.28 cffi==1.14.0 -channels==2.4.0 -channels-redis==2.4.2 +channels==3.0.3 +channels-redis==3.2.0 chardet==3.0.4 constantly==15.1.0 coreapi==2.3.3 coreschema==0.0.4 cryptography==3.3.2 -daphne==2.4.1 -Django==3.0.7 +daphne==3.0.1 +Django==3.0.14 django-auth-ldap==2.1.0 django-cors-headers==3.2.1 django-webpack-loader==0.7.0 -djangorestframework==3.11.0 +djangorestframework==3.11.2 docutils==0.16 drf-yasg==1.17.1 entrypoints==0.3 @@ -37,7 +37,7 @@ importlib-metadata==1.5.0 incremental==17.5.0 inflection==0.3.1 itypes==1.1.0 -Jinja2==2.11.1 +Jinja2==2.11.3 jsonschema==3.2.0 m2r==0.2.1 MarkupSafe==1.1.1 @@ -47,17 +47,17 @@ more-itertools==8.2.0 msgpack==1.0.0 numpy==1.18.1 packaging==20.3 -Pillow==7.2.0 +Pillow==8.1.1 pip-licenses==2.1.1 pluggy==0.13.1 psycopg2==2.8.4 -py==1.8.1 +py==1.10.0 pyasn1==0.4.8 pyasn1-modules==0.2.8 pycodestyle==2.5.0 pycparser==2.20 pyflakes==2.1.1 -Pygments==2.6.1 +Pygments==2.7.4 PyHamcrest==2.0.2 pyparsing==2.4.6 pyrsistent==0.15.7 @@ -68,7 +68,7 @@ pytest-env==0.6.2 python-dateutil==2.8.1 python-ldap==3.2.0 pytz==2019.3 -PyYAML==5.3 +PyYAML==5.4 requests==2.23.0 ruamel.yaml==0.16.10 ruamel.yaml.clib==0.2.0 diff --git a/manager/subscription/auth.py b/manager/subscription/auth.py index e6bfa1a6..020e6f67 100644 --- a/manager/subscription/auth.py +++ b/manager/subscription/auth.py @@ -70,5 +70,4 @@ async def __call__(self, receive, send): data["token"][0] if "token" in data else None ) self.scope["password"] = data["password"][0] if "password" in data else None - inner = self.inner(self.scope) - return await inner(receive, send) + return await self.inner(self.scope, receive, send) diff --git a/manager/subscription/consumers.py b/manager/subscription/consumers.py index feb209a4..af24b145 100644 --- a/manager/subscription/consumers.py +++ b/manager/subscription/consumers.py @@ -1,12 +1,14 @@ """Contains the Django Channels Consumers that handle the reception/sending of channels messages.""" import json -import random + import asyncio import datetime from astropy.time import Time -from channels.db import database_sync_to_async + +# from channels.db import database_sync_to_async from channels.generic.websocket import AsyncJsonWebsocketConsumer from django.conf import settings + from manager import utils from subscription.heartbeat_manager import HeartbeatManager @@ -64,6 +66,7 @@ async def receive_json(self, message): await self.handle_subscription_message(message) elif "action" in message: await self.handle_action_message(message) + # DEPRECATED: now heartbeats are received from event callbacks elif "heartbeat" in message: await self.handle_heartbeat_message(message) else: @@ -143,8 +146,10 @@ async def handle_action_message(self, message): "utc": "", "tai": "", "mjd": "", - "sidereal_summit": "", - "sidereal_summit": "", + "sidereal_summit": "", + "sidereal_summit": "", "tai_to_utc": "", }, "request_time": "" @@ -165,13 +170,9 @@ async def handle_action_message(self, message): if message["action"] == "get_time_data": request_time = message["request_time"] time_data = utils.get_times() - await self.send_json( - { - "time_data": time_data, - "request_time": request_time, - } - ) + await self.send_json({"time_data": time_data, "request_time": request_time}) + # DEPRECATED: now heartbeats are handled using SALobj events callbacks async def handle_heartbeat_message(self, message): """Handle a heartbeat message. @@ -227,6 +228,18 @@ async def handle_data_message(self, message, manager_rcv): }] } """ + # setting heartbeat + if message["data"][0]["csc"] == "Heartbeat": + heartbeat_message = message["data"][0]["data"]["stream"] + timestamp = ( + heartbeat_message["last_heartbeat_timestamp"] + if "last_heartbeat_timestamp" in heartbeat_message + else datetime.datetime.now().timestamp() + ) + self.heartbeat_manager.set_heartbeat_timestamp( + heartbeat_message["csc"], timestamp + ) + data = message["data"] category = message["category"] producer_snd = message["producer_snd"] if "producer_snd" in message else None @@ -315,8 +328,9 @@ async def _join_group(self, category, csc, salindex, stream): # If subscribing to an event, send the initial_state if category == "event": + csc_group_key = csc if settings.LOVE_CSC_PRODUCER else "all" await self.channel_layer.group_send( - "initial_state-all-all-all", + f"initial_state-{csc_group_key}-all-all", { "type": "subscription_all_data", "category": "initial_state", diff --git a/manager/subscription/heartbeat_manager.py b/manager/subscription/heartbeat_manager.py index 59c9ded5..2afb41d7 100644 --- a/manager/subscription/heartbeat_manager.py +++ b/manager/subscription/heartbeat_manager.py @@ -58,14 +58,20 @@ async def query_commander(cls): This is what the `commander_heartbeat_task` does """ - heartbeat_url = f"http://{os.environ.get('COMMANDER_HOSTNAME')}:{os.environ.get('COMMANDER_PORT')}/heartbeat" + heartbeat_url = ( + "http://" + + os.environ.get("COMMANDER_HOSTNAME") + + ":" + + os.environ.get("COMMANDER_PORT") + + "/heartbeat" + ) while True: try: # query commander resp = requests.get(heartbeat_url) - timestamp = resp.json()['timestamp'] - #get timestamp - cls.set_heartbeat_timestamp('Commander', timestamp) + timestamp = resp.json()["timestamp"] + # get timestamp + cls.set_heartbeat_timestamp("Commander", timestamp) await asyncio.sleep(3) except Exception as e: print(e) @@ -80,7 +86,7 @@ async def dispatch_heartbeats(cls): channel_layer = get_channel_layer() while True: try: - print("sending data") + print("sending data", flush=True) cls.set_heartbeat_timestamp( "Manager", datetime.datetime.now().timestamp() ) @@ -113,7 +119,8 @@ async def dispatch_heartbeats(cls): @classmethod async def reset(cls): - """Reset the `HeartbeatManager`, changing the tasks references and heartbeats dictionary back to their default values.""" + """Reset the `HeartbeatManager`, changing the tasks references + and heartbeats dictionary back to their default values.""" if cls.heartbeat_task: cls.heartbeat_task = None if cls.commander_heartbeat_task: diff --git a/manager/subscription/routing.py b/manager/subscription/routing.py index 4489f4db..6966f3ac 100644 --- a/manager/subscription/routing.py +++ b/manager/subscription/routing.py @@ -4,6 +4,9 @@ from .consumers import SubscriptionConsumer websocket_urlpatterns = [ - url("^manager/ws/subscription/?$", TokenAuthMiddleware(SubscriptionConsumer)), + url( + "^manager/ws/subscription/?$", + TokenAuthMiddleware(SubscriptionConsumer.as_asgi()), + ), ] """List of url patterns that match a URL to a Consumer (in this case only 1)."""