Sign-in via django-allauth: emailed one-time codes, GitHub, Discord, and Forgejo instances as OpenID Connect apps registered in admin. Regular users never have a password; sysadmins sign in only at /admin/ and are redirected there from the normal sign-in. Organizations at the URL root with owner and collaborator roles, a per-member project-create grant, and invites by username or email. Email invites carry a bearer token stored only as a hash. The last owner can't leave, be removed or be demoted. Permission checks live in intent/access.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 lines
1 KiB
HTML
30 lines
1 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block content %}
|
|
<h1>Intent</h1>
|
|
<p>Track the why behind features, across every implementation.</p>
|
|
|
|
{% if user.is_authenticated %}
|
|
{% if invites %}
|
|
<section aria-labelledby="invites-heading">
|
|
<h2 id="invites-heading">Pending invitations</h2>
|
|
<p><a href="{% url 'invites:list' %}">{{ invites|length }} invitation{{ invites|length|pluralize }} waiting</a></p>
|
|
</section>
|
|
{% endif %}
|
|
|
|
<section aria-labelledby="orgs-heading">
|
|
<h2 id="orgs-heading">Your organizations</h2>
|
|
{% if orgs %}
|
|
<ul>
|
|
{% for org in orgs %}
|
|
<li><a href="{% url 'orgs:detail' org_slug=org.slug %}">{{ org.name }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>You're not in any organizations yet. Ask an organization owner to invite you.</p>
|
|
{% endif %}
|
|
</section>
|
|
{% else %}
|
|
<p><a href="{% url 'account_login' %}">Sign in</a> or <a href="{% url 'account_signup' %}">create an account</a>.</p>
|
|
{% endif %}
|
|
{% endblock %}
|