monopyly 1.6.1__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 (237) hide show
  1. {monopyly-1.6.1 → monopyly-1.6.2}/PKG-INFO +6 -6
  2. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/CHANGELOG.md +8 -0
  3. monopyly-1.6.2/monopyly/_version.py +34 -0
  4. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/parser.py +1 -1
  5. monopyly-1.6.2/monopyly/static/js/bind-tag-actions.js +211 -0
  6. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/highlight-discrepant-transactions.js +1 -0
  7. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/tag_tree.html +4 -1
  8. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/tags_page.html +3 -1
  9. {monopyly-1.6.1 → monopyly-1.6.2}/pyproject.toml +5 -5
  10. monopyly-1.6.1/monopyly/_version.py +0 -16
  11. monopyly-1.6.1/monopyly/static/js/bind-tag-actions.js +0 -123
  12. {monopyly-1.6.1 → monopyly-1.6.2}/.gitignore +0 -0
  13. {monopyly-1.6.1 → monopyly-1.6.2}/COPYING +0 -0
  14. {monopyly-1.6.1 → monopyly-1.6.2}/LICENSE +0 -0
  15. {monopyly-1.6.1 → monopyly-1.6.2}/README.md +0 -0
  16. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/README.md +0 -0
  17. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/__init__.py +0 -0
  18. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/actions.py +0 -0
  19. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/blueprint.py +0 -0
  20. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/routes.py +0 -0
  21. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/tools.py +0 -0
  22. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/accounts.py +0 -0
  23. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/actions.py +0 -0
  24. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/banks.py +0 -0
  25. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/blueprint.py +0 -0
  26. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/filters.py +0 -0
  27. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/forms.py +0 -0
  28. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/routes.py +0 -0
  29. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/transactions.py +0 -0
  30. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/__init__.py +0 -0
  31. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/_forms.py +0 -0
  32. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/fields.py +0 -0
  33. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/utils.py +0 -0
  34. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/validators.py +0 -0
  35. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/transactions.py +0 -0
  36. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/utils.py +0 -0
  37. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/actions.py +0 -0
  38. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/blueprint.py +0 -0
  39. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/context_processors.py +0 -0
  40. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/errors.py +0 -0
  41. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/filters.py +0 -0
  42. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/internal_transactions.py +0 -0
  43. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/routes.py +0 -0
  44. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/accounts.py +0 -0
  45. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/actions.py +0 -0
  46. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/blueprint.py +0 -0
  47. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/cards.py +0 -0
  48. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/forms.py +0 -0
  49. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/routes.py +0 -0
  50. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/statements.py +0 -0
  51. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/__init__.py +0 -0
  52. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/_transactions.py +0 -0
  53. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/__init__.py +0 -0
  54. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/data.py +0 -0
  55. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/reconciliation.py +0 -0
  56. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/__init__.py +0 -0
  57. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/models.py +0 -0
  58. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/preloads.sql +0 -0
  59. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/schema.sql +0 -0
  60. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/views.sql +0 -0
  61. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/scripts/screenshot_application.py +0 -0
  62. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/chartist-1.5.0.min.js +0 -0
  63. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/css/style.css +0 -0
  64. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/browserconfig.xml +0 -0
  65. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-114.png +0 -0
  66. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-120.png +0 -0
  67. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-144.png +0 -0
  68. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-150.png +0 -0
  69. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-152.png +0 -0
  70. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-16.png +0 -0
  71. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-160.png +0 -0
  72. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-180.png +0 -0
  73. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-192.png +0 -0
  74. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-310.png +0 -0
  75. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-32.png +0 -0
  76. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-57.png +0 -0
  77. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-60.png +0 -0
  78. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-64.png +0 -0
  79. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-70.png +0 -0
  80. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-72.png +0 -0
  81. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-76.png +0 -0
  82. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-96.png +0 -0
  83. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon.ico +0 -0
  84. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon.png +0 -0
  85. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-details.png +0 -0
  86. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-summaries.png +0 -0
  87. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-accounts.png +0 -0
  88. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-account-details.png +0 -0
  89. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-statement-details.png +0 -0
  90. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-transactions.png +0 -0
  91. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/homepage-user.png +0 -0
  92. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/homepage.png +0 -0
  93. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/statement-details.png +0 -0
  94. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/chase-card.png +0 -0
  95. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/discover-card.png +0 -0
  96. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/new-card.png +0 -0
  97. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/template-card.png +0 -0
  98. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-down.png +0 -0
  99. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-left.png +0 -0
  100. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-up.png +0 -0
  101. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/checkmark.png +0 -0
  102. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange-thick.png +0 -0
  103. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange.png +0 -0
  104. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-thick.png +0 -0
  105. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete.png +0 -0
  106. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/edit.png +0 -0
  107. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/link.png +0 -0
  108. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/minus-thick.png +0 -0
  109. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/minus.png +0 -0
  110. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/plus-thick.png +0 -0
  111. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/plus.png +0 -0
  112. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/refresh.png +0 -0
  113. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/save.png +0 -0
  114. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/sort-asc.png +0 -0
  115. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/sort-desc.png +0 -0
  116. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement-pair.png +0 -0
  117. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement-thick.png +0 -0
  118. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement.png +0 -0
  119. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/x-thick.png +0 -0
  120. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/statement.png +0 -0
  121. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/jquery-3.7.1.min.js +0 -0
  122. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/add-subtransaction.js +0 -0
  123. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/add-transfer.js +0 -0
  124. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/autocomplete-transaction.js +0 -0
  125. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/create-balance-chart.js +0 -0
  126. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/create-category-chart.js +0 -0
  127. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/define-filter.js +0 -0
  128. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-account-type-inputs.js +0 -0
  129. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-bank-inputs.js +0 -0
  130. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-credit-account-inputs.js +0 -0
  131. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-bank-account.js +0 -0
  132. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-bank.js +0 -0
  133. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-transaction.js +0 -0
  134. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/flip-card.js +0 -0
  135. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/hide-homepage-block.js +0 -0
  136. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/infer-card.js +0 -0
  137. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/infer-statement.js +0 -0
  138. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/load-more-transactions.js +0 -0
  139. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/make-payment.js +0 -0
  140. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/ajax.js +0 -0
  141. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/autocomplete-input.js +0 -0
  142. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/expand-box-row.js +0 -0
  143. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/expand-transaction.js +0 -0
  144. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/form-suggestions.js +0 -0
  145. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-acquisition-form.js +0 -0
  146. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-overlays.js +0 -0
  147. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-subforms.js +0 -0
  148. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/update-database-widget.js +0 -0
  149. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/update-display-ajax.js +0 -0
  150. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/show-credit-activity-loader.js +0 -0
  151. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/show-linked-transaction.js +0 -0
  152. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/toggle-navigation.js +0 -0
  153. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-account-statement-parameters.js +0 -0
  154. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-bank-name.js +0 -0
  155. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-card-status.js +0 -0
  156. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-statement-parameters.js +0 -0
  157. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-statements-display.js +0 -0
  158. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-transactions-display.js +0 -0
  159. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/use-suggested-amount.js +0 -0
  160. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/use-suggested-merchant.js +0 -0
  161. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/change_password.html +0 -0
  162. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/login.html +0 -0
  163. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/register.html +0 -0
  164. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form.html +0 -0
  165. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form_page_new.html +0 -0
  166. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_page.html +0 -0
  167. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries.html +0 -0
  168. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries_page.html +0 -0
  169. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summary.html +0 -0
  170. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/accounts_page.html +0 -0
  171. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/bank_info_form.html +0 -0
  172. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form.html +0 -0
  173. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page.html +0 -0
  174. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_new.html +0 -0
  175. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_update.html +0 -0
  176. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transfer_form.html +0 -0
  177. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/condensed_row_content.html +0 -0
  178. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/expanded_row_content.html +0 -0
  179. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/table.html +0 -0
  180. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transaction_field_titles.html +0 -0
  181. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transactions.html +0 -0
  182. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/form_page.html +0 -0
  183. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subform.html +0 -0
  184. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subtransaction_subform.html +0 -0
  185. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/transaction_form_page.html +0 -0
  186. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_bank_transaction.html +0 -0
  187. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_credit_transaction.html +0 -0
  188. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_transaction_overlay.html +0 -0
  189. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/subtransactions.html +0 -0
  190. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/table.html +0 -0
  191. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_condensed.html +0 -0
  192. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_expanded.html +0 -0
  193. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transactions.html +0 -0
  194. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/credits.html +0 -0
  195. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/400.html +0 -0
  196. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/401.html +0 -0
  197. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/403.html +0 -0
  198. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/404.html +0 -0
  199. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/405.html +0 -0
  200. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/408.html +0 -0
  201. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/418.html +0 -0
  202. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/425.html +0 -0
  203. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/500.html +0 -0
  204. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/error.html +0 -0
  205. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/index.html +0 -0
  206. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/profile.html +0 -0
  207. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/story.html +0 -0
  208. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/account_page.html +0 -0
  209. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form.html +0 -0
  210. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form_page_new.html +0 -0
  211. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/transfer_statement_inquiry.html +0 -0
  212. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_back.html +0 -0
  213. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_front.html +0 -0
  214. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_submission_page.html +0 -0
  215. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/cards.html +0 -0
  216. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/cards_page.html +0 -0
  217. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_page.html +0 -0
  218. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/discrepant_records.html +0 -0
  219. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_inquiry.html +0 -0
  220. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +0 -0
  221. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/summary.html +0 -0
  222. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/unrecorded_activities.html +0 -0
  223. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_summary.html +0 -0
  224. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statements.html +0 -0
  225. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statements_page.html +0 -0
  226. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form.html +0 -0
  227. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page.html +0 -0
  228. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_new.html +0 -0
  229. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_update.html +0 -0
  230. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_submission_page.html +0 -0
  231. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_page.html +0 -0
  232. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/condensed_row_content.html +0 -0
  233. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/expanded_row_content.html +0 -0
  234. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/table.html +0 -0
  235. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transaction_field_titles.html +0 -0
  236. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transactions.html +0 -0
  237. {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/layout.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monopyly
3
- Version: 1.6.1
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.6.0
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.10
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.2.0
34
- Requires-Dist: sqlalchemy==2.0.45
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">
@@ -244,4 +244,12 @@
244
244
  - Bump dependencies
245
245
 
246
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
+
247
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
@@ -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)
@@ -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
 
@@ -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" />
@@ -33,7 +33,9 @@
33
33
  <div id="tags-container" class="tag-container">
34
34
 
35
35
  <ul class="tags">
36
- {% include 'common/tag_tree.html' %}
36
+ {% with new_tree = True %}
37
+ {% include 'common/tag_tree.html' %}
38
+ {% endwith %}
37
39
  </ul>
38
40
 
39
41
  <img class="root new-tag button" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}" />
@@ -11,15 +11,15 @@ description = 'A homemade personal finance manager.'
11
11
  license = { text = 'GNU GPLv3' }
12
12
  requires-python = '>=3.10'
13
13
  dependencies = [
14
- 'dry-foundation==1.6.0',
14
+ 'dry-foundation==1.6.2',
15
15
  'Flask==3.1.2',
16
16
  'Flask-WTF==1.2.2',
17
- 'gunicorn==23.0.0',
18
- 'Markdown==3.10',
17
+ 'gunicorn==25.0.1',
18
+ 'Markdown==3.10.1',
19
19
  'nltk==3.9.2',
20
20
  'python-dateutil==2.9.0',
21
- 'rich==14.2.0',
22
- 'SQLAlchemy==2.0.45',
21
+ 'rich==14.3.2',
22
+ 'SQLAlchemy==2.0.46',
23
23
  ]
24
24
  keywords = [
25
25
  'Finance',
@@ -1,16 +0,0 @@
1
- # file generated by setuptools_scm
2
- # don't change, don't track in version control
3
- TYPE_CHECKING = False
4
- if TYPE_CHECKING:
5
- from typing import Tuple, Union
6
- VERSION_TUPLE = Tuple[Union[int, str], ...]
7
- else:
8
- VERSION_TUPLE = object
9
-
10
- version: str
11
- __version__: str
12
- __version_tuple__: VERSION_TUPLE
13
- version_tuple: VERSION_TUPLE
14
-
15
- __version__ = version = '1.6.1'
16
- __version_tuple__ = version_tuple = (1, 6, 1)
@@ -1,123 +0,0 @@
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
-
17
- const endpointAddTag = ADD_TAG_ENDPOINT;
18
- const endpointRemoveTag = REMOVE_TAG_ENDPOINT;
19
- // Set animation parameters
20
- const slideTime = 300;
21
- // Identify the buttons
22
- const $buttonsAddTag = $('#transaction-tags .new-tag.button');
23
- const $buttonsDelete = $('#transaction-tags .action.button.delete');
24
-
25
- bindTagCreator($buttonsAddTag, $buttonsDelete);
26
-
27
- function bindTagCreator($buttonsAddTag, $buttonsDelete) {
28
- // Bind add tag buttons
29
- $buttonsAddTag.on('click', function() {
30
- const $container = $(this).closest('.tag-container');
31
- const $tags = $container.children('ul.tags');
32
- const $input = $tags.children('input.new-tag');
33
- // Reveal the input
34
- showInput($input);
35
- // Perform actions when focus is lost
36
- $input.on('blur', function() {
37
- if ($input.val()) {
38
- addNewTag($input, $container);
39
- } else {
40
- hideEmptyInput($input);
41
- }
42
- clearInput($input);
43
- });
44
- $input.on('keydown', function() {
45
- if (event.which == 27) {
46
- clearInput($input);
47
- hideEmptyInput($input);
48
- }
49
- });
50
- });
51
- // Bind remove tag buttons
52
- $buttonsDelete.on('click', function() {
53
- if (confirmDelete()) {
54
- const $container = $(this).closest('.tag-container');
55
- const $tag = $container.find('.tag').first();
56
- // Remove the tag from the database
57
- removeTag($tag);
58
- // Remove the tag from the display
59
- const $tagContainer = $tag.closest('.tag-area');
60
- $tagContainer.slideUp(300, function() {
61
- $(this).remove()
62
- });
63
- }
64
- });
65
- }
66
-
67
- function addNewTag($input, $container) {
68
- // Add the input value to the database as a tag
69
- const parentTag = $container.children('.tag-area').find('.tag').text()
70
- const rawData = {
71
- 'tag_name': $input.val(),
72
- 'parent': parentTag
73
- };
74
- // Execute the AJAX request and display update
75
- function addTag(response) {
76
- // Add the AJAX request response to the DOM before the input
77
- $input.before(response);
78
- hideFilledInput($input);
79
- // Bind the buttons for the newly added tag
80
- const $buttonAddTag = $input.prev().find('.new-tag.button');
81
- const $buttonRemoveTag = $input.prev().find('.action.button.delete');
82
- bindTagCreator($buttonAddTag, $buttonRemoveTag);
83
- }
84
- executeAjaxRequest(endpointAddTag, rawData, addTag);
85
- }
86
-
87
- function showInput($input) {
88
- $input.slideDown(slideTime, function() {
89
- $input.addClass('visible');
90
- $input.focus();
91
- });
92
- }
93
-
94
- function hideFilledInput($input) {
95
- // Hide the input immediately
96
- $input.hide();
97
- $input.removeClass('visible');
98
- }
99
-
100
- function hideEmptyInput($input) {
101
- // Hide the input gracefully
102
- $input.removeClass('visible');
103
- $input.slideUp(slideTime);
104
- }
105
-
106
- function clearInput($input) {
107
- // Clear the input
108
- $input.val('');
109
- }
110
-
111
- function confirmDelete() {
112
- return confirm('Are you sure you want to delete this tag?');
113
- }
114
-
115
- function removeTag($tag) {
116
- // Get the name of the tag
117
- const tagName = $tag.html();
118
- const rawData = {'tag_name': tagName};
119
- // Execute the AJAX request
120
- executeAjaxRequest(endpointRemoveTag, rawData);
121
- }
122
-
123
- })();
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes