def metadata(self): """ Retrive metadate for the current drive file. If not previously linked then link Drive file with Mongo Lab database. returns: JSON file metadata object. """ file_data = { 'name': self.name, 'drive_id': self.id, 'version': self.version, 'dependencies': [] } # If Drive file have mongo id propertie if 'mongo_id' in self.properties.keys(): mongo_id = self.properties['mongo_id'] self.mfile = MongoFile(mongo_id) if self.mfile.data is None: log.info('Drive property exist but no Mongo metadata found.') log.info('Creating new metadata...') self.delete_property('mongo_id') mongo_id = self.mfile.new(file_data) self.add_property('mongo_id', mongo_id) else: # Metadata already exists. pass else: # If metadate created first time for this file. log.info('Creating new metadata...') mongo_id = self.mfile.new(file_data) self.add_property('mongo_id', mongo_id) self.mfile = MongoFile(mongo_id) return self.mfile.data
def __init__(self, drive_id=None): super(self.__class__, self).__init__() if drive_id is not None: self.id = drive_id self.file = self._file() self.mfile = MongoFile()
class DriveFile(DriveService): """ Class define drive file and all actions associated with it. """ def __init__(self, drive_id=None): super(self.__class__, self).__init__() if drive_id is not None: self.id = drive_id self.file = self._file() self.mfile = MongoFile() @property def name(self): return self.file['title'] @property def version(self): return len(self.revisions()) @property def properties(self): props = {} if 'properties' in self.file: for p in self.file['properties']: props[p['key']] = p['value'] else: log.info('File %s does not have any custom properties.' % self.name) return props def metadata(self): """ Retrive metadate for the current drive file. If not previously linked then link Drive file with Mongo Lab database. returns: JSON file metadata object. """ file_data = { 'name': self.name, 'drive_id': self.id, 'version': self.version, 'dependencies': [] } # If Drive file have mongo id propertie if 'mongo_id' in self.properties.keys(): mongo_id = self.properties['mongo_id'] self.mfile = MongoFile(mongo_id) if self.mfile.data is None: log.info('Drive property exist but no Mongo metadata found.') log.info('Creating new metadata...') self.delete_property('mongo_id') mongo_id = self.mfile.new(file_data) self.add_property('mongo_id', mongo_id) else: # Metadata already exists. pass else: # If metadate created first time for this file. log.info('Creating new metadata...') mongo_id = self.mfile.new(file_data) self.add_property('mongo_id', mongo_id) self.mfile = MongoFile(mongo_id) return self.mfile.data def add_dependencies(self, drive_ids=[]): for d_id in drive_ids: dfile = DriveFile(d_id) self.mfile.data['dependencies'].append({'name': dfile.name, 'drive_id': d_id}) self.mfile.update() def _file(self): return self.service.files().get(fileId=self.id).execute() def _parent(self, drive_file): parent_id = drive_file['parents'][0]['id'] parent = self.service.files().get(fileId=parent_id).execute() return parent def _list_files(self): files = self.service.files().list( q="'%s' in parents and trashed = false" % self.file['id'] ).execute()['items'] return files def _download_file(self, drive_file, local_file): if local_file.path.is_dir(): local_path = local_file.path / self.name request = self.service.files().get_media(fileId=self.id) fh = io.FileIO(str(local_path), mode='wb') media_request = apiclient.http.MediaIoBaseDownload(fh, request) pbar = ProgressBar(maxval=100).start() log.info('Downloading %s version %s' % (local_path / self.name, self.version)) while True: try: download_progress, done = media_request.next_chunk() except errors.HttpError, error: log.error('An error occurred: %s' % error) return if download_progress: pbar.update(int(download_progress.progress() * 100)) if done: log.info('\n%s downloaded.' % self.name) return