django-advanced-report-builder 0.7.9__tar.gz → 0.8.0__tar.gz

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.

Potentially problematic release.


This version of django-advanced-report-builder might be problematic. Click here for more details.

Files changed (174) hide show
  1. {django-advanced-report-builder-0.7.9/django_advanced_report_builder.egg-info → django-advanced-report-builder-0.8.0}/PKG-INFO +1 -1
  2. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/columns.py +4 -3
  3. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/field_utils.py +9 -1
  4. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/globals.py +12 -1
  5. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/modal_field.html +3 -0
  6. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/fields/modal.html +4 -0
  7. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/bar_charts.py +3 -15
  8. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/charts_base.py +0 -2
  9. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/datatables/datatables.py +6 -2
  10. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/datatables/modal.py +241 -99
  11. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/datatables/utils.py +183 -3
  12. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/funnel_charts.py +0 -1
  13. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/line_charts.py +0 -1
  14. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/pie_charts.py +0 -1
  15. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/query_modal/modal.py +0 -1
  16. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/report_utils_mixin.py +45 -9
  17. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/single_values.py +2 -16
  18. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0/django_advanced_report_builder.egg-info}/PKG-INFO +1 -1
  19. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/setup.py +1 -1
  20. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/LICENSE +0 -0
  21. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/MANIFEST.in +0 -0
  22. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/README.md +0 -0
  23. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/__init__.py +0 -0
  24. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/admin.py +0 -0
  25. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/apps.py +0 -0
  26. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/customise.py +0 -0
  27. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/data_merge/__init__.py +0 -0
  28. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/data_merge/utils.py +0 -0
  29. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/data_merge/widget.py +0 -0
  30. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/duplicate.py +0 -0
  31. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/exceptions.py +0 -0
  32. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/field_types.py +0 -0
  33. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/filter_query.py +0 -0
  34. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/generate_series.py +0 -0
  35. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/includes.py +0 -0
  36. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0001_initial.py +0 -0
  37. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0002_auto_20220209_1657.py +0 -0
  38. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0003_auto_20220215_1219.py +0 -0
  39. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0004_customreport.py +0 -0
  40. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0005_auto_20220303_0958.py +0 -0
  41. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0006_auto_20220310_1147.py +0 -0
  42. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0007_auto_20220322_1939.py +0 -0
  43. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0008_auto_20220404_1144.py +0 -0
  44. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0009_auto_20230428_1554.py +0 -0
  45. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0010_auto_20230428_2033.py +0 -0
  46. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0011_auto_20230620_1449.py +0 -0
  47. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0012_auto_20230718_1642.py +0 -0
  48. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0013_reportqueryorder.py +0 -0
  49. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/0014_auto_20240706_2207.py +0 -0
  50. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/migrations/__init__.py +0 -0
  51. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/models.py +0 -0
  52. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/report_builder.py +0 -0
  53. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/.DS_Store +0 -0
  54. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/.DS_Store +0 -0
  55. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.esm.js +0 -0
  56. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.js +0 -0
  57. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.min.js +0 -0
  58. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-adapter-moment.min.js +0 -0
  59. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-plugin-datalabels.min.js +0 -0
  60. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chunks/helpers.segment.js +0 -0
  61. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/helpers.esm.js +0 -0
  62. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/d3/js/d3.js +0 -0
  63. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/d3/js/d3.min.js +0 -0
  64. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.js +0 -0
  65. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.min.js +0 -0
  66. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dashboard/js/dashboard.js +0 -0
  67. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/.gitignore +0 -0
  68. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/.travis.yml +0 -0
  69. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/LICENSE-DOT.txt +0 -0
  70. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/README.md +0 -0
  71. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/bin/dot-packer +0 -0
  72. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/bower.json +0 -0
  73. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doT.js +0 -0
  74. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doT.min.js +0 -0
  75. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doU.js +0 -0
  76. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/index.js +0 -0
  77. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/dot/js/package.json +0 -0
  78. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.js +0 -0
  79. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.min.js +0 -0
  80. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/.DS_Store +0 -0
  81. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/.DS_Store +0 -0
  82. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.css +0 -0
  83. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.min.css +0 -0
  84. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.css +0 -0
  85. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.min.css +0 -0
  86. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ar.js +0 -0
  87. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.az.js +0 -0
  88. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.bg.js +0 -0
  89. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.cs.js +0 -0
  90. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.da.js +0 -0
  91. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.de.js +0 -0
  92. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.el.js +0 -0
  93. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.en.js +0 -0
  94. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.es.js +0 -0
  95. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fa-IR.js +0 -0
  96. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fr.js +0 -0
  97. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.he.js +0 -0
  98. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.it.js +0 -0
  99. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.nl.js +0 -0
  100. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.no.js +0 -0
  101. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pl.js +0 -0
  102. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-BR.js +0 -0
  103. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-PT.js +0 -0
  104. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ro.js +0 -0
  105. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ru.js +0 -0
  106. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.sq.js +0 -0
  107. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.tr.js +0 -0
  108. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ua.js +0 -0
  109. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.zh-CN.js +0 -0
  110. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/.DS_Store +0 -0
  111. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/.DS_Store +0 -0
  112. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/currency/plugin.js +0 -0
  113. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.js +0 -0
  114. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.min.js +0 -0
  115. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.js +0 -0
  116. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.min.js +0 -0
  117. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/.DS_Store +0 -0
  118. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/dark.scss +0 -0
  119. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/default.scss +0 -0
  120. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-checkbox.scss +0 -0
  121. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-tooltip-errors.scss +0 -0
  122. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_filter-description.scss +0 -0
  123. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_invert.scss +0 -0
  124. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_sortable.scss +0 -0
  125. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/bt-tooltip-errors.scss +0 -0
  126. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/filter-description.scss +0 -0
  127. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/invert.scss +0 -0
  128. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/sortable.scss +0 -0
  129. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/bar/middle.html +0 -0
  130. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/funnel/middle.html +0 -0
  131. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/funnel/report.html +0 -0
  132. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/line/middle.html +0 -0
  133. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/modal.html +0 -0
  134. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/pie/middle.html +0 -0
  135. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/charts/report.html +0 -0
  136. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/data_merge/data_merge.html +0 -0
  137. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/fields/single_query_builder.html +0 -0
  138. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/modal.html +0 -0
  139. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/onclick_menu.html +0 -0
  140. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/report.html +0 -0
  141. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/datatables/select_pivot.html +0 -0
  142. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/kanban/description_modal.html +0 -0
  143. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/kanban/middle.html +0 -0
  144. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/kanban/modal.html +0 -0
  145. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/kanban/report.html +0 -0
  146. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/query_builder.html +0 -0
  147. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/query_modal.html +0 -0
  148. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/select_column.html +0 -0
  149. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/single_values/middle.html +0 -0
  150. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/single_values/modal.html +0 -0
  151. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/templates/advanced_report_builder/single_values/report.html +0 -0
  152. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/toggle.py +0 -0
  153. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/urls.py +0 -0
  154. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/utils.py +0 -0
  155. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/variable_date.py +0 -0
  156. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/__init__.py +0 -0
  157. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/custom.py +0 -0
  158. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/dashboard.py +0 -0
  159. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/datatables/__init__.py +0 -0
  160. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/helpers.py +0 -0
  161. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/kanban.py +0 -0
  162. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/modals_base.py +0 -0
  163. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/query_modal/__init__.py +0 -0
  164. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/query_modal/mixin.py +0 -0
  165. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/report.py +0 -0
  166. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/reports.py +0 -0
  167. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/targets/__init__.py +0 -0
  168. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/targets/utils.py +0 -0
  169. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/advanced_report_builder/views/targets/views.py +0 -0
  170. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/django_advanced_report_builder.egg-info/SOURCES.txt +0 -0
  171. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/django_advanced_report_builder.egg-info/dependency_links.txt +0 -0
  172. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/django_advanced_report_builder.egg-info/requires.txt +0 -0
  173. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/django_advanced_report_builder.egg-info/top_level.txt +0 -0
  174. {django-advanced-report-builder-0.7.9 → django-advanced-report-builder-0.8.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-advanced-report-builder
3
- Version: 0.7.9
3
+ Version: 0.8.0
4
4
  Summary: Django app that allows you to build reports from modals
5
5
  Home-page: https://github.com/django-advance-utils/django-advanced-report-builder
6
6
  Author: Thomas Turner
@@ -26,19 +26,20 @@ class ReportBuilderDateColumn(ColumnBase):
26
26
 
27
27
  class ReportBuilderNumberColumn(ColumnBase):
28
28
 
29
- def __init__(self, *, decimal_places=0, **kwargs):
29
+ def __init__(self, *, decimal_places=0, trim_zeros=True, **kwargs):
30
30
  if not self.initialise(locals()):
31
31
  return
32
32
  super().__init__(**kwargs)
33
33
  self.decimal_places = f'{{:.{decimal_places}f}}'
34
+ self.trim_zeros = trim_zeros
34
35
 
35
36
  def row_result(self, data, _page_data):
36
37
  number = data.get(self.field)
37
38
  if number is None:
38
39
  return ''
39
40
  else:
40
- number = self.decimal_places.format(data[self.field])
41
- if '.' in number:
41
+ number = self.decimal_places.format(number)
42
+ if self.trim_zeros and '.' in number:
42
43
  return number.rstrip('0').rstrip('.')
43
44
  else:
44
45
  return number
@@ -151,7 +151,7 @@ class ReportBuilderFieldUtils:
151
151
  previous_base_model=None, selected_field_id=None, for_select2=False,
152
152
  pivot_fields=None, allow_annotations_fields=True, field_types=None,
153
153
  column_types=None, search_string=None, show_order_by_fields=False, extra_fields=None,
154
- must_have_django_field=False, allow_pivots=True):
154
+ must_have_django_field=False, allow_pivots=True, include_mathematical_columns=False):
155
155
  if title is None:
156
156
  title = report_builder_class.title
157
157
  if colour is None:
@@ -236,6 +236,14 @@ class ReportBuilderFieldUtils:
236
236
  show_order_by_fields=show_order_by_fields,
237
237
  allow_pivots=local_allow_pivots)
238
238
 
239
+ if include_mathematical_columns:
240
+ fields.extend([{'colour': '#D4AF37', 'field': 'rb_addition', 'label': 'Maths: Addition Field'},
241
+ {'colour': '#D4AF37', 'field': 'rb_subtraction', 'label': 'Maths: Subtraction Field'},
242
+ {'colour': '#D4AF37', 'field': 'rb_times', 'label': 'Maths: Times Field'},
243
+ {'colour': '#D4AF37', 'field': 'rb_division', 'label': 'Maths: Division Field'},
244
+ {'colour': '#D4AF37', 'field': 'rb_percentage', 'label': 'Maths: Percentage Field'}]
245
+ )
246
+
239
247
  @staticmethod
240
248
  def _is_search_match(search_string, title):
241
249
  if search_string is None:
@@ -51,7 +51,6 @@ ANNOTATION_CHOICE_MINIMUM = 3
51
51
  ANNOTATION_CHOICE_COUNT = 4
52
52
  ANNOTATION_CHOICE_AVERAGE_SUM_FROM_COUNT = 5
53
53
 
54
-
55
54
  ANNOTATIONS_CHOICES = [(ANNOTATION_CHOICE_SUM, 'Sum'),
56
55
  (ANNOTATION_CHOICE_MAXIMUM, 'Maximum'),
57
56
  (ANNOTATION_CHOICE_MINIMUM, 'Minimum'),
@@ -64,6 +63,18 @@ ANNOTATION_FUNCTIONS = {ANNOTATION_CHOICE_SUM: Sum,
64
63
  ANNOTATION_CHOICE_COUNT: Count,
65
64
  ANNOTATION_CHOICE_AVERAGE_SUM_FROM_COUNT: Avg}
66
65
 
66
+ ALIGNMENT_CHOICE_LEFT = 0
67
+ ALIGNMENT_CHOICE_CENTRE = 1
68
+ ALIGNMENT_CHOICE_RIGHT = 2
69
+
70
+ ALIGNMENT_CHOICES = [(ALIGNMENT_CHOICE_LEFT, 'Left'),
71
+ (ALIGNMENT_CHOICE_CENTRE, 'Centre'),
72
+ (ALIGNMENT_CHOICE_RIGHT, 'Right')]
73
+
74
+ ALIGNMENT_CLASS = {ALIGNMENT_CHOICE_LEFT: '',
75
+ ALIGNMENT_CHOICE_CENTRE: 'dt-center',
76
+ ALIGNMENT_CHOICE_RIGHT: 'dt-right'}
77
+
67
78
  DATE_FORMAT_TYPE_DD_MM_YY_SLASH = 1
68
79
  DATE_FORMAT_TYPE_DD_MM_YYYY_SLASH = 2
69
80
  DATE_FORMAT_TYPE_MM_DD_YY_SLASH = 3
@@ -3,7 +3,10 @@
3
3
  {% block javascript %}
4
4
  <script>
5
5
  function save_modal_{{ form.form_id }}() {
6
+ try {
6
7
  id_filter.save_query_builder();
8
+ }
9
+ catch (error) {}
7
10
  django_modal.process_commands_lock([{'function': 'post_modal'}]);
8
11
  }
9
12
  </script>
@@ -3,6 +3,10 @@
3
3
  {% block javascript %}
4
4
  <script>
5
5
  function save_modal_{{ form.form_id }}() {
6
+ try {
7
+ id_filter.save_query_builder();
8
+ }
9
+ catch (error) {}
6
10
  django_modal.process_commands_lock([{'function': 'post_modal'}]);
7
11
  }
8
12
  </script>
@@ -371,7 +371,6 @@ class BarChartFieldModal(QueryBuilderModalBaseMixin, FormModal):
371
371
  'val': _attr})
372
372
 
373
373
  self.add_command({'function': 'html', 'selector': f'#{selector} span', 'html': form.cleaned_data['title']})
374
- self.add_command({'function': 'save_query_builder_id_filter'})
375
374
  self.add_command({'function': 'update_selection'})
376
375
  return self.command_response('close')
377
376
 
@@ -424,20 +423,7 @@ class BarChartBreakdownFieldForm(TableFieldForm):
424
423
 
425
424
  class BarChartBreakdownFieldModal(TableFieldModal):
426
425
  form_class = BarChartBreakdownFieldForm
427
-
428
- def form_valid(self, form):
429
- selector = self.slug['selector']
430
-
431
- _attr = form.get_additional_attributes()
432
- self.add_command({'function': 'set_attr',
433
- 'selector': f'#{selector}',
434
- 'attr': 'data-attr',
435
- 'val': _attr})
436
-
437
- self.add_command({'function': 'html', 'selector': f'#{selector} span', 'html': form.cleaned_data['title']})
438
- self.add_command({'function': 'save_query_builder_id_filter'})
439
- self.add_command({'function': 'breakdown_update_selection'})
440
- return self.command_response('close')
426
+ update_selection_command = 'breakdown_update_selection'
441
427
 
442
428
 
443
429
  class BarChartShowBreakdownModal(TableUtilsMixin, Modal):
@@ -481,10 +467,12 @@ class BarChartShowBreakdownModal(TableUtilsMixin, Modal):
481
467
 
482
468
  table_fields = bar_chart_report.breakdown_fields
483
469
  fields_used = set()
470
+ fields_map = {}
484
471
  self.process_query_results(report_builder_class=report_builder_class,
485
472
  table=table,
486
473
  base_model=base_model,
487
474
  fields_used=fields_used,
475
+ fields_map=fields_map,
488
476
  table_fields=table_fields)
489
477
  data_index = int(self.slug['data'])
490
478
  table_field = chart_fields[data_index]
@@ -2,7 +2,6 @@ import base64
2
2
  import json
3
3
  from datetime import timedelta, datetime
4
4
 
5
- from crispy_forms.bootstrap import StrictButton
6
5
  from date_offset.date_offset import DateOffset
7
6
  from dateutil.relativedelta import relativedelta
8
7
  from django.apps import apps
@@ -14,7 +13,6 @@ from django.utils.safestring import mark_safe
14
13
  from django.views.generic import TemplateView
15
14
  from django_datatables.datatables import DatatableTable
16
15
  from django_menus.menu import MenuItem
17
- from django_modals.forms import CrispyForm
18
16
 
19
17
  from advanced_report_builder.columns import ReportBuilderDateColumn
20
18
  from advanced_report_builder.exceptions import ReportError
@@ -5,7 +5,7 @@ from django_menus.menu import MenuItem
5
5
 
6
6
  from advanced_report_builder.columns import ArrowColumn
7
7
  from advanced_report_builder.exceptions import ReportError
8
- from advanced_report_builder.utils import make_slug_str, get_report_builder_class
8
+ from advanced_report_builder.utils import get_report_builder_class
9
9
  from advanced_report_builder.utils import split_slug
10
10
  from advanced_report_builder.views.datatables.utils import TableUtilsMixin
11
11
  from advanced_report_builder.views.report import ReportBase
@@ -35,6 +35,7 @@ class TableView(ReportBase, TableUtilsMixin, DatatableView):
35
35
 
36
36
  self.base_model = self.table_report.get_base_model()
37
37
  self.add_table(self.table_id, model=self.base_model)
38
+
38
39
  try:
39
40
  return super().dispatch(request, *args, **kwargs)
40
41
  except DatatableError as de:
@@ -48,12 +49,14 @@ class TableView(ReportBase, TableUtilsMixin, DatatableView):
48
49
  table_fields = self.table_report.table_fields
49
50
  pivot_fields = self.table_report.pivot_fields
50
51
  fields_used = set()
52
+ fields_map = {}
51
53
  report_builder_class = get_report_builder_class(model=base_model,
52
54
  report_type=self.table_report.report_type)
53
55
  self.process_query_results(report_builder_class=report_builder_class,
54
56
  table=table,
55
57
  base_model=base_model,
56
58
  fields_used=fields_used,
59
+ fields_map=fields_map,
57
60
  table_fields=table_fields,
58
61
  pivot_fields=pivot_fields)
59
62
 
@@ -61,6 +64,8 @@ class TableView(ReportBase, TableUtilsMixin, DatatableView):
61
64
  order_by_field = self.table_report.order_by_field
62
65
  if order_by_field not in fields_used:
63
66
  table.add_columns(f'.{order_by_field}')
67
+ elif order_by_field in fields_map:
68
+ order_by_field = fields_map[order_by_field]
64
69
  if self.table_report.order_by_ascending:
65
70
  table.sort(order_by_field)
66
71
  else:
@@ -134,7 +139,6 @@ class TableView(ReportBase, TableUtilsMixin, DatatableView):
134
139
  *self.duplicate_menu(request=self.request, report_id=chart_report_id)
135
140
  ]
136
141
 
137
-
138
142
  def get_dashboard_class(self, report):
139
143
  pivot_fields = report.tablereport.pivot_fields
140
144
  if pivot_fields is not None and len(pivot_fields) > 0:
@@ -13,7 +13,7 @@ from django_modals.widgets.select2 import Select2Multiple
13
13
  from django_modals.widgets.widgets import Toggle
14
14
 
15
15
  from advanced_report_builder.globals import DATE_FIELDS, NUMBER_FIELDS, ANNOTATION_VALUE_CHOICES, ANNOTATIONS_CHOICES, \
16
- DATE_FORMAT_TYPES, CURRENCY_COLUMNS, LINK_COLUMNS
16
+ DATE_FORMAT_TYPES, CURRENCY_COLUMNS, LINK_COLUMNS, ALIGNMENT_CHOICES
17
17
  from advanced_report_builder.models import TableReport, ReportType
18
18
  from advanced_report_builder.toggle import RBToggle
19
19
  from advanced_report_builder.utils import split_attr, encode_attribute, decode_attribute, get_report_builder_class
@@ -128,7 +128,8 @@ class TableModal(MultiQueryModalMixin, QueryBuilderModalBase):
128
128
  fields=fields,
129
129
  tables=tables,
130
130
  report_builder_class=report_builder_class,
131
- pivot_fields=pivot_fields)
131
+ pivot_fields=pivot_fields,
132
+ include_mathematical_columns=True)
132
133
 
133
134
  self.add_command('report_fields', data=json.dumps({'fields': fields, 'tables': tables}))
134
135
  self.add_command('report_pivots', data=json.dumps({'pivot_fields': pivot_fields}))
@@ -159,6 +160,13 @@ class TableFieldForm(ChartBaseFieldForm):
159
160
  else:
160
161
  return super().submit_button(css_class, button_text, **kwargs)
161
162
 
163
+ def is_mathematical_field(self, data):
164
+ return self.django_field is None and data['field'] in ['rb_addition',
165
+ 'rb_subtraction',
166
+ 'rb_times',
167
+ 'rb_division',
168
+ 'rb_percentage']
169
+
162
170
  def setup_modal(self, *args, **kwargs):
163
171
  data = json.loads(base64.b64decode(self.slug['data']))
164
172
  report_type, base_model = self.get_report_type_details()
@@ -172,79 +180,235 @@ class TableFieldForm(ChartBaseFieldForm):
172
180
  self.fields['display_heading'].initial = True
173
181
 
174
182
  if self.django_field is not None and isinstance(self.django_field, DATE_FIELDS):
175
- self.fields['annotations_value'] = ChoiceField(choices=[(0, '-----')] + ANNOTATION_VALUE_CHOICES,
176
- required=False)
177
- if 'annotations_value' in data_attr:
178
- self.fields['annotations_value'].initial = data_attr['annotations_value']
179
- self.fields['date_format'] = ChoiceField(choices=[(0, '-----')] + DATE_FORMAT_TYPES, required=False)
180
- if 'date_format' in data_attr:
181
- self.fields['date_format'].initial = data_attr['date_format']
183
+ self.setup_date_fields(data_attr)
182
184
  elif self.django_field is not None and isinstance(self.django_field, NUMBER_FIELDS):
183
- self.fields['annotations_type'] = ChoiceField(choices=[(0, '-----')] + ANNOTATIONS_CHOICES,
184
- required=False)
185
- if 'annotations_type' in data_attr:
186
- self.fields['annotations_type'].initial = data_attr['annotations_type']
187
- self.fields['show_table_totals'] = BooleanField(required=False,
188
- widget=RBToggle(),
189
- label='Show totals')
190
- if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
191
- self.fields['show_table_totals'].initial = True
192
- self.fields['decimal_places'] = IntegerField()
193
- self.fields['decimal_places'].initial = int(data_attr.get('decimal_places', 0))
194
- self.fields['has_filter'] = BooleanField(required=False, widget=RBToggle())
195
-
196
- self.fields['filter'] = CharField(required=False)
197
-
198
- if data_attr.get('has_filter') == '1':
199
- self.fields['has_filter'].initial = True
200
- if 'filter' in data_attr:
201
- self.fields['filter'].initial = decode_attribute(data_attr['filter'])
202
-
203
- self.fields['multiple_columns'] = BooleanField(required=False, widget=RBToggle())
204
-
205
- report_builder_class = get_report_builder_class(model=base_model,
206
- report_type=report_type)
207
- fields = []
208
- self._get_query_builder_foreign_key_fields(base_model=base_model,
209
- report_builder_class=report_builder_class,
210
- fields=fields)
211
-
212
- self.fields['multiple_column_field'] = ChoiceField(choices=fields, required=False)
213
-
214
- if data_attr.get('multiple_columns') == '1':
215
- self.fields['multiple_columns'].initial = True
216
- self.fields['multiple_column_field'].initial = data_attr.get('multiple_column_field')
185
+ self.setup_number_fields(data_attr=data_attr,
186
+ base_model=base_model,
187
+ report_type=report_type)
217
188
  elif isinstance(self.col_type_override, CURRENCY_COLUMNS):
218
- self.fields['show_table_totals'] = BooleanField(required=False,
219
- widget=RBToggle(),
220
- label='Show totals')
221
- if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
222
- self.fields['show_table_totals'].initial = True
189
+ self.setup_currency_fields(data_attr=data_attr)
223
190
  elif isinstance(self.col_type_override, LINK_COLUMNS):
224
- self.fields['link_html'] = CharField(required=False)
225
- if 'link_html' in data_attr:
226
- self.fields['link_html'].initial = decode_attribute(data_attr['link_html'])
227
- self.fields['link_css'] = CharField(required=False)
228
- if 'link_css' in data_attr:
229
- self.fields['link_css'].initial = decode_attribute(data_attr['link_css'])
230
- self.fields['is_icon'] = BooleanField(required=False, widget=RBToggle())
231
- if 'is_icon' in data_attr and data_attr['is_icon'] == '1':
232
- self.fields['is_icon'].initial = True
191
+ self.setup_link_fields(data_attr=data_attr)
233
192
  elif self.col_type_override.annotations is not None:
234
- self.fields['show_table_totals'] = BooleanField(required=False,
235
- widget=RBToggle(),
236
- label='Show totals')
237
- if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
238
- self.fields['show_table_totals'].initial = True
193
+ self.setup_annotation_fields(data_attr=data_attr)
194
+ elif self.is_mathematical_field(data=data):
195
+ self.setup_standard_mathematical_fields(data=data,
196
+ data_attr=data_attr)
239
197
  else:
240
198
  self.fields['annotation_label'] = BooleanField(required=False, widget=RBToggle())
241
199
  if 'annotation_label' in data_attr and data_attr['annotation_label'] == '1':
242
200
  self.fields['annotation_label'].initial = True
243
-
244
201
  super().setup_modal(*args, **kwargs)
245
202
 
203
+ def setup_annotation_fields(self, data_attr):
204
+ self.fields['show_table_totals'] = BooleanField(required=False,
205
+ widget=RBToggle(),
206
+ label='Show totals')
207
+ if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
208
+ self.fields['show_table_totals'].initial = True
209
+
210
+ def setup_currency_fields(self, data_attr):
211
+ self.fields['show_table_totals'] = BooleanField(required=False,
212
+ widget=RBToggle(),
213
+ label='Show totals')
214
+ if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
215
+ self.fields['show_table_totals'].initial = True
216
+
217
+ def setup_link_fields(self, data_attr):
218
+ self.fields['link_html'] = CharField(required=False)
219
+ if 'link_html' in data_attr:
220
+ self.fields['link_html'].initial = decode_attribute(data_attr['link_html'])
221
+ self.fields['link_css'] = CharField(required=False)
222
+ if 'link_css' in data_attr:
223
+ self.fields['link_css'].initial = decode_attribute(data_attr['link_css'])
224
+ self.fields['is_icon'] = BooleanField(required=False, widget=RBToggle())
225
+ if 'is_icon' in data_attr and data_attr['is_icon'] == '1':
226
+ self.fields['is_icon'].initial = True
227
+
228
+ def setup_date_fields(self, data_attr):
229
+ self.fields['annotations_value'] = ChoiceField(choices=[(0, '-----')] + ANNOTATION_VALUE_CHOICES,
230
+ required=False)
231
+ if 'annotations_value' in data_attr:
232
+ self.fields['annotations_value'].initial = data_attr['annotations_value']
233
+ self.fields['date_format'] = ChoiceField(choices=[(0, '-----')] + DATE_FORMAT_TYPES, required=False)
234
+ if 'date_format' in data_attr:
235
+ self.fields['date_format'].initial = data_attr['date_format']
236
+
237
+ def setup_number_fields(self, data_attr, base_model, report_type):
238
+ self.fields['annotations_type'] = ChoiceField(choices=[(0, '-----')] + ANNOTATIONS_CHOICES,
239
+ required=False)
240
+ if 'annotations_type' in data_attr:
241
+ self.fields['annotations_type'].initial = data_attr['annotations_type']
242
+
243
+ annotation_column_help_text = 'Not required however useful for mathematical columns.'
244
+ self.fields['annotation_column_id'] = CharField(required=False,
245
+ help_text=annotation_column_help_text)
246
+ if 'annotation_column_id' in data_attr:
247
+ self.fields['annotation_column_id'].initial = decode_attribute(data_attr['annotation_column_id'])
248
+
249
+ self.fields['show_table_totals'] = BooleanField(required=False,
250
+ widget=RBToggle(),
251
+ label='Show totals')
252
+ if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
253
+ self.fields['show_table_totals'].initial = True
254
+
255
+ self.fields['alignment'] = ChoiceField(choices=ALIGNMENT_CHOICES, required=False)
256
+ if 'alignment' in data_attr:
257
+ self.fields['alignment'].initial = data_attr['alignment']
258
+
259
+ self.fields['decimal_places'] = IntegerField()
260
+ self.fields['decimal_places'].initial = int(data_attr.get('decimal_places', 0))
261
+ self.fields['has_filter'] = BooleanField(required=False, widget=RBToggle())
262
+
263
+ self.fields['filter'] = CharField(required=False)
264
+
265
+ if data_attr.get('has_filter') == '1':
266
+ self.fields['has_filter'].initial = True
267
+ if 'filter' in data_attr:
268
+ self.fields['filter'].initial = decode_attribute(data_attr['filter'])
269
+
270
+ self.fields['multiple_columns'] = BooleanField(required=False, widget=RBToggle())
271
+
272
+ report_builder_class = get_report_builder_class(model=base_model,
273
+ report_type=report_type)
274
+ fields = []
275
+ self._get_query_builder_foreign_key_fields(base_model=base_model,
276
+ report_builder_class=report_builder_class,
277
+ fields=fields)
278
+
279
+ self.fields['multiple_column_field'] = ChoiceField(choices=fields, required=False)
280
+
281
+ if data_attr.get('multiple_columns') == '1':
282
+ self.fields['multiple_columns'].initial = True
283
+ self.fields['multiple_column_field'].initial = data_attr.get('multiple_column_field')
284
+
285
+ def setup_standard_mathematical_fields(self, data, data_attr):
286
+
287
+ self.fields['hidden'] = BooleanField(required=False, widget=RBToggle(), label='Hidden')
288
+ if int(data_attr.get('hidden', 0)) == 1:
289
+ self.fields['hidden'].initial = True
290
+
291
+ self.fields['column_id'] = CharField(required=False)
292
+ if 'column_id' in data_attr:
293
+ self.fields['column_id'].initial = decode_attribute(data_attr['column_id'])
294
+ if data['field'] in ['rb_division', 'rb_percentage']:
295
+ self.fields['numerator_column'] = CharField(required=False)
296
+ if 'numerator_column' in data_attr:
297
+ self.fields['numerator_column'].initial = decode_attribute(data_attr['numerator_column'])
298
+ self.fields['denominator_column'] = CharField(required=False)
299
+ if 'denominator_column' in data_attr:
300
+ self.fields['denominator_column'].initial = decode_attribute(data_attr['denominator_column'])
301
+ elif data['field'] == 'rb_times':
302
+ self.fields['multiplicand_column'] = CharField(required=False)
303
+ if 'multiplicand_column' in data_attr:
304
+ self.fields['multiplicand_column'].initial = decode_attribute(data_attr['multiplicand_column'])
305
+ self.fields['multiplier_column'] = CharField(required=False)
306
+ if 'multiplier_column' in data_attr:
307
+ self.fields['multiplier_column'].initial = decode_attribute(data_attr['multiplier_column'])
308
+ else: # add and sub
309
+ self.fields['first_value_column'] = CharField(required=False)
310
+ if 'first_value_column' in data_attr:
311
+ self.fields['first_value_column'].initial = decode_attribute(data_attr['first_value_column'])
312
+ self.fields['second_value_column'] = CharField(required=False)
313
+ if 'second_value_column' in data_attr:
314
+ self.fields['second_value_column'].initial = decode_attribute(data_attr['second_value_column'])
315
+ self.fields['decimal_places'] = IntegerField()
316
+ self.fields['decimal_places'].initial = int(data_attr.get('decimal_places', 0))
317
+ self.fields['show_table_totals'] = BooleanField(required=False,
318
+ widget=RBToggle(),
319
+ label='Show totals')
320
+ if 'show_totals' in data_attr and data_attr['show_totals'] == '1':
321
+ self.fields['show_table_totals'].initial = True
322
+
323
+ self.fields['alignment'] = ChoiceField(choices=ALIGNMENT_CHOICES, required=False)
324
+ if 'alignment' in data_attr:
325
+ self.fields['alignment'].initial = data_attr['alignment']
326
+
327
+ def save_mathematical_fields(self, data, attributes):
328
+ if self.cleaned_data['hidden']:
329
+ attributes.append('hidden-1')
330
+
331
+ alignment = self.cleaned_data.get('alignment')
332
+ if alignment:
333
+ attributes.append(f'alignment-{alignment}')
334
+ if self.cleaned_data['column_id']:
335
+ b64_column_id = encode_attribute(self.cleaned_data['column_id'])
336
+ attributes.append(f'column_id-{b64_column_id}')
337
+ if data['field'] in ['rb_division', 'rb_percentage']:
338
+ if self.cleaned_data['numerator_column']:
339
+ b64_numerator_column = encode_attribute(self.cleaned_data['numerator_column'])
340
+ attributes.append(f'numerator_column-{b64_numerator_column}')
341
+ if self.cleaned_data['denominator_column']:
342
+ b64_denominator_column = encode_attribute(self.cleaned_data['denominator_column'])
343
+ attributes.append(f'denominator_column-{b64_denominator_column}')
344
+ elif data['field'] == 'rb_times':
345
+ if self.cleaned_data['multiplicand_column']:
346
+ b64_multiplicand_column = encode_attribute(self.cleaned_data['multiplicand_column'])
347
+ attributes.append(f'multiplicand_column-{b64_multiplicand_column}')
348
+ if self.cleaned_data['multiplier_column']:
349
+ b64_multiplier_column = encode_attribute(self.cleaned_data['multiplier_column'])
350
+ attributes.append(f'multiplier_column-{b64_multiplier_column}')
351
+ else:
352
+ if self.cleaned_data['first_value_column']:
353
+ b64_first_value_column = encode_attribute(self.cleaned_data['first_value_column'])
354
+ attributes.append(f'first_value_column-{b64_first_value_column}')
355
+ if self.cleaned_data['second_value_column']:
356
+ b64_second_value_column = encode_attribute(self.cleaned_data['second_value_column'])
357
+ attributes.append(f'second_value_column-{b64_second_value_column}')
358
+
359
+ attributes.append(f'decimal_places-{self.cleaned_data.get("decimal_places", 0)}')
360
+ if self.cleaned_data['show_table_totals']:
361
+ attributes.append('show_totals-1')
362
+
363
+ def save_number_fields(self, attributes):
364
+ alignment = self.cleaned_data.get('alignment')
365
+ if alignment:
366
+ attributes.append(f'alignment-{alignment}')
367
+ if int(self.cleaned_data['annotations_type']) != 0:
368
+ attributes.append(f'annotations_type-{self.cleaned_data["annotations_type"]}')
369
+ if self.cleaned_data['annotation_column_id']:
370
+ b64_annotation_column_id = encode_attribute(self.cleaned_data['annotation_column_id'])
371
+ attributes.append(f'annotation_column_id-{b64_annotation_column_id}')
372
+ if self.cleaned_data['show_table_totals']:
373
+ attributes.append('show_totals-1')
374
+ if self.cleaned_data['decimal_places'] > 0:
375
+ attributes.append(f'decimal_places-{self.cleaned_data["decimal_places"]}')
376
+ if self.cleaned_data['has_filter']:
377
+ attributes.append(f'has_filter-1')
378
+ if self.cleaned_data['filter']:
379
+ b64_filter = encode_attribute(self.cleaned_data['filter'])
380
+ attributes.append(f'filter-{b64_filter}')
381
+ if self.cleaned_data['multiple_columns']:
382
+ attributes.append('multiple_columns-1')
383
+ attributes.append(f'multiple_column_field-{self.cleaned_data["multiple_column_field"]}')
384
+
385
+ def save_date_fields(self, attributes):
386
+ if self.cleaned_data['annotations_value']:
387
+ attributes.append(f'annotations_value-{self.cleaned_data["annotations_value"]}')
388
+ if self.cleaned_data['date_format']:
389
+ attributes.append(f'date_format-{self.cleaned_data["date_format"]}')
390
+
391
+ def save_currency_fields(self, attributes):
392
+ if self.cleaned_data['show_table_totals']:
393
+ attributes.append('show_totals-1')
394
+
395
+ def save_link_fields(self, attributes):
396
+ if self.cleaned_data['link_css']:
397
+ b64_link_css = encode_attribute(self.cleaned_data['link_css'])
398
+ attributes.append(f'link_css-{b64_link_css}')
399
+ if self.cleaned_data['link_html']:
400
+ b64_link_html = encode_attribute(self.cleaned_data['link_html'])
401
+ attributes.append(f'link_html-{b64_link_html}')
402
+ if self.cleaned_data['is_icon'] and self.cleaned_data["is_icon"]:
403
+ attributes.append('is_icon-1')
404
+
405
+ def save_annotations_fields(self, attributes):
406
+ if self.cleaned_data['show_table_totals']:
407
+ attributes.append('show_totals-1')
408
+
246
409
  def get_additional_attributes(self):
247
410
  attributes = []
411
+ data = json.loads(base64.b64decode(self.slug['data']))
248
412
  self.get_report_type_details()
249
413
 
250
414
  if self.cleaned_data['display_heading']:
@@ -253,41 +417,17 @@ class TableFieldForm(ChartBaseFieldForm):
253
417
  attributes.append('display_heading-0')
254
418
 
255
419
  if self.django_field is not None and isinstance(self.django_field, DATE_FIELDS):
256
- if self.cleaned_data['annotations_value']:
257
- attributes.append(f'annotations_value-{self.cleaned_data["annotations_value"]}')
258
- if self.cleaned_data['date_format']:
259
- attributes.append(f'date_format-{self.cleaned_data["date_format"]}')
420
+ self.save_date_fields(attributes=attributes)
260
421
  elif self.django_field is not None and isinstance(self.django_field, NUMBER_FIELDS):
261
- if int(self.cleaned_data['annotations_type']) != 0:
262
- attributes.append(f'annotations_type-{self.cleaned_data["annotations_type"]}')
263
- if self.cleaned_data['show_table_totals']:
264
- attributes.append('show_totals-1')
265
- if self.cleaned_data['decimal_places'] > 0:
266
- attributes.append(f'decimal_places-{self.cleaned_data["decimal_places"]}')
267
- if self.cleaned_data['has_filter']:
268
- attributes.append(f'has_filter-1')
269
- if self.cleaned_data['filter']:
270
- b64_filter = encode_attribute(self.cleaned_data['filter'])
271
- attributes.append(f'filter-{b64_filter}')
272
- if self.cleaned_data['multiple_columns']:
273
- attributes.append('multiple_columns-1')
274
- attributes.append(f'multiple_column_field-{self.cleaned_data["multiple_column_field"]}')
422
+ self.save_number_fields(attributes=attributes)
275
423
  elif isinstance(self.col_type_override, CURRENCY_COLUMNS):
276
- if self.cleaned_data['show_table_totals']:
277
- attributes.append('show_totals-1')
424
+ self.save_currency_fields(attributes=attributes)
278
425
  elif isinstance(self.col_type_override, LINK_COLUMNS):
279
- if self.cleaned_data['link_css']:
280
- b64_link_css = encode_attribute(self.cleaned_data['link_css'])
281
- attributes.append(f'link_css-{b64_link_css}')
282
- if self.cleaned_data['link_html']:
283
- b64_link_html = encode_attribute(self.cleaned_data['link_html'])
284
- attributes.append(f'link_html-{b64_link_html}')
285
- if self.cleaned_data['is_icon'] and self.cleaned_data["is_icon"]:
286
- attributes.append('is_icon-1')
287
-
426
+ self.save_link_fields(attributes=attributes)
288
427
  elif self.col_type_override.annotations is not None:
289
- if self.cleaned_data['show_table_totals']:
290
- attributes.append('show_totals-1')
428
+ self.save_annotations_fields(attributes=attributes)
429
+ elif self.is_mathematical_field(data=data):
430
+ self.save_mathematical_fields(data=data, attributes=attributes)
291
431
  else:
292
432
  if self.cleaned_data['annotation_label'] and self.cleaned_data["annotation_label"]:
293
433
  attributes.append('annotation_label-1')
@@ -303,6 +443,7 @@ class TableFieldModal(QueryBuilderModalBaseMixin, FormModal):
303
443
  template_name = 'advanced_report_builder/datatables/fields/modal.html'
304
444
  no_header_x = True
305
445
  helper_class = HorizontalNoEnterHelper
446
+ update_selection_command = 'update_selection'
306
447
 
307
448
  @property
308
449
  def modal_title(self):
@@ -319,7 +460,7 @@ class TableFieldModal(QueryBuilderModalBaseMixin, FormModal):
319
460
  'val': _attr})
320
461
 
321
462
  self.add_command({'function': 'html', 'selector': f'#{selector} span', 'html': form.cleaned_data['title']})
322
- self.add_command({'function': 'update_selection'})
463
+ self.add_command({'function': self.update_selection_command})
323
464
  return self.command_response('close')
324
465
 
325
466
  def form_setup(self, form, *_args, **_kwargs):
@@ -331,7 +472,7 @@ class TableFieldModal(QueryBuilderModalBaseMixin, FormModal):
331
472
  report_builder_class=report_builder_class)
332
473
  if django_field is not None and isinstance(django_field, NUMBER_FIELDS):
333
474
  form.add_trigger('annotations_type', 'onchange', [
334
- {'selector': '#annotations_fields_div', 'values': {'': 'hide'}, 'default': 'show'}])
475
+ {'selector': '#annotations_fields_div', 'values': {'0': 'hide'}, 'default': 'show'}])
335
476
 
336
477
  form.add_trigger('has_filter', 'onchange', [
337
478
  {'selector': '#filter_fields_div', 'values': {'checked': 'show'}, 'default': 'hide'}])
@@ -342,10 +483,12 @@ class TableFieldModal(QueryBuilderModalBaseMixin, FormModal):
342
483
 
343
484
  return ['title',
344
485
  'display_heading',
345
- 'annotations_type',
346
486
  'show_table_totals',
347
487
  'decimal_places',
348
- Div(FieldEx('has_filter',
488
+ 'alignment',
489
+ 'annotations_type',
490
+ Div('annotation_column_id',
491
+ FieldEx('has_filter',
349
492
  template='django_modals/fields/label_checkbox.html',
350
493
  field_class='col-6 input-group-sm'),
351
494
  Div(
@@ -408,4 +551,3 @@ class TablePivotModal(QueryBuilderModalBaseMixin, FormModal):
408
551
 
409
552
  self.add_command({'function': 'update_pivot_selection'})
410
553
  return self.command_response('close')
411
-