merge with upstream master
This commit is contained in:
118
helix/sales_force/tasks.py
Normal file
118
helix/sales_force/tasks.py
Normal file
@@ -0,0 +1,118 @@
|
||||
import io
|
||||
import uuid
|
||||
|
||||
import requests
|
||||
|
||||
from helix.calculators.calculator import Calculator
|
||||
from helix.constants import redis_constant, sql_constant
|
||||
from helix.constants.system_type import SystemType
|
||||
from helix.csv_builder import CsvBuilder
|
||||
from helix.doc_gen_params_builder import DocGenParamsBuilder
|
||||
from helix.helpers.camel_case import convert_dict_keys_to_snake_case
|
||||
from helix.json_builder import JsonBuilder
|
||||
from helix.presenters.image_presenter import ImagePresenter
|
||||
from helix.Services.doc_gen_service import DocGenService
|
||||
from helix.Services.s3_helper import s3_upload
|
||||
from helix.session_manager import SessionManager
|
||||
|
||||
|
||||
def get_site_characterization_from_sales_force(session, base_url):
|
||||
'''
|
||||
@base_url: Avoid URL_NOT_RESET errors
|
||||
'''
|
||||
access_token = session['sales_force_token']
|
||||
sfid = session['SFID']
|
||||
helix_id = session['id']
|
||||
url = base_url + '/services/apexrest/v1/HelixRoofDetails'
|
||||
headers = {'Authorization': 'Bearer {}'.format(access_token)}
|
||||
result = requests.get(url, headers=headers, params={'SFID': sfid, 'helix_session_id': helix_id})
|
||||
if result.status_code == 200:
|
||||
data = result.json()
|
||||
if data:
|
||||
data = convert_sales_force_data_format_to_helix(data)
|
||||
return data
|
||||
else:
|
||||
print('Error while getting data from Sales Force: {}'.format(result.status_code))
|
||||
print(result.content)
|
||||
|
||||
|
||||
def convert_sales_force_data_format_to_helix(data):
|
||||
data = convert_dict_keys_to_snake_case(data)
|
||||
|
||||
if data['system_type'] == 'Single-Tilt':
|
||||
data['system_type'] = SystemType.singleTilt.value
|
||||
elif data['system_type'] == 'Dual-Tilt':
|
||||
data['system_type'] = SystemType.dualTilt.value
|
||||
|
||||
data['ballast_block_weight'] = data['ballast_weight']
|
||||
data['max_system_pressure'] = data['max_psf'] = data['system_pressure']
|
||||
return data
|
||||
# data['spectral_response_acceleration']
|
||||
|
||||
|
||||
def export_to_sfdc(session_id):
|
||||
step = 'Exporting to SFDC'
|
||||
try:
|
||||
# 1. Load User Values
|
||||
step = 'Loading User Values'
|
||||
session = {'id': session_id}
|
||||
db_session = sql_constant.sql_session_maker()
|
||||
session_manager = SessionManager(session, redis_constant.redis_store, db_session)
|
||||
user_values = session_manager.user_values()
|
||||
calculator = Calculator(user_values)
|
||||
|
||||
# 2. Generate BOM CSV file
|
||||
step = 'Generating BOM'
|
||||
bom = calculator.compute_bom()
|
||||
csv_file = CsvBuilder().build_bom_output(bom)
|
||||
# 2.1 Generate BOM CSV file
|
||||
step = 'Generating BOM as JSON'
|
||||
json_str = JsonBuilder().build_bom_output(bom)
|
||||
|
||||
# 3. Generate DOCUMENTATION PDF file
|
||||
step = 'Generating Documentation'
|
||||
image_presenter = ImagePresenter(user_values.system_type(), user_values.module_type())
|
||||
doc_gen_service = DocGenService(requests, DocGenParamsBuilder(user_values, user_values.system_type(), calculator, image_presenter))
|
||||
document = doc_gen_service.generate() # Call external service
|
||||
|
||||
# 4. Get Uploaded DXF file in the Helix system
|
||||
step = 'Loading uploaded DXF'
|
||||
dxf_contents = session_manager.site.dxf_file or session_manager.site.cad_file
|
||||
# dxf_filename = session_manager.site.dxf_file_name
|
||||
|
||||
# 5. Save CSV/PDF/DXF files into AWS-S3
|
||||
step = 'Uploading to S3'
|
||||
filename = uuid.uuid4().hex
|
||||
bom_csv_url = s3_upload(io.StringIO(csv_file), filename=filename + '.csv')
|
||||
bom_json_url = s3_upload(io.StringIO(json_str), filename=filename + '.json')
|
||||
doc_url = s3_upload(io.BytesIO(document), filename=filename + '.pdf')
|
||||
if dxf_contents: # Optional
|
||||
dxf_url = s3_upload(io.StringIO(dxf_contents), filename=filename + '.dxf')
|
||||
else:
|
||||
dxf_url = None
|
||||
|
||||
# 6. Notify SFDC system with an API request
|
||||
step = 'Notifying SFDC'
|
||||
SFDC_API_URL = 'https://localhost:8443/' # FIXME
|
||||
data = {
|
||||
'dxf_url': dxf_url,
|
||||
'bom_csv_url': bom_csv_url,
|
||||
'bom_json_url': bom_json_url,
|
||||
'documentation_url': doc_url,
|
||||
}
|
||||
print(data)
|
||||
# result = requests.post(SFDC_API_URL, data=data, timeout=30)
|
||||
|
||||
# 7. Internal logs
|
||||
# if result.status_code != 200: # FIXME
|
||||
# print('')
|
||||
# else:
|
||||
# print('')
|
||||
|
||||
db_session.close()
|
||||
return data
|
||||
# return result.status_code
|
||||
except Exception as e:
|
||||
msg = 'Error while {} for session {}'.format(step, session_id)
|
||||
print(msg)
|
||||
raise e
|
||||
Reference in New Issue
Block a user