6
0

Project.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 remove_media_file(self, file_id):
  27. del self['data'][file_id]
  28. def add_label(self, name):
  29. label_uuid = str(uuid1())
  30. self['labels'][label_uuid] = {
  31. 'id': label_uuid,
  32. 'name': name
  33. }
  34. def update_label(self, identifier, name):
  35. if identifier in self['labels']:
  36. self['labels'][identifier]['name'] = name
  37. def remove_label(self, identifier):
  38. # abort if identifier is unknown
  39. if identifier not in self['labels']:
  40. return
  41. # remove label from data elements
  42. remove = list()
  43. for data in self['data']:
  44. for pred in self['data'][data]['predictionResults']:
  45. if 'label' in self['data'][data]['predictionResults'][pred]:
  46. if self['data'][data]['predictionResults'][pred]['label'] == identifier:
  47. remove.append((data, pred))
  48. for t in remove:
  49. del self['data'][t[0]]['predictionResults'][t[1]]
  50. # remove label from list
  51. del self['labels'][identifier]