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,701 @@
1
+ import copy
2
+ import json
3
+
4
+ from django.db.models import ExpressionWrapper, F, FloatField, Q
5
+ from django.db.models.functions import NullIf
6
+ from django.template import Context, Template, TemplateSyntaxError
7
+ from django_datatables.columns import ColumnBase
8
+ from django_datatables.helpers import render_replace
9
+ from django_datatables.plugins.column_totals import ColumnTotals
10
+
11
+ from advanced_report_builder.column_types import (
12
+ CURRENCY_COLUMNS,
13
+ DATE_FIELDS,
14
+ LINK_COLUMNS,
15
+ NUMBER_FIELDS,
16
+ REVERSE_FOREIGN_KEY_BOOL_COLUMNS,
17
+ REVERSE_FOREIGN_KEY_CHOICE_COLUMNS,
18
+ REVERSE_FOREIGN_KEY_DATE_COLUMNS,
19
+ REVERSE_FOREIGN_KEY_STR_COLUMNS,
20
+ )
21
+ from advanced_report_builder.columns import ReportBuilderDateColumn
22
+ from advanced_report_builder.globals import (
23
+ ALIGNMENT_CHOICE_RIGHT,
24
+ ALIGNMENT_CLASS,
25
+ ANNOTATION_CHOICE_NA,
26
+ ANNOTATION_VALUE_FUNCTIONS,
27
+ DATE_FORMAT_TYPE_DD_MM_YY_SLASH,
28
+ DATE_FORMAT_TYPES_DJANGO_FORMAT,
29
+ REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_XOR,
30
+ REVERSE_FOREIGN_KEY_DELIMITER_COMMA,
31
+ )
32
+ from advanced_report_builder.utils import decode_attribute, split_attr
33
+ from advanced_report_builder.views.report_utils_mixin import ReportUtilsMixin
34
+
35
+
36
+ class TableUtilsMixin(ReportUtilsMixin):
37
+ date_field = ReportBuilderDateColumn
38
+ column_totals_class = ColumnTotals
39
+
40
+ def __init__(self, *args, **kwargs):
41
+ self.table_report = None
42
+ super().__init__(*args, **kwargs)
43
+
44
+ def get_date_field(self, index, col_type_override, table_field, fields):
45
+ data_attr = split_attr(table_field)
46
+ field_name = table_field['field']
47
+ date_format = data_attr.get('date_format')
48
+
49
+ if date_format:
50
+ date_format = DATE_FORMAT_TYPES_DJANGO_FORMAT.get(int(date_format))
51
+
52
+ if int(data_attr.get('display_heading', 1)) == 0:
53
+ display_heading = False
54
+ title = ''
55
+ else:
56
+ display_heading = True
57
+ title = table_field.get('title')
58
+
59
+ annotations_value = int(data_attr.get('annotations_value', 0))
60
+ if col_type_override and annotations_value == 0:
61
+ col_type_override.table = None
62
+ field = copy.deepcopy(col_type_override)
63
+ if title or not display_heading:
64
+ field.title = title
65
+ fields.append(field)
66
+ else:
67
+ if col_type_override:
68
+ field_name = col_type_override.field
69
+ date_function_kwargs = {'title': title, 'date_format': date_format}
70
+
71
+ if annotations_value != 0:
72
+ new_field_name = f'{annotations_value}_{field_name}_{index}'
73
+ new_field_name = new_field_name.replace('__', '_')
74
+ function = ANNOTATION_VALUE_FUNCTIONS[annotations_value]
75
+ date_function_kwargs['annotations_value'] = {new_field_name: function(field_name)}
76
+ field_name = new_field_name
77
+
78
+ date_function_kwargs.update({'field': field_name, 'column_name': field_name})
79
+
80
+ field = self.date_field(**date_function_kwargs)
81
+ fields.append(field)
82
+
83
+ return field_name
84
+
85
+ @staticmethod
86
+ def get_link_field(table_field, fields, col_type_override):
87
+ field_name = table_field['field']
88
+ col_type_override.table = None
89
+ field = copy.deepcopy(col_type_override)
90
+ data_attr = split_attr(table_field)
91
+ link_css = ''
92
+ if 'link_css' in data_attr:
93
+ link_css = decode_attribute(data_attr['link_css'])
94
+
95
+ link_html = ''
96
+ if 'link_html' in data_attr:
97
+ link_html = decode_attribute(data_attr['link_html'])
98
+
99
+ if link_css or link_html:
100
+ field.setup_link(link_css=link_css, link_html=link_html)
101
+
102
+ is_icon = data_attr.get('is_icon')
103
+ if is_icon == '1':
104
+ field.title = ''
105
+ field.options['no_col_search'] = True
106
+ field.column_defs['orderable'] = False
107
+ field.column_defs['width'] = '10px'
108
+
109
+ elif 'title' in table_field:
110
+ field.title = table_field['title']
111
+ fields.append(field)
112
+
113
+ return field_name
114
+
115
+ def process_query_results(
116
+ self,
117
+ report_builder_class,
118
+ table,
119
+ base_model,
120
+ fields_used,
121
+ fields_map,
122
+ table_fields,
123
+ pivot_fields=None,
124
+ ):
125
+ first_field_name = None
126
+
127
+ field_name = None
128
+ fields = []
129
+ totals = {}
130
+
131
+ has_annotations = False
132
+ if not table_fields:
133
+ return fields, totals, first_field_name
134
+
135
+ for index, table_field in enumerate(table_fields):
136
+ field = table_field['field']
137
+ field_attr = {}
138
+ if 'title' in table_field:
139
+ field_attr['title'] = table_field['title']
140
+
141
+ original_field_name = field
142
+ fields_used.add(field)
143
+ django_field, col_type_override, _, _ = self.get_field_details(
144
+ base_model=base_model,
145
+ field=field,
146
+ table=table,
147
+ report_builder_class=report_builder_class,
148
+ field_attr=field_attr,
149
+ )
150
+
151
+ data_attr = split_attr(table_field)
152
+ if int(data_attr.get('display_heading', 1)) == 0:
153
+ field_attr['title'] = ''
154
+
155
+ annotations_type = int(data_attr.get('annotations_type', 0))
156
+ append_annotation_query = int(data_attr.get('append_annotation_query', 0))
157
+
158
+ if annotations_type != 0 or append_annotation_query != 0:
159
+ has_annotations = True
160
+
161
+ if isinstance(django_field, DATE_FIELDS):
162
+ field_name = self.get_date_field(
163
+ index=index,
164
+ col_type_override=col_type_override,
165
+ table_field=table_field,
166
+ fields=fields,
167
+ )
168
+ elif isinstance(django_field, NUMBER_FIELDS) and (django_field is None or django_field.choices is None):
169
+ decimal_places = data_attr.get('decimal_places')
170
+ append_annotation_query = int(data_attr.get('append_annotation_query', 0)) == 1
171
+
172
+ field_name = self.get_number_fields(
173
+ field_name=field_name,
174
+ table=table,
175
+ base_model=base_model,
176
+ report_builder_class=report_builder_class,
177
+ annotations_type=annotations_type,
178
+ append_annotation_query=append_annotation_query,
179
+ index=index,
180
+ data_attr=data_attr,
181
+ table_field=table_field,
182
+ fields=fields,
183
+ totals=totals,
184
+ col_type_override=col_type_override,
185
+ decimal_places=decimal_places,
186
+ )
187
+
188
+ elif isinstance(col_type_override, REVERSE_FOREIGN_KEY_STR_COLUMNS):
189
+ field_name = table_field['field']
190
+ field = self.get_reverse_foreign_key_str_field(
191
+ col_type_override=col_type_override,
192
+ data_attr=data_attr,
193
+ field_attr=field_attr,
194
+ index=index,
195
+ )
196
+ fields.append(field)
197
+ elif isinstance(col_type_override, REVERSE_FOREIGN_KEY_BOOL_COLUMNS):
198
+ field_name = table_field['field']
199
+ field = self.get_reverse_foreign_key_bool_field(
200
+ col_type_override=col_type_override,
201
+ data_attr=data_attr,
202
+ field_attr=field_attr,
203
+ index=index,
204
+ )
205
+ fields.append(field)
206
+ elif isinstance(col_type_override, REVERSE_FOREIGN_KEY_CHOICE_COLUMNS):
207
+ field_name = table_field['field']
208
+ field = self.get_reverse_foreign_key_choice_field(
209
+ col_type_override=col_type_override,
210
+ data_attr=data_attr,
211
+ field_attr=field_attr,
212
+ index=index,
213
+ )
214
+ fields.append(field)
215
+
216
+ elif isinstance(col_type_override, REVERSE_FOREIGN_KEY_DATE_COLUMNS):
217
+ field_name = table_field['field']
218
+ field = self.get_reverse_foreign_key_date_field(
219
+ col_type_override=col_type_override,
220
+ data_attr=data_attr,
221
+ field_attr=field_attr,
222
+ index=index,
223
+ )
224
+ fields.append(field)
225
+
226
+ elif isinstance(col_type_override, LINK_COLUMNS):
227
+ field_name = self.get_link_field(
228
+ table_field=table_field,
229
+ col_type_override=col_type_override,
230
+ fields=fields,
231
+ )
232
+
233
+ elif django_field is None and table_field['field'] in [
234
+ 'rb_addition',
235
+ 'rb_subtraction',
236
+ 'rb_times',
237
+ 'rb_division',
238
+ 'rb_percentage',
239
+ ]:
240
+ self.setup_mathematical_field(
241
+ data_attr=data_attr,
242
+ fields=fields,
243
+ field_attr=field_attr,
244
+ table_field=table_field,
245
+ col_type_override=col_type_override,
246
+ index=index,
247
+ totals=totals,
248
+ )
249
+ else:
250
+ if col_type_override is not None and data_attr.get('annotation_label') == '1':
251
+ if isinstance(col_type_override.field, list):
252
+ table.initial_values += col_type_override.field
253
+ else:
254
+ table.initial_values.append(col_type_override.field)
255
+
256
+ field_name = field
257
+ if isinstance(col_type_override, CURRENCY_COLUMNS) and totals is not None:
258
+ annotations_type = int(data_attr.get('annotations_type', 0))
259
+ append_annotation_query = int(data_attr.get('append_annotation_query', 0)) == 1
260
+ field_name = self.get_number_fields(
261
+ field_name=field_name,
262
+ table=table,
263
+ base_model=base_model,
264
+ report_builder_class=report_builder_class,
265
+ annotations_type=annotations_type,
266
+ append_annotation_query=append_annotation_query,
267
+ index=index,
268
+ data_attr=data_attr,
269
+ table_field=table_field,
270
+ fields=fields,
271
+ totals=totals,
272
+ col_type_override=col_type_override,
273
+ decimal_places=2,
274
+ )
275
+
276
+ elif col_type_override.annotations is not None:
277
+ css_class = col_type_override.column_defs.get('className')
278
+ show_total = data_attr.get('show_totals')
279
+ if show_total == '1':
280
+ self.set_annotation_total(
281
+ totals=totals,
282
+ field_name=field_name,
283
+ col_type_override=col_type_override,
284
+ decimal_places=2,
285
+ css_class=css_class,
286
+ )
287
+ if field_attr:
288
+ field = (field, field_attr)
289
+ fields.append(field)
290
+ else:
291
+ if field_attr:
292
+ field = (field, field_attr)
293
+ fields.append(field)
294
+
295
+ if not first_field_name:
296
+ first_field_name = field_name
297
+ fields_map[original_field_name] = field_name
298
+
299
+ if not has_annotations and len(report_builder_class.default_columns) > 0:
300
+ table.add_columns(*report_builder_class.default_columns)
301
+ table.add_columns(*fields)
302
+ table.show_pivot_table = False
303
+ if pivot_fields is not None:
304
+ for pivot_field in pivot_fields:
305
+ pivot_field_data = self._get_pivot_details(
306
+ base_model=base_model,
307
+ pivot_str=pivot_field['field'],
308
+ report_builder_class=report_builder_class,
309
+ )
310
+ if pivot_field_data is None:
311
+ continue
312
+
313
+ if pivot_field_data['id'] not in fields_used:
314
+ table.add_columns('.' + pivot_field_data['id'])
315
+ fields_used.add(pivot_field_data['id'])
316
+
317
+ pivot_field_details = pivot_field_data['details']
318
+ table.add_js_filters(
319
+ pivot_field_details['type'],
320
+ pivot_field_data['id'],
321
+ filter_title=pivot_field_details['title'],
322
+ **pivot_field_details['kwargs'],
323
+ )
324
+ table.show_pivot_table = True
325
+ if totals:
326
+ totals[first_field_name] = {'text': 'Totals'}
327
+ table.add_plugin(self.column_totals_class, totals)
328
+
329
+ def get_number_fields(
330
+ self,
331
+ field_name,
332
+ table,
333
+ base_model,
334
+ report_builder_class,
335
+ annotations_type,
336
+ append_annotation_query,
337
+ index,
338
+ data_attr,
339
+ table_field,
340
+ fields,
341
+ totals,
342
+ col_type_override,
343
+ decimal_places,
344
+ ):
345
+ if (annotations_type != ANNOTATION_CHOICE_NA or append_annotation_query) and data_attr.get(
346
+ 'multiple_columns'
347
+ ) == '1':
348
+ query = self.extra_filters(query=table.model.objects)
349
+ multiple_column_field = data_attr.get('multiple_column_field')
350
+
351
+ field_report_builder_class = self._get_report_builder_class(
352
+ base_model=base_model,
353
+ field_str=multiple_column_field,
354
+ report_builder_class=report_builder_class,
355
+ )
356
+ _fields = field_report_builder_class.default_multiple_column_fields
357
+ default_multiple_column_fields = [multiple_column_field + '__' + x for x in _fields]
358
+ order_by = f'{multiple_column_field}__{field_report_builder_class.default_multiple_pk}'
359
+
360
+ results = (
361
+ query.order_by(order_by)
362
+ .distinct(multiple_column_field)
363
+ .values(multiple_column_field, *default_multiple_column_fields)
364
+ )
365
+
366
+ for multiple_index, result in enumerate(results):
367
+ suffix = self._set_multiple_title(
368
+ database_values=result,
369
+ value_prefix=multiple_column_field,
370
+ fields=_fields,
371
+ text=field_report_builder_class.default_multiple_column_text,
372
+ )
373
+ extra_filter = Q((multiple_column_field, result[multiple_column_field]))
374
+
375
+ field_name = self.get_number_field(
376
+ annotations_type=annotations_type,
377
+ append_annotation_query=append_annotation_query,
378
+ index=f'{index}_{multiple_index}',
379
+ data_attr=data_attr,
380
+ table_field=table_field,
381
+ fields=fields,
382
+ totals=totals,
383
+ col_type_override=col_type_override,
384
+ extra_filter=extra_filter,
385
+ title_suffix=suffix,
386
+ decimal_places=decimal_places,
387
+ )
388
+ else:
389
+ field_name = self.get_number_field(
390
+ annotations_type=annotations_type,
391
+ append_annotation_query=append_annotation_query,
392
+ index=index,
393
+ data_attr=data_attr,
394
+ table_field=table_field,
395
+ fields=fields,
396
+ totals=totals,
397
+ col_type_override=col_type_override,
398
+ decimal_places=decimal_places,
399
+ )
400
+ return field_name
401
+
402
+ @staticmethod
403
+ def _set_multiple_title(database_values, value_prefix, fields, text):
404
+ results = {}
405
+ for field in fields:
406
+ value = database_values[value_prefix + '__' + field]
407
+ results[field] = value
408
+ return text.format(**results)
409
+
410
+ def extra_filters(self, query):
411
+ report_query = self.get_report_query(report=self.table_report)
412
+ option_query = self.get_report_option_query()
413
+ if report_query or option_query:
414
+ query = self.process_query_filters(
415
+ query=query, search_filter_data=report_query.query, extra_filter=option_query
416
+ )
417
+ return query
418
+
419
+ def setup_mathematical_field(
420
+ self,
421
+ data_attr,
422
+ fields,
423
+ field_attr,
424
+ table_field,
425
+ col_type_override,
426
+ index,
427
+ totals,
428
+ ):
429
+ field = table_field['field']
430
+ if field == 'rb_percentage':
431
+ self.get_mathematical_percentage_field(
432
+ fields=fields,
433
+ field_attr=field_attr,
434
+ data_attr=data_attr,
435
+ table_field=table_field,
436
+ index=index,
437
+ totals=totals,
438
+ )
439
+ elif field == 'rb_division':
440
+ values = self.decode_mathematical_columns(
441
+ data_attr=data_attr,
442
+ first_value_column_name='numerator_column',
443
+ second_value_column_name='denominator_column',
444
+ )
445
+ if values is not None:
446
+ expression = ExpressionWrapper(NullIf(F(values[0]), 0) / F(values[1]), output_field=FloatField())
447
+ self.get_mathematical_field(
448
+ fields=fields,
449
+ field_attr=field_attr,
450
+ data_attr=data_attr,
451
+ table_field=table_field,
452
+ col_type_override=col_type_override,
453
+ index=index,
454
+ totals=totals,
455
+ expression=expression,
456
+ )
457
+ elif field == 'rb_times':
458
+ values = self.decode_mathematical_columns(
459
+ data_attr=data_attr,
460
+ first_value_column_name='multiplicand_column',
461
+ second_value_column_name='multiplier_column',
462
+ )
463
+ if values is not None:
464
+ expression = ExpressionWrapper(NullIf(F(values[0]), 0) * F(values[1]), output_field=FloatField())
465
+ self.get_mathematical_field(
466
+ fields=fields,
467
+ field_attr=field_attr,
468
+ data_attr=data_attr,
469
+ table_field=table_field,
470
+ col_type_override=col_type_override,
471
+ index=index,
472
+ totals=totals,
473
+ expression=expression,
474
+ )
475
+ elif field == 'rb_addition':
476
+ values = self.decode_mathematical_columns(data_attr=data_attr)
477
+ if values is not None:
478
+ expression = ExpressionWrapper(NullIf(F(values[0]), 0) + F(values[1]), output_field=FloatField())
479
+ self.get_mathematical_field(
480
+ fields=fields,
481
+ field_attr=field_attr,
482
+ data_attr=data_attr,
483
+ table_field=table_field,
484
+ col_type_override=col_type_override,
485
+ index=index,
486
+ totals=totals,
487
+ expression=expression,
488
+ )
489
+ elif field == 'rb_subtraction':
490
+ values = self.decode_mathematical_columns(data_attr=data_attr)
491
+ if values is not None:
492
+ expression = ExpressionWrapper(NullIf(F(values[0]), 0) - F(values[1]), output_field=FloatField())
493
+ self.get_mathematical_field(
494
+ fields=fields,
495
+ field_attr=field_attr,
496
+ data_attr=data_attr,
497
+ table_field=table_field,
498
+ col_type_override=col_type_override,
499
+ index=index,
500
+ totals=totals,
501
+ expression=expression,
502
+ )
503
+
504
+ @staticmethod
505
+ def decode_mathematical_columns(
506
+ data_attr,
507
+ first_value_column_name='first_value_column',
508
+ second_value_column_name='second_value_column',
509
+ ):
510
+ first_value_column = data_attr.get(first_value_column_name)
511
+ second_value_column = data_attr.get(second_value_column_name)
512
+ if not first_value_column or not second_value_column:
513
+ return None
514
+
515
+ first_value_column = decode_attribute(first_value_column)
516
+ second_value_column = decode_attribute(second_value_column)
517
+
518
+ return first_value_column, second_value_column
519
+
520
+ def get_mathematical_percentage_field(self, fields, field_attr, data_attr, table_field, index, totals):
521
+ values = self.decode_mathematical_columns(
522
+ data_attr=data_attr,
523
+ first_value_column_name='numerator_column',
524
+ second_value_column_name='denominator_column',
525
+ )
526
+ if values is None:
527
+ return False
528
+
529
+ expression = ExpressionWrapper(NullIf(F(values[0]) * 100.00, 0) / F(values[1]), output_field=FloatField())
530
+ decimal_places = data_attr.get('decimal_places', 2)
531
+ field_attr['decimal_places'] = int(decimal_places)
532
+ alignment_class = ALIGNMENT_CLASS.get(int(data_attr.get('alignment', ALIGNMENT_CHOICE_RIGHT)))
533
+ field_attr['options'] = {}
534
+ field = table_field['field']
535
+
536
+ column_id = data_attr.get('column_id')
537
+ field_name = decode_attribute(column_id) if column_id else f'{field}_{index}'
538
+ field_attr['annotations'] = {field_name: expression}
539
+
540
+ field_attr.update(
541
+ {
542
+ 'field': field_name,
543
+ 'column_name': field_name,
544
+ 'model_path': '',
545
+ 'render': [render_replace(html='%1%%', column=field_name)],
546
+ 'hidden': data_attr.get('hidden', 0) == '1',
547
+ }
548
+ )
549
+ if alignment_class != '':
550
+ field_attr['column_defs'] = {'className': alignment_class}
551
+ field = self.number_field(**field_attr)
552
+
553
+ if totals is not None:
554
+ show_total = data_attr.get('show_totals')
555
+ if show_total == '1':
556
+ self.set_percentage_total(
557
+ totals=totals,
558
+ field_name=field_name,
559
+ denominator=values[1],
560
+ numerator=values[0],
561
+ decimal_places=decimal_places,
562
+ css_class=alignment_class,
563
+ )
564
+ fields.append(field)
565
+
566
+ def get_mathematical_field(
567
+ self,
568
+ fields,
569
+ field_attr,
570
+ data_attr,
571
+ table_field,
572
+ col_type_override,
573
+ index,
574
+ totals,
575
+ expression,
576
+ ):
577
+ decimal_places = data_attr.get('decimal_places', 2)
578
+ alignment_class = ALIGNMENT_CLASS.get(int(data_attr.get('alignment', ALIGNMENT_CHOICE_RIGHT)))
579
+ field_attr['decimal_places'] = int(decimal_places)
580
+ field_attr['options'] = {}
581
+ field = table_field['field']
582
+ column_id = data_attr.get('column_id')
583
+ field_name = decode_attribute(column_id) if column_id else f'{field}_{index}'
584
+ field_attr['annotations'] = {field_name: expression}
585
+
586
+ field_attr.update(
587
+ {
588
+ 'field': field_name,
589
+ 'column_name': field_name,
590
+ 'model_path': '',
591
+ 'trim_zeros': False,
592
+ 'hidden': data_attr.get('hidden', 0) == '1',
593
+ 'css_class': alignment_class,
594
+ }
595
+ )
596
+ if alignment_class != '':
597
+ field_attr['column_defs'] = {'className': alignment_class}
598
+ field = self.number_field(**field_attr)
599
+
600
+ if totals is not None:
601
+ show_total = data_attr.get('show_totals')
602
+ if show_total == '1':
603
+ self.set_number_total(
604
+ totals=totals,
605
+ field_name=field_name,
606
+ col_type_override=col_type_override,
607
+ decimal_places=decimal_places,
608
+ css_class=alignment_class,
609
+ )
610
+ fields.append(field)
611
+
612
+ def get_reverse_foreign_key_str_field(self, col_type_override, data_attr, field_attr, index):
613
+ col_type_override.table = None
614
+ field_name = f'{col_type_override.field_name}_{index}'
615
+ field = copy.deepcopy(col_type_override)
616
+ delimiter_type = int(data_attr.get('delimiter_type', REVERSE_FOREIGN_KEY_DELIMITER_COMMA))
617
+
618
+ sub_query = None
619
+ if int(data_attr.get('has_filter', 0)) == 1:
620
+ _filter = json.loads(decode_attribute(data_attr['filter']))
621
+ prefix_field_name = col_type_override.field_name.split('__')[0]
622
+ sub_query = self.process_filters(search_filter_data=_filter, prefix_field_name=prefix_field_name)
623
+ field.setup_annotations(delimiter_type=delimiter_type, sub_filter=sub_query, field_name=field_name)
624
+ if field_attr:
625
+ field = (field, field_attr)
626
+ return field
627
+
628
+ def get_reverse_foreign_key_bool_field(self, col_type_override, data_attr, field_attr, index):
629
+ col_type_override.table = None
630
+ field_name = f'{col_type_override.field_name}_{index}'
631
+ field = copy.deepcopy(col_type_override)
632
+ sub_query = None
633
+ if int(data_attr.get('has_filter', 0)) == 1:
634
+ _filter = json.loads(decode_attribute(data_attr['filter']))
635
+ prefix_field_name = col_type_override.field_name.split('__')[0]
636
+ sub_query = self.process_filters(search_filter_data=_filter, prefix_field_name=prefix_field_name)
637
+ annotations_type = int(data_attr.get('annotations_type', REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_XOR))
638
+ field.setup_annotations(
639
+ annotations_type=annotations_type,
640
+ sub_filter=sub_query,
641
+ field_name=field_name,
642
+ )
643
+ if field_attr:
644
+ field = (field, field_attr)
645
+ return field
646
+
647
+ def get_reverse_foreign_key_choice_field(self, col_type_override, data_attr, field_attr, index):
648
+ col_type_override.table = None
649
+ field_name = f'{col_type_override.field_name}_{index}'
650
+ field = copy.deepcopy(col_type_override)
651
+ sub_query = None
652
+ delimiter_type = int(data_attr.get('delimiter_type', REVERSE_FOREIGN_KEY_DELIMITER_COMMA))
653
+ if int(data_attr.get('has_filter', 0)) == 1:
654
+ _filter = json.loads(decode_attribute(data_attr['filter']))
655
+ prefix_field_name = col_type_override.field_name.split('__')[0]
656
+ sub_query = self.process_filters(search_filter_data=_filter, prefix_field_name=prefix_field_name)
657
+ field.setup_annotations(delimiter_type=delimiter_type, sub_filter=sub_query, field_name=field_name)
658
+ if field_attr:
659
+ field = (field, field_attr)
660
+ return field
661
+
662
+ def get_reverse_foreign_key_date_field(self, col_type_override, data_attr, field_attr, index):
663
+ col_type_override.table = None
664
+ field_name = f'{col_type_override.field_name}_{index}'
665
+ field = copy.deepcopy(col_type_override)
666
+ sub_query = None
667
+ delimiter_type = int(data_attr.get('delimiter_type', REVERSE_FOREIGN_KEY_DELIMITER_COMMA))
668
+ date_format_type = int(data_attr.get('date_format', DATE_FORMAT_TYPE_DD_MM_YY_SLASH))
669
+ annotations_type = int(data_attr.get('annotations_type', REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_XOR))
670
+
671
+ if int(data_attr.get('has_filter', 0)) == 1:
672
+ _filter = json.loads(decode_attribute(data_attr['filter']))
673
+ prefix_field_name = col_type_override.field_name.split('__')[0]
674
+ sub_query = self.process_filters(search_filter_data=_filter, prefix_field_name=prefix_field_name)
675
+
676
+ field.setup_annotations(
677
+ delimiter_type=delimiter_type,
678
+ date_format_type=date_format_type,
679
+ annotations_type=annotations_type,
680
+ sub_filter=sub_query,
681
+ field_name=field_name,
682
+ )
683
+ if field_attr:
684
+ field = (field, field_attr)
685
+ return field
686
+
687
+
688
+ class DescriptionColumn(ColumnBase):
689
+ def row_result(self, data, _page_data, columns):
690
+ html = self.options['html']
691
+
692
+ for column in columns:
693
+ if not isinstance(column, DescriptionColumn):
694
+ data[column.column_name] = column.row_result(data, _page_data)
695
+
696
+ try:
697
+ template = Template(html)
698
+ context = Context(data)
699
+ return template.render(context)
700
+ except TemplateSyntaxError as e:
701
+ return f'Error in description ({e})'