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 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): if identifier in self['labels']: del self['labels'][identifier]