From cbcfb9c49858f4df0578e60a76c2fd112f20c7ec Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Fri, 3 Jan 2020 14:07:22 -0500 Subject: [PATCH 01/16] Conditional ECM list generation for single fam --- bloclink/apps/bis/views.py | 82 ++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index c3849d9..a646648 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -6,7 +6,7 @@ from django.conf import settings from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.views import View -from .models import Questions, MapBoxBuilding, Answers, SubmittedSurvey, Users, Surveys, SurveyAreas +from .models import Questions, MapBoxBuilding, Answers, SubmittedSurvey, Users, Surveys, SurveyAreas, RecommendationSetMap, Ecm from django.forms.models import model_to_dict import smtplib from django.core.mail import send_mail @@ -179,6 +179,55 @@ class SubmitQuestionnaire(View): def put(self, request): put = json.loads(request.body.decode()) + if put['surveyId'] in [2,3] : + # Get building type + submittedBuildingType = model_to_dict(SubmittedSurvey.objects.using('bis').get(user_id=put['userId'], question_id=12).answer_id)['id'] + + # Get building sub type + submittedBuildingSubType = model_to_dict(SubmittedSurvey.objects.using('bis').get(user_id=put['userId'], question_id=13).answer_id)['id'] + + # Get recommendation set + recommendationSet = model_to_dict(RecommendationSetMap.objects.using('bis').get(building_type_id=submittedBuildingType, building_sub_type_id=submittedBuildingSubType).recommendation_id)['id'] + + # Get all the ecms for this recommendation set + possibleEcms = [] + ecms = Ecm.objects.using('bis').filter(recommendation_id=recommendationSet) + for ecm in ecms: + possibleEcms.append(model_to_dict(ecm)['id']) + + # Get all the question id and submitted answer id and put it in a dictionary + submittedQuestionAnswers = {} + submittedAnswers = SubmittedSurvey.objects.using('bis').filter(user_id=put['userId']).order_by('id') + for submittedAnswer in submittedAnswers: + submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']] = submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']] if model_to_dict(submittedAnswer)['question_id'] in submittedQuestionAnswers else [] + submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']].append(model_to_dict(submittedAnswer)['answer_id']) + + # Check conditions if recommendation set is Single Family + print(possibleEcms) + if recommendationSet == 1: + if 2 in submittedQuestionAnswers[24]: + possibleEcms.remove(6) + possibleEcms.remove(7) + if 1 not in submittedQuestionAnswers[43] and 1 in submittedQuestionAnswers[26]: + possibleEcms.remove(8) + if 1 not in submittedQuestionAnswers[41] and 1 in submittedQuestionAnswers[24]: + possibleEcms.remove(9) + if 99 not in submittedQuestionAnswers[16] and (100 in submittedQuestionAnswers[16] or 101 in submittedQuestionAnswers[16] or 1 in submittedQuestionAnswers[24]): + possibleEcms.remove(10) + possibleEcms.remove(12) + if 1 not in submittedQuestionAnswers[36] and (103 in submittedQuestionAnswers[17] or 105 in submittedQuestionAnswers[17] or 106 in submittedQuestionAnswers[17] or 107 in submittedQuestionAnswers[17] or 108 in submittedQuestionAnswers[17]): + possibleEcms.remove(11) + if 1 not in submittedQuestionAnswers[37] and (101 in submittedQuestionAnswers[16] and 107 in submittedQuestionAnswers[17]): + possibleEcms.remove(13) + if 98 not in submittedQuestionAnswers[16] and (102 in submittedQuestionAnswers[17] or 103 in submittedQuestionAnswers[17] or 106 in submittedQuestionAnswers[17] or 107 in submittedQuestionAnswers[17]): + possibleEcms.remove(15) + if 1 not in submittedQuestionAnswers[48] and 1 in submittedQuestionAnswers[31]: + possibleEcms.remove(16) + if 1 not in submittedQuestionAnswers[45] and 1 in submittedQuestionAnswers[28]: + possibleEcms.remove(17) + + print(possibleEcms) + # Sending Emails buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address firstName = put['firstName'] @@ -232,21 +281,22 @@ class SubmitQuestionnaire(View): 'buildingId': put['buildingId'], 'address': buildingData['address'], 'QA': buildingData['questions']}) - subject = 'BIS - ' + buildingData['address'] - if os.environ['ENVIRONMENT'] == 'prod': - send_mail( subject, - msg_txt, - from_email, - [settings.PROD_EMAIL], - html_message=msg_html, - ) - else: - send_mail( "TEST - " + subject, - msg_txt, - from_email, - [settings.TEST_EMAIL], - html_message=msg_html, - ) + + # subject = 'BIS - ' + buildingData['address'] + # if os.environ['ENVIRONMENT'] == 'prod': + # send_mail( subject, + # msg_txt, + # from_email, + # [settings.PROD_EMAIL], + # html_message=msg_html, + # ) + # else: + # send_mail( "TEST - " + subject, + # msg_txt, + # from_email, + # [settings.TEST_EMAIL], + # html_message=msg_html, + # ) return JsonResponse({ 'success': True, -- GitLab From 27c3b3c6dc69225db529f36c6764237eb7d71c85 Mon Sep 17 00:00:00 2001 From: Jinal Soni Date: Fri, 3 Jan 2020 15:36:00 -0500 Subject: [PATCH 02/16] completing report generation - error in template path --- Dockerfile | 4 +-- bloclink/apps/bis/views.py | 52 ++++++++++++++++++++++++++++++-- config/local/bloclink.Dockerfile | 4 +-- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8dbea91..5405228 100644 --- a/Dockerfile +++ b/Dockerfile @@ -76,8 +76,8 @@ ENV ASHP_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/pna/PNA_Report_Template.pptx ADD https://ashp-pna-template.s3.amazonaws.com/PNA_Report_Template.pptx $ASHP_PPTX_TEMPLATE # Get Non-NYC PNA Template -ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/NonNYC_Report_Template.pptx -ADD https://ashp-pna-template.s3.amazonaws.com/NonNYC_Report_Template.pptx $NON_NYC_PPTX_TEMPLATE +ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template.pptx $NON_NYC_PPTX_TEMPLATE # Collect static files RUN cd $CODEROOT && python3 manage.py collectstatic --noinput diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index a646648..ed172dd 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -18,6 +18,7 @@ from django.template.loader import render_to_string from django.core.mail import EmailMessage from django.db import connections import re +from bpeng.bis.report import generate_pns_report class SubmitBuilding(View): def put(self, request): @@ -178,7 +179,7 @@ class SubmitContact(View): class SubmitQuestionnaire(View): def put(self, request): put = json.loads(request.body.decode()) - + if put['surveyId'] in [2,3] : # Get building type submittedBuildingType = model_to_dict(SubmittedSurvey.objects.using('bis').get(user_id=put['userId'], question_id=12).answer_id)['id'] @@ -203,7 +204,6 @@ class SubmitQuestionnaire(View): submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']].append(model_to_dict(submittedAnswer)['answer_id']) # Check conditions if recommendation set is Single Family - print(possibleEcms) if recommendationSet == 1: if 2 in submittedQuestionAnswers[24]: possibleEcms.remove(6) @@ -226,7 +226,53 @@ class SubmitQuestionnaire(View): if 1 not in submittedQuestionAnswers[45] and 1 in submittedQuestionAnswers[28]: possibleEcms.remove(17) - print(possibleEcms) + # Check conditions if recommendation set is Multi Family + if recommendationSet == 2: + if 1 in submittedQuestionAnswers[23]: + possibleEcms.remove(20) + if 104 not in submittedQuestionAnswers[17]: + possibleEcms.remove(23) + if 99 not in submittedQuestionAnswers[16] and 1 in submittedQuestionAnswers[18]: + possibleEcms.remove(24) + if 97 not in submittedQuestionAnswers[16]: + possibleEcms.remove(25) + if 101 in submittedQuestionAnswers[16] and 107 in submittedQuestionAnswers[17]: + possibleEcms.remove(26) + if 1 not in submittedQuestionAnswers[48] and 1 in submittedQuestionAnswers[31]: + possibleEcms.remove(37) + if 1 not in submittedQuestionAnswers[45] and 1 in submittedQuestionAnswers[28]: + possibleEcms.remove(27) + if 1 not in submittedQuestionAnswers[47] and 1 in submittedQuestionAnswers[30]: + possibleEcms.remove(28) + + # Check conditions if recommendation set is Small Commercials + if recommendationSet == 3: + if 104 not in submittedQuestionAnswers[17]: + possibleEcms.remove(31) + possibleEcms.remove(34) + possibleEcms.remove(35) + if 99 not in submittedQuestionAnswers[16] and 1 in submittedQuestionAnswers[18]: + possibleEcms.remove(32) + if 1 not in submittedQuestionAnswers[48] and 1 in submittedQuestionAnswers[31]: + possibleEcms.remove(36) + if (101 in submittedQuestionAnswers[16] and 107 in submittedQuestionAnswers[17]) or 100 in submittedQuestionAnswers[16] or 102 in submittedQuestionAnswers[17] or 106 in submittedQuestionAnswers[17]: + possibleEcms.remove(33) + + # Get final ECMs + recommendation_list = [] + for ecm in possibleEcms: + ecm_dict = {} + ecm_dict['ecm_name'] = model_to_dict(Ecm.objects.using('bis').get(id=ecm))['ecm_name'] + ecm_dict['short_description'] = model_to_dict(Ecm.objects.using('bis').get(id=ecm))['short_description'] + recommendation_list.append(ecm_dict) + + # Get building info + building_info = {} + building_info['address'] = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address + + # Generte Report + report = generate_pns_report(os.environ['NON_NYC_PPTX_TEMPLATE'], building_info, recommendation_list) + print(report) # Sending Emails buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address diff --git a/config/local/bloclink.Dockerfile b/config/local/bloclink.Dockerfile index 72a883a..4aff032 100644 --- a/config/local/bloclink.Dockerfile +++ b/config/local/bloclink.Dockerfile @@ -42,5 +42,5 @@ ENV ASHP_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/pna/PNA_Report_Template.pptx ADD https://ashp-pna-template.s3.amazonaws.com/PNA_Report_Template.pptx $ASHP_PPTX_TEMPLATE # Get Non-NYC PNA Template -ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/NonNYC_Report_Template.pptx -ADD https://ashp-pna-template.s3.amazonaws.com/NonNYC_Report_Template.pptx $NON_NYC_PPTX_TEMPLATE +ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template.pptx $NON_NYC_PPTX_TEMPLATE -- GitLab From b2f859310e1f0f330735dc8181d994ff944b4588 Mon Sep 17 00:00:00 2001 From: Jinal Soni Date: Fri, 3 Jan 2020 16:00:39 -0500 Subject: [PATCH 03/16] comments removed --- bloclink/apps/bis/views.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index ed172dd..84ae89f 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -179,7 +179,7 @@ class SubmitContact(View): class SubmitQuestionnaire(View): def put(self, request): put = json.loads(request.body.decode()) - + if put['surveyId'] in [2,3] : # Get building type submittedBuildingType = model_to_dict(SubmittedSurvey.objects.using('bis').get(user_id=put['userId'], question_id=12).answer_id)['id'] @@ -300,7 +300,7 @@ class SubmitQuestionnaire(View): msg_html = render_to_string('thank_you_email.html', {'firstName': firstName, 'lastName': lastName, 'buildingAddress': buildingAddress, 'phone':settings.BLOCPOWER_PHONE_NUMBER}) msg = EmailMessage('Thank you', msg_html, from_email, [toEmail]) msg.content_subtype = "html" - # msg.attach_file('bloclink/templates/oaklandTemplate.pdf') + msg.attach_file(report) msg.send() # Get all building related data @@ -328,21 +328,21 @@ class SubmitQuestionnaire(View): 'address': buildingData['address'], 'QA': buildingData['questions']}) - # subject = 'BIS - ' + buildingData['address'] - # if os.environ['ENVIRONMENT'] == 'prod': - # send_mail( subject, - # msg_txt, - # from_email, - # [settings.PROD_EMAIL], - # html_message=msg_html, - # ) - # else: - # send_mail( "TEST - " + subject, - # msg_txt, - # from_email, - # [settings.TEST_EMAIL], - # html_message=msg_html, - # ) + subject = 'BIS - ' + buildingData['address'] + if os.environ['ENVIRONMENT'] == 'prod': + send_mail( subject, + msg_txt, + from_email, + [settings.PROD_EMAIL], + html_message=msg_html, + ) + else: + send_mail( "TEST - " + subject, + msg_txt, + from_email, + [settings.TEST_EMAIL], + html_message=msg_html, + ) return JsonResponse({ 'success': True, -- GitLab From 24ead7b452ae50eb639c3f64511a10eaebea01ab Mon Sep 17 00:00:00 2001 From: Jinal Soni Date: Fri, 3 Jan 2020 16:01:06 -0500 Subject: [PATCH 04/16] comments removed --- bloclink/apps/bis/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 84ae89f..f38d72b 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -272,8 +272,7 @@ class SubmitQuestionnaire(View): # Generte Report report = generate_pns_report(os.environ['NON_NYC_PPTX_TEMPLATE'], building_info, recommendation_list) - print(report) - + # Sending Emails buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address firstName = put['firstName'] -- GitLab From 57d3970742980aeb588ca66bb8d9ff8572d3daac Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:06:19 -0800 Subject: [PATCH 05/16] Add all four templates needed for generating reports with up to 12 recommendations. --- Dockerfile | 15 ++++++++++++--- config/local/bloclink.Dockerfile | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5405228..682f9ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -75,9 +75,18 @@ RUN rm EnergyPlus-8.6.0-198c6a3cff-Linux-x86_64.sh ENV ASHP_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/pna/PNA_Report_Template.pptx ADD https://ashp-pna-template.s3.amazonaws.com/PNA_Report_Template.pptx $ASHP_PPTX_TEMPLATE -# Get Non-NYC PNA Template -ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template.pptx -ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template.pptx $NON_NYC_PPTX_TEMPLATE +# Get Non-NYC PNA Templates +ENV NON_NYC_PPTX_TEMPLATE_1=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_1.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_1.pptx $NON_NYC_PPTX_TEMPLATE_1 + +ENV NON_NYC_PPTX_TEMPLATE_2=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_2.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_2.pptx $NON_NYC_PPTX_TEMPLATE_2 + +ENV NON_NYC_PPTX_TEMPLATE_3=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_3.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_3.pptx $NON_NYC_PPTX_TEMPLATE_3 + +ENV NON_NYC_PPTX_TEMPLATE_4=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_4.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_4.pptx $NON_NYC_PPTX_TEMPLATE_4 # Collect static files RUN cd $CODEROOT && python3 manage.py collectstatic --noinput diff --git a/config/local/bloclink.Dockerfile b/config/local/bloclink.Dockerfile index 4aff032..062d0cc 100644 --- a/config/local/bloclink.Dockerfile +++ b/config/local/bloclink.Dockerfile @@ -41,6 +41,15 @@ COPY $service_path/ /app/ ENV ASHP_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/pna/PNA_Report_Template.pptx ADD https://ashp-pna-template.s3.amazonaws.com/PNA_Report_Template.pptx $ASHP_PPTX_TEMPLATE -# Get Non-NYC PNA Template -ENV NON_NYC_PPTX_TEMPLATE=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template.pptx -ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template.pptx $NON_NYC_PPTX_TEMPLATE +# Get Non-NYC PNA Templates +ENV NON_NYC_PPTX_TEMPLATE_1=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_1.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_1.pptx $NON_NYC_PPTX_TEMPLATE_1 + +ENV NON_NYC_PPTX_TEMPLATE_2=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_2.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_2.pptx $NON_NYC_PPTX_TEMPLATE_2 + +ENV NON_NYC_PPTX_TEMPLATE_3=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_3.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_3.pptx $NON_NYC_PPTX_TEMPLATE_3 + +ENV NON_NYC_PPTX_TEMPLATE_4=$CODEROOT/bloclink/apps/bis/PNS_NonNYC_Template_4.pptx +ADD https://ashp-pna-template.s3.amazonaws.com/PNS_NonNYC_Template_4.pptx $NON_NYC_PPTX_TEMPLATE_4 -- GitLab From 49e64e2f9d622631e4fcfd3fe05b32394ee694ae Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:16:39 -0800 Subject: [PATCH 06/16] Use current working branch for report generation. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e0bd14e..5d260f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://[YOUR-GITHUB-TOKEN]:x-oauth-basic@github.com/Blocp/bpengine.git@v0.8.5 +git+https://[YOUR-GITHUB-TOKEN]:x-oauth-basic@github.com/Blocp/bpengine.git@BI-627-BIS-Report celery==4.0.2 Django==1.10.6 numpy==1.17.4 -- GitLab From cc8992124e77817e13ee17189ad840a6721df6d7 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:20:05 -0800 Subject: [PATCH 07/16] Template path is not passed to BPEngine it now expects environment variables to exist. --- bloclink/apps/bis/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index f38d72b..8f6bfbd 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -271,7 +271,7 @@ class SubmitQuestionnaire(View): building_info['address'] = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address # Generte Report - report = generate_pns_report(os.environ['NON_NYC_PPTX_TEMPLATE'], building_info, recommendation_list) + report = generate_pns_report(building_info, recommendation_list) # Sending Emails buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address -- GitLab From 9433606d6c0bcf15c3c495b68bc35f67420ebf56 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:36:10 -0800 Subject: [PATCH 08/16] simplify retrieving recommendation object dict --- bloclink/apps/bis/views.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 8f6bfbd..39934eb 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -203,8 +203,8 @@ class SubmitQuestionnaire(View): submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']] = submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']] if model_to_dict(submittedAnswer)['question_id'] in submittedQuestionAnswers else [] submittedQuestionAnswers[model_to_dict(submittedAnswer)['question_id']].append(model_to_dict(submittedAnswer)['answer_id']) - # Check conditions if recommendation set is Single Family if recommendationSet == 1: + # Single Family recommendation filtering if 2 in submittedQuestionAnswers[24]: possibleEcms.remove(6) possibleEcms.remove(7) @@ -225,9 +225,8 @@ class SubmitQuestionnaire(View): possibleEcms.remove(16) if 1 not in submittedQuestionAnswers[45] and 1 in submittedQuestionAnswers[28]: possibleEcms.remove(17) - - # Check conditions if recommendation set is Multi Family - if recommendationSet == 2: + elif recommendationSet == 2: + # Multi Family recommendation filtering if 1 in submittedQuestionAnswers[23]: possibleEcms.remove(20) if 104 not in submittedQuestionAnswers[17]: @@ -244,9 +243,8 @@ class SubmitQuestionnaire(View): possibleEcms.remove(27) if 1 not in submittedQuestionAnswers[47] and 1 in submittedQuestionAnswers[30]: possibleEcms.remove(28) - - # Check conditions if recommendation set is Small Commercials - if recommendationSet == 3: + elif recommendationSet == 3: + # Small Commercial recommendation filtering if 104 not in submittedQuestionAnswers[17]: possibleEcms.remove(31) possibleEcms.remove(34) @@ -261,10 +259,7 @@ class SubmitQuestionnaire(View): # Get final ECMs recommendation_list = [] for ecm in possibleEcms: - ecm_dict = {} - ecm_dict['ecm_name'] = model_to_dict(Ecm.objects.using('bis').get(id=ecm))['ecm_name'] - ecm_dict['short_description'] = model_to_dict(Ecm.objects.using('bis').get(id=ecm))['short_description'] - recommendation_list.append(ecm_dict) + recommendation_list.append(model_to_dict(Ecm.objects.using('bis').get(id=ecm))) # Get building info building_info = {} -- GitLab From 46745f987d547fc08d003119de6d69ba99e808f4 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:53:26 -0800 Subject: [PATCH 09/16] Only retrieve address once. --- bloclink/apps/bis/views.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 39934eb..94ed885 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -179,7 +179,7 @@ class SubmitContact(View): class SubmitQuestionnaire(View): def put(self, request): put = json.loads(request.body.decode()) - + buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address if put['surveyId'] in [2,3] : # Get building type submittedBuildingType = model_to_dict(SubmittedSurvey.objects.using('bis').get(user_id=put['userId'], question_id=12).answer_id)['id'] @@ -263,13 +263,12 @@ class SubmitQuestionnaire(View): # Get building info building_info = {} - building_info['address'] = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address + building_info['address'] = buildingAddress - # Generte Report + # Generate Report report = generate_pns_report(building_info, recommendation_list) # Sending Emails - buildingAddress = MapBoxBuilding.objects.using('bis').get(building_id=put['buildingId']).mapbox_address firstName = put['firstName'] lastName = put['lastName'] toEmail = put['email'] -- GitLab From a7864595cdb061ce59c95b9ab7a892c2c511591d Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Fri, 3 Jan 2020 16:55:14 -0800 Subject: [PATCH 10/16] Remove extra line. --- bloclink/apps/bis/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 94ed885..6fe2822 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -320,7 +320,6 @@ class SubmitQuestionnaire(View): 'buildingId': put['buildingId'], 'address': buildingData['address'], 'QA': buildingData['questions']}) - subject = 'BIS - ' + buildingData['address'] if os.environ['ENVIRONMENT'] == 'prod': send_mail( subject, -- GitLab From 6c57313f4688b9dba8feb51f3594f015f121a617 Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Mon, 6 Jan 2020 11:55:02 -0500 Subject: [PATCH 11/16] Add tested code and send pptx to user --- bloclink/apps/bis/views.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 6fe2822..e1aebcf 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -18,6 +18,7 @@ from django.template.loader import render_to_string from django.core.mail import EmailMessage from django.db import connections import re +import boto3 from bpeng.bis.report import generate_pns_report class SubmitBuilding(View): @@ -257,16 +258,17 @@ class SubmitQuestionnaire(View): possibleEcms.remove(33) # Get final ECMs - recommendation_list = [] + recommendations = [] for ecm in possibleEcms: - recommendation_list.append(model_to_dict(Ecm.objects.using('bis').get(id=ecm))) + recommendations.append(model_to_dict(Ecm.objects.using('bis').get(id=ecm))) # Get building info building_info = {} building_info['address'] = buildingAddress # Generate Report - report = generate_pns_report(building_info, recommendation_list) + report = generate_pns_report(building_info, recommendations) + # Sending Emails firstName = put['firstName'] @@ -293,6 +295,7 @@ class SubmitQuestionnaire(View): msg_html = render_to_string('thank_you_email.html', {'firstName': firstName, 'lastName': lastName, 'buildingAddress': buildingAddress, 'phone':settings.BLOCPOWER_PHONE_NUMBER}) msg = EmailMessage('Thank you', msg_html, from_email, [toEmail]) msg.content_subtype = "html" + # This will send pptx. Need ton convert it to PDF. msg.attach_file(report) msg.send() -- GitLab From 06d9c54116e9fcc3d1e73a0bf99b2e5540618367 Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Mon, 6 Jan 2020 12:58:16 -0500 Subject: [PATCH 12/16] Add reports to s3 and send emails to BizDev --- bloclink/apps/bis/views.py | 45 +++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index e1aebcf..64908dc 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -6,7 +6,7 @@ from django.conf import settings from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.views import View -from .models import Questions, MapBoxBuilding, Answers, SubmittedSurvey, Users, Surveys, SurveyAreas, RecommendationSetMap, Ecm +from .models import Questions, MapBoxBuilding, Answers, SubmittedSurvey, Users, Surveys, SurveyAreas, RecommendationSetMap, Ecm, Report from django.forms.models import model_to_dict import smtplib from django.core.mail import send_mail @@ -269,6 +269,25 @@ class SubmitQuestionnaire(View): # Generate Report report = generate_pns_report(building_info, recommendations) + # Store generated report in S3 bucket + dest_ppt_file = report.replace(',', '') + S3 = boto3.client('s3', + aws_access_key_id ='AKIA3DOHIAZRCHMHILGW', + aws_secret_access_key = '1YrvuGVILZmooLnVSJPhs0zXip3UzNX/PaIV1e3d') + BUCKET_NAME = 'blocpower.io' + S3_FileName = 'PNA_Reports/'+dest_ppt_file.split('/')[-1] + try: + S3.upload_file(report, BUCKET_NAME, S3_FileName) + except Exception as e: + print(e) + os.rename(report, dest_ppt_file) + + # Add entry into report object + Report( + survey_id = SubmittedSurvey.objects.using('bis').filter(user_id=put['userId'])[0], + resource = dest_ppt_file.split('/')[-1], + last_updated = datetime.now() + ).save(using='bis') # Sending Emails firstName = put['firstName'] @@ -295,8 +314,7 @@ class SubmitQuestionnaire(View): msg_html = render_to_string('thank_you_email.html', {'firstName': firstName, 'lastName': lastName, 'buildingAddress': buildingAddress, 'phone':settings.BLOCPOWER_PHONE_NUMBER}) msg = EmailMessage('Thank you', msg_html, from_email, [toEmail]) msg.content_subtype = "html" - # This will send pptx. Need ton convert it to PDF. - msg.attach_file(report) + msg.attach_file(dest_ppt_file) msg.send() # Get all building related data @@ -323,21 +341,18 @@ class SubmitQuestionnaire(View): 'buildingId': put['buildingId'], 'address': buildingData['address'], 'QA': buildingData['questions']}) + subject = 'BIS - ' + buildingData['address'] if os.environ['ENVIRONMENT'] == 'prod': - send_mail( subject, - msg_txt, - from_email, - [settings.PROD_EMAIL], - html_message=msg_html, - ) + msg = EmailMessage(subject, msg_html, from_email, [settings.TEST_EMAIL]) + msg.content_subtype = "html" + msg.attach_file(dest_ppt_file) + msg.send() else: - send_mail( "TEST - " + subject, - msg_txt, - from_email, - [settings.TEST_EMAIL], - html_message=msg_html, - ) + msg = EmailMessage("TEST - " + subject, msg_html, from_email, [settings.TEST_EMAIL]) + msg.content_subtype = "html" + msg.attach_file(dest_ppt_file) + msg.send() return JsonResponse({ 'success': True, -- GitLab From 668fda52742d2bc3da9c638d102cd9d8d72e3876 Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Mon, 6 Jan 2020 14:53:16 -0500 Subject: [PATCH 13/16] Change test_email to prod_email --- bloclink/apps/bis/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 64908dc..4b17881 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -344,7 +344,7 @@ class SubmitQuestionnaire(View): subject = 'BIS - ' + buildingData['address'] if os.environ['ENVIRONMENT'] == 'prod': - msg = EmailMessage(subject, msg_html, from_email, [settings.TEST_EMAIL]) + msg = EmailMessage(subject, msg_html, from_email, [settings.PROD_EMAIL]) msg.content_subtype = "html" msg.attach_file(dest_ppt_file) msg.send() -- GitLab From faaed439ae3b948c03b95139c174ff547e797e37 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 6 Jan 2020 12:01:33 -0800 Subject: [PATCH 14/16] Update requirements to use latest version of BPEngine --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5d260f7..5cccf6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://[YOUR-GITHUB-TOKEN]:x-oauth-basic@github.com/Blocp/bpengine.git@BI-627-BIS-Report +git+https://[YOUR-GITHUB-TOKEN]:x-oauth-basic@github.com/Blocp/bpengine.git@v0.8.6 celery==4.0.2 Django==1.10.6 numpy==1.17.4 -- GitLab From f80ba2967ce99b701ed99e0e595e597911191fe2 Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Mon, 6 Jan 2020 15:20:23 -0500 Subject: [PATCH 15/16] Make AWS creds env variables --- .env.default | 4 +++- bloclink/apps/bis/views.py | 11 ++++++----- bloclink/settings.py | 8 +++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.env.default b/.env.default index 4032767..c2d83f8 100644 --- a/.env.default +++ b/.env.default @@ -18,4 +18,6 @@ CORS_ORIGIN_WHITELIST=$CORS_ORIGIN_WHITELIST BLOCPOWER_PHONE_NUMBER=$BLOCPOWER_PHONE_NUMBER TEST_EMAIL=$TEST_EMAIL PROD_EMAIL=$PROD_EMAIL -FROM_EMAIL=$FROM_EMAIL \ No newline at end of file +FROM_EMAIL=$FROM_EMAIL +AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID +AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ No newline at end of file diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 4b17881..064e453 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -272,8 +272,8 @@ class SubmitQuestionnaire(View): # Store generated report in S3 bucket dest_ppt_file = report.replace(',', '') S3 = boto3.client('s3', - aws_access_key_id ='AKIA3DOHIAZRCHMHILGW', - aws_secret_access_key = '1YrvuGVILZmooLnVSJPhs0zXip3UzNX/PaIV1e3d') + aws_access_key_id = os.environ['AWS_ACCESS_KEY_ID'], + aws_secret_access_key = os.environ['AWS_SECRET_ACCESS_KEY']) BUCKET_NAME = 'blocpower.io' S3_FileName = 'PNA_Reports/'+dest_ppt_file.split('/')[-1] try: @@ -288,7 +288,7 @@ class SubmitQuestionnaire(View): resource = dest_ppt_file.split('/')[-1], last_updated = datetime.now() ).save(using='bis') - + # Sending Emails firstName = put['firstName'] lastName = put['lastName'] @@ -310,11 +310,12 @@ class SubmitQuestionnaire(View): msg.content_subtype = "html" msg.send() - elif surveyId == 2 or surveyId == 3: + # elif surveyId == 2 or surveyId == 3: msg_html = render_to_string('thank_you_email.html', {'firstName': firstName, 'lastName': lastName, 'buildingAddress': buildingAddress, 'phone':settings.BLOCPOWER_PHONE_NUMBER}) msg = EmailMessage('Thank you', msg_html, from_email, [toEmail]) msg.content_subtype = "html" - msg.attach_file(dest_ppt_file) + # We are not sending PPT to the user rn. + # msg.attach_file(dest_ppt_file) msg.send() # Get all building related data diff --git a/bloclink/settings.py b/bloclink/settings.py index c9bf346..2bcc2c9 100644 --- a/bloclink/settings.py +++ b/bloclink/settings.py @@ -34,9 +34,11 @@ PENTAHO_PASSWORD = config('PENTAHO_PASSWORD') # Building Intake Survey URL BIS_URL = config('BIS_URL') BLOCPOWER_PHONE_NUMBER = config('BLOCPOWER_PHONE_NUMBER') -TEST_EMAIL= config('TEST_EMAIL') -PROD_EMAIL= config('PROD_EMAIL') -FROM_EMAIL= config('FROM_EMAIL') +TEST_EMAIL = config('TEST_EMAIL') +PROD_EMAIL = config('PROD_EMAIL') +FROM_EMAIL = config('FROM_EMAIL') +AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID') +AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY') if ENV == 'local': CORS_ORIGIN_WHITELIST = config('CORS_ORIGIN_WHITELIST', cast=Csv()) -- GitLab From 6f5955bd56b596413017f0ebb622b4ae4e7df2f2 Mon Sep 17 00:00:00 2001 From: RujitRaval Date: Mon, 6 Jan 2020 15:54:44 -0500 Subject: [PATCH 16/16] Uncomment condition for Oakland & Milwaukee --- bloclink/apps/bis/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bloclink/apps/bis/views.py b/bloclink/apps/bis/views.py index 064e453..ec583c5 100644 --- a/bloclink/apps/bis/views.py +++ b/bloclink/apps/bis/views.py @@ -310,7 +310,7 @@ class SubmitQuestionnaire(View): msg.content_subtype = "html" msg.send() - # elif surveyId == 2 or surveyId == 3: + elif surveyId == 2 or surveyId == 3: msg_html = render_to_string('thank_you_email.html', {'firstName': firstName, 'lastName': lastName, 'buildingAddress': buildingAddress, 'phone':settings.BLOCPOWER_PHONE_NUMBER}) msg = EmailMessage('Thank you', msg_html, from_email, [toEmail]) msg.content_subtype = "html" -- GitLab