flamingo-run/django-cloud-tasks

View on GitHub
django_cloud_tasks/field.py

Summary

Maintainability
A
0 mins
Test Coverage
from django.apps import apps
from django.core.exceptions import ValidationError
from django.db.models import CharField

from django_cloud_tasks.apps import DjangoCloudTasksAppConfig
from django_cloud_tasks.exceptions import TaskNotFound


def validate_task_name(value: str):
    app: DjangoCloudTasksAppConfig = apps.get_app_config("django_cloud_tasks")
    try:
        app.get_task(name=value)
    except TaskNotFound as exc:
        raise ValidationError(f"Task {value} not found") from exc


class TaskField(CharField):
    def __init__(self, validate_task: bool = True, **kwargs):
        kwargs.setdefault("max_length", 50)
        super().__init__(**kwargs)
        self.validate_task = validate_task

    def get_db_prep_value(self, value, connection, prepared=False):
        if self.validate_task and value is not None:
            validate_task_name(value=value)
        return super().get_db_prep_value(value, connection, prepared)

    def contribute_to_class(self, cls, name, private_only=False):
        @property
        def get(obj):
            app: DjangoCloudTasksAppConfig = apps.get_app_config("django_cloud_tasks")
            value = getattr(obj, self.attname)
            return app.get_task(name=value)

        field_name = name.replace("_name", "_class")
        setattr(cls, field_name, get)
        return super().contribute_to_class(cls=cls, name=name, private_only=private_only)