From 974f90eb2a7e225aded50ae3ff15289e5c68b3f7 Mon Sep 17 00:00:00 2001 From: baifang Date: Sun, 30 Mar 2025 10:58:27 +0900 Subject: [PATCH 01/10] bugfix uploadfile&app update_time --- .gitignore | 1 + backend/app/api/api_v1/routers/kintone.py | 12 ++++++++++++ backend/app/core/operation.py | 12 ++++++++---- backend/app/db/cruddb/dbapp.py | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 8a8b253..de8d400 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ backend/pyvenv.cfg backend/Include/ backend/Scripts/ +log/api.log diff --git a/backend/app/api/api_v1/routers/kintone.py b/backend/app/api/api_v1/routers/kintone.py index 5f91e21..e1c3ecc 100644 --- a/backend/app/api/api_v1/routers/kintone.py +++ b/backend/app/api/api_v1/routers/kintone.py @@ -3,6 +3,7 @@ from io import BytesIO import typing as t import pandas as pd import json +import base64 import httpx import deepdiff import app.core.config as config @@ -493,6 +494,17 @@ async def test(file:UploadFile= File(...),app:str=None): return test +@r.get("/group") +async def group(request:Request,kintoneurl:str,kintoneuser:str,kintonepwd:str): + try: + auth_value = base64.b64encode(bytes(f"{kintoneuser}:{kintonepwd}","utf-8")) + headers={config.API_V1_AUTH_KEY:auth_value} + url = f"{kintoneurl}/v1/user/groups.json?code={kintoneuser}" + r = httpx.get(url,headers=headers) + return r.json() + except Exception as e: + raise APIException('kintone:app',request.url._url, f"Error occurred while get app({env.DOMAIN_NAME}->{app}):",e) + @r.post("/download",) async def download(request:Request,key,c:config.KINTONE_ENV=Depends(getkintoneenv)): try: diff --git a/backend/app/core/operation.py b/backend/app/core/operation.py index 36eab3a..9bdfe87 100644 --- a/backend/app/core/operation.py +++ b/backend/app/core/operation.py @@ -13,10 +13,14 @@ import json class LoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): if request.method in ("POST", "PUT", "PATCH","DELETE"): - try: - request.state.body = await request.json() - except json.JSONDecodeError: - request.state.body = await request.body() + content_type = request.headers.get('content-type', '') + if content_type.startswith('multipart/form-data'): + request.state.body = None + else: + try: + request.state.body = await request.json() + except json.JSONDecodeError: + request.state.body = await request.body() else: request.state.body = None diff --git a/backend/app/db/cruddb/dbapp.py b/backend/app/db/cruddb/dbapp.py index d741886..023d36d 100644 --- a/backend/app/db/cruddb/dbapp.py +++ b/backend/app/db/cruddb/dbapp.py @@ -1,6 +1,7 @@ from datetime import datetime from fastapi import HTTPException, status from sqlalchemy.orm import Session +from sqlalchemy.orm.attributes import flag_modified from sqlalchemy import select,and_ import typing as t @@ -202,6 +203,7 @@ class dbapp(crudbase): db_app = self.get_app(db, domainurl, flow.appid) if db_app and db_app.version > 0: db_app.is_saved = True + flag_modified(db_app, 'is_saved') db.add(db_app) db.commit() db.refresh(db_flow) From 179d6e11060f919bd0bef1804de6227528cc40e0 Mon Sep 17 00:00:00 2001 From: baifang Date: Sun, 30 Mar 2025 12:23:12 +0900 Subject: [PATCH 02/10] add get defaultgroup --- backend/app/api/api_v1/routers/kintone.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/app/api/api_v1/routers/kintone.py b/backend/app/api/api_v1/routers/kintone.py index e1c3ecc..b56f2c5 100644 --- a/backend/app/api/api_v1/routers/kintone.py +++ b/backend/app/api/api_v1/routers/kintone.py @@ -503,7 +503,7 @@ async def group(request:Request,kintoneurl:str,kintoneuser:str,kintonepwd:str): r = httpx.get(url,headers=headers) return r.json() except Exception as e: - raise APIException('kintone:app',request.url._url, f"Error occurred while get app({env.DOMAIN_NAME}->{app}):",e) + raise APIException('kintone:group',request.url._url, f"Error occurred while get group(url:{kintoneurl} user:{kintoneuser}):",e) @r.post("/download",) async def download(request:Request,key,c:config.KINTONE_ENV=Depends(getkintoneenv)): @@ -514,7 +514,7 @@ async def download(request:Request,key,c:config.KINTONE_ENV=Depends(getkintoneen r = httpx.get(url,headers=headers,params=params) return r.json() except Exception as e: - raise APIException('kintone:upload',request.url._url,f"Error occurred while download file.json:",e) + raise APIException('kintone:download',request.url._url,f"Error occurred while download file.json:",e) @r.post("/upload") async def upload(request:Request,files:t.List[UploadFile] = File(...)): @@ -637,7 +637,17 @@ async def createapp(request:Request,name:str,env:config.KINTONE_ENV=Depends(getk except Exception as e: raise APIException('kintone:createapp',request.url._url, f"Error occurred while create app({env.DOMAIN_NAME}->{name}):",e) - +@r.get("/defaultgroup") +async def currentgroup(request:Request,env:config.KINTONE_ENV=Depends(getkintoneenv)): + try: + auth_value = env.API_V1_AUTH_VALUE + headers={config.API_V1_AUTH_KEY:auth_value} + url = f"{env.BASE_URL}/v1/user/groups.json?code={env.KINTONE_USER}" + r = httpx.get(url,headers=headers) + return r.json() + except Exception as e: + raise APIException('kintone:currentgroup',request.url._url, f"Error occurred while get default domain group(domain:{env.DOMAIN_NAME} url:{env.BASE_URL} user:{env.KINTONE_USER}):",e) + @r.post("/createappfromexcel",) async def createappfromexcel(request:Request,files:t.List[UploadFile] = File(...),format:int = 0,env = Depends(getkintoneenv),db = Depends(get_db)): try: From 058d4026437178d3fc36634b4a5ee1e738abc206 Mon Sep 17 00:00:00 2001 From: xue jiahao Date: Sun, 30 Mar 2025 10:00:03 +0800 Subject: [PATCH 03/10] fix admin --- frontend/src/pages/FlowChart.vue | 32 +++++- frontend/src/pages/TenantDomain.vue | 149 ++++++++++++++++++++------ frontend/src/pages/UserManagement.vue | 10 +- 3 files changed, 153 insertions(+), 38 deletions(-) diff --git a/frontend/src/pages/FlowChart.vue b/frontend/src/pages/FlowChart.vue index 8064ac6..2ab73d0 100644 --- a/frontend/src/pages/FlowChart.vue +++ b/frontend/src/pages/FlowChart.vue @@ -232,8 +232,38 @@ const onDeploy = async () => { }); return; } + + deployLoading.value = true; + try { + const { data }: {data: {code: string, groups: {code: string}[]}} = await api.get('api/v1/defaultgroup'); + if (data.code === 'CB_WA01') { + $q.notify({ + type: 'negative', + caption: 'エラー', + message: 'ユーザーのパスワード認証に失敗しました。' + }); + deployLoading.value = false; + return; + } else if (!data.groups || !data.groups.some((group: {code: string}) => group.code === 'Administrators')){ + $q.notify({ + type: 'negative', + caption: 'エラー', + message: 'この操作には管理者権限が必要です。' + }); + deployLoading.value = false; + return; + } + } catch (e) { + $q.notify({ + type: 'negative', + caption: 'エラー', + message: 'サーバーに接続できませんでした。' + }); + deployLoading.value = false; + return; + } + try { - deployLoading.value = true; await store.deploy(); deployLoading.value = false; $q.notify({ diff --git a/frontend/src/pages/TenantDomain.vue b/frontend/src/pages/TenantDomain.vue index fb6228f..07317ae 100644 --- a/frontend/src/pages/TenantDomain.vue +++ b/frontend/src/pages/TenantDomain.vue @@ -53,21 +53,21 @@
Kintone Account
- +
- - + hint="Kintoneのパスワードを入力してください" label="パスワード" :disable="!isCreate" lazy-rules + :rules="[val => val && val.length > 0 || 'Kintoneのパスワードを入力してください']" autocomplete="new-password">