diff --git a/beat/web/backend/migrations/0002_auto_20160330_0005.py b/beat/web/backend/migrations/0002_auto_20160330_0005.py index 6ab1f84015350aaf58accdc9c456eb21e5ed6583..6b8005e4ead446e018d7c8d9b5451c72f3be4927 100644 --- a/beat/web/backend/migrations/0002_auto_20160330_0005.py +++ b/beat/web/backend/migrations/0002_auto_20160330_0005.py @@ -46,6 +46,11 @@ class Migration(migrations.Migration): name='memory', field=models.PositiveIntegerField(default=0, help_text=b'In megabytes'), ), + migrations.AlterField( + model_name='queue', + name='name', + field=models.CharField(help_text=b'The name for this object (space-like characters will be automatically replaced by dashes)', unique=True, max_length=100), + ), migrations.AlterField( model_name='queue', name='cores_per_slot', diff --git a/beat/web/backend/models.py b/beat/web/backend/models.py index 747c477a7fd6afb74b13d0571cfb7b4bec2a8353..dbda3dcca177e40697975c55c78160b98e4bcea1 100644 --- a/beat/web/backend/models.py +++ b/beat/web/backend/models.py @@ -38,6 +38,15 @@ from ..common.texts import Messages #---------------------------------------------------------- +class EnvironmentManager(models.Manager): + + def get_by_natural_key(self, name, version): + return self.get( + name=name, + version=version, + ) + + class Environment(Shareable): """Defines a software environment to run algorithms""" @@ -81,6 +90,8 @@ class Environment(Shareable): on_delete=models.SET_NULL, ) + objects = EnvironmentManager() + #_____ Meta parameters __________ class Meta: @@ -92,6 +103,10 @@ class Environment(Shareable): return self.fullname() + def natural_key(self): + return (self.name, self.version) + + #_____ Utilities __________ def fullname(self): @@ -119,6 +134,12 @@ class Environment(Shareable): #---------------------------------------------------------- +class WorkerManager(models.Manager): + + def get_by_natural_key(self, name): + return self.get(name=name) + + class Worker(models.Model): name = models.CharField( @@ -139,6 +160,8 @@ class Worker(models.Model): info = models.TextField(null=True, blank=True, help_text='Informative message from the worker in case it is inactive') + objects = WorkerManager() + #_____ Overrides __________ @@ -149,6 +172,10 @@ class Worker(models.Model): return retval + def natural_key(self): + return self.name + + def load(self): '''Calculates the number of cores being used currently''' return sum([j.block.queue.cores_per_slot for j in self.jobs]) @@ -177,9 +204,16 @@ class Worker(models.Model): #---------------------------------------------------------- +class QueueManager(models.Manager): + + def get_by_natural_key(self, name): + return self.get(name=name) + + class Queue(models.Model): - name = models.CharField(max_length=100, help_text=Messages['name']) + name = models.CharField(max_length=100, help_text=Messages['name'], + unique=True) memory_limit = models.PositiveIntegerField(help_text='In megabytes') @@ -213,6 +247,11 @@ class Queue(models.Model): self.max_slots_per_user ) + + def natural_key(self): + return self.name + + #_____ Utilities __________ def number_of_slots(self): @@ -264,6 +303,12 @@ class Queue(models.Model): return [w[0] for w in workers] +class SlotManager(models.Manager): + + def get_by_natural_key(self, queue_name, worker_name): + return self.get(queue__name=queue_name, worker__name=worker_name) + + class Slot(models.Model): queue = models.ForeignKey(Queue, related_name='slots', @@ -282,6 +327,8 @@ class Slot(models.Model): help_text='Priority of these slots on the defined queue' ) + objects = SlotManager() + #_____ Meta parameters __________ class Meta: @@ -291,3 +338,7 @@ class Slot(models.Model): def __str__(self): return '%s - %s (slots: %d, priority: %d)' % (self.queue, self.worker, self.quantity, self.priority) + + + def natural_key(self): + return (self.queue.name, self.worker.name)