blob: 5fb68fe35ef4c29dcee4c2ddbccb0719dae63b93 [file]
import uuid
import marshmallow as ma
from croniter import croniter
from app.objects.interfaces.i_object import FirstClassObjectInterface
from app.objects.c_operation import OperationSchema
from app.utility.base_object import BaseObject
class ScheduleSchema(ma.Schema):
class Meta:
unknown = ma.EXCLUDE
id = ma.fields.String()
schedule = ma.fields.String(required=True, metadata={"example": "5 4 * * *"})
task = ma.fields.Nested(OperationSchema())
@ma.validates('schedule')
def validate_schedule(self, value):
if not croniter.is_valid(value):
raise ma.ValidationError("Invalid cron syntax for schedule field.")
@ma.post_load
def build_schedule(self, data, **kwargs):
return None if kwargs.get('partial') is True else Schedule(**data)
class Schedule(FirstClassObjectInterface, BaseObject):
schema = ScheduleSchema()
@property
def unique(self):
return self.hash('%s' % self.id)
def __init__(self, schedule, task, id=''):
super().__init__()
self.id = str(id) if id else str(uuid.uuid4())
self.schedule = schedule
self.task = task
def store(self, ram):
existing = self.retrieve(ram['schedules'], self.unique)
if not existing:
ram['schedules'].append(self)
return self.retrieve(ram['schedules'], self.unique)
existing.update('schedule', self.schedule)
existing.task.update('state', self.task.state)
existing.task.update('autonomous', self.task.autonomous)
existing.task.update('obfuscator', self.task.obfuscator)
return existing