Example #1
0
 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)
Example #5
0
 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)
Example #7
0
 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 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 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]})
Example #10
0
 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)
Example #12
0
 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,
     })
Example #14
0
 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)
Example #15
0
 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})
Example #17
0
 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)
Example #20
0
 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 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)
Example #22
0
 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})