gov-uk-dashboards 20.0.0__tar.gz → 21.0.0__tar.gz

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 (119) hide show
  1. {gov_uk_dashboards-20.0.0/gov_uk_dashboards.egg-info → gov_uk_dashboards-21.0.0}/PKG-INFO +1 -1
  2. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/display_chart_or_table_with_header.py +6 -0
  3. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/get_chart_for_download.py +14 -1
  4. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/time_series_chart.py +3 -0
  5. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/download_functions/convert_fig_to_image_and_download.py +1 -1
  6. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/download_functions/download_csv_with_headers.py +4 -3
  7. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0/gov_uk_dashboards.egg-info}/PKG-INFO +1 -1
  8. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/setup.py +1 -1
  9. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/LICENSE +0 -0
  10. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/MANIFEST.in +0 -0
  11. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/README.md +0 -0
  12. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/__init__.py +0 -0
  13. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/__init__.py +0 -0
  14. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/attach-event-to-dash.js +0 -0
  15. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/custom_map_style_functions.js +0 -0
  16. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/dashboard.css +0 -0
  17. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/fonts/bold-affa96571d-v2.woff +0 -0
  18. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  19. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  20. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  21. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/get_assets_folder.py +0 -0
  22. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/govuk-frontend-3.14.0.min.js +0 -0
  23. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/DLUHC_WHITE_Master_AW_sm.png +0 -0
  24. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/MHCLG-favicon.png +0 -0
  25. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/MHCLG_favicon.png +0 -0
  26. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/dcms_coatofarms.png +0 -0
  27. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/dluhc_favicon.ico +0 -0
  28. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/gov_favicon.ico +0 -0
  29. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/govuk-crest.svg +0 -0
  30. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/hm-government-logo.png +0 -0
  31. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/mhclg_coat_of_arms.png +0 -0
  32. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/mhclg_white_no_background.png +0 -0
  33. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/MedianAbsolute.png +0 -0
  34. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/how_to_1_selecting_data.png +0 -0
  35. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/how_to_2_viewing_tabs.png +0 -0
  36. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/how_to_3_viewing_charts.png +0 -0
  37. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/how_to_4_viewing_trends.png +0 -0
  38. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/images/oflog/how_to_5_viewing_tables.png +0 -0
  39. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/mobile-nav.js +0 -0
  40. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/topojson/usa_110m.json +0 -0
  41. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/assets/topojson/world_110m.json +0 -0
  42. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/axes.py +0 -0
  43. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/colours.py +0 -0
  44. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/__init__.py +0 -0
  45. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/__init__.py +0 -0
  46. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/apply_and_reset_filters_buttons.py +0 -0
  47. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/banners.py +0 -0
  48. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/card.py +0 -0
  49. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/card_full_width.py +0 -0
  50. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/collapsible_panel.py +0 -0
  51. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/comparison_la_filter_button.py +0 -0
  52. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/context_banner.py +0 -0
  53. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/dashboard_container.py +0 -0
  54. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/details.py +0 -0
  55. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/download_button.py +0 -0
  56. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/filter_panel.py +0 -0
  57. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/footer.py +0 -0
  58. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/graph.py +0 -0
  59. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/header.py +0 -0
  60. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/heading.py +0 -0
  61. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/home_page_link_button.py +0 -0
  62. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/html_list.py +0 -0
  63. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/key_value_pair.py +0 -0
  64. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/main_content.py +0 -0
  65. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/navbar.py +0 -0
  66. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/no_data_message.py +0 -0
  67. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/notification_banner.py +0 -0
  68. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/paragraph.py +0 -0
  69. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/phase_banner.py +0 -0
  70. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/row_component.py +0 -0
  71. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/side_navbar.py +0 -0
  72. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/table.py +0 -0
  73. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/tooltip.py +0 -0
  74. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/tooltip_title.py +0 -0
  75. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/visualisation_commentary.py +0 -0
  76. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/visualisation_title.py +0 -0
  77. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/dash/warning_text.py +0 -0
  78. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/__init__.py +0 -0
  79. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/generate_dash_graph_from_figure.py +0 -0
  80. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/plotting_helper_functions.py +0 -0
  81. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/helpers/update_layout_bgcolor_margin.py +0 -0
  82. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/leaflet/__init__.py +0 -0
  83. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/leaflet/leaflet_choropleth_map.py +0 -0
  84. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/__init__.py +0 -0
  85. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/captioned_figure.py +0 -0
  86. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/choropleth_map.py +0 -0
  87. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/enums.py +0 -0
  88. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/components/plotly/stacked_barchart.py +0 -0
  89. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/constants.py +0 -0
  90. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/__init__.py +0 -0
  91. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/chart_data.py +0 -0
  92. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/enums/__init__.py +0 -0
  93. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/enums/dash_patterns.py +0 -0
  94. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/line_chart.py +0 -0
  95. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/styles/__init__.py +0 -0
  96. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/figures/styles/line_style.py +0 -0
  97. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/formatting/__init__.py +0 -0
  98. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/formatting/human_readable.py +0 -0
  99. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/formatting/number_formatting.py +0 -0
  100. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/formatting/round_and_add_prefix_and_suffix.py +0 -0
  101. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/formatting/rounding.py +0 -0
  102. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/__init__.py +0 -0
  103. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/dap/__init__.py +0 -0
  104. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/dap/dap_deployment.py +0 -0
  105. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/dap/get_dataframe_from_cds.py +0 -0
  106. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/datetime_functions/__init__.py +0 -0
  107. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/datetime_functions/datetime_functions.py +0 -0
  108. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/download_functions/__init__.py +0 -0
  109. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/enable_basic_auth.py +0 -0
  110. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/http_headers.py +0 -0
  111. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/lib/logging.py +0 -0
  112. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/symbols.py +0 -0
  113. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/template.html +0 -0
  114. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards/template.py +0 -0
  115. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards.egg-info/SOURCES.txt +0 -0
  116. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards.egg-info/dependency_links.txt +0 -0
  117. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards.egg-info/requires.txt +0 -0
  118. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/gov_uk_dashboards.egg-info/top_level.txt +0 -0
  119. {gov_uk_dashboards-20.0.0 → gov_uk_dashboards-21.0.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gov_uk_dashboards
3
- Version: 20.0.0
3
+ Version: 21.0.0
4
4
  Summary: Provides access to functionality common to creating a data dashboard.
5
5
  Author: Department for Levelling Up, Housing and Communities
6
6
  Description-Content-Type: text/markdown
@@ -7,14 +7,18 @@ from gov_uk_dashboards.components.dash.download_button import (
7
7
  create_download_button_with_icon,
8
8
  )
9
9
  from gov_uk_dashboards.components.dash.heading import HeadingSizes
10
+ from gov_uk_dashboards.components.dash.paragraph import paragraph
10
11
 
11
12
 
13
+ # pylint: disable=too-many-arguments
14
+ # pylint: disable=too-many-positional-arguments
12
15
  def display_chart_or_table_with_header(
13
16
  chart_or_table: Component,
14
17
  heading: str = None,
15
18
  sub_heading: str = None,
16
19
  download_button_id: str = None,
17
20
  download_data_button_id: str = None,
21
+ footnote: str = None,
18
22
  ) -> html.Div:
19
23
  """Generate the wrapping information/header for a chart or table.
20
24
 
@@ -25,6 +29,7 @@ def display_chart_or_table_with_header(
25
29
  download_button_id (str, optional): id for download button if required. Defaults to None.
26
30
  if None then the button will not be included.
27
31
  download_data_button_id (str, optional): the id to be applied to the download data button.
32
+ footnote (str, optional): the footnote to be added to charts and downloads.
28
33
 
29
34
  Returns:
30
35
  html.Div: Div containing Header and chart/table.
@@ -50,6 +55,7 @@ def display_chart_or_table_with_header(
50
55
  ]
51
56
  ),
52
57
  chart_or_table,
58
+ html.Div([paragraph(footnote)], style={"padding-top": "20px"}),
53
59
  html.Div(
54
60
  (
55
61
  [
@@ -6,6 +6,7 @@ def get_chart_for_download(self, fig):
6
6
  """Returns a fig with title and subtitle for download as png"""
7
7
  main_title = self.title_data[MAIN_TITLE]
8
8
  subtitle = self.title_data[SUBTITLE]
9
+ footnote = self.footnote
9
10
 
10
11
  fig.update_layout(
11
12
  title={
@@ -16,6 +17,18 @@ def get_chart_for_download(self, fig):
16
17
  title_subtitle={
17
18
  "text": f"<b><span style='color: black; margin: 0px 0px 5px'>{subtitle}</span></b>"
18
19
  },
19
- margin={"t": 100},
20
+ annotations=[
21
+ {
22
+ "text": f"<span style='color: black; font-size: 18px;'>{footnote}</span>",
23
+ "x": -0.01,
24
+ "y": -0.4, # Bottom of the plotting area
25
+ "xref": "paper",
26
+ "yref": "paper",
27
+ "xanchor": "left",
28
+ "yanchor": "top",
29
+ "showarrow": False,
30
+ "align": "left",
31
+ }
32
+ ],
20
33
  )
21
34
  return fig
@@ -82,6 +82,7 @@ class TimeSeriesChart:
82
82
  number_of_traces_colour_shift_dict: Optional[dict] = None,
83
83
  additional_line: Optional[dict] = None,
84
84
  hover_distance: Optional[int] = 1,
85
+ footnote: Optional[str] = None,
85
86
  ):
86
87
  self.title_data = title_data
87
88
  self.y_axis_column = y_axis_column
@@ -112,6 +113,7 @@ class TimeSeriesChart:
112
113
  self.hover_distance = hover_distance
113
114
  self.colour_list = self._get_colour_list()
114
115
  self.fig = self.create_time_series_chart()
116
+ self.footnote = footnote
115
117
 
116
118
  def get_time_series_chart(self) -> html.Div:
117
119
  """Creates and returns time series chart for display on application.
@@ -130,6 +132,7 @@ class TimeSeriesChart:
130
132
  self.title_data[SUBTITLE],
131
133
  self.download_chart_button_id,
132
134
  self.download_data_button_id,
135
+ self.footnote,
133
136
  )
134
137
 
135
138
  def is_json_serializable(self, value):
@@ -9,7 +9,7 @@ def convert_fig_to_image_and_download(fig: go.Figure, name: str):
9
9
  """Converts a given Plotly figure to a PNG image and returns a Dash component
10
10
  for downloading the image.
11
11
  """
12
- fig.update_layout(margin={"t": 150, "b": 100, "l": 100, "r": 50})
12
+ fig.update_layout(margin={"t": 150, "b": 250, "l": 100, "r": 50})
13
13
 
14
14
  filename = f"{name}-chart.png"
15
15
  img_bytes = pio.to_image(fig, format="png", width=1600, height=800)
@@ -38,7 +38,7 @@ def download_csv_with_headers(
38
38
  } # range is missing columns in first df compared to max columns across all dfs
39
39
 
40
40
  subtitle = list_of_df_title_subtitle_dicts[0]["subtitle"]
41
-
41
+ footnote = list_of_df_title_subtitle_dicts[0]["footnote"]
42
42
  header_data = [
43
43
  {column_list[0]: "Date downloaded: " + get_todays_date_for_downloaded_csv()},
44
44
  *(
@@ -53,6 +53,7 @@ def download_csv_with_headers(
53
53
  ), # Uses unpacking (*) to add the subtitle row if subtitle is not None. If subtitle is
54
54
  # None, it unpacks an empty list, effectively skipping the row.
55
55
  {column_list[0]: None}, # Blank row
56
+ *([{column_list[0]: footnote}] if footnote is not None else []),
56
57
  {**column_dict, **blank_dict},
57
58
  ]
58
59
 
@@ -60,12 +61,11 @@ def download_csv_with_headers(
60
61
  header_data = [{column_list[0]: sensitivity_label}] + header_data
61
62
 
62
63
  pl.DataFrame(header_data).write_csv(csv_buffer, include_header=False)
63
-
64
64
  for i, data in enumerate(list_of_df_title_subtitle_dicts):
65
65
  df = data["df"]
66
66
  title = data["title"]
67
67
  subtitle = data["subtitle"]
68
-
68
+ footnote = data.get("footnote")
69
69
  if i > 0 and title is not None:
70
70
  column_dict = {column_name: column_name for column_name in list(df.columns)}
71
71
  header_data = [
@@ -75,6 +75,7 @@ def download_csv_with_headers(
75
75
  ), # Uses unpacking (*) to add the subtitle row if subtitle is not None. If
76
76
  # subtitle is None, it unpacks an empty list, effectively skipping the row.
77
77
  {column_list[0]: None}, # Blank row
78
+ *([{column_list[0]: footnote}] if footnote is not None else []),
78
79
  ]
79
80
  pl.DataFrame(header_data).write_csv(csv_buffer, include_header=False)
80
81
  df.write_csv(csv_buffer, include_header=i > 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gov_uk_dashboards
3
- Version: 20.0.0
3
+ Version: 21.0.0
4
4
  Summary: Provides access to functionality common to creating a data dashboard.
5
5
  Author: Department for Levelling Up, Housing and Communities
6
6
  Description-Content-Type: text/markdown
@@ -10,7 +10,7 @@ setup(
10
10
  author="Department for Levelling Up, Housing and Communities",
11
11
  description="Provides access to functionality common to creating a data dashboard.",
12
12
  name="gov_uk_dashboards",
13
- version="20.0.0",
13
+ version="21.0.0",
14
14
  long_description=long_description,
15
15
  long_description_content_type="text/markdown",
16
16
  packages=find_packages(),