prepareuserdatadownloads.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import logging
  2. from django.contrib.auth import get_user_model
  3. from django.core.management.base import BaseCommand
  4. from misago.conf import settings
  5. from misago.core.pgutils import chunk_queryset
  6. from misago.users.datacollector import DataCollector
  7. from misago.users.models import DataDownload
  8. logger = logging.getLogger('misago.users.datadownloads')
  9. UserModel = get_user_model()
  10. class Command(BaseCommand):
  11. help = "Prepares user data downloads."
  12. def handle(self, *args, **options):
  13. working_dir = settings.MISAGO_USER_DATA_DOWNLOADS_WORKING_DIR
  14. if not working_dir:
  15. self.stdout.write(
  16. "MISAGO_USER_DATA_DOWNLOADS_WORKING_DIR has to be set in order for "
  17. "this feature to work.")
  18. return
  19. downloads_prepared = 0
  20. queryset = DataDownload.objects.select_related('user')
  21. queryset = queryset.filter(status=DataDownload.STATUS_PENDING)
  22. for data_download in chunk_queryset(queryset):
  23. data_collector = DataCollector(data_download.user, working_dir)
  24. try:
  25. collect_user_data(data_download.user, data_collector)
  26. data_collector.create_archive()
  27. data_download.save()
  28. except Exception as e:
  29. print(e)
  30. logger.exception(e)
  31. data_collector.delete_tmp_dir()
  32. downloads_prepared += 1
  33. self.stdout.write("Data downloads prepared: {}".format(downloads_prepared))
  34. def collect_user_data(user, data_collector):
  35. data_collector.write_json_file('details', {
  36. 'username': user.username,
  37. 'email': user.email,
  38. })
  39. avatars = data_collector.create_collection('avatars')
  40. avatars.write_file(user.avatar_tmp)
  41. avatars.write_file(user.avatar_src)
  42. for avatar in user.avatar_set.iterator():
  43. avatars.write_file(avatar.image)