Skip to content

Commit bc59138

Browse files
Merge branch 'main' into feature/3-payment-billing
Resolve conflicts: keep stripe dep in pyproject.toml, combine Stripe test env with main's CSRF browser fixtures, adopt main's utc_naive helpers. Co-authored-by: Cursor <cursoragent@cursor.com>
2 parents cf9cca9 + 85b5fe9 commit bc59138

32 files changed

Lines changed: 2138 additions & 164 deletions

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
<!-- version list -->
99

10+
## v1.1.7 (2026-07-06)
11+
12+
### Bug Fixes
13+
14+
- Address PR review nits for frontend test suite
15+
([`4659d3b`](https://github.com/Promptly-Technologies-LLC/fastapi-jinja2-postgres-webapp/commit/4659d3b427b6f865ea87046d080b97e3a63042dd))
16+
17+
1018
## v1.1.6 (2026-07-02)
1119

1220
### Bug Fixes

pyproject.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "fastapi-jinja2-postgres-webapp"
3-
version = "1.1.6"
3+
version = "1.1.7"
44
description = "A template webapp with a pure-Python FastAPI backend, frontend templating with Jinja2, and a Postgres database to power user auth"
55
readme = "README.md"
66
package-mode = false
@@ -41,7 +41,7 @@ dev = [
4141
]
4242

4343
[tool.ruff.lint.per-file-ignores]
44-
# load_dotenv() runs before app import in tests/conftest.py
44+
# pytest_plugins must be declared before plugin imports in conftest.
4545
"tests/conftest.py" = ["E402"]
4646

4747
[tool.ty.rules]
@@ -126,3 +126,10 @@ insecure = false
126126
[tool.semantic_release.publish]
127127
dist_glob_patterns = []
128128
upload_to_vcs_release = false
129+
130+
[tool.pytest-jinja-check]
131+
app = "main:app"
132+
python_dir = "."
133+
template_dir = "templates"
134+
route_file_patterns = ["main.py", "routers/**/*.py"]
135+
auto_check = false

static/css/extras.css

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,68 @@ input:invalid:not(:placeholder-shown) + .invalid-feedback {
434434
}
435435
}
436436

437+
/* Site footer: align horizontal padding with navbar; spread copyright and contact. */
438+
.site-footer-inner {
439+
padding-inline: 1.25rem;
440+
}
441+
442+
.site-footer-row {
443+
display: grid;
444+
gap: 1.25rem;
445+
text-align: center;
446+
}
447+
448+
.site-footer-copyright,
449+
.site-footer-links,
450+
.site-footer-contact {
451+
min-width: 0;
452+
}
453+
454+
.site-footer-heading {
455+
font-family: var(--font-display);
456+
font-weight: 600;
457+
font-size: 1rem;
458+
line-height: 1.15;
459+
letter-spacing: -0.015em;
460+
color: var(--muted);
461+
margin: 0 0 0.5rem;
462+
}
463+
464+
.site-footer-body,
465+
.site-footer-body a {
466+
font-family: var(--font-body);
467+
font-size: 1rem;
468+
line-height: 1.55;
469+
color: var(--muted);
470+
}
471+
472+
.site-footer-body a:hover {
473+
color: var(--primary);
474+
}
475+
476+
@media (min-width: 992px) {
477+
.site-footer-row {
478+
grid-template-columns: 1fr auto 1fr;
479+
align-items: end;
480+
gap: 2rem;
481+
}
482+
483+
.site-footer-copyright {
484+
justify-self: start;
485+
text-align: start;
486+
}
487+
488+
.site-footer-links {
489+
justify-self: center;
490+
text-align: center;
491+
}
492+
493+
.site-footer-contact {
494+
justify-self: end;
495+
text-align: end;
496+
}
497+
}
498+
437499
/* Pending invitations in organization members card. */
438500
.invitation-list-item-body {
439501
display: flex;
Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
1-
<footer class="bg-light py-4 mt-auto">
2-
<div class="container">
3-
<div class="row">
4-
<!-- Copyright Information -->
5-
<div class="col-md-4 text-center text-md-start mb-3 mb-md-0 d-flex flex-column justify-content-end">
6-
<p class="mb-0">Created by Promptly Technologies, LLC and released under the <a href="https://opensource.org/license/mit">MIT License</a>.</p>
7-
</div>
1+
<footer class="site-footer bg-light py-4 mt-auto">
2+
<div class="container-fluid site-footer-inner">
3+
<div class="site-footer-row">
4+
<div class="site-footer-copyright">
5+
<p class="site-footer-body mb-0">
6+
Created by <a href="https://promptlytechnologies.com/">Promptly Technologies, LLC</a><br>
7+
and released under the
8+
<a href="https://opensource.org/license/mit">MIT License</a>.
9+
</p>
10+
</div>
811

9-
<!-- Quick Links -->
10-
<div class="col-md-4 text-center mb-3 mb-md-0">
11-
<h5 class="text-muted mb-2">Quick Links</h5>
12-
<ul class="list-inline mb-0">
13-
<li class="list-inline-item"><a href="{{ url_for('read_static_page', page_name='about') }}" class="text-muted">About</a></li>
14-
<li class="list-inline-item"><a href="{{ url_for('read_static_page', page_name='privacy-policy') }}" class="text-muted">Privacy Policy</a></li>
15-
<li class="list-inline-item"><a href="{{ url_for('read_static_page', page_name='terms-of-service') }}" class="text-muted">Terms of Service</a></li>
16-
</ul>
17-
</div>
12+
<div class="site-footer-links">
13+
<h5 class="site-footer-heading mb-2">Quick Links</h5>
14+
<ul class="list-inline site-footer-body mb-0">
15+
<li class="list-inline-item">
16+
<a href="{{ url_for('read_static_page', page_name='about') }}">About</a>
17+
</li>
18+
<li class="list-inline-item">
19+
<a href="{{ url_for('read_static_page', page_name='privacy-policy') }}">Privacy Policy</a>
20+
</li>
21+
<li class="list-inline-item">
22+
<a href="{{ url_for('read_static_page', page_name='terms-of-service') }}">Terms of Service</a>
23+
</li>
24+
</ul>
25+
</div>
1826

19-
<!-- Contact Information -->
20-
<div class="col-md-4 text-center text-md-end">
21-
<h5 class="text-muted mb-2">Contact Us</h5>
22-
<p class="mb-0">
23-
<a href="mailto:support@promptlytechnologies.com" class="text-muted">support@promptlytechnologies.com</a>
24-
</p>
25-
</div>
27+
<div class="site-footer-contact">
28+
<h5 class="site-footer-heading mb-2">Contact Us</h5>
29+
<p class="site-footer-body mb-0">
30+
<a href="mailto:support@promptlytechnologies.com">support@promptlytechnologies.com</a>
31+
</p>
2632
</div>
33+
</div>
2734
</div>
28-
</footer>
35+
</footer>

templates/users/macros/organizations.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
<!-- New Organization Form -->
1212
<div class="collapse mb-3" id="newOrgForm">
1313
<form action="{{ url_for('create_organization') }}" method="post" class="border rounded p-3 bg-light">
14-
{% include 'base/partials/csrf_field.html' %}
15-
{% include 'base/partials/csrf_field.html' %}
14+
{% include 'base/partials/csrf_field.html' %}
1615
<div class="mb-3">
1716
<label for="name" class="form-label">Organization Name</label>
1817
<input type="text"

templates/users/profile.html

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ <h1 class="mb-4">User Profile</h1>
9696
<div class="card-body">
9797
{% if show_form %}
9898
<form action="{{ url_for('forgot_password') }}" method="post">
99-
{% include 'base/partials/csrf_field.html' %}
100-
{% include 'base/partials/csrf_field.html' %}
99+
{% include 'base/partials/csrf_field.html' %}
101100
<input type="hidden" name="email" value="{{ user.account.email }}">
102101
<p>To change your password, please confirm your email. A password reset link will be sent to your email address.</p>
103102
<button type="submit" class="btn btn-primary">Send Password Reset Email</button>
@@ -118,8 +117,7 @@ <h1 class="mb-4">User Profile</h1>
118117
</div>
119118
<div class="card-body">
120119
<form action="{{ url_for('delete_account') }}" method="post">
121-
{% include 'base/partials/csrf_field.html' %}
122-
{% include 'base/partials/csrf_field.html' %}
120+
{% include 'base/partials/csrf_field.html' %}
123121
<p class="text-danger">This action cannot be undone. Please confirm your email and password to delete your account.</p>
124122
<div class="mb-3">
125123
<label for="delete_email" class="form-label">Email</label>

0 commit comments

Comments
 (0)