]> git.parisson.com Git - timeside.git/commitdiff
Implement support for processors parameters in server
authorThomas Fillon <thomas@parisson.com>
Mon, 26 May 2014 10:19:15 +0000 (12:19 +0200)
committerThomas Fillon <thomas@parisson.com>
Mon, 26 May 2014 10:19:15 +0000 (12:19 +0200)
timeside/server/models.py
timeside/server/serializers.py
timeside/server/views.py

index 8154555c457da3829d7364da210355aabd914ce2..afb1d86bdcf06bc1a06dd9a54824eadf1b1dd51f 100644 (file)
@@ -50,13 +50,13 @@ def get_processor(pid):
     for proc in processors:
         if proc.id() == pid:
             return proc
-    raise ValueError('Processor %s does not exists' % pid) 
+    raise ValueError('Processor %s does not exists' % pid)
 
 
 class MetaCore:
 
     app_label = 'server'
+
 
 class BaseResource(models.Model):
 
@@ -66,7 +66,7 @@ class BaseResource(models.Model):
 
     class Meta(MetaCore):
         abstract = True
-    
+
     def save(self, **kwargs):
         if not self.uuid:
             self.uuid = uuid.uuid4()
@@ -79,11 +79,11 @@ class DocBaseResource(BaseResource):
     description = models.TextField(_('description'), blank=True)
 
     def __unicode__(self):
-        return self.title    
-    
+        return self.title
+
     class Meta(MetaCore):
         abstract = True
-    
+
 
 class Selection(DocBaseResource):
 
@@ -123,7 +123,7 @@ class Experience(DocBaseResource):
 
     presets = models.ManyToManyField('Preset', related_name="experiences", verbose_name=_('presets'), blank=True, null=True)
     experiences = models.ManyToManyField('Experience', related_name="other_experiences", verbose_name=_('other experiences'), blank=True, null=True)
-    author = models.ForeignKey(User, related_name="experiences", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)    
+    author = models.ForeignKey(User, related_name="experiences", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)
     is_public = models.BooleanField(default=False)
 
     class Meta(MetaCore):
@@ -132,7 +132,7 @@ class Experience(DocBaseResource):
 
 
 class Processor(models.Model):
-    
+
     pid = models.CharField(_('pid'), choices=PROCESSOR_PIDS, max_length=256)
     version = models.CharField(_('version'), max_length=64, blank=True)
 
@@ -142,18 +142,18 @@ class Processor(models.Model):
 
     def __unicode__(self):
         return '_'.join([self.pid, str(self.id)])
-    
+
     def save(self, **kwargs):
         if not self.version:
             self.version = timeside.__version__
         super(Processor, self).save(**kwargs)
-        
+
 
 class Preset(BaseResource):
 
     processor = models.ForeignKey('Processor', related_name="presets", verbose_name=_('processor'), blank=True, null=True)
     parameters = models.TextField(_('Parameters'), blank=True)
-    author = models.ForeignKey(User, related_name="presets", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)    
+    author = models.ForeignKey(User, related_name="presets", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)
     is_public = models.BooleanField(default=False)
 
     class Meta(MetaCore):
@@ -164,7 +164,7 @@ class Preset(BaseResource):
     def __unicode__(self):
         return '_'.join([unicode(self.processor), str(self.id)])
 
-    
+
 class Result(BaseResource):
 
     item = models.ForeignKey('Item', related_name="results", verbose_name=_('item'), blank=True, null=True, on_delete=models.SET_NULL)
@@ -173,7 +173,7 @@ class Result(BaseResource):
     file = models.FileField(_('Output file'), upload_to='results/%Y/%m/%d', blank=True, max_length=1024)
     mime_type = models.CharField(_('Output file MIME type'), blank=True, max_length=256)
     status = models.IntegerField(_('status'), choices=STATUS, default=1)
-    author = models.ForeignKey(User, related_name="results", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)    
+    author = models.ForeignKey(User, related_name="results", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)
 
     class Meta(MetaCore):
         db_table = app + '_results'
@@ -193,7 +193,7 @@ class Task(BaseResource):
     experience = models.ForeignKey('Experience', related_name="task", verbose_name=_('experience'), blank=True, null=True)
     selection = models.ForeignKey('Selection', related_name="task", verbose_name=_('selection'), blank=True, null=True)
     status = models.IntegerField(_('status'), choices=STATUS, default=1)
-    author = models.ForeignKey(User, related_name="tasks", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)    
+    author = models.ForeignKey(User, related_name="tasks", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL)
 
     class Meta(MetaCore):
         db_table = app + '_tasks'
@@ -218,9 +218,9 @@ class Task(BaseResource):
             path = results_root + os.sep + item.uuid + os.sep
             if not os.path.exists(settings.MEDIA_ROOT + os.sep + path):
                 os.makedirs(settings.MEDIA_ROOT + os.sep + path)
-            
+
             pipe = timeside.decoder.FileDecoder(item.file.path, sha1=item.sha1)
-            
+
             presets = {}
             for preset in self.experience.presets.all():
                 proc = get_processor(preset.processor.pid)
@@ -237,7 +237,7 @@ class Task(BaseResource):
 
             # while item.lock:
             #     time.sleep(30)
-            
+
             if not item.hdf5:
                 item.hdf5 =  path + str(self.experience.uuid) + '.hdf5'
                 item.save()
@@ -246,10 +246,10 @@ class Task(BaseResource):
             item.lock_setter(True)
             pipe.results.to_hdf5(item.hdf5.path)
             item.lock_setter(False)
-            
+
             for preset in presets.keys():
                 proc = presets[preset]
-                if proc.type == 'analyzer':                    
+                if proc.type == 'analyzer':
                     for processor_id in proc.results.keys():
                         parameters = proc.results[processor_id].parameters
                         preset, c = Preset.objects.get_or_create(processor=preset.processor, parameters=unicode(parameters))
@@ -267,12 +267,12 @@ class Task(BaseResource):
                     result = Result.objects.get(preset=preset, item=item)
                     result.status_setter(4)
                 del proc
-            
+
             # except:
             #     self.status_setter(0)
             #     item.lock_setter(False)
             #     break
-        
+
         self.status_setter(4)
         del pipe
 
index b60c292d05c1c342001a291c03f3f61cb9f85409..137320903913c32c81afb12d7d490c432a2702e8 100644 (file)
@@ -23,6 +23,7 @@ import django.db.models
 from django.contrib.auth.models import User
 
 
+
 class SelectionSerializer(serializers.ModelSerializer):
 
     class Meta:
@@ -62,7 +63,25 @@ class PresetSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Preset
-        # fields = ('id', 'processor', 'parameters', 'is_public')
+        #fields = ('id', 'processor', 'parameters', 'is_public')
+
+    def validate_parameters(self, attrs, source):
+
+        import timeside
+        processor = timeside.core.get_processor(attrs['processor'].pid)()
+        default_params = processor.get_parameters()
+        default_msg = "Defaut parameters:\n%s" % default_params
+
+        try:
+            processor.validate_parameters(attrs[source])
+        except ValueError as e:
+            msg = '\n'.join([str(e), default_msg])
+            raise serializers.ValidationError(msg)
+        except KeyError as e:
+            msg = '\n'.join(['KeyError :' + unicode(e), default_msg])
+            raise serializers.ValidationError(msg)
+
+        return attrs
 
 
 class TaskSerializer(serializers.ModelSerializer):
@@ -76,5 +95,3 @@ class UserSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = User
-
-
index 3d9553802e63b269492fe0f79c51ee567eb4361c..7a7f7c863bb6f13e3131bb2655870afddff3b82f 100644 (file)
@@ -25,6 +25,7 @@ from django.views.generic import *
 from django.http import HttpResponse, HttpResponseRedirect
 
 from rest_framework import viewsets
+from rest_framework.mixins import UpdateModelMixin
 
 import timeside
 from timeside.server.models import *
@@ -120,6 +121,6 @@ class ResultGrapherView(View):
 
     def get(self, request, *args, **kwargs):
         result = Result.objects.get(pk=kwargs['pk'])
-        return HttpResponse(stream_from_file(result.file.path), 
+        return HttpResponse(stream_from_file(result.file.path),
                             mimetype='image/png')