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
File without changes
@@ -0,0 +1,251 @@
1
+ from calendar import monthrange
2
+ from datetime import date, timedelta
3
+
4
+ from django.utils.dates import MONTHS
5
+
6
+ from advanced_report_builder.models import Target
7
+
8
+
9
+ class TargetUtils:
10
+ @staticmethod
11
+ def is_exact_full_month(min_date: date, max_date: date) -> bool:
12
+ if min_date.year != max_date.year or min_date.month != max_date.month:
13
+ return False
14
+
15
+ if min_date.day != 1:
16
+ return False
17
+
18
+ last_day = monthrange(min_date.year, min_date.month)[1]
19
+ return max_date.day == last_day
20
+
21
+ def get_monthly_target_value_for_range(self, min_date, max_date, target):
22
+ """
23
+ Returns the monthly target value for an arbitrary date range.
24
+
25
+ Rules:
26
+ - Exact full calendar month → direct lookup
27
+ - Partial / multi-month range → prorated by days
28
+ """
29
+
30
+ # Safety fallback
31
+ if not min_date or not max_date:
32
+ return target.get_value()
33
+
34
+ override_data = target.get_override_data() or {}
35
+
36
+ # ---- 1. Exact full month → lookup only ----
37
+ if self.is_exact_full_month(min_date, max_date):
38
+ year_data = override_data.get(str(min_date.year))
39
+ if year_data:
40
+ month_str = MONTHS[min_date.month]
41
+ return year_data.get(month_str, target.get_value())
42
+ return target.get_value()
43
+
44
+ # ---- 2. Partial / multi-month → prorated ----
45
+ total = 0.0
46
+
47
+ current = date(min_date.year, min_date.month, 1)
48
+
49
+ while current <= max_date:
50
+ year = current.year
51
+ month = current.month
52
+
53
+ days_in_month = monthrange(year, month)[1]
54
+ month_start = date(year, month, 1)
55
+ month_end = date(year, month, days_in_month)
56
+
57
+ effective_start = max(min_date, month_start)
58
+ effective_end = min(max_date, month_end)
59
+
60
+ if effective_start <= effective_end:
61
+ days_in_range = (effective_end - effective_start).days + 1
62
+
63
+ year_data = override_data.get(str(year), {})
64
+ month_str = MONTHS[month]
65
+ month_value = year_data.get(month_str, target.get_value())
66
+
67
+ total += (days_in_range / days_in_month) * month_value
68
+
69
+ # advance month
70
+ current = date(year + 1, 1, 1) if month == 12 else date(year, month + 1, 1)
71
+
72
+ return total
73
+
74
+ @staticmethod
75
+ def start_of_week(d: date) -> date:
76
+ return d - timedelta(days=d.weekday())
77
+
78
+ def is_exact_full_week(self, min_date: date, max_date: date) -> bool:
79
+ week_start = self.start_of_week(min_date)
80
+ week_end = week_start + timedelta(days=6)
81
+
82
+ return min_date == week_start and max_date == week_end
83
+
84
+ def get_weekly_target_value_for_range(self, min_date, max_date, target):
85
+ """
86
+ Returns the weekly target value for an arbitrary date range.
87
+
88
+ Rules:
89
+ - Exact full week → direct lookup
90
+ - Partial / multi-week range → prorated by days
91
+ """
92
+
93
+ # Safety fallback
94
+ if not min_date or not max_date:
95
+ return target.get_value()
96
+
97
+ override_data = target.get_override_data() or {}
98
+
99
+ # ---- 1. Exact full week → lookup ----
100
+ if self.is_exact_full_week(min_date, max_date):
101
+ year, week_no, _ = min_date.isocalendar()
102
+ year_data = override_data.get(str(year))
103
+ if year_data:
104
+ week_key = f'W{week_no:02d}'
105
+ return year_data.get(week_key, target.get_value())
106
+ return target.get_value()
107
+
108
+ # ---- 2. Partial / multi-week → prorated ----
109
+ total = 0.0
110
+ current = self.start_of_week(min_date)
111
+
112
+ while current <= max_date:
113
+ week_start = current
114
+ week_end = week_start + timedelta(days=6)
115
+
116
+ effective_start = max(min_date, week_start)
117
+ effective_end = min(max_date, week_end)
118
+
119
+ if effective_start <= effective_end:
120
+ days_in_range = (effective_end - effective_start).days + 1
121
+
122
+ year, week_no, _ = week_start.isocalendar()
123
+ year_data = override_data.get(str(year), {})
124
+ week_key = f'W{week_no:02d}'
125
+
126
+ week_value = year_data.get(week_key, target.get_value())
127
+
128
+ total += (days_in_range / 7) * week_value
129
+
130
+ current += timedelta(days=7)
131
+
132
+ return total
133
+
134
+ @staticmethod
135
+ def get_daily_target_value_for_range(min_date, max_date, target):
136
+ """
137
+ Returns the daily target value for an arbitrary date range.
138
+
139
+ Rules:
140
+ - Each day contributes exactly one daily target value
141
+ - Overrides are applied per day if present
142
+ """
143
+
144
+ # Safety fallback
145
+ if not min_date or not max_date:
146
+ return target.get_value()
147
+
148
+ override_data = target.get_override_data() or {}
149
+ default_value = target.get_value()
150
+
151
+ total = 0.0
152
+ current = min_date
153
+
154
+ while current <= max_date:
155
+ year_data = override_data.get(str(current.year), {})
156
+
157
+ # Support either YYYY-MM-DD or day-of-year style keys
158
+ day_key = current.isoformat() # "2025-03-12"
159
+ doy_key = f'D{current.timetuple().tm_yday:03d}' # "D071"
160
+
161
+ day_value = year_data.get(day_key) or year_data.get(doy_key) or default_value
162
+
163
+ total += day_value
164
+ current += timedelta(days=1)
165
+
166
+ return total
167
+
168
+ @staticmethod
169
+ def get_quarterly_target_value_for_range(min_date, target):
170
+ """
171
+ Return the quarterly target value.
172
+ Quarter validity is assumed to be checked by the caller.
173
+ """
174
+
175
+ override_data = target.get_override_data() or {}
176
+
177
+ year = min_date.year
178
+ quarter = ((min_date.month - 1) // 3) + 1
179
+ quarter_key = f'Q{quarter}'
180
+
181
+ year_data = override_data.get(str(year))
182
+ if year_data and quarter_key in year_data:
183
+ return year_data[quarter_key]
184
+
185
+ return target.get_value()
186
+
187
+ @staticmethod
188
+ def get_yearly_target_value_for_range(min_date, target):
189
+ override_data = target.get_override_data() or {}
190
+
191
+ year_data = override_data.get(str(min_date.year))
192
+ if year_data and 'YEAR' in year_data:
193
+ return year_data['YEAR']
194
+
195
+ return target.get_value()
196
+
197
+ def get_target_value(self, period_data, target):
198
+ if target.period_type == Target.PeriodType.DAILY:
199
+ period = period_data.get_day_period()
200
+ if period is None:
201
+ return None
202
+ target_value = self.get_daily_target_value_for_range(
203
+ min_date=period[0],
204
+ max_date=period[1],
205
+ target=target,
206
+ )
207
+
208
+ elif target.period_type == Target.PeriodType.WEEKLY:
209
+ period = period_data.get_week_period()
210
+ if period is None:
211
+ return None
212
+ target_value = self.get_weekly_target_value_for_range(
213
+ min_date=period[0],
214
+ max_date=period[1],
215
+ target=target,
216
+ )
217
+
218
+ elif target.period_type == Target.PeriodType.MONTHLY:
219
+ period = period_data.get_month_period()
220
+ if period is None:
221
+ return None
222
+ target_value = self.get_monthly_target_value_for_range(
223
+ min_date=period[0],
224
+ max_date=period[1],
225
+ target=target,
226
+ )
227
+
228
+ elif target.period_type == Target.PeriodType.QUARTER:
229
+ period = period_data.get_quarter_period()
230
+ if period is None:
231
+ return None
232
+ target_value = self.get_quarterly_target_value_for_range(
233
+ min_date=period[0],
234
+ target=target,
235
+ )
236
+ elif target.period_type == Target.PeriodType.YEARLY:
237
+ period = period_data.get_year_period()
238
+ if period is None:
239
+ return None
240
+
241
+ target_value = self.get_yearly_target_value_for_range(
242
+ min_date=period[0],
243
+ target=target,
244
+ )
245
+ else:
246
+ return None
247
+
248
+ if target_value == 0:
249
+ return None
250
+
251
+ return target_value
@@ -0,0 +1,139 @@
1
+ from crispy_forms.layout import HTML, Div
2
+ from django.conf import settings
3
+ from django.forms import CharField
4
+ from django.urls import reverse
5
+ from django_datatables.columns import MenuColumn
6
+ from django_datatables.widgets import DataTableWidget
7
+ from django_menus.menu import HtmlMenu, MenuItem
8
+ from django_modals.modals import ModelFormModal
9
+ from django_modals.processes import PERMISSION_OFF, PROCESS_EDIT_DELETE
10
+
11
+ from advanced_report_builder.columns import ColourColumn
12
+ from advanced_report_builder.form_utils import PercentageWidget, SmallInputWidget
13
+ from advanced_report_builder.models import Target, TargetColour
14
+ from advanced_report_builder.utils import get_query_js
15
+
16
+
17
+ class TargetModal(ModelFormModal):
18
+ model = Target
19
+ form_fields = ['name', 'target_type', 'period_type', 'default_colour', 'default_value', 'default_percentage']
20
+
21
+ widgets = {'default_value': SmallInputWidget, 'default_percentage': PercentageWidget}
22
+ process = PROCESS_EDIT_DELETE
23
+ permission_delete = PERMISSION_OFF
24
+
25
+ def form_setup(self, form, *_args, **_kwargs):
26
+ fields = ['name', 'target_type', 'period_type', 'default_colour', 'default_value', 'default_percentage']
27
+
28
+ form.add_trigger(
29
+ 'target_type',
30
+ 'onchange',
31
+ [
32
+ {
33
+ 'selector': '#div_id_default_value',
34
+ 'values': {Target.TargetType.COUNT: 'show', Target.TargetType.MONEY: 'show'},
35
+ 'default': 'hide',
36
+ },
37
+ {
38
+ 'selector': '#div_id_default_percentage',
39
+ 'values': {Target.TargetType.PERCENTAGE: 'show'},
40
+ 'default': 'hide',
41
+ },
42
+ ],
43
+ )
44
+
45
+ if self.object.id:
46
+ self.add_target_colours(form=form, fields=fields)
47
+ return fields
48
+
49
+ def post_save(self, created, form):
50
+ if created:
51
+ url_name = getattr(settings, 'REPORT_BUILDER_TARGET_URL_NAME', '')
52
+ if url_name:
53
+ url = reverse(url_name, kwargs={'slug': self.object.slug})
54
+ self.add_command('redirect', url=url)
55
+
56
+ def add_target_colours(self, form, fields):
57
+ add_query_js = 'django_modal.process_commands_lock([{"function": "post_modal", "button": {"button": "add_target_colour"}}])'
58
+
59
+ description_add_menu_items = [
60
+ MenuItem(
61
+ add_query_js.replace('"', '&quot;'),
62
+ menu_display='Add Colour Override',
63
+ css_classes='btn btn-primary',
64
+ font_awesome='fas fa-palette',
65
+ link_type=MenuItem.HREF,
66
+ )
67
+ ]
68
+
69
+ menu = HtmlMenu(self.request, 'advanced_report_builder/datatables/onclick_menu.html').add_items(
70
+ *description_add_menu_items
71
+ )
72
+ fields.append(Div(HTML(menu.render()), css_class='form-buttons'))
73
+ target_colour_menu = self.query_target_colour_menu()
74
+
75
+ form.fields['target_colours'] = CharField(
76
+ required=False,
77
+ label='Colour Overrides',
78
+ widget=DataTableWidget(
79
+ model=TargetColour,
80
+ fields=[
81
+ '_.index',
82
+ '.id',
83
+ 'percentage',
84
+ ColourColumn(column_name='colour', field='colour'),
85
+ MenuColumn(
86
+ column_name='menu',
87
+ field='id',
88
+ column_defs={'orderable': False, 'className': 'dt-right'},
89
+ menu=HtmlMenu(
90
+ self.request,
91
+ 'advanced_report_builder/datatables/onclick_menu.html',
92
+ ).add_items(*target_colour_menu),
93
+ ),
94
+ ],
95
+ attrs={'filter': {'target__id': self.object.id}},
96
+ ),
97
+ )
98
+ fields.append('target_colours')
99
+
100
+ @staticmethod
101
+ def query_target_colour_menu():
102
+ edit_query_js = get_query_js('edit_target_colour', 'target_colour_id')
103
+
104
+ description_edit_menu_items = [
105
+ MenuItem(
106
+ edit_query_js.replace('"', '&quot;'),
107
+ menu_display='Edit',
108
+ css_classes='btn btn-sm btn-outline-dark',
109
+ font_awesome='fas fa-pencil',
110
+ link_type=MenuItem.HREF,
111
+ ),
112
+ ]
113
+ return description_edit_menu_items
114
+
115
+ def button_add_target_colour(self, **_kwargs):
116
+ slug = f'target_id-{self.object.id}'
117
+ url = reverse(
118
+ 'advanced_report_builder:target_colour_modal',
119
+ kwargs={'slug': slug},
120
+ )
121
+ return self.command_response('show_modal', modal=url)
122
+
123
+ def button_edit_target_colour(self, **_kwargs):
124
+ target_colour_id = _kwargs['target_colour_id'][1:]
125
+ slug = f'pk-{target_colour_id}'
126
+ url = reverse(
127
+ 'advanced_report_builder:target_colour_modal',
128
+ kwargs={'slug': slug},
129
+ )
130
+ return self.command_response('show_modal', modal=url)
131
+
132
+
133
+ class TargetColourModal(ModelFormModal):
134
+ model = TargetColour
135
+ form_fields = ['colour', 'percentage']
136
+ widgets = {'percentage': PercentageWidget}
137
+
138
+ process = PROCESS_EDIT_DELETE
139
+ permission_delete = PERMISSION_OFF
@@ -0,0 +1,198 @@
1
+ from django.db.models import Count, ExpressionWrapper, FloatField, Sum
2
+ from django.db.models.functions import Coalesce, NullIf
3
+
4
+ from advanced_report_builder.column_types import NUMBER_FIELDS
5
+ from advanced_report_builder.exceptions import ReportError
6
+ from advanced_report_builder.globals import (
7
+ ANNOTATION_CHOICE_SUM,
8
+ )
9
+ from advanced_report_builder.views.charts_base import ChartBaseView
10
+
11
+
12
+ class ValueBaseView(ChartBaseView):
13
+ use_annotations = False
14
+
15
+ def _get_count(self, fields):
16
+ number_function_kwargs = {
17
+ 'aggregations': {'count': Count(1)},
18
+ 'field': 'count',
19
+ 'column_name': 'count',
20
+ 'options': {'calculated': True},
21
+ 'model_path': '',
22
+ }
23
+
24
+ field = self.number_field(**number_function_kwargs)
25
+ fields.append(field)
26
+
27
+ def _process_aggregations(
28
+ self,
29
+ field,
30
+ base_model,
31
+ report_builder_class,
32
+ decimal_places,
33
+ fields,
34
+ aggregations_type=ANNOTATION_CHOICE_SUM,
35
+ divider=None,
36
+ ):
37
+ django_field, col_type_override, _, _ = self.get_field_details(
38
+ base_model=base_model,
39
+ field=field,
40
+ report_builder_class=report_builder_class,
41
+ )
42
+
43
+ if isinstance(django_field, NUMBER_FIELDS) or col_type_override is not None and col_type_override.annotations:
44
+ self.get_number_field(
45
+ annotations_type=aggregations_type,
46
+ append_annotation_query=False,
47
+ index=0,
48
+ data_attr={},
49
+ table_field={'field': field, 'title': field},
50
+ fields=fields,
51
+ col_type_override=col_type_override,
52
+ decimal_places=decimal_places,
53
+ convert_currency_fields=True,
54
+ divider=divider,
55
+ )
56
+ else:
57
+ raise ReportError('not a number field')
58
+
59
+ def get_percentage_field(
60
+ self,
61
+ fields,
62
+ numerator_field_name,
63
+ numerator_col_type_override,
64
+ denominator_field_name,
65
+ denominator_col_type_override,
66
+ numerator_filter,
67
+ decimal_places=0,
68
+ ):
69
+ if numerator_col_type_override:
70
+ actual_numerator_field_name = numerator_col_type_override.field
71
+ else:
72
+ actual_numerator_field_name = numerator_field_name
73
+
74
+ if denominator_col_type_override:
75
+ actual_denominator_field_name = denominator_col_type_override.field
76
+ else:
77
+ actual_denominator_field_name = denominator_field_name
78
+
79
+ number_function_kwargs = {}
80
+ if decimal_places:
81
+ number_function_kwargs = {'decimal_places': int(decimal_places)}
82
+
83
+ new_field_name = f'{actual_numerator_field_name}_{actual_denominator_field_name}'
84
+
85
+ if numerator_col_type_override is not None and numerator_col_type_override.annotations:
86
+ if not isinstance(numerator_col_type_override.annotations, dict):
87
+ raise ReportError('Unknown annotation type')
88
+
89
+ annotations = list(numerator_col_type_override.annotations.values())[0]
90
+ if numerator_filter and isinstance(annotations, Sum | Count):
91
+ annotations.filter = numerator_filter
92
+ numerator = Coalesce(annotations + 0.0, 0.0)
93
+ else:
94
+ numerator = Coalesce(annotations + 0.0, 0.0)
95
+ else:
96
+ if numerator_filter:
97
+ numerator = Coalesce(
98
+ (Sum(actual_numerator_field_name, filter=numerator_filter) + 0.0),
99
+ 0.0,
100
+ )
101
+ else:
102
+ numerator = Coalesce((Sum(actual_numerator_field_name) + 0.0), 0.0)
103
+
104
+ if denominator_col_type_override is not None and denominator_col_type_override.annotations:
105
+ if not isinstance(denominator_col_type_override.annotations, dict):
106
+ raise ReportError('Unknown annotation type')
107
+
108
+ annotations = list(denominator_col_type_override.annotations.values())[0]
109
+
110
+ denominator = Coalesce(annotations + 0.0, 0.0)
111
+ else:
112
+ denominator = Coalesce(Sum(actual_denominator_field_name) + 0.0, 0.0)
113
+
114
+ number_function_kwargs['aggregations'] = {
115
+ new_field_name: ExpressionWrapper((numerator / NullIf(denominator, 0)) * 100.0, output_field=FloatField())
116
+ }
117
+ field_name = new_field_name
118
+
119
+ number_function_kwargs.update(
120
+ {
121
+ 'field': field_name,
122
+ 'column_name': field_name,
123
+ 'options': {'calculated': True},
124
+ 'model_path': '',
125
+ }
126
+ )
127
+
128
+ field = self.number_field(**number_function_kwargs)
129
+
130
+ fields.append(field)
131
+
132
+ return field_name
133
+
134
+ def _process_percentage(
135
+ self,
136
+ numerator_filter,
137
+ denominator_field,
138
+ numerator_field,
139
+ base_model,
140
+ report_builder_class,
141
+ decimal_places,
142
+ fields,
143
+ ):
144
+ if denominator_field is None:
145
+ raise ReportError('denominator field is None')
146
+ if numerator_field is None:
147
+ raise ReportError('numerator field is None')
148
+ deno_django_field, denominator_col_type_override, _, _ = self.get_field_details(
149
+ base_model=base_model,
150
+ field=denominator_field,
151
+ report_builder_class=report_builder_class,
152
+ )
153
+ if not isinstance(deno_django_field, NUMBER_FIELDS) and (
154
+ denominator_col_type_override is not None and not denominator_col_type_override.annotations
155
+ ):
156
+ raise ReportError('denominator is not a number field')
157
+
158
+ num_django_field, numerator_col_type_override, _, _ = self.get_field_details(
159
+ base_model=base_model,
160
+ field=numerator_field,
161
+ report_builder_class=report_builder_class,
162
+ )
163
+
164
+ if not isinstance(num_django_field, NUMBER_FIELDS) and (
165
+ numerator_col_type_override is not None and not numerator_col_type_override.annotations
166
+ ):
167
+ raise ReportError('numerator is not a number field')
168
+
169
+ self.get_percentage_field(
170
+ fields=fields,
171
+ numerator_field_name=numerator_field,
172
+ numerator_col_type_override=numerator_col_type_override,
173
+ denominator_field_name=denominator_field,
174
+ denominator_col_type_override=denominator_col_type_override,
175
+ numerator_filter=numerator_filter,
176
+ decimal_places=decimal_places,
177
+ )
178
+
179
+ def _process_percentage_from_count(self, numerator_filter, decimal_places, fields):
180
+ if numerator_filter:
181
+ numerator = Coalesce(Count(1, filter=numerator_filter) + 0.0, 0.0)
182
+ else:
183
+ numerator = Coalesce(Count(1) + 0.0, 0.0)
184
+ denominator = Coalesce(Count(1) + 0.0, 0.0)
185
+ a = (numerator / denominator) * 100.0
186
+
187
+ number_function_kwargs = {
188
+ 'aggregations': {'count': a},
189
+ 'field': 'count',
190
+ 'column_name': 'count',
191
+ 'options': {'calculated': True},
192
+ 'model_path': '',
193
+ }
194
+ if decimal_places:
195
+ number_function_kwargs['decimal_places'] = int(decimal_places)
196
+
197
+ field = self.number_field(**number_function_kwargs)
198
+ fields.append(field)
@@ -0,0 +1,5 @@
1
+ from django.forms import TextInput
2
+
3
+
4
+ class SmallNumberInputWidget(TextInput):
5
+ crispy_kwargs = {'field_class': 'col-2', 'input_size': 'input-group-sm'}
@@ -0,0 +1,35 @@
1
+ Metadata-Version: 2.4
2
+ Name: django-advanced-report-builder
3
+ Version: 1.2.9
4
+ Summary: Django app that allows you to build reports from modals
5
+ Author: Thomas Turner
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/django-advance-utils/django-advanced-report-builder
8
+ Requires-Python: >=3.6
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: Django>=3.2
12
+ Requires-Dist: django-filtered-datatables>=0.0.21
13
+ Requires-Dist: django-ajax-helpers>=0.0.20
14
+ Requires-Dist: django-nested-modals>=0.0.21
15
+ Requires-Dist: time-stamped-model>=0.2.3
16
+ Requires-Dist: date-offset>=0.0.2
17
+ Requires-Dist: expression-builder>=0.0.12
18
+ Dynamic: license-file
19
+
20
+ [![PyPI version](https://badge.fury.io/py/django-advanced-report-builder.svg)](https://badge.fury.io/py/django-advanced-report-builder)
21
+
22
+
23
+ # Django advanced report builder
24
+
25
+ A Django application that provides a fully featured, dynamic report-building interface. It allows users to create, customise, preview and export reports directly through a dedicated front-end UI, without writing queries or touching the Django admin.
26
+
27
+ ## Features
28
+
29
+ - Build reports through a standalone report-builder interface (not the Django admin).
30
+ - Choose a root model and dynamically select fields to display.
31
+ - Add filters, conditions, ordering and grouping.
32
+ - Preview results instantly within the UI.
33
+ - Export to CSV, Excel and other supported formats.
34
+ - Pluggable architecture for adding formats, custom filters, or integration hooks.
35
+ - Designed to integrate easily into existing Django projects.