diff --git a/beat/web/experiments/models.py b/beat/web/experiments/models.py index 3cd92a8078ea4694f635a427ff701535f2dbc0a3..7b614a0d905b2b4db8af795bb68f3068b7008915 100644 --- a/beat/web/experiments/models.py +++ b/beat/web/experiments/models.py @@ -601,8 +601,8 @@ class Experiment(Shareable): def job_splits(self, status=None): from ..backend.models import JobSplit - retval = JobSplit.objects.filter(job__block__in=self.blocks) - if state is not None: + retval = JobSplit.objects.filter(job__block__in=self.blocks.all()) + if status is not None: retval = retval.filter(status=status) return retval @@ -642,6 +642,9 @@ class Experiment(Shareable): ), ) + def get_admin_change_url(self): + return reverse('admin:experiments_experiment_change', args=(self.id,)) + def completion(self): if self.start_date is None: return 0 @@ -744,18 +747,18 @@ class Experiment(Shareable): # Process main state and state from job results if Block.FAILED in block_statuses or Block.CANCELLED in block_statuses: - self.state = Experiment.FAILED + self.status = Experiment.FAILED elif (Block.PROCESSING in block_statuses) or \ ((Block.NOT_CACHED in block_statuses or \ Block.SKIPPED in block_states) and Block.CACHED in block_statuses): - self.state = Experiment.RUNNING + self.status = Experiment.RUNNING elif Block.NOT_CACHED not in block_statuses: - self.state = Experiment.DONE + self.status = Experiment.DONE else: - self.state = Experiment.SCHEDULED + self.status = Experiment.SCHEDULED self.save() @@ -776,7 +779,7 @@ class Experiment(Shareable): ''' # lock self - avoids concurrent update from scheduler/worker subsystem - Experiment.objects.select_for_update(pk=self.pk) + Experiment.objects.select_for_update().filter(pk=self.pk) if self.status != Experiment.PENDING: return @@ -797,9 +800,9 @@ class Experiment(Shareable): ''' # lock self - avoids concurrent update from scheduler/worker subsystem - Experiment.objects.select_for_update(pk=self.pk) + Experiment.objects.select_for_update().filter(pk=self.pk) - if self.status != (Experiment.SCHEDULED, Experiment.RUNNING): return + if self.status not in (Experiment.SCHEDULED, Experiment.RUNNING): return for b in self.blocks.all(): b._cancel() @@ -955,7 +958,7 @@ class Block(models.Model): ''' # lock self - avoids concurrent update from scheduler/worker subsystem - Block.objects.select_for_update(pk=self.pk) + Block.objects.select_for_update().filter(pk=self.pk) if self.status != Block.NOT_CACHED: return @@ -976,7 +979,7 @@ class Block(models.Model): def done(self): '''Says whether the block has finished or not''' - return self.state not in (Block.NOT_CACHED, Block.PROCESSING) + return self.status not in (Block.NOT_CACHED, Block.PROCESSING) @transaction.atomic @@ -987,11 +990,15 @@ class Block(models.Model): ''' # lock self - avoids concurrent update from scheduler/worker subsystem - Block.objects.select_for_update(pk=self.pk) + Block.objects.select_for_update().filter(pk=self.pk) if self.done(): return - self.job._cancel() + if hasattr(self, 'job'): self.job._cancel() + else: + self.status = Block.CANCELLED + self.save() + self.experiment.update_state() @transaction.atomic @@ -1016,7 +1023,7 @@ class Block(models.Model): ''' # lock self - avoids concurrent update from scheduler/worker subsystem - Block.objects.select_for_update(pk=self.pk) + Block.objects.select_for_update().filter(pk=self.pk) if self.job.result and timings: