in kitsune/search/base.py [0:0]
def to_action(self, action=None, is_bulk=False, **kwargs):
"""Method to construct the data for save, delete, update operations.
Useful for bulk operations.
"""
# If an object has a discard field then mark it for deletion if exists
# This is the only case where this method ignores the passed arg action and
# overrides it with a deletion. This can happen if the `prepare` method of each
# document type has marked a document as not suitable for indexing
if hasattr(self, "es_discard_doc"):
# Let's try to delete anything that might exist in ES
action = "delete"
kwargs = {}
# Default to index if no action is defined or if it's `save`
# if we have a bulk update, we need to include the meta info
# and return the data by calling the to_dict() method of DSL
payload = self.to_dict(include_meta=is_bulk, skip_empty=False)
# If we are in a test environment, mark refresh=True so that
# documents will be updated/added directly in the index.
if settings.TEST and not is_bulk:
kwargs.update({"refresh": True})
if not action or action == "index":
return payload if is_bulk else self.save(**kwargs)
elif action == "update":
# add any additional args like doc_as_upsert
payload.update(kwargs)
if is_bulk:
# this is a bit idiomatic b/c dsl does not have a wrapper around bulk operations
# we need to return the payload and let elasticsearch-py bulk method deal with
# the update
payload["doc"] = payload["_source"]
payload.update(
{
"_op_type": "update",
"retry_on_conflict": UPDATE_RETRY_ON_CONFLICT,
}
)
del payload["_source"]
return payload
return self.update(**payload)
elif action == "delete":
# if we have a bulk operation, drop the _source and mark the operation as deletion
if is_bulk:
payload.update({"_op_type": "delete"})
del payload["_source"]
return payload
# This is a single document op, delete it
kwargs.update({"ignore": [400, 404]})
return self.delete(**kwargs)