Skip to content
Snippets Groups Projects
views.py 3.33 KiB
Newer Older
Mattia Mancini's avatar
Mattia Mancini committed
from django.shortcuts import render
from django.conf import settings
Mattia Mancini's avatar
Mattia Mancini committed
from django.contrib.auth.models import User
Nico Vermaas's avatar
Nico Vermaas committed

Mattia Mancini's avatar
Mattia Mancini committed
from rest_framework import generics
Nico Vermaas's avatar
Nico Vermaas committed
from django_filters import rest_framework as filters
from rest_framework.schemas.openapi import AutoSchema
Nico Vermaas's avatar
Nico Vermaas committed

from .models import DataProduct, DataProductFilter, DataLocation, WorkSpecification, ATDBProcessingSite
Mattia Mancini's avatar
Mattia Mancini committed
from .serializers import DataProductSerializer, \
    DataProductFlatSerializer, DataLocationSerializer, \
    WorkSpecificationSerializer
Nico Vermaas's avatar
Nico Vermaas committed

Mattia Mancini's avatar
Mattia Mancini committed

class DynamicFilterSet(filters.FilterSet):
Nico Vermaas's avatar
Nico Vermaas committed
    class Meta:
Mattia Mancini's avatar
Mattia Mancini committed
        filter_class = None

    def __init__(self, *args, **kwargs):
        self._load_filters()
        super().__init__(*args, **kwargs)

    def _load_filters(self):
        if self.Meta.filter_class is None:
            raise Exception('Define filter_class meta attribute')
        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)
Nico Vermaas's avatar
Nico Vermaas committed

Mattia Mancini's avatar
Mattia Mancini committed

# --- Filters ---
class DataProductFilterSet(DynamicFilterSet):
    class Meta:
        model = DataProduct
        filter_class = DataProductFilter
Nico Vermaas's avatar
Nico Vermaas committed
        fields = {
Mattia Mancini's avatar
Mattia Mancini committed
            'obs_id': ['exact', 'icontains'],
Nico Vermaas's avatar
Nico Vermaas committed
        }

Mattia Mancini's avatar
Mattia Mancini committed

# ---------- GUI Views -----------
Nico Vermaas's avatar
Nico Vermaas committed

def index(request):
    atdb_hosts = ATDBProcessingSite.objects.values('name', 'url')
    return render(request, "lofardata/index.html", {'atdb_hosts': atdb_hosts})
Nico Vermaas's avatar
Nico Vermaas committed


# ---------- REST API views ----------
Mattia Mancini's avatar
Mattia Mancini committed
class DataProductView(generics.ListCreateAPIView):
    model = DataProduct
    serializer_class = DataProductSerializer
Nico Vermaas's avatar
Nico Vermaas committed

Mattia Mancini's avatar
Mattia Mancini committed
    queryset = DataProduct.objects.all().order_by('obs_id')
Nico Vermaas's avatar
Nico Vermaas committed

    # using the Django Filter Backend - https://django-filter.readthedocs.io/en/latest/index.html
    filter_backends = (filters.DjangoFilterBackend,)
Mattia Mancini's avatar
Mattia Mancini committed
    filter_class = DataProductFilterSet


class DataProductDetailsView(generics.RetrieveUpdateDestroyAPIView):
    model = DataProduct
    serializer_class = DataProductSerializer
    queryset = DataProduct.objects.all()


Mattia Mancini's avatar
Mattia Mancini committed
class DataLocationView(generics.ListCreateAPIView):
    model = DataLocation
    serializer_class = DataLocationSerializer
    queryset = DataLocation.objects.all().order_by('name')


class InsertWorkSpecificationSchema(AutoSchema):
    def get_operation_id_base(self, path, method, action):
        return 'createDataProductMulti'


Mattia Mancini's avatar
Mattia Mancini committed
class InsertMultiDataproductView(generics.CreateAPIView):
    """
    Add single DataProduct
    """
    queryset = DataProduct.objects.all()
    serializer_class = DataProductFlatSerializer
    schema = InsertWorkSpecificationSchema()
Mattia Mancini's avatar
Mattia Mancini committed

    def get_serializer(self, *args, **kwargs):
        """ if an array is passed, set serializer to many """
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super().get_serializer(*args, **kwargs)
Mattia Mancini's avatar
Mattia Mancini committed


class InsertWorkSpecification(generics.CreateAPIView, generics.ListCreateAPIView):
    queryset = WorkSpecification.objects.all()
    serializer_class = WorkSpecificationSerializer

    def get_queryset(self):
        current_user: User = self.request.user
        if not current_user.is_staff or not current_user.is_superuser:
            return self.queryset.filter(created_by=current_user.id)
Mattia Mancini's avatar
Mattia Mancini committed
        else:
            return self.queryset