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,312 @@
1
+ import copy
2
+ import json
3
+ import operator
4
+ from functools import reduce
5
+
6
+ from django.db.models import Case, Count, ExpressionWrapper, FloatField, IntegerField, Q, Sum, Value, When
7
+ from django.db.models.functions import NullIf, Round
8
+ from django_datatables.columns import CurrencyColumn, CurrencyPenceColumn
9
+
10
+ from advanced_report_builder.columns import (
11
+ ReportBuilderCurrencyColumn,
12
+ ReportBuilderCurrencyPenceColumn,
13
+ ReportBuilderNumberColumn,
14
+ )
15
+ from advanced_report_builder.field_utils import ReportBuilderFieldUtils
16
+ from advanced_report_builder.filter_query import FilterQueryMixin
17
+ from advanced_report_builder.globals import (
18
+ AGGREGATE_CLASSES,
19
+ ALIGNMENT_CHOICE_RIGHT,
20
+ ALIGNMENT_CLASS,
21
+ ANNOTATION_CHOICE_COUNT,
22
+ ANNOTATION_CHOICE_NA,
23
+ ANNOTATION_FUNCTIONS,
24
+ )
25
+ from advanced_report_builder.utils import decode_attribute
26
+
27
+
28
+ class ReportUtilsMixin(ReportBuilderFieldUtils, FilterQueryMixin):
29
+ use_annotations = True
30
+ number_field = ReportBuilderNumberColumn
31
+
32
+ def get_number_field(
33
+ self,
34
+ annotations_type,
35
+ append_annotation_query,
36
+ index,
37
+ table_field,
38
+ data_attr,
39
+ fields,
40
+ col_type_override,
41
+ extra_filter=None,
42
+ title_suffix='',
43
+ multiple_index=0,
44
+ decimal_places=None,
45
+ convert_currency_fields=False,
46
+ totals=None,
47
+ divider=None,
48
+ additional_options=None,
49
+ ):
50
+ field_name = table_field['field']
51
+ alignment_class = ALIGNMENT_CLASS.get(int(data_attr.get('alignment', ALIGNMENT_CHOICE_RIGHT)))
52
+ new_field_name = field_name
53
+
54
+ if decimal_places is None:
55
+ decimal_places = 0
56
+
57
+ css_class = None
58
+ annotation_filter = None
59
+ if annotations_type != ANNOTATION_CHOICE_NA or append_annotation_query:
60
+ b64_filter = data_attr.get('filter')
61
+ if b64_filter:
62
+ _filter = decode_attribute(b64_filter)
63
+ _filter = json.loads(_filter)
64
+ annotation_filter = self.process_filters(search_filter_data=_filter, extra_filter=extra_filter)
65
+ elif extra_filter:
66
+ annotation_filter = reduce(operator.and_, [extra_filter])
67
+
68
+ if int(data_attr.get('display_heading', 1)) == 0:
69
+ title = ''
70
+ elif title_suffix == '':
71
+ title = table_field.get('title')
72
+ elif int(data_attr.get('append_column_title', 0)) == 0:
73
+ title = title_suffix
74
+ else:
75
+ title = title_suffix + ' ' + table_field.get('title')
76
+ if col_type_override:
77
+ col_type_override.table = None
78
+ field = copy.deepcopy(col_type_override)
79
+ if field.model_path and isinstance(field.field, str) and field.field.startswith(field.model_path):
80
+ raw_field_name = field.field[len(field.model_path) :]
81
+ else:
82
+ raw_field_name = field.field
83
+
84
+ if convert_currency_fields:
85
+ if isinstance(field, CurrencyPenceColumn):
86
+ field.__class__ = ReportBuilderCurrencyPenceColumn
87
+ elif isinstance(field, CurrencyColumn):
88
+ field.__class__ = ReportBuilderCurrencyColumn
89
+ if append_annotation_query and field.annotations:
90
+ css_class = field.column_defs.get('className')
91
+ if css_class is None:
92
+ css_class = alignment_class
93
+ else:
94
+ css_class += ' ' + alignment_class
95
+ field.column_defs['className'] = css_class
96
+ if title:
97
+ field.title = title
98
+
99
+ field = copy.deepcopy(field)
100
+
101
+ current_annotations = getattr(field.annotations[field_name], 'filter', None)
102
+ new_field_name = f'{field_name}_{index}'
103
+ # assert False, field.annotations[field_name]
104
+ if current_annotations is None:
105
+ new_annotations = {}
106
+ for _key, value in field.annotations.items():
107
+ if isinstance(value, AGGREGATE_CLASSES):
108
+ # Extract the original expression from the aggregate
109
+ original_expression = value.source_expressions[0]
110
+
111
+ # Build the conditional When clause
112
+ if isinstance(annotation_filter, Q):
113
+ condition = When(annotation_filter, then=original_expression)
114
+ else:
115
+ condition = When(**annotation_filter, then=original_expression)
116
+
117
+ # Determine appropriate output field
118
+ if isinstance(value, (Count, Sum)):
119
+ output_field = IntegerField()
120
+ else: # Avg, Max, Min — typically float-based
121
+ output_field = FloatField()
122
+
123
+ # Reconstruct the aggregate class with Case wrapped expression
124
+ aggregate_class = type(value)
125
+ kwargs = {}
126
+
127
+ # Preserve flags like `distinct=True`
128
+ if hasattr(value, 'distinct') and value.distinct:
129
+ kwargs['distinct'] = True
130
+
131
+ new_annotations[new_field_name] = aggregate_class(
132
+ Case(condition, default=Value(0), output_field=output_field), **kwargs
133
+ )
134
+ field.annotations = new_annotations
135
+ field.column_name = new_field_name
136
+ elif annotation_filter is not None and len(annotation_filter) > 0:
137
+ new_annotations = current_annotations & annotation_filter
138
+ field.annotations[field_name].filter = new_annotations
139
+ field.annotations[new_field_name] = field.annotations.pop(field_name)
140
+ else:
141
+ field.annotations[new_field_name] = field.annotations.pop(field_name)
142
+ field.field = new_field_name
143
+ field_name = new_field_name
144
+
145
+ if annotations_type == ANNOTATION_CHOICE_COUNT:
146
+ new_field_name = self.get_new_annotation_field_name(
147
+ annotations_type=annotations_type,
148
+ field_name=field_name,
149
+ index=index,
150
+ data_attr=data_attr,
151
+ )
152
+ number_function_kwargs = {}
153
+ if title:
154
+ number_function_kwargs['title'] = title
155
+ if alignment_class != '':
156
+ css_class = alignment_class
157
+ number_function_kwargs['column_defs'] = {'className': css_class}
158
+ function_type = ANNOTATION_FUNCTIONS[annotations_type]
159
+ number_function_kwargs['options'] = {}
160
+ self.set_extra_number_field_kwargs(
161
+ data_attr=data_attr,
162
+ options=number_function_kwargs['options'],
163
+ multiple_index=multiple_index,
164
+ additional_options=additional_options,
165
+ )
166
+ if annotation_filter:
167
+ function = function_type(raw_field_name, filter=annotation_filter)
168
+ else:
169
+ function = function_type(raw_field_name)
170
+ if divider:
171
+ function = ExpressionWrapper(function / NullIf(divider, 0), output_field=FloatField())
172
+ if self.use_annotations:
173
+ number_function_kwargs['annotations'] = {new_field_name: function}
174
+ else:
175
+ number_function_kwargs['options']['calculated'] = True
176
+ number_function_kwargs['aggregations'] = {new_field_name: function}
177
+ number_function_kwargs['annotations'] = []
178
+
179
+ number_function_kwargs.update({'field': new_field_name, 'column_name': new_field_name})
180
+ field = self.number_field(**number_function_kwargs)
181
+ else:
182
+ css_class = field.column_defs.get('className')
183
+ if css_class is None:
184
+ css_class = alignment_class
185
+ else:
186
+ css_class += ' ' + alignment_class
187
+ field.column_defs['className'] = css_class
188
+ if title:
189
+ field.title = title
190
+ if field.annotations:
191
+ if not self.use_annotations and annotation_filter is None and not append_annotation_query:
192
+ field.options['calculated'] = True
193
+ field.aggregations = col_type_override.annotations
194
+ field.annotations = []
195
+ if title:
196
+ field.title = title
197
+
198
+ self.set_extra_number_field_kwargs(
199
+ data_attr=data_attr,
200
+ options=field.options,
201
+ multiple_index=multiple_index,
202
+ additional_options=additional_options,
203
+ )
204
+ elif annotations_type != ANNOTATION_CHOICE_NA:
205
+ new_field_name = self.get_new_annotation_field_name(
206
+ annotations_type=annotations_type,
207
+ field_name=field_name,
208
+ index=index,
209
+ data_attr=data_attr,
210
+ )
211
+ function_type = ANNOTATION_FUNCTIONS[annotations_type]
212
+ if annotation_filter:
213
+ function = function_type(raw_field_name, filter=annotation_filter)
214
+ else:
215
+ function = function_type(raw_field_name)
216
+ if divider:
217
+ function = ExpressionWrapper(function / NullIf(float(divider), 0.0), output_field=FloatField())
218
+ function = Round(function, decimal_places)
219
+
220
+ if self.use_annotations:
221
+ field.annotations = {new_field_name: function}
222
+ else:
223
+ field.options['calculated'] = True
224
+ field.aggregations = {new_field_name: function}
225
+ field.annotations = []
226
+
227
+ field.field = new_field_name
228
+ self.set_extra_number_field_kwargs(
229
+ data_attr=data_attr,
230
+ options=field.options,
231
+ multiple_index=multiple_index,
232
+ additional_options=additional_options,
233
+ )
234
+ fields.append(field)
235
+ else:
236
+ number_function_kwargs = {'title': title}
237
+ decimal_places = data_attr.get('decimal_places', decimal_places)
238
+ if decimal_places:
239
+ number_function_kwargs['decimal_places'] = int(decimal_places)
240
+ if annotations_type:
241
+ number_function_kwargs['options'] = {}
242
+ self.set_extra_number_field_kwargs(
243
+ data_attr=data_attr,
244
+ options=number_function_kwargs['options'],
245
+ multiple_index=multiple_index,
246
+ additional_options=additional_options,
247
+ )
248
+
249
+ new_field_name = self.get_new_annotation_field_name(
250
+ annotations_type=annotations_type,
251
+ field_name=field_name,
252
+ index=index,
253
+ data_attr=data_attr,
254
+ )
255
+ function_type = ANNOTATION_FUNCTIONS[annotations_type]
256
+ if annotation_filter:
257
+ function = function_type(field_name, filter=annotation_filter)
258
+ else:
259
+ function = function_type(field_name)
260
+
261
+ if self.use_annotations:
262
+ number_function_kwargs['annotations'] = {new_field_name: function}
263
+ else:
264
+ number_function_kwargs['options']['calculated'] = True
265
+ number_function_kwargs['aggregations'] = {new_field_name: function}
266
+ number_function_kwargs['annotations'] = []
267
+ field_name = new_field_name
268
+ number_function_kwargs.update({'field': field_name, 'column_name': field_name, 'model_path': ''})
269
+ field = self.number_field(**number_function_kwargs)
270
+ fields.append(field)
271
+
272
+ if totals is not None:
273
+ show_total = data_attr.get('show_totals')
274
+ if show_total == '1':
275
+ self.set_number_total(
276
+ totals=totals,
277
+ field_name=new_field_name,
278
+ col_type_override=col_type_override,
279
+ decimal_places=decimal_places,
280
+ css_class=css_class,
281
+ )
282
+ return field_name
283
+
284
+ @staticmethod
285
+ def get_new_annotation_field_name(annotations_type, field_name, index, data_attr):
286
+ annotation_column_id = data_attr.get('annotation_column_id')
287
+ if annotation_column_id:
288
+ return decode_attribute(annotation_column_id)
289
+ return f'{annotations_type}_{field_name}_{index}'
290
+
291
+ def set_extra_number_field_kwargs(self, data_attr, options, multiple_index, additional_options):
292
+ pass
293
+
294
+ # noinspection PyUnusedLocal,PyMethodMayBeStatic
295
+ def set_number_total(self, totals, field_name, col_type_override, decimal_places, css_class=''):
296
+ totals[field_name] = {
297
+ 'sum': 'to_fixed',
298
+ 'decimal_places': decimal_places,
299
+ 'css_class': css_class,
300
+ }
301
+
302
+ def set_annotation_total(self, totals, field_name, col_type_override, decimal_places, css_class=''):
303
+ return self.set_number_total(totals, field_name, col_type_override, decimal_places, css_class)
304
+
305
+ def set_percentage_total(self, totals, field_name, denominator, numerator, decimal_places, css_class=''):
306
+ totals[field_name] = {
307
+ 'sum': 'percentage',
308
+ 'decimal_places': decimal_places,
309
+ 'denominator': denominator,
310
+ 'numerator': numerator,
311
+ 'css_class': css_class,
312
+ }
@@ -0,0 +1,154 @@
1
+ from ajax_helpers.mixins import AjaxHelpers
2
+ from ajax_helpers.utils import is_ajax
3
+ from django.conf import settings
4
+ from django.contrib import messages
5
+ from django.http import Http404
6
+ from django.shortcuts import get_object_or_404
7
+ from django.urls import reverse
8
+ from django.views.generic import TemplateView
9
+ from django_datatables.columns import ColumnNameError
10
+ from django_menus.menu import MenuItemDisplay, MenuMixin
11
+ from django_modals.helper import modal_button, modal_button_method
12
+ from django_modals.modals import Modal
13
+
14
+ from advanced_report_builder.duplicate import DuplicateReport
15
+ from advanced_report_builder.exceptions import ReportError
16
+ from advanced_report_builder.models import Report
17
+ from advanced_report_builder.utils import get_template_type_class, get_view_type_class, split_slug
18
+
19
+
20
+ class ViewReportBase(AjaxHelpers, MenuMixin, TemplateView):
21
+ model = Report
22
+ enable_links = True
23
+ custom_views = {}
24
+ views_overrides = {}
25
+
26
+ def __init__(self, *args, **kwargs):
27
+ self.report = None
28
+ self._view_type_class = None
29
+ super().__init__(*args, **kwargs)
30
+
31
+ def redirect_url(self):
32
+ """used if the slug changes"""
33
+ return None
34
+
35
+ def dispatch(self, request, *args, **kwargs):
36
+ slug = split_slug(self.kwargs['slug'])
37
+ self.report = self.model.objects.filter(slug=slug['pk']).first()
38
+
39
+ if self.report is None:
40
+ self.report = self.model.objects.filter(slug_alias=slug['pk']).first()
41
+ if self.report is None:
42
+ return self.report_not_found()
43
+ else:
44
+ redirect_url = self.redirect_url()
45
+ if redirect_url:
46
+ return redirect_url
47
+
48
+ if not self.has_permission():
49
+ return self.report_no_permission()
50
+
51
+ return super().dispatch(request, *args, **kwargs)
52
+
53
+ def get_report_template(self):
54
+ template_type_class = get_template_type_class()
55
+ return template_type_class.get_template_name_from_instance_type(
56
+ instance_type=self.report.instance_type, template_style=self.report.template_style
57
+ )
58
+
59
+ def has_permission(self):
60
+ """You can over override this to check if the user has permission to view the report.
61
+ If return false 'report_no_permission' will be called"""
62
+ return True
63
+
64
+ def report_no_permission(self):
65
+ raise Http404
66
+
67
+ def report_not_found(self):
68
+ raise Http404
69
+
70
+ def get_context_data(self, **kwargs):
71
+ context = super().get_context_data(**kwargs)
72
+ view = self.get_view(report=self.report)
73
+ self.kwargs['report'] = self.report
74
+ self.kwargs['enable_links'] = self.enable_links
75
+ self.kwargs['output_type_template'] = self.get_report_template()
76
+ try:
77
+ report_data = view.as_view()(self.request, *self.args, **self.kwargs).rendered_content
78
+ except (ReportError, ColumnNameError) as e:
79
+ report_data = self.call_error_view(error_message=e.value)
80
+ context['report'] = report_data
81
+ return context
82
+
83
+ def call_error_view(self, error_message):
84
+ error_view = (
85
+ self.views_overrides.get('error')
86
+ if 'error' in self.views_overrides
87
+ else self.get_view_types_class().views.get('error')
88
+ )
89
+ report_cls = self.get_view(self.report)
90
+
91
+ return error_view.as_view()(
92
+ self.request,
93
+ *self.args,
94
+ extra_kwargs={'error_message': error_message, 'report_cls': report_cls},
95
+ **self.kwargs,
96
+ ).rendered_content
97
+
98
+ def get_view(self, report):
99
+ view_types_class = self.get_view_types_class()
100
+ if report.instance_type == 'customreport':
101
+ view_name = report.customreport.view_name
102
+ return self.custom_views.get(view_name, view_types_class.custom_views.get(view_name))
103
+ elif report.instance_type in self.views_overrides:
104
+ return self.views_overrides.get(report.instance_type)
105
+ return view_types_class.views.get(report.instance_type)
106
+
107
+ def post(self, request, *args, **kwargs):
108
+ if (
109
+ is_ajax(request)
110
+ and request.content_type
111
+ in [
112
+ 'application/json',
113
+ 'multipart/form-data',
114
+ ]
115
+ and hasattr(super(), 'post')
116
+ ):
117
+ # noinspection PyUnresolvedReferences
118
+ return super().post(request, *args, **kwargs)
119
+
120
+ view = self.get_view(report=self.report)
121
+ self.kwargs['report'] = self.report
122
+ self.kwargs['enable_links'] = self.enable_links
123
+ return view.as_view()(self.request, *self.args, **self.kwargs)
124
+
125
+ def get_view_types_class(self):
126
+ if self._view_type_class is None:
127
+ self._view_type_class = get_view_type_class()
128
+ return self._view_type_class
129
+
130
+
131
+ class DuplicateReportModal(Modal):
132
+ menu_display = MenuItemDisplay('Duplicate', font_awesome='fas fa-copy')
133
+
134
+ def modal_content(self):
135
+ return 'Are you sure you want to duplicate this report?'
136
+
137
+ def get_modal_buttons(self):
138
+ return [
139
+ modal_button_method('Confirm', 'duplicate'),
140
+ modal_button('Cancel', 'close', 'btn-secondary'),
141
+ ]
142
+
143
+ def button_duplicate(self, **_kwargs):
144
+ report = get_object_or_404(Report, id=self.slug['pk'])
145
+ duplicate_report = DuplicateReport()
146
+ new_report = duplicate_report.duplicate(report=report)
147
+ messages.add_message(self.request, messages.SUCCESS, f'Successfully duplicated {report.name}')
148
+
149
+ url_name = getattr(settings, 'REPORT_BUILDER_DETAIL_URL_NAME', '')
150
+ if url_name:
151
+ url = reverse(url_name, kwargs={'slug': new_report.slug})
152
+ return self.command_response('redirect', url=url)
153
+ else:
154
+ return self.command_response('reload')