From c15da487f075ca1fc34bc85d63628f10a84f970a Mon Sep 17 00:00:00 2001 From: NeZanyat Date: Tue, 29 Jan 2019 13:48:56 +0200 Subject: [PATCH 1/2] Bckend model creation support --- docker-compose.yml | 1 - scidash/account/auth.py | 6 ++++++ scidash/main/settings.py | 3 +-- scidash/sciunitmodels/api/views.py | 11 ++++------- scidash/sciunitmodels/filters.py | 25 +++++++++--------------- scidash/sciunittests/filters.py | 31 +++++++++++++----------------- 6 files changed, 33 insertions(+), 44 deletions(-) create mode 100644 scidash/account/auth.py diff --git a/docker-compose.yml b/docker-compose.yml index d1e9b793..26e81a83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,4 +14,3 @@ services: depends_on: - scidash-redis - scidash-postgres - diff --git a/scidash/account/auth.py b/scidash/account/auth.py new file mode 100644 index 00000000..d00bd79e --- /dev/null +++ b/scidash/account/auth.py @@ -0,0 +1,6 @@ +from rest_framework.authentication import SessionAuthentication + + +class CsrfExemptSessionAuthentication(SessionAuthentication): + def enforce_csrf(self, request): + return # To not perform the csrf check previously happening diff --git a/scidash/main/settings.py b/scidash/main/settings.py index 64cfc41a..bfdcb6c4 100644 --- a/scidash/main/settings.py +++ b/scidash/main/settings.py @@ -75,7 +75,6 @@ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', @@ -86,7 +85,7 @@ # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework.authentication.SessionAuthentication', + 'scidash.account.auth.CsrfExemptSessionAuthentication', ], 'DEFAULT_FILTER_BACKENDS': [ 'django_filters.rest_framework.DjangoFilterBackend' diff --git a/scidash/sciunitmodels/api/views.py b/scidash/sciunitmodels/api/views.py index 4df3c24e..9cfe889b 100644 --- a/scidash/sciunitmodels/api/views.py +++ b/scidash/sciunitmodels/api/views.py @@ -1,15 +1,12 @@ from rest_framework import permissions, viewsets -from scidash.sciunitmodels.models import Capability, ModelClass, ModelInstance - from scidash.sciunitmodels.filters import ModelInstanceFilter - +from scidash.sciunitmodels.models import Capability, ModelClass, ModelInstance from scidash.sciunitmodels.serializers import ( CapabilitySerializer, ModelClassSerializer, ModelInstanceSerializer ) - class CapabilityViewSet(viewsets.ReadOnlyModelViewSet): queryset = Capability.objects.all() serializer_class = CapabilitySerializer @@ -22,8 +19,8 @@ class ModelClassViewSet(viewsets.ReadOnlyModelViewSet): permission_classes = (permissions.AllowAny, ) -class ModelInstanceViewSet(viewsets.ReadOnlyModelViewSet): +class ModelInstanceViewSet(viewsets.ModelViewSet): queryset = ModelInstance.objects.all() serializer_class = ModelInstanceSerializer - permission_classes = (permissions.AllowAny,) - filter_class = ModelInstanceFilter \ No newline at end of file + permission_classes = (permissions.IsAuthenticatedOrReadOnly, ) + filter_class = ModelInstanceFilter diff --git a/scidash/sciunitmodels/filters.py b/scidash/sciunitmodels/filters.py index a35fbc35..1dc78127 100644 --- a/scidash/sciunitmodels/filters.py +++ b/scidash/sciunitmodels/filters.py @@ -1,4 +1,3 @@ -from django.db.models import Count, Subquery, Q from django_filters import rest_framework as filters import scidash.sciunitmodels.models as models @@ -6,29 +5,23 @@ class ModelInstanceFilter(filters.FilterSet): class_name = filters.CharFilter( - name='model_class__class_name', - lookup_expr='icontains' + name='model_class__class_name', lookup_expr='icontains' ) - tags = filters.CharFilter( - name='tags__name', - lookup_expr='icontains' - ) + tags = filters.CharFilter(name='tags__name', lookup_expr='icontains') name = filters.CharFilter(name='name', lookup_expr='icontains') - timestamp_from = filters.IsoDateTimeFilter(name='timestamp', - lookup_expr='gte') + timestamp_from = filters.IsoDateTimeFilter( + name='timestamp', lookup_expr='gte' + ) - timestamp_to = filters.IsoDateTimeFilter(name='timestamp', - lookup_expr='lte') + timestamp_to = filters.IsoDateTimeFilter( + name='timestamp', lookup_expr='lte' + ) class Meta: model = models.ModelInstance fields = [ - 'name', - 'class_name', - 'tags', - 'timestamp_from', - 'timestamp_to' + 'name', 'class_name', 'tags', 'timestamp_from', 'timestamp_to' ] diff --git a/scidash/sciunittests/filters.py b/scidash/sciunittests/filters.py index 36df75ca..25c0d65d 100644 --- a/scidash/sciunittests/filters.py +++ b/scidash/sciunittests/filters.py @@ -6,32 +6,27 @@ class TestInstanceFilter(filters.FilterSet): class_name = filters.CharFilter( - name='test_class__class_name', - lookup_expr='icontains' + name='test_class__class_name', lookup_expr='icontains' ) - tags = filters.CharFilter( - name='tags__name', - lookup_expr='icontains' - ) + tags = filters.CharFilter(name='tags__name', lookup_expr='icontains') - name = filters.CharFilter(name='test_class__class_name', - lookup_expr='icontains') + name = filters.CharFilter( + name='test_class__class_name', lookup_expr='icontains' + ) - timestamp_from = filters.IsoDateTimeFilter(name='timestamp', - lookup_expr='gte') + timestamp_from = filters.IsoDateTimeFilter( + name='timestamp', lookup_expr='gte' + ) - timestamp_to = filters.IsoDateTimeFilter(name='timestamp', - lookup_expr='lte') + timestamp_to = filters.IsoDateTimeFilter( + name='timestamp', lookup_expr='lte' + ) class Meta: model = TestInstance fields = [ - 'name', - 'class_name', - 'tags', - 'timestamp_from', - 'timestamp_to' + 'name', 'class_name', 'tags', 'timestamp_from', 'timestamp_to' ] @@ -123,4 +118,4 @@ class TestSuiteFilter(filters.FilterSet): class Meta: model = TestSuite - fields = ['owner', 'timestamp_after', 'timestamp_before'] \ No newline at end of file + fields = ['owner', 'timestamp_after', 'timestamp_before'] From 56a5e134dda2b33dd0265550f0a33756888e7b60 Mon Sep 17 00:00:00 2001 From: NeZanyat Date: Thu, 31 Jan 2019 19:11:51 +0200 Subject: [PATCH 2/2] Backend updates for test instance creation and couple of fixes --- .../migrations/0010_auto_20190131_1330.py | 21 +++++++++++++ .../migrations/0011_auto_20190131_1333.py | 21 +++++++++++++ scidash/sciunitmodels/models.py | 2 +- scidash/sciunittests/api/views.py | 4 +-- .../migrations/0023_auto_20190131_1330.py | 31 +++++++++++++++++++ .../migrations/0024_auto_20190131_1530.py | 20 ++++++++++++ .../migrations/0025_testinstance_name.py | 20 ++++++++++++ scidash/sciunittests/models.py | 3 +- scidash/sciunittests/serializers.py | 2 +- 9 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 scidash/sciunitmodels/migrations/0010_auto_20190131_1330.py create mode 100644 scidash/sciunitmodels/migrations/0011_auto_20190131_1333.py create mode 100644 scidash/sciunittests/migrations/0023_auto_20190131_1330.py create mode 100644 scidash/sciunittests/migrations/0024_auto_20190131_1530.py create mode 100644 scidash/sciunittests/migrations/0025_testinstance_name.py diff --git a/scidash/sciunitmodels/migrations/0010_auto_20190131_1330.py b/scidash/sciunitmodels/migrations/0010_auto_20190131_1330.py new file mode 100644 index 00000000..de4c8b1e --- /dev/null +++ b/scidash/sciunitmodels/migrations/0010_auto_20190131_1330.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2019-01-31 13:30 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sciunitmodels', '0009_modelinstance_owner'), + ] + + operations = [ + migrations.AlterField( + model_name='modelinstance', + name='timestamp', + field=models.DateField(default=datetime.date.today), + ), + ] diff --git a/scidash/sciunitmodels/migrations/0011_auto_20190131_1333.py b/scidash/sciunitmodels/migrations/0011_auto_20190131_1333.py new file mode 100644 index 00000000..06ccef26 --- /dev/null +++ b/scidash/sciunitmodels/migrations/0011_auto_20190131_1333.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2019-01-31 13:33 +from __future__ import unicode_literals + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sciunitmodels', '0010_auto_20190131_1330'), + ] + + operations = [ + migrations.AlterField( + model_name='modelinstance', + name='attributes', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), + ), + ] diff --git a/scidash/sciunitmodels/models.py b/scidash/sciunitmodels/models.py index 59eb7ad1..6ce2dd1b 100644 --- a/scidash/sciunitmodels/models.py +++ b/scidash/sciunitmodels/models.py @@ -36,7 +36,7 @@ def __str__(self): class ModelInstance(models.Model): model_class = models.ForeignKey(ModelClass) backend = models.CharField(max_length=200, null=True, blank=True) - attributes = JSONField() + attributes = JSONField(blank=True, null=True) name = models.CharField(max_length=50) run_params = HStoreField(blank=True, null=True) owner = models.ForeignKey(general_models.ScidashUser, null=True) diff --git a/scidash/sciunittests/api/views.py b/scidash/sciunittests/api/views.py index 537212f0..0b549776 100644 --- a/scidash/sciunittests/api/views.py +++ b/scidash/sciunittests/api/views.py @@ -19,10 +19,10 @@ class ScoreViewSet(viewsets.ReadOnlyModelViewSet): filter_class = ScoreFilter -class TestInstanceViewSet(viewsets.ReadOnlyModelViewSet): +class TestInstanceViewSet(viewsets.ModelViewSet): queryset = TestInstance.objects.all() serializer_class = TestInstanceSerializer - permission_classes = (permissions.AllowAny, ) + permission_classes = (permissions.IsAuthenticatedOrReadOnly, ) filter_class = TestInstanceFilter diff --git a/scidash/sciunittests/migrations/0023_auto_20190131_1330.py b/scidash/sciunittests/migrations/0023_auto_20190131_1330.py new file mode 100644 index 00000000..65936a42 --- /dev/null +++ b/scidash/sciunittests/migrations/0023_auto_20190131_1330.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2019-01-31 13:30 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sciunittests', '0022_testinstance_owner'), + ] + + operations = [ + migrations.AlterField( + model_name='scoreinstance', + name='timestamp', + field=models.DateField(default=datetime.date.today), + ), + migrations.AlterField( + model_name='testinstance', + name='timestamp', + field=models.DateField(default=datetime.date.today), + ), + migrations.AlterField( + model_name='testsuite', + name='timestamp', + field=models.DateField(default=datetime.date.today), + ), + ] diff --git a/scidash/sciunittests/migrations/0024_auto_20190131_1530.py b/scidash/sciunittests/migrations/0024_auto_20190131_1530.py new file mode 100644 index 00000000..c9d4d853 --- /dev/null +++ b/scidash/sciunittests/migrations/0024_auto_20190131_1530.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2019-01-31 15:30 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sciunittests', '0023_auto_20190131_1330'), + ] + + operations = [ + migrations.AlterField( + model_name='testinstance', + name='test_suites', + field=models.ManyToManyField(blank=True, null=True, related_name='tests', to='sciunittests.TestSuite'), + ), + ] diff --git a/scidash/sciunittests/migrations/0025_testinstance_name.py b/scidash/sciunittests/migrations/0025_testinstance_name.py new file mode 100644 index 00000000..37b7773c --- /dev/null +++ b/scidash/sciunittests/migrations/0025_testinstance_name.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2019-01-31 15:45 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sciunittests', '0024_auto_20190131_1530'), + ] + + operations = [ + migrations.AddField( + model_name='testinstance', + name='name', + field=models.CharField(default='Default Name', max_length=200), + ), + ] diff --git a/scidash/sciunittests/models.py b/scidash/sciunittests/models.py index 80b5bbff..fb0caf58 100644 --- a/scidash/sciunittests/models.py +++ b/scidash/sciunittests/models.py @@ -38,9 +38,10 @@ def __str__(self): class TestInstance(models.Model): + name = models.CharField(max_length=200, default='Default Name') test_class = models.ForeignKey(TestClass) observation = JSONField() - test_suites = models.ManyToManyField(TestSuite, related_name='tests') + test_suites = models.ManyToManyField(TestSuite, related_name='tests', blank=True) description = models.TextField(blank=True, null=True) owner = models.ForeignKey(general_models.ScidashUser, null=True) verbose = models.IntegerField(default=0) diff --git a/scidash/sciunittests/serializers.py b/scidash/sciunittests/serializers.py index ee15a146..4235465c 100644 --- a/scidash/sciunittests/serializers.py +++ b/scidash/sciunittests/serializers.py @@ -39,7 +39,7 @@ class Meta: class TestInstanceSerializer( GetByKeyOrCreateMixin, WritableNestedModelSerializer, CachedSerializerMixin ): - test_suites = TestSuiteSerializer(many=True) + test_suites = TestSuiteSerializer(many=True, required=False) test_class = TestClassSerializer() hash_id = serializers.CharField(validators=[]) tags = TagSerializer(many=True, required=False)