Exemplo n.º 1
0
    def UpdateRoute():
        """
        更新文档 (DB)
        会更新文档分组和文件名
        """
        try:
            req_id = int(request.form['id'])
            req_filename = request.form['filename']
            req_docClass = int(request.form['doc_class_id'])
            if not req_filename or not (FileUtil.is_document(req_filename)
                                        or FileUtil.is_image(req_filename)):
                raise ParamError(ParamType.FORM)
        except:
            raise ParamError(ParamType.FORM)
        req_doc = Document(did=req_id,
                           filename=req_filename,
                           docClass=req_docClass)

        filepath = f'{Config.UPLOAD_DOC_FOLDER}/{g.user}/'
        status, new_document = DocumentDao().updateDocument(uid=g.user,
                                                            document=req_doc)
        if status == DbStatusType.NOT_FOUND or not new_document or not os.path.exists(
                filepath + new_document.uuid):
            return Result.error(ResultCode.NOT_FOUND).setMessage(
                "Document Not Found").json_ret()
        elif status == DbStatusType.FAILED:
            return Result.error(ResultCode.DATABASE_FAILED).setMessage(
                "Document Update Failed").json_ret()
        else:  # Success
            return Result.ok().setData(new_document.to_json()).json_ret()
Exemplo n.º 2
0
    def insertDocument(self, uid: int,
                       document: Document) -> (DbStatusType, Document):
        """
        插入新文档 (filename, uuid, docclass) SUCCESS | FOUNDED | FAILED
        """
        if self.queryDocumentById(uid, document.id):  # 已存在
            return DbStatusType.FOUNDED, None

        if not DocClassDao().queryDocClassByIdOrName(
                uid=uid, cid_name=document.docClass.id):  # 分组不存在
            document.docClass = DocClassDao().queryDefaultDocClass(uid=uid)

        cursor = self.db.cursor()
        # noinspection PyBroadException
        try:
            cursor.execute(f'''
                INSERT INTO {tbl_name} (
                    {col_user}, {col_filename}, {col_class_id}, {col_uuid}
                )
                VALUES ({uid}, '{document.filename}', {document.docClass.id}, '{document.uuid}') 
            ''')
            if cursor.rowcount == 0:
                self.db.rollback()
                return DbStatusType.FAILED, None
            return DbStatusType.SUCCESS, self.queryDocumentById(
                uid, cursor.lastrowid)
        except:
            self.db.rollback()
            return DbStatusType.FAILED, None
        finally:
            self.db.commit()
            cursor.close()
Exemplo n.º 3
0
 def queryDocumentsByIds(self, uid: int, ids: List[int]) -> List[Document]:
     """
     根据 ids 查询 Document[]
     """
     cursor = self.db.cursor()
     cursor.execute(f'''
         SELECT {col_user}, {col_id}, {col_filename}, {col_class_id}, {col_uuid}
         FROM {tbl_name}
         WHERE {col_user} = {uid} AND {col_id} IN ({', '.join([str(did) for did in ids])})
     ''')
     result = cursor.fetchall()
     returns: List[Document] = []
     for ret in result:
         # noinspection PyBroadException
         try:
             docClass = DocClassDao().queryDocClassByIdOrName(uid, ret[3])
             if docClass is None:
                 docClass = DocClassDao().queryDefaultDocClass(uid)
             returns.append(
                 Document(did=ret[1],
                          filename=ret[2],
                          docClass=docClass,
                          uuid=ret[4]))
         except:
             pass
     cursor.close()
     return returns
Exemplo n.º 4
0
 def GetClassRoute(cid: int):
     """ classId 查询文档 """
     documents = DocumentDao().queryDocumentsByClassId(uid=g.user, cid=cid)
     new_documents = []
     filepath = f'{Config.UPLOAD_DOC_FOLDER}/{g.user}/'
     for document in documents:
         if os.path.exists(filepath + document.uuid):
             new_documents.append(document)
     return Result().ok().setData(
         Document.to_jsons(new_documents)).json_ret()
Exemplo n.º 5
0
 def GetAllRoute():
     """ 所有文档,只返回文件存在的记录 """
     documents = DocumentDao().queryAllDocuments(g.user)
     new_documents = []
     filepath = f'{Config.UPLOAD_DOC_FOLDER}/{g.user}/'
     for document in documents:
         if os.path.exists(filepath + document.uuid):  # 不删除不存在的记录
             new_documents.append(document)
     return Result().ok().setData(
         Document.to_jsons(new_documents)).json_ret()
Exemplo n.º 6
0
 def GetUserShareCode():
     """ 获取用户所有共享码 getUserShareCodes """
     scs: List[str] = ShareCodeDao().getUserShareCodes(g.user)
     returns = []
     for sc in scs:
         dids = ShareCodeDao().getShareContent(sc)
         documents = DocumentDao().queryDocumentsByIds(g.user, dids)
         if len(documents) == 0:
             continue
         returns.append({
             'sc': sc,
             'documents': Document.to_jsons(documents)
         })
     return Result.ok().setData(returns).json_ret()
Exemplo n.º 7
0
    def GetShareCodeContent(sc: str):
        """ 获取分享码内含的内容 """
        try:
            uid = int(sc.split("_")[2])  # biji_sc_1_xxx
        except KeyError:
            raise ParamError(ParamType.ROUTE)
        except ValueError:
            raise ParamError(ParamType.ROUTE)

        dids = ShareCodeDao().getShareContent(sc)
        if len(dids) == 0:
            return Result.error(ResultCode.BAD_REQUEST).setMessage("Share Code Not Exist").json_ret()
        documents = DocumentDao().queryDocumentsByIds(uid, dids)
        if len(documents) == 0:  # 没有文件
            return Result.error(ResultCode.SHARE_DOCUMENT_NULL).setMessage("Share Code Not Include File").json_ret()
        return Result.ok().setData(Document.to_jsons(documents)).json_ret()
Exemplo n.º 8
0
    def InsertRoute():
        """
        插入文档 (DB + FS)
        先保存文件,记录保存的文件名和 uuid (当前时间)
        然后将文件名 uuid classId 插入数据库,返回
        """
        try:
            upload_file = request.files.get('file')  # 包含文件名
            req_docClass = int(request.form['doc_class_id'])
            if not (upload_file and req_docClass):
                raise ParamError(ParamType.FORM)
        except:
            raise ParamError(ParamType.FORM)

        # # Save
        # file_len = len(upload_file.read())
        # if file_len > Config.MAX_UPLOAD_SIZE:  # 50M
        #     return Result.error(ResultCode.BAD_REQUEST).setMessage('File Out Of Size').json_ret()
        server_filepath = f'{Config.UPLOAD_DOC_FOLDER}/{g.user}/'
        uuid, type_ok, save_ok = FileUtil.saveFile(file=upload_file,
                                                   path=server_filepath,
                                                   file_image=False)
        if not type_ok:  # 格式错误
            return Result.error(ResultCode.BAD_REQUEST).setMessage(
                'File Extension Error').json_ret()
        if not save_ok:  # 保存失败
            return Result.error(ResultCode.SAVE_FILE_FAILED).setMessage(
                'Save Document Failed').json_ret()

        # Database
        document = Document(did=-1,
                            filename=upload_file.filename,
                            uuid=uuid,
                            docClass=req_docClass)
        status, new_document = DocumentDao().insertDocument(uid=g.user,
                                                            document=document)
        if status == DbStatusType.FOUNDED:  # -1 永远不会
            os.remove(os.path.join(server_filepath, uuid))
            return Result.error(ResultCode.HAS_EXISTED).setMessage(
                "Document Existed").json_ret()
        elif status == DbStatusType.FAILED or not new_document:
            os.remove(os.path.join(server_filepath, uuid))
            return Result.error(ResultCode.DATABASE_FAILED).setMessage(
                "Document Insert Failed").json_ret()
        else:  # Success
            return Result.ok().setData(new_document.to_json()).json_ret()
Exemplo n.º 9
0
    def queryDocumentsByClassId(self, uid: int, cid: int) -> List[Document]:
        """
        根据分组查询文件
        :param uid: 用户id
        :param cid: 所有分组为 -1
        """
        cursor = self.db.cursor()
        if cid == -1:
            cursor.execute(f'''
                SELECT {col_user}, {col_id}, {col_filename}, {col_class_id}, {col_uuid}
                FROM {tbl_name} 
                WHERE {col_user} = {uid}
            ''')
        else:
            cursor.execute(f'''
                SELECT {col_user}, {col_id}, {col_filename}, {col_class_id}, {col_uuid}
                FROM {tbl_name} 
                WHERE {col_user} = {uid} AND {col_class_id} = {cid}
            ''')

        returns = []
        results = cursor.fetchall()
        for result in results:
            # noinspection PyBroadException
            try:
                docClass = DocClassDao().queryDocClassByIdOrName(
                    uid, result[3])
                if docClass is None:
                    docClass = DocClassDao().queryDefaultDocClass(uid)
                returns.append(
                    Document(did=result[1],
                             filename=result[2],
                             docClass=docClass,
                             uuid=result[4]))
            except:
                pass
        cursor.close()
        return returns
Exemplo n.º 10
0
    def NewShareCodeRoute():
        """ !!!! 新建共享码 addShareCode """
        try:
            req_Ex = int(request.form['ex'])
        except KeyError:
            req_Ex = Config.SHARE_TOKEN_EX
        except ValueError:
            raise ParamError(ParamType.FORM)

        cid = request.args.get('cid')
        if cid:  # 将整个集合共享 /share?cid
            try:
                cid = int(cid)
            except ValueError:
                raise ParamError(ParamType.FORM)
            documents = DocumentDao().queryDocumentsByClassId(g.user, int(cid))
            ids: List[int] = [did.id for did in documents]
        else:  # 文档集合分享 /share
            try:
                req_didList = request.form.getlist('did')
                if len(req_didList) == 0:
                    raise ParamError(ParamType.FORM)
                ids: List[int] = [int(did) for did in req_didList]
            except:
                raise ParamError(ParamType.FORM)
        # ids
        sc, docs = ShareCodeDao().addShareCode(uid=g.user, dids=ids, ex=req_Ex)
        if len(docs) == 0:
            return Result.error(ResultCode.SHARE_DOCUMENT_NULL).setMessage('Share Documents Null').json_ret()
        if sc == '':
            return Result.error(ResultCode.DATABASE_FAILED).setMessage('Document Share Code Generate Failed').json_ret()
        else:
            data = {
                'sc': sc,
                'documents': Document.to_jsons(docs)
            }
            return Result.ok().setData(data).json_ret()
Exemplo n.º 11
0
 def queryDocumentById(self, uid: int, did: int) -> Optional[Document]:
     """
     根据 id 查询文件
     """
     cursor = self.db.cursor()
     cursor.execute(f'''
         SELECT {col_user}, {col_id}, {col_filename}, {col_class_id}, {col_uuid}
         FROM {tbl_name}
         WHERE {col_user} = {uid} AND {col_id} = {did}
     ''')
     result = cursor.fetchone()
     # noinspection PyBroadException
     try:
         docClass = DocClassDao().queryDocClassByIdOrName(uid, result[3])
         if docClass is None:
             docClass = DocClassDao().queryDefaultDocClass(uid)
         return Document(did=result[1],
                         filename=result[2],
                         docClass=docClass,
                         uuid=result[4])
     except:
         return None
     finally:
         cursor.close()
Exemplo n.º 12
0
    def updateDocument(self, uid: int,
                       document: Document) -> (DbStatusType, Document):
        """
        更新文档 (filename, docClass) SUCCESS | NOT_FOUND | FAILED
        """
        sameIdDoc = self.queryDocumentById(uid, document.id)
        if not sameIdDoc:
            return DbStatusType.NOT_FOUND, None

        if not DocClassDao().queryDocClassByIdOrName(
                uid=uid, cid_name=document.docClass.id):  # 分组不存在
            document.docClass = DocClassDao().queryDefaultDocClass(uid=uid)

        # 沒更新
        if sameIdDoc.filename == document.filename and sameIdDoc.docClass.id == document.docClass.id:
            return DbStatusType.SUCCESS, sameIdDoc

        cursor = self.db.cursor()
        # noinspection PyBroadException
        try:
            cursor.execute(f'''
                UPDATE {tbl_name} 
                SET {col_class_id} = {document.docClass.id}, {col_filename} = '{document.filename}'
                WHERE {col_user} = {uid} AND {col_id} = {document.id}
            ''')
            if cursor.rowcount == 0:
                self.db.rollback()
                return DbStatusType.FAILED, None
            return DbStatusType.SUCCESS, self.queryDocumentById(
                uid, document.id)
        except:
            self.db.rollback()
            return DbStatusType.FAILED, None
        finally:
            self.db.commit()
            cursor.close()