Add authors to tasks

This commit is contained in:
2026-03-03 17:43:12 +00:00
parent 18351abb00
commit 8ea2afb259
10 changed files with 190 additions and 23 deletions

View File

@@ -174,6 +174,53 @@ def _service_label(service: str) -> str:
return labels.get(key, key.title() if key else "Unknown")
def _creator_label_for_message(user, service: str, message) -> str:
msg = message
if msg is None:
return "Unknown"
author_raw = str(getattr(msg, "custom_author", "") or "").strip()
author_key = author_raw.upper()
sender_identifier = str(getattr(msg, "sender_uuid", "") or "").strip()
if author_key == "USER":
return "You"
if author_key == "BOT":
return "System Bot"
if sender_identifier:
variants = _person_identifier_scope_variants(service, sender_identifier)
person_identifier = (
PersonIdentifier.objects.filter(
user=user,
service=str(service or "").strip().lower(),
identifier__in=variants or [sender_identifier],
)
.select_related("person")
.first()
)
if person_identifier is not None:
person_name = str(getattr(person_identifier.person, "name", "") or "").strip()
if person_name:
return person_name
return sender_identifier
if author_raw:
if author_key == "OTHER":
return "Other Participant"
return author_raw
return "Unknown"
def _apply_task_creator_labels(user, task_rows):
rows = list(task_rows or [])
for row in rows:
origin = getattr(row, "origin_message", None)
service_key = str(getattr(row, "source_service", "") or "").strip().lower()
row.creator_label = _creator_label_for_message(user, service_key, origin)
row.creator_identifier = str(getattr(origin, "sender_uuid", "") or "").strip()
return rows
def _provider_row_map(user):
return {
str(row.provider or "").strip().lower(): row
@@ -410,9 +457,10 @@ class TasksHub(LoginRequiredMixin, View):
)
tasks = (
DerivedTask.objects.filter(user=request.user)
.select_related("project", "epic")
.select_related("project", "epic", "origin_message")
.order_by("-created_at")[:200]
)
tasks = _apply_task_creator_labels(request.user, tasks)
selected_project = None
if scope["selected_project_id"]:
selected_project = TaskProject.objects.filter(
@@ -547,9 +595,10 @@ class TaskProjectDetail(LoginRequiredMixin, View):
def _context(self, request, project):
tasks = (
DerivedTask.objects.filter(user=request.user, project=project)
.select_related("epic")
.select_related("epic", "origin_message")
.order_by("-created_at")
)
tasks = _apply_task_creator_labels(request.user, tasks)
epics = (
TaskEpic.objects.filter(project=project)
.annotate(task_count=Count("derived_tasks"))
@@ -613,9 +662,10 @@ class TaskEpicDetail(LoginRequiredMixin, View):
epic = get_object_or_404(TaskEpic, id=epic_id, project__user=request.user)
tasks = (
DerivedTask.objects.filter(user=request.user, epic=epic)
.select_related("project")
.select_related("project", "origin_message")
.order_by("-created_at")
)
tasks = _apply_task_creator_labels(request.user, tasks)
return render(request, self.template_name, {"epic": epic, "tasks": tasks})
@@ -639,9 +689,10 @@ class TaskGroupDetail(LoginRequiredMixin, View):
source_service__in=service_keys,
source_channel__in=variants,
)
.select_related("project", "epic")
.select_related("project", "epic", "origin_message")
.order_by("-created_at")
)
tasks = _apply_task_creator_labels(request.user, tasks)
return render(
request,
self.template_name,
@@ -717,11 +768,28 @@ class TaskDetail(LoginRequiredMixin, View):
def get(self, request, task_id):
task = get_object_or_404(
DerivedTask.objects.select_related("project", "epic"),
DerivedTask.objects.select_related("project", "epic", "origin_message"),
id=task_id,
user=request.user,
)
events = task.events.select_related("source_message").order_by("-created_at")
for row in events:
service_hint = str(getattr(task, "source_service", "") or "").strip().lower()
event_source_message = getattr(row, "source_message", None)
row.actor_display = _creator_label_for_message(
request.user,
service_hint,
event_source_message,
)
if row.actor_display == "Unknown":
raw_actor = str(getattr(row, "actor_identifier", "") or "").strip()
if raw_actor:
row.actor_display = raw_actor
task.creator_label = _creator_label_for_message(
request.user,
str(getattr(task, "source_service", "") or "").strip().lower(),
getattr(task, "origin_message", None),
)
sync_events = task.external_sync_events.order_by("-created_at")
return render(
request,