diff --git a/.gitattributes b/.gitattributes index eb1a1acda2721c3aaddbedaee8c79571e8bd89e0..14b9c42f2b420af2c5e1c5a80f38d5ec53901a60 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4248,15 +4248,12 @@ SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text 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 diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models.py b/SAS/LSMR/src/lsmr/lsmrapp/models.py deleted file mode 100644 index a7c28a13ef263cb12eb5a7d230bc8647d473d029..0000000000000000000000000000000000000000 --- a/SAS/LSMR/src/lsmr/lsmrapp/models.py +++ /dev/null @@ -1,161 +0,0 @@ -""" -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 diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py index a7c28a13ef263cb12eb5a7d230bc8647d473d029..477e780ed128d1262eae8febe48956a5f007a627 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py @@ -2,7 +2,7 @@ This file contains the database models """ -from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, Field +from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, IntegerField, SET_NULL from django.contrib.postgres.fields import ArrayField, JSONField from django.contrib.postgres.indexes import GinIndex from enum import Enum @@ -150,12 +150,24 @@ 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 +# others -> UserDefinedCommon +class Cycle(UserDefinedCommon): + start = DateTimeField() + + +class Project(UserDefinedCommon): + cycle = ForeignKey(Cycle, on_delete=CASCADE) + priority = IntegerField(default=0) # todo: define a value for the default priority + can_trigger = BooleanField(default=False) + private_data = BooleanField(default=True) + + +class RunSet(UserDefinedCommon): + generator_paramets_doc = JSONField() + generator_template = ForeignKey(GeneratorTemplate, on_delete=SET_NULL) \ No newline at end of file diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py deleted file mode 100644 index 9b70a05d1b004a7a08724f19c54df16d6b741b94..0000000000000000000000000000000000000000 --- a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -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__' - diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py index 9b70a05d1b004a7a08724f19c54df16d6b741b94..2c7c550358c1e44e171d531de5b14e7b2af757cb 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py @@ -41,3 +41,20 @@ class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer): model = models.WorkIORoles fields = '__all__' + +class CycleSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = models.Cycle + fields = '__all__' + + +class ProjectSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = models.Project + fields = '__all__' + + +class RunSetSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = models.RunSet + fields = '__all__' diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py deleted file mode 100644 index ce4aff6ec8c51d277246783ecfe2efc21a3bf23d..0000000000000000000000000000000000000000 --- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -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 diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py index ce4aff6ec8c51d277246783ecfe2efc21a3bf23d..56d4e437124cde07c7564f6f8de0bb40064656e6 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py @@ -34,3 +34,19 @@ class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet): class WorkIORolesViewSet(viewsets.ModelViewSet): queryset = models.WorkIORoles.objects.all() serializer_class = serializers.WorkIORolesSerializer + + +class CycleViewSet(viewsets.ModelViewSet): + queryset = models.Cycle.objects.all() + serializer_class = serializers.CycleSerializer + + +class ProjectViewSet(viewsets.ModelViewSet): + queryset = models.Project.objects.all() + serializer_class = serializers.ProjectSerializer + + +class RunSetViewSet(viewsets.ModelViewSet): + queryset = models.RunSet.objects.all() + serializer_class = serializers.RunSetSerializer + diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py index 0522c96bdf3b3ef9b89f1d244b662d62c9cbf914..962a15368fe986e57883842a494729ef83b13575 100644 --- a/SAS/LSMR/src/lsmr/urls.py +++ b/SAS/LSMR/src/lsmr/urls.py @@ -42,5 +42,9 @@ router.register(r'run_template', viewsets.RunTemplateViewSet) router.register(r'work_request_template', viewsets.WorkRequestTemplateViewSet) router.register(r'work_relation_selection_template', viewsets.WorkRelationSelectionTemplateViewSet) router.register(r'work_io_roles', viewsets.WorkIORolesViewSet) +router.register(r'cycle', viewsets.CycleViewSet) +router.register(r'project', viewsets.ProjectViewSet) +router.register(r'run_set', viewsets.RunSetViewSet) + urlpatterns.extend(router.urls)