コード例 #1
0
ファイル: drive.py プロジェクト: Kif11/gdrive_asset_manager
    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
コード例 #2
0
ファイル: drive.py プロジェクト: Kif11/gdrive_asset_manager
 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()
コード例 #3
0
ファイル: drive.py プロジェクト: Kif11/gdrive_asset_manager
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