Turns Daybook into a multi-user tool and reworks the feed UI: - Multi-user: Django session login (username/password + remember-me), per-user personal API tokens (DRF authtoken), whole app gated behind login. Each artifact has an owner; feeds are private per user. - Rename persona -> source (free-text label for whatever posted an artifact: agent-profile, script, or person). source + tags form one unified label system; single label filter matches tags, source has its own filter/column/sidebar. - Settings area (gear/user menu, top-right): Account (view/regenerate token) and Demo Data (in-app button seeding one artifact per kind). User account management via Django admin (superusers only). - Feed rework: rolling 7-day window with sticky inline date separators and infinite scroll; left sidebar is now a Sources list with per-source unread counts; artifact type shown as text after title; source in its own column. - Unread tracking: read_at on Artifact, marked read when previewed, bold titles for unread, sidebar unread badges, old banner removed. - Tag colours: global shared registry, hash-based default with optional per-tag override via tag_colors on POST/PATCH. - Ingest: token resolves owner; same source name under two users' tokens stays isolated. daybook_post.py renamed persona->source, requires a real token, --check accepts a bearer token. Docs updated to match. Migrations 0004-0008 rename persona, add owner (nullable -> backfill to first superuser -> required), and add read_at. Fresh installs no-op the backfill. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
2.1 KiB
HTML
34 lines
2.1 KiB
HTML
{% for group in day_groups %}
|
|
<div class="day-group">
|
|
<div class="day-separator">
|
|
<span>{{ group.day|date:"D, M j Y" }}{% if group.day == today %} <em class="today-badge">Today</em>{% endif %}</span>
|
|
<span class="day-separator-count">{{ group.artifacts|length }}</span>
|
|
</div>
|
|
{% for artifact in group.artifacts %}
|
|
<a class="artifact-row {% if selected_artifact.id == artifact.id %}selected{% endif %} {% if artifact.is_unread %}unread{% endif %}"
|
|
href="?{% if selected_source %}source={{ selected_source|urlencode }}&{% endif %}{% if selected_label %}label={{ selected_label|urlencode }}&{% endif %}{% if selected_kind %}kind={{ selected_kind|urlencode }}&{% endif %}{% if title_query %}q={{ title_query|urlencode }}&{% endif %}artifact={{ artifact.id }}&view={{ selected_view }}"
|
|
data-artifact-id="{{ artifact.id }}"
|
|
data-title="{{ artifact.title }}"
|
|
data-kind="{{ artifact.kind }}"
|
|
data-rendered-url="{% url 'artifact' artifact.id %}"
|
|
data-raw-url="{% url 'artifact' artifact.id %}?raw=1">
|
|
<time class="artifact-time" datetime="{{ artifact.created_at|date:'c' }}">{{ artifact.created_at|date:"H:i" }}</time>
|
|
<span class="artifact-row-main">
|
|
<span class="artifact-title">{{ artifact.title }}</span>
|
|
<span class="artifact-kind-text">{% if artifact.kind == "image" %}image{% elif artifact.kind == "pdf" %}pdf{% elif artifact.kind == "markdown" %}markdown{% elif artifact.kind == "deck" %}deck{% elif artifact.kind == "binary" %}binary{% else %}html{% endif %}</span>
|
|
{% if artifact.label_chips %}
|
|
<span class="tag-chips">
|
|
{% for label in artifact.label_chips %}
|
|
<span class="tag-chip" style="background:{{ label.color }}">{{ label.name }}</span>
|
|
{% endfor %}
|
|
</span>
|
|
{% endif %}
|
|
</span>
|
|
<span class="artifact-source">{{ artifact.source }}</span>
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
{% endfor %}
|
|
{% if has_more %}
|
|
<div class="feed-more" data-feed-more data-next-before="{{ next_before }}"></div>
|
|
{% endif %}
|