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,147 @@
1
+ from django.views.generic import TemplateView
2
+ from django_menus.menu import MenuItem
3
+ from django_modals.modals import ModelFormModal
4
+ from django_modals.processes import PERMISSION_OFF, PROCESS_EDIT_DELETE
5
+ from django_modals.widgets.select2 import Select2Multiple
6
+
7
+ from advanced_report_builder.filter_query import FilterQueryMixin
8
+ from advanced_report_builder.models import CustomReport, ReportType
9
+ from advanced_report_builder.utils import split_slug
10
+ from advanced_report_builder.views.query_modal.mixin import MultiQueryModalMixin
11
+ from advanced_report_builder.views.report import ReportBase
12
+
13
+
14
+ class CustomBaseView(ReportBase, FilterQueryMixin, TemplateView):
15
+ report_type_slug = None
16
+
17
+ def __init__(self, **kwargs):
18
+ self.report = None
19
+ self.slug = None
20
+ self.enable_edit = None
21
+ self.dashboard_report = None
22
+ self.show_toolbar = False
23
+ self.enable_queries = True
24
+ self._report_type = None
25
+ self.extra_kwargs = None
26
+ super().__init__(**kwargs)
27
+
28
+ def dispatch(self, request, *args, **kwargs):
29
+ self.report = kwargs.get('report')
30
+ self.request = request
31
+ self.slug = split_slug(kwargs.get('slug'))
32
+ self.enable_edit = kwargs.get('enable_edit')
33
+ self.dashboard_report = kwargs.get('dashboard_report')
34
+ if self.enable_edit or (self.dashboard_report and not self.dashboard_report.top) or not self.dashboard_report:
35
+ self.show_toolbar = True
36
+ self.extra_kwargs = kwargs.get('extra_kwargs', {})
37
+ return super().dispatch(request, *args, **kwargs)
38
+
39
+ def get_context_data(self, **kwargs):
40
+ context = super().get_context_data(**kwargs)
41
+ context['report'] = self.report
42
+ context['show_toolbar'] = self.show_toolbar
43
+ context['title'] = self.get_title()
44
+ return context
45
+
46
+ def setup_menu(self):
47
+ super().setup_menu()
48
+ if not self.show_toolbar:
49
+ return
50
+
51
+ if self.dashboard_report and self.enable_edit:
52
+ report_menu = self.pod_dashboard_edit_menu()
53
+ elif self.dashboard_report and not self.enable_edit:
54
+ report_menu = self.pod_dashboard_view_menu()
55
+ elif self.enable_queries:
56
+ report_menu = self.pod_report_menu()
57
+ else:
58
+ report_menu = []
59
+ if self.enable_queries:
60
+ self.add_menu('button_menu', 'button_group').add_items(
61
+ *report_menu,
62
+ *self.queries_option_menus(report=self.report, dashboard_report=self.dashboard_report),
63
+ )
64
+ else:
65
+ self.add_menu('button_menu', 'button_group').add_items(
66
+ *report_menu,
67
+ )
68
+
69
+ def pod_dashboard_edit_menu(self):
70
+ return [
71
+ MenuItem(
72
+ f'advanced_report_builder:dashboard_report_modal,pk-{self.dashboard_report.id}',
73
+ menu_display='Edit',
74
+ font_awesome='fas fa-pencil-alt',
75
+ css_classes=['btn-primary'],
76
+ )
77
+ ]
78
+
79
+ # noinspection PyMethodMayBeStatic
80
+ def pod_dashboard_view_menu(self):
81
+ return []
82
+
83
+ # noinspection PyMethodMayBeStatic
84
+ def pod_report_menu(self):
85
+ return []
86
+
87
+ def get_title(self):
88
+ if self.dashboard_report and self.dashboard_report.name_override:
89
+ return self.dashboard_report.name_override
90
+ else:
91
+ return self.report.name
92
+
93
+ def get_report_type(self):
94
+ if self.report_type_slug is not None:
95
+ if self._report_type is None:
96
+ self._report_type = ReportType.objects.get(slug=self.report_type_slug)
97
+ return self._report_type
98
+ return None
99
+
100
+ def get_default_query(self):
101
+ report_type = self.get_report_type()
102
+ if report_type is not None:
103
+ base_model = report_type.content_type.model_class()
104
+ return base_model.objects.all()
105
+ return None
106
+
107
+ def get_default_filter(self, query):
108
+ return query
109
+
110
+ def get_query_results(self):
111
+ query = self.get_default_query()
112
+ if query is None:
113
+ return None
114
+ report_query = self.get_report_query(report=self.report)
115
+ if report_query:
116
+ query = self.process_query_filters(query=query, search_filter_data=report_query.query)
117
+ report_type = self.get_report_type()
118
+ if report_type is not None:
119
+ base_model = report_type.content_type.model_class()
120
+ query = self.apply_order_by(
121
+ query=query,
122
+ report_query=report_query,
123
+ report_type=report_type,
124
+ base_model=base_model,
125
+ )
126
+ return query
127
+ return self.get_default_filter(query)
128
+
129
+
130
+ class CustomModal(MultiQueryModalMixin, ModelFormModal):
131
+ process = PROCESS_EDIT_DELETE
132
+ permission_delete = PERMISSION_OFF
133
+ model = CustomReport
134
+ ajax_commands = ['datatable', 'button']
135
+
136
+ widgets = {'report_tags': Select2Multiple}
137
+
138
+ form_fields = ['name', 'report_tags', 'notes']
139
+
140
+ def form_setup(self, form, *_args, **_kwargs):
141
+ fields = [*self.form_fields]
142
+ if self.object.id and 'report_type' in self.slug:
143
+ self.add_extra_queries(form=form, fields=fields)
144
+ return fields
145
+
146
+ def get_report_type(self, **_kwargs):
147
+ return self.slug['report_type']
@@ -0,0 +1,357 @@
1
+ import copy
2
+
3
+ from ajax_helpers.mixins import AjaxHelpers
4
+ from crispy_forms.layout import Fieldset
5
+ from django.conf import settings
6
+ from django.forms import ChoiceField, ModelChoiceField
7
+ from django.http import Http404
8
+ from django.shortcuts import get_object_or_404
9
+ from django.urls import reverse
10
+ from django.views.generic import TemplateView
11
+ from django_datatables.columns import ColumnNameError
12
+ from django_menus.menu import MenuMixin
13
+ from django_modals.forms import CrispyForm
14
+ from django_modals.modals import FormModal, ModelFormModal
15
+ from django_modals.processes import (
16
+ PERMISSION_DISABLE,
17
+ PERMISSION_OFF,
18
+ PROCESS_EDIT_DELETE,
19
+ )
20
+ from django_modals.widgets.select2 import Select2
21
+ from django_modals.widgets.widgets import Toggle
22
+
23
+ from advanced_report_builder.exceptions import ReportError
24
+ from advanced_report_builder.models import (
25
+ Dashboard,
26
+ DashboardReport,
27
+ Report,
28
+ ReportQuery,
29
+ )
30
+ from advanced_report_builder.utils import (
31
+ get_report_builder_class,
32
+ get_template_type_class,
33
+ get_view_type_class,
34
+ split_slug,
35
+ )
36
+
37
+
38
+ class ViewDashboardBase(AjaxHelpers, MenuMixin, TemplateView):
39
+ model = Dashboard
40
+ enable_edit = True
41
+ enable_links = True
42
+ custom_views = {}
43
+ views_overrides = {}
44
+ ajax_commands = ['button', 'select2', 'ajax']
45
+
46
+ def __init__(self, *args, **kwargs):
47
+ self.dashboard = None
48
+ self._view_type_class = None
49
+ super().__init__(*args, **kwargs)
50
+
51
+ def redirect_url(self):
52
+ """used if the slug changes"""
53
+ return None
54
+
55
+ def dashboard_not_found(self):
56
+ raise Http404
57
+
58
+ def dispatch(self, request, *args, **kwargs):
59
+ slug = split_slug(self.kwargs['slug'])
60
+ self.dashboard = self.model.objects.filter(slug=slug['pk']).first()
61
+
62
+ if self.dashboard is None:
63
+ self.dashboard = self.model.objects.filter(slug_alias=slug['pk']).first()
64
+ if self.dashboard is None:
65
+ return self.dashboard_not_found()
66
+ else:
67
+ redirect_url = self.redirect_url()
68
+ if redirect_url:
69
+ return redirect_url
70
+
71
+ return super().dispatch(request, *args, **kwargs)
72
+
73
+ def get_view_types_class(self):
74
+ if self._view_type_class is None:
75
+ self._view_type_class = get_view_type_class()
76
+ return self._view_type_class
77
+
78
+ @staticmethod
79
+ def get_top_report_class(reports):
80
+ reports_len = len(reports)
81
+ spans = {
82
+ 1: ' col-12',
83
+ 2: ' col-12 col-sm-12 col-md-6',
84
+ 3: ' col-12 col-sm-12 col-md-4',
85
+ 4: ' col-12 col-sm-12 col-md-6 col-lg-3',
86
+ 6: ' col-12 col-sm-12 col-md-4',
87
+ 9: ' col-12 col-sm-12 col-md-4',
88
+ }
89
+ return spans.get(reports_len, ' col-12 col-sm-12 col-md-3')
90
+
91
+ def has_dashboard_permission(self):
92
+ """You can over override this to check if the user has permission to view the dashboard.
93
+ If return false 'dashboard_no_permission' will be called"""
94
+ return True
95
+
96
+ def dashboard_no_permission(self):
97
+ raise Http404
98
+
99
+ def has_report_got_permission(self, report):
100
+ """You can over override this to check if the user has permission to view the report.
101
+ If return false 'report_no_permission' will be called"""
102
+ return True
103
+
104
+ def report_no_permission(self, dashboard_report, reports):
105
+ pass
106
+
107
+ def get_context_data(self, **kwargs):
108
+ context = super().get_context_data(**kwargs)
109
+ context['dashboard'] = self.dashboard
110
+
111
+ if not self.has_dashboard_permission():
112
+ return self.dashboard_no_permission()
113
+
114
+ top_reports = []
115
+ reports = []
116
+ for dashboard_report in self.dashboard.dashboardreport_set.all():
117
+ if self.has_report_got_permission(report=dashboard_report.report):
118
+ report_view = self.get_view(report=dashboard_report.report)
119
+ extra_class_name = report_view().get_dashboard_class(report=dashboard_report.report)
120
+ try:
121
+ report_data = self.call_view(
122
+ dashboard_report=dashboard_report, report_view=report_view
123
+ ).rendered_content
124
+ report = {
125
+ 'render': report_data,
126
+ 'name': dashboard_report.report.name,
127
+ 'id': dashboard_report.id,
128
+ 'class': dashboard_report.get_class(extra_class_name=extra_class_name),
129
+ }
130
+ except (ReportError, ColumnNameError) as e:
131
+ report = self.call_error_view(
132
+ dashboard_report=dashboard_report, extra_class_name=extra_class_name, error_message=e.value
133
+ )
134
+ if dashboard_report.top:
135
+ top_reports.append(report)
136
+ else:
137
+ reports.append(report)
138
+
139
+ else:
140
+ self.report_no_permission(dashboard_report=dashboard_report, reports=reports)
141
+
142
+ context['top_reports'] = top_reports
143
+ context['top_reports_class'] = self.get_top_report_class(top_reports)
144
+
145
+ context['reports'] = reports
146
+ context['enable_edit'] = self.enable_edit
147
+ return context
148
+
149
+ def call_error_view(self, dashboard_report, extra_class_name, error_message):
150
+ view_types_class = self.get_view_types_class()
151
+ error_view = (
152
+ self.views_overrides.get('error')
153
+ if 'error' in self.views_overrides
154
+ else view_types_class.views.get('error')
155
+ )
156
+ report_data = self.call_view(
157
+ dashboard_report=dashboard_report, report_view=error_view, extra_kwargs={'error_message': error_message}
158
+ ).rendered_content
159
+ report = {
160
+ 'render': report_data,
161
+ 'name': dashboard_report.report.name,
162
+ 'id': dashboard_report.id,
163
+ 'class': dashboard_report.get_class(extra_class_name=extra_class_name),
164
+ }
165
+ return report
166
+
167
+ def get_view(self, report):
168
+ view_types_class = self.get_view_types_class()
169
+ if report.instance_type == 'customreport':
170
+ view_name = report.customreport.view_name
171
+ return self.custom_views.get(view_name, view_types_class.custom_views.get(view_name))
172
+ elif report.instance_type in self.views_overrides:
173
+ return self.views_overrides.get(report.instance_type)
174
+ return view_types_class.views.get(report.instance_type)
175
+
176
+ def call_view(self, dashboard_report, report_view=None, extra_kwargs=None):
177
+ if report_view is None:
178
+ report_view = self.get_view(report=dashboard_report.report)
179
+ view_kwargs = copy.deepcopy(self.kwargs)
180
+ view_kwargs['report'] = dashboard_report.report
181
+ view_kwargs['dashboard_report'] = dashboard_report
182
+ view_kwargs['enable_edit'] = self.enable_edit
183
+ view_kwargs['enable_links'] = self.enable_links
184
+ view_kwargs['output_type_template'] = self.get_report_template(dashboard_report=dashboard_report)
185
+ view_kwargs['extra_kwargs'] = extra_kwargs
186
+ return report_view.as_view()(self.request, *self.args, **view_kwargs)
187
+
188
+ def get_report_template(self, dashboard_report):
189
+ template_types = get_template_type_class()
190
+ return template_types.get_template_name_from_instance_type(
191
+ instance_type=dashboard_report.report.instance_type, template_style=dashboard_report.report.template_style
192
+ )
193
+
194
+ def post(self, request, *args, **kwargs):
195
+ table_id = request.POST.get('table_id')
196
+ if table_id: # must be a datatable:
197
+ dashboard_report_id = table_id.split('_')[1]
198
+ if dashboard_report_id:
199
+ dashboard_report = self.dashboard.dashboardreport_set.filter(id=dashboard_report_id).first()
200
+ return self.call_view(dashboard_report=dashboard_report)
201
+
202
+ return super().post(request, *args, **kwargs)
203
+
204
+ def ajax_change_placement(self, **kwargs):
205
+ ids = kwargs['ids']
206
+ dashboard_reports = DashboardReport.objects.filter(id__in=ids)
207
+ obj_dict = dict([(obj.id, obj) for obj in dashboard_reports])
208
+ sorted_objects = [obj_dict[_id] for _id in ids]
209
+
210
+ for index, dashboard_report in enumerate(sorted_objects):
211
+ if dashboard_report.order != index:
212
+ dashboard_report.order = index
213
+ dashboard_report.save()
214
+
215
+ return self.command_response()
216
+
217
+
218
+ class DashboardModal(ModelFormModal):
219
+ model = Dashboard
220
+ form_fields = ['name', 'display_option']
221
+ process = PROCESS_EDIT_DELETE
222
+ permission_delete = PERMISSION_OFF
223
+
224
+ def post_save(self, created, form):
225
+ if created:
226
+ url_name = getattr(settings, 'REPORT_BUILDER_DASHBOARD_URL_NAME', '')
227
+ if url_name:
228
+ url = reverse(url_name, kwargs={'slug': self.object.slug})
229
+ self.add_command('redirect', url=url)
230
+
231
+
232
+ class DashboardReportModal(ModelFormModal):
233
+ model = DashboardReport
234
+ process = PROCESS_EDIT_DELETE
235
+ permission_delete = PERMISSION_OFF
236
+ permission_create = PERMISSION_DISABLE
237
+
238
+ def __init__(self, *args, **kwargs):
239
+ self._report_options = None
240
+ super().__init__(*args, **kwargs)
241
+
242
+ @property
243
+ def form_fields(self):
244
+ fields = ['name_override', 'top', 'display_option']
245
+ report_obj = getattr(self.object.report, self.object.report.instance_type)
246
+ if report_obj.show_dashboard_query():
247
+ fields += [
248
+ 'show_versions',
249
+ 'report_query',
250
+ ]
251
+ if report_obj.show_options() and len(self.get_report_options()) > 0:
252
+ fields.append('show_options')
253
+ return fields
254
+
255
+ widgets = {
256
+ 'top': Toggle(attrs={'data-onstyle': 'success', 'data-on': 'YES', 'data-off': 'NO'}),
257
+ 'show_versions': Toggle(attrs={'data-onstyle': 'success', 'data-on': 'YES', 'data-off': 'NO'}),
258
+ 'show_options': Toggle(attrs={'data-onstyle': 'success', 'data-on': 'YES', 'data-off': 'NO'}),
259
+ }
260
+
261
+ def get_report_options(self):
262
+ if self._report_options is None:
263
+ self._report_options = self.object.report.reportoption_set.all()
264
+ return self._report_options
265
+
266
+ def form_setup(self, form, *_args, **_kwargs):
267
+ layout = ['name_override', 'top', 'display_option']
268
+ form.add_trigger(
269
+ 'top',
270
+ 'onchange',
271
+ [
272
+ {
273
+ 'selector': '#div_id_display_option',
274
+ 'values': {'checked': 'hide'},
275
+ 'default': 'show',
276
+ },
277
+ ],
278
+ )
279
+ form.fields[
280
+ 'name_override'
281
+ ].help_text = f'Original report name "{self.object.report.name}". Leave blank to keep this name.'
282
+ report_obj = getattr(self.object.report, self.object.report.instance_type)
283
+ report_obj.dashboard_fields(form=form, dashboard_report=self.object, layout=layout)
284
+ if report_obj.show_dashboard_query():
285
+ layout += ['show_versions', 'report_query']
286
+ report_queries = ReportQuery.objects.filter(report=form.instance.report)
287
+ form.fields['report_query'] = ModelChoiceField(queryset=report_queries, widget=Select2, required=False)
288
+
289
+ if report_obj.show_options() and len(report_options := self.get_report_options()) > 0:
290
+ layout.append('show_options')
291
+ options = []
292
+ for report_option in report_options:
293
+ field_id = f'option{report_option.id}'
294
+
295
+ base_model = report_option.content_type.model_class()
296
+ report_cls = get_report_builder_class(
297
+ model=base_model, class_name=report_option.report_builder_class_name
298
+ )
299
+ choices = [(0, 'N/A')]
300
+ for _obj in base_model.objects.filter(report_cls.options_filter):
301
+ method = getattr(_obj, report_cls.option_label, None)
302
+ label = method() if callable(method) else _obj.__str__()
303
+ choices.append((_obj.id, label))
304
+ initial = self.object.options.get(field_id) if self.object.options else None
305
+ form.fields[field_id] = ChoiceField(
306
+ required=False, label=report_option.name, choices=choices, initial=initial
307
+ )
308
+ options.append(field_id)
309
+ if options:
310
+ layout.append(Fieldset('Options', *options))
311
+ return layout
312
+
313
+ def form_valid(self, form):
314
+ instance = form.save(commit=False)
315
+ instance._current_user = self.request.user
316
+ report_obj = getattr(self.object.report, self.object.report.instance_type)
317
+ report_obj.save_extra_dashboard_fields(form=form, dashboard_report=instance)
318
+ report_options = self.get_report_options()
319
+ if report_options:
320
+ options = instance.options if instance.options else {}
321
+ for report_option in report_options:
322
+ field_id = f'option{report_option.id}'
323
+ raw_value = form.cleaned_data.get(field_id)
324
+ try:
325
+ value = int(raw_value or 0)
326
+ except (TypeError, ValueError):
327
+ value = 0
328
+ if value == 0:
329
+ if field_id in options:
330
+ del options[field_id]
331
+ else:
332
+ options[field_id] = value
333
+ instance.options = options
334
+ instance.save()
335
+ return self.command_response('reload')
336
+
337
+
338
+ class DashboardAddReportModal(FormModal):
339
+ form_class = CrispyForm
340
+ modal_title = 'Add Report'
341
+
342
+ def form_setup(self, form, *_args, **_kwargs):
343
+ grouped_choices = {}
344
+ for report in Report.objects.all():
345
+ group_name = report.get_output_type_name()
346
+ grouped_choices.setdefault(group_name, []).append((report.pk, report.name))
347
+
348
+ form.fields['report'] = ChoiceField(
349
+ choices=[(group_name, choices) for group_name, choices in grouped_choices.items()], widget=Select2
350
+ )
351
+
352
+ def form_valid(self, form):
353
+ dashboard = get_object_or_404(Dashboard, id=self.slug['pk'])
354
+ dashboard_report = DashboardReport(dashboard=dashboard)
355
+ dashboard_report.report_id = form.cleaned_data['report']
356
+ dashboard_report.save()
357
+ return self.command_response('reload')
File without changes
@@ -0,0 +1,151 @@
1
+ from django.core.exceptions import FieldDoesNotExist, FieldError
2
+ from django.db import ProgrammingError
3
+ from django_datatables.datatables import DatatableError, DatatableView
4
+ from django_datatables.helpers import row_link
5
+ from django_menus.menu import MenuItem
6
+
7
+ from advanced_report_builder.columns import ArrowColumn
8
+ from advanced_report_builder.exceptions import ReportError
9
+ from advanced_report_builder.utils import get_report_builder_class, split_slug
10
+ from advanced_report_builder.views.datatables.utils import TableUtilsMixin
11
+ from advanced_report_builder.views.report import ReportBase
12
+
13
+
14
+ class TableView(ReportBase, TableUtilsMixin, DatatableView):
15
+ template_name = 'advanced_report_builder/datatables/report.html'
16
+ menu_display = ''
17
+
18
+ def __init__(self, *args, **kwargs):
19
+ self.table_id = None
20
+ super().__init__(*args, **kwargs)
21
+
22
+ def add_tables(self):
23
+ return None
24
+
25
+ def dispatch(self, request, *args, **kwargs):
26
+ self.slug = split_slug(self.kwargs['slug'])
27
+ self.report = kwargs.get('report')
28
+ self.table_report = self.report.tablereport
29
+ self.dashboard_report = kwargs.get('dashboard_report')
30
+ self.enable_edit = kwargs.get('enable_edit')
31
+ if self.dashboard_report:
32
+ self.table_id = f'tabledashboard_{self.dashboard_report.id}'
33
+ else:
34
+ self.table_id = f'table_{self.table_report.id}'
35
+
36
+ self.base_model = self.table_report.get_base_model()
37
+ self.add_table(self.table_id, model=self.base_model)
38
+
39
+ try:
40
+ return super().dispatch(request, *args, **kwargs)
41
+ except DatatableError as de:
42
+ raise ReportError(de.args[0])
43
+ except ProgrammingError as de:
44
+ raise ReportError(de.args[0])
45
+
46
+ def setup_table(self, table):
47
+ table.extra_filters = self.extra_filters
48
+ base_model = self.table_report.get_base_model()
49
+ table_fields = self.table_report.table_fields
50
+ pivot_fields = self.table_report.pivot_fields
51
+ fields_used = set()
52
+ fields_map = {}
53
+ report_builder_class = get_report_builder_class(model=base_model, report_type=self.table_report.report_type)
54
+ try:
55
+ self.process_query_results(
56
+ report_builder_class=report_builder_class,
57
+ table=table,
58
+ base_model=base_model,
59
+ fields_used=fields_used,
60
+ fields_map=fields_map,
61
+ table_fields=table_fields,
62
+ pivot_fields=pivot_fields,
63
+ )
64
+ except (FieldError, FieldDoesNotExist) as e:
65
+ raise ReportError(e)
66
+ if self.table_report.order_by_field:
67
+ order_by_field = self.table_report.order_by_field
68
+ if order_by_field not in fields_used:
69
+ table.add_columns(f'.{order_by_field}')
70
+ elif order_by_field in fields_map:
71
+ order_by_field = fields_map[order_by_field]
72
+ if self.table_report.order_by_ascending:
73
+ table.sort(order_by_field)
74
+ else:
75
+ table.sort(f'-{order_by_field}')
76
+
77
+ table.table_options['pageLength'] = self.table_report.page_length
78
+ table.table_options['bStateSave'] = False
79
+
80
+ if self.table_report.has_clickable_rows and self.table_report.link_field and self.kwargs.get('enable_links'):
81
+ table.table_classes.append('row_link')
82
+ table.add_columns(ArrowColumn(column_name='arrow_icon'))
83
+ _, col_type_override, _, _ = self.get_field_details(
84
+ base_model=base_model,
85
+ field=self.table_report.link_field,
86
+ report_builder_class=report_builder_class,
87
+ )
88
+ field = col_type_override.field[0] if isinstance(col_type_override.field, list) else 'id'
89
+ if field not in fields_used:
90
+ table.add_columns(f'.{field}')
91
+ table.table_options['row_href'] = row_link(col_type_override.url, field)
92
+
93
+ def add_to_context(self, **kwargs):
94
+ return {'title': self.get_title(), 'table_report': self.table_report}
95
+
96
+ def setup_menu(self):
97
+ super().setup_menu()
98
+ if self.dashboard_report and self.enable_edit:
99
+ report_menu = self.pod_dashboard_edit_menu()
100
+ elif self.dashboard_report and not self.enable_edit:
101
+ report_menu = self.pod_dashboard_view_menu()
102
+ else:
103
+ report_menu = self.pod_report_menu()
104
+
105
+ self.add_menu('button_menu', 'button_group').add_items(
106
+ *report_menu,
107
+ *self.queries_option_menus(report=self.report, dashboard_report=self.dashboard_report),
108
+ )
109
+
110
+ def pod_dashboard_edit_menu(self):
111
+ return [
112
+ MenuItem(
113
+ f'advanced_report_builder:dashboard_report_modal,pk-{self.dashboard_report.id}',
114
+ menu_display='Edit',
115
+ font_awesome='fas fa-pencil-alt',
116
+ css_classes=['btn-primary'],
117
+ )
118
+ ]
119
+
120
+ # noinspection PyMethodMayBeStatic
121
+ def pod_dashboard_view_menu(self):
122
+ return []
123
+
124
+ def pod_report_menu(self):
125
+ query_id = self.slug.get(f'query{self.table_report.id}')
126
+ slug_str = ''
127
+ if query_id:
128
+ slug_str = f'-query_id-{query_id}'
129
+
130
+ return self.edit_report_menu(
131
+ request=self.request,
132
+ chart_report_id=self.table_report.id,
133
+ slug_str=slug_str,
134
+ )
135
+
136
+ def edit_report_menu(self, request, chart_report_id, slug_str):
137
+ return [
138
+ MenuItem(
139
+ f'advanced_report_builder:table_modal,pk-{chart_report_id}{slug_str}',
140
+ menu_display='Edit',
141
+ font_awesome='fas fa-pencil-alt',
142
+ css_classes=['btn-primary'],
143
+ ),
144
+ *self.duplicate_menu(request=self.request, report_id=chart_report_id),
145
+ ]
146
+
147
+ def get_dashboard_class(self, report):
148
+ pivot_fields = report.tablereport.pivot_fields
149
+ if pivot_fields is not None and len(pivot_fields) > 0:
150
+ return 'p-0'
151
+ return ''