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.
- energy_reports_pkg-0.6.14.dist-info/METADATA +10 -0
- energy_reports_pkg-0.6.14.dist-info/RECORD +221 -0
- energy_reports_pkg-0.6.14.dist-info/WHEEL +5 -0
- energy_reports_pkg-0.6.14.dist-info/top_level.txt +1 -0
- mindsett_energy_reports_pkg/config/__init__.py +6 -0
- mindsett_energy_reports_pkg/config/email/__init__.py +37 -0
- mindsett_energy_reports_pkg/config/monday/__init__.py +8 -0
- mindsett_energy_reports_pkg/config/monday/auth/__init__.py +7 -0
- mindsett_energy_reports_pkg/config/monday/columns_concerned/__init__.py +22 -0
- mindsett_energy_reports_pkg/config/postgresdb/__init__.py +33 -0
- mindsett_energy_reports_pkg/config/postgresdb/table/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_building/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_building_total/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_cache/__init__.py +30 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_iot/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_mailing/__init__.py +15 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_meta/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_occupancy/__init__.py +3 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_on_off/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_org/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_price/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_schedule/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_sqm/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_timezone/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/sharepoint/__init__.py +12 -0
- mindsett_energy_reports_pkg/config/sharepoint/excel/__init__.py +5 -0
- mindsett_energy_reports_pkg/config/sharepoint/excel/columns_concerned/__init__.py +7 -0
- mindsett_energy_reports_pkg/config/smtp/__init__.py +10 -0
- mindsett_energy_reports_pkg/jobs/databricks_job.py +31 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/__init__.py +14 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/launchInteractiveProcess.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardColumnNotMatch/__init__.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardNotFound/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorException/__init__.py +4 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoColumInBoard/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoGroupsInBoard/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoItemInGroup/__init__.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorPageNotSupported/__init__.py +7 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/__init__.py +8 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/__init__.py +40 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardById.py +13 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardLogsById.py +33 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchColumnValueByGroup.py +103 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchGroups.py +19 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConf.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByBoard.py +83 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByGroup.py +89 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchColumnIdsByName.py +23 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIds.py +30 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIdsMatch.py +20 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/column/__init__.py +2 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/launchInteractiveProcess.py +7 -0
- mindsett_energy_reports_pkg/libs/__init__.py +4 -0
- mindsett_energy_reports_pkg/libs/cache_return/__init__.py +47 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/load_cf_from_db/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/__init__.py +52 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/__init__.py +57 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/get_mailing_list/__init__.py +25 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/__init__.py +50 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/columns_concerned/__init__.py +22 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/get_last_update_time/__init__.py +26 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/__init__.py +27 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/load_cf_from_db/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/__init__.py +28 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/__init__.py +13 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/__init__.py +57 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/columns_concerned/__init__.py +8 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/# __init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/__init__.py +19 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/get_mailing_list/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/uuid_for_nona/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/__init__.py +30 -0
- 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
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/load_excel_as_df/__init__.py +45 -0
- mindsett_energy_reports_pkg/libs/generate_dag_id/__init__.py +20 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/__init__.py +42 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/__version__.py +8 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_airflow/__init__.py +47 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/__init__.py +25 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/databricks/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/local/__init__.py +13 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/__init__.py +15 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/connect_lake_and_fetch_json/__init__.py +19 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/datalake/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/__init__.py +2 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/__init__.py +119 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_end_time/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_period_range/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_schedule_records/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time/__init__.py +6 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time_co2_barchart/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/__init__.py +93 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/email_report/__init__.py +47 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/__init__.py +75 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/load_energy_price/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_building/__init__.py +19 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_org/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/check_and_keep_valid/__init__.py +36 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_sqm/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_timezone/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/__init__.py +43 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/__init__.py +47 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/__init__.py +40 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/__init__.py +42 -0
- 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
- 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
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/__init__.py +42 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/__init__.py +41 -0
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/preprocessing_for_statement/__init__.py +85 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/__init__.py +29 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/__init__.py +49 -0
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/__init__.py +43 -0
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/__init__.py +56 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_phases/__init__.py +37 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/__init__.py +26 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/__init__.py +44 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/write_multicell_with_styles.py +30 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/__init__.py +162 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/__init__.py +78 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/__init__.py +32 -0
- 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
- 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
- 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
- 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
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/query_building_total/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/__init__.py +20 -0
- 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
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/validate_data_not_empty/__init__.py +9 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/select_sites_and_emails/__init__.py +19 -0
- mindsett_energy_reports_pkg/mdl/utils_/__init__.py +17 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_obj/__init__.py +50 -0
- mindsett_energy_reports_pkg/mdl/utils_/color_dict/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/utils_/delete_files_in_directory/__init__.py +15 -0
- mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__init__.py +66 -0
- mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__version__.py +4 -0
- mindsett_energy_reports_pkg/mdl/utils_/generate_time_partition_list/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_group_with_others/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/__init__.py +37 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/get_pos_bot_and_ylim/__init__.py +31 -0
- mindsett_energy_reports_pkg/mdl/utils_/modify_group_names/__init__.py +17 -0
- mindsett_energy_reports_pkg/mdl/utils_/patch_missing_periods/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/utils_/plot_stacked_barchart/__init__.py +50 -0
- mindsett_energy_reports_pkg/mdl/utils_/send_email/__init__.py +73 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/check_table_existence/__init__.py +25 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_new_schema/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_table/__init__.py +73 -0
- 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!')
|
mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/__init__.py
ADDED
@@ -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,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,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,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)
|