ahserver_g/ahserver/globalEnv.py

203 lines
4.9 KiB
Python
Raw Normal View History

2019-07-10 17:34:45 +08:00
# -*- coding:utf8 -*-
import os
2024-04-10 14:53:03 +08:00
import builtins
2019-07-10 17:34:45 +08:00
import sys
import codecs
from urllib.parse import quote
import json
import random
import time
import datetime
from openpyxl import Workbook
from tempfile import mktemp
from appPublic.jsonConfig import getConfig
from appPublic.Singleton import GlobalEnv
from appPublic.argsConvert import ArgsConvert
2020-08-02 11:20:17 +08:00
from appPublic.timeUtils import str2Date,str2Datetime,curDatetime,getCurrentTimeStamp,curDateString, curTimeString
2019-07-10 17:34:45 +08:00
from appPublic.folderUtils import folderInfo
from appPublic.uniqueID import setNode,getID
from appPublic.unicoding import unicoding,uDict,uObject
from appPublic.Singleton import SingletonDecorator
2023-04-04 10:34:02 +08:00
from appPublic.rc4 import password
2019-07-10 17:34:45 +08:00
2019-12-07 07:16:42 +08:00
from sqlor.dbpools import DBPools,runSQL,runSQLPaging
2019-08-30 21:02:34 +08:00
from sqlor.crud import CRUD
2019-07-10 17:34:45 +08:00
from .xlsxData import XLSXData
from .uriop import URIOp
2023-04-04 10:34:02 +08:00
from .error import Success, Error, NeedLogin, NoPermission
2023-12-18 18:39:23 +08:00
from .filetest import current_fileno
2019-07-10 17:34:45 +08:00
from .serverenv import ServerEnv
def data2xlsx(rows,headers=None):
wb = Workbook()
ws = wb.active
i = 1
if headers is not None:
for j in range(len(headers)):
v = headers[j].title if headers[j].get('title',False) else headers[j].name
ws.cell(column=j+1,row=i,value=v)
i += 1
for r in rows:
for j in range(len(r)):
v = r[headers[j].name]
ws.cell(column=j+1,row=i,value=v)
i += 1
name = mktemp(suffix='.xlsx')
wb.save(filename = name)
wb.close()
return name
class FileOutZone(Exception):
def __init__(self,fp,*args,**kwargs):
super(FileOutZone,self).__init__(*args,**kwargs)
self.openfilename = fp
def __str__(self):
return self.openfilename + ': not allowed to open'
2024-03-01 13:19:46 +08:00
def get_config_value(kstr):
keys = kstr.split('.')
config = getConfig()
2024-03-12 18:33:17 +08:00
if config is None:
raise Exception('getConfig() error')
2024-03-01 13:19:46 +08:00
for k in keys:
config = config.get(k)
if not config:
return None
return config
def get_definition(k):
2024-03-12 18:33:17 +08:00
k = f'definitions.{k}'
return get_config_value(k)
2024-03-01 13:19:46 +08:00
2019-07-10 17:34:45 +08:00
def openfile(url,m):
fp = abspath(url)
if fp is None:
2022-06-23 14:58:03 +08:00
print(f'openfile({url},{m}),url is not match a file')
2019-07-10 17:34:45 +08:00
raise Exception('url can not mathc a file')
config = getConfig()
paths = [ os.path.abspath(p) for p in config.website.paths ]
fs = config.get('allow_folders',[])
fs = [ os.path.abspath(i) for i in fs + paths ]
r = False
for f in fs:
if fp.startswith(f):
r = True
break
if not r:
raise FileOutZone(fp)
return open(fp,m)
def isNone(a):
return a is None
def abspath(path):
config = getConfig()
paths = [ os.path.abspath(p) for p in config.website.paths ]
for root in paths:
p = root + path
if os.path.exists(root+path):
return p
return None
def appname():
config = getConfig()
try:
return config.license.app
except:
return "test app"
def configValue(ks):
config = getConfig()
try:
a = eval('config' + ks)
return a
except:
return None
def visualcoding():
return configValue('.website.visualcoding');
def file_download(request,path,name,coding='utf8'):
f = openfile(path,'rb')
b = f.read()
f.close()
fname = quote(name).encode(coding)
hah = b"attachment; filename=" + fname
# print('file head=',hah.decode(coding))
request.setHeader(b'Content-Disposition',hah)
request.setHeader(b'Expires',0)
request.setHeader(b'Cache-Control',b'must-revalidate, post-check=0, pre-check=0')
request.setHeader(b'Content-Transfer-Encoding',b'binary')
request.setHeader(b'Pragma',b'public')
request.setHeader(b'Content-Length',len(b))
request.write(b)
request.finish()
def initEnv():
pool = DBPools()
g = ServerEnv()
g.configValue = configValue
g.visualcoding = visualcoding
g.uriop = URIOp
g.isNone = isNone
2024-04-09 18:10:52 +08:00
g.len = len
g.print = print
2019-07-10 17:34:45 +08:00
g.json = json
2024-04-10 11:42:23 +08:00
g.Exception = Exception
2019-07-10 17:34:45 +08:00
g.int = int
g.str = str
g.float = float
2024-04-09 18:10:52 +08:00
g.complex = complex
2019-07-10 17:34:45 +08:00
g.type = type
g.ArgsConvert = ArgsConvert
g.time = time
2020-08-02 11:20:17 +08:00
g.curDateString = curDateString
g.curTimeString = curTimeString
2019-07-10 17:34:45 +08:00
g.datetime = datetime
g.random = random
g.str2date = str2Date
g.str2datetime = str2Datetime
g.curDatetime = curDatetime
g.uObject = uObject
g.uuid = getID
2019-12-07 07:16:42 +08:00
g.runSQL = runSQL
g.runSQLPaging = runSQLPaging
2019-07-10 17:34:45 +08:00
g.runSQLIterator = pool.runSQL
g.runSQLResultFields = pool.runSQLResultFields
g.getTables = pool.getTables
g.getTableFields = pool.getTableFields
g.getTablePrimaryKey = pool.getTablePrimaryKey
g.getTableForignKeys = pool.getTableForignKeys
g.folderInfo = folderInfo
g.abspath = abspath
g.data2xlsx = data2xlsx
g.xlsxdata = XLSXData
g.openfile = openfile
2019-08-30 21:02:34 +08:00
g.CRUD = CRUD
2020-07-12 16:08:50 +08:00
g.DBPools = DBPools
2023-04-04 10:34:02 +08:00
g.Error = Error
g.Success = Success
g.NeedLogin = NeedLogin
g.NoPermission = NoPermission
2023-04-14 11:39:36 +08:00
g.password_encode = password
2023-12-18 18:39:23 +08:00
g.current_fileno = current_fileno
2024-03-01 13:19:46 +08:00
g.get_config_value = get_config_value
g.get_definition = get_definition
2024-04-10 14:53:03 +08:00
set_builtins()
2024-03-01 13:19:46 +08:00
2024-04-09 18:10:52 +08:00
def set_builtins():
2024-04-10 14:53:03 +08:00
all_builtins = [ i for i in dir(builtins) if not i.startswith('_')]
2024-04-09 18:10:52 +08:00
g = ServerEnv()
2024-04-10 14:53:03 +08:00
gg = globals()
for l in all_builtins:
exec(f'g["{l}"] = {l}',{'g':g})
print(f'{g.sorted=}, {sorted=}, globalEnv.py')