diff options
author | Sunil Shetye | 2025-03-10 15:32:57 +0530 |
---|---|---|
committer | Sunil Shetye | 2025-03-11 12:28:25 +0530 |
commit | 9afd6ed1666a7bb2c884be4f57d77edff4135784 (patch) | |
tree | 2447b69030b711f46a5ccd2cb16580f9ca16d4f6 | |
parent | 96d0cce0b3a37511ceb3c89e6e38d5005f8ab147 (diff) | |
download | Common-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.tar.gz Common-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.tar.bz2 Common-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.zip |
add status to task
-rw-r--r-- | blocks/simulationAPI/helpers/ngspice_helper.py | 14 | ||||
-rw-r--r-- | blocks/simulationAPI/models.py | 27 | ||||
-rw-r--r-- | blocks/simulationAPI/serializers.py | 7 | ||||
-rw-r--r-- | blocks/simulationAPI/tasks.py | 24 |
4 files changed, 45 insertions, 27 deletions
diff --git a/blocks/simulationAPI/helpers/ngspice_helper.py b/blocks/simulationAPI/helpers/ngspice_helper.py index 95cecd2a..914fdc1e 100644 --- a/blocks/simulationAPI/helpers/ngspice_helper.py +++ b/blocks/simulationAPI/helpers/ngspice_helper.py @@ -9,6 +9,7 @@ from datetime import datetime from pathlib import Path from tempfile import mkstemp from django.conf import settings +from simulationAPI.models import Task logger = get_task_logger(__name__) XmlToXcos = join(settings.BASE_DIR, 'Xcos/XmlToXcos.sh') @@ -42,6 +43,14 @@ class CannotRunParser(Exception): """ Base class for exceptions in this module. """ +def update_task_status(task_id, status, meta=None): + # Update Celery backend state + current_task.update_state(state=status, meta=meta or {}) + + # Update Django database + Task.objects.filter(task_id=task_id).update(status=status) + + def CreateXml(file_path, parameters, task_id): parameters = json.loads(parameters) current_dir = settings.MEDIA_ROOT + '/' + str(task_id) @@ -111,9 +120,8 @@ def ExecXml(task): os.close(LOGFILEFD) - current_task.update_state( - state='STREAMING', - meta={'current_process': 'Processed Xml, Streaming Output'}) + update_task_status(task_id, 'STREAMING', + meta={'current_process': 'Processed Xml, Streaming Output'}) cmd = "try;" cmd += "chdir('%s');" % current_dir diff --git a/blocks/simulationAPI/models.py b/blocks/simulationAPI/models.py index 119d11be..b2f09505 100644 --- a/blocks/simulationAPI/models.py +++ b/blocks/simulationAPI/models.py @@ -5,9 +5,20 @@ from django.conf import settings from django.utils import timezone from datetime import timedelta import uuid +from celery.result import AsyncResult + + +TASK_STATUS_CHOICES = [ + ("PENDING", "Pending"), + ("STARTED", "Started"), + ("STREAMING", "Streaming"), + ("SUCCESS", "Success"), + ("FAILURE", "Failure"), + ("RETRY", "Retry"), + ("CANCELED", "Canceled"), +] -# session class Session(models.Model): session_id = models.CharField(primary_key=True, max_length=40, null=False, editable=False) app_name = models.CharField(max_length=40, blank=False, null=False, default='') @@ -43,25 +54,25 @@ class Session(models.Model): raise ValidationError("mismatch: Cannot update.") def __str__(self): + """String for representing the Model object.""" return self.session_id class Task(models.Model): task_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT), default='default_file.txt') - + file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT)) + status = models.CharField(max_length=20, choices=TASK_STATUS_CHOICES, null=False, default="PENDING") parameters = models.TextField(blank=True, null=True) upload_time = models.DateTimeField(auto_now=True) log_name = models.CharField(max_length=500, blank=True, null=True) returncode = models.IntegerField(blank=True, null=True) - - task_time = models.DateTimeField(auto_now=True) - - session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='task_files', null=True, blank=True) + session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='task', null=True) + start_time = models.DateTimeField(null=True) + end_time = models.DateTimeField(null=True) def save(self, *args, **kwargs): super(Task, self).save(*args, **kwargs) def __str__(self): """String for representing the Model object.""" - return self.task_id.hex + return f"{self.task_id.hex} - {self.status}" diff --git a/blocks/simulationAPI/serializers.py b/blocks/simulationAPI/serializers.py index 596d8590..01579427 100644 --- a/blocks/simulationAPI/serializers.py +++ b/blocks/simulationAPI/serializers.py @@ -10,7 +10,7 @@ logger = get_task_logger(__name__) class SessionSerializer(serializers.ModelSerializer): class Meta: model = Session - fields = ('session_id', 'app_name', 'created_at') + fields = ('session_id', 'app_name', 'created_at', 'expire_at', 'count') class TaskSerializer(serializers.HyperlinkedModelSerializer): @@ -18,8 +18,8 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Task - fields = ('task_id', 'file', 'parameters', 'upload_time', - 'log_name', 'returncode', 'task_time', 'session') + fields = ('task_id', 'file', 'status', 'parameters', 'upload_time', + 'log_name', 'returncode', 'session', 'start_time', 'end_time') def create(self, validated_data): # Takes file from request and stores it along with a taskid @@ -35,6 +35,5 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer): parameters = json.dumps(postdata, separators=(',', ':')) session, created = Session.objects.get_or_create(session_id=session_id, app_name=app_name) task = Task.objects.create(session=session, file=file, parameters=parameters) - # logger.info('session: %s, task: %s', session, task) logger.info("Session: %s (created: %s), Task: %s", session, created, task) return task diff --git a/blocks/simulationAPI/tasks.py b/blocks/simulationAPI/tasks.py index 7dff6aa3..f7089096 100644 --- a/blocks/simulationAPI/tasks.py +++ b/blocks/simulationAPI/tasks.py @@ -1,11 +1,11 @@ -from celery import shared_task, current_task, states +from celery import shared_task, states from celery.exceptions import Ignore from celery.utils.log import get_task_logger from redis import Redis import traceback from blocks.celery_tasks import app -from simulationAPI.helpers import ngspice_helper +from simulationAPI.helpers.ngspice_helper import ExecXml, update_task_status from simulationAPI.models import Task logger = get_task_logger(__name__) @@ -32,11 +32,10 @@ def process_task(task_id): logger.info("Processing %s %s %s", session_id, task.file.path, task.session.app_name) - current_task.update_state( - state='PROGRESS', - meta={'current_process': 'Started Processing File'}) + update_task_status(task_id, 'STARTED', + meta={'current_process': 'Started Processing File'}) - output = ngspice_helper.ExecXml(task) + output = ExecXml(task) if output == "Streaming": state = 'STREAMING' current_process = 'Processed Xml, Streaming Output' @@ -44,15 +43,16 @@ def process_task(task_id): state = 'SUCCESS' current_process = 'Processed Xml, Loading Output' - current_task.update_state( - state=state, - meta={'current_process': current_process}) + update_task_status(task_id, state, + meta={'current_process': current_process}) return output except Exception as e: - current_task.update_state(state=states.FAILURE, meta={ - 'exc_type': type(e).__name__, - 'exc_message': traceback.format_exc().split('\n')}) + update_task_status(task_id, 'FAILURE', + meta={ + 'exc_type': type(e).__name__, + 'exc_message': traceback.format_exc().split('\n') + }) logger.exception('Exception Occurred:') raise Ignore() |