diff --git a/.gitignore b/.gitignore index 36d620a..52f9201 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .python-version __pycache__/ htmlcov/ +lead-scoring/.env diff --git a/lead-scoring/.env.sample b/lead-scoring/.env.sample new file mode 100644 index 0000000..25e4697 --- /dev/null +++ b/lead-scoring/.env.sample @@ -0,0 +1,2 @@ +MONGODB_SERVER=mongodb://username:password@server:port +MONGODB_DATABASE=database diff --git a/lead-scoring/index.py b/lead-scoring/index.py index c0533df..7645209 100644 --- a/lead-scoring/index.py +++ b/lead-scoring/index.py @@ -1,13 +1,68 @@ -from flask import Flask +import json + +from decouple import config +from flask import Flask, jsonify, request +from pymongo import MongoClient from dataset import full_path, ranking ranking().to_csv(full_path('ranking.csv'), index=False) app = Flask(__name__) +mongodb = MongoClient(config('MONGODB_SERVER')) +db = getattr(mongodb, config('MONGODB_DATABASE')) + + +@app.route('/', methods=['GET']) +def get(): + return jsonify([clean(document) for document in db.reports.find()]) + + +@app.route('/', methods=['POST']) +def post(): + data = clean(request.get_json()) + if not all(data.get(key) for key in ('documents', 'email')): + error = {'error': 'Missing `documents` and `email` data.'} + return jsonify(error), 400 + + filter_ = {'documents': data['documents'], 'email': data['email']} + db.reports.update_one(filter_, {'$set': data}, upsert=True) + return jsonify(clean(db.reports.find(filter_)[0])) + + +def clean(document): + whitelist = ( + 'documents', + 'email', + 'illegal', + 'refund', + 'report_id', + 'under_investigation' + ) + cleaned = {key: val for key, val in document.items() if key in whitelist} + + if isinstance(cleaned.get('documents'), str): + ids = cleaned['documents'].split(',') + cleaned['documents'] = list(filter(bool, map(to_int, ids))) + + if isinstance(cleaned.get('refund'), str): + try: + cleaned['refund'] = float(cleaned['refund']) + except ValueError: + cleaned['refund'] = None + + for key in ('illegal', 'under_investigation'): + if isinstance(cleaned.get(key), str): + cleaned[key] = cleaned[key].lower() in ('true', '1') + + return cleaned + + +def to_int(value): + try: + return int(value) + except ValueError: + return None -@app.route('/') -def hello(): - return 'Hello World!' if __name__ == '__main__': app.run() diff --git a/requirements.txt b/requirements.txt index 11aa8c1..07a8675 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,6 @@ git+https://github.com/datasciencebr/serenata-toolbox.git#egg=serenata-toolbox Flask==0.11.1 geopy>=1.11.0 pymongo==3.4.0 +python-decouple==3.0 scikit-learn>=0.17 scipy>=0.18