Project.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. def update_properties(self, update):
  18. set_recursive(update, self)
  19. def new_media_file_path(self):
  20. return path.join('projects', self['id'], 'data'), str(uuid1())
  21. def add_media_file(self, file):
  22. file = MediaFile(file, self)
  23. self['data'][file['id']] = file
  24. def add_label(self, name):
  25. label_uuid = str(uuid1())
  26. self['labels'][label_uuid] = {
  27. 'id': label_uuid,
  28. 'name': name
  29. }
  30. def update_label(self, identifier, name):
  31. if identifier in self['labels']:
  32. self['labels'][identifier]['name'] = name
  33. def remove_label(self, identifier):
  34. # abort if identifier is unknown
  35. if identifier not in self['labels']:
  36. return
  37. # remove label from data elements
  38. remove = list()
  39. for data in self['data']:
  40. for pred in self['data'][data]['predictionResults']:
  41. if 'label' in self['data'][data]['predictionResults'][pred]:
  42. if self['data'][data]['predictionResults'][pred]['label'] == identifier:
  43. remove.append((data, pred))
  44. for t in remove:
  45. del self['data'][t[0]]['predictionResults'][t[1]]
  46. # remove label from list
  47. del self['labels'][identifier]