monopyly 1.4.2__tar.gz → 1.4.3__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 (208) hide show
  1. {monopyly-1.4.2 → monopyly-1.4.3}/.gitignore +2 -1
  2. {monopyly-1.4.2 → monopyly-1.4.3}/PKG-INFO +3 -3
  3. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/__init__.py +0 -2
  4. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/_version.py +2 -2
  5. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/auth/routes.py +3 -1
  6. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/cli/run.py +12 -2
  7. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/config/default_settings.py +1 -0
  8. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/config/settings.py +0 -1
  9. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/css/style.css +3 -2
  10. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/define-filter.js +2 -2
  11. monopyly-1.4.3/monopyly/static/js/expand-transaction.js +18 -0
  12. monopyly-1.4.3/monopyly/static/js/modules/expand-transaction.js +128 -0
  13. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/update-display-ajax.js +15 -8
  14. monopyly-1.4.3/monopyly/static/js/update-transactions-display.js +73 -0
  15. {monopyly-1.4.2 → monopyly-1.4.3}/pyproject.toml +2 -2
  16. monopyly-1.4.2/monopyly/static/js/expand-transaction.js +0 -32
  17. monopyly-1.4.2/monopyly/static/js/modules/expand-transaction.js +0 -63
  18. monopyly-1.4.2/monopyly/static/js/update-transactions-display.js +0 -66
  19. {monopyly-1.4.2 → monopyly-1.4.3}/COPYING +0 -0
  20. {monopyly-1.4.2 → monopyly-1.4.3}/LICENSE +0 -0
  21. {monopyly-1.4.2 → monopyly-1.4.3}/README.md +0 -0
  22. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/README.md +0 -0
  23. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/auth/actions.py +0 -0
  24. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/auth/blueprint.py +0 -0
  25. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/auth/tools.py +0 -0
  26. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/accounts.py +0 -0
  27. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/actions.py +0 -0
  28. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/banks.py +0 -0
  29. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/blueprint.py +0 -0
  30. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/filters.py +0 -0
  31. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/forms.py +0 -0
  32. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/routes.py +0 -0
  33. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/banking/transactions.py +0 -0
  34. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/cli/apps.py +0 -0
  35. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/forms/__init__.py +0 -0
  36. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/forms/_forms.py +0 -0
  37. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/forms/fields.py +0 -0
  38. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/forms/utils.py +0 -0
  39. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/forms/validators.py +0 -0
  40. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/transactions.py +0 -0
  41. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/common/utils.py +0 -0
  42. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/config/__init__.py +0 -0
  43. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/actions.py +0 -0
  44. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/blueprint.py +0 -0
  45. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/context_processors.py +0 -0
  46. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/filters.py +0 -0
  47. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/internal_transactions.py +0 -0
  48. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/core/routes.py +0 -0
  49. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/accounts.py +0 -0
  50. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/actions.py +0 -0
  51. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/blueprint.py +0 -0
  52. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/cards.py +0 -0
  53. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/forms.py +0 -0
  54. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/routes.py +0 -0
  55. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/statements.py +0 -0
  56. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/transactions/__init__.py +0 -0
  57. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/credit/transactions/_transactions.py +0 -0
  58. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/database/__init__.py +0 -0
  59. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/database/models.py +0 -0
  60. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/database/preloads.sql +0 -0
  61. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/database/schema.sql +0 -0
  62. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/database/views.sql +0 -0
  63. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/browserconfig.xml +0 -0
  64. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-114.png +0 -0
  65. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-120.png +0 -0
  66. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-144.png +0 -0
  67. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-150.png +0 -0
  68. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-152.png +0 -0
  69. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-16.png +0 -0
  70. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-160.png +0 -0
  71. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-180.png +0 -0
  72. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-192.png +0 -0
  73. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-310.png +0 -0
  74. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-32.png +0 -0
  75. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-57.png +0 -0
  76. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-60.png +0 -0
  77. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-64.png +0 -0
  78. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-70.png +0 -0
  79. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-72.png +0 -0
  80. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-76.png +0 -0
  81. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon-96.png +0 -0
  82. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon.ico +0 -0
  83. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/favicon/favicon.png +0 -0
  84. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/bank-account-details.png +0 -0
  85. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/bank-account-summaries.png +0 -0
  86. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/bank-accounts.png +0 -0
  87. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/credit-account-details.png +0 -0
  88. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/credit-transactions.png +0 -0
  89. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/homepage-user.png +0 -0
  90. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/homepage.png +0 -0
  91. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/about/statement-details.png +0 -0
  92. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/cards/chase-card.png +0 -0
  93. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/cards/discover-card.png +0 -0
  94. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/cards/new-card.png +0 -0
  95. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/cards/template-card.png +0 -0
  96. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/arrow-down.png +0 -0
  97. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/arrow-left.png +0 -0
  98. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/arrow-up.png +0 -0
  99. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/checkmark.png +0 -0
  100. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/delete-orange-thick.png +0 -0
  101. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/delete-orange.png +0 -0
  102. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/delete-thick.png +0 -0
  103. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/delete.png +0 -0
  104. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/edit.png +0 -0
  105. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/link.png +0 -0
  106. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/minus-thick.png +0 -0
  107. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/minus.png +0 -0
  108. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/plus-thick.png +0 -0
  109. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/plus.png +0 -0
  110. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/refresh.png +0 -0
  111. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/save.png +0 -0
  112. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/sort-asc.png +0 -0
  113. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/sort-desc.png +0 -0
  114. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/statement-pair.svg +0 -0
  115. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/statement.png +0 -0
  116. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/statement.svg +0 -0
  117. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/icons/x-thick.png +0 -0
  118. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/img/statement.png +0 -0
  119. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/jquery-3.7.0.min.js +0 -0
  120. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/add-subtransaction.js +0 -0
  121. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/add-transfer.js +0 -0
  122. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/autocomplete-transaction.js +0 -0
  123. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/bind-tag-actions.js +0 -0
  124. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/create-balance-chart.js +0 -0
  125. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/display-new-account-type-inputs.js +0 -0
  126. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/display-new-bank-inputs.js +0 -0
  127. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/display-new-credit-account-inputs.js +0 -0
  128. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/expand-bank-account.js +0 -0
  129. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/expand-bank.js +0 -0
  130. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/flip-card.js +0 -0
  131. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/hide-homepage-block.js +0 -0
  132. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/infer-card.js +0 -0
  133. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/infer-statement.js +0 -0
  134. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/make-payment.js +0 -0
  135. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/ajax.js +0 -0
  136. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/autocomplete-input.js +0 -0
  137. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/expand-box-row.js +0 -0
  138. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/manage-acquisition-form.js +0 -0
  139. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/manage-overlays.js +0 -0
  140. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/manage-subforms.js +0 -0
  141. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/modules/update-database-widget.js +0 -0
  142. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/show-linked-transaction.js +0 -0
  143. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/update-account-statement-parameters.js +0 -0
  144. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/update-bank-name.js +0 -0
  145. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/update-card-status.js +0 -0
  146. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/update-statement-parameters.js +0 -0
  147. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/static/js/update-statements-display.js +0 -0
  148. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/auth/login.html +0 -0
  149. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/auth/register.html +0 -0
  150. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_form/account_form.html +0 -0
  151. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_form/account_form_page_new.html +0 -0
  152. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_page.html +0 -0
  153. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_summaries.html +0 -0
  154. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_summaries_page.html +0 -0
  155. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/account_summary.html +0 -0
  156. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/accounts_page.html +0 -0
  157. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/bank_info_form.html +0 -0
  158. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/transaction_form.html +0 -0
  159. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/transaction_form_page.html +0 -0
  160. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/transaction_form_page_new.html +0 -0
  161. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/transaction_form_page_update.html +0 -0
  162. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transaction_form/transfer_form.html +0 -0
  163. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transactions_table/condensed_row_content.html +0 -0
  164. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transactions_table/expanded_row_content.html +0 -0
  165. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transactions_table/transaction_field_titles.html +0 -0
  166. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/banking/transactions_table/transactions.html +0 -0
  167. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/form_page.html +0 -0
  168. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transaction_form/subform.html +0 -0
  169. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transaction_form/subtransaction_subform.html +0 -0
  170. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transaction_form/transaction_form_page.html +0 -0
  171. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/linked_bank_transaction.html +0 -0
  172. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/linked_credit_transaction.html +0 -0
  173. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/linked_transaction_overlay.html +0 -0
  174. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/subtransactions.html +0 -0
  175. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/transaction_condensed.html +0 -0
  176. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/transaction_expanded.html +0 -0
  177. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/common/transactions_table/transactions.html +0 -0
  178. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/account_page.html +0 -0
  179. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_form/card_form.html +0 -0
  180. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_form/card_form_page_new.html +0 -0
  181. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_form/transfer_statement_inquiry.html +0 -0
  182. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_graphic/card_back.html +0 -0
  183. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_graphic/card_front.html +0 -0
  184. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/card_submission_page.html +0 -0
  185. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/cards.html +0 -0
  186. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/cards_page.html +0 -0
  187. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/statement_page.html +0 -0
  188. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/statement_summary.html +0 -0
  189. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/statements.html +0 -0
  190. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/statements_page.html +0 -0
  191. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/tag_tree/subtag_tree.html +0 -0
  192. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/tag_tree/tag_tree.html +0 -0
  193. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/tags_page.html +0 -0
  194. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transaction_form/transaction_form.html +0 -0
  195. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transaction_form/transaction_form_page.html +0 -0
  196. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transaction_form/transaction_form_page_new.html +0 -0
  197. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transaction_form/transaction_form_page_update.html +0 -0
  198. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transaction_submission_page.html +0 -0
  199. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transactions_page.html +0 -0
  200. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transactions_table/condensed_row_content.html +0 -0
  201. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transactions_table/expanded_row_content.html +0 -0
  202. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transactions_table/transaction_field_titles.html +0 -0
  203. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credit/transactions_table/transactions.html +0 -0
  204. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/credits.html +0 -0
  205. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/index.html +0 -0
  206. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/layout.html +0 -0
  207. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/profile.html +0 -0
  208. {monopyly-1.4.2 → monopyly-1.4.3}/monopyly/templates/story.html +0 -0
@@ -69,8 +69,9 @@ target/
69
69
  # Mac custom attributes file
70
70
  .DS_Store
71
71
 
72
- # Virtual environment
72
+ # Virtual environments
73
73
  monopyly-env/
74
+ monopyly-production-env/
74
75
 
75
76
  # Hatch-generated version file
76
77
  monopyly/_version.py
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: monopyly
3
- Version: 1.4.2
3
+ Version: 1.4.3
4
4
  Summary: A homemade personal finance manager.
5
5
  Project-URL: Download, https://pypi.org/project/monopyly
6
- Project-URL: Homepage, https://github.com/mitchnegus/monopyly
6
+ Project-URL: Homepage, http://monopyly.com
7
7
  Project-URL: Repository, https://github.com/mitchnegus/monopyly
8
8
  Project-URL: Changelog, https://github.com/mitchnegus/monopyly/blob/main/CHANGELOG.md
9
9
  Author-email: Mitch Negus <mitchnegus57@gmail.com>
@@ -22,7 +22,7 @@ Classifier: Programming Language :: Python
22
22
  Classifier: Topic :: Office/Business :: Financial
23
23
  Classifier: Topic :: Office/Business :: Financial :: Accounting
24
24
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
25
- Requires-Python: <3.11,>=3.9
25
+ Requires-Python: <3.11,>=3.10
26
26
  Requires-Dist: authanor>=1.0.2
27
27
  Requires-Dist: flask-wtf
28
28
  Requires-Dist: flask>=2.2.2
@@ -1,8 +1,6 @@
1
1
  """
2
2
  Run a development server for the Monopyly app.
3
3
  """
4
- import warnings
5
-
6
4
  from flask import Flask
7
5
 
8
6
  from monopyly.config import DevelopmentConfig, ProductionConfig
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
- __version__ = version = '1.4.2'
4
- __version_tuple__ = version_tuple = (1, 4, 2)
3
+ __version__ = version = '1.4.3'
4
+ __version_tuple__ = version_tuple = (1, 4, 3)
@@ -26,7 +26,9 @@ def register():
26
26
  # Get username and passwords from the form
27
27
  username, password = get_username_and_password(request.form)
28
28
  # Check for errors in the accessed information
29
- if not username:
29
+ if not current_app.config["REGISTRATION"]:
30
+ error = "The app is not currently accepting new registrations."
31
+ elif not username:
30
32
  error = "Username is required."
31
33
  elif not password:
32
34
  error = "Password is required."
@@ -12,6 +12,7 @@ from pathlib import Path
12
12
  from threading import Event
13
13
 
14
14
  from flask import current_app
15
+ from rich.console import Console
15
16
 
16
17
  from .apps import DevelopmentApplication, LocalApplication, ProductionApplication
17
18
 
@@ -47,11 +48,14 @@ def parse_arguments():
47
48
  parser.add_argument(
48
49
  "--browser",
49
50
  action="store_true",
50
- help="a flag indicating if a new browswer window should be opened",
51
+ help=(
52
+ "a flag indicating if a new browser window should be opened (development "
53
+ "and local modes only)"
54
+ ),
51
55
  )
52
56
  parser.add_argument(
53
57
  "mode",
54
- help="the runtime mode for the app; defaults to `development`",
58
+ help="the runtime mode for the app",
55
59
  choices=["development", "local", "production"],
56
60
  )
57
61
  return parser.parse_args()
@@ -65,6 +69,7 @@ class Launcher:
65
69
  "local": LocalApplication,
66
70
  "production": ProductionApplication,
67
71
  }
72
+ _console = Console()
68
73
  _exit = Event()
69
74
  command = ["flask"]
70
75
 
@@ -77,15 +82,20 @@ class Launcher:
77
82
  def initialize_database(self):
78
83
  """Run the database initializer."""
79
84
  instruction = self.command + ["init-db"]
85
+ self._console.print("[deep_sky_blue1]Initializing the database...")
80
86
  subprocess.run(instruction)
87
+ print("\n")
81
88
 
82
89
  def backup_database(self):
83
90
  """Back up the app database."""
91
+ self._console.print("[deep_sky_blue1]Backing up the database...")
84
92
  instruction = self.command + ["back-up-db"]
85
93
  subprocess.run(instruction)
94
+ print("\n")
86
95
 
87
96
  def launch(self):
88
97
  """Launch the Monopyly application."""
98
+ self._console.print("[deep_sky_blue1]Running the Monopyly application...\n")
89
99
  self.app.run()
90
100
 
91
101
  def open_browser(self, delay=0):
@@ -10,6 +10,7 @@ class Config:
10
10
  """A base configuration object with some default settings."""
11
11
 
12
12
  config_filepaths = [DEFAULT_CONFIG_PATH]
13
+ REGISTRATION = True
13
14
 
14
15
  def __init__(self, db_path=None):
15
16
  # Read parameters from the configuration files in order of specificity
@@ -1,5 +1,4 @@
1
1
  """A module containing objects with various configuration settings."""
2
- import json
3
2
  import warnings
4
3
  from pathlib import Path
5
4
 
@@ -252,9 +252,9 @@ aside.sidebar {
252
252
 
253
253
  .screenshot {
254
254
  width: 100%; /* override the markdown default */
255
- margin: 20px 0;
255
+ margin: 20px 0;
256
256
  border: 1px solid #f3f3f3;
257
- box-shadow: 3px 3px 5px #bbbbbb;
257
+ box-shadow: 3px 3px 5px #bbbbbb;
258
258
  }
259
259
 
260
260
  .grouping {
@@ -1208,6 +1208,7 @@ form .autocomplete-box .item.active {
1208
1208
  .transactions-table .expanded .setting .date {
1209
1209
  display: flex;
1210
1210
  flex-direction: column;
1211
+ justify-content: center;
1211
1212
  align-items: center;
1212
1213
  flex: 2;
1213
1214
  padding-top: 3px;
@@ -11,7 +11,7 @@
11
11
 
12
12
  // Identify the card filters
13
13
  const $filterContainer = $('#card-filter');
14
-
14
+
15
15
  // Label inactive cards when they are hovered over
16
16
  const inactiveCardFilters = $filterContainer.find('.inactive.card');
17
17
  let defaultText;
@@ -31,7 +31,7 @@
31
31
  $this.text(defaultText);
32
32
  }
33
33
  );
34
-
34
+
35
35
  // Change the filter status on click
36
36
  const $filters = $filterContainer.find('.card');
37
37
  $filters.on('click', function() {
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Expand a transaction in a table when the plus icon is clicked.
3
+ *
4
+ * Expands a row in the transaction table when the plus icon offering
5
+ * more information is clicked. The expanded row shows transactions in
6
+ * more detail (and a larger font) than the rest of the transaction
7
+ * table. For both credit card and bank transactions, this expanded row
8
+ * shows subtransaction information.
9
+ */
10
+
11
+ import {
12
+ TransactionToggleManager, displaySubtransactions
13
+ } from './modules/expand-transaction.js';
14
+
15
+
16
+ (function() {
17
+ const toggleManager = new TransactionToggleManager(displaySubtransactions)
18
+ })();
@@ -0,0 +1,128 @@
1
+ /*
2
+ * Expand a transaction when the plus icon is clicked.
3
+ *
4
+ * Expands a row in the transaction table when the plus icon offering
5
+ * more information is clicked. The expanded row shows transactions in
6
+ * more detail (and a larger font) than the rest of the transaction
7
+ * table. A user can exit the expanded view by clicking the 'x' icon
8
+ * button that is shown in the expanded view. The 'toggleTransactionRow'
9
+ * function takes an optional callback function which is executed after
10
+ * the row is expanded. The callback function receives the selected
11
+ * '.transaction' element as its only argument.
12
+ */
13
+
14
+ import {
15
+ replaceDisplayContentsAjaxRequest
16
+ } from './update-display-ajax.js';
17
+
18
+
19
+ class TransactionToggleManager {
20
+ /**
21
+ * Create the object to toggle transactions.
22
+ *
23
+ * @param {function} callback - A callback function to execute when toggling
24
+ * a button to get more info.
25
+ */
26
+ constructor(callback = null) {
27
+ // Identify the plus/minus icons
28
+ this.$iconsMoreInfoButtons = $('.transaction .more.button');
29
+ this.$iconsLessInfoButtons = $('.transaction .less.button');
30
+ this.#registerClickExpand(callback);
31
+ this.#registerClickCollapse();
32
+ }
33
+
34
+ getButtonTransaction(button) {
35
+ return $(button).closest('.transaction');
36
+ }
37
+
38
+ #registerClickExpand(callback) {
39
+ const self = this;
40
+ this.$iconsMoreInfoButtons.on('click', function() {
41
+ const $transaction = self.getButtonTransaction(this);
42
+ const toggler = new TransactionToggler($transaction);
43
+ toggler.expand(callback);
44
+ });
45
+ }
46
+
47
+ #registerClickCollapse() {
48
+ const self = this;
49
+ this.$iconsLessInfoButtons.on('click', function() {
50
+ const $transaction = self.getButtonTransaction(this);
51
+ const toggler = new TransactionToggler($transaction);
52
+ toggler.collapse();
53
+ });
54
+ }
55
+ }
56
+
57
+
58
+ class TransactionToggler {
59
+
60
+ /**
61
+ * Create the handler.
62
+ *
63
+ * @param {Object} $transaction - The transaction to be toggled.
64
+ */
65
+ constructor($transaction) {
66
+ // Set timing variables
67
+ this.fadeTime = 200;
68
+ this.slideTime = 250;
69
+ // Identify elements of the row
70
+ this.$transaction = $transaction;
71
+ this.$extendedRow = $transaction.find('.expanded');
72
+ this.$condensedRow = $transaction.find('.condensed');
73
+ }
74
+
75
+ /**
76
+ * Expand the transaction
77
+ *
78
+ * @param {function} callback - A callback function to execute when expanding
79
+ * the transaction information. The callback function takes one argument,
80
+ * the JQuery object representing the transaction.
81
+ */
82
+ expand(callback = null) {
83
+ // Execute the callback function, if given
84
+ if (callback != null) {
85
+ callback(this.$transaction);
86
+ }
87
+ this.#toggleTransaction(this.$condensedRow, this.$extendedRow);
88
+ this.$transaction.addClass('selected');
89
+ }
90
+
91
+ collapse($transaction) {
92
+ this.#toggleTransaction(this.$extendedRow, this.$condensedRow);
93
+ this.$transaction.removeClass('selected');
94
+ }
95
+
96
+ #toggleTransaction($collapser, $expander) {
97
+ this.#hideSummaryRow($collapser);
98
+ this.#showSummaryRow($expander)
99
+ }
100
+
101
+ #hideSummaryRow($row) {
102
+ const self = this;
103
+ $row.fadeTo(self.fadeTime, 0, function() {
104
+ $(this).slideUp(self.slideTime);
105
+ });
106
+ }
107
+
108
+ #showSummaryRow($row) {
109
+ const self = this;
110
+ $row.delay(self.fadeTime).slideDown(self.slideTime, function() {
111
+ $(this).fadeTo(self.fadeTime, 1);
112
+ });
113
+ }
114
+ }
115
+
116
+
117
+ function displaySubtransactions($transaction) {
118
+
119
+ // Execute an AJAX request to get transaction/subtransaction information
120
+ const endpoint = EXPAND_TRANSACTION_ENDPOINT;
121
+ const rawData = $transaction.data("transaction-id");
122
+ const $container = $transaction.find('.subtransaction-container');
123
+ replaceDisplayContentsAjaxRequest(endpoint, rawData, $container);
124
+
125
+ }
126
+
127
+
128
+ export { TransactionToggleManager, displaySubtransactions };
@@ -11,14 +11,21 @@
11
11
  import { executeAjaxRequest } from './ajax.js';
12
12
 
13
13
 
14
- function replaceDisplayContentsAjaxRequest(endpoint, rawData, $display) {
15
-
16
- // The action is to replace the display's contents
17
- function action(response) {
18
- $display.html(response);
19
- }
20
- // Assign the response to the display object
21
- executeAjaxRequest(endpoint, rawData, action);
14
+ function replaceDisplayContentsAjaxRequest(
15
+ endpoint, rawData, $display, callback = null
16
+ ) {
17
+
18
+ // The action is to replace the display's contents
19
+ function action(response) {
20
+ $display.html(response);
21
+ // Execute the callback function, if given
22
+ if (callback != null) {
23
+ callback();
24
+ }
25
+ }
26
+
27
+ // Assign the response to the display object
28
+ executeAjaxRequest(endpoint, rawData, action);
22
29
 
23
30
  }
24
31
 
@@ -0,0 +1,73 @@
1
+ /*
2
+ * Update the table of credit card transactions.
3
+ *
4
+ * Update the credit card transaction table. The table update issues an
5
+ * Ajax request to the server to query the database based on the user's
6
+ * selection. The Ajax request is defined in its own function.
7
+ *
8
+ * Updates can be triggered by the following actions:
9
+ * - Changing the card filters: a user can click on any of the card
10
+ * filters to show or hide transactions from that card.
11
+ * - Sorting the table by transaction date: a user can click on the
12
+ * 'Date' column header to sort the transaction date in ascending
13
+ * or descending order.
14
+ */
15
+
16
+ import {
17
+ TransactionToggleManager, displaySubtransactions
18
+ } from './modules/expand-transaction.js';
19
+ import {
20
+ replaceDisplayContentsAjaxRequest
21
+ } from './modules/update-display-ajax.js';
22
+
23
+
24
+ (function() {
25
+
26
+ // Identify the card filters
27
+ const $filterContainer = $('#card-filter');
28
+ // Identify the transactions container
29
+ const $container = $('.transactions-container');
30
+
31
+ // Send the Ajax request on click
32
+ const $filters = $filterContainer.find('.card');
33
+ $filters.on('click', function() {
34
+ updateTable();
35
+ });
36
+
37
+ // Change the table ordering and send the Ajax request on click
38
+ $container.on('click', '.transactions-table .sort-button', function() {
39
+ // Identify the table sorters
40
+ const $sorters = $('.transactions-table .sort-button');
41
+ // Swap the sorter icons
42
+ $sorters.toggleClass('selected');
43
+ // Update the table
44
+ updateTable();
45
+ });
46
+
47
+ function updateTable() {
48
+ // Determine the selected credit cards to use from the filters
49
+ const $selectedFilters = $filterContainer.find('.card.selected');
50
+ const cardIDs = [];
51
+ $selectedFilters.each(function() {cardIDs.push(this.dataset.cardId);});
52
+ // Determine the table ordering (ascending/descending transaction date)
53
+ const $sorter = $('.transactions-table .sort-button.selected');
54
+ let sortOrder
55
+ if ($sorter.hasClass('asc')) {
56
+ sortOrder = 'asc';
57
+ } else {
58
+ sortOrder = 'desc';
59
+ }
60
+ // Update the table with the filters and ordering
61
+ const endpoint = FILTER_ENDPOINT;
62
+ const rawData = {
63
+ 'card_ids': cardIDs,
64
+ 'sort_order': sortOrder,
65
+ };
66
+
67
+ function callback() {
68
+ const toggleManager = new TransactionToggleManager(displaySubtransactions)
69
+ }
70
+ replaceDisplayContentsAjaxRequest(endpoint, rawData, $container, callback)
71
+ }
72
+
73
+ })();
@@ -9,7 +9,7 @@ authors = [
9
9
  ]
10
10
  description = 'A homemade personal finance manager.'
11
11
  license = { text = 'GNU GPLv3' }
12
- requires-python = '>=3.9,<3.11'
12
+ requires-python = '>=3.10,<3.11'
13
13
  dependencies = [
14
14
  'authanor>=1.0.2',
15
15
  'flask>=2.2.2',
@@ -44,7 +44,7 @@ monopyly = 'monopyly.cli.run:main'
44
44
 
45
45
  [project.urls]
46
46
  Download = 'https://pypi.org/project/monopyly'
47
- Homepage = 'https://github.com/mitchnegus/monopyly'
47
+ Homepage = 'http://monopyly.com'
48
48
  Repository = 'https://github.com/mitchnegus/monopyly'
49
49
  Changelog = 'https://github.com/mitchnegus/monopyly/blob/main/CHANGELOG.md'
50
50
 
@@ -1,32 +0,0 @@
1
- /*
2
- * Expand a transaction in a table when the plus icon is clicked.
3
- *
4
- * Expands a row in the transaction table when the plus icon offering
5
- * more information is clicked. The expanded row shows transactions in
6
- * more detail (and a larger font) than the rest of the transaction
7
- * table. For both credit card and bank transactions, this expanded row
8
- * shows subtransaction information.
9
- */
10
-
11
- import {
12
- replaceDisplayContentsAjaxRequest
13
- } from './modules/update-display-ajax.js';
14
- import { toggleTransactionRow } from './modules/expand-transaction.js';
15
-
16
-
17
- function displaySubtransactions($transaction) {
18
-
19
- // Execute an AJAX request to get transaction/subtransaction information
20
- const endpoint = EXPAND_TRANSACTION_ENDPOINT;
21
- const rawData = $transaction.data("transaction-id");
22
- const $container = $transaction.find('.subtransaction-container');
23
- replaceDisplayContentsAjaxRequest(endpoint, rawData, $container);
24
-
25
- }
26
-
27
-
28
- (function() {
29
-
30
- toggleTransactionRow(displaySubtransactions);
31
-
32
- })();
@@ -1,63 +0,0 @@
1
- /*
2
- * Expand a transaction when the plus icon is clicked.
3
- *
4
- * Expands a row in the transaction table when the plus icon offering
5
- * more information is clicked. The expanded row shows transactions in
6
- * more detail (and a larger font) than the rest of the transaction
7
- * table. A user can exit the expanded view by clicking the 'x' icon
8
- * button that is shown in the expanded view. The 'toggleTransactionRow'
9
- * function takes an optional callback function which is executed after
10
- * the row is expanded. The callback function receives the selected
11
- * '.transaction' element as its only argument.
12
- */
13
-
14
-
15
- function toggleTransactionRow(callback = null) {
16
-
17
- // Identify the plus/minus icons
18
- const $iconsMoreInfo = $('.transaction .more.button');
19
- const $iconsLessInfo = $('.transaction .less.button');
20
- // Set timing variables
21
- const fadeTime = 200;
22
- const slideTime = 250;
23
-
24
- $iconsMoreInfo.on('click', function() {
25
- // Get the transaction object
26
- const $transaction = $(this).closest('.transaction');
27
- // Hide the condensed transaction summary
28
- const $condensedRow = $transaction.find('.condensed');
29
- $condensedRow.fadeTo(fadeTime, 0, function() {
30
- $(this).slideUp(slideTime);
31
- });
32
- // Execute the callback function, if given
33
- if (callback != null) {
34
- callback($transaction);
35
- }
36
- $transaction.addClass('selected');
37
- // Show the expanded transaction summary
38
- const $expandedRow = $transaction.find('.expanded');
39
- $expandedRow.delay(fadeTime).slideDown(slideTime, function() {
40
- $(this).fadeTo(fadeTime, 1);
41
- });
42
- });
43
-
44
- $iconsLessInfo.on('click', function() {
45
- // Get the transaction object
46
- const $transaction = $(this).closest('.transaction');
47
- $transaction.removeClass('selected');
48
- // Hide the expanded transaction summary
49
- const $expandedRow = $transaction.find('.expanded');
50
- $expandedRow.fadeTo(fadeTime, 0, function() {
51
- $(this).slideUp(slideTime);
52
- })
53
- // Show the condensed transaction summary
54
- const $condensedRow = $transaction.find('.condensed');
55
- $condensedRow.slideDown(slideTime, function() {
56
- $(this).fadeTo(fadeTime, 1);
57
- });
58
- });
59
-
60
- }
61
-
62
-
63
- export { toggleTransactionRow };
@@ -1,66 +0,0 @@
1
- /*
2
- * Update the table of credit card transactions.
3
- *
4
- * Update the credit card transaction table. The table update issues an
5
- * Ajax request to the server to query the database based on the user's
6
- * selection. The Ajax request is defined in its own function.
7
- *
8
- * Updates can be triggered by the following actions:
9
- * - Changing the card filters: a user can click on any of the card
10
- * filters to show or hide transactions from that card.
11
- * - Sorting the table by transaction date: a user can click on the
12
- * 'Date' column header to sort the transaction date in ascending
13
- * or descending order.
14
- */
15
-
16
- import {
17
- replaceDisplayContentsAjaxRequest
18
- } from './modules/update-display-ajax.js';
19
-
20
-
21
- (function() {
22
-
23
- // Identify the card filters
24
- const $filterContainer = $('#card-filter');
25
- // Identify the transactions container
26
- const $container = $('.transactions-container');
27
-
28
- // Send the Ajax request on click
29
- const $filters = $filterContainer.find('.card');
30
- $filters.on('click', function() {
31
- updateTable();
32
- });
33
-
34
- // Change the table ordering and send the Ajax request on click
35
- $container.on('click', '.transactions-table .sort-button', function() {
36
- // Identify the table sorters
37
- const $sorters = $('.transactions-table .sort-button');
38
- // Swap the sorter icons
39
- $sorters.toggleClass('selected');
40
- // Update the table
41
- updateTable();
42
- });
43
-
44
- function updateTable() {
45
- // Determine the selected credit cards to use from the filters
46
- const $selectedFilters = $filterContainer.find('.card.selected');
47
- const cardIDs = [];
48
- $selectedFilters.each(function() {cardIDs.push(this.dataset.cardId);});
49
- // Determine the table ordering (ascending/descending transaction date)
50
- const $sorter = $('.transactions-table .sort-button.selected');
51
- let sortOrder
52
- if ($sorter.hasClass('asc')) {
53
- sortOrder = 'asc';
54
- } else {
55
- sortOrder = 'desc';
56
- }
57
- // Update the table with the filters and ordering
58
- const endpoint = FILTER_ENDPOINT;
59
- const rawData = {
60
- 'card_ids': cardIDs,
61
- 'sort_order': sortOrder,
62
- };
63
- replaceDisplayContentsAjaxRequest(endpoint, rawData, $container);
64
- }
65
-
66
- })();
File without changes
File without changes
File without changes
File without changes
File without changes