wagtail/wagtail/tasks.py

42 wiersze
1.3 KiB
Python

from django.apps import apps
from django.db import transaction
from django.utils.module_loading import import_string
from django_tasks import task
from modelcluster.fields import ParentalKey
from wagtail.models import ReferenceIndex
@task()
def update_reference_index_task(app_label, model_name, pk):
model = apps.get_model(app_label, model_name)
instance = model.objects.get(pk=pk)
# If the model is a child model, find the parent instance and index that instead
while True:
parental_keys = list(
filter(
lambda field: isinstance(field, ParentalKey),
instance._meta.get_fields(),
)
)
if not parental_keys:
break
instance = getattr(instance, parental_keys[0].name)
if instance is None:
# parent is null, so there is no valid object to record references against
return
if ReferenceIndex.is_indexed(instance._meta.model):
with transaction.atomic():
ReferenceIndex.create_or_update_for_object(instance)
@task()
def delete_file_from_storage_task(deconstructed_storage, path):
storage_module, storage_args, storage_kwargs = deconstructed_storage
storage = import_string(storage_module)(*storage_args, **storage_kwargs)
storage.delete(path)