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)