datacollector.py 2.6 KB

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