From d9fbf25b04985cc3df7d4846a71ae07a4ffbbcba Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Mon, 26 May 2014 12:19:15 +0200 Subject: [PATCH] Implement support for processors parameters in server --- timeside/server/models.py | 42 +++++++++++++++++----------------- timeside/server/serializers.py | 23 ++++++++++++++++--- timeside/server/views.py | 3 ++- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/timeside/server/models.py b/timeside/server/models.py index 8154555..afb1d86 100644 --- a/timeside/server/models.py +++ b/timeside/server/models.py @@ -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 diff --git a/timeside/server/serializers.py b/timeside/server/serializers.py index b60c292..1373209 100644 --- a/timeside/server/serializers.py +++ b/timeside/server/serializers.py @@ -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 - - diff --git a/timeside/server/views.py b/timeside/server/views.py index 3d95538..7a7f7c8 100644 --- a/timeside/server/views.py +++ b/timeside/server/views.py @@ -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') -- 2.39.5