from django.db import models
from django.utils.timezone import now
from pyqcg.service import Job as QcgJob, Task as QcgTask
-from pyqcg.utils import JobStatus, TaskStatus, TaskType, AllocationType, EPRUtils
+from pyqcg.utils import JobStatus, TaskStatus, TaskType, AllocationType, EPRUtils, DescriptionType
from qcg.utils import username_from_dn, get_attributes
-__all__ = ['User', 'Job', 'Task', 'Allocation', 'NodeInfo']
+__all__ = ['User', 'Job', 'Task', 'Allocation', 'NodeInfo', 'JobTemplate']
class User(AbstractUser):
return Task.objects.filter(job__owner=self)
+DESC_TYPE_CHOICES = list(enumerate(field for field in dir(DescriptionType) if not field.startswith('__')))
+DESC_TYPE_CHOICES_REVERSED = {v: k for k, v in DESC_TYPE_CHOICES}
+
+
class Job(models.Model):
STATUS_CHOICES = list(enumerate(field for field in dir(JobStatus) if not field.startswith('__')))
STATUS_CHOICES_REVERSED = {v: k for k, v in STATUS_CHOICES}
status = models.IntegerField(u"Status", choices=STATUS_CHOICES)
note = models.TextField(u"Notatka", blank=True, default='')
description = models.TextField(u"Opis", blank=True, default='')
+ description_type = models.IntegerField(u"Typ opisu", choices=DESC_TYPE_CHOICES, blank=True, null=True)
+ qcg_description = models.TextField(u"Opis QCG", blank=True, default='')
project = models.TextField(u"Projekt", blank=True, default='')
submission_time = models.DateTimeField(u"Data wysłania")
finish_time = models.DateTimeField(u"Data zakończenia", blank=True, null=True)
@staticmethod
def qcg_map(qcg_job, user=None):
- attrs = get_attributes(qcg_job, ('job_id', 'note', 'description', 'submission_time', 'finish_time',
- 'project', 'purged'))
+ attrs = get_attributes(qcg_job, ('job_id', 'note', 'description', 'qcg_description', 'submission_time',
+ 'finish_time', 'project', 'purged'))
attrs['epr'] = EPRUtils.serialize_epr(qcg_job.epr)
attrs['status'] = Job.STATUS_CHOICES_REVERSED[qcg_job.status]
+ attrs['description_type'] = DESC_TYPE_CHOICES_REVERSED[qcg_job.description_type]
attrs['proxy_lifetime'] = now() + qcg_job.proxy_lifetime
username = username_from_dn(qcg_job.user_dn)
return attrs
+ @property
+ def terminated(self):
+ return self.get_status_display() in [JobStatus.FINISHED, JobStatus.FAILED, JobStatus.CANCELED]
+
class Task(models.Model):
STATUS_CHOICES = list(enumerate(field for field in dir(TaskStatus) if not field.startswith('__')))
type = models.IntegerField(u"Typ", choices=TYPE_CHOICES)
note = models.TextField(u"Notatka", blank=True, default='')
description = models.TextField(u"Opis", blank=True, default='')
+ description_type = models.IntegerField(u"Typ opisu", choices=DESC_TYPE_CHOICES, blank=True, null=True)
submission_time = models.DateTimeField(u"Data wysłania")
start_time = models.DateTimeField(u"Data rozpoczęcia", blank=True, null=True)
finish_time = models.DateTimeField(u"Data zakończenia", blank=True, null=True)
attrs['epr'] = EPRUtils.serialize_epr(qcg_task.epr)
attrs['status'] = Task.STATUS_CHOICES_REVERSED[qcg_task.status]
attrs['type'] = Task.TYPE_CHOICES_REVERSED[qcg_task.type]
+ attrs['description_type'] = DESC_TYPE_CHOICES_REVERSED[qcg_task.description_type]
attrs['proxy_lifetime'] = now() + qcg_task.proxy_lifetime
if job is not None:
def short_host_names(self):
return {alloc.host_name.split('.', 1)[0] for alloc in self.allocations.all()}
+ @property
+ def terminated(self):
+ return self.get_status_display() in [TaskStatus.FINISHED, TaskStatus.FAILED, TaskStatus.CANCELED]
+
class Allocation(models.Model):
STATUS_CHOICES = list(enumerate(field for field in dir(AllocationType) if not field.startswith('__')))
@staticmethod
def qcg_map(qcg_node):
return {'name': qcg_node.name, 'count': qcg_node.slots_count}
+
+
+class JobTemplate(models.Model):
+ name = models.CharField(u"Nazwa", max_length=100)
+ description = models.TextField(u"Opis")
+
+ owner = models.ForeignKey(User, verbose_name=u"Właściciel", related_name='templates')
+ created = models.DateTimeField(u"Utworzono", auto_now_add=True)
+ updated = models.DateTimeField(u"Uaktualniono", auto_now=True)
+
+ class Meta:
+ verbose_name = u"Szablon zadania"
+ verbose_name_plural = u"Szablony zadania"
+
+ def __unicode__(self):
+ return u"{} ({})".format(self.name, self.owner)
+
+ def get_absolute_url(self):
+ return reverse('template_submit', kwargs={'template_id': self.id})