datacollector.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import json
  2. import os
  3. import shutil
  4. from django.utils import timezone
  5. from django.utils.crypto import get_random_string
  6. class DataWriter(object):
  7. def write_json_file(self, name, data):
  8. file_path = os.path.join(self.data_dir_path, '{}.json'.format(name))
  9. with open(file_path, 'w+') as fp:
  10. json.dump(data, fp, ensure_ascii=False, indent=2)
  11. def write_file(self, model_file):
  12. if not model_file:
  13. return None
  14. target_filename = model_file.name.split('/')[-1]
  15. target_path = os.path.join(self.data_dir_path, target_filename)
  16. with open(target_path, 'wb') as fp:
  17. for chunk in model_file.chunks():
  18. fp.write(chunk)
  19. return target_path
  20. class DataCollection(DataWriter):
  21. def __init__(self, user, data_dir_path):
  22. self.user = user
  23. self.data_dir_path = data_dir_path
  24. os.mkdir(data_dir_path)
  25. class DataCollector(DataWriter):
  26. def __init__(self, user, working_dir_path):
  27. self.user = user
  28. self.working_dir_path = working_dir_path
  29. self.archive_path = None
  30. self.tmp_dir_path = self.create_tmp_dir()
  31. self.data_dir_path = self.create_data_dir()
  32. def get_tmp_dir_name(self):
  33. dir_name_bits = [
  34. self.user.slug,
  35. timezone.now().strftime('%Y%m%d-%H%M%S'),
  36. get_random_string(6),
  37. ]
  38. return '-'.join(dir_name_bits)
  39. def create_tmp_dir(self):
  40. tmp_dir_name = self.get_tmp_dir_name()
  41. tmp_dir_path = os.path.join(self.working_dir_path, tmp_dir_name)
  42. os.mkdir(tmp_dir_path)
  43. return tmp_dir_path
  44. def get_data_dir_name(self):
  45. dir_name_bits = [
  46. self.user.slug,
  47. timezone.now().strftime('%Y%m%d-%H%M%S'),
  48. ]
  49. return '-'.join(dir_name_bits)
  50. def create_data_dir(self):
  51. data_dir_name = self.get_data_dir_name()
  52. data_dir_path = os.path.join(self.tmp_dir_path, data_dir_name)
  53. os.mkdir(data_dir_path)
  54. return data_dir_path
  55. def create_collection(self, name):
  56. collection_dir_path = os.path.join(self.data_dir_path, name)
  57. return DataCollection(self.user, collection_dir_path)
  58. def create_archive(self):
  59. archive_name = self.get_tmp_dir_name()
  60. archive_path = os.path.join(self.working_dir_path, archive_name)
  61. shutil.make_archive(archive_path, 'zip', self.tmp_dir_path)
  62. self.archive_path = archive_path
  63. return archive_path
  64. def delete_tmp_dir(self):
  65. shutil.rmtree(self.tmp_dir_path)