From 61c6537846e05dfa3ce027611e09731e857a8b69 Mon Sep 17 00:00:00 2001 From: mancini <mancini@astron.nl> Date: Tue, 19 Jul 2022 11:27:52 +0200 Subject: [PATCH] Add DataproductFilter and Rename Dataproduct --- ldvspec/lofardata/admin.py | 6 ++- ldvspec/lofardata/models.py | 30 +++++++++-- ldvspec/lofardata/serializers.py | 6 +-- .../lofardata/templates/lofardata/base.html | 2 +- .../lofardata/templates/lofardata/index.html | 3 +- ldvspec/lofardata/urls.py | 9 +++- ldvspec/lofardata/views.py | 54 +++++++++++++------ 7 files changed, 81 insertions(+), 29 deletions(-) diff --git a/ldvspec/lofardata/admin.py b/ldvspec/lofardata/admin.py index cf044d64..e42f8088 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 51562821..0d233fc9 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 aaf9229c..189e327c 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 020485db..e5ab1386 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 76803327..f41e698a 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 236c3de9..99257b63 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 d058d3cf..92120167 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') -- GitLab