You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.2 KiB
Python
118 lines
4.2 KiB
Python
"""
|
|
This interfaces the reader for a data-transport
|
|
"""
|
|
|
|
import cms
|
|
import transport
|
|
from io import BytesIO, StringIO
|
|
import pandas as pd
|
|
import numpy as np
|
|
import json
|
|
import base64
|
|
from flask import make_response, send_file
|
|
import copy
|
|
import json
|
|
import plugin_ix
|
|
import os
|
|
|
|
|
|
# @cms.Plugin(mimetype="application/json",method="POST")
|
|
# def read(**_args) :
|
|
# _request = _args['request']
|
|
# _body = _request.json
|
|
# _data = {}
|
|
# try:
|
|
# reader = transport.get.reader(label = _body['label'])
|
|
# _query = _body['query']
|
|
# #
|
|
# # @TODO :
|
|
# # - support for mongodb and NoSQL ...
|
|
# # - limit to 10K
|
|
# _data = reader.apply(_query)
|
|
# _data.to_dict(orient='split')
|
|
# del _data['index']
|
|
# except Exception as e:
|
|
# print (e)
|
|
# return _data
|
|
def format (file,_mimetype) :
|
|
if 'csv' in _mimetype :
|
|
_df = pd.read_csv(file).fillna('n/a')
|
|
|
|
rows = _df.apply(lambda row:row.values ,axis=1).apply(lambda row: {'cells':[{'value':x}for x in row]} ).tolist()
|
|
rows = [{"cells":[ {'value':_name} for _name in _df.columns]}] + rows
|
|
sheets = [{'usedRange':{'colIndex':1,'rowIndex':_df.shape[0]},'name':'sheet1','rows':rows,'standardHeight':20}]
|
|
return {'Workbook':{'sheets':sheets}}
|
|
|
|
|
|
|
|
@cms.Plugin(mimetype="application/json",method="POST")
|
|
def read(**_args):
|
|
"""
|
|
This function will in theory open a spreadsheet or csv file
|
|
"""
|
|
_request = _args['request']
|
|
file = _request.files['file']
|
|
spreadsheet = format(file,file.mimetype)
|
|
return spreadsheet #{"Workbook":{"sheets":[{"usedRange":{"colIndex":1,"rowIndex":3},"name":"Sheet1","rows":[{"cells":[{"value":"name"},{"value":"age"}]},{"cells":[{"value":"steve"},{"value":"44"}]},{"cells":[{"value":"elon"},{"value":"9"}]},{"cells":[{"value":"nico"},{"value":"33"}]}],"standardHeight":20}]}})
|
|
@cms.Plugin(mimetype="application/octet-stream",method="POST")
|
|
def write(**_args):
|
|
_request = _args['request']
|
|
_data = _request.json #json.loads(_request.form['JSONData'])
|
|
print (_data.keys())
|
|
# _data = json.loads(_request.form['JSONData'])
|
|
# _data = {"JSONData":_data}
|
|
_config = _args['config']
|
|
_path = os.sep.join([_config['layout']['location'],_config['layout']['root'],'_plugins'])
|
|
# if os.path.exists(_path) :
|
|
_filename = os.sep.join([_path,'ms-excel.py'])
|
|
_lx = plugin_ix.Loader(file=_filename)
|
|
_getExcelStream = _lx._modules.get('instance')
|
|
_stream = _getExcelStream(_data)
|
|
print (_stream.read())
|
|
_stream.seek(0)
|
|
return base64.b64encode(_stream.read()).decode('utf-8')
|
|
# response = make_response(_stream.getvalue())
|
|
|
|
# # Set headers for file download
|
|
# filename = _request.form['fileName']
|
|
# response.headers["Content-Disposition"] = f"attachment; filename={filename}"
|
|
# response.headers["Content-Type"] = "application/octet-stream" # Or a more specific MIME type like 'text/plain'
|
|
# return response
|
|
|
|
|
|
def _write(**_args) :
|
|
"""
|
|
This functon generates an excel file, by returning the encoded 64bit stream
|
|
"""
|
|
_request = _args['request']
|
|
_object = _request.json
|
|
_sheets = None
|
|
if _object :
|
|
_rows = _object['rows']
|
|
_label = _object['label']
|
|
#
|
|
# convert this to a spreadsheet
|
|
_excelFile = BytesIO()
|
|
with pd.ExcelWriter(_excelFile, engine='xlsxwriter') as writer:
|
|
_index = 1
|
|
for _name in _rows :
|
|
_sheet = _rows[_name]
|
|
try:
|
|
_df = pd.DataFrame(_sheet['values'],columns=_sheet['columns'])
|
|
_df.to_excel(writer,sheet_name=_name,index=False)
|
|
except Exception as e:
|
|
print (_name)
|
|
print (_sheet)
|
|
_index += 1
|
|
if 'chart' in _rows :
|
|
print (_rows['chart'])
|
|
# Write each DataFrame to a different sheet
|
|
_excelFile.seek(0)
|
|
_stream= _excelFile.read() #send_file(_excelFile,as_attachment=True,download_name=f'{_label}-export.xlsx', mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
return base64.b64encode(_stream).decode('utf-8')
|
|
|
|
@cms.Plugin(mimetype="text/plain")
|
|
def version (**_args) :
|
|
return transport.__edition__+ ' Edition '+transport.__version__
|
|
|