From a225cfebbf5c4946bb2269a07538f261819a5b55 Mon Sep 17 00:00:00 2001
From: Matthias Kestenholz <mk@feinheit.ch>
Date: Fri, 9 Aug 2024 11:48:07 +0200
Subject: [PATCH] Show a log of recent activity

---
 app/templates/projects/project.html |  3 +++
 projects/models.py                  | 17 +++++++++++++++++
 projects/views.py                   |  3 +++
 3 files changed, 23 insertions(+)

diff --git a/app/templates/projects/project.html b/app/templates/projects/project.html
index b5adbf0..cdd25b8 100644
--- a/app/templates/projects/project.html
+++ b/app/templates/projects/project.html
@@ -32,4 +32,7 @@ <h2>{% translate 'CLI configuration' %}</h2>
   <summary><code>~/.config/traduire.toml</code></summary>
   <pre>{{ toml }}</pre>
 </details>
+
+<h2>{% translate 'Latest activity' %}</h2>
+{% for a in activity %}{{ a.as_html }}{% empty %}<p>{% translate 'None' %}</p>{% endfor %}
 {% endblock %}
diff --git a/projects/models.py b/projects/models.py
index f928d57..86e2e3b 100644
--- a/projects/models.py
+++ b/projects/models.py
@@ -6,6 +6,8 @@
 from django.db import models
 from django.db.models import Q
 from django.urls import reverse
+from django.utils.formats import date_format
+from django.utils.html import format_html
 from django.utils.timesince import timesince
 from django.utils.translation import gettext_lazy as _
 
@@ -232,3 +234,18 @@ def save(self, *args, **kwargs):
         super().save(*args, **kwargs)
 
     save.alters_data = True
+
+    def as_html(self):
+        return format_html(
+            """\
+<p>
+  <small>{created_at}</small><br>
+  {user} {action} {catalog}
+</p>
+            """,
+            created_at=date_format(self.created_at, "Y-m-d H:i"),
+            action=self.get_action_display(),
+            user=self.user or self.user_string,
+            project=self.project or self.project_string,
+            catalog=self.catalog or self.catalog_string,
+        )
diff --git a/projects/views.py b/projects/views.py
index 7581925..6eaacab 100644
--- a/projects/views.py
+++ b/projects/views.py
@@ -35,6 +35,9 @@ def project(request, slug):
         {
             "project": project,
             "toml": project.toml(request=request),
+            "activity": Event.objects.filter(project=project).select_related(
+                "user", "project", "catalog"
+            )[:30],
         },
     )