This commit is contained in:
2023-11-04 15:15:44 +09:00
8 changed files with 141 additions and 136 deletions

View File

@@ -29,11 +29,11 @@ async def login(
else: else:
permissions = "user" permissions = "user"
access_token = security.create_access_token( access_token = security.create_access_token(
data={"sub": user.email, "permissions": permissions}, data={"sub": user.id, "permissions": permissions},
expires_delta=access_token_expires, expires_delta=access_token_expires,
) )
return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name,"user_id" : user.id} return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}
@r.post("/signup") @r.post("/signup")
@@ -56,8 +56,8 @@ async def signup(
else: else:
permissions = "user" permissions = "user"
access_token = security.create_access_token( access_token = security.create_access_token(
data={"sub": user.email, "permissions": permissions}, data={"sub": user.id, "permissions": permissions},
expires_delta=access_token_expires, expires_delta=access_token_expires,
) )
return {"access_token": access_token, "token_type": "bearer"} return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}

View File

@@ -5,21 +5,29 @@ import pandas as pd
import json import json
import httpx import httpx
import deepdiff import deepdiff
import app.core.config as c import app.core.config as config
import os import os
import sys
from app.db.session import SessionLocal from app.db.session import SessionLocal
from app.db.crud import get_flows_by_app from app.db.crud import get_flows,get_activedomain
from app.core.auth import get_current_active_user,get_current_user
kinton_router = r = APIRouter() kinton_router = r = APIRouter()
def getkintoneenv(user = Depends(get_current_user)):
db = SessionLocal()
domain = get_activedomain(db, user.id)
db.close()
kintoneevn = config.KINTONE_ENV(domain)
return kintoneevn
def getfieldsfromexcel(df): def getfieldsfromexcel(df):
appname = df.iloc[0,2] appname = df.iloc[0,2]
col=[] col=[]
for row in range(5,len(df)): for row in range(5,len(df)):
if pd.isna(df.iloc[row,1]): if pd.isna(df.iloc[row,1]):
break break
if not df.iloc[row,3] in c.KINTONE_FIELD_TYPE: if not df.iloc[row,3] in config.KINTONE_FIELD_TYPE:
continue continue
p=[] p=[]
for column in range(1,7): for column in range(1,7):
@@ -42,10 +50,10 @@ def getsettingfromexcel(df):
des = df.iloc[2,2] des = df.iloc[2,2]
return {"name":appname,"description":des} return {"name":appname,"description":des}
def getsettingfromkintone(app:str): def getsettingfromkintone(app:str,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"app":app} params = {"app":app}
url = f"{c.BASE_URL}{c.API_V1_STR}/app/settings.json" url = f"{c.BASE_URL}{config.API_V1_STR}/app/settings.json"
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@@ -57,24 +65,24 @@ def analysesettings(excel,kintone):
updatesettings[key] = excel[key] updatesettings[key] = excel[key]
return updatesettings return updatesettings
def createkintoneapp(name:str): def createkintoneapp(name:str,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
data = {"name":name} data = {"name":name}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json"
r = httpx.post(url,headers=headers,data=json.dumps(data)) r = httpx.post(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def updateappsettingstokintone(app:str,updates:dict): def updateappsettingstokintone(app:str,updates:dict,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/settings.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/settings.json"
data = {"app":app} data = {"app":app}
data.update(updates) data.update(updates)
r = httpx.put(url,headers=headers,data=json.dumps(data)) r = httpx.put(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def addfieldstokintone(app:str,fields:dict,revision:str = None): def addfieldstokintone(app:str,fields:dict,c:config.KINTONE_ENV,revision:str = None):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
if revision != None: if revision != None:
data = {"app":app,"revision":revision,"properties":fields} data = {"app":app,"revision":revision,"properties":fields}
else: else:
@@ -82,32 +90,32 @@ def addfieldstokintone(app:str,fields:dict,revision:str = None):
r = httpx.post(url,headers=headers,data=json.dumps(data)) r = httpx.post(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def updatefieldstokintone(app:str,revision:str,fields:dict): def updatefieldstokintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
data = {"app":app,"properties":fields} data = {"app":app,"properties":fields}
r = httpx.put(url,headers=headers,data=json.dumps(data)) r = httpx.put(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def deletefieldsfromkintone(app:str,revision:str,fields:dict): def deletefieldsfromkintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
params = {"app":app,"revision":revision,"fields":fields} params = {"app":app,"revision":revision,"fields":fields}
#r = httpx.delete(url,headers=headers,content=json.dumps(params)) #r = httpx.delete(url,headers=headers,content=json.dumps(params))
r = httpx.request(method="DELETE",url=url,headers=headers,content=json.dumps(params)) r = httpx.request(method="DELETE",url=url,headers=headers,content=json.dumps(params))
return r.json() return r.json()
def deoployappfromkintone(app:str,revision:str): def deoployappfromkintone(app:str,revision:str,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/deploy.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
data = {"apps":[{"app":app,"revision":revision}],"revert": False} data = {"apps":[{"app":app,"revision":revision}],"revert": False}
r = httpx.post(url,headers=headers,data=json.dumps(data)) r = httpx.post(url,headers=headers,data=json.dumps(data))
return r.json return r.json
def getfieldsfromkintone(app): def getfieldsfromkintone(app:str,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"app":app} params = {"app":app}
url = f"{c.BASE_URL}{c.API_V1_STR}/app/form/fields.json" url = f"{c.BASE_URL}{config.API_V1_STR}/app/form/fields.json"
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@@ -131,10 +139,10 @@ def analysefields(excel,kintone):
return {"update":updatefields,"add":addfields,"del":delfields} return {"update":updatefields,"add":addfields,"del":delfields}
def getprocessfromkintone(app:str): def getprocessfromkintone(app:str,c:config.KINTONE_ENV):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"app":app} params = {"app":app}
url = f"{c.BASE_URL}{c.API_V1_STR}/app/status.json" url = f"{c.BASE_URL}{config.API_V1_STR}/app/status.json"
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@@ -198,36 +206,36 @@ def analysprocess(excel,kintone):
# return True # return True
return diff return diff
def updateprocesstokintone(app:str,process:dict): def updateprocesstokintone(app:str,process:dict,c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/status.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/status.json"
data = {"app":app,"enable":True} data = {"app":app,"enable":True}
data.update(process) data.update(process)
r = httpx.put(url,headers=headers,data=json.dumps(data)) r = httpx.put(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def getkintoneusers(): def getkintoneusers(c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
url = f"{c.BASE_URL}/v1/users.json" url = f"{c.BASE_URL}/v1/users.json"
r = httpx.get(url,headers=headers) r = httpx.get(url,headers=headers)
return r.json() return r.json()
def getkintoneorgs(): def getkintoneorgs(c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"code":c.KINTONE_USER} params = {"code":c.KINTONE_USER}
url = f"{c.BASE_URL}/v1/user/organizations.json" url = f"{c.BASE_URL}/v1/user/organizations.json"
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
def uploadkintonefiles(file): def uploadkintonefiles(file,c:config.KINTONE_ENV=Depends(getkintoneenv)):
upload_files = {'file': open(file,'rb')} upload_files = {'file': open(file,'rb')}
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
data ={'name':'file','filename':os.path.basename(file)} data ={'name':'file','filename':os.path.basename(file)}
url = f"{c.BASE_URL}/k/v1/file.json" url = f"{c.BASE_URL}/k/v1/file.json"
r = httpx.post(url,headers=headers,data=data,files=upload_files) r = httpx.post(url,headers=headers,data=data,files=upload_files)
return r.json() return r.json()
def updateappjscss(app,uploads): def updateappjscss(app,uploads,c:config.KINTONE_ENV=Depends(getkintoneenv)):
dsjs = [] dsjs = []
dscss = [] dscss = []
for upload in uploads: for upload in uploads:
@@ -239,24 +247,26 @@ def updateappjscss(app,uploads):
ds ={'js':dsjs,'css':dscss} ds ={'js':dsjs,'css':dscss}
mb ={'js':[],'css':[]} mb ={'js':[],'css':[]}
data = {'app':app,'scope':'ALL','desktop':ds,'mobile':mb} data = {'app':app,'scope':'ALL','desktop':ds,'mobile':mb}
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/customize.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/customize.json"
print(data) print(data)
r = httpx.put(url,headers=headers,data=json.dumps(data)) r = httpx.put(url,headers=headers,data=json.dumps(data))
return r.json() return r.json()
def createappjs(app): def createappjs(app):
db = SessionLocal() db = SessionLocal()
flows = get_flows_by_app(db,app) flows = get_flows(db,app)
db.close() db.close()
content={} content={}
for flow in flows: for flow in flows:
content[flow.eventid] = {'flowid':flow.flowid,'name':flow.name,'content':flow.content} content[flow.eventid] = {'flowid':flow.flowid,'name':flow.name,'content':flow.content}
js = 'const alcflow=' + json.dumps(content) js = 'const flow=' + json.dumps(content)
fpath = os.path.join("Temp",f"alc_setting_{app}.js") fpath = '{}\\alc_setting_{}.js'.format('Temp',app)
with open(fpath,'w') as file: file = open(fpath,'w',encoding="utf-8")
file.write(js) file.write(js)
return fpath file.close()
return fpath
@r.post("/test",) @r.post("/test",)
async def test(file:UploadFile= File(...),app:str=None): async def test(file:UploadFile= File(...),app:str=None):
@@ -283,14 +293,14 @@ async def test(file:UploadFile= File(...),app:str=None):
@r.post("/download",) @r.post("/download",)
async def download(key): async def download(key,c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"fileKey":key} params = {"fileKey":key}
url = f"{c.BASE_URL}/k/v1/file.json" url = f"{c.BASE_URL}/k/v1/file.json"
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@r.post("/upload",) @r.post("/upload")
async def upload(files:t.List[UploadFile] = File(...)): async def upload(files:t.List[UploadFile] = File(...)):
dataframes = [] dataframes = []
for file in files: for file in files:
@@ -308,7 +318,7 @@ async def upload(files:t.List[UploadFile] = File(...)):
return {"files": [file.filename for file in files]} return {"files": [file.filename for file in files]}
@r.post("/updatejscss") @r.post("/updatejscss")
async def jscss(app:str,files:t.List[UploadFile] = File(...)): async def jscss(app:str,files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)):
try: try:
jscs=[] jscs=[]
for file in files: for file in files:
@@ -323,56 +333,44 @@ async def jscss(app:str,files:t.List[UploadFile] = File(...)):
jscs.append({ file.filename:upload['fileKey']}) jscs.append({ file.filename:upload['fileKey']})
appjscs = updateappjscss(app,jscs) appjscs = updateappjscss(app,jscs)
if appjscs.get("revision") != None: if appjscs.get("revision") != None:
deoployappfromkintone(app,appjscs["revision"]) deoployappfromkintone(app,appjscs["revision"],env)
return appjscs return appjscs
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=f"Error occurred while update file {file.filename}: {str(e)}") raise HTTPException(status_code=400, detail=f"Error occurred while update file {file.filename}: {str(e)}")
@r.get("/allapps",) @r.get("/allapps")
async def allapps(): async def allapps(c:config.KINTONE_ENV=Depends(getkintoneenv)):
try: headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} url = f"{c.BASE_URL}{config.API_V1_STR}/apps.json"
url = f"{c.BASE_URL}{c.API_V1_STR}/apps.json" r = httpx.get(url,headers=headers)
r = httpx.get(url,headers=headers,timeout=httpx.Timeout(10))
return r.json()
except Exception as e:
print(f"異常発生しました。{type(e).__name__},{e}")
@r.get("/app")
async def app(app:str):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
url = f"{c.BASE_URL}{c.API_V1_STR}/app.json"
params ={"id":app}
r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@r.get("/appfields") @r.get("/appfields")
async def appfields(app:str): async def appfields(app:str,env = Depends(getkintoneenv)):
return getfieldsfromkintone(app) return getfieldsfromkintone(app,env)
@r.get("/appprocess") @r.get("/appprocess")
async def appprocess(app:str): async def appprocess(app:str,env = Depends(getkintoneenv)):
return getprocessfromkintone(app) return getprocessfromkintone(app,env)
@r.get("/alljscss") @r.get("/alljscss")
async def alljscs(app:str): async def alljscs(app:str,c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
url = f"{c.BASE_URL}{c.API_V1_STR}/app/customize.json" url = f"{c.BASE_URL}{config.API_V1_STR}/app/customize.json"
params = {"app":app} params = {"app":app}
r = httpx.get(url,headers=headers,params=params) r = httpx.get(url,headers=headers,params=params)
return r.json() return r.json()
@r.post("/createapp",) @r.post("/createapp",)
async def createapp(name:str): async def createapp(name:str,c:config.KINTONE_ENV=Depends(getkintoneenv)):
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
data = {"name":name} data = {"name":name}
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json"
r = httpx.post(url,headers=headers,data=json.dumps(data)) r = httpx.post(url,headers=headers,data=json.dumps(data))
result = r.json() result = r.json()
if result.get("app") != None: if result.get("app") != None:
url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/deploy.json" url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
data = {"apps":[result],"revert": False} data = {"apps":[result],"revert": False}
r = httpx.post(url,headers=headers,data=json.dumps(data)) r = httpx.post(url,headers=headers,data=json.dumps(data))
return r.json return r.json
@@ -380,7 +378,7 @@ async def createapp(name:str):
property=["label","code","type","required","defaultValue","options"] property=["label","code","type","required","defaultValue","options"]
@r.post("/createappfromexcel",) @r.post("/createappfromexcel",)
async def createappfromexcel(files:t.List[UploadFile] = File(...)): async def createappfromexcel(files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)):
for file in files: for file in files:
if file.filename.endswith('.xlsx'): if file.filename.endswith('.xlsx'):
try: try:
@@ -394,18 +392,18 @@ async def createappfromexcel(files:t.List[UploadFile] = File(...)):
users = getkintoneusers() users = getkintoneusers()
orgs = getkintoneorgs() orgs = getkintoneorgs()
processes = getprocessfromexcel(df,users["users"], orgs["organizationTitles"]) processes = getprocessfromexcel(df,users["users"], orgs["organizationTitles"])
app = createkintoneapp(appname) app = createkintoneapp(appname,env)
if app.get("app") != None: if app.get("app") != None:
result["app"] = app["app"] result["app"] = app["app"]
app = updateappsettingstokintone(result["app"],{"description":desc}) app = updateappsettingstokintone(result["app"],{"description":desc},env)
if app.get("revision") != None: if app.get("revision") != None:
result["revision"] = app["revision"] result["revision"] = app["revision"]
app = addfieldstokintone(result["app"],fields) app = addfieldstokintone(result["app"],env,fields)
if len(processes)> 0: if len(processes)> 0:
app = updateprocesstokintone(result["app"],processes) app = updateprocesstokintone(result["app"],processes)
if app.get("revision") != None: if app.get("revision") != None:
result["revision"] = app["revision"] result["revision"] = app["revision"]
deoployappfromkintone(result["app"],result["revision"]) deoployappfromkintone(result["app"],result["revision"],env)
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}") raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}")
else: else:
@@ -414,42 +412,42 @@ async def createappfromexcel(files:t.List[UploadFile] = File(...)):
return result return result
@r.post("/updateappfromexcel",) @r.post("/updateappfromexcel")
async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)): async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)):
for file in files: for file in files:
if file.filename.endswith('.xlsx'): if file.filename.endswith('.xlsx'):
try: try:
content = await file.read() content = await file.read()
df = pd.read_excel(BytesIO(content)) df = pd.read_excel(BytesIO(content))
excel = getsettingfromexcel(df) excel = getsettingfromexcel(df)
kintone= getsettingfromkintone(app) kintone= getsettingfromkintone(app,env)
settings = analysesettings(excel,kintone) settings = analysesettings(excel,kintone)
excel = getfieldsfromexcel(df) excel = getfieldsfromexcel(df)
kintone = getfieldsfromkintone(app) kintone = getfieldsfromkintone(app,env)
users = getkintoneusers() users = getkintoneusers()
orgs = getkintoneorgs() orgs = getkintoneorgs()
exp = getprocessfromexcel(df,users["users"], orgs["organizationTitles"]) exp = getprocessfromexcel(df,users["users"], orgs["organizationTitles"])
#exp = getprocessfromexcel(df) #exp = getprocessfromexcel(df)
kinp = getprocessfromkintone(app) kinp = getprocessfromkintone(app,env)
process = analysprocess(exp,kinp) process = analysprocess(exp,kinp)
revision = kintone["revision"] revision = kintone["revision"]
fields = analysefields(excel,kintone["properties"]) fields = analysefields(excel,kintone["properties"])
result = {"app":app,"revision":revision,"msg":"No Update"} result = {"app":app,"revision":revision,"msg":"No Update"}
deploy = False deploy = False
if len(fields["update"]) > 0: if len(fields["update"]) > 0:
result = updatefieldstokintone(app,revision,fields["update"]) result = updatefieldstokintone(app,revision,fields["update"],env)
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if len(fields["add"]) > 0: if len(fields["add"]) > 0:
result = addfieldstokintone(app,fields["add"],revision) result = addfieldstokintone(app,fields["add"],env,revision)
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if len(fields["del"]) > 0: if len(fields["del"]) > 0:
result = deletefieldsfromkintone(app,revision,fields["del"]) result = deletefieldsfromkintone(app,revision,fields["del"],env)
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if len(settings) > 0: if len(settings) > 0:
result = updateappsettingstokintone(app,settings) result = updateappsettingstokintone(app,settings,env)
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if len(process)>0: if len(process)>0:
@@ -457,7 +455,7 @@ async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)):
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if deploy: if deploy:
result = deoployappfromkintone(app,revision) result = deoployappfromkintone(app,revision,env)
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}") raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}")
else: else:
@@ -466,11 +464,11 @@ async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)):
return result return result
@r.post("/updateprocessfromexcel",) @r.post("/updateprocessfromexcel",)
async def updateprocessfromexcel(app:str): async def updateprocessfromexcel(app:str,env = Depends(getkintoneenv)):
try: try:
excel = getprocessfromexcel() excel = getprocessfromexcel()
kintone = getprocessfromkintone(app) kintone = getprocessfromkintone(app,env)
revision = kintone["revision"] revision = kintone["revision"]
#fields = analysefields(excel,kintone["properties"]) #fields = analysefields(excel,kintone["properties"])
result = {"app":app,"revision":revision,"msg":"No Update"} result = {"app":app,"revision":revision,"msg":"No Update"}
@@ -495,7 +493,7 @@ async def updateprocessfromexcel(app:str):
revision = result["revision"] revision = result["revision"]
deploy = True deploy = True
if deploy: if deploy:
result = deoployappfromkintone(app,revision) result = deoployappfromkintone(app,revision,env)
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}") raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}")
@@ -503,22 +501,20 @@ async def updateprocessfromexcel(app:str):
@r.post("/createjstokintone",) @r.post("/createjstokintone",)
async def createjstokintone(app:str): async def createjstokintone(app:str,env = Depends(getkintoneenv)):
try: try:
jscs=[] jscs=[]
files=[] files=[]
files.append(createappjs(app)) files.append(createappjs(app))
base_dir = os.path.abspath('Temp') files.append('Temp\\alc_runtime.js')
runtimeJs = os.path.join(base_dir, 'alc_runtime.js')
files.append(runtimeJs)
for file in files: for file in files:
upload = uploadkintonefiles(file) upload = uploadkintonefiles(file)
if upload.get('fileKey') != None: if upload.get('fileKey') != None:
jscs.append({ app + '.js':upload['fileKey']}) jscs.append({ app + '.js':upload['fileKey']})
appjscs = updateappjscss(app,jscs) appjscs = updateappjscss(app,jscs)
if appjscs.get("revision") != None: if appjscs.get("revision") != None:
deoployappfromkintone(app,appjscs["revision"]) deoployappfromkintone(app,appjscs["revision"],env)
return appjscs return appjscs
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}") raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}")

View File

@@ -4,6 +4,7 @@ from app.db.session import get_db
from app.db.crud import * from app.db.crud import *
from app.db.schemas import * from app.db.schemas import *
from typing import List from typing import List
from app.core.auth import get_current_active_user,get_current_user
platform_router = r = APIRouter() platform_router = r = APIRouter()
@@ -184,16 +185,16 @@ async def domain_delete(
return delete_domain(db,id) return delete_domain(db,id)
@r.get( @r.get(
"/domain/{userid}", "/domain",
response_model=List[Domain], response_model=List[Domain],
response_model_exclude_none=True, response_model_exclude_none=True,
) )
async def userdomain_details( async def userdomain_details(
request: Request, request: Request,
userid: str, user=Depends(get_current_user),
db=Depends(get_db), db=Depends(get_db),
): ):
domains = get_domain(db, userid) domains = get_domain(db, user.id)
return domains return domains
@r.post( @r.post(
@@ -222,29 +223,30 @@ async def userdomain_delete(
@r.get( @r.get(
"/activedomain/{userid}", "/activedomain",
response_model=Domain, response_model=Domain,
response_model_exclude_none=True, response_model_exclude_none=True,
) )
async def get_useractivedomain( async def get_useractivedomain(
request: Request, request: Request,
userid: int, user=Depends(get_current_user),
db=Depends(get_db), db=Depends(get_db),
): ):
domain = get_activedomain(db, userid) domain = get_activedomain(db, user.id)
return domain return domain
@r.put( @r.put(
"/activedomain/{userid}/{domainid}", "/activedomain/{domainid}",
response_model_exclude_none=True, response_model_exclude_none=True,
) )
async def update_activeuserdomain( async def update_activeuserdomain(
request: Request, request: Request,
userid: int, userid: int,
domainid:int, domainid:int,
user=Depends(get_current_user),
db=Depends(get_db), db=Depends(get_db),
): ):
domain = active_userdomain(db, userid,domainid) domain = active_userdomain(db, user.id,domainid)
return domain return domain

View File

@@ -3,7 +3,7 @@ from fastapi import Depends, HTTPException, status
from jwt import PyJWTError from jwt import PyJWTError
from app.db import models, schemas, session from app.db import models, schemas, session
from app.db.crud import get_user_by_email, create_user from app.db.crud import get_user_by_email, create_user,get_user
from app.core import security from app.core import security
@@ -19,14 +19,14 @@ async def get_current_user(
payload = jwt.decode( payload = jwt.decode(
token, security.SECRET_KEY, algorithms=[security.ALGORITHM] token, security.SECRET_KEY, algorithms=[security.ALGORITHM]
) )
email: str = payload.get("sub") id: int = payload.get("sub")
if email is None: if id is None:
raise credentials_exception raise credentials_exception
permissions: str = payload.get("permissions") permissions: str = payload.get("permissions")
token_data = schemas.TokenData(email=email, permissions=permissions) token_data = schemas.TokenData(id = id, permissions=permissions)
except PyJWTError: except PyJWTError:
raise credentials_exception raise credentials_exception
user = get_user_by_email(db, token_data.email) user = get_user(db, token_data.id)
if user is None: if user is None:
raise credentials_exception raise credentials_exception
return user return user

View File

@@ -1,19 +1,26 @@
import os import os
import base64
PROJECT_NAME = "KintoneAppBuilder" PROJECT_NAME = "KintoneAppBuilder"
# SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" # SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres"
SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres"
BASE_URL = "https://mfu07rkgnb7c.cybozu.com"
API_V1_STR = "/k/v1" API_V1_STR = "/k/v1"
API_V1_AUTH_KEY = "X-Cybozu-Authorization" API_V1_AUTH_KEY = "X-Cybozu-Authorization"
API_V1_AUTH_VALUE = "TVhaOm1heHoxMjA1"
KINTONE_USER = "MXZ"
KINTONE_FIELD_TYPE=["GROUP","GROUP_SELECT","CHECK_BOX","SUBTABLE","DROP_DOWN","USER_SELECT","RADIO_BUTTON","RICH_TEXT","LINK","REFERENCE_TABLE","CALC","TIME","NUMBER","ORGANIZATION_SELECT","FILE","DATETIME","DATE","MULTI_SELECT","SINGLE_LINE_TEXT","MULTI_LINE_TEXT"] KINTONE_FIELD_TYPE=["GROUP","GROUP_SELECT","CHECK_BOX","SUBTABLE","DROP_DOWN","USER_SELECT","RADIO_BUTTON","RICH_TEXT","LINK","REFERENCE_TABLE","CALC","TIME","NUMBER","ORGANIZATION_SELECT","FILE","DATETIME","DATE","MULTI_SELECT","SINGLE_LINE_TEXT","MULTI_LINE_TEXT"]
class KINTONE_ENV:
BASE_URL = ""
API_V1_AUTH_VALUE = ""
KINTONE_USER = ""
def __init__(self,domain) -> None:
self.BASE_URL = domain.url
self.KINTONE_USER = domain.kintoneuser
self.API_V1_AUTH_VALUE = base64.b64encode(bytes(f"{domain.kintoneuser}:{domain.kintonepwd}","utf-8"))

View File

@@ -46,6 +46,7 @@ class Token(BaseModel):
class TokenData(BaseModel): class TokenData(BaseModel):
id:int = 0
email: str = None email: str = None
permissions: str = "user" permissions: str = "user"

View File

@@ -223,7 +223,7 @@ const newDomain = () => {
const activeDomain = (id:number) => { const activeDomain = (id:number) => {
api.put(`http://127.0.0.1:8000/api/activedomain/1/`+ id).then(() =>{ api.put(`http://127.0.0.1:8000/api/activedomain/`+ id).then(() =>{
getDomain(); getDomain();
}) })
}; };
@@ -248,16 +248,16 @@ const closeDg = (val:string) => {
{ {
dodmainids.push(domains[key].id); dodmainids.push(domains[key].id);
} }
api.post(`http://127.0.0.1:8000/api/domain/1`, dodmainids).then(() =>{getDomain();}); api.post(`http://127.0.0.1:8000/api/domain`, dodmainids).then(() =>{getDomain();});
} }
}; };
const getDomain = () => { const getDomain = () => {
api.get(`http://127.0.0.1:8000/api/activedomain/1`).then(res => { api.get(`http://127.0.0.1:8000/api/activedomain`).then(res => {
activedomainid.value = res.data.id; activedomainid.value = res.data.id;
authStore.changedomain(res.data.name); authStore.changedomain(res.data.name);
}); });
api.get(`http://127.0.0.1:8000/api/domain/1`).then(res => { api.get(`http://127.0.0.1:8000/api/domain`).then(res => {
rows.length = 0; rows.length = 0;
res.data.forEach((item) => { res.data.forEach((item) => {
rows.push({ id:item.id,name: item.name, url: item.url, kintoneuser: item.kintoneuser, kintonepwd: item.kintonepwd}); rows.push({ id:item.id,name: item.name, url: item.url, kintoneuser: item.kintoneuser, kintonepwd: item.kintonepwd});

View File

@@ -7,7 +7,6 @@ export const useAuthStore = defineStore({
id: 'auth', id: 'auth',
state: () => ({ state: () => ({
token: localStorage.getItem('token'), token: localStorage.getItem('token'),
id:localStorage.getItem('id'),
name:localStorage.getItem('name'), name:localStorage.getItem('name'),
domain:localStorage.getItem('domain'), domain:localStorage.getItem('domain'),
returnUrl: '' returnUrl: ''
@@ -21,12 +20,12 @@ export const useAuthStore = defineStore({
const result = await api.post(`http://127.0.0.1:8000/api/token`,params); const result = await api.post(`http://127.0.0.1:8000/api/token`,params);
console.info(result); console.info(result);
this.token =result.data.access_token; this.token =result.data.access_token;
this.id = result.data.user_id;
this.name = result.data.user_name; this.name = result.data.user_name;
localStorage.setItem('token', result.data.access_token); localStorage.setItem('token', result.data.access_token);
localStorage.setItem('id', result.data.user_id); localStorage.setItem('id', result.data.user_id);
localStorage.setItem('name', result.data.user_name); localStorage.setItem('name', result.data.user_name);
const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain/`+this.id); const config = {headers:{Authorization : 'Bearer ' + this.token}};
const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain`,config);
this.domain = activedomain.data.name; this.domain = activedomain.data.name;
localStorage.setItem('domain', activedomain.data.name); localStorage.setItem('domain', activedomain.data.name);
Router.push(this.returnUrl || '/'); Router.push(this.returnUrl || '/');