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,868 @@
1
+ import json
2
+ from calendar import monthrange
3
+ from datetime import date, datetime, timedelta
4
+
5
+ from django.conf import settings
6
+ from django.db.models import Q
7
+ from django.forms import CharField, ChoiceField
8
+ from django.http import JsonResponse
9
+ from django.shortcuts import get_object_or_404
10
+ from django.template import Context, Template, TemplateSyntaxError
11
+ from django.urls import reverse
12
+ from django.views.generic import TemplateView
13
+ from django_datatables.columns import ColumnBase, MenuColumn
14
+ from django_datatables.datatables import DatatableExcludedRow
15
+ from django_datatables.helpers import DUMMY_ID, row_link
16
+ from django_datatables.widgets import DataTableReorderWidget
17
+ from django_menus.menu import HtmlMenu, MenuItem
18
+ from django_modals.fields import FieldEx
19
+ from django_modals.form_helpers import HorizontalNoEnterHelper
20
+ from django_modals.helper import modal_button, modal_button_method
21
+ from django_modals.modals import Modal, ModelFormModal
22
+ from django_modals.processes import PERMISSION_OFF, PROCESS_EDIT_DELETE
23
+ from django_modals.widgets.select2 import Select2, Select2Multiple
24
+
25
+ from advanced_report_builder.columns import ReportBuilderNumberColumn
26
+ from advanced_report_builder.data_merge.utils import DataMergeUtils
27
+ from advanced_report_builder.data_merge.widget import DataMergeWidget
28
+ from advanced_report_builder.filter_query import FilterQueryMixin
29
+ from advanced_report_builder.globals import (
30
+ DATE_FORMAT_TYPE_DD_MM_YY_SLASH,
31
+ DATE_FORMAT_TYPE_SHORT_WORDS_MM_YY,
32
+ DATE_FORMAT_TYPES_DJANGO_FORMAT,
33
+ )
34
+ from advanced_report_builder.models import (
35
+ KanbanReport,
36
+ KanbanReportDescription,
37
+ KanbanReportLane,
38
+ ReportType,
39
+ )
40
+ from advanced_report_builder.toggle import RBToggle
41
+ from advanced_report_builder.utils import (
42
+ crispy_modal_link_args,
43
+ get_report_builder_class,
44
+ )
45
+ from advanced_report_builder.variable_date import VariableDate
46
+ from advanced_report_builder.views.charts_base import ChartJSTable
47
+ from advanced_report_builder.views.helpers import QueryBuilderModelForm
48
+ from advanced_report_builder.views.modals_base import QueryBuilderModalBase
49
+ from advanced_report_builder.views.report import ReportBase
50
+
51
+
52
+ class DescriptionColumn(ColumnBase):
53
+ def row_result(self, data, _page_data, columns):
54
+ html = self.options['html']
55
+
56
+ for column in columns:
57
+ if not isinstance(column, DescriptionColumn):
58
+ data[column.column_name] = column.row_result(data, _page_data)
59
+
60
+ try:
61
+ template = Template(html)
62
+ context = Context(data)
63
+ return template.render(context)
64
+ except TemplateSyntaxError as e:
65
+ return f'Error in description ({e})'
66
+
67
+
68
+ class KanbanTable(ChartJSTable):
69
+ def get_table_array(self, request, results):
70
+ result_processes = self.get_result_processes()
71
+ for p in result_processes:
72
+ p.setup_results(request, self.page_results)
73
+ for c in self.columns:
74
+ c.setup_results(request, self.page_results)
75
+ results_list = []
76
+ for data_dict in results:
77
+ try:
78
+ for p in result_processes:
79
+ p.row_result(data_dict, self.page_results)
80
+ row_data = []
81
+ for column in self.columns:
82
+ if isinstance(column, DescriptionColumn):
83
+ row_data.append(column.row_result(data_dict, self.page_results, columns=self.columns))
84
+ else:
85
+ row_data.append(column.row_result(data_dict, self.page_results))
86
+
87
+ results_list.append(row_data)
88
+ except DatatableExcludedRow:
89
+ pass
90
+ return results_list
91
+
92
+
93
+ class KanbanView(DataMergeUtils, ReportBase, FilterQueryMixin, TemplateView):
94
+ number_field = ReportBuilderNumberColumn
95
+ template_name = 'advanced_report_builder/kanban/report.html'
96
+ chart_js_table = KanbanTable
97
+
98
+ def __init__(self, *args, **kwargs):
99
+ self.chart_report = None
100
+ super().__init__(*args, **kwargs)
101
+
102
+ def setup_menu(self):
103
+ super().setup_menu()
104
+ if self.dashboard_report and self.enable_edit:
105
+ report_menu = self.pod_dashboard_edit_menu()
106
+ elif self.dashboard_report and not self.enable_edit:
107
+ report_menu = self.pod_dashboard_view_menu()
108
+ else:
109
+ report_menu = self.pod_report_menu()
110
+ self.add_menu('button_menu', 'button_group').add_items(
111
+ *report_menu,
112
+ *self.queries_option_menus(report=self.report, dashboard_report=self.dashboard_report),
113
+ )
114
+
115
+ def dispatch(self, request, *args, **kwargs):
116
+ self.report = kwargs.get('report')
117
+ self.chart_report = self.report.kanbanreport
118
+ self.dashboard_report = kwargs.get('dashboard_report')
119
+ self.enable_edit = kwargs.get('enable_edit')
120
+ return super().dispatch(request, *args, **kwargs)
121
+
122
+ def view_filter_extra(self, query, table):
123
+ if table.extra_query_filter:
124
+ query = query.filter(table.extra_query_filter)
125
+ return self.view_filter(query, table)
126
+
127
+ def get_lane(
128
+ self,
129
+ base_model,
130
+ kanban_report_lane,
131
+ lanes,
132
+ label=None,
133
+ extra_query_filter=None,
134
+ multiple=False,
135
+ ):
136
+ table = self.chart_js_table(model=base_model)
137
+
138
+ report_builder_class = get_report_builder_class(model=base_model, report_type=kanban_report_lane.report_type)
139
+ table_indexes = []
140
+
141
+ if kanban_report_lane.heading_field is not None:
142
+ table_indexes.append('heading')
143
+ table.add_columns(kanban_report_lane.heading_field)
144
+
145
+ if kanban_report_lane.background_colour_field is not None:
146
+ table_indexes.append('background_colour')
147
+ table.add_columns(kanban_report_lane.background_colour_field)
148
+
149
+ if kanban_report_lane.heading_colour_field is not None:
150
+ table_indexes.append('heading_colour')
151
+ table.add_columns(kanban_report_lane.heading_colour_field)
152
+
153
+ if kanban_report_lane.kanban_report_description is not None:
154
+ description = kanban_report_lane.kanban_report_description.description
155
+ columns, column_map = self.get_data_merge_columns(
156
+ base_model=base_model,
157
+ report_builder_class=report_builder_class,
158
+ html=description,
159
+ table=table,
160
+ )
161
+
162
+ table_indexes.append('description')
163
+ table.add_columns(
164
+ DescriptionColumn(
165
+ column_name='description',
166
+ field='',
167
+ html=description,
168
+ column_map=column_map,
169
+ )
170
+ )
171
+ table.add_columns(*columns)
172
+
173
+ table.table_options['indexes'] = table_indexes
174
+
175
+ if kanban_report_lane.link_field and self.kwargs.get('enable_links'):
176
+ _, col_type_override, _, _ = self.get_field_details(
177
+ base_model=base_model,
178
+ field=kanban_report_lane.link_field,
179
+ report_builder_class=report_builder_class,
180
+ )
181
+ field = col_type_override.field[0] if isinstance(col_type_override.field, list) else 'id'
182
+ if field not in table.columns:
183
+ table.add_columns(f'.{field}')
184
+ table.has_link = True
185
+ table.table_options['row_href'] = row_link(col_type_override.url, field)
186
+ else:
187
+ table.has_link = False
188
+
189
+ table.datatable_template = 'advanced_report_builder/kanban/middle.html'
190
+
191
+ if kanban_report_lane.order_by_field:
192
+ if kanban_report_lane.order_by_ascending:
193
+ table.order_by = [kanban_report_lane.order_by_field]
194
+ else:
195
+ table.order_by = [f'-{kanban_report_lane.order_by_field}']
196
+
197
+ table.query_data = kanban_report_lane.query_data
198
+ table.extra_query_filter = extra_query_filter
199
+ table.view_filter = self.view_filter_extra
200
+ lanes.append(
201
+ {
202
+ 'datatable': table,
203
+ 'label': label,
204
+ 'kanban_report_lane': kanban_report_lane,
205
+ 'multiple': multiple,
206
+ }
207
+ )
208
+
209
+ @staticmethod
210
+ def get_multiple_date(multiple_type, current_date):
211
+ if multiple_type in (
212
+ KanbanReportLane.MULTIPLE_TYPE_DAILY,
213
+ KanbanReportLane.MULTIPLE_TYPE_DAILY_WITHIN,
214
+ ):
215
+ return current_date + timedelta(days=1)
216
+ elif multiple_type in (
217
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY,
218
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY_WITHIN,
219
+ ):
220
+ return current_date + timedelta(days=7)
221
+ elif multiple_type in (
222
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY,
223
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY_WITHIN,
224
+ ):
225
+ start_date = date(current_date.year, current_date.month, 1)
226
+ number_of_days = monthrange(start_date.year, current_date.month)[1]
227
+ result = datetime.combine(start_date, datetime.min.time()) + timedelta(days=number_of_days)
228
+ return result
229
+
230
+ raise AssertionError()
231
+
232
+ @staticmethod
233
+ def get_date_format():
234
+ return DATE_FORMAT_TYPES_DJANGO_FORMAT[DATE_FORMAT_TYPE_DD_MM_YY_SLASH]
235
+
236
+ @staticmethod
237
+ def get_month_format():
238
+ return DATE_FORMAT_TYPES_DJANGO_FORMAT[DATE_FORMAT_TYPE_SHORT_WORDS_MM_YY]
239
+
240
+ def get_full_label(self, multiple_type, current_date, label):
241
+ if multiple_type in (
242
+ KanbanReportLane.MULTIPLE_TYPE_DAILY,
243
+ KanbanReportLane.MULTIPLE_TYPE_DAILY_WITHIN,
244
+ ):
245
+ date_string = date.strftime(current_date, self.get_date_format())
246
+ return f'{label} {date_string}'
247
+ elif multiple_type in (
248
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY,
249
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY_WITHIN,
250
+ ):
251
+ date_string = date.strftime(current_date, self.get_date_format())
252
+ week_number = current_date.isocalendar()[1]
253
+ return f'{label} {date_string} (w/c {week_number})'
254
+ elif multiple_type in (
255
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY,
256
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY_WITHIN,
257
+ ):
258
+ date_string = date.strftime(current_date, self.get_month_format())
259
+ return f'{label} {date_string}'
260
+ raise AssertionError()
261
+
262
+ def get_context_data(self, **kwargs):
263
+ context = super().get_context_data(**kwargs)
264
+ context['title'] = self.get_title()
265
+ kanban_report_lanes = self.chart_report.kanbanreportlane_set.all()
266
+ lanes = []
267
+ headings = []
268
+
269
+ for kanban_report_lane in kanban_report_lanes:
270
+ base_model = kanban_report_lane.get_base_model()
271
+ report_builder_class = get_report_builder_class(
272
+ model=base_model, report_type=kanban_report_lane.report_type
273
+ )
274
+ if kanban_report_lane.multiple_type == KanbanReportLane.MULTIPLE_TYPE_NA:
275
+ self.get_lane(
276
+ base_model=base_model,
277
+ kanban_report_lane=kanban_report_lane,
278
+ lanes=lanes,
279
+ )
280
+ headings.append({'label': kanban_report_lane.name, 'row_span': 2, 'col_span': 1})
281
+ else:
282
+ variable_date = VariableDate()
283
+ financial_year_start_month = self.get_financial_month()
284
+ start_date_and_time, _, _ = variable_date.get_variable_dates(
285
+ range_type=kanban_report_lane.multiple_start_period,
286
+ financial_year_start_month=financial_year_start_month,
287
+ )
288
+ _, end_date_and_time, _ = variable_date.get_variable_dates(
289
+ range_type=kanban_report_lane.multiple_end_period,
290
+ financial_year_start_month=financial_year_start_month,
291
+ )
292
+
293
+ multiple_type = kanban_report_lane.multiple_type
294
+ current_start_date = start_date_and_time
295
+
296
+ _, _, _, field_name = self.get_field_details(
297
+ base_model=base_model,
298
+ field=kanban_report_lane.multiple_type_date_field,
299
+ report_builder_class=report_builder_class,
300
+ )
301
+
302
+ end_field_name = None
303
+ if kanban_report_lane.multiple_type_end_date_field:
304
+ _, _, _, end_field_name = self.get_field_details(
305
+ base_model=base_model,
306
+ field=kanban_report_lane.multiple_type_end_date_field,
307
+ report_builder_class=report_builder_class,
308
+ )
309
+
310
+ sub_lanes = []
311
+ while (
312
+ current_end_date := self.get_multiple_date(
313
+ multiple_type=multiple_type, current_date=current_start_date
314
+ )
315
+ ) <= end_date_and_time:
316
+ if multiple_type in (
317
+ KanbanReportLane.MULTIPLE_TYPE_DAILY,
318
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY,
319
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY,
320
+ ):
321
+ query_filter = Q((field_name + '__gte', current_start_date)) & (
322
+ Q((field_name + '__lt', current_end_date))
323
+ )
324
+ else:
325
+ query_filter = Q((end_field_name + '__gte', current_start_date)) & (
326
+ Q((field_name + '__lt', current_end_date))
327
+ )
328
+
329
+ label = self.get_full_label(
330
+ multiple_type=multiple_type,
331
+ current_date=current_start_date,
332
+ label=kanban_report_lane.multiple_type_label,
333
+ )
334
+
335
+ self.get_lane(
336
+ base_model=base_model,
337
+ kanban_report_lane=kanban_report_lane,
338
+ lanes=sub_lanes,
339
+ label=label,
340
+ extra_query_filter=query_filter,
341
+ multiple=True,
342
+ )
343
+ current_start_date = current_end_date
344
+
345
+ headings.append(
346
+ {
347
+ 'label': kanban_report_lane.name,
348
+ 'col_span': len(sub_lanes),
349
+ 'row_span': 1,
350
+ }
351
+ )
352
+
353
+ lanes += sub_lanes
354
+
355
+ context['kanban_report'] = self.chart_report
356
+ context['headings'] = headings
357
+ context['lanes'] = lanes
358
+ return context
359
+
360
+ def view_filter(self, query, table):
361
+ if not table.query_data:
362
+ return query
363
+
364
+ return self.process_query_filters(query=query, search_filter_data=table.query_data)
365
+
366
+ # noinspection PyMethodMayBeStatic
367
+ def pod_dashboard_view_menu(self):
368
+ return []
369
+
370
+ def pod_report_menu(self):
371
+ return self.edit_report_menu(request=self.request, chart_report_id=self.chart_report.id)
372
+
373
+ def edit_report_menu(self, request, chart_report_id, slug_str=None):
374
+ return [
375
+ MenuItem(
376
+ f'advanced_report_builder:kanban_modal,pk-{chart_report_id}',
377
+ menu_display='Edit',
378
+ font_awesome='fas fa-pencil-alt',
379
+ css_classes=['btn-primary'],
380
+ ),
381
+ *self.duplicate_menu(request=request, report_id=chart_report_id),
382
+ ]
383
+
384
+ def pod_dashboard_edit_menu(self):
385
+ return [
386
+ MenuItem(
387
+ f'advanced_report_builder:dashboard_report_modal,pk-{self.dashboard_report.id}',
388
+ menu_display='Edit',
389
+ font_awesome='fas fa-pencil-alt',
390
+ css_classes=['btn-primary'],
391
+ )
392
+ ]
393
+
394
+ # noinspection PyMethodMayBeStatic
395
+ def queries_option_menus(self, report, dashboard_report):
396
+ return []
397
+
398
+
399
+ class KanbanModal(ModelFormModal):
400
+ size = 'xl'
401
+ process = PROCESS_EDIT_DELETE
402
+ permission_delete = PERMISSION_OFF
403
+ model = KanbanReport
404
+ widgets = {'report_tags': Select2Multiple}
405
+ ajax_commands = ['datatable', 'button']
406
+
407
+ form_fields = ['name', 'notes', 'report_tags']
408
+
409
+ def form_setup(self, form, *_args, **_kwargs):
410
+ org_id = self.object.id if hasattr(self, 'object') else None
411
+ form.fields['notes'].widget.attrs['rows'] = 3
412
+ if org_id is not None:
413
+ lane_menu_items = [
414
+ MenuItem(
415
+ f'advanced_report_builder:kanban_lane_duplicate_modal,pk-{DUMMY_ID}',
416
+ menu_display='Duplicate',
417
+ css_classes='btn btn-sm btn-outline-dark',
418
+ font_awesome='fas fa-clone',
419
+ ),
420
+ MenuItem(
421
+ f'advanced_report_builder:kanban_lane_modal,pk-{DUMMY_ID}',
422
+ menu_display='Edit',
423
+ css_classes='btn btn-sm btn-outline-dark',
424
+ font_awesome='fas fa-pencil',
425
+ ),
426
+ ]
427
+
428
+ form.fields['lanes'] = CharField(
429
+ required=False,
430
+ label='Lanes',
431
+ widget=DataTableReorderWidget(
432
+ model=KanbanReportLane,
433
+ order_field='order',
434
+ fields=[
435
+ '_.index',
436
+ '.id',
437
+ 'name',
438
+ MenuColumn(
439
+ column_name='menu',
440
+ field='id',
441
+ column_defs={'orderable': False, 'className': 'dt-right'},
442
+ menu=HtmlMenu(self.request, 'button_group').add_items(*lane_menu_items),
443
+ ),
444
+ ],
445
+ attrs={'filter': {'kanban_report__id': self.object.id}},
446
+ ),
447
+ )
448
+
449
+ description_menu_items = [
450
+ MenuItem(
451
+ f'advanced_report_builder:kanban_description_duplicate_modal,pk-{DUMMY_ID}',
452
+ menu_display='Duplicate',
453
+ css_classes='btn btn-sm btn-outline-dark',
454
+ font_awesome='fas fa-clone',
455
+ ),
456
+ MenuItem(
457
+ f'advanced_report_builder:kanban_description_modal,pk-{DUMMY_ID}',
458
+ menu_display='Edit',
459
+ css_classes='btn btn-sm btn-outline-dark',
460
+ font_awesome='fas fa-pencil',
461
+ ),
462
+ ]
463
+
464
+ form.fields['descriptions'] = CharField(
465
+ required=False,
466
+ label='Descriptions',
467
+ widget=DataTableReorderWidget(
468
+ model=KanbanReportDescription,
469
+ order_field='order',
470
+ fields=[
471
+ '_.index',
472
+ '.id',
473
+ 'name',
474
+ MenuColumn(
475
+ column_name='menu',
476
+ field='id',
477
+ column_defs={'orderable': False, 'className': 'dt-right'},
478
+ menu=HtmlMenu(self.request, 'button_group').add_items(*description_menu_items),
479
+ ),
480
+ ],
481
+ attrs={'filter': {'kanban_report__id': self.object.id}},
482
+ ),
483
+ )
484
+
485
+ modal_button('Custom Close', 'close', 'btn-warning')
486
+
487
+ return [
488
+ *self.form_fields,
489
+ crispy_modal_link_args(
490
+ 'advanced_report_builder:kanban_lane_modal',
491
+ 'Add Lane',
492
+ 'kanban_report_id-',
493
+ self.object.id,
494
+ div=True,
495
+ div_classes='form-buttons',
496
+ button_classes='btn btn-primary',
497
+ font_awesome='fa fa-plus',
498
+ ),
499
+ 'lanes',
500
+ crispy_modal_link_args(
501
+ 'advanced_report_builder:kanban_description_modal',
502
+ 'Add Description',
503
+ 'kanban_report_id-',
504
+ self.object.id,
505
+ div=True,
506
+ div_classes='form-buttons',
507
+ button_classes='btn btn-primary',
508
+ font_awesome='fa fa-plus',
509
+ ),
510
+ 'descriptions',
511
+ ]
512
+
513
+ def datatable_sort(self, **kwargs):
514
+ form = self.get_form()
515
+ widget = form.fields[kwargs['table_id'][3:]].widget
516
+ _model = widget.attrs['table_model']
517
+ current_sort = dict(_model.objects.filter(kanban_report=self.object.id).values_list('id', 'order'))
518
+ for s in kwargs['sort']:
519
+ if current_sort[s[1]] != s[0]:
520
+ o = _model.objects.get(id=s[1])
521
+ o.order = s[0]
522
+ o.save()
523
+ return self.command_response('')
524
+
525
+ def form_valid(self, form):
526
+ org_id = self.object.pk if hasattr(self, 'object') else None
527
+ created = org_id is None
528
+ instance = form.save(commit=False)
529
+ instance._current_user = self.request.user
530
+ instance.save()
531
+ if created:
532
+ self.modal_redirect(
533
+ self.request.resolver_match.view_name,
534
+ slug=f'pk-{self.object.id}-new-True',
535
+ )
536
+ else:
537
+ url_name = getattr(settings, 'REPORT_BUILDER_DETAIL_URL_NAME', '')
538
+ if url_name and self.slug.get('new'):
539
+ url = reverse(url_name, kwargs={'slug': self.object.slug})
540
+ self.add_command('redirect', url=url)
541
+ if not self.response_commands:
542
+ self.add_command('reload')
543
+ return self.command_response()
544
+
545
+
546
+ class KanbanLaneForm(QueryBuilderModelForm):
547
+ cancel_class = 'btn-secondary modal-cancel'
548
+
549
+ class Meta:
550
+ model = KanbanReportLane
551
+ fields = [
552
+ 'name',
553
+ 'report_type',
554
+ 'heading_field',
555
+ 'kanban_report_description',
556
+ 'order_by_field',
557
+ 'order_by_ascending',
558
+ 'multiple_type',
559
+ 'multiple_type_label',
560
+ 'multiple_type_date_field',
561
+ 'multiple_type_end_date_field',
562
+ 'multiple_start_period',
563
+ 'multiple_end_period',
564
+ 'link_field',
565
+ 'background_colour_field',
566
+ 'heading_colour_field',
567
+ 'query_data',
568
+ ]
569
+
570
+
571
+ class KanbanLaneModal(QueryBuilderModalBase):
572
+ template_name = 'advanced_report_builder/kanban/modal.html'
573
+ size = 'xl'
574
+ process = PROCESS_EDIT_DELETE
575
+ permission_delete = PERMISSION_OFF
576
+ model = KanbanReportLane
577
+ helper_class = HorizontalNoEnterHelper
578
+ form_class = KanbanLaneForm
579
+
580
+ def form_setup(self, form, *_args, **_kwargs):
581
+ form.fields['order_by_ascending'].widget = RBToggle()
582
+ form.add_trigger(
583
+ 'multiple_type',
584
+ 'onchange',
585
+ [
586
+ {
587
+ 'selector': '#div_id_multiple_type_label,#div_id_multiple_type_date_field,'
588
+ '#div_id_multiple_start_period,#div_id_multiple_end_period',
589
+ 'values': {KanbanReportLane.MULTIPLE_TYPE_NA: 'hide'},
590
+ 'default': 'show',
591
+ },
592
+ {
593
+ 'selector': '#div_id_multiple_type_end_date_field',
594
+ 'values': {
595
+ KanbanReportLane.MULTIPLE_TYPE_DAILY_WITHIN: 'show',
596
+ KanbanReportLane.MULTIPLE_TYPE_WEEKLY_WITHIN: 'show',
597
+ KanbanReportLane.MULTIPLE_TYPE_MONTHLY_WITHIN: 'show',
598
+ },
599
+ 'default': 'hide',
600
+ },
601
+ ],
602
+ )
603
+
604
+ if 'data' in _kwargs:
605
+ heading_field = _kwargs['data'].get('heading_field')
606
+ order_by_field = _kwargs['data'].get('order_by_field')
607
+ multiple_type_date_field = _kwargs['data'].get('multiple_type_date_field')
608
+ multiple_type_end_date_field = _kwargs['data'].get('multiple_type_end_date_field')
609
+ background_colour_field = _kwargs['data'].get('background_colour_field')
610
+ heading_colour_field = _kwargs['data'].get('heading_colour_field')
611
+ link_field = _kwargs['data'].get('link_field')
612
+ report_type_id = _kwargs['data'].get('report_type')
613
+ kanban_report_description = KanbanReportDescription.objects.filter(
614
+ pk=_kwargs['data'].get('kanban_report_description')
615
+ ).first()
616
+ report_type = get_object_or_404(ReportType, id=report_type_id)
617
+
618
+ else:
619
+ heading_field = form.instance.heading_field
620
+ order_by_field = form.instance.order_by_field
621
+ report_type = form.instance.report_type
622
+ multiple_type_date_field = form.instance.multiple_type_date_field
623
+ multiple_type_end_date_field = form.instance.multiple_type_end_date_field
624
+ background_colour_field = form.instance.background_colour_field
625
+ heading_colour_field = form.instance.heading_colour_field
626
+ kanban_report_description = form.instance.kanban_report_description
627
+ link_field = form.instance.link_field
628
+
629
+ form.fields['kanban_report_description'].widget = Select2(attrs={'ajax': True})
630
+ if kanban_report_description is not None:
631
+ form.fields['kanban_report_description'].widget.select_data = [
632
+ {
633
+ 'id': kanban_report_description.id,
634
+ 'text': kanban_report_description.name,
635
+ }
636
+ ]
637
+ form.fields['kanban_report_description'].label = 'Description'
638
+
639
+ self.setup_field(
640
+ field_type='all',
641
+ form=form,
642
+ field_name='heading_field',
643
+ selected_field_id=heading_field,
644
+ report_type=report_type,
645
+ )
646
+
647
+ self.setup_field(
648
+ field_type='django_order',
649
+ form=form,
650
+ field_name='order_by_field',
651
+ selected_field_id=order_by_field,
652
+ report_type=report_type,
653
+ )
654
+
655
+ self.setup_field(
656
+ field_type='date',
657
+ form=form,
658
+ field_name='multiple_type_date_field',
659
+ selected_field_id=multiple_type_date_field,
660
+ report_type=report_type,
661
+ )
662
+
663
+ self.setup_field(
664
+ field_type='date',
665
+ form=form,
666
+ field_name='multiple_type_end_date_field',
667
+ selected_field_id=multiple_type_end_date_field,
668
+ report_type=report_type,
669
+ )
670
+
671
+ self.setup_field(
672
+ field_type='link',
673
+ form=form,
674
+ field_name='link_field',
675
+ selected_field_id=link_field,
676
+ report_type=report_type,
677
+ )
678
+
679
+ self.setup_field(
680
+ field_type='colour',
681
+ form=form,
682
+ field_name='background_colour_field',
683
+ selected_field_id=background_colour_field,
684
+ report_type=report_type,
685
+ )
686
+
687
+ self.setup_field(
688
+ field_type='colour',
689
+ form=form,
690
+ field_name='heading_colour_field',
691
+ selected_field_id=heading_colour_field,
692
+ report_type=report_type,
693
+ )
694
+
695
+ range_type_choices = VariableDate.RANGE_TYPE_CHOICES
696
+ form.fields['multiple_start_period'] = ChoiceField(required=False, choices=range_type_choices)
697
+ form.fields['multiple_end_period'] = ChoiceField(required=False, choices=range_type_choices)
698
+
699
+ return (
700
+ 'name',
701
+ 'report_type',
702
+ 'heading_field',
703
+ 'kanban_report_description',
704
+ 'order_by_field',
705
+ 'order_by_ascending',
706
+ 'multiple_type',
707
+ 'multiple_type_label',
708
+ 'multiple_type_date_field',
709
+ 'multiple_type_end_date_field',
710
+ 'multiple_start_period',
711
+ 'multiple_end_period',
712
+ 'background_colour_field',
713
+ 'heading_colour_field',
714
+ 'link_field',
715
+ FieldEx('query_data', template='advanced_report_builder/query_builder.html'),
716
+ )
717
+
718
+ def select2_link_field(self, **kwargs):
719
+ return self.get_fields_for_select2(
720
+ field_type='link',
721
+ report_type=kwargs['report_type'],
722
+ search_string=kwargs.get('search'),
723
+ )
724
+
725
+ def select2_heading_field(self, **kwargs):
726
+ return self.get_fields_for_select2(
727
+ field_type='all',
728
+ report_type=kwargs['report_type'],
729
+ search_string=kwargs.get('search'),
730
+ )
731
+
732
+ def select2_order_by_field(self, **kwargs):
733
+ return self.get_fields_for_select2(
734
+ field_type='django_order',
735
+ report_type=kwargs['report_type'],
736
+ search_string=kwargs.get('search'),
737
+ )
738
+
739
+ def select2_multiple_type_date_field(self, **kwargs):
740
+ return self.get_fields_for_select2(
741
+ field_type='date',
742
+ report_type=kwargs['report_type'],
743
+ search_string=kwargs.get('search'),
744
+ )
745
+
746
+ def select2_multiple_type_end_date_field(self, **kwargs):
747
+ return self.get_fields_for_select2(
748
+ field_type='date',
749
+ report_type=kwargs['report_type'],
750
+ search_string=kwargs.get('search'),
751
+ )
752
+
753
+ def select2_background_colour_field(self, **kwargs):
754
+ return self.get_fields_for_select2(
755
+ field_type='colour',
756
+ report_type=kwargs['report_type'],
757
+ search_string=kwargs.get('search'),
758
+ )
759
+
760
+ def select2_heading_colour_field(self, **kwargs):
761
+ return self.get_fields_for_select2(
762
+ field_type='colour',
763
+ report_type=kwargs['report_type'],
764
+ search_string=kwargs.get('search'),
765
+ )
766
+
767
+ def select2_kanban_report_description(self, **kwargs):
768
+ descriptions = []
769
+ report_type_id = kwargs['report_type']
770
+ if report_type_id != '':
771
+ kanban_report_id = self.object.kanban_report_id
772
+
773
+ _filter = KanbanReportDescription.objects.filter(
774
+ report_type_id=report_type_id, kanban_report_id=kanban_report_id
775
+ )
776
+
777
+ search = kwargs.get('search')
778
+ if search:
779
+ _filter = _filter.filter(name__icontains=search)
780
+
781
+ for description in _filter.values('id', 'name'):
782
+ descriptions.append({'id': description['id'], 'text': description['name']})
783
+
784
+ return JsonResponse({'results': descriptions})
785
+
786
+ def form_valid(self, form):
787
+ instance = form.save(commit=False)
788
+ instance._current_user = self.request.user
789
+ instance.save()
790
+ return self.command_response('reload')
791
+
792
+
793
+ class KanbanLaneDuplicateModal(Modal):
794
+ def modal_content(self):
795
+ return 'Are you sure you want to duplicate this lane?'
796
+
797
+ def get_modal_buttons(self):
798
+ return [
799
+ modal_button_method('Confirm', 'duplicate'),
800
+ modal_button('Cancel', 'close', 'btn-secondary'),
801
+ ]
802
+
803
+ def button_duplicate(self, **_kwargs):
804
+ kanban_report_lane = get_object_or_404(KanbanReportLane, id=self.slug['pk'])
805
+ kanban_report_lane.pk = None
806
+ kanban_report_lane.name = f'Copy of {kanban_report_lane.name}'
807
+ kanban_report_lane.order = None
808
+ kanban_report_lane._current_user = self.request.user
809
+ kanban_report_lane.save()
810
+ return self.command_response('reload')
811
+
812
+
813
+ class KanbanDescriptionModal(DataMergeUtils, QueryBuilderModalBase):
814
+ template_name = 'advanced_report_builder/kanban/description_modal.html'
815
+ size = 'xl'
816
+ process = PROCESS_EDIT_DELETE
817
+ permission_delete = PERMISSION_OFF
818
+ model = KanbanReportDescription
819
+
820
+ widgets = {'report_tags': Select2Multiple, 'order_by_ascending': RBToggle}
821
+
822
+ form_fields = ['name', 'report_type', 'description']
823
+
824
+ def form_setup(self, form, *_args, **_kwargs):
825
+ form.fields['description'].widget = DataMergeWidget()
826
+
827
+ return ('name', 'report_type', 'description')
828
+
829
+ def ajax_get_description_data_merge_menu(self, **kwargs):
830
+ field_auto_id = kwargs['field_auto_id']
831
+ menus = []
832
+ if kwargs['report_type'] != '':
833
+ report_builder_class, base_model = self.get_report_builder_class(report_type_id=kwargs['report_type'])
834
+
835
+ self.get_menu_fields(
836
+ base_model=base_model,
837
+ report_builder_class=report_builder_class,
838
+ menus=menus,
839
+ )
840
+
841
+ menus = [{'code': 'data_merge', 'text': 'Data Merge', 'menu': menus}]
842
+
843
+ return self.command_response(f'build_data_merge_menu_{field_auto_id}', data=json.dumps(menus))
844
+
845
+ def form_valid(self, form):
846
+ instance = form.save(commit=False)
847
+ instance._current_user = self.request.user
848
+ instance.save()
849
+ return self.command_response('reload')
850
+
851
+
852
+ class KanbanDescriptionDuplicateModal(Modal):
853
+ def modal_content(self):
854
+ return 'Are you sure you want to duplicate this description?'
855
+
856
+ def get_modal_buttons(self):
857
+ return [
858
+ modal_button_method('Confirm', 'duplicate'),
859
+ modal_button('Cancel', 'close', 'btn-secondary'),
860
+ ]
861
+
862
+ def button_duplicate(self, **_kwargs):
863
+ kanban_report_description = get_object_or_404(KanbanReportDescription, id=self.slug['pk'])
864
+ kanban_report_description.pk = None
865
+ kanban_report_description.name = f'Copy of {kanban_report_description.name}'
866
+ kanban_report_description._current_user = self.request.user
867
+ kanban_report_description.save()
868
+ return self.command_response('reload')