The clubmanager.app domain was taken, so the platform is now RosterChief (rosterchief.app). Renames the Django project package clubmanager/ -> rosterchief/ (git tracks it as a move, so history follows), every `from rosterchief.base import ...`, the settings/wsgi/asgi module paths, env vars (ROSTERCHIEF_BASE_DOMAIN / ROSTERCHIEF_RP_NAME), the MFA adapter (RosterChiefMFAAdapter), brand text, and the docs. Two things were deliberately NOT swept: - club.models.ClubManager stays: it is the Django manager *for Club*, not the brand. A blind rename would have silently broken it. - Migrations are untouched (history is not rewritten). The only reference was a cosmetic help_text, so a normal AlterField migration carries the new domain. Note the WebAuthn RP ID is the base domain, so moving to rosterchief.app cryptographically invalidates any passkey enrolled under the old one; they cannot be migrated and must be re-enrolled. Nothing is in production, so the real cost is zero. Add django-lucide (from bsiebens/lucide) for icons: the theme toggle now swaps sun/moon against the effective theme, and the control panel gets icons on its tabs, actions and stat groups. Its classifiers stop at Django 5.0, but that is stale metadata — verified rendering on Django 6 / Python 3.14. Also add formbuilder, shop and controlpanel to ruff's known-first-party list, which had drifted behind the apps that landed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
2.5 KiB
HTML
66 lines
2.5 KiB
HTML
{% extends "controlpanel/base.html" %}
|
|
{% load lucide %}
|
|
|
|
{% block heading %}Platform overview{% endblock heading %}
|
|
|
|
{% block actions %}
|
|
<a class="btn btn-primary gap-2" href="{% url 'controlpanel:club_create' %}">{% lucide "plus" size=16 %} New club</a>
|
|
{% endblock actions %}
|
|
|
|
{% block panel %}
|
|
<div class="stats mb-6 w-full bg-base-100 shadow">
|
|
<div class="stat">
|
|
<div class="stat-title">Active clubs</div>
|
|
<div class="stat-value">{{ totals.clubs }}</div>
|
|
</div>
|
|
<div class="stat">
|
|
<div class="stat-title">Archived</div>
|
|
<div class="stat-value">{{ totals.archived_clubs }}</div>
|
|
</div>
|
|
<div class="stat">
|
|
<div class="stat-title">Members</div>
|
|
<div class="stat-value">{{ totals.members }}</div>
|
|
</div>
|
|
<div class="stat">
|
|
<div class="stat-title">Club admins</div>
|
|
<div class="stat-value">{{ totals.admins }}</div>
|
|
</div>
|
|
</div>
|
|
<div class="card bg-base-100 shadow">
|
|
<div class="card-body">
|
|
<h2 class="card-title">Clubs</h2>
|
|
<div class="overflow-x-auto">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Club</th>
|
|
<th>Members</th>
|
|
<th>Teams</th>
|
|
<th>Events</th>
|
|
<th>Admins</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for club in clubs %}
|
|
<tr>
|
|
<td>
|
|
<a class="link link-hover font-medium" href="{% url 'controlpanel:club_detail' club.pk %}">{{ club.name }}</a>
|
|
<div class="text-xs opacity-60">{{ club.slug }}</div>
|
|
</td>
|
|
<td>{{ club.member_count }}</td>
|
|
<td>{{ club.team_count }}</td>
|
|
<td>{{ club.event_count }}</td>
|
|
<td>{{ club.admin_count }}</td>
|
|
</tr>
|
|
{% empty %}
|
|
<tr>
|
|
<td colspan="5" class="text-center opacity-60">No clubs yet.</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock panel %}
|