from pathlib import Path from csv import reader from flask import Flask, request from flask.ext.cors import CORS from json import dumps, loads from urllib2 import urlopen from base64 import b64decode from advcommon.security.aam_security import security from advcommon.parse import ArgumentParser from advcommon.logging import getLogger, INFO, Config as LogConfig from socket import gethostbyname, gethostname import advcommon.data as data from time import strptime from config import config from datetime import datetime from re import sub __author__ = 'jknoll' app = Flask(__name__) CORS(app) getLogger('suds').setLevel(INFO) _logger = getLogger(__name__) _logger_conf = LogConfig(application_name=__name__, log_filename=__name__).configure() @app.route('/api/csv', methods=['POST', 'GET']) @app.route('/', methods=['POST', 'GET']) def root(): if request.method == 'POST': path = request.form['path'] glob = request.form['glob'] skip = int(request.form['skip']) yaml_name = request.form['yaml_name'] try: params = loads(request.form['params']) except KeyError: params = dict() else: path = request.args.get('path', '/mnt/data/All/') glob = request.args.get('glob', 'glob regex for matched files') skip = int(request.args.get('skip', '0')) yaml_name = request.args.get('yaml_name', 'ERROR no yaml report name provided needed for security group name') params = loads(request.args.get('params', '{}')) if 'YYYY-MM-DD' in params and 'yymmdd' not in params: params['yymmdd'] = datetime(*strptime(params['YYYY-MM-DD'], '%Y-%m-%d')[:6]).strftime('%y%m%d') path = dollar_curl_apply(path, params) glob = dollar_curl_apply(glob, params) response = urlopen(config['AAM_WEB_URL'] % yaml_name) report_group = loads(response.read())['Security'] user = b64decode(request.headers.get('Authorization')[6:]).split(':')[0] user_groups = security.get_member_of(user) recs = list() if report_group in user_groups and report_group + '_deny' not in user_groups: path_list = list() try: for file_path in Path(dollar_curl_apply(path, params)).glob(dollar_curl_apply(glob, params)): path_list.append(str(file_path)) except OSError: # some directories are un-reachable?? should not effect aamuser pass for file_path in path_list: with open(file_path, 'r') as f: csv_reader = reader(f) while skip > 0: # skip extra intro lines next(csv_reader) skip -= 1 fields = next(csv_reader) # this is the col header line fields = ['col-%s' % i if n is None or n == '' else n for i, n in enumerate(fields)] for x in csv_reader: if len(fields) == 0: # if for any reason we have no headers. fields = ['col-%s' % i for i, n in x] # some headers for col where null header was provided rec = dict(zip(fields, x)) for port in data.system_fund_codes(syscode='geneva'): if port in file_path.upper() and 'Portfolio' not in fields: rec['Portfolio'] = port break recs.append(rec) return dumps(recs, default=json_serial) @app.route('/up') def up(): return '<HTML>AAM_CSV Service is running</HTML>' def json_serial(obj): if isinstance(obj, datetime): serial = obj.isoformat() return serial def dollar_curl_apply(template, params): new = template for param in params: new = sub(r'\$\{%s\}\$' % param, params[param], new) return new def _parse_args(): parser = ArgumentParser() parser.add_environment_group(choices=('dev', 'prod')) parser.add_argument("-p", "--http_port", help='tcpip/port service should run on default 8082', type=int, default=8082) args = parser.parse_args() _logger.debug("arguments set to {}".format(vars(args))) return args if __name__ == '__main__': args = _parse_args() app.run(host=gethostbyname(gethostname()), port=args.http_port, debug=True)
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question