Skip to content
Snippets Groups Projects
Commit 06993aeb authored by Mattia Mancini's avatar Mattia Mancini
Browse files

Story LSMR-13: Implementing directory structure to support additional

models/serializers/viewsets
parent af22c118
No related branches found
No related tags found
1 merge request!87Lsmr epic
......@@ -4249,8 +4249,17 @@ SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180705_0736.py -text
SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text
SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text
SAS/LSMR/src/lsmr/lsmrapp/models.py -text
SAS/LSMR/src/lsmr/lsmrapp/models/CMakeLists.txt -text
SAS/LSMR/src/lsmr/lsmrapp/models/__init__.py -text
SAS/LSMR/src/lsmr/lsmrapp/models/specification.py -text
SAS/LSMR/src/lsmr/lsmrapp/serializers.py -text
SAS/LSMR/src/lsmr/lsmrapp/serializers/CMakeLists.txt -text
SAS/LSMR/src/lsmr/lsmrapp/serializers/__init__.py -text
SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py -text
SAS/LSMR/src/lsmr/lsmrapp/viewsets.py -text
SAS/LSMR/src/lsmr/lsmrapp/viewsets/CMakeLists.txt -text
SAS/LSMR/src/lsmr/lsmrapp/viewsets/__init__.py -text
SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py -text
SAS/LSMR/src/lsmr/settings.py -text
SAS/LSMR/src/lsmr/urls.py -text
SAS/LSMR/src/lsmr/wsgi.py -text
......
......@@ -5,13 +5,13 @@ set(_py_files
__init__.py
admin.py
apps.py
models.py
viewsets.py
serializers.py
)
python_install(${_py_files}
DESTINATION lofar/sas/lsmr/lsmr/lsmrapp)
add_subdirectory(migrations)
\ No newline at end of file
add_subdirectory(migrations)
add_subdirectory(models)
add_subdirectory(serializers)
add_subdirectory(viewsets)
include(PythonInstall)
set(_py_files
__init__.py
specification.py
)
python_install(${_py_files}
DESTINATION lofar/sas/lsmr/lsmr/lsmrapp/models)
from .specification import *
\ No newline at end of file
"""
This file contains the database models
"""
from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, Field
from django.contrib.postgres.fields import ArrayField, JSONField
from django.contrib.postgres.indexes import GinIndex
from enum import Enum
#
# Common
#
# abstract models
class BasicCommon(Model):
# todo: we cannot use foreign keys in the array here, so we have to keep the Tags table up to date by trigger or so.
# todo: we could switch to a manytomany field instead?
tags = ArrayField(CharField(max_length=30), size=8, blank=True)
creation = DateTimeField(auto_now_add=True)
update = DateTimeField(auto_now=True)
class Meta:
abstract = True
indexes = [GinIndex(fields=['tags'])]
class UserDefinedCommon(BasicCommon):
name = CharField(max_length=30)
class Meta:
abstract = True
class SystemDefinedCommon(BasicCommon):
class Meta:
abstract = True
# concrete models
class Tags(Model):
# todo: figure out how to keep this in sync with tags columns (->BasicCommon)
# todo: Or remove this altogether without keeping track of tags?
title = CharField(max_length=30)
description = CharField(max_length=255)
#
# I/O
#
# enums
class RoleChoice(Enum):
CORRELATOR = "correlator"
BEAMFORMER = "beamformer"
INSPECTION_PLOTS = "inspection plots"
CALIBRATOR = "calibrator"
TARGET = "target"
INPUT_OUTPUT = "input, output"
class DatatypeChoice(Enum):
VISIBILITIES = "visibilities"
TIME_SERIES = "time series"
INSTRUMENT_MODEL = "instrument model"
IMAGE = "image"
QUALITY = "quality"
class DataformatChoice(Enum):
MEASUREMENTSET = "MeasurementSet"
HDF5 = "HDF5"
# todo: fix this!
#class EnumField(Field): # todo: Test if CharField works better e.g. for forms
# """
# Django does not support creating db enums, so we got to do that ourselves here
# """
# def __init__(self, *args, **kwargs):
# super(EnumField, self).__init__(*args, **kwargs)
#
# def db_type(self, connection):
# return "enum(%s)" % ','.join("'%s'" % key for (key, _) in self.choices)
# # todo: unfortunately this won't work for Postgres since a CREATE TYPE is required first...
# concrete models
class WorkIORoles(Model):
# todo: Choices do not translate to a Postgres ENUM type currently, but are only enforced on the Django level.
# todo: If we are not happy with this as is, I see two options:
# todo: 1. Wait to see if they implement that EnumField in the meantime (https://code.djangoproject.com/ticket/24342)
# todo: 2. Build this ourselves. I tried to achieve that with the EnumField above, but it won't be that easy, I guess
role = CharField(
max_length=30,
choices=[(item.name, item.value) for item in RoleChoice]
)
datatype = CharField(
max_length=30,
choices=[(item.name, item.value) for item in DatatypeChoice]
)
dataformat = ArrayField(CharField(
max_length=30,
choices=[(item.name, item.value) for item in DataformatChoice]
), size=8, blank=True)
outputs = ForeignKey("WorkRequestTemplate", related_name='role_output', on_delete=CASCADE, null=True)
inputs = ForeignKey("WorkRequestTemplate", related_name='role_input', on_delete=CASCADE, null=True)
#
# Templates
#
# abstract models
class Template(SystemDefinedCommon):
name = CharField(max_length=30) # todo: check if this should go in SystemDefinedCommon or BasicCommon
description = CharField(max_length=255) # todo: check if this should go in SystemDefinedCommon or BasicCommon
default_version = BooleanField()
version = CharField(max_length=30)
schema = JSONField()
class Meta:
abstract = True
#unique_together = ("name", "default_version") # todo: We only want this for default_version=True, find a way to do so
# concrete models
class GeneratorTemplate(Template):
create_func = CharField(max_length=30)
class RunTemplate(Template):
pass
class WorkRequestTemplate(Template):
validation_code_js = CharField(max_length=30)
# outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE) # todo: removed in latest draft, delete?
# inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE) # todo: removed in latest draft, delete?
class WorkRelationSelectionTemplate(Template):
pass
#
# Instance Objects
#
# todo: the blue stuff
# run / work request / work request relation -> SystemDefinedCommon
# others -> UserDefinedCommon
\ No newline at end of file
include(PythonInstall)
set(_py_files
__init__.py
specification.py
)
python_install(${_py_files}
DESTINATION lofar/sas/lsmr/lsmr/lsmrapp/serializers)
from .specification import *
\ No newline at end of file
"""
This file contains the serializers (for the elsewhere defined data models)
"""
from rest_framework import serializers
from lsmr.lsmrapp import models
class TagsSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Tags
fields = '__all__'
class GeneratorTemplateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.GeneratorTemplate
fields = '__all__'
class RunTemplateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.RunTemplate
fields = '__all__'
class WorkRequestTemplateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.WorkRequestTemplate
fields = '__all__'
class WorkRelationSelectionTemplateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.WorkRelationSelectionTemplate
fields = '__all__'
class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.WorkIORoles
fields = '__all__'
include(PythonInstall)
set(_py_files
__init__.py
specification.py
)
python_install(${_py_files}
DESTINATION lofar/sas/lsmr/lsmr/lsmrapp/viewsets)
from .specification import *
\ No newline at end of file
"""
This file contains the viewsets (based on the elsewhere defined data models and serializers)
"""
from rest_framework import viewsets
from lsmr.lsmrapp import models, serializers
class TagsViewSet(viewsets.ModelViewSet):
queryset = models.Tags.objects.all()
serializer_class = serializers.TagsSerializer
class GeneratorTemplateViewSet(viewsets.ModelViewSet):
queryset = models.GeneratorTemplate.objects.all()
serializer_class = serializers.GeneratorTemplateSerializer
class RunTemplateViewSet(viewsets.ModelViewSet):
queryset = models.RunTemplate.objects.all()
serializer_class = serializers.RunTemplateSerializer
class WorkRequestTemplateViewSet(viewsets.ModelViewSet):
queryset = models.WorkRequestTemplate.objects.all()
serializer_class = serializers.WorkRequestTemplateSerializer
class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet):
queryset = models.WorkRelationSelectionTemplate.objects.all()
serializer_class = serializers.WorkRelationSelectionTemplateSerializer
class WorkIORolesViewSet(viewsets.ModelViewSet):
queryset = models.WorkIORoles.objects.all()
serializer_class = serializers.WorkIORolesSerializer
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment