Project.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from os import path
  2. from uuid import uuid1
  3. from pycs.observable import ObservableDict
  4. from pycs.projects.MediaFile import MediaFile
  5. from pycs.util.RecursiveDictionary import set_recursive
  6. class Project(ObservableDict):
  7. def __init__(self, obj: dict, parent):
  8. # ensure all required object keys are available
  9. for key in ['data', 'labels', 'jobs']:
  10. if key not in obj.keys():
  11. obj[key] = {}
  12. # save data as MediaFile objects
  13. for key in obj['data'].keys():
  14. obj['data'][key] = MediaFile(obj['data'][key], self)
  15. # initialize super
  16. super().__init__(obj, parent)
  17. # subscribe to changes to write to disk afterwards
  18. self.subscribe(lambda d: self.parent.write_project(self['id']))
  19. def update_properties(self, update):
  20. set_recursive(update, self)
  21. def new_media_file_path(self):
  22. return path.join('projects', self['id'], 'data'), str(uuid1())
  23. def add_media_file(self, file):
  24. file = MediaFile(file, self)
  25. self['data'][file['id']] = file
  26. def add_label(self, name):
  27. label_uuid = str(uuid1())
  28. self['labels'][label_uuid] = {
  29. 'id': label_uuid,
  30. 'name': name
  31. }
  32. def update_label(self, identifier, name):
  33. if identifier in self['labels']:
  34. self['labels'][identifier]['name'] = name
  35. def remove_label(self, identifier):
  36. if identifier in self['labels']:
  37. del self['labels'][identifier]