def get_events(self): stream_position = request.params.get('stream_position', '0') limit = int(request.params.get('limit', '100')) if stream_position == 'now': return json.dumps({ 'total_count': 0, 'next_stream_position': self._ms_since_epoch(datetime.utcnow()), 'entries': [], }) stream_position = int(stream_position) event_query = self._db_session.query(EventModel).filter( EventModel.stream_position >= self._ms_after_epoch(stream_position or 1), ) total_count = event_query.count() results = event_query.order_by( EventModel.sequence_id).limit(limit).all() max_stream_position = max(e.stream_position for e in results) if results else self._epoch next_stream_position = datetime.utcnow( ) if total_count < limit else max_stream_position - timedelta( seconds=5) file_ids = [e.source_id for e in results if e.source_type == 'file'] folder_ids = [ e.source_id for e in results if e.source_type == 'folder' ] file_records = self._db_session.query(FileModel).filter( FileModel.file_id.in_(file_ids)).all() if file_ids else [] folder_records = self._db_session.query(FolderModel).filter( FolderModel.folder_id.in_(folder_ids)).all() if folder_ids else [] if results: results = [{ 'type': 'event', 'event_id': e.event_id, 'event_type': e.event_type, 'source_id': e.source_id, 'source': next((f for f in file_records if f.file_id == e.source_id), None) or next( (f for f in folder_records if f.folder_id == e.source_id), None), } for e in results] return json.dumps({ 'chunk_size': total_count, 'next_stream_position': self._ms_since_epoch(next_stream_position), 'entries': results, })
def create_folder(self): """ https://developers.box.com/docs/#folders-create-a-new-folder """ params = json.load(request.body) name = params.get('name') if name is None: abort(400, 'Missing parameter: name') parent = params.get('parent') if parent is None or 'id' not in parent: abort(400, 'Missing parameter: parent(id)') parent_id = parent['id'] try: parent_folder = self._db_session.query(FolderModel).filter_by(folder_id=parent_id).one() except NoResultFound: abort(404) owner = get_user_from_header(self._db_session) name_in_use = self._db_session.query(FolderModel).filter_by(name=name).count() if name_in_use: abort(409, 'An item with that name already exists.') folder = FolderModel(name=name, parent_id=parent_folder.id, owned_by=owner, created_by=owner) self._db_session.add(folder) self._db_session.commit() self._db_session.add(EventModel(event_type='ITEM_CREATE', source_id=folder.folder_id, source_type='folder')) self._db_session.commit() return json.dumps(folder)
def update_folder_info(self, folder_id): folder = get_folder_by_id(self._db_session, folder_id) params = json.load(request.body) for key, value in params.items(): if not hasattr(FolderModel, key): abort(400, "Folder has no attribute {0}.".format(key)) if key == "parent": # Move parent_id = value["id"] parent_folder = get_folder_by_id(self._db_session, parent_id) folder.parent_id = parent_folder.id self._db_session.add( EventModel(event_type="ITEM_MOVE", source_id=folder.folder_id, source_type="folder") ) else: setattr(folder, key, value) if key == "name": self._db_session.add( EventModel(event_type="ITEM_RENAME", source_id=folder.folder_id, source_type="folder") ) elif key == "sync_state": event_type = "ITEM_SYNC" if value == FolderSyncState.IS_SYNCED else "ITEM_UNSYNC" self._db_session.add( EventModel(event_type=event_type, source_id=folder.folder_id, source_type="folder") ) self._db_session.commit() return json.dumps(folder)
def create_folder(self): """ https://developers.box.com/docs/#folders-create-a-new-folder """ params = json.load(request.body) name = params.get("name") if name is None: abort(400, "Missing parameter: name") parent = params.get("parent") if parent is None or "id" not in parent: abort(400, "Missing parameter: parent(id)") parent_id = parent["id"] try: parent_folder = self._db_session.query(FolderModel).filter_by(folder_id=parent_id).one() except NoResultFound: abort(404) owner = get_user_from_header(self._db_session) name_in_use = self._db_session.query(FolderModel).filter_by(name=name).count() if name_in_use: abort(409, "An item with that name already exists.") folder = FolderModel(name=name, parent_id=parent_folder.id, owned_by=owner, created_by=owner) self._db_session.add(folder) self._db_session.commit() self._db_session.add(EventModel(event_type="ITEM_CREATE", source_id=folder.folder_id, source_type="folder")) self._db_session.commit() return json.dumps(folder)
def update_file_info(self, file_id): file_object = get_file_by_id(self._db_session, file_id) self._check_file_lock(file_object) params = json.load(request.body) for key, value in params.items(): if not hasattr(FileModel, key): abort(400, 'File has no attribute {0}.'.format(key)) if key == 'parent': # Move parent_id = value['id'] parent_folder = get_folder_by_id(self._db_session, parent_id) file_object.parent_id = parent_folder.id self._db_session.add( EventModel(event_type='ITEM_MOVE', source_id=file_object.file_id, source_type='file'), ) else: setattr(file_object, key, value) if key == 'name': self._db_session.add( EventModel(event_type='ITEM_RENAME', source_id=file_object.file_id, source_type='file'), ) elif key == 'sync_state': event_type = 'ITEM_SYNC' if value == 'synced' else 'ITEM_UNSYNC' self._db_session.add( EventModel(event_type=event_type, source_id=file_object.file_id, source_type='file'), ) self._db_session.commit() return json.dumps(file_object)
def update_folder_info(self, folder_id): folder = get_folder_by_id(self._db_session, folder_id) params = json.load(request.body) for key, value in params.items(): if not hasattr(FolderModel, key): abort(400, 'Folder has no attribute {0}.'.format(key)) if key == 'parent': # Move parent_id = value['id'] parent_folder = get_folder_by_id(self._db_session, parent_id) folder.parent_id = parent_folder.id self._db_session.add( EventModel(event_type='ITEM_MOVE', source_id=folder.folder_id, source_type='folder'), ) else: setattr(folder, key, value) if key == 'name': self._db_session.add( EventModel(event_type='ITEM_RENAME', source_id=folder.folder_id, source_type='folder'), ) elif key == 'sync_state': event_type = 'ITEM_SYNC' if value == FolderSyncState.IS_SYNCED else 'ITEM_UNSYNC' self._db_session.add( EventModel(event_type=event_type, source_id=folder.folder_id, source_type='folder'), ) self._db_session.commit() return json.dumps(folder)
def upload_file(self): """ https://developers.box.com/docs/#files-upload-a-file """ attributes = request.forms.get('attributes') or request.forms.get( 'metadata') if not attributes: abort(400, 'Missing parameter: attributes') attributes = json.loads(attributes) parent = attributes.get('parent') if parent is None or 'id' not in parent: abort(400, 'Missing parameter: parent(id)') parent_id = parent['id'] folder = get_folder_by_id(self._db_session, parent_id) content = request.files.file.file.read() file_hash = sha1() file_hash.update(content) owner = get_user_from_header(self._db_session) file_object = FileModel( content=content, name=attributes.get('name', request.files.file.name), parent_id=folder.id, sha1=file_hash.hexdigest(), size=len(content), owned_by=owner, created_by=owner, ) self._db_session.add(file_object) self._db_session.commit() self._db_session.add( EventModel(event_type='ITEM_UPLOAD', source_id=file_object.file_id, source_type='file')) self._db_session.commit() return json.dumps({'entries': [file_object]})
def upload_file(self): """ https://developers.box.com/docs/#files-upload-a-file """ attributes = request.forms.get('attributes') or request.forms.get('metadata') if not attributes: abort(400, 'Missing parameter: attributes') attributes = json.loads(attributes) parent = attributes.get('parent') if parent is None or 'id' not in parent: abort(400, 'Missing parameter: parent(id)') parent_id = parent['id'] folder = get_folder_by_id(self._db_session, parent_id) content = request.files.file.file.read() file_hash = sha1() file_hash.update(content) owner = get_user_from_header(self._db_session) file_object = FileModel( content=content, name=attributes.get('name', request.files.file.name), parent_id=folder.id, sha1=file_hash.hexdigest(), size=len(content), owned_by=owner, created_by=owner, ) self._db_session.add(file_object) self._db_session.commit() self._db_session.add(EventModel(event_type='ITEM_UPLOAD', source_id=file_object.file_id, source_type='file')) self._db_session.commit() return json.dumps({'entries': [file_object]})
def copy_folder(self, folder_id): folder = get_folder_by_id(self._db_session, folder_id) parent_folder = self._get_parent() self._db_session.expunge(folder) make_transient(folder) folder.id = None folder.folder_id = None folder.parent_id = parent_folder.id self._db_session.add(folder) self._db_session.commit() self._db_session.add(EventModel(event_type="ITEM_COPY", source_id=folder.folder_id, source_type="folder")) self._db_session.commit() return json.dumps(folder)
def copy_folder(self, folder_id): folder = get_folder_by_id(self._db_session, folder_id) parent_folder = self._get_parent() self._db_session.expunge(folder) make_transient(folder) folder.id = None folder.folder_id = None folder.parent_id = parent_folder.id self._db_session.add(folder) self._db_session.commit() self._db_session.add(EventModel(event_type='ITEM_COPY', source_id=folder.folder_id, source_type='folder')) self._db_session.commit() return json.dumps(folder)
def copy_file(self, file_id): file_object = get_file_by_id(self._db_session, file_id) self._check_file_lock(file_object) parent_folder = self._get_parent() self._db_session.expunge(file_object) make_transient(file_object) file_object.id = None file_object.file_id = None file_object.parent_id = parent_folder.id self._db_session.add(file_object) self._db_session.commit() self._db_session.add(EventModel(event_type='ITEM_COPY', source_id=file_object.file_id, source_type='file')) self._db_session.commit() return json.dumps(file_object)
def get_events(self): stream_position = request.params.get('stream_position', '0') limit = int(request.params.get('limit', '100')) if stream_position == 'now': return json.dumps({ 'total_count': 0, 'next_stream_position': self._ms_since_epoch(datetime.utcnow()), 'entries': [], }) stream_position = int(stream_position) event_query = self._db_session.query(EventModel).filter( EventModel.stream_position >= self._ms_after_epoch(stream_position or 1), ) total_count = event_query.count() results = event_query.order_by(EventModel.sequence_id).limit(limit).all() max_stream_position = max(e.stream_position for e in results) if results else self._epoch next_stream_position = datetime.utcnow() if total_count < limit else max_stream_position - timedelta(seconds=5) file_ids = [e.source_id for e in results if e.source_type == 'file'] folder_ids = [e.source_id for e in results if e.source_type == 'folder'] file_records = self._db_session.query(FileModel).filter(FileModel.file_id.in_(file_ids)).all() if file_ids else [] folder_records = self._db_session.query(FolderModel).filter(FolderModel.folder_id.in_(folder_ids)).all() if folder_ids else [] if results: results = [{ 'type': 'event', 'event_id': e.event_id, 'event_type': e.event_type, 'source_id': e.source_id, 'source': next( (f for f in file_records if f.file_id == e.source_id), None ) or next((f for f in folder_records if f.folder_id == e.source_id), None), } for e in results] return json.dumps({ 'chunk_size': total_count, 'next_stream_position': self._ms_since_epoch(next_stream_position), 'entries': results, })
def update_file(self, file_id): """ https://developers.box.com/docs/#files-upload-a-new-version-of-a-file """ file_object = get_file_by_id(self._db_session, file_id) self._check_file_lock(file_object) content = request.files.file.file.read() file_hash = sha1() file_hash.update(content) file_object.content = content file_object.sha1 = file_hash.hexdigest() file_object.size = len(content) self._db_session.add(EventModel(event_type='ITEM_UPLOAD', source_id=file_object.file_id, source_type='file')) self._db_session.commit() return json.dumps(file_object)
def get_folder_items(self, folder_id): view = request.params.get("view", None) if view is not None and view == "subfolder_sync_forked_tree": return self._gat(folder_id) limit = int(request.params.get("limit", 100)) offset = int(request.params.get("offset", 0)) # fields = request.params.get('fields') # fields = set(fields.split(',')) if fields else set() | set(['name']) folder = get_folder_by_id(self._db_session, folder_id) folder_count = self._db_session.query(FolderModel).filter_by(parent_id=folder.id).count() folders = [] if folder_count > offset: folders = ( self._db_session.query(FolderModel).filter_by(parent_id=folder.id).limit(limit).offset(offset).all() ) files = [] if len(folders) < limit: limit -= len(folders) offset -= folder_count files = self._db_session.query(FileModel).filter_by(parent_id=folder.id).limit(limit).offset(offset).all() items = folders + files return json.dumps({"total_count": len(items), "entries": items})
def get_folder_items(self, folder_id): view = request.params.get('view', None) if view is not None and view == 'subfolder_sync_forked_tree': return self._gat(folder_id) limit = int(request.params.get('limit', 100)) offset = int(request.params.get('offset', 0)) # fields = request.params.get('fields') # fields = set(fields.split(',')) if fields else set() | set(['name']) folder = get_folder_by_id(self._db_session, folder_id) folder_count = self._db_session.query(FolderModel).filter_by(parent_id=folder.id).count() folders = [] if folder_count > offset: folders = self._db_session.query( FolderModel, ).filter_by(parent_id=folder.id).limit(limit).offset(offset).all() files = [] if len(folders) < limit: limit -= len(folders) offset -= folder_count files = self._db_session.query(FileModel).filter_by(parent_id=folder.id).limit(limit).offset(offset).all() items = folders + files return json.dumps({'total_count': len(items), 'entries': items})
def get_folder_info(self, folder_id): """ https://developers.box.com/docs/#folders-get-information-about-a-folder """ folder = get_folder_by_id(self._db_session, folder_id) return json.dumps(folder)
def _gat(self, folder_id): # pylint:disable=unused-argument files = self._db_session.query(FileModel).all() folders = self._db_session.query(FolderModel).filter(FolderModel.folder_id != '0').all() return json.dumps({'items': files + folders})
def get_file_info(self, file_id): """ https://developers.box.com/docs/#files-get """ file_object = get_file_by_id(self._db_session, file_id) return json.dumps(file_object)
def _gat(self, folder_id): # pylint:disable=unused-argument files = self._db_session.query(FileModel).all() folders = self._db_session.query(FolderModel).filter(FolderModel.folder_id != "0").all() return json.dumps({"items": files + folders})