Membership and mailing list

This commit is contained in:
2026-10-23 13:25:45 -04:00
parent faf6c5f2b3
commit 0692ec0b54
8 changed files with 6 additions and 20 deletions
@@ -24,4 +24,4 @@ class Migration(migrations.Migration):
("created_at", models.DateTimeField(auto_now_add=True)),
("account", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="members.account")),
], options={"constraints": [models.UniqueConstraint(condition=models.Q(credited_at__isnull=True), fields=("account",), name="one_uncredited_crypto_invoice")]}),
]
]
+1 -1
View File
@@ -149,4 +149,4 @@ def prepare_invoice(account_id, invoice_id):
with transaction.atomic():
account = Account.objects.select_for_update().get(pk=account_id)
invoice = CryptoInvoice.objects.get(pk=invoice_id, account=account)
ensure_created(invoice)
ensure_created(invoice)
+1 -1
View File
@@ -258,4 +258,4 @@ class SHKeeperTransportTests(SimpleTestCase):
def test_calendar_month_handles_leap_year_and_december(self):
january = datetime(2028, 1, 31, tzinfo=dt_timezone.utc)
self.assertEqual(shkeeper.add_month(january), datetime(2028, 2, 29, tzinfo=dt_timezone.utc))
self.assertEqual(shkeeper.add_month(datetime(2027, 12, 15, tzinfo=dt_timezone.utc)), datetime(2028, 1, 15, tzinfo=dt_timezone.utc))
self.assertEqual(shkeeper.add_month(datetime(2027, 12, 15, tzinfo=dt_timezone.utc)), datetime(2028, 1, 15, tzinfo=dt_timezone.utc))
+1 -1
View File
@@ -20,4 +20,4 @@
</main>
<footer class="member-footer">Payment questions? <a href="mailto:eric@eom.dev">Contact the administrator</a>.</footer>
</body>
</html>
</html>
+1 -1
View File
@@ -11,4 +11,4 @@
<button class="button button-primary" type="submit">Create payment invoice</button>
</form>
<p class="member-small">Only one unfinished crypto invoice is allowed per account. Repeated requests reopen it rather than create another deposit address. Stripe subscriptions must end before switching to crypto.</p>
{% endblock %}
{% endblock %}
+1 -1
View File
@@ -21,4 +21,4 @@
{% endif %}
<p><a class="button button-secondary" href="{% url 'members:crypto_invoice' invoice.id %}">Refresh payment status</a></p>
<p class="member-small">Refreshing this page only reads stored status. The worker checks SHKeeper automatically. Crypto payments are irreversible; do not reuse a paid address for renewal. Overpayments do not automatically buy extra months.</p>
{% endblock %}
{% endblock %}