Source code for services.users.export
import concurrent.futures
from typing import TYPE_CHECKING
from django.apps import apps
from django.core import serializers
from orjson import orjson
from api.users.serializers import FollowingAndFollowersUserSerializer
if TYPE_CHECKING:
from apps.users.models import User
[docs]
class ExportUserData:
@classmethod
def _get_params(cls, model, user):
params = {}
if hasattr(model, "author"):
params["author"] = user
if hasattr(model, "is_deleted"):
params["is_deleted"] = False
if hasattr(model, "post"):
params["post__is_deleted"] = False
return params
@classmethod
def _serialize_batch(cls, model, params):
qs = model.objects.filter(**params)
if not qs.exists():
return model.__name__, []
serialized_data = serializers.serialize("python", qs)
transformed_data = [{"id": obj["pk"], **obj["fields"]} for obj in serialized_data]
return model.__name__, transformed_data
[docs]
@classmethod
def export_data(cls, user: "User"):
models = apps.get_models()
data = {"User": FollowingAndFollowersUserSerializer(user).data}
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = {
executor.submit(cls._serialize_batch, model, cls._get_params(model, user)): model
for model in models
if hasattr(model, "author")
}
for future in concurrent.futures.as_completed(futures):
model_name, result = future.result()
if result:
data[model_name] = result
return orjson.dumps(data).decode()