diff --git a/esap/docker/docker-compose-query.yml b/esap/docker/docker-compose-query.yml index febeecabef29f55b1ae89c80b223e060be14ed85..952552219daeaa09da172f670c5347b2ffbe730b 100644 --- a/esap/docker/docker-compose-query.yml +++ b/esap/docker/docker-compose-query.yml @@ -9,19 +9,6 @@ networks: driver: bridge services: - esap_api: - container_name: esap_api - image: esap_api:latest - networks: - - esap_network - expose: - - 8000 - env_file: - - $HOME/shared/oidc - restart: always - volumes: - - $HOME/shared:/shared - esap_api_query: container_name: esap_api_query image: esap_api_query:latest @@ -37,19 +24,19 @@ services: volumes: - $HOME/shared/:/shared - esap_nginx: - build: - context: $HOME/shared - dockerfile: Dockerfile - container_name: esap_nginx - image: esap_nginx:latest - networks: - - esap_network - ports: - - 80:80 - volumes: - - $HOME/shared:/shared - - $HOME/shared:/etc/nginx/conf.d - - $HOME/shared/static:/static - restart: always +# esap_nginx: +# build: +# context: $HOME/shared +# dockerfile: Dockerfile +# container_name: esap_nginx +# image: esap_nginx:latest +# networks: +# - esap_network +# ports: +# - 80:80 +# volumes: +# - $HOME/shared:/shared +# - $HOME/shared:/etc/nginx/conf.d +# - $HOME/shared/static:/static +# restart: always diff --git a/esap/esap/configuration/esap_dev.py b/esap/esap/configuration/esap_dev.py index 6b749cffa313577dcedd629dff0f3f82def37f40..ac5884e8f088e82097de9cc8dc8b42ccdaa46f73 100644 --- a/esap/esap/configuration/esap_dev.py +++ b/esap/esap/configuration/esap_dev.py @@ -1,4 +1,7 @@ +# title = "ADEX" +logo = "https://alta.astron.nl/alta-static/images/esap/adex_logo.png" + # title = "ESFRI Science Analysis Platform" #logo = "http://uilennest.net/static/media/tree9.da598501.png" @@ -7,15 +10,10 @@ # that all have their own urls like 'http://esap.astron.nl/esap-gui-dev/queries' frontend_basename="esap-gui" -logo = "https://alta.astron.nl/alta-static/images/esap/esap_logo.png" - # definition of the navigation bar nav1 = {'title': 'Archives', 'route': '/archives'} -nav2 = {'title': 'Datasets', 'route': '/datasets'} -nav3 = {'title': 'Telescopes', 'route': '/telescopes'} -nav4 = {'title': 'Query', 'route': '/query'} -nav5 = {'title': 'Settings', 'route': '/about'} -navbar = [nav1,nav2,nav3,nav4,nav5] +nav2 = {'title': 'Query', 'route': '/query'} +navbar = [nav1,nav2] # if datasets_enabled is set, then only these datasets are visible to the GUI #datasets_enabled = ['apertif-observations','astron.ivoa.obscore'] @@ -26,20 +24,16 @@ datasets_disabled = ['nancay.ivoa.obscore'] # definition of the query query_schema = { - "title": "ESAP Query", + "name": "adex", + "title": "ASTRON Data Collection Query", "type": "object", "properties": { - "institute": { - "type": "string", - "title": "Institute", - "default": "all", - "enum": ["all","Astron","IVOA"], - "enumNames": ["all","astron","IVOA"] - }, - "keyword": { + "catalog": { "type": "string", - "title": "Keyword", - "default" : "" + "title": "Catalog", + "default": "apertif", + "enum": ["all","apertif", "astron_vo"], + "enumNames": ["All","Apertif", "ASTRON_VO"] }, "target": { "type": "string", @@ -48,35 +42,43 @@ query_schema = { "ra": { "type": "number", "title": "RA (degrees)", - "default": 342.16 }, "dec": { "type": "number", "title": "dec (degrees)", - "default": 33.94 }, "fov": { "type": "number", "title": "search radius (degrees)", - "default": 10 }, - + "level": { + "type": "string", + "title": "Processing Level", + "default": "all", + "enum": ["all","raw","processed"], + "enumNames": ["All","Raw","Processed"] + }, + "collection": { + "type": "string", + "title": "Collection", + }, "dataproduct_type": { "type": "string", "title": "DataProductType", "default": "all", + "enum": ["all", "visibility", "image", "cube"], + "enumNames": ["all", "visibility", "image", "cube"] + }, + "dataproduct_subtype": { + "type": "string", + "title": "DataProductSubType", + "default": "all", "enum": ["all", "uncalibratedVisibility", "continuumMF", "continuumChunk", "calibratedImage", "polarisationImage", "imageCube", "beamCube", "polarisationCube", "pulsarTimingTimeSeries"], "enumNames": ["all", "uncalibratedVisibility", "continuumMF", "continuumChunk", "calibratedImage", "polarisationImage", "imageCube", "beamCube", "polarisationCube", "pulsarTimingTimeSeries"] }, - "dataproduct_type": { - "type": "string", - "title": "DataProduct Type", - "default": "all", - "enum": ["all","visibility","image","cube"], - "enumNames": ["all","visibility","image","cube"] - }, + } } diff --git a/esap/esap/esap_ida_config.sqlite3 b/esap/esap/esap_ida_config.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..49bb5ade5762e14bc16e3fd54b1492ff19f7cfe4 Binary files /dev/null and b/esap/esap/esap_ida_config.sqlite3 differ diff --git a/esap/esap/esap_staging_config.sqlite3 b/esap/esap/esap_staging_config.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..ae12217d8e863c7b57d7317dc634f761ff5b351e Binary files /dev/null and b/esap/esap/esap_staging_config.sqlite3 differ diff --git a/esap/esap/settings/base.py b/esap/esap/settings/base.py index f49d1130b15f7b64e04fddb137c94fac50a4e72e..545cd300d2c0df27aa1c5b8b48e8dc007caae72d 100644 --- a/esap/esap/settings/base.py +++ b/esap/esap/settings/base.py @@ -27,6 +27,7 @@ INSTALLED_APPS = [ 'staging', 'accounts', 'rucio', + 'ida', 'knox', 'django.contrib.admin', 'django.contrib.auth', diff --git a/esap/esap/settings/dev.py b/esap/esap/settings/dev.py index 5991d2927f4b83545cf26b263a18cbd44d67ef7f..c5b1f56ae1d4f821b13e0e59175afca95be0052c 100644 --- a/esap/esap/settings/dev.py +++ b/esap/esap/settings/dev.py @@ -17,13 +17,20 @@ ALLOWED_HOSTS = ["*"] CORS_ORIGIN_ALLOW_ALL = True # Database -# https://docs.djangoproject.com/en/2.0/ref/settings/#databases - +DATABASE_ROUTERS = ['staging.database_router.StagingRouter','ida.database_router.IdaRouter'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'esap_config.sqlite3'), }, + 'staging': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'esap_staging_config.sqlite3'), + }, + 'ida': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'esap_ida_config.sqlite3'), + }, } diff --git a/esap/esap/settings/docker.py b/esap/esap/settings/docker.py index b63e98f17f5f573685554fa30965e6df4b084583..e9d0459c56fd905c3b256696f78e067dcb22bf49 100644 --- a/esap/esap/settings/docker.py +++ b/esap/esap/settings/docker.py @@ -23,13 +23,20 @@ CORS_ORIGIN_ALLOW_ALL = True # Application definition # Database -# https://docs.djangoproject.com/en/2.0/ref/settings/#databases - +DATABASE_ROUTERS = ['staging.database_router.StagingRouter','ida.database_router.IdaRouter'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, '/shared/esap_config.sqlite3'), }, + 'staging': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, '/shared/esap_staging_config.sqlite3'), + }, + 'ida': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, '/shared/esap_ida_config.sqlite3'), + }, } # Static files (CSS, JavaScript, Images) diff --git a/esap/esap/settings/prod.py b/esap/esap/settings/prod.py index e71984c82f13fb0f3cca42ccea5108d9d382f275..e6d4aeeea3c16fb6ac8d14fd6663727302d4ac58 100644 --- a/esap/esap/settings/prod.py +++ b/esap/esap/settings/prod.py @@ -11,11 +11,22 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Import production setting must remain False. DEBUG = False +# https://docs.djangoproject.com/en/2.0/ref/settings/#databases +DATABASE_ROUTERS = ['staging.database_router.StagingRouter','ida.database_router.IdaRouter'] + DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'esap_config.sqlite3'), }, + 'staging': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'esap_staging_config.sqlite3'), + }, + 'ida': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'esap_ida_config.sqlite3'), + }, } # SECURITY WARNING: keep the secret key used in production secret! diff --git a/esap/esap/urls.py b/esap/esap/urls.py index 19bc79088e298e640ff91fd8f4b80cc0933d3e2e..da942e8e37a5bdb21f4b9142c6d120eb09aed5c5 100644 --- a/esap/esap/urls.py +++ b/esap/esap/urls.py @@ -21,6 +21,7 @@ urlpatterns = [ path('esap-api/staging/', include('staging.api.urls')), path('esap-api/rucio/', include('rucio.api.urls')), path('esap-api/accounts/', include('accounts.api.urls')), + path('esap-api/ida/', include('ida.api.urls')), path('esap-api/admin/', admin.site.urls, name='admin-view'), re_path('^esap-api/oidc/', include('mozilla_django_oidc.urls')), ] diff --git a/esap/ida/__init__.py b/esap/ida/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/esap/ida/admin.py b/esap/ida/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..9a8f66a96dad74eeaf3c41d6c2aeebf6af0022ae --- /dev/null +++ b/esap/ida/admin.py @@ -0,0 +1,4 @@ +# Register your models here. +from django.contrib import admin +from .models import Ida +admin.site.register(Ida) diff --git a/esap/ida/api/__init__.py b/esap/ida/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/esap/ida/api/serializers.py b/esap/ida/api/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..ebb20c17f96126c2a1518c198b311e3efb0821c9 --- /dev/null +++ b/esap/ida/api/serializers.py @@ -0,0 +1,10 @@ +from rest_framework import serializers +from ..models import Ida +import logging + +logger = logging.getLogger(__name__) + +class IdaSerializer(serializers.ModelSerializer): + class Meta(): + model = Ida + fields = "__all__" \ No newline at end of file diff --git a/esap/ida/api/urls.py b/esap/ida/api/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..5a3b2aa2d00309bac9f145bcb9e9267cd1d0de4e --- /dev/null +++ b/esap/ida/api/urls.py @@ -0,0 +1,18 @@ +from django.urls import path +from django.contrib import admin +from rest_framework import routers + +from .views import IdaViewSet +from . import views + +router = routers.DefaultRouter() +router.register('ida', IdaViewSet, 'ida') + +urlpatterns = router.urls + +urlpatterns = [ + path('admin', admin.site.urls, name='admin-view'), + path('', views.IndexView.as_view(), name='index-view'), + path('my_ida', views.StagingListViewAPI.as_view(), name='ida-view'), +] + diff --git a/esap/ida/api/views.py b/esap/ida/api/views.py new file mode 100644 index 0000000000000000000000000000000000000000..9ad6e4fe620f7c8035c29eafa0e5ce58dba5433b --- /dev/null +++ b/esap/ida/api/views.py @@ -0,0 +1,42 @@ +from django.views.generic import ListView +from django_filters import rest_framework as filters +from rest_framework import viewsets, permissions + +from ida.models import Ida +from rest_framework import generics + +from .serializers import IdaSerializer + + +class IdaViewSet(viewsets.ModelViewSet): + serializer_class = IdaSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return self.request.user.staging.all() + + def perform_create(self, serializer): + serializer.save(owner=self.request.user) + + +# example: /esap/ida/ +class IndexView(ListView): + queryset = Ida.objects.all() + serializer_class = IdaSerializer + template_name = 'ida/index.html' + + # by default this returns the list in an object called object_list, so use 'object_list' in the html page. + # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. + context_object_name = 'my_ida' + + +# example: /esap-api/ida/my_ida/ +class StagingListViewAPI(generics.ListCreateAPIView): + + model = Ida + queryset = Ida.objects.all() + serializer_class = IdaSerializer + + # using the Django Filter Backend - https://django-filter.readthedocs.io/en/latest/index.html + # filter_backends = (filters.DjangoFilterBackend,) + # filter_class = IdaFilter \ No newline at end of file diff --git a/esap/ida/apps.py b/esap/ida/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..20b8d8227af0bd6125f80e3c78bd89b0131135c2 --- /dev/null +++ b/esap/ida/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class IdaConfig(AppConfig): + name = 'ida' diff --git a/esap/ida/database_router.py b/esap/ida/database_router.py new file mode 100644 index 0000000000000000000000000000000000000000..5cc237459d28b85578915e887e3c016f19003a98 --- /dev/null +++ b/esap/ida/database_router.py @@ -0,0 +1,37 @@ +class IdaRouter: + + route_app_labels = {'ida'} + + def db_for_read(self, model, **hints): + """ + Attempts to read ida models go to ida database. + """ + if model._meta.app_label in self.route_app_labels: + return 'ida' + + def db_for_write(self, model, **hints): + """ + Writes always go to ida. + """ + return 'ida' + + def allow_relation(self, obj1, obj2, **hints): + """ + Allow relations if a model in the ida apps is + involved. + """ + if ( + obj1._meta.app_label in self.route_app_labels or + obj2._meta.app_label in self.route_app_labels + ): + return True + return None + + def allow_migrate(self, db, app_label, model_name=None, **hints): + """ + Make sure the ida apps only appear in the + 'ida' database. + """ + if app_label in self.route_app_labels: + return db == 'ida' + return None \ No newline at end of file diff --git a/esap/ida/models.py b/esap/ida/models.py new file mode 100644 index 0000000000000000000000000000000000000000..bb7dab1ec6799db1310a403c8f592a54a2c2b540 --- /dev/null +++ b/esap/ida/models.py @@ -0,0 +1,5 @@ +from django.db import models + +class Ida(models.Model): + uri = models.CharField(max_length=40, null=False) + status = models.CharField(max_length=40, null=False) \ No newline at end of file diff --git a/esap/ida/templates/ida/base.html b/esap/ida/templates/ida/base.html new file mode 100644 index 0000000000000000000000000000000000000000..565defa300841d7719ee25360c87f18ee51098f8 --- /dev/null +++ b/esap/ida/templates/ida/base.html @@ -0,0 +1,51 @@ + +<!DOCTYPE html> +{% load static %} +<html lang="en"> +<head> + + <!-- Required meta tags --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <title>{% block myBlockTitle %}ESAP API - Interactive Analysis (ida) {% endblock %}</title> + + <!-- loads the path to static files --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> + + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> + + <link rel="stylesheet" type="text/css" href="{% static 'query/style.css' %}"/> + <link href='https://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> + <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css" integrity="sha384-/rXc/GQVaYpyDdyxK+ecHPVYJSN9bmVFBvjA/9eOB+pb3F2w2N6fc5qB9Ew5yIns" crossorigin="anonymous"> + + <link rel="icon" href="http://uilennest.net/static/esap_icon.jpg"> + + {% block extra_js %}{% endblock %} + +</head> +<body> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <div class="container-fluid"> + + <!-- Header --> + <div class="navbar-header"> + <a class="navbar-brand mb-0 h1"> + <h2> + <img src="{% static 'query/esap_logo.png' %}" alt=""> + ESAP API Gateway - Interactive Analysis (ida) + </h2> + </a> + </div> + + </div> + </nav> + + <!-- to add blocks of code --> + {% block myBlock %} + {% endblock %} + +</body> +</html> \ No newline at end of file diff --git a/esap/ida/templates/ida/index.html b/esap/ida/templates/ida/index.html new file mode 100644 index 0000000000000000000000000000000000000000..f4fd007704868b429d533c96fba821db9b9a1004 --- /dev/null +++ b/esap/ida/templates/ida/index.html @@ -0,0 +1,50 @@ +{% extends 'ida/base.html' %} +{% load static %} +{% block myBlock %} + +<div class="container-fluid details-container"> + <div class="row"> + <div class="col-sm-12 col-md-12 col-lg-12"> + <div class="panel panel-success"> + + <div class="panel-body"> + + <h4>API resources</h4> + <table class="table table-striped table-bordered table-sm"> + <thead> + <tr> + <th>Function</th> + <th>URL</th> + </tr> + </thead> + <tbody> + + <div class="row"> + <tr> + <td> + Interactive Analyses + </td> + <td> + <a href="{% url 'ida-view' %}">{% url 'ida-view' %}</a> + </td> + + </tr> + + </div> + + </tbody> + </table> + + </div> + </div> + </div> + + </div> + +</div> + + +<p class="footer" small>Version 24 july 2020</p> + +{% endblock %} + diff --git a/esap/ida/tests.py b/esap/ida/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/esap/ida/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/esap/logs/esap.log b/esap/logs/esap.log index ac0c50661e50726fc47f45e54758fa74591a8704..3016b6397b76f8cdd7c42c33a054b8e76c94da94 100644 --- a/esap/logs/esap.log +++ b/esap/logs/esap.log @@ -3592,3 +3592,69 @@ [2020-07-21 15:50:06,126] nr of dataproducts in response: 67 [2020-07-21 15:50:06,129] run-query: https://alta.astron.nl/altapi/dataproducts?collection=imaging&view_ra=342.16&view_dec=33.94&view_fov=10&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube [2020-07-21 15:50:18,564] nr of dataproducts in response: 500 +[2020-07-21 17:19:01,190] query_controller.create_query() +[2020-07-21 17:19:01,219] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-21 17:19:01,220] construct_query: https://alta.astron.nl/altapi/dataproducts?collection=timedomain_and_view_ra=342.16_and_view_dec=33.94_and_view_fov=10_and_dataProductSubType=pulsarTimingTimeSeries +[2020-07-21 17:19:01,228] run-query: https://alta.astron.nl/altapi/dataproducts?collection=timedomain&view_ra=342.16&view_dec=33.94&view_fov=10&dataProductSubType=pulsarTimingTimeSeries +[2020-07-21 17:19:12,903] nr of dataproducts in response: 500 +[2020-07-21 17:19:24,003] query_controller.create_query() +[2020-07-21 17:19:29,157] query_controller.create_query() +[2020-07-21 17:20:02,066] query_controller.create_query() +[2020-07-21 17:27:23,011] ConfigurationView +[2020-07-21 17:27:23,039] ConfigurationView +[2020-07-21 17:27:27,783] ConfigurationView +[2020-07-21 17:27:33,878] query_controller.create_query() +[2020-07-21 17:27:33,883] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-21 17:27:33,883] construct_query: https://alta.astron.nl/altapi/dataproducts?collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-21 17:27:33,888] run-query: https://alta.astron.nl/altapi/dataproducts?collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-21 17:27:47,264] nr of dataproducts in response: 500 +[2020-07-21 17:30:51,887] query_controller.create_query() +[2020-07-21 17:30:51,894] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-21 17:30:51,895] construct_query: https://alta.astron.nl/altapi/dataproducts?collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-21 17:30:51,899] run-query: https://alta.astron.nl/altapi/dataproducts?collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-21 17:31:04,026] nr of dataproducts in response: 500 +[2020-07-23 10:46:03,634] ConfigurationView +[2020-07-23 10:51:37,964] ConfigurationView +[2020-07-23 10:51:45,805] ConfigurationView +[2020-07-23 11:12:41,525] ConfigurationView +[2020-07-23 11:42:38,692] ConfigurationView +[2020-07-23 11:43:03,833] ConfigurationView +[2020-07-23 11:43:23,926] ConfigurationView +[2020-07-23 12:38:38,879] ConfigurationView +[2020-07-23 12:53:58,425] ConfigurationView +[2020-07-23 12:55:15,112] ConfigurationView +[2020-07-23 12:56:04,908] ConfigurationView +[2020-07-23 12:56:40,381] query_controller.create_query() +[2020-07-23 12:56:40,389] construct_query: https://alta.astron.nl/altapi/dataproducts?dataProductType=continuumMF_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 12:56:40,394] run-query: https://alta.astron.nl/altapi/dataproducts?dataProductType=continuumMF&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 12:56:46,448] nr of dataproducts in response: 0 +[2020-07-23 13:10:34,719] ConfigurationView +[2020-07-23 13:19:54,082] query_controller.create_query() +[2020-07-23 13:19:54,090] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-23 13:19:54,091] construct_query: https://alta.astron.nl/altapi/dataproducts?collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:19:54,094] run-query: https://alta.astron.nl/altapi/dataproducts?collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:20:13,128] nr of dataproducts in response: 500 +[2020-07-23 13:20:32,483] query_controller.create_query() +[2020-07-23 13:20:32,489] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-23 13:20:32,490] construct_query: https://alta.astron.nl/altapi/dataproducts?dataProductType=cube_and_collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:20:32,499] run-query: https://alta.astron.nl/altapi/dataproducts?dataProductType=cube&collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:20:49,257] nr of dataproducts in response: 500 +[2020-07-23 13:22:23,733] query_controller.create_query() +[2020-07-23 13:22:23,739] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-23 13:22:23,739] construct_query: https://alta.astron.nl/altapi/dataproducts?dataProductType=cube_and_dataProductSubType=imageCube_and_collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:22:23,742] run-query: https://alta.astron.nl/altapi/dataproducts?dataProductType=cube&dataProductSubType=imageCube&collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:22:42,646] nr of dataproducts in response: 500 +[2020-07-23 13:23:00,238] query_controller.create_query() +[2020-07-23 13:23:00,244] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-23 13:23:00,244] construct_query: https://alta.astron.nl/altapi/dataproducts?dataProductSubType=continuumMF_and_collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:23:00,248] run-query: https://alta.astron.nl/altapi/dataproducts?dataProductSubType=continuumMF&collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:23:09,749] nr of dataproducts in response: 142 +[2020-07-23 13:23:23,614] query_controller.create_query() +[2020-07-23 13:24:14,570] query_controller.create_query() +[2020-07-23 13:24:25,539] ConfigurationView +[2020-07-23 13:24:31,232] query_controller.create_query() +[2020-07-23 13:38:20,763] query_controller.create_query() +[2020-07-23 13:38:20,770] ERROR: could not translating key collection 'collection', using it raw. +[2020-07-23 13:38:20,770] construct_query: https://alta.astron.nl/altapi/dataproducts?dataProductType=image_and_collection=imaging_and_dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:38:20,773] run-query: https://alta.astron.nl/altapi/dataproducts?dataProductType=image&collection=imaging&dataProductSubType__in=calibratedVisibility,continuumMF,continuumChunk,imageCube,beamCube,polarisationImage,polarisationCube,continuumCube +[2020-07-23 13:38:39,565] nr of dataproducts in response: 500 diff --git a/esap/query/admin.py b/esap/query/admin.py index 1d8acf5d10e10c262aa1cc1b469251f59169e06d..a3b4fc942e89f02eb080a0ace763c05bd7dece82 100644 --- a/esap/query/admin.py +++ b/esap/query/admin.py @@ -7,3 +7,5 @@ admin.site.register(DataSet) admin.site.register(Catalog) #admin.site.register(CatalogService) admin.site.register(ParameterMapping) + + diff --git a/esap/staging/api/admin.py b/esap/staging/admin.py similarity index 60% rename from esap/staging/api/admin.py rename to esap/staging/admin.py index 28a96b3fb5fed52747ddb7a3246fdab1abc0da24..cc347e979fbaa588bc6c178dec26a45d3537a90c 100644 --- a/esap/staging/api/admin.py +++ b/esap/staging/admin.py @@ -1,4 +1,3 @@ from django.contrib import admin -from esap.staging.models import Staging - +from .models import Staging admin.site.register(Staging) diff --git a/esap/staging/api/views.py b/esap/staging/api/views.py index c6f7a7f76cc13a9bd0d76197b6b4475fb0d56e59..8f8f4b8fa2ebac43742841a4905bb2ce599cd4d3 100644 --- a/esap/staging/api/views.py +++ b/esap/staging/api/views.py @@ -18,7 +18,7 @@ class StagingViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(owner=self.request.user) -# example: /esap/query/ +# example: /esap/staging/ class IndexView(ListView): queryset = Staging.objects.all() serializer_class = StagingSerializer diff --git a/esap/staging/database_router.py b/esap/staging/database_router.py new file mode 100644 index 0000000000000000000000000000000000000000..b976b35dab605eafd3ecfcbaf1fbcdddc2766671 --- /dev/null +++ b/esap/staging/database_router.py @@ -0,0 +1,37 @@ +class StagingRouter: + + route_app_labels = {'staging'} + + def db_for_read(self, model, **hints): + """ + Attempts to read staging models go to staging database. + """ + if model._meta.app_label in self.route_app_labels: + return 'staging' + + def db_for_write(self, model, **hints): + """ + Writes always go to staging. + """ + return 'staging' + + def allow_relation(self, obj1, obj2, **hints): + """ + Allow relations if a model in the staging apps is + involved. + """ + if ( + obj1._meta.app_label in self.route_app_labels or + obj2._meta.app_label in self.route_app_labels + ): + return True + return None + + def allow_migrate(self, db, app_label, model_name=None, **hints): + """ + Make sure the staging apps only appear in the + 'staging' database. + """ + if app_label in self.route_app_labels: + return db == 'staging' + return None \ No newline at end of file diff --git a/esap/staging/models.py b/esap/staging/models.py index 8b2eff9d10dd9a3b94e0dc716471e3cb9fc2cf3d..376d1bc405ac3128de4a6a60c824b2d644798093 100644 --- a/esap/staging/models.py +++ b/esap/staging/models.py @@ -1,4 +1,5 @@ from django.db import models class Staging(models.Model): - uri = models.CharField(max_length=40, null=False) \ No newline at end of file + uri = models.CharField(max_length=40, null=False) + status = models.CharField(max_length=40, null=False) \ No newline at end of file diff --git a/esap/staging/templates/staging/index.html b/esap/staging/templates/staging/index.html index 4d730b30fd3285dce5ce198c4009d2f24fedcb44..906777933b13c8f5845ef07423f2f3d82ee27cf5 100644 --- a/esap/staging/templates/staging/index.html +++ b/esap/staging/templates/staging/index.html @@ -44,7 +44,7 @@ </div> -<p class="footer" small>ASTRON - version 0.7.2 - 30 jun 2020</p> +<p class="footer" small>ASTRON 24 jul 2020</p> {% endblock %}