energy-reports-pkg 0.6.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. energy_reports_pkg-0.6.14.dist-info/METADATA +10 -0
  2. energy_reports_pkg-0.6.14.dist-info/RECORD +221 -0
  3. energy_reports_pkg-0.6.14.dist-info/WHEEL +5 -0
  4. energy_reports_pkg-0.6.14.dist-info/top_level.txt +1 -0
  5. mindsett_energy_reports_pkg/config/__init__.py +6 -0
  6. mindsett_energy_reports_pkg/config/email/__init__.py +37 -0
  7. mindsett_energy_reports_pkg/config/monday/__init__.py +8 -0
  8. mindsett_energy_reports_pkg/config/monday/auth/__init__.py +7 -0
  9. mindsett_energy_reports_pkg/config/monday/columns_concerned/__init__.py +22 -0
  10. mindsett_energy_reports_pkg/config/postgresdb/__init__.py +33 -0
  11. mindsett_energy_reports_pkg/config/postgresdb/table/__init__.py +2 -0
  12. mindsett_energy_reports_pkg/config/postgresdb/table_building/__init__.py +1 -0
  13. mindsett_energy_reports_pkg/config/postgresdb/table_building_total/__init__.py +1 -0
  14. mindsett_energy_reports_pkg/config/postgresdb/table_cache/__init__.py +30 -0
  15. mindsett_energy_reports_pkg/config/postgresdb/table_iot/__init__.py +1 -0
  16. mindsett_energy_reports_pkg/config/postgresdb/table_mailing/__init__.py +15 -0
  17. mindsett_energy_reports_pkg/config/postgresdb/table_meta/__init__.py +2 -0
  18. mindsett_energy_reports_pkg/config/postgresdb/table_occupancy/__init__.py +3 -0
  19. mindsett_energy_reports_pkg/config/postgresdb/table_on_off/__init__.py +2 -0
  20. mindsett_energy_reports_pkg/config/postgresdb/table_org/__init__.py +1 -0
  21. mindsett_energy_reports_pkg/config/postgresdb/table_price/__init__.py +2 -0
  22. mindsett_energy_reports_pkg/config/postgresdb/table_schedule/__init__.py +1 -0
  23. mindsett_energy_reports_pkg/config/postgresdb/table_sqm/__init__.py +2 -0
  24. mindsett_energy_reports_pkg/config/postgresdb/table_timezone/__init__.py +2 -0
  25. mindsett_energy_reports_pkg/config/sharepoint/__init__.py +12 -0
  26. mindsett_energy_reports_pkg/config/sharepoint/excel/__init__.py +5 -0
  27. mindsett_energy_reports_pkg/config/sharepoint/excel/columns_concerned/__init__.py +7 -0
  28. mindsett_energy_reports_pkg/config/smtp/__init__.py +10 -0
  29. mindsett_energy_reports_pkg/jobs/databricks_job.py +31 -0
  30. mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/__init__.py +14 -0
  31. mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/launchInteractiveProcess.py +6 -0
  32. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardColumnNotMatch/__init__.py +6 -0
  33. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardNotFound/__init__.py +5 -0
  34. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorException/__init__.py +4 -0
  35. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoColumInBoard/__init__.py +5 -0
  36. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoGroupsInBoard/__init__.py +5 -0
  37. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoItemInGroup/__init__.py +6 -0
  38. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorPageNotSupported/__init__.py +7 -0
  39. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/__init__.py +8 -0
  40. mindsett_energy_reports_pkg/libs/MondayProcessor/__init__.py +40 -0
  41. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardById.py +13 -0
  42. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardLogsById.py +33 -0
  43. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchColumnValueByGroup.py +103 -0
  44. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchGroups.py +19 -0
  45. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConf.py +10 -0
  46. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByBoard.py +83 -0
  47. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByGroup.py +89 -0
  48. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchColumnIdsByName.py +23 -0
  49. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIds.py +30 -0
  50. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIdsMatch.py +20 -0
  51. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/__init__.py +11 -0
  52. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/__init__.py +12 -0
  53. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/__init__.py +11 -0
  54. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/__init__.py +10 -0
  55. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/__init__.py +12 -0
  56. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/__init__.py +10 -0
  57. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/column/__init__.py +2 -0
  58. mindsett_energy_reports_pkg/libs/MondayProcessor/launchInteractiveProcess.py +7 -0
  59. mindsett_energy_reports_pkg/libs/__init__.py +4 -0
  60. mindsett_energy_reports_pkg/libs/cache_return/__init__.py +47 -0
  61. mindsett_energy_reports_pkg/libs/fetch_monday_info/__init__.py +29 -0
  62. mindsett_energy_reports_pkg/libs/fetch_monday_info/load_cf_from_db/__init__.py +17 -0
  63. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/__init__.py +52 -0
  64. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/__init__.py +11 -0
  65. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
  66. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/empty_table/__init__.py +11 -0
  67. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/__init__.py +57 -0
  68. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/get_mailing_list/__init__.py +25 -0
  69. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/__init__.py +50 -0
  70. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/columns_concerned/__init__.py +22 -0
  71. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/get_last_update_time/__init__.py +26 -0
  72. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/__init__.py +27 -0
  73. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/load_cf_from_db/__init__.py +17 -0
  74. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/__init__.py +28 -0
  75. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/__init__.py +11 -0
  76. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
  77. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/empty_table/__init__.py +11 -0
  78. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/__init__.py +13 -0
  79. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/__init__.py +57 -0
  80. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/columns_concerned/__init__.py +8 -0
  81. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/# __init__.py +11 -0
  82. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/__init__.py +19 -0
  83. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/get_mailing_list/__init__.py +10 -0
  84. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/uuid_for_nona/__init__.py +12 -0
  85. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/__init__.py +30 -0
  86. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/get_excel_file_from_link/__init__.py +30 -0
  87. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/load_excel_as_df/__init__.py +45 -0
  88. mindsett_energy_reports_pkg/libs/generate_dag_id/__init__.py +20 -0
  89. mindsett_energy_reports_pkg/libs/get_conn_by_id/__init__.py +42 -0
  90. mindsett_energy_reports_pkg/libs/get_conn_by_id/__version__.py +8 -0
  91. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_airflow/__init__.py +47 -0
  92. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/__init__.py +25 -0
  93. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/__init__.py +17 -0
  94. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/databricks/__init__.py +10 -0
  95. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/local/__init__.py +13 -0
  96. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/__init__.py +15 -0
  97. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/connect_lake_and_fetch_json/__init__.py +19 -0
  98. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/datalake/__init__.py +7 -0
  99. mindsett_energy_reports_pkg/mdl/__init__.py +2 -0
  100. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/__init__.py +119 -0
  101. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_end_time/__init__.py +8 -0
  102. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_period_range/__init__.py +8 -0
  103. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_schedule_records/__init__.py +34 -0
  104. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time/__init__.py +6 -0
  105. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time_co2_barchart/__init__.py +7 -0
  106. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/__init__.py +93 -0
  107. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/email_report/__init__.py +47 -0
  108. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/__init__.py +75 -0
  109. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/__init__.py +13 -0
  110. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/load_energy_price/__init__.py +14 -0
  111. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/__init__.py +24 -0
  112. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_building/__init__.py +19 -0
  113. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_org/__init__.py +13 -0
  114. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/check_and_keep_valid/__init__.py +36 -0
  115. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_sqm/__init__.py +11 -0
  116. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_timezone/__init__.py +11 -0
  117. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/__init__.py +43 -0
  118. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/__init__.py +47 -0
  119. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/__init__.py +40 -0
  120. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/__init__.py +71 -0
  121. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/plot_temperature_graph/__init__.py +35 -0
  122. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/plot_the_legend/__init__.py +26 -0
  123. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/__init__.py +26 -0
  124. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/generate_day_code/__init__.py +18 -0
  125. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/generate_day_code/generate_day_code_list/__init__.py +38 -0
  126. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_label_and_get_pos_bot_range/__init__.py +40 -0
  127. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_label_and_get_pos_bot_range/get_pos_bot_and_ylim/__init__.py +30 -0
  128. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_tick_lim_label_zero_line/__init__.py +23 -0
  129. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/__init__.py +21 -0
  130. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/groupby_date_and_ooh_current_period/__init__.py +39 -0
  131. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/patch_missing_columns_for_ooh_and_sign/__init__.py +18 -0
  132. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/patch_missing_dates/__init__.py +28 -0
  133. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/__init__.py +42 -0
  134. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/__init__.py +66 -0
  135. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/benchmarking_design/__init__.py +194 -0
  136. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/benchmarking_design/ruler_anno_shink_cf/__init__.py +24 -0
  137. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/energy_meter_design/__init__.py +233 -0
  138. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/preprocessing_for_energy_meter_with_benchmarking/__init__.py +23 -0
  139. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/__init__.py +42 -0
  140. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/__init__.py +41 -0
  141. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_avg_action_time/__init__.py +61 -0
  142. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_biggest_ooh/__init__.py +31 -0
  143. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_total_ooh/__init__.py +18 -0
  144. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/preprocessing_for_statement/__init__.py +85 -0
  145. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/__init__.py +29 -0
  146. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/__init__.py +49 -0
  147. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/set_x_label_prepare_xtick/__init__.py +24 -0
  148. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/set_x_tick_and_lim/__init__.py +26 -0
  149. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/setup_y_tick_lim_label_zero_line/__init__.py +31 -0
  150. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/__init__.py +43 -0
  151. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/patch_missing_ooh_periods_sign/__init__.py +23 -0
  152. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/__init__.py +56 -0
  153. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/__init__.py +109 -0
  154. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/colors/__init__.py +28 -0
  155. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/hatches/__init__.py +2 -0
  156. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_centre_pct/__init__.py +28 -0
  157. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/__init__.py +42 -0
  158. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/get_phase_markers/__init__.py +28 -0
  159. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/get_tick_values/__init__.py +44 -0
  160. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/__init__.py +108 -0
  161. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/ruler_anno_shink_cf/__init__.py +29 -0
  162. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/ruler_symbol_cf/__init__.py +35 -0
  163. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/__init__.py +87 -0
  164. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_gap_for_visibility/__init__.py +19 -0
  165. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_to_inner_ring/__init__.py +32 -0
  166. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_values_for_better_visibility/__init__.py +27 -0
  167. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/annotate_pct_on_pies/__init__.py +21 -0
  168. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/generate_pct_fmt/__init__.py +8 -0
  169. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/__init__.py +36 -0
  170. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/__init__.py +50 -0
  171. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_arrow/__init__.py +18 -0
  172. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_name/__init__.py +14 -0
  173. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_pct/__init__.py +44 -0
  174. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_sum/__init__.py +31 -0
  175. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/get_legend_handles/__init__.py +22 -0
  176. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_phases/__init__.py +37 -0
  177. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/__init__.py +26 -0
  178. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/group_and_pivot/__init__.py +24 -0
  179. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/__init__.py +30 -0
  180. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_change_pct_and_sort_and_trim_cols/__init__.py +34 -0
  181. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_entries_to_display/__init__.py +34 -0
  182. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_rank_overall_protect/__init__.py +14 -0
  183. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_subgroup_sum_and_rank/__init__.py +22 -0
  184. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_sum_for_curr_and_prev/__init__.py +20 -0
  185. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/__init__.py +44 -0
  186. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/write_multicell_with_styles.py +30 -0
  187. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/__init__.py +162 -0
  188. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/__init__.py +78 -0
  189. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/__init__.py +32 -0
  190. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/__init__.py +47 -0
  191. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_iot_data/__init__.py +28 -0
  192. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_iot_data/load_iot_data_partition/__init__.py +24 -0
  193. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_metadata/__init__.py +34 -0
  194. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_metadata/get_meta_statement/__init__.py +32 -0
  195. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/query_building_total/__init__.py +40 -0
  196. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/__init__.py +20 -0
  197. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/exchange_group_name_column/__init__.py +10 -0
  198. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/validate_data_not_empty/__init__.py +9 -0
  199. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/select_sites_and_emails/__init__.py +19 -0
  200. mindsett_energy_reports_pkg/mdl/utils_/__init__.py +17 -0
  201. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/__init__.py +11 -0
  202. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/append_df_to_table/__init__.py +29 -0
  203. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/empty_table/__init__.py +11 -0
  204. mindsett_energy_reports_pkg/mdl/utils_/cache_obj/__init__.py +50 -0
  205. mindsett_energy_reports_pkg/mdl/utils_/color_dict/__init__.py +13 -0
  206. mindsett_energy_reports_pkg/mdl/utils_/delete_files_in_directory/__init__.py +15 -0
  207. mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__init__.py +66 -0
  208. mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__version__.py +4 -0
  209. mindsett_energy_reports_pkg/mdl/utils_/generate_time_partition_list/__init__.py +14 -0
  210. mindsett_energy_reports_pkg/mdl/utils_/get_group_with_others/__init__.py +7 -0
  211. mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/__init__.py +37 -0
  212. mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/get_pos_bot_and_ylim/__init__.py +31 -0
  213. mindsett_energy_reports_pkg/mdl/utils_/modify_group_names/__init__.py +17 -0
  214. mindsett_energy_reports_pkg/mdl/utils_/patch_missing_periods/__init__.py +34 -0
  215. mindsett_energy_reports_pkg/mdl/utils_/plot_stacked_barchart/__init__.py +50 -0
  216. mindsett_energy_reports_pkg/mdl/utils_/send_email/__init__.py +73 -0
  217. mindsett_energy_reports_pkg/mdl/utils_/setup_table/__init__.py +40 -0
  218. mindsett_energy_reports_pkg/mdl/utils_/setup_table/check_table_existence/__init__.py +25 -0
  219. mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_new_schema/__init__.py +8 -0
  220. mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_table/__init__.py +73 -0
  221. mindsett_energy_reports_pkg/mdl/utils_/setup_table/empty_table/__init__.py +11 -0
@@ -0,0 +1,30 @@
1
+
2
+
3
+ def get_excel_file_from_link(ctx, sharepoint_link):
4
+
5
+ # get the folder link from the file link
6
+ sharepoint_folder_link = sharepoint_link.rsplit('/', maxsplit=1)[0]
7
+
8
+ # get sharepoint folder
9
+ libraryRoot = ctx.web.get_folder_by_server_relative_path(sharepoint_folder_link)
10
+ ctx.load(libraryRoot)
11
+ ctx.execute_query()
12
+
13
+ # get files in folder
14
+ files_in_folder = libraryRoot.files
15
+ ctx.load(files_in_folder)
16
+ ctx.execute_query()
17
+
18
+ # debug
19
+ # print(f'{files_in_folder = }')
20
+
21
+ # with the condition that there is only one file
22
+ # excel_file = files_in_folder[0]
23
+
24
+ for file in files_in_folder:
25
+ files_url = file.properties['ServerRelativeUrl']
26
+ if files_url == sharepoint_link:
27
+ return file
28
+
29
+ raise Exception('[ERROR]: Cannot find the specified file!')
30
+ # return excel_file
@@ -0,0 +1,45 @@
1
+
2
+ import pandas as pd
3
+ import io
4
+
5
+ def load_excel_as_df(ctx, excel_file, sheet_name=None):
6
+
7
+ if sheet_name is None:
8
+ sheet_name = 0
9
+
10
+ last_update_sys = excel_file.properties['TimeLastModified']
11
+ last_update = pd.Timestamp(last_update_sys, tz='Europe/London').tz_convert(tz='UTC') # assume that the sharepoint system time in as London time
12
+
13
+ # print(f'{last_update = }')
14
+ files_url = excel_file.properties['ServerRelativeUrl']
15
+
16
+ # print(f'{last_update=}')
17
+ # print(f'{files_url=}')
18
+
19
+ # files_url = excel_file
20
+
21
+ # ctx.web.get().execute_query()
22
+
23
+ with io.BytesIO() as data:
24
+ _myfile = (ctx.web.get_file_by_server_relative_path(files_url)
25
+ .download(data)
26
+ .execute_query()
27
+ )
28
+ # print(f"{type(_myfile) = }")
29
+
30
+ data.seek(0)
31
+
32
+ # cols_dtype = {'board_id': str,
33
+ # 'hvac_board_id': str}
34
+
35
+ df_contact = pd.read_excel(data,
36
+ # dtype=cols_dtype,
37
+ sheet_name=sheet_name,)
38
+
39
+ # _myfile = (ctx.web.get_file_by_server_relative_path(files_url)
40
+ # .execute_query()
41
+ # )
42
+
43
+ df_contact['last_update'] = last_update
44
+
45
+ return df_contact
@@ -0,0 +1,20 @@
1
+ import pathlib
2
+
3
+ def generate_dag_id(file):
4
+
5
+ current_path = pathlib.Path(file)
6
+ current_dir = current_path.parents[1]
7
+ current_dir_str = str(current_dir)
8
+
9
+ # directory = current_dir_str.split('_dags')[-1][1:].replace('/', '_')
10
+
11
+ project = current_dir_str.split('_pkg')[0].split('/')[-1]
12
+
13
+ dag_id = project
14
+
15
+ # if directory == '':
16
+ # dag_id = project
17
+ # else:
18
+ # dag_id = f"{project}_{directory}"
19
+
20
+ return dag_id
@@ -0,0 +1,42 @@
1
+
2
+ from .get_conn_by_id_json import get_conn_by_id_json
3
+
4
+ def get_conn_by_id(conn_id,
5
+ account_key=None,
6
+ credential_url=None):
7
+
8
+ # # fetching creds from local filesystem or datalake
9
+ # cred_conn = get_conn_by_id_json(conn_id,
10
+ # credential_url=credential_url)
11
+
12
+ # if cred_conn != None:
13
+ # return cred_conn
14
+ # else:
15
+ # # fetching creds from the airflow environment
16
+ # from .get_conn_by_id_airflow import get_conn_by_id_airflow
17
+
18
+ # cred_conn = get_conn_by_id_airflow(conn_id)
19
+
20
+ # for testing
21
+ cred_conn = None
22
+
23
+ if cred_conn != None:
24
+ return cred_conn
25
+ else:
26
+ # fetching creds from the synapse environment
27
+ from .get_conn_by_id_synapse import get_conn_by_id_synapse
28
+
29
+ if account_key is None:
30
+ try:
31
+ from notebookutils import mssparkutils
32
+ account_key = mssparkutils.credentials.getConnectionStringOrCreds('AzureDataLakeStorageTest')
33
+ except:
34
+ raise Exception('Cannot get a valid account_key from mssparkutils, please provide one for getting credentials in the synapse environment')
35
+
36
+ cred_conn = get_conn_by_id_synapse(conn_id, account_key)
37
+ return cred_conn
38
+
39
+
40
+
41
+
42
+
@@ -0,0 +1,8 @@
1
+
2
+ __version__ = '0.0.3' # can set multiple paths for local and databricks
3
+
4
+ # __version__ = '0.0.2' # being able to get conn from local, airflow, and databricks
5
+
6
+ # __version__ = '0.0.1' # require two functions for getting the conn
7
+
8
+ # __version__ = '0.0.0' # the basic way for getting conn only from airflow
@@ -0,0 +1,47 @@
1
+
2
+ import inspect
3
+ from airflow.hooks.base_hook import BaseHook
4
+ import json
5
+
6
+ def get_conn_by_id_airflow(conn_id):
7
+
8
+ cred_conn = BaseHook.get_connection(conn_id)
9
+
10
+ cred_dict = {}
11
+ for attribute in dir(cred_conn):
12
+ print(cred_conn, 'attr: ', attribute)
13
+
14
+ if not attribute.startswith('__'):
15
+ if not inspect.ismethod(attribute):
16
+ cred_dict[attribute] = getattr(cred_conn, attribute)
17
+ if attribute == 'schema':
18
+ cred_dict['database'] = getattr(cred_conn, attribute)
19
+ elif attribute == 'login':
20
+ cred_dict['username'] = getattr(cred_conn, attribute)
21
+ cred_dict['client_id'] = getattr(cred_conn, attribute)
22
+
23
+ cred_dict['password'] = cred_conn.get_password()
24
+ cred_dict['token'] = cred_conn.get_password()
25
+ cred_dict['api_key'] = cred_conn.get_password()
26
+ cred_dict['secret'] = cred_conn.get_password()
27
+
28
+ cred_extra = cred_conn.get_extra()
29
+
30
+ if len(cred_extra) > 2:
31
+ cred_extra_json = json.loads(cred_extra)
32
+
33
+ cred_dict = {**cred_dict, **cred_extra_json}
34
+
35
+ print('cred_dict: ', cred_dict)
36
+
37
+ return cred_dict
38
+
39
+
40
+
41
+
42
+
43
+ # server = email_conn.host
44
+ # port = email_conn.port
45
+ # send_from = json.loads(email_conn.get_extra())["send_from"]
46
+ # username = email_conn.login
47
+ # password = email_conn.get_password()
@@ -0,0 +1,25 @@
1
+ import json
2
+ from .get_credential_url import get_credential_url
3
+
4
+ def get_conn_by_id_json(conn_id,
5
+ credential_url=None):
6
+
7
+ if credential_url == None:
8
+ credential_url = get_credential_url()
9
+
10
+ if credential_url == None: # if there is no credential_url from localhost or databricks
11
+ return None
12
+
13
+ with open(credential_url) as f:
14
+ credentials = json.load(f)
15
+
16
+
17
+
18
+ for connection in credentials['connections']:
19
+ if connection['connection_id'] == conn_id:
20
+ return connection['secrets']
21
+
22
+ print('[INFO]: cannot found the connection_id!')
23
+ return None # if there is no such credential id yet
24
+
25
+ # raise('cannot found the connection_id!')
@@ -0,0 +1,17 @@
1
+ import os
2
+
3
+ from . import databricks
4
+ from . import local
5
+
6
+ def get_credential_url():
7
+
8
+ for local_credential_url in local.credential_urls:
9
+ if os.path.exists(local_credential_url):
10
+ return local_credential_url
11
+
12
+ for databricks_credential_url in databricks.credential_urls:
13
+ if os.path.exists(databricks_credential_url):
14
+ return databricks_credential_url
15
+
16
+ print("[INFO]: Cannot find credentials from local server or databricks!")
17
+ return None
@@ -0,0 +1,10 @@
1
+
2
+
3
+ # import os
4
+
5
+ # from pathlib import Path
6
+ # cache_directory = os.path.join(os.path.dirname(__file__), '_cache_/')
7
+
8
+ credential_urls = ['/dbfs/FileStore/shared_uploads/x.yang@cloudfmgroup.com/credentials/credentials.json']
9
+
10
+ # print('credential_url: ', credential_url)
@@ -0,0 +1,13 @@
1
+
2
+
3
+ import os
4
+
5
+ # from pathlib import Path
6
+ # cache_directory = os.path.join(os.path.dirname(__file__), '_cache_/')
7
+
8
+ # credential_url = os.path.join(os.path.dirname(__file__), 'credentials.json')
9
+
10
+ credential_urls = ['/Volumes/EXT SSD/Cloudfm Backup/Documents at Cloudfm/Accounts/credentials/credentials.json',
11
+ '/Volumes/macOS 1/Users/Shared/Cloudfm Backup/OneDrive - Cloudfm Integrated Services Ltd - Backup/KTP Project/Cloudfm/Accounts/credentials/credentials.json']
12
+
13
+ # '/dbfs/FileStore/shared_uploads/x.yang@cloudfmgroup.com/credentials_/credentials.json'
@@ -0,0 +1,15 @@
1
+ from . import datalake
2
+ from .connect_lake_and_fetch_json import connect_lake_and_fetch_json
3
+
4
+ def get_conn_by_id_synapse(conn_id, account_key):
5
+
6
+ credentials = connect_lake_and_fetch_json(datalake, account_key)
7
+
8
+ for connection in credentials['connections']:
9
+ if connection['connection_id'] == conn_id:
10
+ return connection['secrets']
11
+
12
+ print('[INFO]: cannot found the connection_id!')
13
+ return None # if there is no such credential id yet
14
+
15
+ # raise('cannot found the connection_id!')
@@ -0,0 +1,19 @@
1
+
2
+ from azure.storage.filedatalake import DataLakeServiceClient
3
+ import io
4
+ import json
5
+
6
+
7
+ def connect_lake_and_fetch_json(datalake, account_key):
8
+
9
+ # connect to the datalake and fetch the json file
10
+ azure_service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format(
11
+ "https", datalake.account_name), credential=account_key)
12
+
13
+ azure_file_system_client = azure_service_client.get_file_system_client(file_system=datalake.container_name)
14
+
15
+ file_client = azure_file_system_client.get_file_client(datalake.file_path)
16
+ data = file_client.download_file().readall()
17
+ json_dict = json.load(io.BytesIO(data))
18
+
19
+ return json_dict
@@ -0,0 +1,7 @@
1
+
2
+
3
+ account_name = f"dlcfmdsamindsettprod"
4
+ container_name= 'uploads'
5
+ file_path = 'energy_report_config/credentials.json'
6
+
7
+ # get the account key from synapse
@@ -0,0 +1,2 @@
1
+
2
+ from .prepare_and_email_reports import prepare_and_email_reports
@@ -0,0 +1,119 @@
1
+ from pathlib import Path
2
+ import os
3
+ import ast
4
+
5
+ class ClientSite:
6
+
7
+ from .get_schedule_records import get_schedule_records
8
+ from .get_period_range import get_period_range
9
+ from .get_start_time import get_start_time
10
+ from .get_start_time_co2_barchart import get_start_time_co2_barchart
11
+ from .get_end_time import get_end_time
12
+
13
+ pct_level_tobe_others = 0.03
14
+ pct_hide = 4 # hide the labels smaller then the value specified by pct_hide
15
+ currency = 'GBP'
16
+ conv_mwh_price = 190
17
+ timezone = 'UTC'
18
+ size_in_sqm = True
19
+
20
+ # setup default backup schedule info
21
+ weekend=7
22
+ working_start_time="08:30:00"
23
+ working_end_time="23:59:59"
24
+
25
+ period_offset_previous = 2 # offset between the current period and the previous finished period
26
+ period_freq = 'W' # M for monthly and W for weekly
27
+ period_offset = 1 # offset between the current period and the most recent finished period
28
+ period_count = 6 # number of period to show in the co2 barchart
29
+ group_name_column_exchange = {} # for some special (usually big) groups, to disclose further details by using its name from another column, e.g. {"Sockets": "circuit_description"}
30
+ group_name_modification = {} # replacement name to make the long and complex name more readable
31
+
32
+ occupancy_available = False
33
+ asset_group = "thing_category"
34
+ fillna_value = "Undefined"
35
+ exception = {'link_type': ['Supply', 'Load to DB', 'Load to Exclude']}
36
+ insight_statements = None # this will decide whether to show the insights or not
37
+
38
+ working_start_time="00:00:00" #Default start and end time, may not be used (it is needed for the functions) if the schedule information from the database
39
+ working_end_time="23:59:00"
40
+ # print('group_name_modification: ', group_name_modification) # debug
41
+ reviewer_emails = ['x.yang@cloudfmgroup.com',
42
+ # 's.goud@cloudfmgroup.com',
43
+ 's.ruthven@cloudfmgroup.com',
44
+ # 'r.patel@cloudfmgroup.com',
45
+ 'd.attoe@cloudfmgroup.com'
46
+ ]
47
+ # reviewer_emails = ['x.yang@cloudfmgroup.com',
48
+ # 's.goud@cloudfmgroup.com',
49
+ # 's.ruthven@cloudfmgroup.com',
50
+ # 'r.patel@cloudfmgroup.com']
51
+ # cloudfm_cc_emails = ['x.yang@cloudfmgroup.com',
52
+ # 's.goud@cloudfmgroup.com',
53
+ # 's.ruthven@cloudfmgroup.com',
54
+ # 'r.patel@cloudfmgroup.com',
55
+ # 'd.attoe@cloudfmgroup.com']
56
+
57
+ # 12 March 2024: [Removed] ["d.attoe@cloudfmgroup.com","s.ruthven@cloudfmgroup.com", "r.patel@cloudfmgroup.com", 's.goud@cloudfmgroup.com']
58
+
59
+ def __init__(self, site_item):
60
+
61
+ site_dict = site_item.squeeze(axis=0).to_dict()
62
+
63
+ # print('site_item: ', site_item)
64
+ # print('site_dict: ', site_dict)
65
+
66
+ # file_path = Path(site_obj.__file__)
67
+
68
+
69
+
70
+ self.site_name = site_dict['building_name'].replace("'","''")
71
+ self.org_name = site_dict['org'].replace("'","''")
72
+
73
+ # if site_dict['bld_name_abbr'] == '':
74
+ # self.bld_name_abbr = self.site_name
75
+ # else:
76
+ # self.bld_name_abbr = site_dict['bld_name_abbr']
77
+
78
+ print('\n' + self.org_name + ' - ' + self.site_name + ': ')
79
+
80
+ if site_dict['group_name_column_exchange'] != '':
81
+ self.group_name_column_exchange = ast.literal_eval(site_dict['group_name_column_exchange'])
82
+
83
+ if site_dict['group_name_modification'] != '':
84
+ self.group_name_modification = ast.literal_eval(site_dict['group_name_modification'])
85
+
86
+ if site_dict['insight_statements'] != '':
87
+ self.insight_statements = ast.literal_eval(site_dict['insight_statements'])
88
+
89
+ # monday_config = ['site_dict']
90
+
91
+ for attribute in site_dict:
92
+ if attribute not in ['building_name',
93
+ 'publish',
94
+ 'testing',
95
+ 'org',
96
+ 'send_to',
97
+ 'mailing_list',
98
+ 'group_name_column_exchange',
99
+ 'group_name_modification',
100
+ 'insight_statements',
101
+ 'last_update']:
102
+
103
+ if 'email' not in attribute:
104
+ setattr(self, attribute, site_dict[attribute])
105
+ # print('debug ClientSite attr: ', attribute, site_dict[attribute])
106
+
107
+ if self.manager_name == '':
108
+ self.manager_name = self.site_name + ' ' + self.org_name
109
+
110
+
111
+ # for attribute in dir(site_obj):
112
+ # if not attribute.startswith('__'):
113
+ # setattr(self, attribute, getattr(site_obj, attribute))
114
+
115
+ # self.manager_emails += self.cloudfm_cc_emails
116
+
117
+ if __name__ == '__main__':
118
+ a = ClientSite()
119
+ print(type(a))
@@ -0,0 +1,8 @@
1
+
2
+
3
+ def get_end_time(self):
4
+
5
+ period_range = self.get_period_range()
6
+ # end_time = period_range.max().start_time # end time of the most recent finished period
7
+ end_time = period_range[-(self.period_offset)].start_time # end time of the offset period
8
+ return end_time
@@ -0,0 +1,8 @@
1
+ import pandas as pd
2
+
3
+ def get_period_range(self):
4
+
5
+ reference_time = pd.Timestamp.now(tz=self.timezone)
6
+ period_range = pd.period_range(end=reference_time, freq=self.period_freq, periods=self.period_count+self.period_offset)
7
+
8
+ return period_range
@@ -0,0 +1,34 @@
1
+
2
+ import pandas as pd
3
+
4
+
5
+ def get_schedule_records(self, db_schedule):
6
+
7
+ # print(f'self.site_name: "{self.site_name}"')
8
+ # print(f'self.org_name: "{self.org_name}"')
9
+
10
+ statement_list = [f"""bs.id = '{self.building_id}'"""]
11
+
12
+ if self.org_name is not None:
13
+ statement_new = f"""os.id = '{self.org_id}'"""
14
+ statement_list.append(statement_new)
15
+ statement_full = " and ".join(statement_list)
16
+
17
+ engine = db_schedule.engine # new installation - The Hub - ENGINE_WH
18
+
19
+ with engine.connect() as conn:
20
+ query = f"""select ss.day
21
+ ,ss.name
22
+ ,ss.start_time
23
+ ,ss.end_time
24
+ ,BTRIM(bs.name) as site_name
25
+ ,BTRIM(os.name) as organisation
26
+ from {db_schedule.table_schedule.name} ss
27
+ join {db_schedule.table_building.name} bs on ss.space_id = bs.id
28
+ join {db_schedule.table_org.name} os on bs.org_id = os.id
29
+ where {statement_full};"""
30
+ df_schedule = pd.read_sql_query(query,
31
+ con=conn) #new installation - The Hub - table_name_wh
32
+
33
+ # print("schedule_query: ", query)
34
+ return df_schedule.to_dict('records')
@@ -0,0 +1,6 @@
1
+
2
+ def get_start_time(self):
3
+
4
+ period_range = self.get_period_range()
5
+ start_time = period_range[-(self.period_offset_previous+1)].start_time # start time of the (previous) period to be compared
6
+ return start_time
@@ -0,0 +1,7 @@
1
+
2
+
3
+ def get_start_time_co2_barchart(self):
4
+
5
+ period_range = self.get_period_range()
6
+ start_time_co2_barchart = period_range.min().start_time # start time of the first bar in the co2 barchart
7
+ return start_time_co2_barchart
@@ -0,0 +1,93 @@
1
+
2
+ import os
3
+ import pandas as pd
4
+
5
+ pd.options.mode.chained_assignment = None
6
+
7
+ from .prepare_report import prepare_report
8
+ from .email_report import email_report
9
+ from .ClientSite import ClientSite
10
+ from .load_config import load_config
11
+ from .select_sites_and_emails import select_sites_and_emails
12
+
13
+ from mdl.utils_ import (
14
+ delete_files_in_directory,
15
+ setup_table
16
+ )
17
+
18
+ def prepare_and_email_reports(cf,
19
+ mode='review',
20
+ debug=False,
21
+ sync_source=None,
22
+ cache_in_memory=False,
23
+ cache_directory=None):
24
+
25
+ if cache_in_memory:
26
+ report_file_folder = None
27
+ directory_to_savefile = None
28
+ else:
29
+ if cache_directory == None:
30
+ cache_directory = os.path.join(os.path.dirname(__file__), '_cache_/')
31
+
32
+ report_file_folder = os.path.join(cache_directory, '_cached_reports_/')
33
+ directory_to_savefile = os.path.join(cache_directory, '_cached_files_/')
34
+
35
+ setup_table(cf.postgresdb.engine,
36
+ cf.postgresdb.table_mailing.name,
37
+ cf.postgresdb.table_mailing.columns_dict,
38
+ hypertable=cf.postgresdb.table_mailing.hypertable)
39
+
40
+ setup_table(cf.postgresdb.engine,
41
+ cf.postgresdb.table_cache.name,
42
+ cf.postgresdb.table_cache.columns_dict,
43
+ hypertable=cf.postgresdb.table_cache.hypertable)
44
+
45
+ # get contacts from db
46
+
47
+ df_contact = load_config(cf.postgresdb.engine,
48
+ cf.sharepoint,
49
+ cf.postgresdb.table_org.name,
50
+ cf.postgresdb.table_building.name,
51
+ cf.postgresdb.table_timezone.name,
52
+ cf.postgresdb.table_sqm.name,
53
+ cf.postgresdb.table_price.name,
54
+ cf.postgresdb.table_cache.name,
55
+ list(cf.postgresdb.table_cache.columns_dict),
56
+ sync_source=sync_source)
57
+
58
+ df_contact_select = select_sites_and_emails(df_contact, mode, cf.email.reviewer_emails)
59
+
60
+ # print(f'{df_contact_select=}')
61
+
62
+ # quit()
63
+ for _, row in df_contact_select.iterrows():
64
+
65
+ site_obj = ClientSite(row)
66
+ df_receivers = pd.DataFrame({'email': row['send_to']})
67
+
68
+ if df_receivers['email'].nunique() > 0:
69
+
70
+ file_path_or_obj_dict, current_period_obj = prepare_report(cf, site_obj,
71
+ debug=debug,
72
+ report_file_folder=report_file_folder,
73
+ directory_to_savefile=directory_to_savefile)
74
+
75
+ # print('row: ', row)
76
+ # print("row['send_to']: ", row['send_to'])
77
+
78
+ df_receivers = pd.DataFrame({'email': row['send_to']})
79
+ df_receivers['name'] = site_obj.manager_name
80
+
81
+ receivers = df_receivers.to_dict('records')
82
+
83
+ # print('receivers: ', receivers)
84
+
85
+ # quit()
86
+
87
+ email_report(receivers, cf.smtp, cf.email, current_period_obj, file_path_or_obj_dict)
88
+ else:
89
+ print(f'{site_obj.site_name} - {site_obj.site_name}: no email address to send to!')
90
+
91
+ if not cache_in_memory:
92
+ delete_files_in_directory(report_file_folder, ignore=['__init__.py'])
93
+ delete_files_in_directory(directory_to_savefile, ignore=['__init__.py'])
@@ -0,0 +1,47 @@
1
+
2
+ from mdl.utils_ import (
3
+ send_email,
4
+ )
5
+ import jinja2
6
+ import pandas as pd
7
+
8
+ def email_report(receivers, smtp, email, current_period_obj, file_path_or_obj_dict):
9
+
10
+ for receiver in receivers:
11
+
12
+ send_to = [receiver['email']]
13
+
14
+ environment = jinja2.Environment()
15
+ context = {}
16
+
17
+ period_type = current_period_obj.freqstr[0]
18
+
19
+ if period_type == "W":
20
+ # current_period_str = (current_period_obj).strftime("Week %W, %Y")
21
+ # add 1 week to the current_period_obj so that the start week is not Week 00
22
+ period_week_str = current_period_obj.strftime('%W')
23
+ period_year_str = current_period_obj.strftime('%Y')
24
+ current_period_str = f'Week {(int(period_week_str)+1):02d}, {period_year_str}'
25
+
26
+ else:
27
+ current_period_str = current_period_obj.strftime("Month %b %Y")
28
+ context['current_period_str'] = current_period_str
29
+ context['receiver_name'] = receiver['name']
30
+
31
+
32
+ subject_template = environment.from_string(email.subject)
33
+ email_subject = subject_template.render(ct=context)
34
+
35
+ message_template = environment.from_string(email.message)
36
+ email_message = message_template.render(ct=context)
37
+
38
+ # file_path_or_obj_dict = {filename: file_path/file_obj}
39
+
40
+ send_email(smtp.send_from, send_to,
41
+ email_subject, email_message,
42
+ # signature=email.signature,
43
+ files=file_path_or_obj_dict,
44
+ server=smtp.server,
45
+ port=smtp.port,
46
+ username=smtp.username,
47
+ password=smtp.password)