datacollector.py 2.9 KB

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