monopyly 1.6.0__tar.gz → 1.6.2__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.
Files changed (238) hide show
  1. {monopyly-1.6.0 → monopyly-1.6.2}/PKG-INFO +6 -6
  2. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/CHANGELOG.md +15 -0
  3. monopyly-1.6.2/monopyly/_version.py +34 -0
  4. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/forms.py +4 -0
  5. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/forms/_forms.py +5 -14
  6. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/forms/fields.py +0 -9
  7. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/forms/utils.py +3 -3
  8. monopyly-1.6.2/monopyly/core/context_processors.py +23 -0
  9. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/cards.py +1 -1
  10. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/forms.py +6 -2
  11. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/activity/parser.py +1 -1
  12. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/css/style.css +4 -0
  13. monopyly-1.6.2/monopyly/static/js/bind-tag-actions.js +211 -0
  14. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/highlight-discrepant-transactions.js +1 -0
  15. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form_page_new.html +10 -8
  16. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/accounts_page.html +8 -6
  17. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/tag_tree.html +4 -1
  18. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/tags_page.html +15 -13
  19. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/index.html +12 -8
  20. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/profile.html +18 -19
  21. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/account_page.html +17 -17
  22. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form_page_new.html +8 -5
  23. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_page.html +43 -44
  24. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statements_page.html +13 -13
  25. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_page.html +28 -28
  26. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/layout.html +7 -5
  27. {monopyly-1.6.0 → monopyly-1.6.2}/pyproject.toml +6 -6
  28. monopyly-1.6.0/monopyly/_version.py +0 -16
  29. monopyly-1.6.0/monopyly/core/context_processors.py +0 -41
  30. monopyly-1.6.0/monopyly/static/js/bind-tag-actions.js +0 -123
  31. {monopyly-1.6.0 → monopyly-1.6.2}/.gitignore +0 -0
  32. {monopyly-1.6.0 → monopyly-1.6.2}/COPYING +0 -0
  33. {monopyly-1.6.0 → monopyly-1.6.2}/LICENSE +0 -0
  34. {monopyly-1.6.0 → monopyly-1.6.2}/README.md +0 -0
  35. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/README.md +0 -0
  36. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/__init__.py +0 -0
  37. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/auth/actions.py +0 -0
  38. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/auth/blueprint.py +0 -0
  39. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/auth/routes.py +0 -0
  40. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/auth/tools.py +0 -0
  41. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/accounts.py +0 -0
  42. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/actions.py +0 -0
  43. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/banks.py +0 -0
  44. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/blueprint.py +0 -0
  45. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/filters.py +0 -0
  46. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/routes.py +0 -0
  47. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/banking/transactions.py +0 -0
  48. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/forms/__init__.py +0 -0
  49. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/forms/validators.py +0 -0
  50. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/transactions.py +0 -0
  51. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/common/utils.py +0 -0
  52. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/actions.py +0 -0
  53. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/blueprint.py +0 -0
  54. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/errors.py +0 -0
  55. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/filters.py +0 -0
  56. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/internal_transactions.py +0 -0
  57. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/core/routes.py +0 -0
  58. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/accounts.py +0 -0
  59. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/actions.py +0 -0
  60. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/blueprint.py +0 -0
  61. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/routes.py +0 -0
  62. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/statements.py +0 -0
  63. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/__init__.py +0 -0
  64. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/_transactions.py +0 -0
  65. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/activity/__init__.py +0 -0
  66. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/activity/data.py +0 -0
  67. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/credit/transactions/activity/reconciliation.py +0 -0
  68. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/database/__init__.py +0 -0
  69. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/database/models.py +0 -0
  70. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/database/preloads.sql +0 -0
  71. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/database/schema.sql +0 -0
  72. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/database/views.sql +0 -0
  73. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/scripts/screenshot_application.py +0 -0
  74. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/chartist-1.5.0.min.js +0 -0
  75. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/browserconfig.xml +0 -0
  76. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-114.png +0 -0
  77. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-120.png +0 -0
  78. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-144.png +0 -0
  79. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-150.png +0 -0
  80. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-152.png +0 -0
  81. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-16.png +0 -0
  82. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-160.png +0 -0
  83. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-180.png +0 -0
  84. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-192.png +0 -0
  85. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-310.png +0 -0
  86. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-32.png +0 -0
  87. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-57.png +0 -0
  88. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-60.png +0 -0
  89. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-64.png +0 -0
  90. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-70.png +0 -0
  91. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-72.png +0 -0
  92. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-76.png +0 -0
  93. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon-96.png +0 -0
  94. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon.ico +0 -0
  95. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/favicon/favicon.png +0 -0
  96. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-details.png +0 -0
  97. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-summaries.png +0 -0
  98. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/bank-accounts.png +0 -0
  99. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/credit-account-details.png +0 -0
  100. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/credit-statement-details.png +0 -0
  101. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/credit-transactions.png +0 -0
  102. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/homepage-user.png +0 -0
  103. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/homepage.png +0 -0
  104. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/about/statement-details.png +0 -0
  105. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/cards/chase-card.png +0 -0
  106. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/cards/discover-card.png +0 -0
  107. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/cards/new-card.png +0 -0
  108. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/cards/template-card.png +0 -0
  109. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-down.png +0 -0
  110. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-left.png +0 -0
  111. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-up.png +0 -0
  112. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/checkmark.png +0 -0
  113. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange-thick.png +0 -0
  114. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange.png +0 -0
  115. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/delete-thick.png +0 -0
  116. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/delete.png +0 -0
  117. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/edit.png +0 -0
  118. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/link.png +0 -0
  119. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/minus-thick.png +0 -0
  120. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/minus.png +0 -0
  121. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/plus-thick.png +0 -0
  122. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/plus.png +0 -0
  123. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/refresh.png +0 -0
  124. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/save.png +0 -0
  125. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/sort-asc.png +0 -0
  126. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/sort-desc.png +0 -0
  127. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/statement-pair.png +0 -0
  128. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/statement-thick.png +0 -0
  129. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/statement.png +0 -0
  130. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/icons/x-thick.png +0 -0
  131. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/img/statement.png +0 -0
  132. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/jquery-3.7.1.min.js +0 -0
  133. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/add-subtransaction.js +0 -0
  134. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/add-transfer.js +0 -0
  135. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/autocomplete-transaction.js +0 -0
  136. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/create-balance-chart.js +0 -0
  137. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/create-category-chart.js +0 -0
  138. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/define-filter.js +0 -0
  139. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/display-new-account-type-inputs.js +0 -0
  140. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/display-new-bank-inputs.js +0 -0
  141. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/display-new-credit-account-inputs.js +0 -0
  142. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/expand-bank-account.js +0 -0
  143. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/expand-bank.js +0 -0
  144. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/expand-transaction.js +0 -0
  145. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/flip-card.js +0 -0
  146. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/hide-homepage-block.js +0 -0
  147. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/infer-card.js +0 -0
  148. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/infer-statement.js +0 -0
  149. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/load-more-transactions.js +0 -0
  150. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/make-payment.js +0 -0
  151. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/ajax.js +0 -0
  152. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/autocomplete-input.js +0 -0
  153. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/expand-box-row.js +0 -0
  154. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/expand-transaction.js +0 -0
  155. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/form-suggestions.js +0 -0
  156. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/manage-acquisition-form.js +0 -0
  157. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/manage-overlays.js +0 -0
  158. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/manage-subforms.js +0 -0
  159. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/update-database-widget.js +0 -0
  160. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/modules/update-display-ajax.js +0 -0
  161. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/show-credit-activity-loader.js +0 -0
  162. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/show-linked-transaction.js +0 -0
  163. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/toggle-navigation.js +0 -0
  164. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-account-statement-parameters.js +0 -0
  165. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-bank-name.js +0 -0
  166. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-card-status.js +0 -0
  167. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-statement-parameters.js +0 -0
  168. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-statements-display.js +0 -0
  169. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/update-transactions-display.js +0 -0
  170. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/use-suggested-amount.js +0 -0
  171. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/static/js/use-suggested-merchant.js +0 -0
  172. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/auth/change_password.html +0 -0
  173. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/auth/login.html +0 -0
  174. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/auth/register.html +0 -0
  175. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form.html +0 -0
  176. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_page.html +24 -24
  177. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries.html +0 -0
  178. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries_page.html +0 -0
  179. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/account_summary.html +0 -0
  180. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/bank_info_form.html +0 -0
  181. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form.html +0 -0
  182. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page.html +0 -0
  183. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_new.html +0 -0
  184. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_update.html +0 -0
  185. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transfer_form.html +0 -0
  186. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/condensed_row_content.html +0 -0
  187. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/expanded_row_content.html +0 -0
  188. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/table.html +0 -0
  189. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transaction_field_titles.html +0 -0
  190. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transactions.html +0 -0
  191. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/form_page.html +0 -0
  192. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subform.html +0 -0
  193. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subtransaction_subform.html +0 -0
  194. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/transaction_form_page.html +0 -0
  195. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_bank_transaction.html +0 -0
  196. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_credit_transaction.html +0 -0
  197. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_transaction_overlay.html +0 -0
  198. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/subtransactions.html +0 -0
  199. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/table.html +0 -0
  200. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_condensed.html +0 -0
  201. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_expanded.html +0 -0
  202. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transactions.html +0 -0
  203. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/credits.html +0 -0
  204. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/400.html +0 -0
  205. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/401.html +0 -0
  206. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/403.html +0 -0
  207. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/404.html +0 -0
  208. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/405.html +0 -0
  209. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/408.html +0 -0
  210. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/418.html +0 -0
  211. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/425.html +0 -0
  212. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/500.html +0 -0
  213. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/errors/error.html +0 -0
  214. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/core/story.html +0 -0
  215. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form.html +0 -0
  216. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_form/transfer_statement_inquiry.html +0 -0
  217. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_back.html +0 -0
  218. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_front.html +0 -0
  219. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/card_submission_page.html +0 -0
  220. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/cards.html +0 -0
  221. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/cards_page.html +0 -0
  222. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/discrepant_records.html +0 -0
  223. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_inquiry.html +0 -0
  224. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +19 -19
  225. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/summary.html +0 -0
  226. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/unrecorded_activities.html +0 -0
  227. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statement_summary.html +0 -0
  228. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/statements.html +0 -0
  229. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form.html +0 -0
  230. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page.html +0 -0
  231. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_new.html +0 -0
  232. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_update.html +9 -9
  233. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transaction_submission_page.html +0 -0
  234. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/condensed_row_content.html +0 -0
  235. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/expanded_row_content.html +0 -0
  236. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/table.html +0 -0
  237. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transaction_field_titles.html +0 -0
  238. {monopyly-1.6.0 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transactions.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monopyly
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: A homemade personal finance manager.
5
5
  Project-URL: Download, https://pypi.org/project/monopyly
6
6
  Project-URL: Homepage, http://monopyly.com
@@ -23,15 +23,15 @@ Classifier: Topic :: Office/Business :: Financial
23
23
  Classifier: Topic :: Office/Business :: Financial :: Accounting
24
24
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
25
25
  Requires-Python: >=3.10
26
- Requires-Dist: dry-foundation==1.4.1
26
+ Requires-Dist: dry-foundation==1.6.2
27
27
  Requires-Dist: flask-wtf==1.2.2
28
28
  Requires-Dist: flask==3.1.2
29
- Requires-Dist: gunicorn==23.0.0
30
- Requires-Dist: markdown==3.9
29
+ Requires-Dist: gunicorn==25.0.1
30
+ Requires-Dist: markdown==3.10.1
31
31
  Requires-Dist: nltk==3.9.2
32
32
  Requires-Dist: python-dateutil==2.9.0
33
- Requires-Dist: rich==14.1.0
34
- Requires-Dist: sqlalchemy==2.0.43
33
+ Requires-Dist: rich==14.3.2
34
+ Requires-Dist: sqlalchemy==2.0.46
35
35
  Description-Content-Type: text/markdown
36
36
 
37
37
  <div id="header">
@@ -237,4 +237,19 @@
237
237
  - Update JavaScript libraries (jQuery, Chartist)
238
238
 
239
239
 
240
+ ### 1.6.1
241
+
242
+ - Allow pie chart labels to overflow the SVG container
243
+ - Define JavaScript elements in header (deferring execution when logical)
244
+ - Bump dependencies
245
+
246
+
247
+ ### 1.6.2
248
+
249
+ - Fix bug in the transaction tag tree template preventing new subtags in the same subtag subtree
250
+ - Refactor JavaScript used to manage the transaction tag tree
251
+ - Add specificity to the reconciliation tool when parsing payment columns (when otherwise unidentified, payment transactions are determined by the presence of the isolated word "payment" in the description field)
252
+ - Bump dependencies
253
+
254
+
240
255
  <a name="bottom" id="bottom"></a>
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '1.6.2'
32
+ __version_tuple__ = version_tuple = (1, 6, 2)
33
+
34
+ __commit_id__ = commit_id = None
@@ -115,6 +115,10 @@ class BankAccountForm(EntryForm):
115
115
  }
116
116
  return account_type_data
117
117
 
118
+ def gather_entry_data(self, entry):
119
+ """Gather data for the form from the given database entry."""
120
+ raise NotImplementedError
121
+
118
122
  # Fields to identify the bank/account type information for the account
119
123
  bank_info = FormField(BankSubform)
120
124
  account_type_info = FormField(AccountTypeSubform)
@@ -2,10 +2,10 @@
2
2
  General form constructions.
3
3
  """
4
4
 
5
- from abc import ABC, abstractmethod
5
+ from abc import abstractmethod
6
6
  from datetime import date
7
7
 
8
- from flask_wtf import FlaskForm
8
+ from dry_foundation.forms import AbstractFlaskForm, FlaskSubform
9
9
  from wtforms.fields import StringField, SubmitField
10
10
  from wtforms.validators import DataRequired
11
11
 
@@ -15,12 +15,7 @@ from .fields import CurrencyField, DateField
15
15
  form_err_msg = "There was an improper value in your form. Please try again."
16
16
 
17
17
 
18
- class AbstractEntryFormMixinMeta(type(FlaskForm), ABC):
19
- # Defined to allow the forms to also to be abstract base classes
20
- pass
21
-
22
-
23
- class EntryForm(FlaskForm, metaclass=AbstractEntryFormMixinMeta):
18
+ class EntryForm(AbstractFlaskForm):
24
19
  """
25
20
  A form designed to accept database entry information.
26
21
 
@@ -85,11 +80,8 @@ class EntryForm(FlaskForm, metaclass=AbstractEntryFormMixinMeta):
85
80
  )
86
81
 
87
82
 
88
- class EntrySubform(EntryForm):
89
- """Subform disabling CSRF (CSRF is REQUIRED in encapsulating form)."""
90
-
91
- def __init__(self, *args, **kwargs):
92
- super().__init__(meta={"csrf": False}, *args, **kwargs)
83
+ class EntrySubform(FlaskSubform, EntryForm):
84
+ """A subform implementing ``EntryForm`` behavior."""
93
85
 
94
86
 
95
87
  class AcquisitionSubform(EntrySubform):
@@ -149,7 +141,6 @@ class TransactionForm(EntryForm):
149
141
  }
150
142
  return data
151
143
 
152
- @abstractmethod
153
144
  def gather_entry_data(self, entry):
154
145
  if self.subtransaction_model is None:
155
146
  raise RuntimeError(
@@ -24,15 +24,6 @@ class DateField(wtforms_fields.DateField):
24
24
  super().__init__(*args, filters=filters, **kwargs)
25
25
 
26
26
 
27
- class OptionalDateField(DateField):
28
- """A date field where the field value is optional."""
29
-
30
- def process_formdata(self, valuelist):
31
- """Process data from the form, ignoring an ommitted value."""
32
- if valuelist != [""]:
33
- super().process_formdata(valuelist)
34
-
35
-
36
27
  class CurrencyField(wtforms_fields.DecimalField):
37
28
  """A decimal field with currency-specific customizations."""
38
29
 
@@ -113,9 +113,9 @@ def extend_field_list_for_ajax(form_class, field_list_name, field_list_count):
113
113
 
114
114
  Parameters
115
115
  ----------
116
- form_class : flask_wtf.FlaskForm
117
- The class (not class instance) containing the field list to be
118
- extended.
116
+ form_class : type
117
+ The form class (not class instance) containing the field list to
118
+ be extended.
119
119
  field_list_name : str
120
120
  The name of the field list to be extended.
121
121
  field_list_count : int
@@ -0,0 +1,23 @@
1
+ """
2
+ Filters defined for the application.
3
+ """
4
+
5
+ from dry_foundation.utils import define_basic_template_global_variables
6
+
7
+ from .actions import determine_summary_balance_svg_viewbox_width
8
+ from .blueprint import bp
9
+
10
+
11
+ @bp.app_context_processor
12
+ def inject_global_template_variables():
13
+ """Inject template variables globally into the template context."""
14
+ return define_basic_template_global_variables("monopyly._version")
15
+
16
+
17
+ @bp.app_context_processor
18
+ def inject_utility_functions():
19
+ """Inject utility functions globally into the template context."""
20
+ utility_functions = {
21
+ "calculate_summary_balance_width": determine_summary_balance_svg_viewbox_width,
22
+ }
23
+ return utility_functions
@@ -137,7 +137,7 @@ def save_card(form, card_id=None):
137
137
 
138
138
  Parameters
139
139
  ----------
140
- form : flask_wtf.FlaskForm
140
+ form : CreditCardForm
141
141
  The form beign used to provide the data being saved.
142
142
  card_id : int
143
143
  The ID of hte card to be saved. If provided, the named card will
@@ -5,6 +5,7 @@ Generate credit card forms for the user to complete.
5
5
  from flask import abort
6
6
  from wtforms.fields import (
7
7
  BooleanField,
8
+ DateField,
8
9
  FieldList,
9
10
  FormField,
10
11
  IntegerField,
@@ -18,7 +19,6 @@ from ..common.forms import AcquisitionSubform, EntryForm, EntrySubform, Transact
18
19
  from ..common.forms.fields import (
19
20
  CustomChoiceSelectField,
20
21
  LastFourDigitsField,
21
- OptionalDateField,
22
22
  StringField,
23
23
  )
24
24
  from ..common.forms.utils import Autocompleter
@@ -152,6 +152,10 @@ class CardStatementTransferForm(EntryForm):
152
152
  transfer = RadioField("transfer", choices=[("yes", "Yes"), ("no", "No")])
153
153
  submit = SubmitField("Continue")
154
154
 
155
+ def gather_entry_data(self, entry):
156
+ """Gather data for the form from the given database entry."""
157
+ raise NotImplementedError
158
+
155
159
 
156
160
  class CreditTransactionForm(TransactionForm):
157
161
  """Form to input/edit credit card transactions."""
@@ -193,7 +197,7 @@ class CreditTransactionForm(TransactionForm):
193
197
  # Fields to identify the card/bank information for the statement
194
198
  card_info = FormField(CardSubform)
195
199
  # Fields pertaining to the statement
196
- issue_date = OptionalDateField("Statement Date")
200
+ issue_date = DateField("Statement Date", [Optional()])
197
201
 
198
202
  def get_statement(self, transaction_date):
199
203
  """Get the credit card statement described by the form data."""
@@ -213,7 +213,7 @@ class _TransactionActivityParser:
213
213
  def _infer_payment_row(row):
214
214
  # Infer whether the row constitutes a payment transaction
215
215
  contextual_info = [row[i].lower() for i in contextual_column_indices]
216
- return any("payment" in element for element in contextual_info)
216
+ return any("payment" in element.split() for element in contextual_info)
217
217
 
218
218
  payment_rows = list(filter(_infer_payment_row, raw_data))
219
219
  return self._extrapolate_payments_positive(payment_rows, raw_data)
@@ -3481,6 +3481,10 @@ form#pay #make-payment[type="submit"] #prompt {
3481
3481
  min-height: 400px;
3482
3482
  }
3483
3483
 
3484
+ #category-chart.ct-chart svg {
3485
+ overflow: visible;
3486
+ }
3487
+
3484
3488
  #category-chart text.ct-label {
3485
3489
  transition: fill 0.1s ease;
3486
3490
  }
@@ -0,0 +1,211 @@
1
+ /*
2
+ * Add a transaction tag on the 'Transaction Tags' page.
3
+ *
4
+ * Adds a transaction tag under the tag or category corresponding to the
5
+ * plus icon that is clicked. Clicking the plus icon adds a tag shaped
6
+ * input box that accepts a new tag name. Once the input loses focus,
7
+ * an AJAX request is executed, the database is updated and the tree of
8
+ * transactions is partially refreshed to allow further additions. If no
9
+ * tag name was provided, no request occurs.
10
+ */
11
+
12
+ import { executeAjaxRequest } from './modules/ajax.js';
13
+
14
+
15
+ (function() {
16
+ // Identify the buttons
17
+ const $createTagButtons = $('#transaction-tags .new-tag.button');
18
+ const $deleteTagButtons = $('#transaction-tags .action.button.delete');
19
+ bindTagButtonBehavior($createTagButtons, $deleteTagButtons);
20
+
21
+ })();
22
+
23
+
24
+ /**
25
+ * Create the tag manager.
26
+ *
27
+ * @param {JQuery} $createTagButtons - Buttons for adding subtags to one or
28
+ * more tags.
29
+ * @param {JQuery} $deleteTagButtons - Buttons for removing tags.
30
+ */
31
+ function bindTagButtonBehavior($createTagButtons, $deleteTagButtons) {
32
+ console.log('bind create buttons', $createTagButtons);
33
+ console.log('bind delete buttons', $deleteTagButtons);
34
+ $createTagButtons.on('click', function() {
35
+ const $button = $(this);
36
+ const behavior = new TagCreation($button);
37
+ behavior.perform();
38
+ });
39
+ $deleteTagButtons.on('click', function() {
40
+ const $button = $(this);
41
+ const behavior = new TagDeletion($button);
42
+ behavior.perform();
43
+ });
44
+ }
45
+
46
+
47
+ /**
48
+ * A class for managing transaction tags and the behavior of their buttons.
49
+ */
50
+ class TagButtonBehavior {
51
+
52
+ /**
53
+ * Create the tag manager.
54
+ *
55
+ * @param {JQuery} $button - A button belonging to a tag.
56
+ */
57
+ constructor($button) {
58
+ this.$container = $button.closest('.tag-container');
59
+ this.$tag = this.$container.children('.tag-area').find('.tag');
60
+ this.$tags = this.$container.children('ul.tags');
61
+ this.$input = this.$tags.children('input.new-tag');
62
+ // Set animation parameters
63
+ this.slideTime = 300;
64
+ }
65
+
66
+ }
67
+
68
+ /**
69
+ * A class for managing transaction tags creation behavior.
70
+ */
71
+ class TagCreation extends TagButtonBehavior {
72
+
73
+ #endpoint = ADD_TAG_ENDPOINT;
74
+
75
+ /**
76
+ * Create the tag creator.
77
+ *
78
+ * @param {JQuery} $button - A button belonging to a tag.
79
+ */
80
+ constructor($button) {
81
+ super($button);
82
+ self = this;
83
+ this.$input.on('blur', function() {
84
+ self.#dropInputFocus();
85
+ });
86
+ this.$input.on('keydown', function() {
87
+ if (event.key == 'Escape') {
88
+ self.#clearInput();
89
+ this.blur();
90
+ } else if (event.key == 'Enter') {
91
+ this.blur();
92
+ }
93
+ });
94
+ }
95
+
96
+ /**
97
+ * Perform the behavior.
98
+ */
99
+ perform() {
100
+ this.#showInput();
101
+ }
102
+
103
+ /**
104
+ * Show the input box to collect new tag information.
105
+ */
106
+ #showInput() {
107
+ console.log('showing input', this.$input);
108
+ self = this;
109
+ this.$input.slideDown(this.slideTime, function() {
110
+ self.$input.addClass('visible');
111
+ self.$input.focus();
112
+ console.log('focus', self.$input);
113
+ });
114
+ }
115
+
116
+ /**
117
+ * Perform a specific action when the input loses focus.
118
+ */
119
+ #dropInputFocus() {
120
+ if (this.$input.val()) {
121
+ this.#createTag();
122
+ this.#hideFilledInput();
123
+ } else {
124
+ this.#hideEmptyInput();
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Create the new tag in the database.
130
+ */
131
+ #createTag() {
132
+ const rawData = {
133
+ 'tag_name': this.$input.val(),
134
+ 'parent': this.$tag.text()
135
+ };
136
+ // Execute the AJAX request and place the new tag
137
+ executeAjaxRequest(this.#endpoint, rawData, this.#placeNewTag.bind(this));
138
+ }
139
+
140
+ /**
141
+ * Add the new tag to the DOM before the input.
142
+ */
143
+ #placeNewTag(newTagHTML) {
144
+ const $newTag = $(newTagHTML);
145
+ this.$input.before($newTag);
146
+ // Bind behavior functionality to the newly created/placed tag buttons
147
+ bindTagButtonBehavior(
148
+ $newTag.find('.new-tag.button'), $newTag.find('.action.button.delete')
149
+ );
150
+ }
151
+
152
+ /**
153
+ * Hide the input immediately.
154
+ */
155
+ #hideFilledInput() {
156
+ this.$input.hide();
157
+ this.$input.removeClass('visible');
158
+ this.#clearInput();
159
+ }
160
+
161
+ /**
162
+ * Hide the (empty) input gracefully.
163
+ */
164
+ #hideEmptyInput() {
165
+ this.$input.removeClass('visible');
166
+ this.$input.slideUp(this.slideTime);
167
+ console.log('hiding empty input', this.$input);
168
+ }
169
+
170
+ /**
171
+ * Clear the input.
172
+ */
173
+ #clearInput() {
174
+ this.$input.val('');
175
+ }
176
+
177
+ }
178
+
179
+
180
+ /**
181
+ * A class for managing transaction tags deletion behavior.
182
+ */
183
+ class TagDeletion extends TagButtonBehavior {
184
+
185
+ #endpoint = REMOVE_TAG_ENDPOINT;
186
+
187
+ /**
188
+ * Perform the behavior.
189
+ */
190
+ perform() {
191
+ if (this.#confirmDelete()) {
192
+ this.#removeTag();
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Remove the tag from the database.
198
+ */
199
+ #removeTag() {
200
+ const rawData = {'tag_name': this.$tag.html()};
201
+ // Execute the AJAX request to delete the tag
202
+ executeAjaxRequest(this.#endpoint, rawData);
203
+ // Remove the tag from the display
204
+ this.$container.slideUp(this.slideTime, function() {this.remove()});
205
+ }
206
+
207
+ #confirmDelete() {
208
+ return confirm('Are you sure you want to delete this tag?');
209
+ }
210
+
211
+ }
@@ -114,6 +114,7 @@ class DiscrepancyHighlighter {
114
114
  this.removeHighlight($(activity), $matchingTransactionRow);
115
115
  }
116
116
  }
117
+
117
118
  }
118
119
 
119
120
 
@@ -1,6 +1,16 @@
1
1
  {% extends "common/form_page.html" %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script type="module" src="{{ url_for('static', filename='js/display-new-bank-inputs.js') }}">
7
+ </script>
8
+ <script type="module" src="{{ url_for('static', filename='js/display-new-account-type-inputs.js') }}">
9
+ </script>
10
+
11
+ {% endblock %}
12
+
13
+
4
14
  {% block title %}
5
15
  New Bank Account
6
16
  {% endblock %}
@@ -13,11 +23,3 @@
13
23
  {% endwith %}
14
24
 
15
25
  {% endblock %}
16
-
17
-
18
- {% block javascript %}
19
- <script type="module" src="{{ url_for('static', filename='js/display-new-bank-inputs.js') }}">
20
- </script>
21
- <script type="module" src="{{ url_for('static', filename='js/display-new-account-type-inputs.js') }}">
22
- </script>
23
- {% endblock %}
@@ -1,6 +1,14 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script type="module" src="{{ url_for('static', filename='js/expand-bank-account.js') }}">
7
+ </script>
8
+
9
+ {% endblock %}
10
+
11
+
4
12
  {% block header %}
5
13
 
6
14
  <h1>
@@ -83,9 +91,3 @@
83
91
  </div>
84
92
 
85
93
  {% endblock %}
86
-
87
-
88
- {% block javascript %}
89
- <script type="module" src="{{ url_for('static', filename='js/expand-bank-account.js') }}">
90
- </script>
91
- {% endblock %}
@@ -18,7 +18,10 @@
18
18
  </li>
19
19
 
20
20
  {% if loop.last %}
21
- <input class="new-tag" type="text" />
21
+ {# Do not create a new input for a tag when its subtree is updated #}
22
+ {% if new_tree or loop.depth0 != 0 %}
23
+ <input class="new-tag" type="text" />
24
+ {% endif %}
22
25
  {% endif %}
23
26
  {% else %}
24
27
  <input class="new-tag" type="text" />
@@ -1,6 +1,18 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const ADD_TAG_ENDPOINT = "{{ url_for('banking.add_tag') }}";
8
+ const REMOVE_TAG_ENDPOINT = "{{ url_for('banking.delete_tag') }}";
9
+ </script>
10
+ <script type="module" src="{{ url_for('static', filename='js/bind-tag-actions.js') }}">
11
+ </script>
12
+
13
+ {% endblock %}
14
+
15
+
4
16
  {% block header %}
5
17
 
6
18
  <h1>
@@ -21,7 +33,9 @@
21
33
  <div id="tags-container" class="tag-container">
22
34
 
23
35
  <ul class="tags">
24
- {% include 'common/tag_tree.html' %}
36
+ {% with new_tree = True %}
37
+ {% include 'common/tag_tree.html' %}
38
+ {% endwith %}
25
39
  </ul>
26
40
 
27
41
  <img class="root new-tag button" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}" />
@@ -31,15 +45,3 @@
31
45
  </div>
32
46
 
33
47
  {% endblock %}
34
-
35
-
36
- {% block javascript %}
37
-
38
- <script>
39
- const ADD_TAG_ENDPOINT = "{{ url_for('banking.add_tag') }}";
40
- const REMOVE_TAG_ENDPOINT = "{{ url_for('banking.delete_tag') }}";
41
- </script>
42
- <script type="module" src="{{ url_for('static', filename='js/bind-tag-actions.js') }}">
43
- </script>
44
-
45
- {% endblock %}
@@ -1,5 +1,17 @@
1
1
  {% extends "layout.html" %}
2
2
 
3
+
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const HIDE_HOMEPAGE_BLOCK_ENDPOINT = "{{ url_for('core.hide_homepage_block') }}";
8
+ </script>
9
+ <script type="module" src="{{ url_for('static', filename='js/hide-homepage-block.js') }}">
10
+ </script>
11
+
12
+ {% endblock %}
13
+
14
+
3
15
  {% block content %}
4
16
 
5
17
  {% if session["show_homepage_block"] %}
@@ -170,11 +182,3 @@
170
182
  {% endif %}
171
183
 
172
184
  {% endblock %}
173
-
174
- {% block javascript %}
175
- <script>
176
- const HIDE_HOMEPAGE_BLOCK_ENDPOINT = "{{ url_for('core.hide_homepage_block') }}";
177
- </script>
178
- <script type="module" src="{{ url_for('static', filename='js/hide-homepage-block.js') }}">
179
- </script>
180
- {% endblock %}
@@ -1,13 +1,28 @@
1
1
  {% extends "layout.html" %}
2
2
 
3
- {% block title %}
4
- Profile
3
+
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const UPDATE_BANK_NAME_ENDPOINTS = {
8
+ {% for bank in banks %}
9
+ {{ bank.id }}: "{{ url_for('banking.update_bank_name', bank_id=bank.id) }}",
10
+ {% endfor %}
11
+ };
12
+ </script>
13
+ <script type="module" src="{{ url_for('static', filename='js/expand-bank.js') }}">
14
+ </script>
15
+ <script type="module" src="{{ url_for('static', filename='js/update-bank-name.js') }}">
16
+ </script>
17
+
5
18
  {% endblock %}
6
19
 
20
+
7
21
  {% block header %}
8
- <h1>Profile</h1>
22
+ <h1>{% block title %}Profile{% endblock %}</h1>
9
23
  {% endblock %}
10
24
 
25
+
11
26
  {% block content %}
12
27
 
13
28
  <div id="profile">
@@ -76,19 +91,3 @@
76
91
  </div>
77
92
 
78
93
  {% endblock %}
79
-
80
-
81
- {% block javascript %}
82
- <script>
83
-
84
- const UPDATE_BANK_NAME_ENDPOINTS = {
85
- {% for bank in banks %}
86
- {{ bank.id }}: "{{ url_for('banking.update_bank_name', bank_id=bank.id) }}",
87
- {% endfor %}
88
- };
89
- </script>
90
- <script type="module" src="{{ url_for('static', filename='js/expand-bank.js') }}">
91
- </script>
92
- <script type="module" src="{{ url_for('static', filename='js/update-bank-name.js') }}">
93
- </script>
94
- {% endblock %}