Skip to content
Snippets Groups Projects
Commit 5c4df56a authored by Reinder Kraaij's avatar Reinder Kraaij :eye:
Browse files

Merge branch 'TMSS-Code-CleanUp-Part-II-Front-End-Only' into 'master'

Tmss code clean up part ii front end only

See merge request !1265
parents f53a6472 3d47b203
No related branches found
No related tags found
1 merge request!1265Tmss code clean up part ii front end only
Showing
with 29129 additions and 17204 deletions
...@@ -80,6 +80,8 @@ variables: ...@@ -80,6 +80,8 @@ variables:
# #
prepare_ci_base_docker_image: prepare_ci_base_docker_image:
stage: prepare-base stage: prepare-base
rules:
- if: '$CI_COMMIT_BRANCH !~ /Front-End-Only/'
script: script:
- docker build -t ci_base:$CI_COMMIT_SHORT_SHA -f Docker/lofar-ci/Dockerfile_ci_base . - docker build -t ci_base:$CI_COMMIT_SHORT_SHA -f Docker/lofar-ci/Dockerfile_ci_base .
interruptible: true interruptible: true
...@@ -95,6 +97,8 @@ prepare_ci_base_ubuntu_docker_image: ...@@ -95,6 +97,8 @@ prepare_ci_base_ubuntu_docker_image:
# #
prepare_ci_scu_docker_image: prepare_ci_scu_docker_image:
stage: prepare stage: prepare
rules:
- if: '$CI_COMMIT_BRANCH !~ /Front-End-Only/'
needs: needs:
- prepare_ci_base_docker_image - prepare_ci_base_docker_image
script: script:
...@@ -111,6 +115,8 @@ prepare_ci_tmss_docker_image: ...@@ -111,6 +115,8 @@ prepare_ci_tmss_docker_image:
prepare_ci_lta_docker_image: prepare_ci_lta_docker_image:
stage: prepare stage: prepare
rules:
- if: '$CI_COMMIT_BRANCH !~ /Front-End-Only/'
needs: needs:
- prepare_ci_scu_docker_image - prepare_ci_scu_docker_image
script: script:
...@@ -1027,7 +1033,7 @@ sonarcloud_check_TMSS_Frontend: ...@@ -1027,7 +1033,7 @@ sonarcloud_check_TMSS_Frontend:
- ls -al SAS/TMSS/frontend/tmss_webapp - ls -al SAS/TMSS/frontend/tmss_webapp
- echo 'checking restored build output artifacts' - echo 'checking restored build output artifacts'
- ls -al build/gnucxx11_opt/SAS/TMSS/frontend/tmss_webapp/coverage - ls -al build/gnucxx11_opt/SAS/TMSS/frontend/tmss_webapp/coverage
- sonar-scanner -Dproject.settings=SAS/TMSS/frontend/tmss_webapp/sonar-project.properties -X - sonar-scanner -Dproject.settings=SAS/TMSS/frontend/tmss_webapp/sonar-project.properties
eslint_TMSSFrontEnd: eslint_TMSSFrontEnd:
......
This diff is collapsed.
...@@ -160,6 +160,7 @@ ...@@ -160,6 +160,7 @@
"jest-junit": "^16.0.0", "jest-junit": "^16.0.0",
"jest-mock-console": "^2.0.0", "jest-mock-console": "^2.0.0",
"jest-websocket-mock": "^2.5.0", "jest-websocket-mock": "^2.5.0",
"js-beautify": "^1.14.11",
"react-app-rewired": "^2.2.1", "react-app-rewired": "^2.2.1",
"react-scripts": "^5.0.1", "react-scripts": "^5.0.1",
"react-test-renderer": "^18.2.0" "react-test-renderer": "^18.2.0"
......
import { Component } from 'react'; import { Component } from 'react';
import { Redirect, BrowserRouter as Router , withRouter } from 'react-router-dom'; import { Redirect, BrowserRouter as Router, withRouter } from 'react-router-dom';
import classNames from 'classnames'; import classNames from 'classnames';
import AppTopbar from './layout/components/AppTopbar'; import AppTopbar from './layout/components/AppTopbar';
import AppMenu from './layout/components/AppMenu'; import AppMenu from './layout/components/AppMenu';
import { RoutedContent } from './routes'; import { RoutedContent } from './routes';
import AppBreadcrumb from "./layout/components/AppBreadcrumb"; import AppBreadcrumb from "./layout/components/AppBreadcrumb";
import handleResponse from "./response.handler" import handleResponse from "./response.handler"
...@@ -41,7 +41,7 @@ class App extends Component { ...@@ -41,7 +41,7 @@ class App extends Component {
currentPath: '/', currentPath: '/',
PageTitle: '', PageTitle: '',
isBreadCrumbVisible: false, isBreadCrumbVisible: false,
isDateTimeVisible:true, isDateTimeVisible: true,
staticMenuInactive: localStorage.getItem('staticMenuInactive') === 'true', staticMenuInactive: localStorage.getItem('staticMenuInactive') === 'true',
overlayMenuActive: localStorage.getItem('overlayMenuActive') === 'true', overlayMenuActive: localStorage.getItem('overlayMenuActive') === 'true',
mobileMenuActive: localStorage.getItem('mobileMenuActive') === 'true', mobileMenuActive: localStorage.getItem('mobileMenuActive') === 'true',
...@@ -50,9 +50,7 @@ class App extends Component { ...@@ -50,9 +50,7 @@ class App extends Component {
redirect: window.location.pathname === '/' ? '/su/timelineview/week' : window.location.pathname, redirect: window.location.pathname === '/' ? '/su/timelineview/week' : window.location.pathname,
isLogin: true isLogin: true
}; };
this.onWrapperClick = this.onWrapperClick.bind(this);
this.onToggleMenu = this.onToggleMenu.bind(this); this.onToggleMenu = this.onToggleMenu.bind(this);
this.onSidebarClick = this.onSidebarClick.bind(this);
this.onMenuItemClick = this.onMenuItemClick.bind(this); this.onMenuItemClick = this.onMenuItemClick.bind(this);
this.setPageTitle = this.setPageTitle.bind(this); this.setPageTitle = this.setPageTitle.bind(this);
this.logout = this.logout.bind(this); this.logout = this.logout.bind(this);
...@@ -62,56 +60,39 @@ class App extends Component { ...@@ -62,56 +60,39 @@ class App extends Component {
this.ReportSubMenu = [ this.ReportSubMenu = [
{ label: 'Failure ', icon: 'pi pi-fw pi-chart-bar', to: '/reports/failure', section: 'reports', isBreadCrumbVisible: false ,isDateTimeVisible:false }, { label: 'Failure ', icon: 'pi pi-fw pi-chart-bar', to: '/reports/failure', section: 'reports', isBreadCrumbVisible: false, isDateTimeVisible: false },
{ label: 'Cycle ', icon: 'pi pi-fw pi-history', to: '/reports/cycle', section: 'reports', isBreadCrumbVisible: false ,isDateTimeVisible:false }, { label: 'Cycle ', icon: 'pi pi-fw pi-history', to: '/reports/cycle', section: 'reports', isBreadCrumbVisible: false, isDateTimeVisible: false },
{ label: 'Project ', icon: 'pi pi-fw pi-table', to: '/reports/project', section: 'reports', isBreadCrumbVisible: false ,isDateTimeVisible:false } { label: 'Project ', icon: 'pi pi-fw pi-table', to: '/reports/project', section: 'reports', isBreadCrumbVisible: false, isDateTimeVisible: false }
] ]
this.menu = [ this.menu = [
{ label: 'Calendar', icon: 'pi pi-fw pi-calendar-times', to: '/su/timelineview/week', section: 'su/timelineview/week', isBreadCrumbVisible: false ,isDateTimeVisible:true}, { label: 'Calendar', icon: 'pi pi-fw pi-calendar-times', to: '/su/timelineview/week', section: 'su/timelineview/week', isBreadCrumbVisible: false, isDateTimeVisible: true },
{ label: 'Cycle', icon: 'pi pi-fw pi-spinner', to: '/cycle', section: 'cycle', isBreadCrumbVisible: true,isDateTimeVisible:false }, { label: 'Cycle', icon: 'pi pi-fw pi-spinner', to: '/cycle', section: 'cycle', isBreadCrumbVisible: true, isDateTimeVisible: false },
{ label: 'Daily Schedule', icon: 'pi pi-fw pi-sun', to: '/constraint/view', section: 'system', isBreadCrumbVisible: false ,isDateTimeVisible:true}, { label: 'Daily Schedule', icon: 'pi pi-fw pi-sun', to: '/constraint/view', section: 'system', isBreadCrumbVisible: false, isDateTimeVisible: true },
{ label: 'Project', icon: 'pi pi-fw pi-compass', to: '/project', section: 'project', isBreadCrumbVisible: true ,isDateTimeVisible:false}, { label: 'Project', icon: 'pi pi-fw pi-compass', to: '/project', section: 'project', isBreadCrumbVisible: true, isDateTimeVisible: false },
{ label: 'Reservations', icon: 'pi pi-fw pi-book', to: '/reservation/list', section: 'system', isBreadCrumbVisible: false ,isDateTimeVisible:true}, { label: 'Reservations', icon: 'pi pi-fw pi-book', to: '/reservation/list', section: 'system', isBreadCrumbVisible: false, isDateTimeVisible: true },
{ label: 'Reports', icon: 'pi pi-fw pi-chart-bar', to: '/reports/failure', section: 'reports', isBreadCrumbVisible: false ,isDateTimeVisible:false, items: this.ReportSubMenu}, { label: 'Reports', icon: 'pi pi-fw pi-chart-bar', to: '/reports/failure', section: 'reports', isBreadCrumbVisible: false, isDateTimeVisible: false, items: this.ReportSubMenu },
{ label: 'Scheduling Units', icon: 'pi pi-fw pi-calendar', to: '/schedulingunit', section: 'schedulingunit', isBreadCrumbVisible: true ,isDateTimeVisible:false}, { label: 'Scheduling Units', icon: 'pi pi-fw pi-calendar', to: '/schedulingunit', section: 'schedulingunit', isBreadCrumbVisible: true, isDateTimeVisible: false },
{ label: 'Stations', icon: 'pi pi-fw pi-wifi pi-rotate', to: '/station/list', section: 'system', isBreadCrumbVisible: false ,isDateTimeVisible:true}, { label: 'Stations', icon: 'pi pi-fw pi-wifi pi-rotate', to: '/station/list', section: 'system', isBreadCrumbVisible: false, isDateTimeVisible: true },
{ label: 'System Events', icon: 'pi pi-fw pi-bolt', to: '/systemevent/list', section: 'system', isBreadCrumbVisible: false ,isDateTimeVisible:true}, { label: 'System Events', icon: 'pi pi-fw pi-bolt', to: '/systemevent/list', section: 'system', isBreadCrumbVisible: false, isDateTimeVisible: true },
{ label: 'Tasks', icon: 'pi pi-fw pi-check-square', to: '/task', isBreadCrumbVisible: true ,isDateTimeVisible:false}, { label: 'Tasks', icon: 'pi pi-fw pi-check-square', to: '/task', isBreadCrumbVisible: true, isDateTimeVisible: false },
{ label: 'Workflow', icon: 'pi pi-fw pi-sitemap', to: '/su/workflow', section: 'workflow', isBreadCrumbVisible: true,isDateTimeVisible:false }, { label: 'Workflow', icon: 'pi pi-fw pi-sitemap', to: '/su/workflow', section: 'workflow', isBreadCrumbVisible: true, isDateTimeVisible: false },
]; ];
} }
onWrapperClick() {
if (!this.menuClick) {
this.setState({
overlayMenuActive: false,
mobileMenuActive: false
});
}
this.menuClick = false;
}
onToggleMenu(event) { onToggleMenu(event) {
this.menuClick = true; this.menuClick = true;
if (this.isDesktop()) { if (this.isDesktop()) {
if (this.state.layoutMode === 'overlay') { this.setState(prevState => ({
this.setState(prevState => ({ staticMenuInactive: !prevState.staticMenuInactive
overlayMenuActive: !prevState.overlayMenuActive }), () => {
}), () => { localStorage.setItem('staticMenuInactive', !this.state.staticMenuInactive);
localStorage.setItem('overlayMenuActive', this.state.overlayMenuActive); });
});
} else if (this.state.layoutMode === 'static') {
this.setState(prevState => ({
staticMenuInactive: !prevState.staticMenuInactive
}), () => {
localStorage.setItem('staticMenuInactive', !this.state.staticMenuInactive);
});
}
} else { } else {
this.setState(prevState => ({ this.setState(prevState => ({
mobileMenuActive: !prevState.mobileMenuActive mobileMenuActive: !prevState.mobileMenuActive
...@@ -122,12 +103,9 @@ class App extends Component { ...@@ -122,12 +103,9 @@ class App extends Component {
event.preventDefault(); event.preventDefault();
} }
onSidebarClick() {
this.menuClick = true;
}
onMenuItemClick(event) { onMenuItemClick(event) {
this.setState({ currentMenu: event.item.label, currentPath: event.item.path, isBreadCrumbVisible: event.item.isBreadCrumbVisible, isDateTimeVisible:event.item.isDateTimeVisible }); this.setState({ currentMenu: event.item.label, currentPath: event.item.path, isBreadCrumbVisible: event.item.isBreadCrumbVisible, isDateTimeVisible: event.item.isDateTimeVisible });
} }
isDesktop() { isDesktop() {
...@@ -140,11 +118,6 @@ class App extends Component { ...@@ -140,11 +118,6 @@ class App extends Component {
} }
} }
/**
* Callback function from login page to set the authentication state to true amd redirect to the
* original requested URL.
*/
/** /**
* Logout and redirect to login page. * Logout and redirect to login page.
*/ */
...@@ -165,7 +138,7 @@ class App extends Component { ...@@ -165,7 +138,7 @@ class App extends Component {
} }
} }
toggleEditToggle() { toggleEditToggle() {
this.setState(prevState => ({ this.setState(prevState => ({
showEditDialog: !prevState.showEditDialog showEditDialog: !prevState.showEditDialog
...@@ -194,7 +167,7 @@ class App extends Component { ...@@ -194,7 +167,7 @@ class App extends Component {
componentDidUpdate() { componentDidUpdate() {
if (window.location.pathname === '/') { if (window.location.pathname === '/') {
this.setState({ redirect: '/su/timelineview/week', isBreadCrumbVisible: false ,isDateTimeVisible:true}) this.setState({ redirect: '/su/timelineview/week', isBreadCrumbVisible: false, isDateTimeVisible: true })
} }
} }
...@@ -249,51 +222,49 @@ class App extends Component { ...@@ -249,51 +222,49 @@ class App extends Component {
render() { render() {
const wrapperClass = classNames('layout-wrapper', { const wrapperClass = classNames('layout-wrapper', {
'layout-overlay': this.state.layoutMode === 'overlay',
'layout-static': this.state.layoutMode === 'static', 'layout-static': this.state.layoutMode === 'static',
'layout-static-sidebar-inactive': this.state.staticMenuInactive && this.state.layoutMode === 'static', 'layout-static-sidebar-inactive': this.state.staticMenuInactive ,
'layout-overlay-sidebar-active': this.state.overlayMenuActive && this.state.layoutMode === 'overlay',
'layout-mobile-sidebar-active': this.state.mobileMenuActive 'layout-mobile-sidebar-active': this.state.mobileMenuActive
}); });
return ( return (
<div className="App"> <div className="App">
<Provider store={AuthStore}> <Provider store={AuthStore}>
<div className={wrapperClass}> <div className={wrapperClass}>
{/* Load main routes and application only if the application is authenticated */} {/* Load main routes and application only if the application is authenticated */}
{this.state.redirect && {this.state.redirect &&
<AuthComponent> <AuthComponent>
<AppTopbar <AppTopbar
onToggleMenu={this.onToggleMenu} onToggleMenu={this.onToggleMenu}
isLoggedIn={this.state.authenticated} isLoggedIn={this.state.authenticated}
onLogout={this.validateAndLogout} onLogout={this.validateAndLogout}
setSearchField={this.setSearchField} setSearchField={this.setSearchField}
isDateTimeVisible={this.state.isDateTimeVisible} isDateTimeVisible={this.state.isDateTimeVisible}
/> />
<Router basename={this.state.currentPath}> <Router basename={this.state.currentPath}>
<AppMenu model={this.menu} toggleDirtyDialog={this.toggleDirtyDialog} isEditDirty={this.state.isEditDirty} onMenuItemClick={this.onMenuItemClick} layoutMode={this.state.la} active={this.state.menuActive} /> <AppMenu model={this.menu} toggleDirtyDialog={this.toggleDirtyDialog} isEditDirty={this.state.isEditDirty} onMenuItemClick={this.onMenuItemClick} active={this.state.menuActive} />
<div className="layout-main"> <div className="layout-main">
{(this.state.redirect || this.state.redirect === "/login") && {(this.state.redirect || this.state.redirect === "/login") &&
<Redirect to={{ pathname: this.state.redirect === "/login" ? "/su/timelineview/week" : this.state.redirect, state: { userrole: this.state.userrole } }} />} <Redirect to={{ pathname: this.state.redirect === "/login" ? "/su/timelineview/week" : this.state.redirect, state: { userrole: this.state.userrole } }} />}
{(this.state.isBreadCrumbVisible) && {(this.state.isBreadCrumbVisible) &&
<AppBreadcrumb setPageTitle={this.setPageTitle} section={this.state.currentMenu} onBreadcrumbClick={this.onBreadcrumbClick} /> <AppBreadcrumb setPageTitle={this.setPageTitle} section={this.state.currentMenu} onBreadcrumbClick={this.onBreadcrumbClick} />
} }
<RoutedContent /> <RoutedContent />
</div> </div>
</Router> </Router>
</AuthComponent> </AuthComponent>
} }
<CustomDialog type="confirmation" visible={this.state.showDirtyDialog} width="40vw" <CustomDialog type="confirmation" visible={this.state.showDirtyDialog} width="40vw"
header={'Confirmation'} message={'Do you want to discard your changes? Your changes may not be saved.'} header={'Confirmation'} message={'Do you want to discard your changes? Your changes may not be saved.'}
content={''} onClose={this.close} content={''} onClose={this.close}
actions={[{ id: "yes", title: 'Discard', callback: this.cancelEdit, className: 'act-btn-dispose' }, actions={[{ id: "yes", title: 'Discard', callback: this.cancelEdit, className: 'act-btn-dispose' },
{ id: "no", title: 'Cancel', className: 'act-btn-cancel', callback: this.close }]}> { id: "no", title: 'Cancel', className: 'act-btn-cancel', callback: this.close }]}>
</CustomDialog> </CustomDialog>
</div> </div>
</Provider> </Provider>
</div> </div>
); );
} }
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{
"project": "Calibration",
"nr_of_used_triggers": 0,
"quota": [
{
"id": 588,
"resource_type_id": "CEP Processing Time",
"value": 0.0
},
{
"id": 589,
"resource_type_id": "LOFAR Observing Time",
"value": 0.0
},
{
"id": 590,
"resource_type_id": "LOFAR Observing Time prio A",
"value": 0.0
},
{
"id": 594,
"resource_type_id": "Number of triggers",
"value": 0.0
},
{
"id": 592,
"resource_type_id": "LOFAR Support Time",
"value": 0.0
},
{
"id": 593,
"resource_type_id": "LTA Storage",
"value": 109951162777600.0
},
{
"id": 591,
"resource_type_id": "LOFAR Observing Time prio B",
"value": 0.0
}
],
"SUBs": {
"successful": [],
"failed": [],
"acceptance_pending": [
{
"id": 3820,
"name": "Holog test run D1",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 245.293806584,
"target": "Observation",
"SAS ID": {
"observation control": [
2025506
],
"preprocessing pipeline": [
2025509
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3726,
"name": "Holog test run C2",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 248.641506348,
"target": "Observation",
"SAS ID": {
"observation control": [
2025124
],
"preprocessing pipeline": [
2025125
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3724,
"name": "Holog test run C1",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 0.00016006400000000002,
"target": "Observation",
"SAS ID": {
"observation control": [
2025119
],
"preprocessing pipeline": [
2025120
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3537,
"name": "Holog test run B1.2",
"status": "cancelled",
"start": "2023-08-10T12:47:00",
"stop": "2023-08-10T12:52:30",
"duration": 30.151307,
"on_sky_duration": 30.0,
"observed_duration": 0,
"CPU_time_used_duration": 0.000155184,
"target": "Observation",
"SAS ID": {
"observation control": [
2024252
],
"preprocessing pipeline": [
2024253
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3536,
"name": "Holog test run B1.1",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 314.005004464,
"target": "Observation",
"SAS ID": {
"observation control": [
2024249
],
"preprocessing pipeline": [
2024250
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3438,
"name": "Holog test run A2.2",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 0.00017177599999999998,
"target": "Observation",
"SAS ID": {
"observation control": [
2023820
],
"preprocessing pipeline": [
2023821
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3437,
"name": "Holog test run A2.1",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 0.00016104,
"target": "Observation",
"SAS ID": {
"observation control": [
2023817
],
"preprocessing pipeline": [
2023818
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3436,
"name": "Holog test run A1.2",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 0.00015738,
"target": "Observation",
"SAS ID": {
"observation control": [
2023814
],
"preprocessing pipeline": [
2023815
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3435,
"name": "Holog test run A1.1",
"status": "cancelled",
"start": null,
"stop": null,
"duration": 0,
"on_sky_duration": 0,
"observed_duration": 0,
"CPU_time_used_duration": 0.00017299600000000002,
"target": "Observation",
"SAS ID": {
"observation control": [
2023811
],
"preprocessing pipeline": [
2023812
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3433,
"name": "swlevel 3 test",
"status": "processed",
"start": "2023-08-01T09:10:00",
"stop": "2023-08-01T09:21:39",
"duration": 1956.192239,
"on_sky_duration": 300.417023,
"observed_duration": 300.417023,
"CPU_time_used_duration": 330.858334076,
"target": "Combined Observation",
"SAS ID": {
"observation control": [
2023804
],
"preprocessing pipeline": [
2023806,
2023805
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
},
{
"id": 3432,
"name": "swlevel 3 test",
"status": "cancelled",
"start": "2023-08-01T09:10:00",
"stop": "2023-08-01T09:25:00",
"duration": 0.003289,
"on_sky_duration": 300.0,
"observed_duration": 0,
"CPU_time_used_duration": 0.000317688,
"target": "Combined Observation",
"SAS ID": {
"observation control": [
2023799
],
"preprocessing pipeline": [
2023800,
2023801
],
"pulsar pipeline": []
},
"ingested_date": null,
"ingested_data_size": null
}
]
},
"durations": {
"total_regular": 1986.346835,
"total_not_cancelled": 300.417023,
"total_on_sky": 630.417023,
"total_CPU_time_used": 1138.7999476,
"total_observed": 300.417023,
"total_observed_succeeded": 0,
"total_observed_failed": 0,
"total_observed_acceptance_pending": 300.417023,
"total_observed_succeeded_A": 0,
"total_observed_succeeded_B": 0,
"not_cancelled_perc": 0.48,
"observed_perc": 0.48,
"observed_succeeded_perc": 0.0,
"observed_failed_perc": 0.0,
"observed_acceptance_pending_perc": 0.48
},
"LTA_dataproducts": {
"size": 0,
"size_succeeded": 0,
"size_failed": 0,
"size_acceptance_pending": 0
},
"data_ingested_per_site": [],
"SAPs_exposure": {
"target1": 30.041702,
"3C196": 60.083404,
"_Target_name_": 300.417023,
"3Cabc": 300.417023
},
"processing_resources": {
"CPUtimeRAW": null,
"CPU_time_used": 1138.7999476,
"CPU_time_used_succeeded": 0,
"CPU_time_used_acceptance_pending": 1138.7999476,
"CPU_time_used_failed": 0
},
"contains_overlapping_observations": false
}
\ No newline at end of file
{
"count": 9,
"next": null,
"previous": null,
"results": [
{
"name": "LTA Storage",
"url": "https://tmss.lofar.eu/api/resource_type/LTA%20Storage",
"created_at": "2021-10-11T10:54:30.877081",
"description": "Amount of storage in the LTA (in bytes)",
"quantity": "https://tmss.lofar.eu/api/quantity/bytes",
"quantity_value": "bytes",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877100"
},
{
"name": "CEP Storage",
"url": "https://tmss.lofar.eu/api/resource_type/CEP%20Storage",
"created_at": "2021-10-11T10:54:30.877142",
"description": "Amount of storage on the CEP processing cluster (in bytes)",
"quantity": "https://tmss.lofar.eu/api/quantity/bytes",
"quantity_value": "bytes",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877150"
},
{
"name": "CEP Processing Time",
"url": "https://tmss.lofar.eu/api/resource_type/CEP%20Processing%20Time",
"created_at": "2021-10-11T10:54:30.877179",
"description": "Processing time on the CEP processing cluster (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877186"
},
{
"name": "LOFAR Observing Time",
"url": "https://tmss.lofar.eu/api/resource_type/LOFAR%20Observing%20Time",
"created_at": "2021-10-11T10:54:30.877213",
"description": "Observing time (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877220"
},
{
"name": "LOFAR Observing Time prio A",
"url": "https://tmss.lofar.eu/api/resource_type/LOFAR%20Observing%20Time%20prio%20A",
"created_at": "2021-10-11T10:54:30.877247",
"description": "Observing time with priority A (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877264"
},
{
"name": "LOFAR Observing Time prio B",
"url": "https://tmss.lofar.eu/api/resource_type/LOFAR%20Observing%20Time%20prio%20B",
"created_at": "2021-10-11T10:54:30.877291",
"description": "Observing time with priority B (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877298"
},
{
"name": "LOFAR Observing Time Commissioning",
"url": "https://tmss.lofar.eu/api/resource_type/LOFAR%20Observing%20Time%20Commissioning",
"created_at": "2021-10-11T10:54:30.877325",
"description": "Observing time for Commissioning/DDT (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877332"
},
{
"name": "LOFAR Support Time",
"url": "https://tmss.lofar.eu/api/resource_type/LOFAR%20Support%20Time",
"created_at": "2021-10-11T10:54:30.877358",
"description": "Support time by human (in seconds)",
"quantity": "https://tmss.lofar.eu/api/quantity/time",
"quantity_value": "time",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877365"
},
{
"name": "Number of triggers",
"url": "https://tmss.lofar.eu/api/resource_type/Number%20of%20triggers",
"created_at": "2021-10-11T10:54:30.877392",
"description": "Number of trigger events (as integer)",
"quantity": "https://tmss.lofar.eu/api/quantity/number",
"quantity_value": "number",
"tags": [],
"updated_at": "2021-10-11T10:54:30.877399"
}
]
}
\ No newline at end of file
{
"id": 3997,
"url": "https://tmss.lofar.eu/api/scheduling_unit_blueprint/3997",
"actual_on_sky_start_time": "2023-10-10T20:23:57",
"actual_on_sky_stop_time": "2023-10-10T20:38:57.936499",
"actual_process_start_time": "2023-10-10T20:23:57.640945",
"actual_process_stop_time": "2023-10-10T20:58:39.101328",
"created_at": "2023-09-25T09:41:20.630154",
"description": "Pulsar Timing - October 2023",
"draft": "https://tmss.lofar.eu/api/scheduling_unit_draft/5775",
"draft_id": 5775,
"duration": 2033.91845,
"error_reason": "",
"global_identifier": "https://tmss.lofar.eu/api/sip_identifier/16965305",
"global_identifier_id": 16965305,
"ingest_permission_granted_since": null,
"ingest_permission_required": false,
"interrupts_telescope": false,
"name": "J2302+4442",
"observed_duration": 900.936499,
"observed_start_time": "2023-10-10T20:23:57",
"observed_stop_time": "2023-10-10T20:38:57.936499",
"obsolete_since": null,
"on_sky_duration": 900.936499,
"on_sky_start_time": "2023-10-10T20:23:57",
"on_sky_stop_time": "2023-10-10T20:38:57.936499",
"output_pinned": false,
"piggyback_allowed_aartfaac": true,
"piggyback_allowed_tbb": true,
"priority_queue": "https://tmss.lofar.eu/api/priority_queue_type/B",
"priority_queue_value": "B",
"process_start_time": "2023-10-10T20:23:57.640945",
"process_stop_time": "2023-10-10T20:58:39.101328",
"rank": 0.98,
"results_accepted": null,
"scheduled_central_lst": "22:15:40",
"scheduled_start_time": "2023-10-10T20:23:57",
"scheduled_stop_time": "2023-10-11T02:57:38.565896",
"scheduling_constraints_doc": {
"sky": {
"min_distance": {
"sun": 0.00872665,
"moon": 0.00872665,
"jupiter": 0
},
"min_elevation": {
"target": 0.5235987755982988,
"calibrator": 0
},
"transit_offset": {
"to": 7200.0,
"from": -7200.0
},
"reference_pointing": {
"enabled": false,
"pointing": {
"angle1": 0,
"angle2": 0,
"target": "_target_name_",
"direction_type": "J2000"
}
}
},
"time": {
"between": [
{
"to": "2023-10-25T23:59:00",
"from": "2023-10-10T00:00:00"
}
],
"not_between": []
},
"daily": {
"require_day": false,
"require_night": false,
"avoid_twilight": false
},
"$schema": "https://tmss.lofar.eu/api/schemas/schedulingconstraintstemplate/constraints/7/ref_resolved",
"location": "center",
"scheduler": "dynamic"
},
"scheduling_constraints_template": "https://tmss.lofar.eu/api/scheduling_constraints_template/13",
"scheduling_constraints_template_id": 13,
"specifications_template": "https://tmss.lofar.eu/api/scheduling_unit_template/17",
"specifications_template_id": 17,
"status": "finished",
"status_value": "finished",
"tags": [],
"task_blueprints": [
"https://tmss.lofar.eu/api/task_blueprint/26431",
"https://tmss.lofar.eu/api/task_blueprint/26430",
"https://tmss.lofar.eu/api/task_blueprint/26429",
"https://tmss.lofar.eu/api/task_blueprint/26432"
],
"task_blueprints_ids": [
26431,
26430,
26429,
26432
],
"unschedulable_reason": "",
"updated_at": "2023-10-09T16:56:45.642466"
}
\ No newline at end of file
This diff is collapsed.
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"value": "open",
"url": "https://tmss.lofar.eu/api/system_event_status/open"
},
{
"value": "analysed",
"url": "https://tmss.lofar.eu/api/system_event_status/analysed"
},
{
"value": "closed",
"url": "https://tmss.lofar.eu/api/system_event_status/closed"
}
]
}
\ No newline at end of file
{
"count": 123,
"next": "https://tmss.lofar.eu/api/system_event/?limit=10&offset=10&ordering=-stop&status=closed&status=analysed&status=open",
"previous": null,
"results": [
{
"id": 5,
"url": "https://tmss.lofar.eu/api/system_event/5",
"affected_hardware_doc": {
"clusters": [
"CEP4"
],
"stations": []
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/1076"
],
"affected_tasks_ids": [
1076
],
"created_at": "2022-03-17T06:48:25.701960",
"created_by": "test@lofar.test",
"created_by_id": 25,
"description": "see jira",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/other",
"issue_subtype_value": "other",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/other",
"issue_type_value": "other",
"jira_url": "https://support.astron.nl/jira/browse/TMSS-1633",
"name": "race condition in queing/starting pipeline",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/failure",
"severity_value": "failure",
"start": "2022-03-17T06:45:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2022-03-17T06:48:25.701981"
},
{
"id": 10,
"url": "https://tmss.lofar.eu/api/system_event/10",
"affected_hardware_doc": {
"clusters": [],
"stations": []
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/10925"
],
"affected_tasks_ids": [
10925
],
"created_at": "2022-11-14T12:02:58.747230",
"created_by": "test@lofar.test",
"created_by_id": 25,
"description": "Cannot create more than one re-run copy for failed/cancelled pipelines in TMSS",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/other",
"issue_subtype_value": "other",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/system",
"issue_type_value": "system",
"jira_url": "https://support.astron.nl/jira/browse/SDCH-3683",
"name": "Cannot create more than one re-run copy for failed/cancelled pipelines in TMSS",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/failure",
"severity_value": "failure",
"start": "2022-11-14T12:00:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2022-11-14T12:02:58.747252"
},
{
"id": 12,
"url": "https://tmss.lofar.eu/api/system_event/12",
"affected_hardware_doc": {
"clusters": [],
"stations": []
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [],
"affected_tasks_ids": [],
"created_at": "2022-12-01T12:21:26.737669",
"created_by": "blaauw@astron.nl",
"created_by_id": 35,
"description": "test*&*#$$#",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/other",
"issue_subtype_value": "other",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/system",
"issue_type_value": "system",
"jira_url": "https://www.google.nl/",
"name": "roll out test",
"notes": "test test",
"severity": "https://tmss.lofar.eu/api/system_event_severity/minor",
"severity_value": "minor",
"start": "2022-12-01T12:19:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-07-19T10:23:15.097643"
},
{
"id": 14,
"url": "https://tmss.lofar.eu/api/system_event/14",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"CS001",
"CS002",
"CS003",
"CS004",
"CS005",
"CS006"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/1144"
],
"affected_tasks_ids": [
1144
],
"created_at": "2022-12-09T08:33:52.611254",
"created_by": "iacobelli@astron.nl",
"created_by_id": 37,
"description": "To verify the user is enabled to save",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/other",
"issue_subtype_value": "other",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/station",
"issue_type_value": "station",
"jira_url": null,
"name": "Test saving",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2022-04-04T12:45:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-07-19T10:23:24.482123"
},
{
"id": 15,
"url": "https://tmss.lofar.eu/api/system_event/15",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"CS001",
"CS002",
"CS003",
"CS004",
"CS005",
"CS006"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/11623"
],
"affected_tasks_ids": [
11623
],
"created_at": "2022-12-09T09:10:18.704954",
"created_by": "iacobelli@astron.nl",
"created_by_id": 37,
"description": "test of creation when a system error 500 pop up",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/other",
"issue_subtype_value": "other",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/other",
"issue_type_value": "other",
"jira_url": null,
"name": "test",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2022-11-29T15:46:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-07-19T10:23:33.366295"
},
{
"id": 44,
"url": "https://tmss.lofar.eu/api/system_event/44",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"DE602"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [],
"affected_tasks_ids": [],
"created_at": "2023-06-07T14:57:57.444755",
"created_by": "blaauw@astron.nl",
"created_by_id": 35,
"description": "",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/hardware",
"issue_subtype_value": "hardware",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/network",
"issue_type_value": "network",
"jira_url": null,
"name": "DE602 unreachable",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2023-06-07T14:57:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-07-19T12:16:11.249894"
},
{
"id": 52,
"url": "https://tmss.lofar.eu/api/system_event/52",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"PL612"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [],
"affected_tasks_ids": [],
"created_at": "2023-07-19T12:21:16.119010",
"created_by": "hmulder@astron.nl",
"created_by_id": 34,
"description": "13 july fixed, but the problem is back, needs to be looked at by the airco company again",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/hardware",
"issue_subtype_value": "hardware",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/station",
"issue_type_value": "station",
"jira_url": null,
"name": "PL612 high CabinetTemp, broken airco",
"notes": "airco issue, station trips",
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2023-07-14T12:19:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-07-20T10:11:46.687829"
},
{
"id": 76,
"url": "https://tmss.lofar.eu/api/system_event/76",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"UK608"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [],
"affected_tasks_ids": [],
"created_at": "2023-09-11T07:18:37.232074",
"created_by": "hmulder@astron.nl",
"created_by_id": 34,
"description": "During hot days, airco cannot cool the system enough, so station get Tripped.\nAlan Doo is aware of the situation and somewhere t",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/temperature",
"issue_subtype_value": "temperature",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/station",
"issue_type_value": "station",
"jira_url": null,
"name": "UK608",
"notes": null,
"severity": "https://tmss.lofar.eu/api/system_event_severity/minor",
"severity_value": "minor",
"start": "2023-09-08T07:17:00",
"status": "https://tmss.lofar.eu/api/system_event_status/open",
"status_value": "open",
"stop": null,
"tags": [],
"updated_at": "2023-09-11T07:18:37.232083"
},
{
"id": 87,
"url": "https://tmss.lofar.eu/api/system_event/87",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"CS005"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/23484"
],
"affected_tasks_ids": [
23484
],
"created_at": "2023-09-28T13:04:36.983573",
"created_by": "shulevski@astron.nl",
"created_by_id": 75,
"description": "The tile was oscillating",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/oscillating",
"issue_subtype_value": "oscillating",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/station",
"issue_type_value": "station",
"jira_url": null,
"name": "Oscillating tile",
"notes": "Test for QA workflow",
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2023-08-04T09:35:00",
"status": "https://tmss.lofar.eu/api/system_event_status/analysed",
"status_value": "analysed",
"stop": null,
"tags": [],
"updated_at": "2023-09-28T13:08:26.365180"
},
{
"id": 110,
"url": "https://tmss.lofar.eu/api/system_event/110",
"affected_hardware_doc": {
"clusters": [],
"stations": [
"DE601"
]
},
"affected_hardware_template": "https://tmss.lofar.eu/api/system_event_template/5",
"affected_hardware_template_id": 5,
"affected_tasks": [
"https://tmss.lofar.eu/api/task_blueprint/30927",
"https://tmss.lofar.eu/api/task_blueprint/30553",
"https://tmss.lofar.eu/api/task_blueprint/30554",
"https://tmss.lofar.eu/api/task_blueprint/31018"
],
"affected_tasks_ids": [
30927,
30553,
30554,
31018
],
"created_at": "2023-12-04T10:40:35.729874",
"created_by": "hmulder@astron.nl",
"created_by_id": 34,
"description": "Since the flooding in July 2021 the station has been getting lots of spare parts SPU/TDS/RSP there is a big problem with short..",
"issue_subtype": "https://tmss.lofar.eu/api/system_event_subtype/hardware",
"issue_subtype_value": "hardware",
"issue_type": "https://tmss.lofar.eu/api/system_event_type/station",
"issue_type_value": "station",
"jira_url": null,
"name": "de601 damage after flooding",
"notes": "Since the flooding in July 2021 the station has been getting lots of spare parts SPU/TDS/RSP there is a big problem with short circuits that needs to be looked at on site as it is draining out spare parts. Since everything we sent gets broken",
"severity": "https://tmss.lofar.eu/api/system_event_severity/major",
"severity_value": "major",
"start": "2021-07-15T10:37:00",
"status": "https://tmss.lofar.eu/api/system_event_status/open",
"status_value": "open",
"stop": null,
"tags": [],
"updated_at": "2023-12-11T12:20:24.838206"
}
]
}
\ No newline at end of file
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"value": "failure",
"url": "https://tmss.lofar.eu/api/system_event_severity/failure"
},
{
"value": "minor",
"url": "https://tmss.lofar.eu/api/system_event_severity/minor"
},
{
"value": "major",
"url": "https://tmss.lofar.eu/api/system_event_severity/major"
}
]
}
\ No newline at end of file
{
"count": 9,
"next": null,
"previous": null,
"results": [
{
"value": "crash",
"url": "https://tmss.lofar.eu/api/system_event_subtype/crash"
},
{
"value": "dataloss",
"url": "https://tmss.lofar.eu/api/system_event_subtype/dataloss"
},
{
"value": "hardware",
"url": "https://tmss.lofar.eu/api/system_event_subtype/hardware"
},
{
"value": "noisy",
"url": "https://tmss.lofar.eu/api/system_event_subtype/noisy"
},
{
"value": "oscillating",
"url": "https://tmss.lofar.eu/api/system_event_subtype/oscillating"
},
{
"value": "rfi",
"url": "https://tmss.lofar.eu/api/system_event_subtype/rfi"
},
{
"value": "setup",
"url": "https://tmss.lofar.eu/api/system_event_subtype/setup"
},
{
"value": "temperature",
"url": "https://tmss.lofar.eu/api/system_event_subtype/temperature"
},
{
"value": "other",
"url": "https://tmss.lofar.eu/api/system_event_subtype/other"
}
]
}
\ No newline at end of file
This diff is collapsed.
{
"count": 9,
"next": null,
"previous": null,
"results": [
{
"value": "cep",
"url": "https://tmss.lofar.eu/api/system_event_type/cep"
},
{
"value": "cobalt",
"url": "https://tmss.lofar.eu/api/system_event_type/cobalt"
},
{
"value": "environment",
"url": "https://tmss.lofar.eu/api/system_event_type/environment"
},
{
"value": "human",
"url": "https://tmss.lofar.eu/api/system_event_type/human"
},
{
"value": "network",
"url": "https://tmss.lofar.eu/api/system_event_type/network"
},
{
"value": "station",
"url": "https://tmss.lofar.eu/api/system_event_type/station"
},
{
"value": "system",
"url": "https://tmss.lofar.eu/api/system_event_type/system"
},
{
"value": "other",
"url": "https://tmss.lofar.eu/api/system_event_type/other"
},
{
"value": "information",
"url": "https://tmss.lofar.eu/api/system_event_type/information"
}
]
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment