2020-05-13 15:54:40 +02:00
from django . db import models
from django . utils . translation import gettext_lazy as _
from lib . models . base import MetaDataModel
from apps . employee . models import Employee
from jsonfield import JSONField
import collections
# Create your models here.
class Schedule ( MetaDataModel ) :
2020-05-18 14:22:52 +02:00
"""
A model that holds the schedule information . Here we store the form data and let the Peregrine cluster make the calculations .
It will inherit the attributes : attr : ` ~ lib . models . base . MetaDataModel . created_at ` and : attr : ` ~ lib . models . base . MetaDataModel . updated_at ` from the Abstract model : class : ` ~ lib . models . base . MetaDataModel `
Attributes
- - - - - - - - - -
employee : Employee
The employee that is the owner of this schedule .
name : str
The name of the schedule . Max length is 100 characters .
email : str
The email address where the results should be sent to . Max length is 100 characters .
2020-05-18 16:53:40 +02:00
status : ScheduleStatus
The status of the schedule .
2020-05-18 14:22:52 +02:00
"""
2020-05-15 10:31:22 +02:00
class Meta :
2020-05-15 12:54:16 +02:00
verbose_name = _ ( ' schedule ' )
verbose_name_plural = _ ( ' schedules ' )
2020-05-15 10:31:22 +02:00
2020-05-18 16:53:40 +02:00
class ScheduleStatus ( models . TextChoices ) :
""" This is a sub class of Schedule which holds all the possible schedule statuses
. . data : : NEW
The schedule is just created and waiting to be picked up by the Peregrine scripts .
. . data : : ACCEPTED
The Peregrine scripts have accepted the new schedule job . And the input is valid .
. . data : : PROCESSING
The Peregrine job is submitted to the job queue and should be starting soon .
. . data : : PROCESSED
The Peregrine job is finished , and the results will be futher processed in order to create a new report with the outcome .
. . data : : DONE
The schedule rapport is created and uploaded to the database . The Peregrine process is done .
. . data : : INVALID
The entered data is invalid . Either directly by the posting of the form . Or when the Peregrine script could not read the input .
. . data : : FAILURE
Something when wrong on Peregrine . Look at the logging output of the Peregrine job
"""
NEW = ' new ' , _ ( ' New ' )
ACCEPTED = ' accepted ' , _ ( ' Accepted ' )
PROCESSING = ' processing ' , _ ( ' Processing ' )
PROCESSED = ' processed ' , _ ( ' Processed ' )
DONE = ' done ' , _ ( ' Done ' )
INVALID = ' invalid ' , _ ( ' Invalid ' )
FAILURE = ' failure ' , _ ( ' Failure ' )
2020-05-15 10:31:22 +02:00
2020-05-19 16:13:34 +02:00
employee = models . ForeignKey ( Employee , verbose_name = Employee . _meta . verbose_name , on_delete = models . CASCADE , help_text = _ ( ' Select the employee that is responsible for this schedule request ' ) )
2020-05-13 15:54:40 +02:00
name = models . CharField ( _ ( ' Name ' ) , max_length = 100 , help_text = _ ( ' Name of the schedule ' ) )
email = models . CharField ( _ ( ' Email address ' ) , max_length = 100 , help_text = _ ( ' Email address where the results will be sent to. ' ) )
2020-05-18 16:53:40 +02:00
status = models . CharField ( _ ( ' Status ' ) , max_length = 10 , choices = ScheduleStatus . choices , default = ScheduleStatus . NEW , help_text = _ ( ' The status of this schedule. ' ) , db_index = True , )
2020-05-13 15:54:40 +02:00
2020-05-19 11:19:37 +02:00
planning_source = JSONField ( _ ( ' Schedule input ' ) , blank = True , null = True , load_kwargs = { ' object_pairs_hook ' : collections . OrderedDict } , help_text = _ ( ' The schedule input in JSON format based on the form data ' ) )
2020-05-13 15:54:40 +02:00
2020-05-19 11:19:37 +02:00
peregrine_result = JSONField ( _ ( ' Peregrine JSON output ' ) , blank = True , null = True , load_kwargs = { ' object_pairs_hook ' : collections . OrderedDict } , help_text = _ ( ' The results from the Peregrine job in JSON ' ) )
2020-05-14 15:20:19 +02:00
2020-05-19 11:19:37 +02:00
output_peregrine = models . BinaryField ( _ ( ' Peregrine binary output ' ) , blank = True , null = True , help_text = _ ( ' This is the output in binary format from the Peregrine cluster ' ) )
2020-05-13 15:54:40 +02:00
2020-05-14 15:20:19 +02:00
report_sent = models . DateTimeField ( _ ( ' Report is send to user ' ) , blank = True , null = True , help_text = _ ( ' The date and time when the report has sended to the user. ' ) )
2020-05-18 11:01:19 +02:00
peregrine_output_log = models . TextField ( _ ( ' Peregrine logging ' ) , blank = True , help_text = _ ( ' Here you can see the logging of the Peregrine job. ' ) )
2020-05-18 16:53:40 +02:00
@property
def done ( self ) :
"""
Checks if the processing of this schedule is done on the Peregrine cluster . This can be either with the status :
1. : attr : ` ~ ScheduleStatus . DONE `
2. : attr : ` ~ ScheduleStatus . INVALID `
3. : attr : ` ~ ScheduleStatus . FAILURE `
Returns :
boolean - - True when status is one of the above value .
"""
return self . status in [ self . ScheduleStatus . DONE , self . ScheduleStatus . INVALID , self . ScheduleStatus . FAILURE ]
2020-05-13 15:54:40 +02:00
def __str__ ( self ) :
""" str: Returns a readable name for the schedule. Format is [schedule_name] (employee_name). """
return ' {} ( {} ) ' . format ( self . name , self . employee )