Membership and mailing list
This commit is contained in:
@@ -7,7 +7,6 @@
|
||||
<li class="pure-menu-item"><a class="pure-menu-link" href="#start-here">Explore</a></li>
|
||||
<li class="pure-menu-item"><a class="pure-menu-link" href="#projects">Projects</a></li>
|
||||
<li class="pure-menu-item"><a class="pure-menu-link" href="https://discourse.eom.dev/latest">Community</a></li>
|
||||
<li class="pure-menu-item"><a class="pure-menu-link" href="#letters">Letters</a></li>
|
||||
<li class="pure-menu-item"><a class="pure-menu-link nav-support" href="/members/">Membership</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
@@ -107,19 +107,6 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="newsletter-section" id="letters" aria-labelledby="letters-title">
|
||||
<div class="newsletter-copy">
|
||||
<p class="eyebrow">A quieter way to follow along</p>
|
||||
<h2 id="letters-title">Project notes, by email.</h2>
|
||||
<p>No extra forum profile. Choose the topics you want, confirm your address, and follow along from your inbox. Read the public conversations without subscribing.</p>
|
||||
<a class="text-link" href="https://lists.eom.dev/">Browse all mailing-list conversations <span aria-hidden="true">→</span></a>
|
||||
</div>
|
||||
<div class="newsletter-form-wrap">
|
||||
<iframe class="newsletter-embed" src="https://lists.eom.dev/embed/signup/" title="Join the eom.dev email list" loading="lazy" referrerpolicy="no-referrer" height="570"></iframe>
|
||||
<p class="newsletter-fallback">The signup form is hosted by eom.dev. <a href="https://lists.eom.dev/#subscribe">Open the mailing-list signup page</a> if it doesn't load here.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="about-section section" id="about" aria-labelledby="about-title">
|
||||
<div class="about-photo">
|
||||
<img src="/static/profile_2026.jpg" width="300" height="300" loading="lazy" alt="Eric Meehan">
|
||||
|
||||
@@ -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")]}),
|
||||
]
|
||||
]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user