django-advanced-report-builder 1.2.9__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 (360) hide show
  1. advanced_report_builder/.DS_Store +0 -0
  2. advanced_report_builder/.ruff_cache/.gitignore +2 -0
  3. advanced_report_builder/.ruff_cache/0.11.9/16555798982502606642 +0 -0
  4. advanced_report_builder/.ruff_cache/CACHEDIR.TAG +1 -0
  5. advanced_report_builder/__init__.py +0 -0
  6. advanced_report_builder/admin.py +264 -0
  7. advanced_report_builder/apps.py +7 -0
  8. advanced_report_builder/column_types.py +26 -0
  9. advanced_report_builder/columns.py +296 -0
  10. advanced_report_builder/customise.py +2 -0
  11. advanced_report_builder/data_merge/__init__.py +0 -0
  12. advanced_report_builder/data_merge/utils.py +112 -0
  13. advanced_report_builder/data_merge/widget.py +30 -0
  14. advanced_report_builder/duplicate.py +171 -0
  15. advanced_report_builder/exceptions.py +9 -0
  16. advanced_report_builder/field_types.py +466 -0
  17. advanced_report_builder/field_utils.py +401 -0
  18. advanced_report_builder/filter_query.py +862 -0
  19. advanced_report_builder/form_utils.py +12 -0
  20. advanced_report_builder/generate_series.py +14 -0
  21. advanced_report_builder/globals.py +276 -0
  22. advanced_report_builder/includes.py +72 -0
  23. advanced_report_builder/migrations/0001_initial.py +246 -0
  24. advanced_report_builder/migrations/0002_auto_20220209_1657.py +23 -0
  25. advanced_report_builder/migrations/0003_auto_20220215_1219.py +42 -0
  26. advanced_report_builder/migrations/0004_customreport.py +27 -0
  27. advanced_report_builder/migrations/0005_auto_20220303_0958.py +84 -0
  28. advanced_report_builder/migrations/0006_auto_20220310_1147.py +32 -0
  29. advanced_report_builder/migrations/0007_auto_20220322_1939.py +23 -0
  30. advanced_report_builder/migrations/0008_auto_20220404_1144.py +28 -0
  31. advanced_report_builder/migrations/0009_auto_20230428_1554.py +53 -0
  32. advanced_report_builder/migrations/0010_auto_20230428_2033.py +23 -0
  33. advanced_report_builder/migrations/0011_auto_20230620_1449.py +23 -0
  34. advanced_report_builder/migrations/0012_auto_20230718_1642.py +24 -0
  35. advanced_report_builder/migrations/0013_reportqueryorder.py +30 -0
  36. advanced_report_builder/migrations/0014_auto_20240706_2207.py +24 -0
  37. advanced_report_builder/migrations/0015_report_user_created_report_user_updated.py +26 -0
  38. advanced_report_builder/migrations/0016_calendarreport_dashboardreport_options_and_more.py +74 -0
  39. advanced_report_builder/migrations/0017_alter_barchartreport_options_and_more.py +57 -0
  40. advanced_report_builder/migrations/0018_reportquery_target_target_period_type.py +24 -0
  41. advanced_report_builder/migrations/0019_multicellstyle_and_more.py +107 -0
  42. advanced_report_builder/migrations/0020_alter_multicellstyle_font_size.py +18 -0
  43. advanced_report_builder/migrations/0021_multivalueheldquery_and_more.py +36 -0
  44. advanced_report_builder/migrations/0022_dashboardreport_show_options_report_template_style_and_more.py +44 -0
  45. advanced_report_builder/migrations/0023_rename_colour_target_default_colour_and_more.py +41 -0
  46. advanced_report_builder/migrations/0024_alter_target_period_type.py +18 -0
  47. advanced_report_builder/migrations/__init__.py +0 -0
  48. advanced_report_builder/models.py +954 -0
  49. advanced_report_builder/report_builder.py +28 -0
  50. advanced_report_builder/signals.py +3 -0
  51. advanced_report_builder/static/.DS_Store +0 -0
  52. advanced_report_builder/static/advanced_report_builder/.DS_Store +0 -0
  53. advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.esm.js +10553 -0
  54. advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.js +13190 -0
  55. advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.min.js +13 -0
  56. advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-adapter-moment.min.js +8 -0
  57. advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-plugin-datalabels.min.js +7 -0
  58. advanced_report_builder/static/advanced_report_builder/chart-js/js/chunks/helpers.segment.js +2499 -0
  59. advanced_report_builder/static/advanced_report_builder/chart-js/js/helpers.esm.js +7 -0
  60. advanced_report_builder/static/advanced_report_builder/d3/js/d3.js +20196 -0
  61. advanced_report_builder/static/advanced_report_builder/d3/js/d3.min.js +2 -0
  62. advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.js +6087 -0
  63. advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.min.js +2 -0
  64. advanced_report_builder/static/advanced_report_builder/dashboard/js/dashboard.js +19 -0
  65. advanced_report_builder/static/advanced_report_builder/dot/js/.gitignore +31 -0
  66. advanced_report_builder/static/advanced_report_builder/dot/js/.travis.yml +9 -0
  67. advanced_report_builder/static/advanced_report_builder/dot/js/LICENSE-DOT.txt +24 -0
  68. advanced_report_builder/static/advanced_report_builder/dot/js/README.md +90 -0
  69. advanced_report_builder/static/advanced_report_builder/dot/js/bin/dot-packer +52 -0
  70. advanced_report_builder/static/advanced_report_builder/dot/js/bower.json +21 -0
  71. advanced_report_builder/static/advanced_report_builder/dot/js/doT.js +141 -0
  72. advanced_report_builder/static/advanced_report_builder/dot/js/doT.min.js +8 -0
  73. advanced_report_builder/static/advanced_report_builder/dot/js/doU.js +56 -0
  74. advanced_report_builder/static/advanced_report_builder/dot/js/index.js +143 -0
  75. advanced_report_builder/static/advanced_report_builder/dot/js/package.json +46 -0
  76. advanced_report_builder/static/advanced_report_builder/fullcalendar/.DS_Store +0 -0
  77. advanced_report_builder/static/advanced_report_builder/fullcalendar/LICENSE.txt +20 -0
  78. advanced_report_builder/static/advanced_report_builder/fullcalendar/README.md +10 -0
  79. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/LICENSE.txt +20 -0
  80. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/README.md +8 -0
  81. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/af.js +30 -0
  82. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-dz.js +31 -0
  83. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-kw.js +31 -0
  84. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-ly.js +31 -0
  85. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-ma.js +31 -0
  86. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-sa.js +31 -0
  87. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar-tn.js +31 -0
  88. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ar.js +31 -0
  89. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/bg.js +31 -0
  90. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/bs.js +32 -0
  91. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ca.js +30 -0
  92. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/cs.js +32 -0
  93. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/da.js +30 -0
  94. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/de.js +33 -0
  95. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/el.js +30 -0
  96. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/en-au.js +17 -0
  97. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/en-gb.js +17 -0
  98. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/en-nz.js +17 -0
  99. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/es-us.js +30 -0
  100. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/es.js +30 -0
  101. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/et.js +32 -0
  102. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/eu.js +30 -0
  103. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/fa.js +33 -0
  104. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/fi.js +30 -0
  105. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/fr-ca.js +27 -0
  106. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/fr-ch.js +31 -0
  107. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/fr.js +31 -0
  108. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/gl.js +30 -0
  109. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/he.js +27 -0
  110. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/hi.js +32 -0
  111. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/hr.js +32 -0
  112. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/hu.js +30 -0
  113. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/id.js +30 -0
  114. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/is.js +30 -0
  115. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/it.js +32 -0
  116. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ja.js +28 -0
  117. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ka.js +32 -0
  118. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/kk.js +32 -0
  119. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ko.js +26 -0
  120. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/lb.js +30 -0
  121. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/lt.js +30 -0
  122. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/lv.js +32 -0
  123. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/mk.js +28 -0
  124. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ms.js +32 -0
  125. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/nb.js +30 -0
  126. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/nl.js +30 -0
  127. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/nn.js +30 -0
  128. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/pl.js +30 -0
  129. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/pt-br.js +28 -0
  130. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/pt.js +30 -0
  131. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ro.js +32 -0
  132. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/ru.js +32 -0
  133. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sk.js +32 -0
  134. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sl.js +30 -0
  135. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sq.js +32 -0
  136. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sr-cyrl.js +32 -0
  137. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sr.js +32 -0
  138. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/sv.js +30 -0
  139. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/th.js +25 -0
  140. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/tr.js +30 -0
  141. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/uk.js +32 -0
  142. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/vi.js +32 -0
  143. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/zh-cn.js +33 -0
  144. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales/zh-tw.js +26 -0
  145. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales-all.js +1348 -0
  146. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/locales-all.min.js +1 -0
  147. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.css +1052 -0
  148. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.d.ts +2730 -0
  149. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.esm.js +8558 -0
  150. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.js +8717 -0
  151. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.min.css +1 -0
  152. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/main.min.js +6 -0
  153. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/core/package.json +30 -0
  154. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/LICENSE.txt +20 -0
  155. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/README.md +8 -0
  156. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.css +78 -0
  157. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.d.ts +310 -0
  158. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.esm.js +1627 -0
  159. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.js +1641 -0
  160. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.min.css +1 -0
  161. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/main.min.js +6 -0
  162. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/daygrid/package.json +33 -0
  163. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/fullcalendar-yearview/LICENSE +21 -0
  164. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/fullcalendar-yearview/css/main.css +85 -0
  165. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/fullcalendar-yearview/js/main.js +2018 -0
  166. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/LICENSE.txt +20 -0
  167. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/README.md +8 -0
  168. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/main.d.ts +20 -0
  169. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/main.esm.js +162 -0
  170. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/main.js +170 -0
  171. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/main.min.js +6 -0
  172. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/google-calendar/package.json +33 -0
  173. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/LICENSE.txt +20 -0
  174. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/README.md +8 -0
  175. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/main.d.ts +323 -0
  176. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/main.esm.js +2132 -0
  177. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/main.js +2143 -0
  178. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/main.min.js +6 -0
  179. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/interaction/package.json +33 -0
  180. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/LICENSE.txt +20 -0
  181. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/README.md +8 -0
  182. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.css +118 -0
  183. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.d.ts +33 -0
  184. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.esm.js +335 -0
  185. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.js +343 -0
  186. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.min.css +1 -0
  187. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/main.min.js +6 -0
  188. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/list/package.json +33 -0
  189. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/LICENSE.txt +20 -0
  190. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/README.md +8 -0
  191. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/main.d.ts +14 -0
  192. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/main.esm.js +162 -0
  193. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/main.js +170 -0
  194. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/main.min.js +6 -0
  195. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/luxon/package.json +34 -0
  196. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/LICENSE.txt +20 -0
  197. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/README.md +8 -0
  198. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/main.d.ts +14 -0
  199. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/main.esm.js +102 -0
  200. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/main.js +110 -0
  201. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/main.min.js +6 -0
  202. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment/package.json +34 -0
  203. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/LICENSE.txt +20 -0
  204. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/README.md +8 -0
  205. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/main.d.ts +11 -0
  206. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/main.esm.js +58 -0
  207. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/main.js +64 -0
  208. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/main.min.js +6 -0
  209. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/moment-timezone/package.json +35 -0
  210. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/LICENSE.txt +20 -0
  211. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/README.md +8 -0
  212. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/main.d.ts +9 -0
  213. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/main.esm.js +121 -0
  214. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/main.js +128 -0
  215. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/main.min.js +6 -0
  216. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/rrule/package.json +34 -0
  217. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/LICENSE.txt +20 -0
  218. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/README.md +8 -0
  219. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.css +309 -0
  220. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.d.ts +220 -0
  221. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.esm.js +1345 -0
  222. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.js +1357 -0
  223. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.min.css +1 -0
  224. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/main.min.js +6 -0
  225. advanced_report_builder/static/advanced_report_builder/fullcalendar/packages/timegrid/package.json +36 -0
  226. advanced_report_builder/static/advanced_report_builder/fullcalendar/vendor/rrule.js +3782 -0
  227. advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.js +132 -0
  228. advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.min.js +9 -0
  229. advanced_report_builder/static/advanced_report_builder/moment/locales.js +9769 -0
  230. advanced_report_builder/static/advanced_report_builder/moment/locales.min.js +1 -0
  231. advanced_report_builder/static/advanced_report_builder/moment/moment-with-locales.js +14289 -0
  232. advanced_report_builder/static/advanced_report_builder/moment/moment-with-locales.min.js +1 -0
  233. advanced_report_builder/static/advanced_report_builder/moment/moment.min.js +1 -0
  234. advanced_report_builder/static/advanced_report_builder/query_builder/.DS_Store +0 -0
  235. advanced_report_builder/static/advanced_report_builder/query_builder/css/.DS_Store +0 -0
  236. advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.css +173 -0
  237. advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.min.css +6 -0
  238. advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.css +173 -0
  239. advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.min.css +6 -0
  240. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ar.js +80 -0
  241. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.az.js +79 -0
  242. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.bg.js +79 -0
  243. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.cs.js +79 -0
  244. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.da.js +56 -0
  245. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.de.js +76 -0
  246. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.el.js +80 -0
  247. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.en.js +83 -0
  248. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.es.js +81 -0
  249. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fa-IR.js +79 -0
  250. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fr.js +83 -0
  251. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.he.js +81 -0
  252. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.it.js +79 -0
  253. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.nl.js +76 -0
  254. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.no.js +54 -0
  255. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pl.js +80 -0
  256. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-BR.js +80 -0
  257. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-PT.js +75 -0
  258. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ro.js +54 -0
  259. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ru.js +77 -0
  260. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.sq.js +78 -0
  261. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.tr.js +82 -0
  262. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ua.js +79 -0
  263. advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.zh-CN.js +80 -0
  264. advanced_report_builder/static/advanced_report_builder/query_builder/js/.DS_Store +0 -0
  265. advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/.DS_Store +0 -0
  266. advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/currency/plugin.js +30 -0
  267. advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.js +6200 -0
  268. advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.min.js +7 -0
  269. advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.js +6477 -0
  270. advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.min.js +7 -0
  271. advanced_report_builder/static/advanced_report_builder/query_builder/scss/.DS_Store +0 -0
  272. advanced_report_builder/static/advanced_report_builder/query_builder/scss/dark.scss +19 -0
  273. advanced_report_builder/static/advanced_report_builder/query_builder/scss/default.scss +186 -0
  274. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-checkbox.scss +12 -0
  275. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-tooltip-errors.scss +9 -0
  276. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_filter-description.scss +21 -0
  277. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_invert.scss +5 -0
  278. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_sortable.scss +28 -0
  279. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/bt-tooltip-errors.scss +9 -0
  280. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/filter-description.scss +21 -0
  281. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/invert.scss +5 -0
  282. advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/sortable.scss +27 -0
  283. advanced_report_builder/template_types.py +34 -0
  284. advanced_report_builder/templates/advanced_report_builder/calendar/description_modal.html +12 -0
  285. advanced_report_builder/templates/advanced_report_builder/calendar/middle.html +33 -0
  286. advanced_report_builder/templates/advanced_report_builder/calendar/modal.html +10 -0
  287. advanced_report_builder/templates/advanced_report_builder/calendar/report.html +80 -0
  288. advanced_report_builder/templates/advanced_report_builder/charts/bar/middle.html +122 -0
  289. advanced_report_builder/templates/advanced_report_builder/charts/funnel/middle.html +46 -0
  290. advanced_report_builder/templates/advanced_report_builder/charts/funnel/report.html +34 -0
  291. advanced_report_builder/templates/advanced_report_builder/charts/line/middle.html +119 -0
  292. advanced_report_builder/templates/advanced_report_builder/charts/modal.html +12 -0
  293. advanced_report_builder/templates/advanced_report_builder/charts/modal_field.html +13 -0
  294. advanced_report_builder/templates/advanced_report_builder/charts/pie/middle.html +58 -0
  295. advanced_report_builder/templates/advanced_report_builder/charts/report.html +33 -0
  296. advanced_report_builder/templates/advanced_report_builder/data_merge/data_merge.html +144 -0
  297. advanced_report_builder/templates/advanced_report_builder/datatables/fields/modal.html +13 -0
  298. advanced_report_builder/templates/advanced_report_builder/datatables/fields/single_query_builder.html +87 -0
  299. advanced_report_builder/templates/advanced_report_builder/datatables/modal.html +13 -0
  300. advanced_report_builder/templates/advanced_report_builder/datatables/onclick_menu.html +14 -0
  301. advanced_report_builder/templates/advanced_report_builder/datatables/report.html +37 -0
  302. advanced_report_builder/templates/advanced_report_builder/datatables/select_pivot.html +199 -0
  303. advanced_report_builder/templates/advanced_report_builder/error.html +21 -0
  304. advanced_report_builder/templates/advanced_report_builder/extra_query_modal.html +13 -0
  305. advanced_report_builder/templates/advanced_report_builder/kanban/description_modal.html +12 -0
  306. advanced_report_builder/templates/advanced_report_builder/kanban/middle.html +63 -0
  307. advanced_report_builder/templates/advanced_report_builder/kanban/modal.html +10 -0
  308. advanced_report_builder/templates/advanced_report_builder/kanban/report.html +71 -0
  309. advanced_report_builder/templates/advanced_report_builder/multi_values/held_modal.html +14 -0
  310. advanced_report_builder/templates/advanced_report_builder/multi_values/middle.html +61 -0
  311. advanced_report_builder/templates/advanced_report_builder/multi_values/modal.html +15 -0
  312. advanced_report_builder/templates/advanced_report_builder/multi_values/report.html +19 -0
  313. advanced_report_builder/templates/advanced_report_builder/query_builder.html +88 -0
  314. advanced_report_builder/templates/advanced_report_builder/query_modal.html +12 -0
  315. advanced_report_builder/templates/advanced_report_builder/select_column.html +230 -0
  316. advanced_report_builder/templates/advanced_report_builder/single_values/gauge_middle.html +143 -0
  317. advanced_report_builder/templates/advanced_report_builder/single_values/middle.html +63 -0
  318. advanced_report_builder/templates/advanced_report_builder/single_values/modal.html +13 -0
  319. advanced_report_builder/templates/advanced_report_builder/single_values/report.html +56 -0
  320. advanced_report_builder/toggle.py +9 -0
  321. advanced_report_builder/urls.py +237 -0
  322. advanced_report_builder/utils.py +171 -0
  323. advanced_report_builder/variable_date.py +670 -0
  324. advanced_report_builder/view_types.py +27 -0
  325. advanced_report_builder/views/.DS_Store +0 -0
  326. advanced_report_builder/views/__init__.py +0 -0
  327. advanced_report_builder/views/bar_charts.py +746 -0
  328. advanced_report_builder/views/calendar.py +745 -0
  329. advanced_report_builder/views/charts_base.py +625 -0
  330. advanced_report_builder/views/custom.py +147 -0
  331. advanced_report_builder/views/dashboard.py +357 -0
  332. advanced_report_builder/views/datatables/__init__.py +0 -0
  333. advanced_report_builder/views/datatables/datatables.py +151 -0
  334. advanced_report_builder/views/datatables/modal.py +1151 -0
  335. advanced_report_builder/views/datatables/utils.py +701 -0
  336. advanced_report_builder/views/error_pod.py +50 -0
  337. advanced_report_builder/views/funnel_charts.py +289 -0
  338. advanced_report_builder/views/helpers.py +22 -0
  339. advanced_report_builder/views/kanban.py +868 -0
  340. advanced_report_builder/views/line_charts.py +415 -0
  341. advanced_report_builder/views/modals_base.py +213 -0
  342. advanced_report_builder/views/multi_value.py +1160 -0
  343. advanced_report_builder/views/pie_charts.py +290 -0
  344. advanced_report_builder/views/query_modal/__init__.py +0 -0
  345. advanced_report_builder/views/query_modal/mixin.py +161 -0
  346. advanced_report_builder/views/query_modal/modal.py +274 -0
  347. advanced_report_builder/views/report.py +241 -0
  348. advanced_report_builder/views/report_utils_mixin.py +312 -0
  349. advanced_report_builder/views/reports.py +154 -0
  350. advanced_report_builder/views/single_values.py +792 -0
  351. advanced_report_builder/views/targets/__init__.py +0 -0
  352. advanced_report_builder/views/targets/utils.py +251 -0
  353. advanced_report_builder/views/targets/views.py +139 -0
  354. advanced_report_builder/views/value_base.py +198 -0
  355. advanced_report_builder/widgets.py +5 -0
  356. django_advanced_report_builder-1.2.9.dist-info/METADATA +35 -0
  357. django_advanced_report_builder-1.2.9.dist-info/RECORD +360 -0
  358. django_advanced_report_builder-1.2.9.dist-info/WHEEL +5 -0
  359. django_advanced_report_builder-1.2.9.dist-info/licenses/LICENSE +21 -0
  360. django_advanced_report_builder-1.2.9.dist-info/top_level.txt +1 -0
@@ -0,0 +1,625 @@
1
+ import base64
2
+ import copy
3
+ import json
4
+ import math
5
+ from datetime import datetime, timedelta
6
+
7
+ from date_offset.date_offset import DateOffset
8
+ from dateutil.relativedelta import relativedelta
9
+ from django.apps import apps
10
+ from django.core.exceptions import FieldDoesNotExist, FieldError
11
+ from django.db import DataError, ProgrammingError
12
+ from django.db.models import Q
13
+ from django.forms import ChoiceField
14
+ from django.shortcuts import get_object_or_404
15
+ from django.utils.safestring import mark_safe
16
+ from django.views.generic import TemplateView
17
+ from django_datatables.datatables import DatatableTable
18
+ from django_menus.menu import MenuItem
19
+ from django_modals.widgets.select2 import Select2
20
+
21
+ from advanced_report_builder.column_types import NUMBER_FIELDS
22
+ from advanced_report_builder.columns import ReportBuilderDateColumn
23
+ from advanced_report_builder.exceptions import ReportError
24
+ from advanced_report_builder.field_utils import ReportBuilderFieldUtils
25
+ from advanced_report_builder.globals import (
26
+ ANNOTATION_VALUE_DAY,
27
+ ANNOTATION_VALUE_FINANCIAL_QUARTER,
28
+ ANNOTATION_VALUE_FUNCTIONS,
29
+ ANNOTATION_VALUE_MONTH,
30
+ ANNOTATION_VALUE_QUARTER,
31
+ ANNOTATION_VALUE_WEEK,
32
+ ANNOTATION_VALUE_YEAR,
33
+ )
34
+ from advanced_report_builder.models import ReportType, Target
35
+ from advanced_report_builder.utils import (
36
+ count_days,
37
+ get_report_builder_class,
38
+ get_template_type_class,
39
+ split_attr,
40
+ split_slug,
41
+ )
42
+ from advanced_report_builder.variable_date import VariableDate
43
+ from advanced_report_builder.views.helpers import QueryBuilderForm
44
+ from advanced_report_builder.views.report import ReportBase
45
+ from advanced_report_builder.views.report_utils_mixin import ReportUtilsMixin
46
+ from advanced_report_builder.views.targets.utils import TargetUtils
47
+
48
+
49
+ class ChartJSTable(DatatableTable):
50
+ def __init__(self, *args, **kwargs):
51
+ pk = kwargs.pop('pk', None)
52
+ self.axis_scale = kwargs.pop('axis_scale', None)
53
+ self.targets = kwargs.pop('targets', None)
54
+ self.raw_data = None
55
+
56
+ super().__init__(*args, **kwargs)
57
+ if pk:
58
+ self.filter['pk'] = pk
59
+
60
+ def model_table_setup(self):
61
+ try:
62
+ targets_data = []
63
+ error = False
64
+ try:
65
+ data = self.get_table_array(self.kwargs.get('request'), self.get_query())
66
+ self.raw_data = data
67
+ except (DataError, FieldError):
68
+ data = [['N/A']]
69
+ error = True
70
+ if self.targets is not None and not error:
71
+ targets = self.targets.all()
72
+ if targets and len(data) > 0:
73
+ targets_data = self.process_data_structure_target(targets=targets, data=data)
74
+ return mark_safe(
75
+ json.dumps(
76
+ {
77
+ 'initsetup': json.loads(self.col_def_str()),
78
+ 'data': data,
79
+ 'targets': targets_data,
80
+ 'row_titles': self.all_titles(),
81
+ 'table_id': self.table_id,
82
+ }
83
+ )
84
+ )
85
+ except (ProgrammingError, TypeError, ValueError, KeyError) as e:
86
+ raise ReportError(e)
87
+
88
+ def process_data_structure_target(self, targets, data):
89
+ results = []
90
+ for target in targets:
91
+ if target.period_type == Target.PeriodType.MONTHLY:
92
+ new_data_structure = []
93
+ for data_dict in data:
94
+ target_value = self.process_target_results(data_dict=data_dict, target=target)
95
+ new_data_structure.append(target_value)
96
+ label = target.name + ' Target'
97
+ colour = '#' + target.default_colour
98
+ results.append(
99
+ {
100
+ 'label': label,
101
+ 'data': new_data_structure,
102
+ 'borderWidth': 1,
103
+ 'backgroundColor': [colour for _ in range(len(new_data_structure))],
104
+ 'borderColor': '#' + target.default_colour,
105
+ }
106
+ )
107
+ return results
108
+
109
+ @staticmethod
110
+ def process_target_results(data_dict, target):
111
+ """
112
+ Get the correct target data from from the target.
113
+ :param data_dict:
114
+ :param target:
115
+ :return:
116
+ """
117
+ start_date = datetime.strptime(data_dict[0], '%Y-%m-%d').date()
118
+
119
+ date_offset = DateOffset()
120
+
121
+ # since the targets are in months, this is the value we need.
122
+ first_day_month = start_date.replace(day=1)
123
+ next_date = date_offset.get_offset('1m', first_day_month) - timedelta(days=1)
124
+ target_utils = TargetUtils()
125
+
126
+ target_value = target_utils.get_monthly_target_value_for_range(
127
+ min_date=first_day_month,
128
+ max_date=next_date,
129
+ target=target,
130
+ )
131
+
132
+ return target_value
133
+
134
+
135
+ class ChartBaseView(ReportBase, ReportUtilsMixin, TemplateView):
136
+ date_field = ReportBuilderDateColumn
137
+ chart_js_table = ChartJSTable
138
+
139
+ template_name = 'advanced_report_builder/charts/report.html'
140
+
141
+ def __init__(self, *args, **kwargs):
142
+ self.chart_report = None
143
+ self.show_toolbar = False
144
+ self.table = None
145
+ super().__init__(*args, **kwargs)
146
+
147
+ def dispatch(self, request, *args, **kwargs):
148
+ self.slug = split_slug(kwargs.get('slug'))
149
+ self.enable_edit = kwargs.get('enable_edit')
150
+ self.dashboard_report = kwargs.get('dashboard_report')
151
+ if self.enable_edit or (self.dashboard_report and not self.dashboard_report.top) or not self.dashboard_report:
152
+ self.show_toolbar = True
153
+ return super().dispatch(request, *args, **kwargs)
154
+
155
+ def extra_filters(self, query):
156
+ report_query = self.get_report_query(report=self.chart_report)
157
+ option_query = self.get_report_option_query()
158
+ if report_query or option_query:
159
+ search_filter_data = report_query.query if report_query else None
160
+ query = self.process_query_filters(
161
+ query=query, search_filter_data=search_filter_data, extra_filter=option_query
162
+ )
163
+ return query
164
+
165
+ def get_report_template(self):
166
+ template_type_class = get_template_type_class()
167
+ return template_type_class.get_template_name_from_instance_type(
168
+ instance_type=self.report.instance_type, template_style=self.report.template_style
169
+ )
170
+
171
+ def get_date_format(self):
172
+ return '%Y-%m-%d'
173
+
174
+ def get_date_field(self, index, fields, base_model, table):
175
+ field_name = self.chart_report.date_field
176
+ if field_name is None:
177
+ return None
178
+ report_builder_class = get_report_builder_class(model=base_model, report_type=self.chart_report.report_type)
179
+
180
+ django_field, col_type_override, _, _ = self.get_field_details(
181
+ base_model=base_model,
182
+ field=field_name,
183
+ report_builder_class=report_builder_class,
184
+ table=table,
185
+ )
186
+
187
+ if col_type_override:
188
+ field_name = col_type_override.field
189
+
190
+ date_format = self.get_date_format()
191
+
192
+ date_function_kwargs = {'title': field_name, 'date_format': date_format}
193
+
194
+ annotations_value = self.chart_report.axis_scale
195
+
196
+ new_field_name = f'{annotations_value}_{field_name}_{index}'
197
+ function = ANNOTATION_VALUE_FUNCTIONS[annotations_value]
198
+ date_function_kwargs['annotations_value'] = {new_field_name: function(field_name)}
199
+ field_name = new_field_name
200
+
201
+ date_function_kwargs.update({'field': field_name, 'column_name': field_name, 'model_path': ''})
202
+
203
+ field = self.date_field(**date_function_kwargs)
204
+ fields.append(field)
205
+ return field_name
206
+
207
+ @staticmethod
208
+ def _set_multiple_title(database_values, value_prefix, fields, text):
209
+ results = {}
210
+ for field in fields:
211
+ value = database_values[value_prefix + '__' + field]
212
+ results[field] = value
213
+ return text.format(**results)
214
+
215
+ def process_query_results(self, base_model, table):
216
+ fields = []
217
+ date_field_name = self.get_date_field(0, fields, base_model=base_model, table=table)
218
+ if date_field_name is not None:
219
+ table.order_by = [date_field_name]
220
+ else:
221
+ table.order_by = ['id']
222
+
223
+ if not self.chart_report.fields:
224
+ return fields
225
+ chart_fields = self.chart_report.fields
226
+
227
+ report_builder_class = get_report_builder_class(model=base_model, report_type=self.chart_report.report_type)
228
+
229
+ for index, table_field in enumerate(chart_fields, 1):
230
+ field = table_field['field']
231
+
232
+ django_field, col_type_override, _, _ = self.get_field_details(
233
+ base_model=base_model,
234
+ field=field,
235
+ report_builder_class=report_builder_class,
236
+ table=table,
237
+ )
238
+
239
+ if isinstance(django_field, NUMBER_FIELDS) or (
240
+ col_type_override is not None and col_type_override.annotations
241
+ ):
242
+ data_attr = split_attr(table_field)
243
+ if data_attr.get('multiple_columns') == '1':
244
+ query = self.extra_filters(query=table.model.objects)
245
+
246
+ multiple_column_field = data_attr.get('multiple_column_field')
247
+ if multiple_column_field is None:
248
+ return
249
+ report_builder_class = self._get_report_builder_class(
250
+ base_model=base_model,
251
+ field_str=multiple_column_field,
252
+ report_builder_class=report_builder_class,
253
+ )
254
+ try:
255
+ _fields = report_builder_class.default_multiple_column_fields
256
+ except AttributeError:
257
+ return
258
+ default_multiple_column_fields = [multiple_column_field + '__' + x for x in _fields]
259
+ order_by = f'{multiple_column_field}__{report_builder_class.default_multiple_pk}'
260
+ positive_colour_field = self.get_field_path(
261
+ field_name=data_attr.get('positive_colour_field'),
262
+ base_model=base_model,
263
+ report_builder_class=report_builder_class,
264
+ table=table,
265
+ )
266
+ if positive_colour_field is not None:
267
+ default_multiple_column_fields.append(positive_colour_field)
268
+
269
+ negative_colour_field = self.get_field_path(
270
+ field_name=data_attr.get('negative_colour_field'),
271
+ base_model=base_model,
272
+ report_builder_class=report_builder_class,
273
+ table=table,
274
+ )
275
+ if negative_colour_field is not None:
276
+ default_multiple_column_fields.append(negative_colour_field)
277
+
278
+ results = (
279
+ query.order_by(order_by)
280
+ .distinct(multiple_column_field)
281
+ .values(multiple_column_field, *default_multiple_column_fields)
282
+ )
283
+ held_kwargs = copy.deepcopy(col_type_override.kwargs)
284
+ for multiple_index, result in enumerate(results):
285
+ col_type_override.kwargs = copy.deepcopy(held_kwargs)
286
+
287
+ suffix = self._set_multiple_title(
288
+ database_values=result,
289
+ value_prefix=multiple_column_field,
290
+ fields=_fields,
291
+ text=report_builder_class.default_multiple_column_text,
292
+ )
293
+ extra_filter = Q((multiple_column_field, result[multiple_column_field]))
294
+
295
+ additional_options = {}
296
+ if positive_colour_field is not None:
297
+ additional_options['positive_colour'] = result[positive_colour_field]
298
+
299
+ if negative_colour_field is not None:
300
+ additional_options['negative_colour'] = result[negative_colour_field]
301
+
302
+ self.get_number_field(
303
+ annotations_type=self.chart_report.axis_value_type,
304
+ append_annotation_query=True,
305
+ index=f'{index}_{multiple_index}',
306
+ data_attr=data_attr,
307
+ table_field=table_field,
308
+ fields=fields,
309
+ col_type_override=col_type_override,
310
+ extra_filter=extra_filter,
311
+ title_suffix=suffix,
312
+ multiple_index=multiple_index,
313
+ additional_options=additional_options,
314
+ )
315
+
316
+ else:
317
+ self.get_number_field(
318
+ annotations_type=self.chart_report.axis_value_type,
319
+ append_annotation_query=False,
320
+ index=index,
321
+ data_attr=data_attr,
322
+ table_field=table_field,
323
+ fields=fields,
324
+ col_type_override=col_type_override,
325
+ )
326
+ return fields
327
+
328
+ def get_field_path(self, field_name, base_model, report_builder_class, table):
329
+ if field_name:
330
+ _, _, _, field_path = self.get_field_details(
331
+ base_model=base_model,
332
+ field=field_name,
333
+ report_builder_class=report_builder_class,
334
+ table=table,
335
+ )
336
+ return field_path
337
+ return None
338
+
339
+ # noinspection PyUnresolvedReferences
340
+ @staticmethod
341
+ def add_colour_offset(colour, multiple_index):
342
+ if multiple_index > 0:
343
+ offset = 50 * multiple_index
344
+ colour_list = list(int(colour[i : i + 2], 16) for i in (0, 2, 4))
345
+ _, colour_list[0] = divmod(colour_list[0] + offset, 255)
346
+ _, colour_list[1] = divmod(colour_list[1] + offset, 255)
347
+ _, colour_list[2] = divmod(colour_list[2] + offset, 255)
348
+ return '{:02x}{:02x}{:02x}'.format(*colour_list)
349
+ else:
350
+ return colour
351
+
352
+ def setup_table(self, base_model):
353
+ if hasattr(self.chart_report, 'axis_scale'):
354
+ self.table = self.chart_js_table(model=base_model, axis_scale=self.chart_report.axis_scale)
355
+ else:
356
+ self.table = self.chart_js_table(model=base_model)
357
+
358
+ def get_context_data(self, **kwargs):
359
+ context = super().get_context_data(**kwargs)
360
+
361
+ base_model = self.chart_report.get_base_model()
362
+ if base_model:
363
+ self.setup_table(base_model=base_model)
364
+ self.table.extra_filters = self.extra_filters
365
+ try:
366
+ fields = self.process_query_results(base_model=base_model, table=self.table)
367
+ except (FieldError, FieldDoesNotExist) as e:
368
+ raise ReportError(e)
369
+ self.table.add_columns(*fields)
370
+ context['datatable'] = self.table
371
+ context['show_toolbar'] = self.show_toolbar
372
+ context['title'] = self.get_title()
373
+ return context
374
+
375
+ def setup_menu(self):
376
+ if not self.show_toolbar:
377
+ return
378
+
379
+ if self.dashboard_report and self.enable_edit:
380
+ report_menu = self.pod_dashboard_edit_menu()
381
+ elif self.dashboard_report and not self.enable_edit:
382
+ report_menu = self.pod_dashboard_view_menu()
383
+ else:
384
+ report_menu = self.pod_report_menu()
385
+
386
+ self.add_menu('button_menu', 'button_group').add_items(
387
+ *report_menu,
388
+ *self.queries_option_menus(report=self.report, dashboard_report=self.dashboard_report),
389
+ )
390
+
391
+ def pod_dashboard_edit_menu(self):
392
+ return [
393
+ MenuItem(
394
+ f'advanced_report_builder:dashboard_report_modal,pk-{self.dashboard_report.id}',
395
+ menu_display='Edit',
396
+ font_awesome='fas fa-pencil-alt',
397
+ css_classes=['btn-primary'],
398
+ )
399
+ ]
400
+
401
+ # noinspection PyMethodMayBeStatic
402
+ def pod_dashboard_view_menu(self):
403
+ return []
404
+
405
+ def pod_report_menu(self):
406
+ query_id = self.slug.get(f'query{self.chart_report.id}')
407
+ slug_str = ''
408
+ if query_id:
409
+ slug_str = f'-query_id-{query_id}'
410
+ return self.edit_report_menu(
411
+ request=self.request,
412
+ chart_report_id=self.chart_report.id,
413
+ slug_str=slug_str,
414
+ )
415
+
416
+ @staticmethod
417
+ def edit_report_menu(request, chart_report_id, slug_str):
418
+ return []
419
+
420
+ def get_period_divider(
421
+ self,
422
+ annotation_value_choice,
423
+ start_date_type,
424
+ end_date_type,
425
+ exclude_weekdays=None,
426
+ exclude_dates=None,
427
+ ):
428
+ """
429
+ Calculates the number of periods (year, quarter, month, week, day)
430
+ between two variable dates.
431
+ Supports working-day exclusions and financial quarters.
432
+
433
+ financial_year_start_month:
434
+ 1 = Jan (default calendar year)
435
+ 4 = Apr (UK fiscal year)
436
+ 7 = Jul (AU fiscal year)
437
+ """
438
+ variable_date = VariableDate()
439
+
440
+ financial_year_start_month = self.get_financial_month()
441
+
442
+ start_date_and_time, _, _ = variable_date.get_variable_dates(
443
+ range_type=start_date_type, financial_year_start_month=financial_year_start_month
444
+ )
445
+ _, end_date_and_time, _ = variable_date.get_variable_dates(
446
+ range_type=end_date_type, financial_year_start_month=financial_year_start_month
447
+ )
448
+
449
+ start_date = start_date_and_time.date()
450
+ end_date = end_date_and_time.date()
451
+
452
+ # YEAR
453
+ if annotation_value_choice == ANNOTATION_VALUE_YEAR:
454
+ if exclude_weekdays or exclude_dates:
455
+ total_working_days = count_days(
456
+ start_date,
457
+ end_date,
458
+ exclude_weekdays=exclude_weekdays,
459
+ exclude_dates=exclude_dates,
460
+ )
461
+ divider = max(1, math.ceil(total_working_days / 260))
462
+ else:
463
+ divider = abs(end_date.year - start_date.year) + 1
464
+
465
+ # FINANCIAL QUARTER
466
+ elif annotation_value_choice == ANNOTATION_VALUE_FINANCIAL_QUARTER:
467
+ # Financial year offset (e.g. 4 → April)
468
+ fy_offset = financial_year_start_month - 1
469
+
470
+ # Convert actual months to financial-year-relative months (0–11)
471
+ start_fm = (start_date.year * 12) + (start_date.month - 1) - fy_offset
472
+ end_fm = (end_date.year * 12) + (end_date.month - 1) - fy_offset
473
+
474
+ # Month difference (inclusive of partial months if days > 0)
475
+ delta = relativedelta(end_date, start_date)
476
+
477
+ # Adjust using financial-year-relative absolute month numbers
478
+ adjusted_months = (end_fm - start_fm) + (1 if delta.days > 0 else 0)
479
+
480
+ # Number of financial quarters (3-month blocks)
481
+ divider = max(1, math.ceil(adjusted_months / 3))
482
+
483
+ # If working-day exclusions apply, switch to day-based quarter calculation
484
+ if exclude_weekdays or exclude_dates:
485
+ total_working_days = count_days(
486
+ start_date,
487
+ end_date,
488
+ exclude_weekdays=exclude_weekdays,
489
+ exclude_dates=exclude_dates,
490
+ )
491
+ # Approx. 65 working days per quarter
492
+ divider = max(1, math.ceil(total_working_days / 65))
493
+
494
+ # CALENDAR QUARTER
495
+ elif annotation_value_choice == ANNOTATION_VALUE_QUARTER:
496
+ if exclude_weekdays or exclude_dates:
497
+ total_working_days = count_days(
498
+ start_date,
499
+ end_date,
500
+ exclude_weekdays=exclude_weekdays,
501
+ exclude_dates=exclude_dates,
502
+ )
503
+ divider = max(1, math.ceil(total_working_days / 65))
504
+ else:
505
+ delta = relativedelta(end_date, start_date)
506
+ divider = delta.years * 4 + math.ceil(delta.months / 3)
507
+ if delta.days > 0 and delta.months % 3 == 0:
508
+ divider += 1
509
+ divider = max(1, divider)
510
+ # MONTH
511
+ elif annotation_value_choice == ANNOTATION_VALUE_MONTH:
512
+ rdate = relativedelta(end_date, start_date)
513
+ divider = rdate.years * 12 + rdate.months
514
+ if rdate.days > 0:
515
+ divider += 1
516
+ divider = divider or 1
517
+
518
+ # WEEK
519
+ elif annotation_value_choice == ANNOTATION_VALUE_WEEK:
520
+ if exclude_weekdays or exclude_dates:
521
+ total_working_days = count_days(
522
+ start_date,
523
+ end_date,
524
+ exclude_weekdays=exclude_weekdays,
525
+ exclude_dates=exclude_dates,
526
+ )
527
+ ex = {d for d in (exclude_weekdays or []) if 1 <= d <= 7}
528
+ workdays_per_week = 7 - len(ex) if ex else 7
529
+ if workdays_per_week == 0:
530
+ raise ReportError('All days are excluded from the week; cannot calculate number of weeks.')
531
+ divider = math.ceil(total_working_days / workdays_per_week)
532
+ else:
533
+ monday1 = start_date - timedelta(days=start_date.weekday())
534
+ monday2 = end_date - timedelta(days=end_date.weekday())
535
+ divider = max(1, int((monday2 - monday1).days / 7))
536
+
537
+ # DAY
538
+ elif annotation_value_choice == ANNOTATION_VALUE_DAY:
539
+ divider = count_days(
540
+ start_date,
541
+ end_date,
542
+ exclude_weekdays=exclude_weekdays,
543
+ exclude_dates=exclude_dates,
544
+ )
545
+
546
+ else:
547
+ raise ReportError('unknown annotation_value_choice')
548
+
549
+ return divider
550
+
551
+
552
+ class ChartBaseFieldForm(ReportBuilderFieldUtils, QueryBuilderForm):
553
+ cancel_class = 'btn-secondary modal-cancel'
554
+
555
+ def __init__(self, *args, **kwargs):
556
+ self.django_field = None
557
+ self.col_type_override = None
558
+ super().__init__(*args, **kwargs)
559
+
560
+ def cancel_button(self, css_class=cancel_class, **kwargs):
561
+ commands = [{'function': 'close'}]
562
+ return self.button('Cancel', commands, css_class, **kwargs)
563
+
564
+ def get_report_type_details(self):
565
+ data = json.loads(base64.b64decode(self.slug['data']))
566
+
567
+ report_type = get_object_or_404(ReportType, pk=self.slug['report_type_id'])
568
+ base_model = report_type.content_type.model_class()
569
+
570
+ report_builder_class = get_report_builder_class(model=base_model, report_type=report_type)
571
+
572
+ self.django_field, self.col_type_override, _, _ = self.get_field_details(
573
+ base_model=base_model,
574
+ field=data['field'],
575
+ report_builder_class=report_builder_class,
576
+ )
577
+
578
+ return report_type, base_model
579
+
580
+ def _get_query_builder_foreign_key_fields(
581
+ self,
582
+ base_model,
583
+ report_builder_class,
584
+ fields,
585
+ prefix='',
586
+ title_prefix='',
587
+ previous_base_model=None,
588
+ ):
589
+ for include_field, include in report_builder_class.includes.items():
590
+ app_label, model, report_builder_fields_str = include['model'].split('.')
591
+ new_model = apps.get_model(app_label, model)
592
+ if new_model != previous_base_model:
593
+ new_report_builder_class = get_report_builder_class(
594
+ model=new_model, class_name=report_builder_fields_str
595
+ )
596
+
597
+ fields.append((prefix + include_field, title_prefix + include['title']))
598
+ self._get_query_builder_foreign_key_fields(
599
+ base_model=new_model,
600
+ report_builder_class=new_report_builder_class,
601
+ fields=fields,
602
+ prefix=f'{prefix}{include_field}__',
603
+ title_prefix=f'{title_prefix}{include["title"]} --> ',
604
+ previous_base_model=base_model,
605
+ )
606
+
607
+ def setup_colour_field(self, form_fields, base_model, report_builder_class, name, data_attr, label=None):
608
+ colour_fields = []
609
+ self._get_colour_fields(
610
+ base_model=base_model,
611
+ report_builder_class=report_builder_class,
612
+ fields=colour_fields,
613
+ )
614
+ dropdown_colour_fields = [['', '----']]
615
+ for colour_field in colour_fields:
616
+ dropdown_colour_fields.append([colour_field['id'], colour_field['text']])
617
+
618
+ form_fields[name] = ChoiceField(
619
+ choices=dropdown_colour_fields,
620
+ required=False,
621
+ widget=Select2(),
622
+ label=label,
623
+ )
624
+ if name in data_attr:
625
+ form_fields[name].initial = data_attr.get(name)