Source code for shuup.core.models._background_tasks

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import ugettext_lazy as _
from enumfields import Enum, EnumIntegerField
from jsonfield import JSONField


class BackgroundTask(models.Model):
    queue = models.CharField(max_length=128, verbose_name=_("queue name"), db_index=True)
    identifier = models.CharField(max_length=128, verbose_name=_("task identifier"), unique=True)
    created_on = models.DateTimeField(auto_now_add=True, editable=False, verbose_name=_("created on"))
    modified_on = models.DateTimeField(auto_now=True, editable=False, verbose_name=_("modified on"))
    function = models.TextField(verbose_name=_("task function"))
    arguments = JSONField(blank=True, null=True, verbose_name=_("task arguments"))
    shop = models.ForeignKey(
        on_delete=models.SET_NULL, to="shuup.Shop", verbose_name=_("shop"), related_name="background_tasks", null=True
    )
    supplier = models.ForeignKey(
        on_delete=models.SET_NULL,
        to="shuup.Supplier",
        verbose_name=_("supplier"),
        related_name="background_tasks",
        null=True,
    )
    user = models.ForeignKey(
        on_delete=models.SET_NULL,
        to=get_user_model(),
        verbose_name=_("user"),
        related_name="background_tasks",
        null=True,
    )

    class Meta:
        verbose_name = _("background task")
        verbose_name_plural = _("background tasks")


class BackgroundTaskExecutionStatus(Enum):
    RUNNING = 0
    SUCCESS = 1
    ERROR = 2

    class Label:
        RUNNING = _("running")
        SUCCESS = _("success")
        ERROR = _("error")


class BackgroundTaskExecution(models.Model):
    task = models.ForeignKey(
        on_delete=models.CASCADE,
        to=BackgroundTask,
        verbose_name=_("background task"),
        related_name="executions",
    )
    started_on = models.DateTimeField(verbose_name=_("started on"), auto_now_add=True)
    finished_on = models.DateTimeField(verbose_name=_("finished on"), null=True)
    status = EnumIntegerField(
        BackgroundTaskExecutionStatus, default=BackgroundTaskExecutionStatus.RUNNING, verbose_name=_("status")
    )
    result = JSONField(blank=True, null=True, verbose_name=_("results"))
    error_log = models.TextField(verbose_name=_("error log"), blank=True, null=True)

    class Meta:
        verbose_name = _("background task execution")
        verbose_name_plural = _("background task executions")