|
|
|
|
@@ -156,10 +156,10 @@ def getsettingfromexcel(df):
|
|
|
|
|
des = df.iloc[2,2]
|
|
|
|
|
return {"name":appname,"description":des}
|
|
|
|
|
|
|
|
|
|
def getsettingfromkintone(app:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
def getsettingfromkintone(app:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/app/settings.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/app/settings.json"
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
@@ -171,24 +171,24 @@ def analysesettings(excel,kintone):
|
|
|
|
|
updatesettings[key] = excel[key]
|
|
|
|
|
return updatesettings
|
|
|
|
|
|
|
|
|
|
def createkintoneapp(name:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
def createkintoneapp(name:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
data = {"name":name}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app.json"
|
|
|
|
|
r = httpx.post(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def updateappsettingstokintone(app:str,updates:dict,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/settings.json"
|
|
|
|
|
def updateappsettingstokintone(app:str,updates:dict,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/settings.json"
|
|
|
|
|
data = {"app":app}
|
|
|
|
|
data.update(updates)
|
|
|
|
|
r = httpx.put(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def addfieldstokintone(app:str,fields:dict,c:config.KINTONE_ENV,revision:str = None):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
def addfieldstokintone(app:str,fields:dict,env:config.KINTONE_ENV,revision:str = None):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
if revision != None:
|
|
|
|
|
data = {"app":app,"revision":revision,"properties":fields}
|
|
|
|
|
else:
|
|
|
|
|
@@ -197,43 +197,43 @@ def addfieldstokintone(app:str,fields:dict,c:config.KINTONE_ENV,revision:str = N
|
|
|
|
|
r.raise_for_status()
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def updatefieldstokintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
def updatefieldstokintone(app:str,revision:str,fields:dict,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
data = {"app":app,"properties":fields}
|
|
|
|
|
r = httpx.put(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def deletefieldsfromkintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
def deletefieldsfromkintone(app:str,revision:str,fields:dict,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json"
|
|
|
|
|
params = {"app":app,"revision":revision,"fields":fields}
|
|
|
|
|
#r = httpx.delete(url,headers=headers,content=json.dumps(params))
|
|
|
|
|
r = httpx.request(method="DELETE",url=url,headers=headers,content=json.dumps(params))
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def deoployappfromkintone(app:str,revision:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
|
|
|
|
|
def deoployappfromkintone(app:str,revision:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
|
|
|
|
|
data = {"apps":[{"app":app,"revision":revision}],"revert": False}
|
|
|
|
|
r = httpx.post(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json
|
|
|
|
|
|
|
|
|
|
# 既定項目に含めるアプリのフィールドのみ取得する
|
|
|
|
|
# スペース、枠線、ラベルを含まない
|
|
|
|
|
def getfieldsfromkintone(app:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
def getfieldsfromkintone(app:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/app/form/fields.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/app/form/fields.json"
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
# フォームに配置するフィールドのみ取得する
|
|
|
|
|
# スペース、枠線、ラベルも含める
|
|
|
|
|
def getformfromkintone(app:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
def getformfromkintone(app:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/form.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/form.json"
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
@@ -286,10 +286,10 @@ def analysefields(excel,kintone):
|
|
|
|
|
|
|
|
|
|
return {"update":updatefields,"add":addfields,"del":delfields}
|
|
|
|
|
|
|
|
|
|
def getprocessfromkintone(app:str,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
def getprocessfromkintone(app:str,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/app/status.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/app/status.json"
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
@@ -374,24 +374,24 @@ def getkintoneorgs(c:config.KINTONE_ENV):
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def uploadkintonefiles(file,c:config.KINTONE_ENV):
|
|
|
|
|
def uploadkintonefiles(file,env:config.KINTONE_ENV):
|
|
|
|
|
if (file.endswith('alc_runtime.js') and config.DEPLOY_MODE == "DEV"):
|
|
|
|
|
return {'fileKey':file}
|
|
|
|
|
upload_files = {'file': open(file,'rb')}
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
data ={'name':'file','filename':os.path.basename(file)}
|
|
|
|
|
url = f"{c.BASE_URL}/k/v1/file.json"
|
|
|
|
|
url = f"{env.BASE_URL}/k/v1/file.json"
|
|
|
|
|
r = httpx.post(url,headers=headers,data=data,files=upload_files)
|
|
|
|
|
#{"name":data['filename'],'fileKey':r['fileKey']}
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
def updateappjscss(app,uploads,c:config.KINTONE_ENV):
|
|
|
|
|
def updateappjscss(app,uploads,env:config.KINTONE_ENV):
|
|
|
|
|
dsjs = []
|
|
|
|
|
dscss = []
|
|
|
|
|
#mobile側
|
|
|
|
|
mbjs = []
|
|
|
|
|
mbcss = []
|
|
|
|
|
customize = getappcustomize(app, c)
|
|
|
|
|
customize = getappcustomize(app, env)
|
|
|
|
|
current_js = customize['desktop'].get('js', [])
|
|
|
|
|
current_css = customize['desktop'].get('css', [])
|
|
|
|
|
current_mobile_js = customize['mobile'].get('js', [])
|
|
|
|
|
@@ -430,16 +430,16 @@ def updateappjscss(app,uploads,c:config.KINTONE_ENV):
|
|
|
|
|
ds ={'js':dsjs,'css':dscss}
|
|
|
|
|
mb ={'js':mbjs,'css':mbcss}
|
|
|
|
|
data = {'app':app,'scope':'ALL','desktop':ds,'mobile':mb,'revision':customize["revision"]}
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/customize.json"
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/customize.json"
|
|
|
|
|
print(json.dumps(data))
|
|
|
|
|
r = httpx.put(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json()
|
|
|
|
|
|
|
|
|
|
#kintone カスタマイズ情報
|
|
|
|
|
def getappcustomize(app,c:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/customize.json"
|
|
|
|
|
def getappcustomize(app,env:config.KINTONE_ENV):
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/customize.json"
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
@@ -451,9 +451,9 @@ def getTempPath(filename):
|
|
|
|
|
fpath = os.path.join(rootdir,"Temp",filename)
|
|
|
|
|
return fpath
|
|
|
|
|
|
|
|
|
|
def createappjs(domainid,app):
|
|
|
|
|
def createappjs(domain_url,app):
|
|
|
|
|
db = SessionLocal()
|
|
|
|
|
flows = get_flows_by_app(db,domainid,app)
|
|
|
|
|
flows = get_flows_by_app(db,domain_url,app)
|
|
|
|
|
db.close()
|
|
|
|
|
content={}
|
|
|
|
|
for flow in flows:
|
|
|
|
|
@@ -521,7 +521,7 @@ async def upload(request:Request,files:t.List[UploadFile] = File(...)):
|
|
|
|
|
return {"files": [file.filename for file in files]}
|
|
|
|
|
|
|
|
|
|
@r.post("/updatejscss")
|
|
|
|
|
async def jscss(request:Request,app:str,files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)):
|
|
|
|
|
async def jscss(request:Request,app:str,files:t.List[UploadFile] = File(...),env:config.KINTONE_ENV = Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
jscs=[]
|
|
|
|
|
for file in files:
|
|
|
|
|
@@ -542,21 +542,21 @@ async def jscss(request:Request,app:str,files:t.List[UploadFile] = File(...),env
|
|
|
|
|
raise APIException('kintone:updatejscss',request.url._url, f"Error occurred while update js/css {file.filename} is not an Excel file",e)
|
|
|
|
|
|
|
|
|
|
@r.get("/app")
|
|
|
|
|
async def app(request:Request,app:str,c:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
async def app(request:Request,app:str,env:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/app.json"
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/app.json"
|
|
|
|
|
params ={"id":app}
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:app',request.url._url, f"Error occurred while get app({c.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
raise APIException('kintone:app',request.url._url, f"Error occurred while get app({env.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
|
|
|
|
|
@r.get("/allapps")
|
|
|
|
|
async def allapps(request:Request,c:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
async def allapps(request:Request,env:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/apps.json"
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/apps.json"
|
|
|
|
|
offset = 0
|
|
|
|
|
limit = 100
|
|
|
|
|
all_apps = []
|
|
|
|
|
@@ -572,17 +572,17 @@ async def allapps(request:Request,c:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
return {"apps": all_apps}
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:allapps', request.url._url, f"Error occurred while get allapps({c.DOMAIN_NAME}):", e)
|
|
|
|
|
raise APIException('kintone:allapps', request.url._url, f"Error occurred while get allapps({env.DOMAIN_NAME}):", e)
|
|
|
|
|
|
|
|
|
|
@r.get("/appfields")
|
|
|
|
|
async def appfields(request:Request,app:str,env = Depends(getkintoneenv)):
|
|
|
|
|
async def appfields(request:Request,app:str,env:config.KINTONE_ENV = Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
return getfieldsfromkintone(app,env)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:appfields',request.url._url, f"Error occurred while get app fileds({env.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
|
|
|
|
|
@r.get("/allfields")
|
|
|
|
|
async def allfields(request:Request,app:str,env = Depends(getkintoneenv)):
|
|
|
|
|
async def allfields(request:Request,app:str,env:config.KINTONE_ENV = Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
field_resp = getfieldsfromkintone(app,env)
|
|
|
|
|
form_resp = getformfromkintone(app,env)
|
|
|
|
|
@@ -591,38 +591,38 @@ async def allfields(request:Request,app:str,env = Depends(getkintoneenv)):
|
|
|
|
|
raise APIException('kintone:allfields',request.url._url, f"Error occurred while get form fileds({env.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
|
|
|
|
|
@r.get("/appprocess")
|
|
|
|
|
async def appprocess(request:Request,app:str,env = Depends(getkintoneenv)):
|
|
|
|
|
async def appprocess(request:Request,app:str,env:config.KINTONE_ENV = Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
return getprocessfromkintone(app,env)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:appprocess',request.url._url, f"Error occurred while get app process({env.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
|
|
|
|
|
@r.get("/alljscss")
|
|
|
|
|
async def alljscs(request:Request,app:str,c:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
async def alljscs(request:Request,app:str,env:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/app/customize.json"
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE}
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/app/customize.json"
|
|
|
|
|
params = {"app":app}
|
|
|
|
|
r = httpx.get(url,headers=headers,params=params)
|
|
|
|
|
return r.json()
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:alljscss',request.url._url, f"Error occurred while get app js/css({c.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
raise APIException('kintone:alljscss',request.url._url, f"Error occurred while get app js/css({env.DOMAIN_NAME}->{app}):",e)
|
|
|
|
|
|
|
|
|
|
@r.post("/createapp",)
|
|
|
|
|
async def createapp(request:Request,name:str,c:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
async def createapp(request:Request,name:str,env:config.KINTONE_ENV=Depends(getkintoneenv)):
|
|
|
|
|
try:
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
headers={config.API_V1_AUTH_KEY:env.API_V1_AUTH_VALUE,"Content-Type": "application/json"}
|
|
|
|
|
data = {"name":name}
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app.json"
|
|
|
|
|
r = httpx.post(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
result = r.json()
|
|
|
|
|
if result.get("app") != None:
|
|
|
|
|
url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
|
|
|
|
|
url = f"{env.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json"
|
|
|
|
|
data = {"apps":[result],"revert": False}
|
|
|
|
|
r = httpx.post(url,headers=headers,data=json.dumps(data))
|
|
|
|
|
return r.json
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise APIException('kintone:createapp',request.url._url, f"Error occurred while create app({c.DOMAIN_NAME}->{name}):",e)
|
|
|
|
|
raise APIException('kintone:createapp',request.url._url, f"Error occurred while create app({env.DOMAIN_NAME}->{name}):",e)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@r.post("/createappfromexcel",)
|
|
|
|
|
@@ -761,7 +761,7 @@ async def createjstokintone(request:Request,app:str,env:config.KINTONE_ENV = Dep
|
|
|
|
|
try:
|
|
|
|
|
jscs=[]
|
|
|
|
|
files=[]
|
|
|
|
|
files.append(createappjs(env.DOMAIN_ID, app))
|
|
|
|
|
files.append(createappjs(env.BASE_URL, app))
|
|
|
|
|
files.append(getTempPath('alc_runtime.js'))
|
|
|
|
|
files.append(getTempPath('alc_runtime.css'))
|
|
|
|
|
for file in files:
|
|
|
|
|
|