from os import path from uuid import uuid1 from pycs.observable import ObservableDict from pycs.projects.MediaFile import MediaFile from pycs.util.RecursiveDictionary import set_recursive class Project(ObservableDict): def __init__(self, obj: dict, parent): # ensure all required object keys are available for key in ['data', 'labels', 'jobs']: if key not in obj.keys(): obj[key] = {} # save data as MediaFile objects for key in obj['data'].keys(): obj['data'][key] = MediaFile(obj['data'][key], self) # initialize super super().__init__(obj, parent) # subscribe to changes to write to disk afterwards self.subscribe(lambda d: self.parent.write_project(self['id'])) def update_properties(self, update): set_recursive(update, self) def new_media_file_path(self): return path.join('projects', self['id'], 'data'), str(uuid1()) def add_media_file(self, file): file = MediaFile(file, self) self['data'][file['id']] = file def remove_media_file(self, file_id): del self['data'][file_id] def add_label(self, name): label_uuid = str(uuid1()) self['labels'][label_uuid] = { 'id': label_uuid, 'name': name } def update_label(self, identifier, name): if identifier in self['labels']: self['labels'][identifier]['name'] = name def remove_label(self, identifier): # abort if identifier is unknown if identifier not in self['labels']: return # remove label from data elements remove = list() for data in self['data']: for pred in self['data'][data]['predictionResults']: if 'label' in self['data'][data]['predictionResults'][pred]: if self['data'][data]['predictionResults'][pred]['label'] == identifier: remove.append((data, pred)) for t in remove: del self['data'][t[0]]['predictionResults'][t[1]] # remove label from list del self['labels'][identifier]