gridftp: multiple fixes in handling and presenting errors
[qcg-portal.git] / qcg / models.py
index e2fd198..b41fe85 100644 (file)
@@ -4,7 +4,7 @@ from django.core.urlresolvers import reverse
 from django.db import models
 from django.utils.timezone import now
 from pyqcg.service import Job as QcgJob, Task as QcgTask
 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
+from pyqcg.utils import JobStatus, TaskStatus, TaskType, AllocationType, EPRUtils
 
 from qcg.utils import username_from_dn, get_attributes
 
 
 from qcg.utils import username_from_dn, get_attributes
 
@@ -55,7 +55,7 @@ class Job(models.Model):
     @property
     def qcg_job(self):
         if self._job is None:
     @property
     def qcg_job(self):
         if self._job is None:
-            self._job = QcgJob(self.epr)
+            self._job = QcgJob(EPRUtils.deserialize_epr(self.epr))
 
         return self._job
 
 
         return self._job
 
@@ -64,14 +64,14 @@ class Job(models.Model):
         attrs = get_attributes(qcg_job, ('job_id', 'note', 'description', 'submission_time', 'finish_time',
                                          'project', 'purged'))
 
         attrs = get_attributes(qcg_job, ('job_id', 'note', 'description', 'submission_time', 'finish_time',
                                          'project', 'purged'))
 
-        attrs['epr'] = str(qcg_job.epr)
+        attrs['epr'] = EPRUtils.serialize_epr(qcg_job.epr)
         attrs['status'] = Job.STATUS_CHOICES_REVERSED[qcg_job.status]
         attrs['proxy_lifetime'] = now() + qcg_job.proxy_lifetime
 
         username = username_from_dn(qcg_job.user_dn)
         if user is not None:
             if user.username != username:
         attrs['status'] = Job.STATUS_CHOICES_REVERSED[qcg_job.status]
         attrs['proxy_lifetime'] = now() + qcg_job.proxy_lifetime
 
         username = username_from_dn(qcg_job.user_dn)
         if user is not None:
             if user.username != username:
-                raise ValueError('')
+                raise ValueError('Username does not match!')
             attrs['owner'] = user
         else:
             attrs['owner'] = User.objects.get(username=username)
             attrs['owner'] = user
         else:
             attrs['owner'] = User.objects.get(username=username)
@@ -129,7 +129,7 @@ class Task(models.Model):
     @property
     def qcg_task(self):
         if self._qcg_task is None:
     @property
     def qcg_task(self):
         if self._qcg_task is None:
-            self._qcg_task = QcgTask(self.epr)
+            self._qcg_task = QcgTask(EPRUtils.deserialize_epr(self.epr))
 
         return self._qcg_task
 
 
         return self._qcg_task
 
@@ -138,7 +138,7 @@ class Task(models.Model):
         attrs = get_attributes(qcg_task, ('task_id', 'status_description', 'note', 'description', 'submission_time',
                                           'start_time', 'finish_time', 'reserved_time_slot', 'purged'))
 
         attrs = get_attributes(qcg_task, ('task_id', 'status_description', 'note', 'description', 'submission_time',
                                           'start_time', 'finish_time', 'reserved_time_slot', 'purged'))
 
-        attrs['epr'] = str(qcg_task.epr)
+        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['proxy_lifetime'] = now() + qcg_task.proxy_lifetime
         attrs['status'] = Task.STATUS_CHOICES_REVERSED[qcg_task.status]
         attrs['type'] = Task.TYPE_CHOICES_REVERSED[qcg_task.type]
         attrs['proxy_lifetime'] = now() + qcg_task.proxy_lifetime
@@ -168,17 +168,21 @@ class Task(models.Model):
             self.reserved_time_start, self.reserved_time_finish = value
 
     @property
             self.reserved_time_start, self.reserved_time_finish = value
 
     @property
-    def hosts(self):
-        return {alloc.host_name for alloc in self.allocations.all()}
+    def short_host_names(self):
+        return {alloc.host_name.split('.', 1)[0] for alloc in self.allocations.all()}
 
 
 class Allocation(models.Model):
 
 
 class Allocation(models.Model):
+    STATUS_CHOICES = list(enumerate(field for field in dir(AllocationType) if not field.startswith('__')))
+    STATUS_CHOICES_REVERSED = {v: k for k, v in STATUS_CHOICES}
+
     task = models.ForeignKey(Task, verbose_name='Zadanie', related_name='allocations')
 
     host_name = models.CharField(u"Host", max_length=100)
     task = models.ForeignKey(Task, verbose_name='Zadanie', related_name='allocations')
 
     host_name = models.CharField(u"Host", max_length=100)
+    status = models.IntegerField(u"Status", choices=STATUS_CHOICES)
     status_description = models.TextField(u"Opis statusu", blank=True, default='')
     status_description = models.TextField(u"Opis statusu", blank=True, default='')
-    processes_count = models.PositiveIntegerField(u"Liczba procesorów")
-    slots_count = models.PositiveIntegerField(u"Liczba slotów")
+    processes_count = models.PositiveIntegerField(u"Liczba procesów")
+    slots_count = models.PositiveIntegerField(u"Liczba rdzeni")
     processes_group_id = models.TextField(u"Identyfikator grupy procesów", blank=True, default='')
     submission_time = models.DateTimeField(u"Data wysłania")
     estimated_start_time = models.DateTimeField(u"Przewidywana data rozpoczęcia", blank=True, null=True)
     processes_group_id = models.TextField(u"Identyfikator grupy procesów", blank=True, default='')
     submission_time = models.DateTimeField(u"Data wysłania")
     estimated_start_time = models.DateTimeField(u"Przewidywana data rozpoczęcia", blank=True, null=True)
@@ -201,17 +205,21 @@ class Allocation(models.Model):
 
     @staticmethod
     def qcg_map(qcg_allocation):
 
     @staticmethod
     def qcg_map(qcg_allocation):
-        return get_attributes(qcg_allocation, ('host_name', 'status_description', 'processes_count', 'slots_count',
-                                               'processes_group_id', 'submission_time', 'estimated_start_time',
-                                               'finish_time', 'local_submission_time', 'local_start_time',
-                                               'local_finish_time', 'purged', 'efficiency', 'comment', 'memory_usage'))
+        attrs = get_attributes(qcg_allocation, ('host_name', 'status_description', 'processes_count', 'slots_count',
+                                                'processes_group_id', 'submission_time', 'estimated_start_time',
+                                                'finish_time', 'local_submission_time', 'local_start_time',
+                                                'local_finish_time', 'purged', 'efficiency', 'comment', 'memory_usage'))
+
+        attrs['status'] = Allocation.STATUS_CHOICES_REVERSED[qcg_allocation.status]
+
+        return attrs
 
 
 class NodeInfo(models.Model):
     allocation = models.ForeignKey(Allocation, verbose_name=u"Alokacja", related_name='nodes')
 
     name = models.CharField(u"Nazwa", max_length=32)
 
 
 class NodeInfo(models.Model):
     allocation = models.ForeignKey(Allocation, verbose_name=u"Alokacja", related_name='nodes')
 
     name = models.CharField(u"Nazwa", max_length=32)
-    count = models.PositiveSmallIntegerField(u"Liczba slotów", blank=True, null=True)
+    count = models.PositiveSmallIntegerField(u"Liczba rdzeni", blank=True, null=True)
 
     class Meta:
         verbose_name = u"Węzeł"
 
     class Meta:
         verbose_name = u"Węzeł"
@@ -227,6 +235,4 @@ class NodeInfo(models.Model):
 
     @staticmethod
     def qcg_map(qcg_node):
 
     @staticmethod
     def qcg_map(qcg_node):
-        return {'name': qcg_node.name,
-                # FIXME
-                'count': qcg_node.slots_count.intValue() if qcg_node.slots_count is not None else None}
+        return {'name': qcg_node.name, 'count': qcg_node.slots_count}