diff --git a/SAS/TMSS/backend/services/tmss_ra_adapter/lib/tmss_ra_adapter.py b/SAS/TMSS/backend/services/tmss_ra_adapter/lib/tmss_ra_adapter.py index 1e861ccbda82ab4907fce008a53cb2828c62d85a..eeadb94510ff62034f92b6ffbafd76f6c042d4cf 100644 --- a/SAS/TMSS/backend/services/tmss_ra_adapter/lib/tmss_ra_adapter.py +++ b/SAS/TMSS/backend/services/tmss_ra_adapter/lib/tmss_ra_adapter.py @@ -27,6 +27,7 @@ logger = logging.getLogger(__name__) import requests from dateutil import parser +from datetime import timedelta import json from lofar.common import isProductionEnvironment, isTestEnvironment from lofar.common.util import waitForInterrupt @@ -158,8 +159,8 @@ class RAEventMessageHandlerForTMSSSynchronization(RAEventMessageHandler): "description": "A reservation while OTDB observation %s %s %s is observing" % (ra_task['project_name'], ra_task['otdb_id'], ra_task['description']), "specifications_doc": specifications_doc, "specifications_template": self._tmss_client.get_full_url_for_path('/reservation_template/1'), - "start_time": ra_task['starttime'], - "stop_time": ra_task['endtime'] + "start_time": (parser.parse(ra_task['starttime'], ignoretz=True) - timedelta(minutes=1)).isoformat(), # add one minute so that TMSS stops early enough before MoM starts + "stop_time": (parser.parse(ra_task['endtime'], ignoretz=True) + timedelta(minutes=1)).isoformat() # add one minute so that TMSS does not start something else too soon after MoM finishes } self._tmss_client.post_to_path_and_get_result_as_json_object('/reservation', json_data=reservation) diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py index 8e0b5f493d05f8adbf40a007b307b15a2e3a6b93..c580d08418eb236fc419acc297bbc4b010bc58a4 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py @@ -1384,6 +1384,17 @@ def assign_system_permissions(): admin_group.permissions.add(perm) maintenance_group.permissions.add(perm) + extra_actions = view.get_extra_actions() + if extra_actions: + for action in extra_actions: + perm = Permission.objects.get(codename='%s_%s' % (action.__name__, name)) + if 'get' in action.mapping and perm not in already_handled: + operator_group.permissions.add(perm) + support_group.permissions.add(perm) + developer_group.permissions.add(perm) + admin_group.permissions.add(perm) + maintenance_group.permissions.add(perm) + # Note: we only grant view permissions, since alteration is only permitted to users who are superuser anyway. # operational diff --git a/SAS/TMSS/backend/test/acceptance_test/LoLSS_scheduling.py b/SAS/TMSS/backend/test/acceptance_test/LoLSS_scheduling.py index 4981add409efb475494e199ce527553dc3789949..490e2356d6581e8f1eb508fdf6cff33b973f75bb 100644 --- a/SAS/TMSS/backend/test/acceptance_test/LoLSS_scheduling.py +++ b/SAS/TMSS/backend/test/acceptance_test/LoLSS_scheduling.py @@ -96,13 +96,11 @@ def populate_LoLSS_test_campaign(between=None, not_between=None): 'scheduling_constraints_doc': { 'scheduler': 'dynamic', 'time': {'between': between if between else [], 'not_between': not_between if not_between else []}, - # FIXME: If require_day value is True, then none of the units gets scheduled. - #'daily': {'require_day': require_day, 'require_night': False}, + 'daily': {'require_day': require_day, 'require_night': False}, 'sky': {'min_distance': {'jupiter': min_distance_jupiter, 'moon': min_distance_moon, 'sun': min_distance_sun}, 'min_elevation': {'target': min_target_elevation, 'calibrator': min_calibrator_elevation}, 'transit_offset': {'to': offset_window_to, 'from': offset_window_from}, - # TODO: Uncomment this after TMSS-1904 is implemented. - #'reference_pointing': {'pointing': {'angle1': ref_pointing_angle1, 'angle2': ref_pointing_angle2, 'direction_type': ref_pointing_direction_type}} + 'reference_pointing': {'pointing': {'angle1': ref_pointing_angle1, 'angle2': ref_pointing_angle2, 'direction_type': ref_pointing_direction_type}} } } }) @@ -119,13 +117,9 @@ def run_acceptance_test(): stats.start_populate = datetime.utcnow() # populate one campaign constraint to start pretty much right away + # NOTE: The RA values in the LoLSS_targets.tsv file have been adjusted to schedule "now" (old values +3h) start_time = datetime.utcnow().replace(second=0, microsecond=0, minute=0) + timedelta(hours=2) populate_LoLSS_test_campaign(between=[{"from": start_time.isoformat(), "to": (start_time+relativedelta(weeks=1)).isoformat()}]) - # populate another campaign constraint to start a year later - start_time = start_time + relativedelta(years=1) - # todo: fix scheduler to actually schedule sth that far in the future or revise acceptance criteria - #populate_LoLSS_test_campaign(between=[{"from": start_time.isoformat(), "to": (start_time + timedelta(days=7)).isoformat()}]) - stats.stop_populate = datetime.utcnow() assert_SUB_statuses(models.SchedulingUnitStatus.Choices.SCHEDULABLE.value) stats.start_scheduling = datetime.utcnow() diff --git a/SAS/TMSS/backend/test/acceptance_test/LoLSS_targets.tsv b/SAS/TMSS/backend/test/acceptance_test/LoLSS_targets.tsv index 9aa6c2d2cfbcda9a31d5194972365d075fd01936..a55c9ee0eea91b5779e11405ab47e75b5420ed33 100644 --- a/SAS/TMSS/backend/test/acceptance_test/LoLSS_targets.tsv +++ b/SAS/TMSS/backend/test/acceptance_test/LoLSS_targets.tsv @@ -1,36 +1,36 @@ -Name Description Rank Priority Queue Scheduler At After Before Between Not Between Daily Min Target Elevation (Degrees) Min Calibrator Elevation (Degrees) Offset Window From Offset Window To Offset Reference RA Offset Reference DEC Offset Reference Name Offfset Reference Direction Type Sun (Degrees) Moon (Degrees) Jupiter (Degrees) Duration Run ADDER QA Observation description Pipeline 1 description Pipeline 2 description Pipeline 3 description Pipeline Calibrator description Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Time averaging steps Frequency averaging steps Demix Sources Pipeline Target 1 Demix ignore target Pipeline Target 1 Demix Sources Pipeline Target 2 Demix ignore target Pipeline Target 2 Demix Sources Pipeline Target 3 Demix ignore target Pipeline Target 3 Demix Sources Pipeline Calibrator Station Groups - Combined Observation -c16_o127.3REP c16_o127.3REP P001+43 P354+43 P346+43 3c196 0 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 1.6hours 50degrees group 127.3 J2000 30 30 15 01:00:00 FALSE c16_o127.3REP P001+43 P354+43 P346+43 3c196 c16_o127.3REP P001+43/PP c16_o127.3REP P354+43/PP c16_o127.3REP P346+43/PP c16_o127.3REP 3c196/CP 00:04:55.41hours 43:29:07.0degrees P001+43 J2000 23:36:23.56hours 43:25:23.2degrees P354+43 J2000 23:07:53.46hours 43:21:40.2degrees P346+43 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o125.3REP c16_o125.3REP P022+44 P015+44 P008+44 3c196 0.01 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3hours 50degrees group 125.3 J2000 30 30 15 01:00:00 FALSE c16_o125.3REP P022+44 P015+44 P008+44 3c196 c16_o125.3REP P022+44/PP c16_o125.3REP P015+44/PP c16_o125.3REP P008+44/PP c16_o125.3REP 3c196/CP 01:30:41.56hours 43:40:15.9degrees P022+44 J2000 01:02:04.41hours 43:36:34.4degrees P015+44 J2000 00:33:29.25hours 43:32:50.8degrees P008+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o123.3REP c16_o123.3REP P044+44 P037+44 P029+44 3c196 0.02 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.5hours 50degrees group 123.3 J2000 30 30 15 01:00:00 FALSE c16_o123.3REP P044+44 P037+44 P029+44 3c196 c16_o123.3REP P044+44/PP c16_o123.3REP P037+44/PP c16_o123.3REP P029+44/PP c16_o123.3REP 3c196/CP 02:56:43.52hours 43:51:07.3degrees P044+44 J2000 02:28:01.13hours 43:47:33.2degrees P037+44 J2000 01:59:20.47hours 43:43:55.9degrees P029+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o212.1REP c16_o212.1REP P193+37 P177+37 P171+37 3c196 0.03 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 9.8hours 50degrees group 212.1 J2000 30 30 15 01:00:00 FALSE c16_o212.1REP P193+37 P177+37 P171+37 3c196 c16_o212.1REP P193+37/PP c16_o212.1REP P177+37/PP c16_o212.1REP P171+37/PP c16_o212.1REP 3c196/CP 12:55:18.38hours 37:16:17.3degrees P193+37 J2000 11:50:16.32hours 37:11:10.3degrees P177+37 J2000 11:24:16.87hours 37:09:07.8degrees P171+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o215.3REP c16_o215.3REP P161+37 P154+37 P148+37 3c295 0.04 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.3hours 50degrees group 215.3 J2000 30 30 15 01:00:00 FALSE c16_o215.3REP P161+37 P154+37 P148+37 3c295 c16_o215.3REP P161+37/PP c16_o215.3REP P154+37/PP c16_o215.3REP P148+37/PP c16_o215.3REP 3c295/CP 10:45:19.70hours 37:06:02.8degrees P161+37 J2000 10:19:21.32hours 37:03:57.7degrees P154+37 J2000 09:53:24.36hours 37:01:50.8degrees P148+37 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o142.2REP c16_o142.2REP P209+42 P202+42 P195+42 3c295 0.05 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 13.5hours 50degrees group 142.2 J2000 30 30 15 01:00:00 FALSE c16_o142.2REP P209+42 P202+42 P195+42 3c295 c16_o142.2REP P209+42/PP c16_o142.2REP P202+42/PP c16_o142.2REP P195+42/PP c16_o142.2REP 3c295/CP 13:57:12.42hours 42:22:25.6degrees P209+42 J2000 13:29:10.77hours 42:20:09.3degrees P202+42 J2000 13:01:10.12hours 42:17:55.9degrees P195+42 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o070.2REP c16_o070.2REP P059+52 P050+51 P042+51 3c196 0.06 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3.4hours 50degrees group 70.2 J2000 30 30 15 01:00:00 FALSE c16_o070.2REP P059+52 P050+51 P042+51 3c196 c16_o070.2REP P059+52/PP c16_o070.2REP P050+51/PP c16_o070.2REP P042+51/PP c16_o070.2REP 3c196/CP 03:57:09.98hours 51:30:08.3degrees P059+52 J2000 03:23:54.87hours 51:26:10.3degrees P050+51 J2000 02:50:42.68hours 51:22:06.7degrees P042+51 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o094.2REP c16_o094.2REP P077+47 P069+47 P062+47 3c196 0.07 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.6hours 50degrees group 94.2 J2000 30 30 15 01:00:00 FALSE c16_o094.2REP P077+47 P069+47 P062+47 3c196 c16_o094.2REP P077+47/PP c16_o094.2REP P069+47/PP c16_o094.2REP P062+47/PP c16_o094.2REP 3c196/CP 05:08:18.70hours 46:37:06.3degrees P077+47 J2000 04:38:10.31hours 46:33:44.8degrees P069+47 J2000 04:08:03.83hours 46:30:16.7degrees P062+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o182.1REP c16_o182.1REP P130+39 P124+39 P117+39 3c196 0.08 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 6.3hours 50degrees group 182.1 J2000 30 30 15 01:00:00 FALSE c16_o182.1REP P130+39 P124+39 P117+39 3c196 c16_o182.1REP P130+39/PP c16_o182.1REP P124+39/PP c16_o182.1REP P117+39/PP c16_o182.1REP 3c196/CP 08:43:22.15hours 39:26:30.4degrees P130+39 J2000 08:16:33.50hours 39:24:07.9degrees P124+39 J2000 07:49:45.76hours 39:21:41.5degrees P117+39 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o250.1REP c16_o250.1REP P169+35 P163+35 P157+35 3c196 0.09 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 8.9hours 50degrees group 250.1 J2000 30 30 15 01:00:00 FALSE c16_o250.1REP P169+35 P163+35 P157+35 3c196 c16_o250.1REP P169+35/PP c16_o250.1REP P163+35/PP c16_o250.1REP P157+35/PP c16_o250.1REP 3c196/CP 11:19:59.82hours 34:38:12.2degrees P169+35 J2000 10:54:49.82hours 34:36:12.8degrees P163+35 J2000 10:29:40.43hours 34:34:12.2degrees P157+35 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o214.2REP c16_o214.2REP P164+37 P158+37 P151+37 3c196 0.1 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 10.5hours 50degrees group 214.2 J2000 30 30 15 01:00:00 FALSE c16_o214.2REP P164+37 P158+37 P151+37 3c196 c16_o214.2REP P164+37/PP c16_o214.2REP P158+37/PP c16_o214.2REP P151+37/PP c16_o214.2REP 3c196/CP 10:58:18.12hours 37:07:04.7degrees P164+37 J2000 10:32:20.78hours 37:05:00.5degrees P158+37 J2000 10:06:22.75hours 37:02:54.5degrees P151+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o174.1REP c16_o174.1REP P221+40 P214+40 P208+40 3c295 0.11 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.3hours 50degrees group 174.1 J2000 30 30 15 01:00:00 FALSE c16_o174.1REP P221+40 P214+40 P208+40 3c295 c16_o174.1REP P221+40/PP c16_o174.1REP P214+40/PP c16_o174.1REP P208+40/PP c16_o174.1REP 3c295/CP 14:46:42.89hours 39:55:58.3degrees P221+40 J2000 14:19:42.73hours 39:53:42.0degrees P214+40 J2000 13:52:43.44hours 39:51:28.7degrees P208+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o001.1REP c16_o001.1REP P248+48 P243+50 P240+48 3c295 0.12 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 14.2hours 50degrees group 1.1 J2000 30 30 15 01:00:00 FALSE c16_o001.1REP P248+48 P243+50 P240+48 3c295 c16_o001.1REP P248+48/PP c16_o001.1REP P243+50/PP c16_o001.1REP P240+48/PP c16_o001.1REP 3c295/CP 16:33:25.76hours 47:37:17.7degrees P248+48 J2000 16:12:57.51hours 50:05:56.4degrees P243+50 J2000 16:02:42.78hours 47:34:25.4degrees P240+48 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o082.1REP c16_o082.1REP P051+49 P043+49 P035+49 3c380 0.13 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 0.9hours 50degrees group 82.1 J2000 30 30 15 01:00:00 FALSE c16_o082.1REP P051+49 P043+49 P035+49 3c380 c16_o082.1REP P051+49/PP c16_o082.1REP P043+49/PP c16_o082.1REP P035+49/PP c16_o082.1REP 3c380/CP 03:26:39.58hours 48:55:55.8degrees P051+49 J2000 02:55:09.71hours 48:52:05.2degrees P043+49 J2000 02:23:41.13hours 48:48:10.2degrees P035+49 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o028.2REP c16_o028.2REP P059+67 P046+66 P033+66 3c196 0.14 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3.1hours 50degrees group 28.2 J2000 30 30 15 01:00:00 FALSE c16_o028.2REP P059+67 P046+66 P033+66 3c196 c16_o028.2REP P059+67/PP c16_o028.2REP P046+66/PP c16_o028.2REP P033+66/PP c16_o028.2REP 3c196/CP 03:56:06.68hours 66:33:13.7degrees P059+67 J2000 03:04:07.88hours 66:26:59.4degrees P046+66 J2000 02:12:22.31hours 66:20:33.3degrees P033+66 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o066.1REP c16_o066.1REP P109+52 P101+52 P092+52 3c196 0.15 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.7hours 50degrees group 66.1 J2000 30 30 15 01:00:00 FALSE c16_o066.1REP P109+52 P101+52 P092+52 3c196 c16_o066.1REP P109+52/PP c16_o066.1REP P101+52/PP c16_o066.1REP P092+52/PP c16_o066.1REP 3c196/CP 07:17:38.36hours 51:51:33.3degrees P109+52 J2000 06:44:07.15hours 51:48:17.2degrees P101+52 J2000 06:10:38.42hours 51:44:53.9degrees P092+52 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o091.1REP c16_o091.1REP P103+47 P095+47 P088+47 3c196 0.16 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.4hours 50degrees group 91.1 J2000 30 30 15 01:00:00 FALSE c16_o091.1REP P103+47 P095+47 P088+47 3c196 c16_o091.1REP P103+47/PP c16_o091.1REP P095+47/PP c16_o091.1REP P088+47/PP c16_o091.1REP 3c196/CP 06:54:02.38hours 46:48:07.6degrees P103+47 J2000 06:23:47.70hours 46:45:06.2degrees P095+47 J2000 05:53:34.76hours 46:41:58.8degrees P088+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o253.1REP c16_o253.1REP P147+35 P141+34 P135+34 3c196 0.17 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.4hours 50degrees group 253.1 J2000 30 30 15 01:00:00 FALSE c16_o253.1REP P147+35 P141+34 P135+34 3c196 c16_o253.1REP P147+35/PP c16_o253.1REP P141+34/PP c16_o253.1REP P135+34/PP c16_o253.1REP 3c196/CP 09:51:57.49hours 34:31:08.3degrees P147+35 J2000 09:26:49.65hours 34:29:02.9degrees P141+34 J2000 09:01:42.44hours 34:26:55.0degrees P135+34 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o156.1REP c16_o156.1REP P045+41 P038+41 P032+41 3c380 0.18 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 0.6hours 50degrees group 156.1 J2000 30 30 15 01:00:00 FALSE c16_o156.1REP P045+41 P038+41 P032+41 3c380 c16_o156.1REP P045+41/PP c16_o156.1REP P038+41/PP c16_o156.1REP P032+41/PP c16_o156.1REP 3c380/CP 03:03:11.55hours 41:21:19.8degrees P045+41 J2000 02:35:36.77hours 41:17:55.0degrees P038+41 J2000 02:08:03.45hours 41:14:27.3degrees P032+41 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o157.2REP c16_o157.2REP P042+41 P035+41 P028+41 3c196 0.19 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 2.4hours 50degrees group 157.2 J2000 30 30 15 01:00:00 FALSE c16_o157.2REP P042+41 P035+41 P028+41 3c196 c16_o157.2REP P042+41/PP c16_o157.2REP P035+41/PP c16_o157.2REP P028+41/PP c16_o157.2REP 3c196/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o124.3REP c16_o124.3REP P040+44 P033+44 P026+44 3c196 0.2 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.2hours 50degrees group 124.3 J2000 30 30 15 01:00:00 FALSE c16_o124.3REP P040+44 P033+44 P026+44 3c196 c16_o124.3REP P040+44/PP c16_o124.3REP P033+44/PP c16_o124.3REP P026+44/PP c16_o124.3REP 3c196/CP 02:42:22.11hours 43:49:20.7degrees P040+44 J2000 02:13:40.58hours 43:45:44.9degrees P033+44 J2000 01:45:00.79hours 43:42:06.2degrees P026+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o328.1REP c16_o328.1REP P174+30 P168+30 P162+30 3c196 0.21 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 9.2hours 50degrees group 328.1 J2000 30 30 15 01:00:00 FALSE c16_o328.1REP P174+30 P168+30 P162+30 3c196 c16_o328.1REP P174+30/PP c16_o328.1REP P168+30/PP c16_o328.1REP P162+30/PP c16_o328.1REP 3c196/CP 11:37:54.86hours 29:38:25.5degrees P174+30 J2000 11:14:05.40hours 29:36:33.6degrees P168+30 J2000 10:50:16.39hours 29:34:39.9degrees P162+30 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o177.2REP c16_o177.2REP P198+40 P181+40 P174+40 3c295 0.22 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.1hours 50degrees group 177.2 J2000 30 30 15 01:00:00 FALSE c16_o177.2REP P198+40 P181+40 P174+40 3c295 c16_o177.2REP P198+40/PP c16_o177.2REP P181+40/PP c16_o177.2REP P174+40/PP c16_o177.2REP 3c295/CP 13:12:16.13hours 39:48:13.8degrees P198+40 J2000 12:04:54.82hours 39:42:54.3degrees P181+40 J2000 11:37:59.74hours 39:40:47.7degrees P174+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o404.1REP c16_o404.1REP P229+25 P224+25 P218+25 3c295 0.23 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 13hours 50degrees group 404.1 J2000 30 30 15 01:00:00 FALSE c16_o404.1REP P229+25 P224+25 P218+25 3c295 c16_o404.1REP P229+25/PP c16_o404.1REP P224+25/PP c16_o404.1REP P218+25/PP c16_o404.1REP 3c295/CP 15:19:56.61hours 24:55:17.5degrees P229+25 J2000 14:57:06.66hours 24:53:18.9degrees P224+25 J2000 14:34:17.56hours 24:51:21.7degrees P218+25 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o125.2REP c16_o125.2REP P022+44 P015+44 P008+44 3c380 0.24 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 1hours 50degrees group 125.2 J2000 30 30 15 01:00:00 FALSE c16_o125.2REP P022+44 P015+44 P008+44 3c380 c16_o125.2REP P022+44/PP c16_o125.2REP P015+44/PP c16_o125.2REP P008+44/PP c16_o125.2REP 3c380/CP 01:30:41.56hours 43:40:15.9degrees P022+44 J2000 01:02:04.41hours 43:36:34.4degrees P015+44 J2000 00:33:29.25hours 43:32:50.8degrees P008+44 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o065.2REP c16_o065.2REP P049+54 P040+54 P031+54 3c196 0.25 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 2.7hours 50degrees group 65.2 J2000 30 30 15 01:00:00 FALSE c16_o065.2REP P049+54 P040+54 P031+54 3c196 c16_o065.2REP P049+54/PP c16_o065.2REP P040+54/PP c16_o065.2REP P031+54/PP c16_o065.2REP 3c196/CP 03:16:37.11hours 53:55:51.2degrees P049+54 J2000 02:41:27.93hours 53:51:31.9degrees P040+54 J2000 02:06:22.42hours 53:47:07.6degrees P031+54 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o157.3REP c16_o157.3REP P042+41 P035+41 P028+41 3c196 0.26 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.4hours 50degrees group 157.3 J2000 30 30 15 01:00:00 FALSE c16_o157.3REP P042+41 P035+41 P028+41 3c196 c16_o157.3REP P042+41/PP c16_o157.3REP P035+41/PP c16_o157.3REP P028+41/PP c16_o157.3REP 3c196/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o217.1REP c16_o217.1REP P141+37 P135+37 P128+37 3c196 0.27 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7hours 50degrees group 217.1 J2000 30 30 15 01:00:00 FALSE c16_o217.1REP P141+37 P135+37 P128+37 3c196 c16_o217.1REP P141+37/PP c16_o217.1REP P135+37/PP c16_o217.1REP P128+37/PP c16_o217.1REP 3c196/CP 09:27:28.12hours 36:59:41.6degrees P141+37 J2000 09:01:32.63hours 36:57:29.6degrees P135+37 J2000 08:35:37.90hours 36:55:14.4degrees P128+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o290.1REP c16_o290.1REP P158+32 P152+32 P145+32 3c196 0.28 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 8.1hours 50degrees group 290.1 J2000 30 30 15 01:00:00 FALSE c16_o290.1REP P158+32 P152+32 P145+32 3c196 c16_o290.1REP P158+32/PP c16_o290.1REP P152+32/PP c16_o290.1REP P145+32/PP c16_o290.1REP 3c196/CP 10:32:43.33hours 32:03:51.4degrees P158+32 J2000 10:08:17.30hours 32:01:52.9degrees P152+32 J2000 09:43:51.81hours 31:59:52.6degrees P145+32 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o253.2REP c16_o253.2REP P147+35 P141+34 P135+34 3c196 0.29 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 9.4hours 50degrees group 253.2 J2000 30 30 15 01:00:00 FALSE c16_o253.2REP P147+35 P141+34 P135+34 3c196 c16_o253.2REP P147+35/PP c16_o253.2REP P141+34/PP c16_o253.2REP P135+34/PP c16_o253.2REP 3c196/CP 09:51:57.49hours 34:31:08.3degrees P147+35 J2000 09:26:49.65hours 34:29:02.9degrees P141+34 J2000 09:01:42.44hours 34:26:55.0degrees P135+34 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o107.1REP c16_o107.1REP P218+45 P210+45 P203+45 3c295 0.3 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.1hours 50degrees group 107.1 J2000 30 30 15 01:00:00 FALSE c16_o107.1REP P218+45 P210+45 P203+45 3c295 c16_o107.1REP P218+45/PP c16_o107.1REP P210+45/PP c16_o107.1REP P203+45/PP c16_o107.1REP 3c295/CP 14:32:55.87hours 44:55:58.7degrees P218+45 J2000 14:03:41.29hours 44:53:32.2degrees P210+45 J2000 13:34:27.42hours 44:51:09.5degrees P203+45 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o173.1REP c16_o173.1REP P238+40 P231+40 P225+40 3c295 0.31 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 13.5hours 50degrees group 173.1 J2000 30 30 15 01:00:00 FALSE c16_o173.1REP P238+40 P231+40 P225+40 3c295 c16_o173.1REP P238+40/PP c16_o173.1REP P231+40/PP c16_o173.1REP P225+40/PP c16_o173.1REP 3c295/CP 15:54:17.33hours 40:01:54.9degrees P238+40 J2000 15:27:14.85hours 39:59:29.2degrees P231+40 J2000 15:00:13.31hours 39:57:07.7degrees P225+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o044.1REP c16_o044.1REP P264+63 P253+63 P241+63 3c295 0.32 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 14.9hours 50degrees group 44.1 J2000 30 30 15 01:00:00 FALSE c16_o044.1REP P264+63 P253+63 P241+63 3c295 c16_o044.1REP P264+63/PP c16_o044.1REP P253+63/PP c16_o044.1REP P241+63/PP c16_o044.1REP 3c295/CP 17:37:19.47hours 62:46:53.2degrees P264+63 J2000 16:52:04.68hours 62:42:22.5degrees P253+63 J2000 16:06:56.60hours 62:38:05.9degrees P241+63 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o157.1REP c16_o157.1REP P042+41 P035+41 P028+41 3c380 0.33 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 0.5hours 50degrees group 157.1 J2000 30 30 15 01:00:00 FALSE c16_o157.1REP P042+41 P035+41 P028+41 3c380 c16_o157.1REP P042+41/PP c16_o157.1REP P035+41/PP c16_o157.1REP P028+41/PP c16_o157.1REP 3c380/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| -c16_o094.1REP c16_o094.1REP P077+47 P069+47 P062+47 3c196 0.34 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 2.6hours 50degrees group 94.1 J2000 30 30 15 01:00:00 FALSE c16_o094.1REP P077+47 P069+47 P062+47 3c196 c16_o094.1REP P077+47/PP c16_o094.1REP P069+47/PP c16_o094.1REP P062+47/PP c16_o094.1REP 3c196/CP 05:08:18.70hours 46:37:06.3degrees P077+47 J2000 04:38:10.31hours 46:33:44.8degrees P069+47 J2000 04:08:03.83hours 46:30:16.7degrees P062+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| \ No newline at end of file + Name Description Rank Priority Queue Scheduler At After Before Between Not Between Daily Min Target Elevation (Degrees) Min Calibrator Elevation (Degrees) Offset Window From Offset Window To Offset Reference RA Offset Reference DEC Offset Reference Name Offfset Reference Direction Type Sun (Degrees) Moon (Degrees) Jupiter (Degrees) Duration Run ADDER QA Observation description Pipeline 1 description Pipeline 2 description Pipeline 3 description Pipeline Calibrator description Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Angle 1 Angle 2 Target Direction Type Time averaging steps Frequency averaging steps Demix Sources Pipeline Target 1 Demix ignore target Pipeline Target 1 Demix Sources Pipeline Target 2 Demix ignore target Pipeline Target 2 Demix Sources Pipeline Target 3 Demix ignore target Pipeline Target 3 Demix Sources Pipeline Calibrator Station Groups - Combined Observation +c16_o127.3REP c16_o127.3REP P001+43 P354+43 P346+43 3c196 0 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4.6hours 50degrees group 127.3 J2000 30 30 15 01:00:00 FALSE c16_o127.3REP P001+43 P354+43 P346+43 3c196 c16_o127.3REP P001+43/PP c16_o127.3REP P354+43/PP c16_o127.3REP P346+43/PP c16_o127.3REP 3c196/CP 00:04:55.41hours 43:29:07.0degrees P001+43 J2000 23:36:23.56hours 43:25:23.2degrees P354+43 J2000 23:07:53.46hours 43:21:40.2degrees P346+43 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o125.3REP c16_o125.3REP P022+44 P015+44 P008+44 3c196 0.01 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 6hours 50degrees group 125.3 J2000 30 30 15 01:00:00 FALSE c16_o125.3REP P022+44 P015+44 P008+44 3c196 c16_o125.3REP P022+44/PP c16_o125.3REP P015+44/PP c16_o125.3REP P008+44/PP c16_o125.3REP 3c196/CP 01:30:41.56hours 43:40:15.9degrees P022+44 J2000 01:02:04.41hours 43:36:34.4degrees P015+44 J2000 00:33:29.25hours 43:32:50.8degrees P008+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o123.3REP c16_o123.3REP P044+44 P037+44 P029+44 3c196 0.02 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.5hours 50degrees group 123.3 J2000 30 30 15 01:00:00 FALSE c16_o123.3REP P044+44 P037+44 P029+44 3c196 c16_o123.3REP P044+44/PP c16_o123.3REP P037+44/PP c16_o123.3REP P029+44/PP c16_o123.3REP 3c196/CP 02:56:43.52hours 43:51:07.3degrees P044+44 J2000 02:28:01.13hours 43:47:33.2degrees P037+44 J2000 01:59:20.47hours 43:43:55.9degrees P029+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o212.1REP c16_o212.1REP P193+37 P177+37 P171+37 3c196 0.03 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.8hours 50degrees group 212.1 J2000 30 30 15 01:00:00 FALSE c16_o212.1REP P193+37 P177+37 P171+37 3c196 c16_o212.1REP P193+37/PP c16_o212.1REP P177+37/PP c16_o212.1REP P171+37/PP c16_o212.1REP 3c196/CP 12:55:18.38hours 37:16:17.3degrees P193+37 J2000 11:50:16.32hours 37:11:10.3degrees P177+37 J2000 11:24:16.87hours 37:09:07.8degrees P171+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o215.3REP c16_o215.3REP P161+37 P154+37 P148+37 3c295 0.04 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 15.3hours 50degrees group 215.3 J2000 30 30 15 01:00:00 FALSE c16_o215.3REP P161+37 P154+37 P148+37 3c295 c16_o215.3REP P161+37/PP c16_o215.3REP P154+37/PP c16_o215.3REP P148+37/PP c16_o215.3REP 3c295/CP 10:45:19.70hours 37:06:02.8degrees P161+37 J2000 10:19:21.32hours 37:03:57.7degrees P154+37 J2000 09:53:24.36hours 37:01:50.8degrees P148+37 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o142.2REP c16_o142.2REP P209+42 P202+42 P195+42 3c295 0.05 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 16.5hours 50degrees group 142.2 J2000 30 30 15 01:00:00 FALSE c16_o142.2REP P209+42 P202+42 P195+42 3c295 c16_o142.2REP P209+42/PP c16_o142.2REP P202+42/PP c16_o142.2REP P195+42/PP c16_o142.2REP 3c295/CP 13:57:12.42hours 42:22:25.6degrees P209+42 J2000 13:29:10.77hours 42:20:09.3degrees P202+42 J2000 13:01:10.12hours 42:17:55.9degrees P195+42 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o070.2REP c16_o070.2REP P059+52 P050+51 P042+51 3c196 0.06 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 6.4hours 50degrees group 70.2 J2000 30 30 15 01:00:00 FALSE c16_o070.2REP P059+52 P050+51 P042+51 3c196 c16_o070.2REP P059+52/PP c16_o070.2REP P050+51/PP c16_o070.2REP P042+51/PP c16_o070.2REP 3c196/CP 03:57:09.98hours 51:30:08.3degrees P059+52 J2000 03:23:54.87hours 51:26:10.3degrees P050+51 J2000 02:50:42.68hours 51:22:06.7degrees P042+51 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o094.2REP c16_o094.2REP P077+47 P069+47 P062+47 3c196 0.07 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.6hours 50degrees group 94.2 J2000 30 30 15 01:00:00 FALSE c16_o094.2REP P077+47 P069+47 P062+47 3c196 c16_o094.2REP P077+47/PP c16_o094.2REP P069+47/PP c16_o094.2REP P062+47/PP c16_o094.2REP 3c196/CP 05:08:18.70hours 46:37:06.3degrees P077+47 J2000 04:38:10.31hours 46:33:44.8degrees P069+47 J2000 04:08:03.83hours 46:30:16.7degrees P062+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o182.1REP c16_o182.1REP P130+39 P124+39 P117+39 3c196 0.08 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 9.3hours 50degrees group 182.1 J2000 30 30 15 01:00:00 FALSE c16_o182.1REP P130+39 P124+39 P117+39 3c196 c16_o182.1REP P130+39/PP c16_o182.1REP P124+39/PP c16_o182.1REP P117+39/PP c16_o182.1REP 3c196/CP 08:43:22.15hours 39:26:30.4degrees P130+39 J2000 08:16:33.50hours 39:24:07.9degrees P124+39 J2000 07:49:45.76hours 39:21:41.5degrees P117+39 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o250.1REP c16_o250.1REP P169+35 P163+35 P157+35 3c196 0.09 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 11.9hours 50degrees group 250.1 J2000 30 30 15 01:00:00 FALSE c16_o250.1REP P169+35 P163+35 P157+35 3c196 c16_o250.1REP P169+35/PP c16_o250.1REP P163+35/PP c16_o250.1REP P157+35/PP c16_o250.1REP 3c196/CP 11:19:59.82hours 34:38:12.2degrees P169+35 J2000 10:54:49.82hours 34:36:12.8degrees P163+35 J2000 10:29:40.43hours 34:34:12.2degrees P157+35 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o214.2REP c16_o214.2REP P164+37 P158+37 P151+37 3c196 0.1 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 13.5hours 50degrees group 214.2 J2000 30 30 15 01:00:00 FALSE c16_o214.2REP P164+37 P158+37 P151+37 3c196 c16_o214.2REP P164+37/PP c16_o214.2REP P158+37/PP c16_o214.2REP P151+37/PP c16_o214.2REP 3c196/CP 10:58:18.12hours 37:07:04.7degrees P164+37 J2000 10:32:20.78hours 37:05:00.5degrees P158+37 J2000 10:06:22.75hours 37:02:54.5degrees P151+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o174.1REP c16_o174.1REP P221+40 P214+40 P208+40 3c295 0.11 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 15.3hours 50degrees group 174.1 J2000 30 30 15 01:00:00 FALSE c16_o174.1REP P221+40 P214+40 P208+40 3c295 c16_o174.1REP P221+40/PP c16_o174.1REP P214+40/PP c16_o174.1REP P208+40/PP c16_o174.1REP 3c295/CP 14:46:42.89hours 39:55:58.3degrees P221+40 J2000 14:19:42.73hours 39:53:42.0degrees P214+40 J2000 13:52:43.44hours 39:51:28.7degrees P208+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o001.1REP c16_o001.1REP P248+48 P243+50 P240+48 3c295 0.12 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 17.2hours 50degrees group 1.1 J2000 30 30 15 01:00:00 FALSE c16_o001.1REP P248+48 P243+50 P240+48 3c295 c16_o001.1REP P248+48/PP c16_o001.1REP P243+50/PP c16_o001.1REP P240+48/PP c16_o001.1REP 3c295/CP 16:33:25.76hours 47:37:17.7degrees P248+48 J2000 16:12:57.51hours 50:05:56.4degrees P243+50 J2000 16:02:42.78hours 47:34:25.4degrees P240+48 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o082.1REP c16_o082.1REP P051+49 P043+49 P035+49 3c380 0.13 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3.9hours 50degrees group 82.1 J2000 30 30 15 01:00:00 FALSE c16_o082.1REP P051+49 P043+49 P035+49 3c380 c16_o082.1REP P051+49/PP c16_o082.1REP P043+49/PP c16_o082.1REP P035+49/PP c16_o082.1REP 3c380/CP 03:26:39.58hours 48:55:55.8degrees P051+49 J2000 02:55:09.71hours 48:52:05.2degrees P043+49 J2000 02:23:41.13hours 48:48:10.2degrees P035+49 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o028.2REP c16_o028.2REP P059+67 P046+66 P033+66 3c196 0.14 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 6.1hours 50degrees group 28.2 J2000 30 30 15 01:00:00 FALSE c16_o028.2REP P059+67 P046+66 P033+66 3c196 c16_o028.2REP P059+67/PP c16_o028.2REP P046+66/PP c16_o028.2REP P033+66/PP c16_o028.2REP 3c196/CP 03:56:06.68hours 66:33:13.7degrees P059+67 J2000 03:04:07.88hours 66:26:59.4degrees P046+66 J2000 02:12:22.31hours 66:20:33.3degrees P033+66 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o066.1REP c16_o066.1REP P109+52 P101+52 P092+52 3c196 0.15 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.7hours 50degrees group 66.1 J2000 30 30 15 01:00:00 FALSE c16_o066.1REP P109+52 P101+52 P092+52 3c196 c16_o066.1REP P109+52/PP c16_o066.1REP P101+52/PP c16_o066.1REP P092+52/PP c16_o066.1REP 3c196/CP 07:17:38.36hours 51:51:33.3degrees P109+52 J2000 06:44:07.15hours 51:48:17.2degrees P101+52 J2000 06:10:38.42hours 51:44:53.9degrees P092+52 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o091.1REP c16_o091.1REP P103+47 P095+47 P088+47 3c196 0.16 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.4hours 50degrees group 91.1 J2000 30 30 15 01:00:00 FALSE c16_o091.1REP P103+47 P095+47 P088+47 3c196 c16_o091.1REP P103+47/PP c16_o091.1REP P095+47/PP c16_o091.1REP P088+47/PP c16_o091.1REP 3c196/CP 06:54:02.38hours 46:48:07.6degrees P103+47 J2000 06:23:47.70hours 46:45:06.2degrees P095+47 J2000 05:53:34.76hours 46:41:58.8degrees P088+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o253.1REP c16_o253.1REP P147+35 P141+34 P135+34 3c196 0.17 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 10.4hours 50degrees group 253.1 J2000 30 30 15 01:00:00 FALSE c16_o253.1REP P147+35 P141+34 P135+34 3c196 c16_o253.1REP P147+35/PP c16_o253.1REP P141+34/PP c16_o253.1REP P135+34/PP c16_o253.1REP 3c196/CP 09:51:57.49hours 34:31:08.3degrees P147+35 J2000 09:26:49.65hours 34:29:02.9degrees P141+34 J2000 09:01:42.44hours 34:26:55.0degrees P135+34 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o156.1REP c16_o156.1REP P045+41 P038+41 P032+41 3c380 0.18 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3.6hours 50degrees group 156.1 J2000 30 30 15 01:00:00 FALSE c16_o156.1REP P045+41 P038+41 P032+41 3c380 c16_o156.1REP P045+41/PP c16_o156.1REP P038+41/PP c16_o156.1REP P032+41/PP c16_o156.1REP 3c380/CP 03:03:11.55hours 41:21:19.8degrees P045+41 J2000 02:35:36.77hours 41:17:55.0degrees P038+41 J2000 02:08:03.45hours 41:14:27.3degrees P032+41 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o157.2REP c16_o157.2REP P042+41 P035+41 P028+41 3c196 0.19 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 5.4hours 50degrees group 157.2 J2000 30 30 15 01:00:00 FALSE c16_o157.2REP P042+41 P035+41 P028+41 3c196 c16_o157.2REP P042+41/PP c16_o157.2REP P035+41/PP c16_o157.2REP P028+41/PP c16_o157.2REP 3c196/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o124.3REP c16_o124.3REP P040+44 P033+44 P026+44 3c196 0.2 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.2hours 50degrees group 124.3 J2000 30 30 15 01:00:00 FALSE c16_o124.3REP P040+44 P033+44 P026+44 3c196 c16_o124.3REP P040+44/PP c16_o124.3REP P033+44/PP c16_o124.3REP P026+44/PP c16_o124.3REP 3c196/CP 02:42:22.11hours 43:49:20.7degrees P040+44 J2000 02:13:40.58hours 43:45:44.9degrees P033+44 J2000 01:45:00.79hours 43:42:06.2degrees P026+44 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o328.1REP c16_o328.1REP P174+30 P168+30 P162+30 3c196 0.21 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.2hours 50degrees group 328.1 J2000 30 30 15 01:00:00 FALSE c16_o328.1REP P174+30 P168+30 P162+30 3c196 c16_o328.1REP P174+30/PP c16_o328.1REP P168+30/PP c16_o328.1REP P162+30/PP c16_o328.1REP 3c196/CP 11:37:54.86hours 29:38:25.5degrees P174+30 J2000 11:14:05.40hours 29:36:33.6degrees P168+30 J2000 10:50:16.39hours 29:34:39.9degrees P162+30 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o177.2REP c16_o177.2REP P198+40 P181+40 P174+40 3c295 0.22 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 15.1hours 50degrees group 177.2 J2000 30 30 15 01:00:00 FALSE c16_o177.2REP P198+40 P181+40 P174+40 3c295 c16_o177.2REP P198+40/PP c16_o177.2REP P181+40/PP c16_o177.2REP P174+40/PP c16_o177.2REP 3c295/CP 13:12:16.13hours 39:48:13.8degrees P198+40 J2000 12:04:54.82hours 39:42:54.3degrees P181+40 J2000 11:37:59.74hours 39:40:47.7degrees P174+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o404.1REP c16_o404.1REP P229+25 P224+25 P218+25 3c295 0.23 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 16hours 50degrees group 404.1 J2000 30 30 15 01:00:00 FALSE c16_o404.1REP P229+25 P224+25 P218+25 3c295 c16_o404.1REP P229+25/PP c16_o404.1REP P224+25/PP c16_o404.1REP P218+25/PP c16_o404.1REP 3c295/CP 15:19:56.61hours 24:55:17.5degrees P229+25 J2000 14:57:06.66hours 24:53:18.9degrees P224+25 J2000 14:34:17.56hours 24:51:21.7degrees P218+25 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o125.2REP c16_o125.2REP P022+44 P015+44 P008+44 3c380 0.24 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 4hours 50degrees group 125.2 J2000 30 30 15 01:00:00 FALSE c16_o125.2REP P022+44 P015+44 P008+44 3c380 c16_o125.2REP P022+44/PP c16_o125.2REP P015+44/PP c16_o125.2REP P008+44/PP c16_o125.2REP 3c380/CP 01:30:41.56hours 43:40:15.9degrees P022+44 J2000 01:02:04.41hours 43:36:34.4degrees P015+44 J2000 00:33:29.25hours 43:32:50.8degrees P008+44 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o065.2REP c16_o065.2REP P049+54 P040+54 P031+54 3c196 0.25 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 5.7hours 50degrees group 65.2 J2000 30 30 15 01:00:00 FALSE c16_o065.2REP P049+54 P040+54 P031+54 3c196 c16_o065.2REP P049+54/PP c16_o065.2REP P040+54/PP c16_o065.2REP P031+54/PP c16_o065.2REP 3c196/CP 03:16:37.11hours 53:55:51.2degrees P049+54 J2000 02:41:27.93hours 53:51:31.9degrees P040+54 J2000 02:06:22.42hours 53:47:07.6degrees P031+54 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o157.3REP c16_o157.3REP P042+41 P035+41 P028+41 3c196 0.26 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 7.4hours 50degrees group 157.3 J2000 30 30 15 01:00:00 FALSE c16_o157.3REP P042+41 P035+41 P028+41 3c196 c16_o157.3REP P042+41/PP c16_o157.3REP P035+41/PP c16_o157.3REP P028+41/PP c16_o157.3REP 3c196/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o217.1REP c16_o217.1REP P141+37 P135+37 P128+37 3c196 0.27 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 10hours 50degrees group 217.1 J2000 30 30 15 01:00:00 FALSE c16_o217.1REP P141+37 P135+37 P128+37 3c196 c16_o217.1REP P141+37/PP c16_o217.1REP P135+37/PP c16_o217.1REP P128+37/PP c16_o217.1REP 3c196/CP 09:27:28.12hours 36:59:41.6degrees P141+37 J2000 09:01:32.63hours 36:57:29.6degrees P135+37 J2000 08:35:37.90hours 36:55:14.4degrees P128+37 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o290.1REP c16_o290.1REP P158+32 P152+32 P145+32 3c196 0.28 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 11.1hours 50degrees group 290.1 J2000 30 30 15 01:00:00 FALSE c16_o290.1REP P158+32 P152+32 P145+32 3c196 c16_o290.1REP P158+32/PP c16_o290.1REP P152+32/PP c16_o290.1REP P145+32/PP c16_o290.1REP 3c196/CP 10:32:43.33hours 32:03:51.4degrees P158+32 J2000 10:08:17.30hours 32:01:52.9degrees P152+32 J2000 09:43:51.81hours 31:59:52.6degrees P145+32 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o253.2REP c16_o253.2REP P147+35 P141+34 P135+34 3c196 0.29 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 12.4hours 50degrees group 253.2 J2000 30 30 15 01:00:00 FALSE c16_o253.2REP P147+35 P141+34 P135+34 3c196 c16_o253.2REP P147+35/PP c16_o253.2REP P141+34/PP c16_o253.2REP P135+34/PP c16_o253.2REP 3c196/CP 09:51:57.49hours 34:31:08.3degrees P147+35 J2000 09:26:49.65hours 34:29:02.9degrees P141+34 J2000 09:01:42.44hours 34:26:55.0degrees P135+34 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o107.1REP c16_o107.1REP P218+45 P210+45 P203+45 3c295 0.3 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 15.1hours 50degrees group 107.1 J2000 30 30 15 01:00:00 FALSE c16_o107.1REP P218+45 P210+45 P203+45 3c295 c16_o107.1REP P218+45/PP c16_o107.1REP P210+45/PP c16_o107.1REP P203+45/PP c16_o107.1REP 3c295/CP 14:32:55.87hours 44:55:58.7degrees P218+45 J2000 14:03:41.29hours 44:53:32.2degrees P210+45 J2000 13:34:27.42hours 44:51:09.5degrees P203+45 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o173.1REP c16_o173.1REP P238+40 P231+40 P225+40 3c295 0.31 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 16.5hours 50degrees group 173.1 J2000 30 30 15 01:00:00 FALSE c16_o173.1REP P238+40 P231+40 P225+40 3c295 c16_o173.1REP P238+40/PP c16_o173.1REP P231+40/PP c16_o173.1REP P225+40/PP c16_o173.1REP 3c295/CP 15:54:17.33hours 40:01:54.9degrees P238+40 J2000 15:27:14.85hours 39:59:29.2degrees P231+40 J2000 15:00:13.31hours 39:57:07.7degrees P225+40 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o044.1REP c16_o044.1REP P264+63 P253+63 P241+63 3c295 0.32 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 17.9hours 50degrees group 44.1 J2000 30 30 15 01:00:00 FALSE c16_o044.1REP P264+63 P253+63 P241+63 3c295 c16_o044.1REP P264+63/PP c16_o044.1REP P253+63/PP c16_o044.1REP P241+63/PP c16_o044.1REP 3c295/CP 17:37:19.47hours 62:46:53.2degrees P264+63 J2000 16:52:04.68hours 62:42:22.5degrees P253+63 J2000 16:06:56.60hours 62:38:05.9degrees P241+63 J2000 14:11:20.519hours 52:12:09.97degrees 3c295 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o157.1REP c16_o157.1REP P042+41 P035+41 P028+41 3c380 0.33 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 3.5hours 50degrees group 157.1 J2000 30 30 15 01:00:00 FALSE c16_o157.1REP P042+41 P035+41 P028+41 3c380 c16_o157.1REP P042+41/PP c16_o157.1REP P035+41/PP c16_o157.1REP P028+41/PP c16_o157.1REP 3c380/CP 02:49:23.98hours 41:19:37.8degrees P042+41 J2000 02:21:49.92hours 41:16:11.4degrees P035+41 J2000 01:54:17.34hours 41:12:42.5degrees P028+41 J2000 18:29:31.781hours 48:44:46.159degrees 3c380 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| +c16_o094.1REP c16_o094.1REP P077+47 P069+47 P062+47 3c196 0.34 A dynamic 2023-06-27 00:36:00,2023-07-02 23:59:00| require_day 50 30 00:00:00 00:10:00 5.6hours 50degrees group 94.1 J2000 30 30 15 01:00:00 FALSE c16_o094.1REP P077+47 P069+47 P062+47 3c196 c16_o094.1REP P077+47/PP c16_o094.1REP P069+47/PP c16_o094.1REP P062+47/PP c16_o094.1REP 3c196/CP 05:08:18.70hours 46:37:06.3degrees P077+47 J2000 04:38:10.31hours 46:33:44.8degrees P069+47 J2000 04:08:03.83hours 46:30:16.7degrees P062+47 J2000 08:13:36.07hours 48:13:02.5degrees 3c196 J2000 4 8 FALSE FALSE FALSE CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509:4|RS508,RS509:1|RS310,RS210:0| \ No newline at end of file diff --git a/SAS/TMSS/backend/test/t_permissions_system_roles.py b/SAS/TMSS/backend/test/t_permissions_system_roles.py index b5e7042e4c4afeb4a2f3ad5e4408484ed71c0324..c3b662abfb6c82b0c03bdfe86797a16512624041 100755 --- a/SAS/TMSS/backend/test/t_permissions_system_roles.py +++ b/SAS/TMSS/backend/test/t_permissions_system_roles.py @@ -68,8 +68,11 @@ class SystemPermissionTestCase(unittest.TestCase): ''' @classmethod - def create_subtask(cls) -> int: - # Create preparatory data + def create_subtask(cls) -> (int, int): + """ + returns ids of the created Subtask and its related TaskBlueprint + """ + # Create preparatory data, with tmss_test_env.create_tmss_client() as client: test_data_creator.wipe_cache() @@ -92,13 +95,13 @@ class SystemPermissionTestCase(unittest.TestCase): obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url']), '/subtask_output/') test_data_creator.post_data_and_get_url(test_data_creator.Dataproduct(filename="L%s_SB000.MS" % obs_subtask['id'], subtask_output_url=obs_subtask_output_url), '/dataproduct/') - return obs_subtask['id'] + return obs_subtask['id'], obs_task_blueprint['id'] @classmethod def setUpClass(cls) -> None: super().setUpClass() - cls.obs_subtask_id = cls.create_subtask() + cls.obs_subtask_id, cls.obs_taskblueprint_id = cls.create_subtask() # Create test_data_creator as regular user cls.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, requests.auth.HTTPBasicAuth('paulus', 'pauluspass')) @@ -107,8 +110,9 @@ class SystemPermissionTestCase(unittest.TestCase): # Populate permissions tmss_test_env.populate_permissions() - # Retrieve operator system role + # Retrieve operator and support system roles cls.operator_group = Group.objects.get(name='operator') + cls.support_group = Group.objects.get(name='support') def setUp(self): super().setUp() @@ -328,7 +332,6 @@ class SystemPermissionTestCase(unittest.TestCase): 200, auth=self.test_data_creator.auth) - def test_Subtask_cannot_process_feedback_and_set_to_finished_if_complete_without_operator_group(self): user = User.objects.get(username='paulus') user.groups.set([]) @@ -362,7 +365,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the process_feedback_and_set_to_finished_if_complete_subtask permission self.assertTrue(user.has_perm('tmssapp.process_feedback_and_set_to_finished_if_complete_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to finishing, so it can process feedback and set to finished. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'finishing') @@ -410,7 +413,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the schedule_subtask permission self.assertTrue(user.has_perm('tmssapp.schedule_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to defined, so it can be scheduled. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'defined') @@ -583,7 +586,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the unschedule_subtask permission self.assertTrue(user.has_perm('tmssapp.unschedule_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to scheduled, so it can be unscheduled. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'scheduled') @@ -594,6 +597,45 @@ class SystemPermissionTestCase(unittest.TestCase): None, auth=self.test_data_creator.auth) + def test_TaskBlueprint_cannot_predecessors_without_support_group(self): + user = User.objects.get(username='paulus') + user.groups.set([]) + + # refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching + user = User.objects.get(username='paulus') + while user.has_perm('tmssapp.predecessors_taskblueprint'): + user = User.objects.get(username='paulus') + + # Assert support group has the predecessors_taskblueprint permission + self.assertIsNotNone(self.support_group.permissions.all().filter(codename='predecessors_taskblueprint')) + # Assert Paulus does not have the predecessors_taskblueprint permission + self.assertFalse(user.has_perm('tmssapp.predecessors_taskblueprint')) + + # Try to predecessors taskblueprint and assert Paulus can't do it without the support group permissions. + response = GET_and_assert_equal_expected_code(self, + BASE_URL + '/task_blueprint/%s/predecessors/' % self.obs_taskblueprint_id, + 403, + auth=self.test_data_creator.auth) + + def test_TaskBlueprint_can_predecessors_with_support_group(self): + user = User.objects.get(username='paulus') + user.groups.set([self.support_group]) + + # refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching + user = User.objects.get(username='paulus') + while not user.has_perm('tmssapp.predecessors_taskblueprint'): + user = User.objects.get(username='paulus') + + # Assert support group has the predecessors_taskblueprint permission + self.assertIsNotNone(self.support_group.permissions.all().filter(codename='predecessors_taskblueprint')) + # Assert Paulus does not have the predecessors_taskblueprint permission + self.assertTrue(user.has_perm('tmssapp.predecessors_taskblueprint')) + + # Try to predecessors taskblueprint and assert Paulus can't do it without the support group permissions. + response = GET_and_assert_equal_expected_code(self, + BASE_URL + '/task_blueprint/%s/predecessors/' % self.obs_taskblueprint_id, + 200, + auth=self.test_data_creator.auth) if __name__ == "__main__": logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js index 631efefaca4d62c2c3437302f07ea5db9de3299e..a95355c509cf0b251b6e1d502ffc6c40c4030b5c 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js @@ -81,7 +81,6 @@ export class SchedulingUnitCreate extends Component { this.taskFilters = []; // To get Short_Description details this.priorityQueueTypes = []; this.projects = []; // All projects to load project dropdown - this.schedulingSets = []; // All scheduling sets to be filtered for project this.observStrategies = []; // All Observing strategy templates this.taskTemplates = []; // All task templates to be filtered based on tasks in selected strategy template this.tooltipOptions = UIConstants.tooltipOptions; @@ -120,8 +119,7 @@ export class SchedulingUnitCreate extends Component { async componentDidMount() { const permission = await AuthUtil.getUserPermissionByModule('scheduleunit_draft'); this.setState({userrole: permission}); - const promises = [ ProjectService.getProjectList(), - ScheduleService.getSchedulingSets(), + const promises = [ ProjectService.getProjectList(false, 'name,url'), TaskService.getTaskTemplates(), ScheduleService.getSchedulingConstraintTemplates(), ScheduleService.getStationGroup(), @@ -131,17 +129,16 @@ export class SchedulingUnitCreate extends Component { ScheduleService.getStrategyState(), ProjectService.getMyRoles(), ]; - Promise.all(promises).then(responses => { + Promise.all(promises).then(async(responses) => { this.projects = responses[0]; - this.schedulingSets = responses[1]; - this.taskTemplates = responses[2]; - this.constraintTemplates = responses[3]; - this.stations = responses[4]; - this.priorityQueueTypes = responses[5]; - this.taskFilters = responses[6]; - this.templatePurposes = this.getStrategyFilterOptions(responses[7], 'purpose'); - this.templateState = this.getStrategyFilterOptions(responses[8], 'state'); - this.myRoles = responses[9]; + this.taskTemplates = responses[1]; + this.constraintTemplates = responses[2]; + this.stations = responses[3]; + this.priorityQueueTypes = responses[4]; + this.taskFilters = responses[5]; + this.templatePurposes = this.getStrategyFilterOptions(responses[6], 'purpose'); + this.templateState = this.getStrategyFilterOptions(responses[7], 'state'); + this.myRoles = responses[8]; if(_.intersection(this.myRoles.system_roles, ['superuser', 'operator', 'support']).length < 1) { this.projects = _.filter(this.projects, (project)=>{ return _.includes(this.myRoles.project_roles[project.name], 'shared_support') @@ -151,7 +148,7 @@ export class SchedulingUnitCreate extends Component { this.constraintStrategy(this.constraintTemplates[0]); if (this.state.schedulingUnit.project) { const selectedProject = _.filter(this.projects, {'name': this.state.schedulingUnit.project}); - const projectSchedSets = _.filter(this.schedulingSets, {'project_id': this.state.schedulingUnit.project}); + const projectSchedSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(this.state.schedulingUnit.project)}`); let tmpSU = this.state.schedulingUnit; tmpSU['output_pinned'] = selectedProject[0].auto_pin; this.setState({isLoading: false, @@ -186,8 +183,8 @@ export class SchedulingUnitCreate extends Component { * Function to call on change of project and reload scheduling set dropdown * @param {string} projectName */ - changeProject(projectName) { - const projectSchedSets = _.filter(this.schedulingSets, {'project_id': projectName}); + async changeProject(projectName) { + const projectSchedSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(projectName)}`); let schedulingUnit = this.state.schedulingUnit; schedulingUnit.project = projectName; schedulingUnit.scheduling_set_id = null; @@ -792,8 +789,7 @@ export class SchedulingUnitCreate extends Component { async refreshSchedulingSet(){ let tmpSU = _.cloneDeep(this.state.schedulingUnit); - this.schedulingSets = await ScheduleService.getSchedulingSets(); - const filteredSchedluingSets = _.filter(this.schedulingSets, {'project_id': this.state.schedulingUnit.project}); + const schedulingSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(this.state.schedulingUnit.project)}`); if (this.state.newSet) { tmpSU.scheduling_set_id = this.state.newSet.id; await this.setState({ @@ -801,7 +797,7 @@ export class SchedulingUnitCreate extends Component { newSet: null }); } - this.setState({saveDialogVisible: false, showAddSet: false, schedulingSets: filteredSchedluingSets}); + this.setState({saveDialogVisible: false, showAddSet: false, schedulingSets: schedulingSets}); } /** diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.test.js index e5064ebd949d6f38d43d5722fb58f046bec39193..61ef131908e8063b91a7369da72b318fb1d68078 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.test.js @@ -45,7 +45,11 @@ const setMockSpy = async () => { projectListSpy = jest.spyOn(ProjectService, 'getProjectList'); projectListSpy.mockImplementation(() => { return Promise.resolve(ProjectServiceMock.projectList)}); scheduleSetListSpy = jest.spyOn(ScheduleService, 'getSchedulingSets'); - scheduleSetListSpy.mockImplementation(() => { return Promise.resolve(SUServiceMock.scheduleSetList)}); + scheduleSetListSpy.mockImplementation((filter) => { + let allSUSets = SUServiceMock.scheduleSetList; + let project = filter.replace("project=",""); + return Promise.resolve(_.filter(allSUSets, {project_id: project})); + }); observStrategiesSpy = jest.spyOn(ScheduleService, 'getObservationStrategies'); // observStrategiesSpy.mockImplementation(() => { return Promise.resolve(SUServiceMock.observStrategies)}); observStrategiesSpy.mockImplementation(() => { return Promise.resolve(SUServiceMock.getObservStrategies())}); @@ -147,7 +151,6 @@ it(" 1. renders SU create page with all fields and default values", async() => { expect(content.queryByText('Scheduling Unit - Add')).not.toBe(null); // Page loaded successfully expect(projectListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(observStrategiesSpy).toHaveBeenCalled(); // Mock Spy called successfully - expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(taskTemplatesSpy).toHaveBeenCalled(); // Mock Spy called successfully const nameInputEl = content.queryByTestId('name'); @@ -159,9 +162,13 @@ it(" 1. renders SU create page with all fields and default values", async() => { expect(descInputEl.value).toBe("SU High 1 Desc"); const projInputEl = content.getAllByRole("listbox")[0].children[0] ; - fireEvent.click(projInputEl); + await act(async () => { + fireEvent.click(projInputEl); + await new Promise((r) => setTimeout(r, 500)); + }); expect(content.queryAllByText("high").length).toBe(3); - + expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully + const suSetInputEl = content.getAllByRole("listbox")[1].children[0] ; fireEvent.click(suSetInputEl); expect(content.queryAllByText("Test Scheduling Set").length).toBe(1); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js index 81ec3d6fb03fb96e59513b1e51f265f1556571a6..c5b0b77870c9436f800fcea4782a8fa4215f5f62 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js @@ -184,8 +184,7 @@ export class EditSchedulingUnit extends Component { } async componentDidMount() { - const promises = [ ProjectService.getProjectList(), - ScheduleService.getSchedulingSets(), + const promises = [ ProjectService.getProjectList(false, 'name,url'), ScheduleService.getObservationStrategies(), TaskService.getTaskTemplates(), ScheduleService.getSchedulingUnitDraftById(this.props.match.params.id), @@ -199,39 +198,38 @@ export class EditSchedulingUnit extends Component { this.setState({permissionById: permissionById}) Promise.all(promises).then(responses => { this.projects = responses[0]; - this.schedulingSets = responses[1]; - this.observStrategies = responses[2]; - this.taskTemplates = responses[3]; - this.constraintTemplates = responses[6]; - this.stations = responses[7]; - this.priorityQueueTypes = responses[8]; - this.taskFilters = responses[9]; - responses[4].project = this.schedulingSets.find(i => i.id === responses[4].scheduling_set_id).project_id; - let taskOutputPinned = responses[5].data.results[0].output_pinned; + this.observStrategies = responses[1]; + this.taskTemplates = responses[2]; + this.constraintTemplates = responses[5]; + this.stations = responses[6]; + this.priorityQueueTypes = responses[7]; + this.taskFilters = responses[8]; + this.schedulingSets = [responses[3].scheduling_set_object] + responses[3].project = this.schedulingSets[0].project_id; + let taskOutputPinned = responses[4].data.results[0].output_pinned; let triStateValue = true; - responses[5].data.results.forEach( task => { + responses[4].data.results.forEach( task => { if (taskOutputPinned !== task.output_pinned) { triStateValue = null; } }); if (triStateValue === true) { // All values are same in tasks - responses[4]['output_pinned'] = taskOutputPinned; + responses[3]['output_pinned'] = taskOutputPinned; } else { // if output_pinned values are different in tasks - responses[4]['output_pinned'] = null; + responses[3]['output_pinned'] = null; } - this.setState({ schedulingUnit: responses[4], taskDrafts: responses[5].data.results, - observStrategyVisible: responses[4].observation_strategy_template_id?true:false }); - this.changeStrategy(responses[4].observation_strategy_template_id); - const targetObservation = responses[5].data.results.find(task => {return task.template.type_value === 'observation' && task.specifications_doc.station_configuration?.station_groups?true:false}); + this.setState({ schedulingUnit: responses[3], taskDrafts: responses[4].data.results, + observStrategyVisible: responses[3].observation_strategy_template_id?true:false }); + this.changeStrategy(responses[3].observation_strategy_template_id); + const targetObservation = responses[4].data.results.find(task => {return task.template.type_value === 'observation' && task.specifications_doc.station_configuration?.station_groups?true:false}); this.setState({ stationGroup: targetObservation ? targetObservation.specifications_doc.station_configuration?.station_groups : [] }); if (this.state.schedulingUnit.project) { - const projectSchedSets = _.filter(this.schedulingSets, {'project_id': this.state.schedulingUnit.project}); - this.setState({isLoading: false, schedulingSets: projectSchedSets}); + this.setState({isLoading: false, schedulingSets: this.schedulingSets}); } else { this.setState({isLoading: false}); } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js index bc80706aa3f8d01d0c4ad80497f0cd26f2b696a5..5310c03a4b0006c095efd66c0af131ea2798a59f 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js @@ -194,12 +194,10 @@ export class SchedulingSetCreate extends Component { this.dialogMsg = ""; this.dialogContent = ""; this.projects = []; // All projects to load project dropdown - this.schedulingSets = []; // All scheduling sets to be filtered for project this.observStrategies = []; // All Observing strategy templates this.taskTemplates = []; // All task templates to be filtered based on tasks in selected strategy template this.taskTemplateSchemas = []; this.constraintTemplates = []; - this.stationGroupsList = []; this.agSUWithDefaultValue = {'id': 0, 'suname': '', 'sudesc': '', isDirty: false}; this.emptyAGSU = {}; this.priorityQueuelist = []; @@ -301,8 +299,8 @@ export class SchedulingSetCreate extends Component { * Function to call on change of project and reload scheduling set dropdown * @param {string} projectName */ - changeProject(projectName) { - const projectSchedluingSets = _.filter(this.schedulingSets, {'project_id': projectName}); + async changeProject(projectName) { + const projectSchedluingSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(projectName)}`); let schedulingUnit = this.state.schedulingUnit; schedulingUnit.project = projectName; const selectedProject = _.filter(this.projects, {'name': projectName}); @@ -488,8 +486,7 @@ export class SchedulingSetCreate extends Component { /** After adding new Scheduling Set, refresh the Scheduling Set list */ async refreshSchedulingSet(){ let tmpSU = _.cloneDeep(this.state.schedulingUnit); - this.schedulingSets = await ScheduleService.getSchedulingSets(); - const filteredSchedluingSets = _.filter(this.schedulingSets, {'project_id': this.state.schedulingUnit.project}); + const schedulingSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(this.state.schedulingUnit.project)}`); if (this.state.newSet) { tmpSU.scheduling_set_id = this.state.newSet.id; await this.setState({ @@ -497,7 +494,7 @@ export class SchedulingSetCreate extends Component { newSet: null }); } - this.setState({addSchedulingSetVisible: false, confirmDialogVisible: false, schedulingSets: filteredSchedluingSets, observStrategy: {}}); + this.setState({addSchedulingSetVisible: false, confirmDialogVisible: false, schedulingSets: schedulingSets, observStrategy: {}}); this.setSchedulingSetParams('scheduling_set_id',tmpSU.scheduling_set_id); } @@ -554,8 +551,7 @@ export class SchedulingSetCreate extends Component { async componentDidMount() { const promises = [ - ProjectService.getProjectList(), - ScheduleService.getSchedulingSets(), + ProjectService.getProjectList(false, 'name,url'), ScheduleService.getObservationStrategies(), TaskService.getTaskTemplates(), ScheduleService.getSchedulingConstraintTemplates(), @@ -567,18 +563,16 @@ export class SchedulingSetCreate extends Component { ]; const permission = await AuthUtil.getUserPermissionByModule('scheduleunit_draft'); this.setState({userrole: permission}); - await Promise.all(promises).then(responses => { + await Promise.all(promises).then(async(responses) => { this.projects = responses[0]; - this.schedulingSets = responses[1]; - this.observStrategies = responses[2]; - this.taskTemplates = responses[3]; - this.constraintTemplates = responses[4]; - this.priorityQueuelist = responses[5]; - this.taskFilters = responses[6]; - this.stationGroupsList = responses[7]; - this.templatePurposes = this.getStrategyFilterOptions(responses[7], 'purpose'); - this.templateState = this.getStrategyFilterOptions(responses[8], 'state'); - this.myRoles = responses[9]; + this.observStrategies = responses[1]; + this.taskTemplates = responses[2]; + this.constraintTemplates = responses[3]; + this.priorityQueuelist = responses[4]; + this.taskFilters = responses[5]; + this.templatePurposes = this.getStrategyFilterOptions(responses[6], 'purpose'); + this.templateState = this.getStrategyFilterOptions(responses[7], 'state'); + this.myRoles = responses[8]; if(_.intersection(this.myRoles.system_roles, ['superuser', 'operator', 'support']).length < 1) { this.projects = _.filter(this.projects, (project)=>{ return _.includes(this.myRoles.project_roles[project.name], 'shared_support') @@ -592,8 +586,8 @@ export class SchedulingSetCreate extends Component { }); } if (this.state.schedulingUnit.project) { - const projectSchedluingSets = _.filter(this.schedulingSets, {'project_id': this.state.schedulingUnit.project}); - this.setState({isLoading: false, schedulingSets: projectSchedluingSets, allSchedulingSets: this.schedulingSets,priorityQueuelist:queueList}); + const projectSchedluingSets = await ScheduleService.getSchedulingSets(`project=${encodeURIComponent(this.state.schedulingUnit.project)}`); + this.setState({isLoading: false, schedulingSets: projectSchedluingSets, priorityQueuelist:queueList}); } else { this.setState({isLoading: false,priorityQueuelist:queueList}); } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.test.js index e946dd21ef80b306a78939ec7138f75be348c94a..6fa75aa39e3e0899ec0ad93b22d715ebf00e6fa3 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.test.js @@ -43,7 +43,11 @@ const setMockSpy = () => { projectListSpy = jest.spyOn(ProjectService, 'getProjectList'); projectListSpy.mockImplementation(() => { return Promise.resolve(ProjectServiceMock.projectList)}); scheduleSetListSpy = jest.spyOn(ScheduleService, 'getSchedulingSets'); - scheduleSetListSpy.mockImplementation(() => { return Promise.resolve(SUServiceMock.scheduleSetList)}); + scheduleSetListSpy.mockImplementation((filter) => { + let allSUSets = SUServiceMock.scheduleSetList; + let project = filter.replace("project=",""); + return Promise.resolve(_.filter(allSUSets, {project_id: project})); + }); observStrategiesSpy = jest.spyOn(ScheduleService, 'getObservationStrategies'); observStrategiesSpy.mockImplementation(() => { return Promise.resolve(SUServiceMock.getObservStrategies())}); taskTemplatesSpy = jest.spyOn(TaskService, 'getTaskTemplates'); @@ -130,23 +134,28 @@ it("renders SU Set create page with all fields and default values", async() => { expect(content.queryByText('Scheduling Unit(s)')).toBe(null); // AG Grid not visible expect(projectListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(observStrategiesSpy).toHaveBeenCalled(); // Mock Spy called successfully - expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(taskTemplatesSpy).toHaveBeenCalled(); // Mock Spy called successfully //It is disabled before select any project expect(content.queryByTestId('addSet')).toHaveAttribute("disabled"); const projInputEl = content.getAllByRole("listbox")[0].children[0] ; - fireEvent.click(projInputEl); + await act( async() => { + fireEvent.click(projInputEl); + await new Promise((r) => setTimeout(r, 500)); + }); + expect(content.queryAllByText("high").length).toBe(3); - + expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully // It should be enabled after select project expect(content.queryByTestId('addSet').hasAttribute("disabled")).toBeFalsy(); - const suSetInputEl = content.getAllByRole("listbox")[1].children[0] ; - fireEvent.click(suSetInputEl); + expect(content.queryAllByText("Test Scheduling Set").length).toBe(1); + await act( async() => { + fireEvent.click(suSetInputEl); + await new Promise((r) => setTimeout(r, 500)); + }); expect(content.queryAllByText("Test Scheduling Set").length).toBe(3); - expect(content.queryByTestId('save-btn').hasAttribute("disabled")).toBeFalsy(); }); @@ -162,15 +171,19 @@ it("renders AG grid loaded in SU Set create Page", async() => { expect(content.queryByText('Scheduling Unit(s)')).toBe(null); // AG Grid not visible expect(projectListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(observStrategiesSpy).toHaveBeenCalled(); // Mock Spy called successfully - expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully expect(taskTemplatesSpy).toHaveBeenCalled(); // Mock Spy called successfully //It is disabled before select any project expect(content.queryByTestId('addSet')).toHaveAttribute("disabled"); const projInputEl = content.getAllByRole("listbox")[0].children[0] ; - fireEvent.click(projInputEl); + expect(content.queryAllByText("high").length).toBe(1); + await act( async() => { + fireEvent.click(projInputEl); + await new Promise((r) => setTimeout(r, 1000)); + }); expect(content.queryAllByText("high").length).toBe(3); + expect(scheduleSetListSpy).toHaveBeenCalled(); // Mock Spy called successfully // It should be enabled after select project expect(content.queryByTestId('addSet').hasAttribute("disabled")).toBeFalsy(); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js index 341742ae3637e78124ec819d80359f18f89cc0bd..c4859101f9c159358d8420d15bd86ef64f4f75a8 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js @@ -259,9 +259,9 @@ const ProjectService = { * @param {Booleab} fetchQuota - flag to fetch quota or not * @returns [] - array of project objects with/without quota populated. */ - getProjectList: async function(fetchQuota) { + getProjectList: async function(fetchQuota, fields) { try { - const response = await axios.get(`/api/project/?${fetchQuota? 'expand=quota': ''}`); + const response = await axios.get(`/api/project/?${fields?'fields='+fields:''}${fetchQuota? 'expand=quota': ''}`); return response.data.results; } catch (error) { console.error('[project.services.getProjectList]',error); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js index 3f1672676a7684d11aa86d3326f22267510fa75f..e787e4cbf718618fd80aee4a9b21a67d5d0534da 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js @@ -673,10 +673,19 @@ const ScheduleService = { return null; }; }, - getSchedulingSets: async function () { + getSchedulingSets: async function (filter) { try { - const response = await axios.get('/api/scheduling_set/'); - return response.data.results; + let schedulingSet = []; + const fields = 'id,name,description,url,project,project_id,url'; + let response = await axios.get(`/api/scheduling_set/?${filter?filter:''}&fields=${fields}&ordering=name`); + schedulingSet = schedulingSet.concat(response.data.results); + const totalCount = response.data.count; + const initialCount = response.data.results.length; + if(totalCount > initialCount) { + response = await axios.get(`/api/scheduling_set/?${filter?filter:''}&fields=${fields}&ordering=name&limit=${totalCount - initialCount}&offset=${initialCount}`); + schedulingSet = schedulingSet.concat(response.data.results); + } + return schedulingSet; } catch (error) { console.error(error); return [];