diff --git a/scidash/general/admin.py b/scidash/general/admin.py index 13ded1e7..f73fb977 100644 --- a/scidash/general/admin.py +++ b/scidash/general/admin.py @@ -2,9 +2,10 @@ from django.contrib.auth.admin import UserAdmin from django.contrib.contenttypes.models import ContentType -from scidash.general.models import ScidashUser +from scidash.general.models import ScidashUser, Tag # Register your models here. admin.site.register(ScidashUser, UserAdmin) admin.site.register(ContentType) +admin.site.register(Tag) diff --git a/scidash/main/settings.py b/scidash/main/settings.py index f5eaf596..40d567a0 100644 --- a/scidash/main/settings.py +++ b/scidash/main/settings.py @@ -240,3 +240,5 @@ ) CELERY_RESULT_BACKEND = 'django-db' + +NO_IMPORT_TAG = 'unschedulable' diff --git a/scidash/sciunitmodels/api/views.py b/scidash/sciunitmodels/api/views.py index 74e4ebfd..f7d2b938 100644 --- a/scidash/sciunitmodels/api/views.py +++ b/scidash/sciunitmodels/api/views.py @@ -5,11 +5,14 @@ from rest_framework import permissions, response, views, viewsets from django.db.models import Q +from django.conf import settings as s +from django.contrib.contenttypes.models import ContentType import scidash.sciunitmodels.helpers as hlp from scidash.sciunitmodels.filters import ModelClassFilter, ModelInstanceFilter from scidash.sciunitmodels.models import Capability, ModelClass, ModelInstance from pygeppetto_gateway.interpreters.helpers import URLProcessor +from scidash.general.models import Tag from scidash.sciunitmodels.serializers import ( CapabilitySerializer, ModelClassSerializer, ModelInstanceSerializer ) @@ -36,6 +39,35 @@ class ModelInstanceViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticatedOrReadOnly, ) filter_class = ModelInstanceFilter + def filter_queryset(self, queryset): + model_instance_content_type = ContentType.objects.get_for_model( + ModelInstance + ) + + ModelInstance.objects.filter(model_class__import_path='').update( + status=ModelInstance.LOCKED + ) + + for instance in ModelInstance.objects.filter( + model_class__import_path='' + ): + Tag.objects.get_or_create( + name=s.NO_IMPORT_TAG, + content_type=model_instance_content_type, + object_id=instance.pk + ) + + ModelInstance.objects.filter( + Q(score__isnull=True) & ~Q(model_class__import_path='') + ).update(status=ModelInstance.AVAILABLE) + + for instance in ModelInstance.objects.filter( + ~Q(model_class__import_path='') + ): + instance.tags.filter(name=s.NO_IMPORT_TAG).delete() + + return queryset + class ModelParametersView(views.APIView): def get(self, request): diff --git a/scidash/sciunittests/api/views.py b/scidash/sciunittests/api/views.py index 323dfaaf..52c0664e 100644 --- a/scidash/sciunittests/api/views.py +++ b/scidash/sciunittests/api/views.py @@ -4,6 +4,8 @@ from rest_framework import permissions, response, views, viewsets from django.db.models import Q +from django.conf import settings as s +from django.contrib.contenttypes.models import ContentType from scidash.general.models import Tag from scidash.sciunittests.filters import ( @@ -31,6 +33,35 @@ class TestInstanceViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticatedOrReadOnly, ) filter_class = TestInstanceFilter + def filter_queryset(self, queryset): + test_instance_content_type = ContentType.objects.get_for_model( + TestInstance + ) + + TestInstance.objects.filter(test_class__import_path='').update( + status=TestInstance.LOCKED + ) + + for instance in TestInstance.objects.filter( + test_class__import_path='' + ): + Tag.objects.get_or_create( + name=s.NO_IMPORT_TAG, + content_type=test_instance_content_type, + object_id=instance.pk + ) + + TestInstance.objects.filter( + Q(score__isnull=True) & ~Q(test_class__import_path='') + ).update(status=TestInstance.AVAILABLE) + + for instance in TestInstance.objects.filter( + ~Q(test_class__import_path='') + ): + instance.tags.filter(name=s.NO_IMPORT_TAG).delete() + + return queryset + class TestSuiteViewSet(viewsets.ReadOnlyModelViewSet): queryset = TestSuite.objects.all() diff --git a/scidash/sciunittests/models.py b/scidash/sciunittests/models.py index 640fa4c4..3c0450ba 100644 --- a/scidash/sciunittests/models.py +++ b/scidash/sciunittests/models.py @@ -178,8 +178,10 @@ class ScoreInstance(models.Model): max_length=200, default='', null=True, blank=True ) score_class = models.ForeignKey(ScoreClass, null=True, blank=True) - model_instance = models.ForeignKey(sciunitmodels.models.ModelInstance) - test_instance = models.ForeignKey(TestInstance) + model_instance = models.ForeignKey( + sciunitmodels.models.ModelInstance, related_name='score' + ) + test_instance = models.ForeignKey(TestInstance, related_name='score') score = models.FloatField(default=0, null=True, blank=True) sort_key = models.FloatField(default=0) prediction_numeric = models.FloatField(default=None, null=True, blank=True)