monopyly 1.4.6__py3-none-any.whl → 1.4.8__py3-none-any.whl

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 (51) hide show
  1. monopyly/CHANGELOG.md +195 -0
  2. monopyly/README.md +14 -3
  3. monopyly/__init__.py +20 -1
  4. monopyly/_version.py +2 -2
  5. monopyly/auth/actions.py +7 -2
  6. monopyly/banking/accounts.py +1 -1
  7. monopyly/banking/actions.py +51 -10
  8. monopyly/banking/routes.py +2 -1
  9. monopyly/cli/apps.py +51 -28
  10. monopyly/cli/{run.py → launch.py} +18 -10
  11. monopyly/common/forms/_forms.py +4 -1
  12. monopyly/core/actions.py +108 -21
  13. monopyly/core/blueprint.py +1 -1
  14. monopyly/core/context_processors.py +10 -0
  15. monopyly/core/errors.py +9 -0
  16. monopyly/core/filters.py +4 -2
  17. monopyly/core/routes.py +22 -9
  18. monopyly/credit/routes.py +9 -1
  19. monopyly/credit/transactions/_transactions.py +1 -1
  20. monopyly/static/css/style.css +166 -73
  21. monopyly/static/js/make-payment.js +4 -2
  22. monopyly/templates/banking/account_summaries.html +26 -12
  23. monopyly/templates/banking/account_summaries_page.html +2 -1
  24. monopyly/templates/banking/account_summary.html +7 -2
  25. monopyly/templates/banking/accounts_page.html +2 -2
  26. monopyly/templates/core/credits.html +32 -0
  27. monopyly/templates/core/errors/400.html +8 -0
  28. monopyly/templates/core/errors/401.html +8 -0
  29. monopyly/templates/core/errors/403.html +8 -0
  30. monopyly/templates/core/errors/404.html +8 -0
  31. monopyly/templates/core/errors/405.html +8 -0
  32. monopyly/templates/core/errors/408.html +8 -0
  33. monopyly/templates/core/errors/418.html +8 -0
  34. monopyly/templates/core/errors/425.html +8 -0
  35. monopyly/templates/core/errors/500.html +8 -0
  36. monopyly/templates/core/errors/error.html +31 -0
  37. monopyly/templates/{profile.html → core/profile.html} +3 -1
  38. monopyly/templates/core/story.html +62 -0
  39. monopyly/templates/credit/statement_summary.html +7 -2
  40. monopyly/templates/credit/statements.html +7 -6
  41. monopyly/templates/layout.html +11 -2
  42. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/METADATA +15 -4
  43. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/RECORD +48 -36
  44. monopyly-1.4.8.dist-info/entry_points.txt +2 -0
  45. monopyly/templates/credits.html +0 -20
  46. monopyly/templates/story.html +0 -47
  47. monopyly-1.4.6.dist-info/entry_points.txt +0 -2
  48. /monopyly/templates/{index.html → core/index.html} +0 -0
  49. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/WHEEL +0 -0
  50. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/licenses/COPYING +0 -0
  51. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>No cheating! You need to be authenticated to do that.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>No cheating! Looks like you don't have access to that.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>That page doesn't seem to exist. Maybe you need to read the instructions and try again?</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>No cheating! You're request used a method that's not allowed.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>Slow players are holding up the game, so this request timed out.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>...short and stout! I also have no idea how you got this error message.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>Not your turn! Wait a bit and try again.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>Someone (not saying who) messed up. Sorry about that.</p>
7
+
8
+ {% endblock %}
@@ -0,0 +1,31 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}
4
+ {{ exception.name }} ({{ exception.code }})
5
+ {% endblock %}
6
+
7
+ {% block header %}
8
+
9
+ <h1 class="error">
10
+ No dice!
11
+ <span class="code">
12
+ {{ exception.code }} Error: {{ exception.name }}
13
+ </span>
14
+ </h1>
15
+
16
+ {% endblock %}
17
+
18
+
19
+ {% block content %}
20
+
21
+ <div class="custom-error-content">
22
+ {% block custom_error_content %}
23
+ {% endblock %}
24
+
25
+ </div>
26
+
27
+ <div class="standard-error-content">
28
+ <p class="error-description">{{ exception.description }}</p>
29
+ </div>
30
+
31
+ {% endblock %}
@@ -25,7 +25,9 @@
25
25
  <div class=user-settings">
26
26
 
27
27
  <div class="password">
28
- <a style="color: gray;" href="">Change password (coming soon)</a>
28
+ <a style="color: gray;" href="{{ url_for('core.change_password') }}">
29
+ Change password (coming soon)
30
+ </a>
29
31
  </div>
30
32
 
31
33
  </div>
@@ -0,0 +1,62 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}
4
+ Story
5
+ {% endblock %}
6
+
7
+ {% block header %}
8
+ <h1>Pass go and collect $200</h1>
9
+ {% endblock %}
10
+
11
+ {% block content %}
12
+ <div id="story" class="about">
13
+ <p>
14
+ It started with Microsoft Excel.
15
+ </p>
16
+ <p>
17
+ When I got my first bank account, my dad taught me how to keep track of all my finances in an Excel workbook.
18
+ It worked for a while, and as I acquired a handful of credit cards, investments, and other types of bank accounts, I kept adding sheets to that file.
19
+ Of course, since I was tracking all that data, I wanted to wring as much information out of it as I possibly could—and so I started working rudimentary analytics into the spreadsheet.
20
+ </p>
21
+
22
+ <p>
23
+ This all kept me satisfied until about halfway through college when I began learning Python.
24
+ Excel was getting cumbersome, and I wanted to be able to sort and tag types of transactions, link credit card payments with bank withdrawals, and create spending reports.
25
+ Seeing the potential ways I could use a standalone programming language to up my game, I realized that what I really needed was a database.
26
+ As I transitioned to graduate school, I also transitioned to tracking my finances in a MySQL database, accessed with Python through a set of Jupyter notebooks.
27
+ That approach gave me so much more power and flexibilty, but it still felt a little clunky.
28
+ </p>
29
+
30
+ <p>
31
+ My ideal situation?
32
+ </p>
33
+
34
+ <p>
35
+ I ultimately wanted a system that keep track of everything—credit card transactions, bank accounts, investments, retirement accounts, all that $—in one place.
36
+ Obviously there are mega-apps that already do all this, but I never wanted to go that route.
37
+ I'd always managed my finances independently, and had zero interest in ceding that control.
38
+ For one, I wanted to maintain some privacy regarding my financial data, because who knows how those apps are using that information.
39
+ Two, I didn't want <em>all</em> the bells and whistles (and advertisements) that those mega-apps would force upon me, but I also wanted something I could customize when I didn't like a feature... or when I wanted more.
40
+ And three, most importantly, it seemed like a fun challenge that would keep me deeply engaged in managing my own financial picture.
41
+ </p>
42
+
43
+ <p>
44
+ That's how this app came about.
45
+ I started by trying to just create a GUI for my Python database interface, but that didn't offer the graphic flexibility of a web app.
46
+ Why fight to build a nice Tkinter GUI if I'd eventually get sick of that too?
47
+ (Tkinter is also a bit of a pain to code, and a bigger pain to test, and <em>that</em> certainly wouldn't do.)
48
+ Anyway, I'd always wanted to create an app, and I figured this was as good a chance as any to get started.
49
+ Win-win.
50
+ </p>
51
+
52
+ <p>
53
+ If you're reading this, I suppose it means you've stumbled across the program out of interest (or maybe you're just curious what the hell this nutjob is wasting his time on).
54
+ If the former, cool!
55
+ Feel free to look around or take it for a spin.
56
+ I intend to always keep the basic concept open source, so play around as much as you'd like!
57
+ </p>
58
+
59
+ <p class="signature">-Mitch</p>
60
+ </div>
61
+
62
+ {% endblock %}
@@ -9,8 +9,13 @@
9
9
  </div>
10
10
 
11
11
  <div class="balance">
12
- <div class="dollar-sign">$</div>
13
- <div>{{ statement.balance|currency }}</div>
12
+ {% with statement_balance = statement.balance|currency %}
13
+ {% set vbox_width = calculate_summary_balance_width(statement_balance) %}
14
+ <svg viewBox="0 0 {{ vbox_width }} 100">
15
+ <text x="0" y="75" fill="currentColor">$</text>
16
+ <text x="75" y="75" fill="currentColor">{{ statement_balance }}</text>
17
+ </svg>
18
+ {% endwith %}
14
19
  </div>
15
20
 
16
21
  <div id="payment">
@@ -1,15 +1,16 @@
1
1
  <div id="credit-statements">
2
2
 
3
- {% for card in card_statements %}
3
+ {% for card, statements in card_statements|items %}
4
4
 
5
- <div class="card-column grouping">
5
+ <div class="card-stack group-stack">
6
6
 
7
- <div>
8
- <b>{{ card.account.bank.bank_name }}</b> <span class="digits">{{ card.last_four_digits }}</span>
9
- </div>
7
+ <h2 class="stack-title">
8
+ {{ card.account.bank.bank_name }}
9
+ <span class="stack-title-info">{{ card.last_four_digits }}</span>
10
+ </h2>
10
11
 
11
12
  <div class="statement-blocks">
12
- {% for statement in card_statements[card] %}
13
+ {% for statement in statements %}
13
14
  {% if statement.balance is not none %}
14
15
 
15
16
  <a class="statement-block button-block" href="{{ url_for('credit.load_statement_details', statement_id=statement.id) }}">
@@ -43,7 +43,12 @@
43
43
  <div class="container">
44
44
 
45
45
  <a href="{{ url_for('core.index') }}">
46
- <h1 class="monopyly-logo">Monopyly</h1>
46
+ <h1 class="monopyly-logo">
47
+ Monopyly
48
+ {%- if config['DEBUG'] -%}
49
+ <span class="development-mode">.dev</span>
50
+ {%- endif -%}
51
+ </h1>
47
52
  </a>
48
53
 
49
54
  <nav id="nav-menu">
@@ -52,7 +57,11 @@
52
57
  <li><a href="{{ url_for('core.index') }}">Home</a></li>
53
58
  <li><a href="{{ url_for('core.about') }}">About</a></li>
54
59
  {% if g.user %}
55
- <li><a href="{{url_for('core.load_profile') }}" class="username">{{ g.user.username }}</a></li>
60
+ <li>
61
+ <a href="{{url_for('core.load_profile') }}" class="username">
62
+ {{ g.user.username }}
63
+ </a>
64
+ </li>
56
65
  <li><a href="{{ url_for('auth.logout') }}">Log Out</a></li>
57
66
  {% else %}
58
67
  <li><a href="{{ url_for('auth.register') }}">Register</a></li>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: monopyly
3
- Version: 1.4.6
3
+ Version: 1.4.8
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
@@ -58,17 +58,28 @@ To install the app, simply run
58
58
  $ pip install monopyly
59
59
  ```
60
60
 
61
- The package requires a recent version of Python (3.9+).
61
+ The package requires a recent version of Python (3.10+).
62
62
 
63
63
 
64
64
  ## Getting started
65
65
 
66
- Once the package is properly installed, run the app from the command line (the default options should be sensible, but you may customize the host and port if necessary):
66
+ Once the package is properly installed, run the app in local mode from the command line (the default options should be sensible, but you may customize the host and port if necessary):
67
67
 
68
68
  ```
69
- $ monopyly development --browser [--host HOST] [--port PORT]
69
+ $ monopyly local --browser [--host HOST] [--port PORT]
70
70
  ```
71
71
 
72
+ Local mode indicates that the app is just going to be run using a locally hosted server, accessible to just your machine.
73
+ Other available modes are `development` and `production`, for those looking to either develop the application or host the application on a server.
74
+
75
+ <div class="warning">
76
+ <h5>Use your brain when choosing a mode!</h5>
77
+ <small>
78
+ If you intend to be the only user of the app, served just from your PC, local mode is fine; you will be served well-enough by the built-in Python server, and you do not need to configure secret keys for the application.
79
+ If you plan to host the application, however, <b>DO NOT</b> use local mode (or development mode) and run the app in production mode instead.
80
+ </small>
81
+ </div>
82
+
72
83
  By using the `--browser` option in development mode, this will open to an empty homepage with a welcome message.
73
84
 
74
85
  <img class="screenshot" src="https://raw.githubusercontent.com/mitchnegus/monopyly/main/monopyly/static/img/about/homepage.png" alt="user homepage" width="800px">
@@ -1,52 +1,54 @@
1
- monopyly/README.md,sha256=T-Avdpr3whgP6g0P_w-u02CSwzBH2yRnleRrM1sKrj4,8281
2
- monopyly/__init__.py,sha256=YxMJAI5ig4-jlFyBGy4gOC_H5cp8a4L2sGmoX5bRYjU,1763
3
- monopyly/_version.py,sha256=rcHU37_iyVNYVuSTTj5Shc-mUDPpQw2cyeznRUHdnOc,160
4
- monopyly/auth/actions.py,sha256=T99eAP8dxFZMzLu2LxZFIXGYIroP8I7KJ-WJ8GJ1gws,260
1
+ monopyly/CHANGELOG.md,sha256=1IibmFq7TR7cIAVhFhCRKKQPdn9-bzBwmY5EhTsp2pA,7388
2
+ monopyly/README.md,sha256=cm1wli7E-xybYoJr-tsrNgfIO6TPrLsraMUSO26D6xk,9028
3
+ monopyly/__init__.py,sha256=1EYKyyHgORJ4Zh-3AB5R3AuLS0mqREwN1-iPDrZZUZs,2182
4
+ monopyly/_version.py,sha256=o7K855LfRl1a6KN9ryI52BaWntUGitBJboNncGT-QCk,160
5
+ monopyly/auth/actions.py,sha256=zFDb_EATufsJMzQ4rX0bzlme8e62mXFpYtQvc_k0jEc,375
5
6
  monopyly/auth/blueprint.py,sha256=sFbmTvSBhjv1pn2gJLH5J6zanPLuemmWbgEj5ZKCiTY,244
6
7
  monopyly/auth/routes.py,sha256=mODJHrdFhffusfbYwQ_wpIY7eAE7Gh7irosIef4Mluc,2902
7
8
  monopyly/auth/tools.py,sha256=hifCHBN06Ht-FnMhJPzzj-xjMN8uwbeJ-azRVjnT99c,801
8
- monopyly/banking/accounts.py,sha256=BYGqDISd5FszktDa1NW494ipcNgqI1Y03Gn07kBeiWE,9828
9
- monopyly/banking/actions.py,sha256=am8AlVWJGhrTvWNiAQPba-2guxdESmhzl6mIJhjAmlg,1565
9
+ monopyly/banking/accounts.py,sha256=yYlXvyhLBQoBZYr_WMk6_3nxlhwU4NEkCYKv5hHFjcM,9828
10
+ monopyly/banking/actions.py,sha256=NvButozWJNRuNIiyM-Gy88XLTpIjNcEGSQcLMfEwOUg,3258
10
11
  monopyly/banking/banks.py,sha256=X1seKJrec-o8z-bM0wVTR42vMx1q5A9Lf2jNUtINlrQ,1745
11
12
  monopyly/banking/blueprint.py,sha256=PDsqe4DmiT7cDYW9IxxTfizu9Lqol1Lhp7ajMK6fUuI,255
12
13
  monopyly/banking/filters.py,sha256=wCsAUh592B5BmGFC9NqmrJZ0NdQZi21hvy0QsKqhgLg,685
13
14
  monopyly/banking/forms.py,sha256=p-YGZgdKugk3VKILLiQNEH5KQmXop5G8P1Bs4sUqbK0,10506
14
- monopyly/banking/routes.py,sha256=BAV6PBQf20dSTxqY88Zh0FGAzpj7TxgZaHPxGCJneJ4,8149
15
+ monopyly/banking/routes.py,sha256=mykWVtV_4f096-NWDWE5aPYoBvGjeNpBSyY9Kb_nQGc,8232
15
16
  monopyly/banking/transactions.py,sha256=2_wFXl4ZrHzLoFGz72ksYA2_8UvB0N1wtBFd8kTwTyQ,8454
16
- monopyly/cli/apps.py,sha256=ufyKali-sLsUONuERoMTvSjbFzageShtG62JO0p9fIo,2689
17
- monopyly/cli/run.py,sha256=8NHv5TW5Ze6pyhxZCOjmba-EU4Nu6sObYfNJbDPtrds,3838
17
+ monopyly/cli/apps.py,sha256=v5l8eOvQddJc-Y3B3d-1xwSJcPMb-QyqbcGxZjlYczQ,3442
18
+ monopyly/cli/launch.py,sha256=UszkXSDh1SDEZNK2utLpnEK1rRPJ3iamNuulxxmyXLU,4000
18
19
  monopyly/common/transactions.py,sha256=2-EkctGC9k5W5kodXdYJIBXu5l5JNI9dxfgbp2Nxccg,12185
19
20
  monopyly/common/utils.py,sha256=BjXhfNXGWkAPt-ebldvmZ2z00P8MhKJzjxrJJ6mzRQY,5867
20
21
  monopyly/common/forms/__init__.py,sha256=6iFTlcoaQmCbrjS1KfFhWXQUfyqnA-vKPMVxLyJMlXY,120
21
- monopyly/common/forms/_forms.py,sha256=TjWEe62LQ3j-OQqzu0whz8CyhQVixhiHCqnMR_n7zmU,7814
22
+ monopyly/common/forms/_forms.py,sha256=Y2NrfPOdZaSyjo_ZPG8aK2KHhKg8wnWLSvrhSj1IoSQ,7885
22
23
  monopyly/common/forms/fields.py,sha256=XgvkfszpUAZyIs-osHGFADmzuo0Ni_e78NXtG-grBdI,4082
23
24
  monopyly/common/forms/utils.py,sha256=awZOtWaohzSW_SZrXhUpJBY1AXPnKBFTG2cqim22Db0,5676
24
25
  monopyly/common/forms/validators.py,sha256=C5_NN8ktvBw6MrSXwv_x9_SQohCNmnp4brNQFELHBlI,1205
25
26
  monopyly/config/__init__.py,sha256=pW2lHNhsdM2gRjLAWumnLUHZMAOEdprX4aXaONwo6AY,73
26
27
  monopyly/config/default_settings.py,sha256=jtWz4ElasnAbfBCiRfbsYyy--L6N6jTOGRh3PNWnVj4,1829
27
28
  monopyly/config/settings.py,sha256=YEctSb8mRDvuMA1tTs1N7862Z2bMY7DPf0xo4Ist2pg,1984
28
- monopyly/core/actions.py,sha256=M886J8DrxMfpessVPwigbkkUfUo7au1mj1La-BfFTkw,1220
29
- monopyly/core/blueprint.py,sha256=Kbl4M2Sdr4Sf2l9RPxCVFP6R_cBzYzdbIEG5ozUKGIc,252
30
- monopyly/core/context_processors.py,sha256=NZktwVLUUvE-Zv25ZqTAjIWGWx74Bda4LeZPcDTflsE,821
31
- monopyly/core/filters.py,sha256=9EQCHqLD3LEuyVkAE6_XCVjU1BezgAUsSWAS4PAzIb4,1253
29
+ monopyly/core/actions.py,sha256=jkrR5bBN1RG1S4Gtumnk51TkCNf4gfsUZkTi8LKHVHA,4172
30
+ monopyly/core/blueprint.py,sha256=pZyK8ly0UR1BbHx4xwYk1UzakzkVCS8wiMSM8XdCG2U,260
31
+ monopyly/core/context_processors.py,sha256=ByQGQpOJIpxG3WM3Kv34LbBY0H8HVeR81TDYkdOwJgs,1166
32
+ monopyly/core/errors.py,sha256=xF4gA3Hv99op3EMV_f2CskHWVLrV-9ckaHKJMWR2h7o,200
33
+ monopyly/core/filters.py,sha256=uBkNjQyqW-9RkiQG23vngnI1MZXFeh4Rhe5MQqklAEQ,1284
32
34
  monopyly/core/internal_transactions.py,sha256=PImeViMU9rdDDPLXld1xC6bdAoulzRDr0zci4pUQY8I,459
33
- monopyly/core/routes.py,sha256=BSeqMFu5XSm2MuMBDHwPAaOiLeMjO3KsFYm5RySzS8c,2427
35
+ monopyly/core/routes.py,sha256=ADF7LB3hhvwPwIqc5l46sliziM7ZgGXh5vFwKzxlkGA,2747
34
36
  monopyly/credit/accounts.py,sha256=otQmuTDJZYX868EZl80n89XlzfiwlnBkfSXZa65rSqI,1898
35
37
  monopyly/credit/actions.py,sha256=E80ocYxWKsNO1ynU3KQjVZkTwAGo4Fv7mYPmA68T9ng,6310
36
38
  monopyly/credit/blueprint.py,sha256=XbrMhtyCp2732uWPB2kjn_W8P8pH8RVTwo9P8Pt--Is,251
37
39
  monopyly/credit/cards.py,sha256=9Ug51aY2-G8SzooLC-FemRNeTBLd9JOpXHFW74EcdLU,5614
38
40
  monopyly/credit/forms.py,sha256=-Oj7NxmDKNY39McbtqSC-v_Tppec0BfDZmeUnbnugCo,12250
39
- monopyly/credit/routes.py,sha256=XIVuf6WEbwlDkNPi1RSyCxSgS3JbobikINBQpYb1r44,17794
41
+ monopyly/credit/routes.py,sha256=zw3if37eHibdh4VwbgpxHUPt_UrF-n8fAxZe3Tn1WWI,18127
40
42
  monopyly/credit/statements.py,sha256=lRcAgcr9kPnh5GCE6McWfOdY8uCgmg2j2bikSioR3HI,7219
41
43
  monopyly/credit/transactions/__init__.py,sha256=1Exn6T--HtwNCHzS_hDJ0ba7qCB7w_8C-yY3KSxvFKg,165
42
- monopyly/credit/transactions/_transactions.py,sha256=LqbZV1Q2bb_B6tATmBihCPm8YhcbABRUCCYhNRg9qtk,8771
44
+ monopyly/credit/transactions/_transactions.py,sha256=Ciw5ORScBwhhUBVFsGNOR4uy-X_KF3tVsyfKRVQHMOE,8771
43
45
  monopyly/database/__init__.py,sha256=tlZsXmzH8hB5m_RASbKTjPRqLel-xbymqrzo0TPoFCk,3402
44
46
  monopyly/database/models.py,sha256=TqIwIe4tVv3TS0azz8Bm9nL1qT2RAyq292myPW0XH1A,15095
45
47
  monopyly/database/preloads.sql,sha256=KBS_WYRofFdOVN-IgHzZhfyJrY6ZOwHeExN-fQr3htU,363
46
48
  monopyly/database/schema.sql,sha256=cdl9b5CnYrnQ-lck147GtwArx_JJbX1vF9YYLivTeyw,4660
47
49
  monopyly/database/views.sql,sha256=UTO2QRkVTfQ12bMVkR-O6Qv80DvYo8hngPHn2A1_1F8,3853
48
50
  monopyly/static/jquery-3.7.0.min.js,sha256=2Pmvv0kuTBOenSvLm6bvfBSSHrUJ-3A7x6P5Ebd07_g,87462
49
- monopyly/static/css/style.css,sha256=cBa9cFhr--fBgx7TaeegXLleUAGO2ui9TLSXmo5Sc7k,48930
51
+ monopyly/static/css/style.css,sha256=cmehDMaKF9uJB6ZjAcq81C3SnQx3sJxMUeDbWbl1gRI,50703
50
52
  monopyly/static/favicon/browserconfig.xml,sha256=Zt_AVOxiritWWXoUwPsHpx4vu4kM_butdFVzoYCYbM8,315
51
53
  monopyly/static/favicon/favicon-114.png,sha256=kjElVFiix-kFCMdADkLpJsi8kL3GDsFm85oJhyCH-C0,20601
52
54
  monopyly/static/favicon/favicon-120.png,sha256=g4uzHMdW0MlJhcgWfrOsj2MB2D-HdLa4t60_hvyICkM,22077
@@ -119,7 +121,7 @@ monopyly/static/js/flip-card.js,sha256=4a65JFO7kf4qzZ-8wvWiiO_BwZpiWO2cHHzZugXRo
119
121
  monopyly/static/js/hide-homepage-block.js,sha256=Yw3m5sc5dO6pDh2VUzJu1re4NXZcuSLSMs6Acou_rHo,495
120
122
  monopyly/static/js/infer-card.js,sha256=WIDXWhfF4gXdlRCo2OA0IpSsszxDTkV7ZSb6Qo7pheA,1790
121
123
  monopyly/static/js/infer-statement.js,sha256=ufcYJ2z6halVXpiZHviI_4JN48jOBAM4NbSDtWH9BoU,1896
122
- monopyly/static/js/make-payment.js,sha256=4Ins1Mk06rRG6yjtPfRdUZNTRCUD-Yc7l3QPS2qhT_8,3139
124
+ monopyly/static/js/make-payment.js,sha256=fvCSHrsUuRFJ299icIklEch8SQLnYL2cfcTwkW4fzw4,3276
123
125
  monopyly/static/js/show-linked-transaction.js,sha256=AM7d2PISUMbS2UcSNZQuW8n24pcDG0hD8BjFjAyWUOk,1085
124
126
  monopyly/static/js/update-account-statement-parameters.js,sha256=1mjC-9yIwbm-xYz9AKkxfKWv70UftqyieJrMkSMb1qU,1072
125
127
  monopyly/static/js/update-bank-name.js,sha256=4nEkCTEK32y9v7WAgjQymKFxM_HTFRwdfGkmEwtdWoE,925
@@ -136,18 +138,14 @@ monopyly/static/js/modules/manage-overlays.js,sha256=gCE1qTT_0RG6a5OX9PrFOc-KLmq
136
138
  monopyly/static/js/modules/manage-subforms.js,sha256=-yKA7l8ZI0294auTI307LrKkw_Bl6I8suwK4VLuLhMc,2197
137
139
  monopyly/static/js/modules/update-database-widget.js,sha256=S67hmqaGwzbPy94IjYrag0ZPOur4r5y_tb3_5t7xuYI,1581
138
140
  monopyly/static/js/modules/update-display-ajax.js,sha256=MJBiRMmeIHRG7lLbqIcXkUecKNNMFFVJXwhs_N8LKl0,878
139
- monopyly/templates/credits.html,sha256=U2lOe7XrW1Rt9DCvo7pRxHDzRzBnYxHjX3cS5z36NI8,506
140
- monopyly/templates/index.html,sha256=caoQuizzJibU90nivf1-Esnptg5wzFWyhVJoAkEPKdE,4374
141
- monopyly/templates/layout.html,sha256=ETQ7fNC4H0JjZZTnamZoJKwXbsXEHW72ZhahOER3NkQ,4741
142
- monopyly/templates/profile.html,sha256=qFU1lu5lbzC6p36OCcZGgRHcygmSqPpXDTLxaRDnLXU,2291
143
- monopyly/templates/story.html,sha256=fUvIE8t5oG_Mw443Oeu4vWKospFQv8dSfBOCisn5L0g,3207
141
+ monopyly/templates/layout.html,sha256=AOlElsehSKBKnejYWZfn33jA04lGrViP_NcNF24vI7U,4955
144
142
  monopyly/templates/auth/login.html,sha256=aZwaHBiKtQa_ZkVBqLUQIbwQdEAJNwcyYNjFQcRp-k0,443
145
143
  monopyly/templates/auth/register.html,sha256=G6VxfYPIbXQco6Z_1PVQQ40vNWgG3PScmN20npx88yQ,447
146
144
  monopyly/templates/banking/account_page.html,sha256=pP7j6pRngqO8D_kQKbRINTQ61L5VJs66dsNPscO0czs,1946
147
- monopyly/templates/banking/account_summaries.html,sha256=h_grH5xF94Um8F2a8Ag1I9_bwstr7e6Lpx4Ak5ISeiQ,647
148
- monopyly/templates/banking/account_summaries_page.html,sha256=LuAAjd8U0LDxgJoBKAtVUw-b6KGni0Osre8O3gN17fY,1086
149
- monopyly/templates/banking/account_summary.html,sha256=6Ol5SdO5BC7Ptr2-M9WZPvWOeHRESrVjbieKTmA-3SE,675
150
- monopyly/templates/banking/accounts_page.html,sha256=JYI0cfaK6lxF-aDsYQLQkfEkx9xWdgAfW1xYbZRQmGs,2149
145
+ monopyly/templates/banking/account_summaries.html,sha256=IyokKcbv76a9_wDfX4MlSdwa2Xluav-TDc_MXnBOMv0,1125
146
+ monopyly/templates/banking/account_summaries_page.html,sha256=puBlB52WMZR_Dhz6_rSLomNa9QSChsItsshrKT5Aixs,1113
147
+ monopyly/templates/banking/account_summary.html,sha256=pE5DyrLP2MYewsECpP0iVusTlIunWe4tiLjSwGMV9uA,939
148
+ monopyly/templates/banking/accounts_page.html,sha256=iPv_s7rdEINBG1c_XwN7YgHjIDXnl64-JkPpKuIAeXc,2172
151
149
  monopyly/templates/banking/account_form/account_form.html,sha256=v8AH6DTBW-4XVffcmr-sRRBl1k0e-30Q7Vy5sXHkrPM,1226
152
150
  monopyly/templates/banking/account_form/account_form_page_new.html,sha256=aCahQlbJfIM_vzvHJb81dG_ORpXFmOw5QzYFNep7LxY,533
153
151
  monopyly/templates/banking/transaction_form/bank_info_form.html,sha256=RkEjEgbD5zw4QlvpJ6koA8TxE0ZRTGmfmCy8SC2RVd0,670
@@ -171,13 +169,27 @@ monopyly/templates/common/transactions_table/subtransactions.html,sha256=6vf9M2j
171
169
  monopyly/templates/common/transactions_table/transaction_condensed.html,sha256=2MR4WPdkc28OACOqwCszFtXodxnIvfKIF_rh2OzJqh8,300
172
170
  monopyly/templates/common/transactions_table/transaction_expanded.html,sha256=xNn7hJs3ulQIroTbXGfxPSrlZCmqr2QhtEzqS3URmVg,1242
173
171
  monopyly/templates/common/transactions_table/transactions.html,sha256=pwJxOPZgU7m3juZd4rxhKvsZmvtjsdS-eLDgbSOllEQ,527
172
+ monopyly/templates/core/credits.html,sha256=uXkDl6XwsZAu1weONQQlf1WiBUZDiTHqsZLkvu6JAXU,948
173
+ monopyly/templates/core/index.html,sha256=caoQuizzJibU90nivf1-Esnptg5wzFWyhVJoAkEPKdE,4374
174
+ monopyly/templates/core/profile.html,sha256=88DgHlnSAZ9V4pAJmo_kPpRRY_1vhwcrYLxS5hZJDxM,2356
175
+ monopyly/templates/core/story.html,sha256=iEKfX1aHxXrstAeeQ6J8Gnvg1zGt95c-iLELUhG-AtE,3331
176
+ monopyly/templates/core/errors/400.html,sha256=whUYO3b6UIQWfN8y563umccU8GLxqXu0A5nb5uNM-XY,152
177
+ monopyly/templates/core/errors/401.html,sha256=3HH9TSDZfhyxZVcVnT0PNe524ADvEHIj6BsllQYFFOQ,154
178
+ monopyly/templates/core/errors/403.html,sha256=SSJsDIKFFKqap5RR4oM7IsvWY6dsgfZVPPKPSpB2d6A,155
179
+ monopyly/templates/core/errors/404.html,sha256=VStDPWwMJFet8pSTvi5KY5sbLiPjzMa1QJ4kkbRPn-Y,188
180
+ monopyly/templates/core/errors/405.html,sha256=dTthfzWekYzvbOfTUkAr0yCTK9Ufa194PIYpCZNc7kQ,162
181
+ monopyly/templates/core/errors/408.html,sha256=QlhJ7S5wiFJLCQMtrn4o3ScYHAEoHfby24OsK-D_d70,165
182
+ monopyly/templates/core/errors/418.html,sha256=zfs-NbLsfQpx_ZhS6O81LjXZgO0UKnxkuG6soFucbuw,172
183
+ monopyly/templates/core/errors/425.html,sha256=9U-tIDbS6BKCTqMzokCrXcmPlKn5OcFL8z5ffz19LWg,141
184
+ monopyly/templates/core/errors/500.html,sha256=kSrvsTb1ueDst7m10hYuWmbPJ_ep6aaL3ujhBPmVl-g,154
185
+ monopyly/templates/core/errors/error.html,sha256=QBATauzceuPQAW3wDjjhw_8PkrRLbM5DeG4hEf09vQk,534
174
186
  monopyly/templates/credit/account_page.html,sha256=HxQzRfEejFXjmZwtZD-EdHipQ7zOedKlpxwfAOMM49w,3618
175
187
  monopyly/templates/credit/card_submission_page.html,sha256=7OU6PB01jACSKSzXGySWL8ccwfCT00SeX2KkdwW3K4Q,345
176
188
  monopyly/templates/credit/cards.html,sha256=lvuKip2nHDmPi2Wj8zmO9ZXKXY22Dlv9fDrtHuYCSqA,598
177
189
  monopyly/templates/credit/cards_page.html,sha256=HTrTQwF-Y5Z9oWqt72i6HbAaRhQibTEt3TJKavm6_2M,250
178
190
  monopyly/templates/credit/statement_page.html,sha256=vYuahNkkF4M2pWAJaaraIZq70EmMgpvAJcUMF1Pzhko,2009
179
- monopyly/templates/credit/statement_summary.html,sha256=V8J6QbO2K6VW8HiePWQbfo19vC4jPdUv9dRTBjiJ9nk,2623
180
- monopyly/templates/credit/statements.html,sha256=2A65crmxXMwW7FQdJEYuBv32QJ8T9lF1jayKzmJX2zA,1731
191
+ monopyly/templates/credit/statement_summary.html,sha256=RGwgkolnD8690OwSUgklP4Wc_dfvVrHyrv1VqpCv_iE,2893
192
+ monopyly/templates/credit/statements.html,sha256=Je3V7td2xubug4uFT0D8YUKbeEvk2yA9_Z0f7mystTU,1769
181
193
  monopyly/templates/credit/statements_page.html,sha256=s_CSiRO8iTcCoEPVRF2TEOG2XNOeuGF1BSiJGhrH5O0,1458
182
194
  monopyly/templates/credit/tags_page.html,sha256=mKm-QxuicO5MO12JOQy7tuc8Bd9fnnKiTSHDmMP5mTI,662
183
195
  monopyly/templates/credit/transaction_submission_page.html,sha256=eR9v76wlLQ7Skeb-2L-rIKTSRQGCXjTGTO7efgwn_6M,1919
@@ -197,9 +209,9 @@ monopyly/templates/credit/transactions_table/condensed_row_content.html,sha256=T
197
209
  monopyly/templates/credit/transactions_table/expanded_row_content.html,sha256=oL1BqlEC3H6s3fSI9Vb65DLL-P9OPliPqqiGL4av4Xs,1971
198
210
  monopyly/templates/credit/transactions_table/transaction_field_titles.html,sha256=km-3YEDJaygwcKV-rwYnrE7xF8u4Z7jCBsk0Ia-LO-M,758
199
211
  monopyly/templates/credit/transactions_table/transactions.html,sha256=tcppv0qNV-Qq6U5jfxoNyGKPXmyV9h9nR6rw4jXfBsY,481
200
- monopyly-1.4.6.dist-info/METADATA,sha256=0GNEa8OFRutu8kofK7ykznrD9cEBpfxmUOdkyjyRjD4,10206
201
- monopyly-1.4.6.dist-info/WHEEL,sha256=Fd6mP6ydyRguakwUJ05oBE7fh2IPxgtDN9IwHJ9OqJQ,87
202
- monopyly-1.4.6.dist-info/entry_points.txt,sha256=ANAwWNF6IG83opRITM2P9i_im_b6qLdG1n7dAcS2ZNU,51
203
- monopyly-1.4.6.dist-info/licenses/COPYING,sha256=5X8cMguM-HmKfS_4Om-eBqM6A1hfbgZf6pfx2G24QFI,35150
204
- monopyly-1.4.6.dist-info/licenses/LICENSE,sha256=94rIicMccmTPhqXiRLV9JsU8P2ocMuEUUtUpp6LPKiE,253
205
- monopyly-1.4.6.dist-info/RECORD,,
212
+ monopyly-1.4.8.dist-info/METADATA,sha256=y9TCCzprVzIUZ1OEGpkqQk9issz0EzhDKbaoM8xCT04,10953
213
+ monopyly-1.4.8.dist-info/WHEEL,sha256=Fd6mP6ydyRguakwUJ05oBE7fh2IPxgtDN9IwHJ9OqJQ,87
214
+ monopyly-1.4.8.dist-info/entry_points.txt,sha256=_GmCja7NEqYHlGlVbz4rThqk0SIOmFUkiE8mN1dwgdY,58
215
+ monopyly-1.4.8.dist-info/licenses/COPYING,sha256=5X8cMguM-HmKfS_4Om-eBqM6A1hfbgZf6pfx2G24QFI,35150
216
+ monopyly-1.4.8.dist-info/licenses/LICENSE,sha256=94rIicMccmTPhqXiRLV9JsU8P2ocMuEUUtUpp6LPKiE,253
217
+ monopyly-1.4.8.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ monopyly = monopyly.cli.launch:main_cli
@@ -1,20 +0,0 @@
1
- {% extends "layout.html" %}
2
-
3
- {% block title %}
4
- Credits
5
- {% endblock %}
6
-
7
- {% block header %}
8
- <h1>Credits</h1>
9
- {% endblock %}
10
-
11
- {% block content %}
12
-
13
- <h3>Image Credits</h3>
14
-
15
- <p>
16
- The chain link icon was adapted from <a href="https://commons.wikimedia.org/wiki/File:Chain_link_icon.png">Wikipedia Commons</a>.
17
- The original image was created by user Mdowdell and published under the <a href="https://creativecommons.org/licenses/by-sa/3.0/legalcode">CC BY-SA 3.0 License</a>.
18
- </p>
19
-
20
- {% endblock %}
@@ -1,47 +0,0 @@
1
- {% extends "layout.html" %}
2
-
3
- {% block title %}
4
- Story
5
- {% endblock %}
6
-
7
- {% block header %}
8
- <h1>Pass go and collect $200</h1>
9
- {% endblock %}
10
-
11
- {% block content %}
12
- <div id="story" class="about">
13
- <p>It started with Microsoft Excel. </p>
14
- <p>When I got my first bank account, my dad taught me how to keep track of all my finances in an Excel workbook.
15
- It worked for a while, and as I acquired a handful of credit cards, investments, and other types of bank accounts, I kept adding sheets to that file.
16
- Of course, since I was tracking all that data, I wanted to wring as much information out of it as I possibly could—and so I started working rudimentary analytics into the spreadsheet.
17
- </p>
18
-
19
- </p>
20
- This all kept me satisfied until about halfway through college when I began learning Python.
21
- Excel was getting cumbersome, and I wanted to be able to sort and tag types of transactions, link credit card payments with bank withdrawals, and create spending reports.
22
- Seeing the potential ways I could use a standalone programming language to up my game, I realized that what I really needed was a database.
23
- As I transitioned to graduate school, I also transitioned to tracking my finances in a MySQL database, accessed with Python through a set of Jupyter notebooks.
24
- That approach gave me so much more power and flexibilty, but it still felt a little clunky.</p>
25
-
26
- <p>My ideal situation?</p>
27
-
28
- <p>I ultimately wanted a system that keep track of everything—credit card transactions, bank accounts, investments, retirement accounts, all that $—in one place.
29
- Obviously there are mega-apps that already do all this, but I never wanted to go that route.
30
- I'd always managed my finances independently, and had zero interest in ceding that control.
31
- For one, I wanted to maintain some privacy regarding my financial data, because who knows how those apps are using that information.
32
- Two, I didn't want <em>all</em> the bells and whistles (and advertisements) that those mega-apps would force upon me, but I also wanted something I could customize when I didn't like a feature... or when I wanted more.
33
- And three, most importantly, it seemed like a fun challenge that would keep me deeply engaged in managing my own financial picture.
34
-
35
- <p>That's how this app came about.
36
- I started by trying to just create a GUI for my Python database interface, but that didn't offer the graphic flexibility of a web app.
37
- Why fight to build a nice Tkinter GUI if I'd eventually get sick of that too?
38
- (Tkinter is also a bit of a pain to code, and a bigger pain to test, and <em>that</em> certainly wouldn't do.)
39
- Anyway, I'd always wanted to create an app, and I figured this was as good a chance as any to get started.
40
- Win-win.</p>
41
-
42
- <p>If you're reading this, I suppose it means you've stumbled across the program out of interest (or maybe you're just curious what the hell this nutjob is wasting his time on). If the former, cool! Feel free to look around or take it for a spin. I intend to always keep the basic concept open source, so play around as much as you'd like!</p>
43
-
44
- <p class="signature">-Mitch</p>
45
- </div>
46
-
47
- {% endblock %}
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- monopyly = monopyly.cli.run:main
File without changes