atomresponder/models.py (50 lines of code) (raw):
from django.db import models
#technically this does not belong here but it needs to be called late in every init, in order to register signals but import
#from other modules' .tasks
from .signals import *
#setup_signals()
class ImportJob(models.Model):
item_id = models.CharField(max_length=64, db_index=True)
job_id = models.CharField(max_length=64, db_index=True, unique=True)
atom_id = models.CharField(max_length=64,db_index=True)
status = models.CharField(max_length=64, choices=[
('READY', 'Ready'),
('STARTED','Started'),
('FINISHED','Success'),
('FINISHED_WARNING','Non-fatal error'),
('FAILED_TOTAL','Failed'),
('WAITING', 'Waiting'),
('ABORT_PENDING', 'Abort requested'),
('ABORTED', 'Cancelled by admin')
])
atom_title = models.CharField(max_length=1024, default="Unknown title")
user_email = models.CharField(max_length=1024, default="Unknown user", db_index=True)
started_at = models.DateTimeField()
completed_at = models.DateTimeField(null=True)
s3_path = models.CharField(max_length=2048, null=True)
retry_number = models.IntegerField(default=0)
processing = models.BooleanField(default=False)
class Meta:
ordering = ['-started_at']
def is_failed(self):
"""
Returns a boolean indicating whether the status of this job represents any kind of failure
:return:
"""
if self.status=='FAILED_TOTAL' or self.status=='FINISHED_WARNING' or self.status=='ABORTED':
return True
else:
return False
def previous_attempt(self):
"""
Either returns the job reference of the previous attempt of this import, or None
:return: an ImportJob instance or None
"""
for entry in ImportJob.objects.filter(atom_id=self.atom_id).order_by('-retry_number')[:1]:
return entry
return None
def __str__(self):
return "Import of {0} from {1} to item {2}".format(self.atom_title, self.user_email, self.item_id)
class PacFormXml(models.Model):
atom_id = models.CharField(max_length=64, db_index=True, unique=True)
received = models.DateTimeField()
completed = models.DateTimeField(blank=True, null=True)
pacdata_url = models.CharField(max_length=4096)
status = models.CharField(max_length=32, choices=[
("UNPROCESSED", "Unprocessed"),
("DOWNLOADING", "Downloading"),
("INPROGRESS", "In progress"),
("PROCESSED", "Processed"),
("ERROR", "Error")
], default="UNPROCESSED",db_index=True)
celery_task_id = models.CharField(max_length=64, db_index=True, null=True)
last_error = models.TextField(blank=True)