django-advanced-report-builder 0.8.3__tar.gz → 0.9.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 (185) hide show
  1. {django-advanced-report-builder-0.8.3/django_advanced_report_builder.egg-info → django-advanced-report-builder-0.9.0}/PKG-INFO +1 -1
  2. django-advanced-report-builder-0.9.0/advanced_report_builder/.DS_Store +0 -0
  3. django-advanced-report-builder-0.9.0/advanced_report_builder/admin.py +172 -0
  4. django-advanced-report-builder-0.9.0/advanced_report_builder/column_types.py +26 -0
  5. django-advanced-report-builder-0.9.0/advanced_report_builder/columns.py +274 -0
  6. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/customise.py +0 -1
  7. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/data_merge/utils.py +38 -20
  8. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/data_merge/widget.py +4 -1
  9. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/duplicate.py +20 -12
  10. django-advanced-report-builder-0.9.0/advanced_report_builder/field_types.py +212 -0
  11. django-advanced-report-builder-0.9.0/advanced_report_builder/field_utils.py +363 -0
  12. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/filter_query.py +135 -92
  13. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/generate_series.py +2 -2
  14. django-advanced-report-builder-0.9.0/advanced_report_builder/globals.py +245 -0
  15. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/includes.py +5 -3
  16. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/models.py +91 -61
  17. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/report_builder.py +0 -2
  18. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/.DS_Store +0 -0
  19. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/.DS_Store +0 -0
  20. django-advanced-report-builder-0.9.0/advanced_report_builder/static/advanced_report_builder/fullcalendar/.DS_Store +0 -0
  21. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/fields/single_query_builder.html +1 -1
  22. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/toggle.py +1 -5
  23. django-advanced-report-builder-0.9.0/advanced_report_builder/urls.py +168 -0
  24. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/utils.py +34 -9
  25. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/variable_date.py +1 -2
  26. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/bar_charts.py +357 -220
  27. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/charts_base.py +153 -96
  28. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/custom.py +16 -11
  29. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/dashboard.py +64 -38
  30. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/datatables/datatables.py +38 -24
  31. django-advanced-report-builder-0.9.0/advanced_report_builder/views/datatables/modal.py +938 -0
  32. django-advanced-report-builder-0.9.0/advanced_report_builder/views/datatables/utils.py +631 -0
  33. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/funnel_charts.py +133 -74
  34. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/helpers.py +12 -2
  35. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/kanban.py +406 -257
  36. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/line_charts.py +194 -112
  37. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/modals_base.py +110 -78
  38. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/pie_charts.py +133 -72
  39. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/query_modal/mixin.py +63 -47
  40. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/query_modal/modal.py +87 -63
  41. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/report.py +22 -7
  42. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/report_utils_mixin.py +92 -52
  43. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/reports.py +19 -12
  44. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/single_values.py +323 -201
  45. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/targets/utils.py +3 -2
  46. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/targets/views.py +1 -4
  47. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0/django_advanced_report_builder.egg-info}/PKG-INFO +1 -1
  48. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/django_advanced_report_builder.egg-info/SOURCES.txt +3 -0
  49. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/setup.py +1 -1
  50. django-advanced-report-builder-0.8.3/advanced_report_builder/admin.py +0 -161
  51. django-advanced-report-builder-0.8.3/advanced_report_builder/columns.py +0 -130
  52. django-advanced-report-builder-0.8.3/advanced_report_builder/field_types.py +0 -189
  53. django-advanced-report-builder-0.8.3/advanced_report_builder/field_utils.py +0 -251
  54. django-advanced-report-builder-0.8.3/advanced_report_builder/globals.py +0 -192
  55. django-advanced-report-builder-0.8.3/advanced_report_builder/urls.py +0 -71
  56. django-advanced-report-builder-0.8.3/advanced_report_builder/views/datatables/modal.py +0 -556
  57. django-advanced-report-builder-0.8.3/advanced_report_builder/views/datatables/utils.py +0 -429
  58. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/LICENSE +0 -0
  59. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/MANIFEST.in +0 -0
  60. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/README.md +0 -0
  61. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/__init__.py +0 -0
  62. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/apps.py +0 -0
  63. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/data_merge/__init__.py +0 -0
  64. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/exceptions.py +0 -0
  65. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0001_initial.py +0 -0
  66. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0002_auto_20220209_1657.py +0 -0
  67. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0003_auto_20220215_1219.py +0 -0
  68. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0004_customreport.py +0 -0
  69. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0005_auto_20220303_0958.py +0 -0
  70. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0006_auto_20220310_1147.py +0 -0
  71. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0007_auto_20220322_1939.py +0 -0
  72. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0008_auto_20220404_1144.py +0 -0
  73. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0009_auto_20230428_1554.py +0 -0
  74. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0010_auto_20230428_2033.py +0 -0
  75. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0011_auto_20230620_1449.py +0 -0
  76. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0012_auto_20230718_1642.py +0 -0
  77. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0013_reportqueryorder.py +0 -0
  78. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/0014_auto_20240706_2207.py +0 -0
  79. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/migrations/__init__.py +0 -0
  80. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.esm.js +0 -0
  81. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.js +0 -0
  82. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chart.min.js +0 -0
  83. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-adapter-moment.min.js +0 -0
  84. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chartjs-plugin-datalabels.min.js +0 -0
  85. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/chunks/helpers.segment.js +0 -0
  86. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/chart-js/js/helpers.esm.js +0 -0
  87. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/d3/js/d3.js +0 -0
  88. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/d3/js/d3.min.js +0 -0
  89. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.js +0 -0
  90. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/d3-funnel/js/d3-funnel.min.js +0 -0
  91. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dashboard/js/dashboard.js +0 -0
  92. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/.gitignore +0 -0
  93. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/.travis.yml +0 -0
  94. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/LICENSE-DOT.txt +0 -0
  95. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/README.md +0 -0
  96. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/bin/dot-packer +0 -0
  97. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/bower.json +0 -0
  98. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doT.js +0 -0
  99. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doT.min.js +0 -0
  100. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/doU.js +0 -0
  101. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/index.js +0 -0
  102. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/dot/js/package.json +0 -0
  103. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.js +0 -0
  104. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/jquery_extendext/js/jQuery.extendext.min.js +0 -0
  105. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/.DS_Store +0 -0
  106. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/.DS_Store +0 -0
  107. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.css +0 -0
  108. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.dark.min.css +0 -0
  109. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.css +0 -0
  110. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/css/query-builder.default.min.css +0 -0
  111. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ar.js +0 -0
  112. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.az.js +0 -0
  113. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.bg.js +0 -0
  114. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.cs.js +0 -0
  115. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.da.js +0 -0
  116. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.de.js +0 -0
  117. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.el.js +0 -0
  118. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.en.js +0 -0
  119. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.es.js +0 -0
  120. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fa-IR.js +0 -0
  121. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.fr.js +0 -0
  122. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.he.js +0 -0
  123. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.it.js +0 -0
  124. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.nl.js +0 -0
  125. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.no.js +0 -0
  126. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pl.js +0 -0
  127. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-BR.js +0 -0
  128. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.pt-PT.js +0 -0
  129. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ro.js +0 -0
  130. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ru.js +0 -0
  131. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.sq.js +0 -0
  132. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.tr.js +0 -0
  133. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.ua.js +0 -0
  134. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/i18n/query-builder.zh-CN.js +0 -0
  135. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/.DS_Store +0 -0
  136. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/.DS_Store +0 -0
  137. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/plugins/currency/plugin.js +0 -0
  138. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.js +0 -0
  139. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.min.js +0 -0
  140. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.js +0 -0
  141. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/js/query-builder.standalone.min.js +0 -0
  142. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/.DS_Store +0 -0
  143. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/dark.scss +0 -0
  144. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/default.scss +0 -0
  145. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-checkbox.scss +0 -0
  146. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_bt-tooltip-errors.scss +0 -0
  147. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_filter-description.scss +0 -0
  148. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_invert.scss +0 -0
  149. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/_sortable.scss +0 -0
  150. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/bt-tooltip-errors.scss +0 -0
  151. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/filter-description.scss +0 -0
  152. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/invert.scss +0 -0
  153. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/static/advanced_report_builder/query_builder/scss/plugins/sortable.scss +0 -0
  154. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/bar/middle.html +0 -0
  155. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/funnel/middle.html +0 -0
  156. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/funnel/report.html +0 -0
  157. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/line/middle.html +0 -0
  158. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/modal.html +0 -0
  159. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/modal_field.html +0 -0
  160. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/pie/middle.html +0 -0
  161. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/charts/report.html +0 -0
  162. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/data_merge/data_merge.html +0 -0
  163. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/fields/modal.html +0 -0
  164. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/modal.html +0 -0
  165. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/onclick_menu.html +0 -0
  166. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/report.html +0 -0
  167. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/datatables/select_pivot.html +0 -0
  168. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/kanban/description_modal.html +0 -0
  169. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/kanban/middle.html +0 -0
  170. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/kanban/modal.html +0 -0
  171. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/kanban/report.html +0 -0
  172. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/query_builder.html +0 -0
  173. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/query_modal.html +0 -0
  174. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/select_column.html +0 -0
  175. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/single_values/middle.html +0 -0
  176. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/single_values/modal.html +0 -0
  177. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/templates/advanced_report_builder/single_values/report.html +0 -0
  178. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/__init__.py +0 -0
  179. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/datatables/__init__.py +0 -0
  180. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/query_modal/__init__.py +0 -0
  181. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/advanced_report_builder/views/targets/__init__.py +0 -0
  182. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/django_advanced_report_builder.egg-info/dependency_links.txt +0 -0
  183. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/django_advanced_report_builder.egg-info/requires.txt +0 -0
  184. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.0}/django_advanced_report_builder.egg-info/top_level.txt +0 -0
  185. {django-advanced-report-builder-0.8.3 → django-advanced-report-builder-0.9.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.8.3
3
+ Version: 0.9.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
@@ -0,0 +1,172 @@
1
+ from django.contrib import admin
2
+ from advanced_report_builder.models import (
3
+ Report,
4
+ ReportType,
5
+ TableReport,
6
+ ReportQuery,
7
+ SingleValueReport,
8
+ Dashboard,
9
+ DashboardReport,
10
+ BarChartReport,
11
+ LineChartReport,
12
+ PieChartReport,
13
+ FunnelChartReport,
14
+ ReportTag,
15
+ KanbanReport,
16
+ KanbanReportLane,
17
+ Target,
18
+ CustomReport,
19
+ KanbanReportDescription,
20
+ )
21
+
22
+
23
+ @admin.register(ReportQuery)
24
+ class ReportQueryAdmin(admin.ModelAdmin):
25
+ list_display = ('report', 'name', 'query')
26
+
27
+
28
+ class ReportQueryInline(admin.TabularInline):
29
+ model = ReportQuery
30
+
31
+
32
+ @admin.register(Report)
33
+ class ReportAdmin(admin.ModelAdmin):
34
+ list_display = ('name', 'instance_type', 'slug', 'slug_alias', 'version')
35
+ exclude = ('slug',)
36
+
37
+ inlines = [ReportQueryInline]
38
+
39
+
40
+ @admin.register(ReportType)
41
+ class ReportTypeAdmin(admin.ModelAdmin):
42
+ list_display = ('name', 'content_type', 'report_builder_class_name')
43
+
44
+
45
+ @admin.register(TableReport)
46
+ class TableReportAdmin(admin.ModelAdmin):
47
+ list_display = (
48
+ 'name',
49
+ 'slug',
50
+ )
51
+ exclude = (
52
+ 'instance_type',
53
+ 'slug',
54
+ )
55
+ inlines = [ReportQueryInline]
56
+
57
+
58
+ @admin.register(SingleValueReport)
59
+ class SingleValueReportAdmin(admin.ModelAdmin):
60
+ list_display = (
61
+ 'name',
62
+ 'slug',
63
+ )
64
+ exclude = (
65
+ 'instance_type',
66
+ 'slug',
67
+ )
68
+ inlines = [ReportQueryInline]
69
+
70
+
71
+ @admin.register(BarChartReport)
72
+ class BarChartReportAdmin(admin.ModelAdmin):
73
+ list_display = (
74
+ 'name',
75
+ 'slug',
76
+ )
77
+ exclude = (
78
+ 'instance_type',
79
+ 'slug',
80
+ )
81
+ inlines = [ReportQueryInline]
82
+
83
+
84
+ @admin.register(LineChartReport)
85
+ class LineChartReportAdmin(admin.ModelAdmin):
86
+ list_display = (
87
+ 'name',
88
+ 'slug',
89
+ )
90
+ exclude = (
91
+ 'instance_type',
92
+ 'slug',
93
+ )
94
+ inlines = [ReportQueryInline]
95
+
96
+
97
+ @admin.register(PieChartReport)
98
+ class PieChartReportAdmin(admin.ModelAdmin):
99
+ list_display = (
100
+ 'name',
101
+ 'slug',
102
+ )
103
+ exclude = (
104
+ 'instance_type',
105
+ 'slug',
106
+ )
107
+ inlines = [ReportQueryInline]
108
+
109
+
110
+ @admin.register(FunnelChartReport)
111
+ class FunnelChartReportAdmin(admin.ModelAdmin):
112
+ list_display = (
113
+ 'name',
114
+ 'slug',
115
+ )
116
+ exclude = (
117
+ 'instance_type',
118
+ 'slug',
119
+ )
120
+ inlines = [ReportQueryInline]
121
+
122
+
123
+ @admin.register(CustomReport)
124
+ class CustomReportAdmin(admin.ModelAdmin):
125
+ list_display = ('name', 'slug', 'output_type', 'view_name', 'settings')
126
+ exclude = ('instance_type', 'slug', 'report_type')
127
+
128
+
129
+ class KanbanReportDescriptionInline(admin.TabularInline):
130
+ model = KanbanReportDescription
131
+
132
+
133
+ class KanbanReportLaneInline(admin.TabularInline):
134
+ model = KanbanReportLane
135
+
136
+
137
+ @admin.register(KanbanReport)
138
+ class KanbanReportAdmin(admin.ModelAdmin):
139
+ list_display = (
140
+ 'name',
141
+ 'slug',
142
+ )
143
+ exclude = ('instance_type', 'slug', 'report_type')
144
+ inlines = [KanbanReportLaneInline, KanbanReportDescriptionInline]
145
+
146
+
147
+ class DashboardReportInline(admin.TabularInline):
148
+ model = DashboardReport
149
+
150
+
151
+ @admin.register(Dashboard)
152
+ class DashboardAdmin(admin.ModelAdmin):
153
+ list_display = (
154
+ 'slug',
155
+ 'name',
156
+ )
157
+
158
+ exclude = [
159
+ 'slug',
160
+ ]
161
+
162
+ inlines = [DashboardReportInline]
163
+
164
+
165
+ @admin.register(ReportTag)
166
+ class ReportTagAdmin(admin.ModelAdmin):
167
+ list_display = ('name', 'order')
168
+
169
+
170
+ @admin.register(Target)
171
+ class TargetAdmin(admin.ModelAdmin):
172
+ list_display = ('pk', 'name', 'target_type', 'default_value')
@@ -0,0 +1,26 @@
1
+ from django.db import models
2
+ from django_datatables.columns import CurrencyColumn, CurrencyPenceColumn, ColumnLink
3
+
4
+ from advanced_report_builder.columns import (
5
+ ColourColumn,
6
+ ReverseForeignKeyStrColumn,
7
+ ReverseForeignKeyBoolColumn,
8
+ ReverseForeignKeyChoiceColumn,
9
+ ReverseForeignKeyDateColumn,
10
+ )
11
+
12
+ NUMBER_FIELDS = (
13
+ models.IntegerField,
14
+ models.PositiveSmallIntegerField,
15
+ models.PositiveIntegerField,
16
+ models.FloatField,
17
+ )
18
+ DATE_FIELDS = (models.DateTimeField, models.DateField)
19
+ BOOLEAN_FIELD = models.BooleanField
20
+ CURRENCY_COLUMNS = (CurrencyColumn, CurrencyPenceColumn)
21
+ LINK_COLUMNS = ColumnLink
22
+ COLOUR_COLUMNS = ColourColumn
23
+ REVERSE_FOREIGN_KEY_STR_COLUMNS = ReverseForeignKeyStrColumn
24
+ REVERSE_FOREIGN_KEY_BOOL_COLUMNS = ReverseForeignKeyBoolColumn
25
+ REVERSE_FOREIGN_KEY_CHOICE_COLUMNS = ReverseForeignKeyChoiceColumn
26
+ REVERSE_FOREIGN_KEY_DATE_COLUMNS = ReverseForeignKeyDateColumn
@@ -0,0 +1,274 @@
1
+ from django.contrib.humanize.templatetags.humanize import intcomma
2
+ from django.contrib.postgres.aggregates import StringAgg, BoolOr, BoolAnd, ArrayAgg
3
+ from django.db.models import Count, BooleanField, Min, Max
4
+ from django.db.models.functions import Cast
5
+ from django_datatables.columns import (
6
+ ColumnBase,
7
+ CurrencyPenceColumn,
8
+ CurrencyColumn,
9
+ NoHeadingColumn,
10
+ ColumnLink,
11
+ ManyToManyColumn,
12
+ )
13
+ from django_datatables.helpers import get_url, DUMMY_ID, render_replace
14
+ from django_datatables.model_def import DatatableModel
15
+
16
+ from advanced_report_builder.globals import (
17
+ REVERSE_FOREIGN_KEY_DELIMITER_COMMA,
18
+ REVERSE_FOREIGN_KEY_DELIMITER_VALUES,
19
+ DATE_FORMAT_TYPE_DD_MM_YY_SLASH,
20
+ DATE_FORMAT_TYPES_DJANGO_FORMAT,
21
+ REVERSE_FOREIGN_KEY_ANNOTATION_DATE_ARRAY,
22
+ REVERSE_FOREIGN_KEY_ANNOTATION_DATE_MAX,
23
+ REVERSE_FOREIGN_KEY_ANNOTATION_DATE_MIN,
24
+ )
25
+ from advanced_report_builder.globals import (
26
+ REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_XOR,
27
+ REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_AND,
28
+ REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_ARRAY,
29
+ )
30
+
31
+
32
+ class ReportBuilderDateColumn(ColumnBase):
33
+ def __init__(self, *, date_format=None, **kwargs):
34
+ if not self.initialise(locals()):
35
+ return
36
+ super().__init__(**kwargs)
37
+ if date_format:
38
+ self.date_format = date_format
39
+ else:
40
+ self.date_format = '%d/%m/%Y'
41
+
42
+ def row_result(self, data, _page_data):
43
+ try:
44
+ date = data[self.field].strftime(self.date_format)
45
+ return date
46
+ except AttributeError:
47
+ return ''
48
+
49
+
50
+ class ReportBuilderNumberColumn(ColumnBase):
51
+ def __init__(self, *, decimal_places=0, trim_zeros=True, **kwargs):
52
+ if not self.initialise(locals()):
53
+ return
54
+ super().__init__(**kwargs)
55
+ self.decimal_places = f'{{:.{decimal_places}f}}'
56
+ self.trim_zeros = trim_zeros
57
+
58
+ def row_result(self, data, _page_data):
59
+ number = data.get(self.field)
60
+ if number is None:
61
+ return ''
62
+ else:
63
+ number = self.decimal_places.format(number)
64
+ if self.trim_zeros and '.' in number:
65
+ return number.rstrip('0').rstrip('.')
66
+ else:
67
+ return number
68
+
69
+
70
+ class ReportBuilderCurrencyPenceColumn(CurrencyPenceColumn):
71
+ def row_result(self, data, _page_data):
72
+ try:
73
+ return intcomma('{:.2f}'.format(data[self.field] / 100.0))
74
+ except (KeyError, TypeError):
75
+ return '0.00'
76
+
77
+
78
+ class ReportBuilderCurrencyColumn(CurrencyColumn):
79
+ def row_result(self, data, _page_data):
80
+ try:
81
+ return intcomma('{:.2f}'.format(data[self.field]))
82
+ except (KeyError, TypeError):
83
+ return '0.00'
84
+
85
+
86
+ class ArrowColumn(NoHeadingColumn):
87
+ def __init__(self, **kwargs):
88
+ if not self.initialise(locals()):
89
+ return
90
+ kwargs['render'] = [{'html': '<i class="fa fa-angle-right fa-2x"></i>', 'function': 'Html'}]
91
+ kwargs['width'] = '10px'
92
+ super().__init__(**kwargs)
93
+
94
+
95
+ class ColourColumn(ColumnBase):
96
+ def __init__(self, **kwargs):
97
+ if not self.initialise(locals()):
98
+ return
99
+ kwargs['render'] = [
100
+ render_replace(
101
+ html='<span style="display: inline-block; width: 60px; height: 15px;'
102
+ ' background-color: #%1%; vertical-align: middle;"></span>',
103
+ column=kwargs['column_name'],
104
+ )
105
+ ]
106
+ super().__init__(**kwargs)
107
+
108
+
109
+ class FilterForeignKeyColumn(ColumnBase):
110
+ def get_query_options(self):
111
+ values = self.model.objects.distinct(self.field).order_by(self.field).values_list(self.field, flat=True)
112
+ return {v: v for v in values if v}
113
+
114
+
115
+ class ReverseForeignKeyStrColumn(ColumnBase):
116
+ def __init__(self, field_name, report_builder_class_name, **kwargs):
117
+ if not self.initialise(locals()):
118
+ return
119
+ super().__init__(**kwargs)
120
+ self.field_name = field_name
121
+ self.report_builder_class_name = report_builder_class_name
122
+
123
+ def setup_annotations(self, delimiter_type=None, sub_filter=None, field_name=None):
124
+ if field_name is None:
125
+ field_name = self.field_name
126
+ delimiter = REVERSE_FOREIGN_KEY_DELIMITER_VALUES[delimiter_type]
127
+
128
+ self.annotations = {
129
+ field_name: StringAgg(self.field_name, delimiter=delimiter, distinct=True, filter=sub_filter)
130
+ }
131
+
132
+
133
+ class ReverseForeignKeyBoolColumn(ColumnBase):
134
+ def __init__(self, field_name, report_builder_class_name, **kwargs):
135
+ if not self.initialise(locals()):
136
+ return
137
+ super().__init__(**kwargs)
138
+ self.field_name = field_name
139
+ self.report_builder_class_name = report_builder_class_name
140
+
141
+ def setup_annotations(self, annotations_type, sub_filter=None, field_name=None):
142
+ if field_name is None:
143
+ field_name = self.field_name
144
+
145
+ if annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_XOR:
146
+ self.annotations = {field_name: BoolOr(Cast(self.field_name, BooleanField()), filter=sub_filter)}
147
+ elif annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_AND:
148
+ self.annotations = {field_name: BoolAnd(Cast(self.field_name, BooleanField()), filter=sub_filter)}
149
+ elif annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_BOOLEAN_ARRAY:
150
+ self.annotations = {field_name: ArrayAgg(self.field_name, distinct=True, filter=sub_filter)}
151
+
152
+
153
+ class ReverseForeignKeyChoiceColumn(ColumnBase):
154
+ def __init__(self, field_name, report_builder_class_name, **kwargs):
155
+ if not self.initialise(locals()):
156
+ return
157
+ self.field_name = field_name
158
+ self.choices = None
159
+ self.report_builder_class_name = report_builder_class_name
160
+ self.delimiter_type = REVERSE_FOREIGN_KEY_DELIMITER_COMMA
161
+ super().__init__(**kwargs)
162
+
163
+ def setup_results(self, request, all_results):
164
+ _, django_field, _ = DatatableModel.get_setup_data(self.model, self.field_name)
165
+ self.choices = {c[0]: c[1] for c in django_field.choices}
166
+
167
+ def row_result(self, data, _page_data):
168
+ results = []
169
+ for x in data.get(self.field):
170
+ results.append(self.choices.get(x, ''))
171
+ delimiter = REVERSE_FOREIGN_KEY_DELIMITER_VALUES[self.delimiter_type]
172
+ return delimiter.join(results)
173
+
174
+ def setup_annotations(self, delimiter_type=None, sub_filter=None, field_name=None):
175
+ if field_name is None:
176
+ field_name = self.field_name
177
+ self.delimiter_type = delimiter_type
178
+ self.annotations = {field_name: ArrayAgg(self.field_name, distinct=True, filter=sub_filter)}
179
+
180
+
181
+ class ReverseForeignKeyDateColumn(ColumnBase):
182
+ def __init__(self, field_name, report_builder_class_name, **kwargs):
183
+ if not self.initialise(locals()):
184
+ return
185
+ super().__init__(**kwargs)
186
+ self.field_name = field_name
187
+ self.report_builder_class_name = report_builder_class_name
188
+ self.delimiter_type = REVERSE_FOREIGN_KEY_DELIMITER_COMMA
189
+ self.date_format_type = DATE_FORMAT_TYPE_DD_MM_YY_SLASH
190
+ self.annotations_type = REVERSE_FOREIGN_KEY_ANNOTATION_DATE_ARRAY
191
+
192
+ def setup_annotations(
193
+ self,
194
+ delimiter_type=None,
195
+ date_format_type=None,
196
+ annotations_type=None,
197
+ sub_filter=None,
198
+ field_name=None,
199
+ ):
200
+ if field_name is None:
201
+ field_name = self.field_name
202
+ self.delimiter_type = delimiter_type
203
+ self.date_format_type = date_format_type
204
+ self.annotations_type = annotations_type
205
+
206
+ if annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_DATE_ARRAY:
207
+ self.annotations = {field_name: ArrayAgg(self.field_name, distinct=True, filter=sub_filter)}
208
+ elif annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_DATE_MIN:
209
+ self.annotations = {field_name: Min(self.field_name, sub_filter=sub_filter)}
210
+
211
+ elif annotations_type == REVERSE_FOREIGN_KEY_ANNOTATION_DATE_MAX:
212
+ self.annotations = {field_name: Max(self.field_name, sub_filter=sub_filter)}
213
+
214
+ def row_result(self, data, _page_data):
215
+ field = self.field
216
+ if isinstance(field, list):
217
+ field = field[-1]
218
+ try:
219
+ date_formate_type_str = DATE_FORMAT_TYPES_DJANGO_FORMAT[self.date_format_type]
220
+ results = []
221
+ date_values = data[field]
222
+ if date_values is None:
223
+ return ''
224
+ if isinstance(date_values, list):
225
+ for value in date_values:
226
+ results.append(value.strftime(date_formate_type_str))
227
+ delimiter = REVERSE_FOREIGN_KEY_DELIMITER_VALUES[self.delimiter_type]
228
+ return delimiter.join(results)
229
+ else:
230
+ return date_values.strftime(date_formate_type_str)
231
+ except AttributeError:
232
+ return ''
233
+
234
+
235
+ class ReportBuilderColumnLink(ColumnLink):
236
+ """Sometimes you may want to have a report where the links don't work.
237
+ This is used for when you have a wall board"""
238
+
239
+ @property
240
+ def url(self):
241
+ return self._url
242
+
243
+ @url.setter
244
+ def url(self, url_name):
245
+ if (
246
+ not self.table
247
+ or self.table.view is None
248
+ or self.table.view.kwargs.get('enable_links')
249
+ or getattr(self.table.view, 'enable_links', False)
250
+ ):
251
+ self._url = get_url(url_name)
252
+ else:
253
+ self._url = f'#?{DUMMY_ID}'
254
+
255
+
256
+ class RecordCountColumn(ColumnBase):
257
+ def __init__(self, field=None, **kwargs):
258
+ if 'annotations' not in kwargs:
259
+ kwargs['annotations'] = {'record_count': Count(1)}
260
+ if 'column_name' not in kwargs:
261
+ kwargs['column_name'] = 'record_count'
262
+ super().__init__(field, **kwargs)
263
+
264
+
265
+ class ReportBuilderManyToManyColumn(ManyToManyColumn):
266
+ def __init__(self, *arg, **kwargs):
267
+ if not self.initialise(locals()):
268
+ return
269
+ super().__init__(*arg, **kwargs)
270
+ if self.model_path is not None:
271
+ self.field = 'id'
272
+
273
+ def row_result(self, data_dict, page_results):
274
+ return page_results['m2m' + self.column_name].get(data_dict[self.model_path + 'id'], self.blank)
@@ -7,16 +7,24 @@ from advanced_report_builder.utils import get_report_builder_class
7
7
 
8
8
 
9
9
  class DataMergeUtils(ReportBuilderFieldUtils):
10
- def get_menu_fields(self, base_model, report_builder_class,
11
- menus=None, codes=None, code_prefix='', next_code_prefix='__',
12
- previous_base_model=None, table=None):
13
-
10
+ def get_menu_fields(
11
+ self,
12
+ base_model,
13
+ report_builder_class,
14
+ menus=None,
15
+ codes=None,
16
+ code_prefix='',
17
+ next_code_prefix='__',
18
+ previous_base_model=None,
19
+ table=None,
20
+ ):
14
21
  for report_builder_field in report_builder_class.fields:
15
22
  django_field, col_type_override, columns, _ = self.get_field_details(
16
23
  base_model=base_model,
17
24
  field=report_builder_field,
18
25
  report_builder_class=report_builder_class,
19
- table=table)
26
+ table=table,
27
+ )
20
28
  for column in columns:
21
29
  full_id = code_prefix + column.column_name
22
30
  if menus is not None:
@@ -29,8 +37,9 @@ class DataMergeUtils(ReportBuilderFieldUtils):
29
37
 
30
38
  new_model = apps.get_model(app_label, model)
31
39
  if new_model != previous_base_model:
32
- new_report_builder_class = get_report_builder_class(model=new_model,
33
- class_name=report_builder_fields_str)
40
+ new_report_builder_class = get_report_builder_class(
41
+ model=new_model, class_name=report_builder_fields_str
42
+ )
34
43
 
35
44
  title = include.get('title')
36
45
  if title is None or title == '':
@@ -39,14 +48,16 @@ class DataMergeUtils(ReportBuilderFieldUtils):
39
48
  menu = []
40
49
  else:
41
50
  menu = None
42
- self.get_menu_fields(base_model=new_model,
43
- report_builder_class=new_report_builder_class,
44
- menus=menu,
45
- codes=codes,
46
- code_prefix=f"{code_prefix}{include_field}{next_code_prefix}",
47
- next_code_prefix=next_code_prefix,
48
- previous_base_model=base_model,
49
- table=table)
51
+ self.get_menu_fields(
52
+ base_model=new_model,
53
+ report_builder_class=new_report_builder_class,
54
+ menus=menu,
55
+ codes=codes,
56
+ code_prefix=f'{code_prefix}{include_field}{next_code_prefix}',
57
+ next_code_prefix=next_code_prefix,
58
+ previous_base_model=base_model,
59
+ table=table,
60
+ )
50
61
  if menus is not None:
51
62
  menus.append({'text': title, 'menu': menu})
52
63
 
@@ -70,7 +81,12 @@ class DataMergeUtils(ReportBuilderFieldUtils):
70
81
  for field in variable[1].split(' '):
71
82
  if field != '' and (field == 'as' or field[0] in ['=', '<', '>']):
72
83
  break
73
- if field not in ['', 'not', 'and' 'or'] and field[0] not in ['(', ')', '"', "'"]:
84
+ if field not in ['', 'not', 'andor'] and field[0] not in [
85
+ '(',
86
+ ')',
87
+ '"',
88
+ "'",
89
+ ]:
74
90
  all_fields.add(field)
75
91
  return all_fields
76
92
 
@@ -79,10 +95,12 @@ class DataMergeUtils(ReportBuilderFieldUtils):
79
95
  columns = set()
80
96
  column_map = {}
81
97
  for field in all_fields:
82
- django_field, col_type_override, _, _ = self.get_field_details(base_model=base_model,
83
- field=field,
84
- report_builder_class=report_builder_class,
85
- table=table)
98
+ django_field, col_type_override, _, _ = self.get_field_details(
99
+ base_model=base_model,
100
+ field=field,
101
+ report_builder_class=report_builder_class,
102
+ table=table,
103
+ )
86
104
  if django_field is not None or isinstance(col_type_override.field, (list, tuple)):
87
105
  if field not in columns and f'.{field}' not in columns:
88
106
  columns.add('.' + field)
@@ -4,7 +4,10 @@ from django.forms.widgets import Input
4
4
  class DataMergeWidget(Input):
5
5
  template_name = 'advanced_report_builder/data_merge/data_merge.html'
6
6
  input_type = 'textarea'
7
- crispy_kwargs = {'label_class': 'col-3 col-form-label-sm', 'field_class': 'col-12 input-group-sm'}
7
+ crispy_kwargs = {
8
+ 'label_class': 'col-3 col-form-label-sm',
9
+ 'field_class': 'col-12 input-group-sm',
10
+ }
8
11
 
9
12
  def __init__(self, data_merge_data=None, height=150):
10
13
  self.height = height
@@ -1,22 +1,30 @@
1
1
  from copy import deepcopy
2
2
 
3
- from advanced_report_builder.models import TableReport, SingleValueReport, BarChartReport, PieChartReport, \
4
- FunnelChartReport, KanbanReport, LineChartReport, CustomReport
3
+ from advanced_report_builder.models import (
4
+ TableReport,
5
+ SingleValueReport,
6
+ BarChartReport,
7
+ PieChartReport,
8
+ FunnelChartReport,
9
+ KanbanReport,
10
+ LineChartReport,
11
+ CustomReport,
12
+ )
5
13
  from django.shortcuts import get_object_or_404
6
14
 
7
15
 
8
16
  class DuplicateReport:
9
-
10
17
  def duplicate(self, report):
11
- duplicate_methods = {'tablereport': self._duplicate_table_report,
12
- 'singlevaluereport': self._duplicate_single_value_report,
13
- 'barchartreport': self._duplicate_bar_chart_report,
14
- 'linechartreport': self._duplicate_line_chart_report,
15
- 'piechartreport': self._duplicate_pie_chart_report,
16
- 'funnelchartreport': self._duplicate_funnel_chart_report,
17
- 'kanbanreport': self._duplicate_kanban_report,
18
- 'customreport': self._duplicate_custom_report,
19
- }
18
+ duplicate_methods = {
19
+ 'tablereport': self._duplicate_table_report,
20
+ 'singlevaluereport': self._duplicate_single_value_report,
21
+ 'barchartreport': self._duplicate_bar_chart_report,
22
+ 'linechartreport': self._duplicate_line_chart_report,
23
+ 'piechartreport': self._duplicate_pie_chart_report,
24
+ 'funnelchartreport': self._duplicate_funnel_chart_report,
25
+ 'kanbanreport': self._duplicate_kanban_report,
26
+ 'customreport': self._duplicate_custom_report,
27
+ }
20
28
  new_report = duplicate_methods[report.instance_type](report_id=report.id)
21
29
  return new_report
22
30