Project.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from json import load
  2. from os import path
  3. from uuid import uuid1
  4. from pycs.observable import ObservableDict
  5. from pycs.projects.MediaFile import MediaFile
  6. from pycs.util.RecursiveDictionary import set_recursive
  7. class Project(ObservableDict):
  8. def __init__(self, obj: dict, parent):
  9. # ensure all required object keys are available
  10. for key in ['data', 'labels', 'jobs']:
  11. if key not in obj.keys():
  12. obj[key] = {}
  13. # save data as MediaFile objects
  14. for key in obj['data'].keys():
  15. obj['data'][key] = MediaFile(obj['data'][key], self)
  16. # load model data
  17. folder = path.join('projects', obj['id'], 'model')
  18. with open(path.join(folder, 'distribution.json'), 'r') as file:
  19. model = load(file)
  20. model['path'] = folder
  21. obj['model'] = model
  22. # initialize super
  23. super().__init__(obj, parent)
  24. # subscribe to changes to write to disk afterwards
  25. self.subscribe(lambda d: self.parent.write_project(self['id']))
  26. def update_properties(self, update):
  27. set_recursive(update, self)
  28. def new_media_file_path(self):
  29. return path.join('projects', self['id'], 'data'), str(uuid1())
  30. def add_media_file(self, file):
  31. file = MediaFile(file, self)
  32. self['data'][file['id']] = file
  33. def remove_media_file(self, file_id):
  34. del self['data'][file_id]
  35. def add_label(self, name):
  36. label_uuid = str(uuid1())
  37. self['labels'][label_uuid] = {
  38. 'id': label_uuid,
  39. 'name': name
  40. }
  41. def update_label(self, identifier, name):
  42. if identifier in self['labels']:
  43. self['labels'][identifier]['name'] = name
  44. def remove_label(self, identifier):
  45. # abort if identifier is unknown
  46. if identifier not in self['labels']:
  47. return
  48. # remove label from data elements
  49. remove = list()
  50. for data in self['data']:
  51. for pred in self['data'][data]['predictionResults']:
  52. if 'label' in self['data'][data]['predictionResults'][pred]:
  53. if self['data'][data]['predictionResults'][pred]['label'] == identifier:
  54. remove.append((data, pred))
  55. for t in remove:
  56. del self['data'][t[0]]['predictionResults'][t[1]]
  57. # remove label from list
  58. del self['labels'][identifier]