diff --git a/ldvspec/lofardata/admin.py b/ldvspec/lofardata/admin.py index cf044d64e6c5d0935980c65f941a89eff47f36d7..e42f80883d51fbabe15e412aaaa66445078aa39a 100644 --- a/ldvspec/lofardata/admin.py +++ b/ldvspec/lofardata/admin.py @@ -1,5 +1,7 @@ from django.contrib import admin # Register your models here. -from .models import LofarData -admin.site.register(LofarData) \ No newline at end of file +from .models import DataProduct, DataProductFilter + +admin.site.register(DataProduct) +admin.site.register(DataProductFilter) diff --git a/ldvspec/lofardata/models.py b/ldvspec/lofardata/models.py index 515628218e41e33b0be8633df57d83f89385ba58..0d233fc9c6f7c4d54490f66bcda851750b9c6459 100644 --- a/ldvspec/lofardata/models.py +++ b/ldvspec/lofardata/models.py @@ -1,8 +1,30 @@ from django.db import models +from django_filters import rest_framework as filters -class LofarData(models.Model): - sas_id = models.CharField(verbose_name="SAS_ID", max_length=15, blank=True, null=True) - def __str__(self): - return self.sas_id + +class DataLocations(models.Model): + name = models.CharField(max_length=50, primary_key=True) + uri = models.CharField(max_length=200) + + +class DataProduct(models.Model): + obs_id = models.CharField(verbose_name="OBS_ID", max_length=15) + oid_source = models.CharField(verbose_name='OBS_ID_SOURCE', max_length=15) + dataproduct_source = models.CharField(max_length=20) + dataproduct_type = models.CharField(max_length=50) + project = models.CharField(max_length=15) + location = models.ForeignKey(DataLocations, on_delete=models.DO_NOTHING) + activity = models.CharField(max_length=50) + surl = models.CharField(max_length=200) + filesize = models.PositiveBigIntegerField() + additional_meta = models.JSONField() + + +class DataProductFilter(models.Model): + + field = models.CharField(max_length=20) + name = models.CharField(max_length=20) + lookup_type = models.CharField(max_length=100) + diff --git a/ldvspec/lofardata/serializers.py b/ldvspec/lofardata/serializers.py index aaf9229c414b1b20f901be87a5d9fa53618cd7a9..189e327c18d9210cd26b23ba53bd65f3051458b1 100644 --- a/ldvspec/lofardata/serializers.py +++ b/ldvspec/lofardata/serializers.py @@ -1,8 +1,8 @@ from rest_framework import serializers -from .models import LofarData +from .models import DataProduct -class LofarDataSerializer(serializers.ModelSerializer): +class DataProductSerializer(serializers.ModelSerializer): class Meta: - model = LofarData + model = DataProduct fields = "__all__" diff --git a/ldvspec/lofardata/templates/lofardata/base.html b/ldvspec/lofardata/templates/lofardata/base.html index 020485dbd2f2b26f6a02a1d29810b4ed0e731bb7..e5ab1386442bf38a9a3f6bfd4fece547a9658fc5 100644 --- a/ldvspec/lofardata/templates/lofardata/base.html +++ b/ldvspec/lofardata/templates/lofardata/base.html @@ -34,7 +34,7 @@ </li> <li><a class="nav-link" href="{% url 'index' %}">Home</a></li> - <li><a class="nav-link" href="{% url 'lofardata' %}">LOFAR Data</a></li> + <li><a class="nav-link" href="{% url 'dataproduct' %}">LOFAR Data</a></li> {% if user.is_authenticated %} <a class="nav-link" href="{% url 'logout' %}" target="_blank">Logout {{ user.get_username }}</a> diff --git a/ldvspec/lofardata/templates/lofardata/index.html b/ldvspec/lofardata/templates/lofardata/index.html index 76803327bb3eef32421637c330b7029772fa9107..f41e698a5f62e759ff9087f7512d9892bb64452f 100644 --- a/ldvspec/lofardata/templates/lofardata/index.html +++ b/ldvspec/lofardata/templates/lofardata/index.html @@ -9,7 +9,8 @@ <tbody> <tr><td>atdb_host</td><td>{{ atdb_host }}</td></tr> - <tr><td>api</td><td><a href="{% url 'lofardata' %}">{% url 'lofardata' %}</a></td></tr> + <tr><td>api</td><td><a href="{% url 'dataproduct' %}">{% url 'dataproduct' %}</a></td></tr> + <tr><td>api-schema</td><td><a href="{% url 'openapi-schema' %}">{% url 'openapi-schema' %}</a></td></tr> </tbody> </table> diff --git a/ldvspec/lofardata/urls.py b/ldvspec/lofardata/urls.py index 236c3de9ebcabd2e1765fd0144414e116a281fea..99257b63f946d7419d123ebfe0e89c14fc4cec47 100644 --- a/ldvspec/lofardata/urls.py +++ b/ldvspec/lofardata/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from django.contrib.auth import views as auth_views from rest_framework.authtoken import views as rest_auth_views +from rest_framework.schemas import get_schema_view from . import views @@ -13,8 +14,12 @@ urlpatterns = [ path('login/', auth_views.LoginView.as_view(template_name='registration/login.html')), # REST API - path('lofardata/', views.LofarDataView.as_view(), name='lofardata'), - + path('data/', views.DataProductView.as_view(), name='dataproduct'), + path('openapi/', get_schema_view( + title="LDV Specification", + description="API description", + version="0.0.1" + ), name='openapi-schema'), # GUI #path('', views.IndexView.as_view(), name='index'), path('', views.index, name='index'), diff --git a/ldvspec/lofardata/views.py b/ldvspec/lofardata/views.py index d058d3cf4311c2ca01159c3ce6ed54dbdd5536c4..92120167993ee234e0de3838aa144633d3e0e6c1 100644 --- a/ldvspec/lofardata/views.py +++ b/ldvspec/lofardata/views.py @@ -1,26 +1,45 @@ - -from django.shortcuts import render, redirect, reverse -from django.views.generic import ListView +from django.shortcuts import render from django.conf import settings from rest_framework import generics, pagination -from rest_framework.views import APIView -import django_filters from django_filters import rest_framework as filters -from .models import LofarData -from .serializers import LofarDataSerializer +from .models import DataProduct, DataProductFilter +from .serializers import DataProductSerializer -# --- Filters --- -class LofarDataFilter(filters.FilterSet): + +class DynamicFilterSet(filters.FilterSet): class Meta: - model = LofarData + filter_class = None + + def __init__(self, *args, **kwargs): + self._load_filters() + super().__init__(*args, **kwargs) + + def _load_filters(self): + print('Current filters are', self.base_filters) + if self.Meta.filter_class is None: + raise Exception('Define filter_class meta attribute') + + print('Filter to be added', self.Meta.filter_class.objects.all()) + for item in self.Meta.filter_class.objects.all(): + field_obj = self.Meta.model._meta.get_field(item.field) + filter_class, *_ = self.filter_for_lookup(field_obj, item.lookup_type) + self.base_filters[item.name] = filter_class(item.field) + print('Final filters are', self.base_filters) + +# --- Filters --- +class DataProductFilterSet(DynamicFilterSet): + class Meta: + model = DataProduct + filter_class = DataProductFilter fields = { - 'sas_id': ['exact', 'icontains'], + 'obs_id': ['exact', 'icontains'], } + # ---------- GUI Views ----------- def index(request): @@ -30,12 +49,15 @@ def index(request): # ---------- REST API views ---------- -class LofarDataView(generics.ListCreateAPIView): - model = LofarData - serializer_class = LofarDataSerializer +class DataProductView(generics.ListCreateAPIView): + model = DataProduct + serializer_class = DataProductSerializer - queryset = LofarData.objects.all().order_by('sas_id') + queryset = DataProduct.objects.all().order_by('obs_id') # using the Django Filter Backend - https://django-filter.readthedocs.io/en/latest/index.html filter_backends = (filters.DjangoFilterBackend,) - filter_class = LofarDataFilter + filter_class = DataProductFilterSet().__class__ + + def get_queryset(self): + return self.queryset.order_by('obs_id')