from django.contrib import admin from .models import ( Task, TaskActivity, TaskAttachment, TaskAutomation, TaskAutomationRun, TaskBoard, TaskBoardGroup, TaskBoardGroupMembership, TaskBoardPlacement, TaskChecklistItem, TaskColumn, TaskColumnRow, TaskCover, TaskExecutionCycle, TaskExternalLink, TaskLabel, TaskLinkedObject, TaskUserSettings, ) class TaskColumnInline(admin.TabularInline): model = TaskColumn extra = 0 fields = ["parent", "name", "position", "color", "is_done", "is_archived"] class TaskBoardGroupMembershipInline(admin.TabularInline): model = TaskBoardGroupMembership extra = 0 fields = ["board", "rank_key", "added_at"] readonly_fields = ["added_at"] autocomplete_fields = ["board"] @admin.register(TaskBoard) class TaskBoardAdmin(admin.ModelAdmin): list_display = [ "name", "created_by", "access_scope", "is_archived", "created_at", ] list_filter = ["access_scope", "is_archived", "created_at"] search_fields = ["name", "description"] filter_horizontal = ["members", "departments"] inlines = [TaskColumnInline] @admin.register(TaskBoardGroup) class TaskBoardGroupAdmin(admin.ModelAdmin): list_display = ["name", "user", "is_shared", "position", "created_at"] list_filter = ["is_shared"] search_fields = ["name", "user__email"] autocomplete_fields = ["user", "hidden_by"] inlines = [TaskBoardGroupMembershipInline] @admin.register(TaskBoardPlacement) class TaskBoardPlacementAdmin(admin.ModelAdmin): list_display = [ "board", "user", "is_pinned", "notifications_enabled", "updated_at", ] list_filter = ["is_pinned", "notifications_enabled"] search_fields = ["board__name", "user__email"] autocomplete_fields = ["board", "user"] readonly_fields = ["view_state"] @admin.register(TaskColumn) class TaskColumnAdmin(admin.ModelAdmin): list_display = [ "name", "board", "parent", "position", "is_done", "is_archived", ] list_filter = ["is_done", "is_archived", "board"] search_fields = ["name", "board__name"] @admin.register(TaskColumnRow) class TaskColumnRowAdmin(admin.ModelAdmin): list_display = ["name", "column", "position", "color"] list_filter = ["column__board", "column"] search_fields = ["name", "column__name", "column__board__name"] @admin.register(TaskLabel) class TaskLabelAdmin(admin.ModelAdmin): list_display = ["name", "color"] search_fields = ["name"] @admin.register(TaskAutomation) class TaskAutomationAdmin(admin.ModelAdmin): list_display = [ "name", "kind", "trigger", "applies_to_all_boards", "is_active", "last_run_at", ] list_filter = ["kind", "trigger", "applies_to_all_boards", "is_active"] search_fields = ["name", "description"] filter_horizontal = ["boards"] autocomplete_fields = ["created_by"] @admin.register(TaskAutomationRun) class TaskAutomationRunAdmin(admin.ModelAdmin): list_display = [ "automation", "task", "source", "status", "actor", "started_at", "finished_at", ] list_filter = ["source", "status", "started_at"] search_fields = ["automation__name", "task__title", "error"] autocomplete_fields = ["automation", "task", "actor", "trigger_activity"] readonly_fields = [ "idempotency_key", "context", "actions_log", "started_at", "finished_at", ] @admin.register(Task) class TaskAdmin(admin.ModelAdmin): list_display = [ "title", "board", "column", "row", "assignee", "priority", "due_date", "completed_at", ] list_filter = ["board", "column", "row", "priority", "due_date"] search_fields = ["title", "description", "assignee__email"] filter_horizontal = ["labels", "participants"] @admin.register(TaskAttachment) class TaskAttachmentAdmin(admin.ModelAdmin): list_display = [ "file_name", "task", "uploaded_by", "file_size", "created_at", ] list_filter = ["created_at"] search_fields = ["file_name", "task__title", "uploaded_by__email"] autocomplete_fields = ["task", "uploaded_by"] @admin.register(TaskCover) class TaskCoverAdmin(admin.ModelAdmin): list_display = ["task", "kind", "created_by", "updated_at"] list_filter = ["kind", "updated_at"] search_fields = ["task__title", "created_by__email"] autocomplete_fields = [ "task", "attachment", "comment", "external_link", "linked_object", "created_by", ] @admin.register(TaskChecklistItem) class TaskChecklistItemAdmin(admin.ModelAdmin): list_display = [ "title", "task", "position", "is_completed", "completed_by", "updated_at", ] list_filter = ["is_completed", "created_at", "updated_at"] search_fields = ["title", "task__title", "created_by__email"] autocomplete_fields = ["task", "created_by", "completed_by"] @admin.register(TaskLinkedObject) class TaskLinkedObjectAdmin(admin.ModelAdmin): list_display = [ "task", "kind", "content_type", "object_id", "created_by", "created_at", ] list_filter = ["kind", "content_type", "created_at"] search_fields = ["task__title", "created_by__email", "object_id"] @admin.register(TaskExternalLink) class TaskExternalLinkAdmin(admin.ModelAdmin): list_display = ["title", "url", "task", "created_by", "created_at"] list_filter = ["created_at"] search_fields = ["title", "url", "task__title", "created_by__email"] autocomplete_fields = ["task", "created_by"] @admin.register(TaskActivity) class TaskActivityAdmin(admin.ModelAdmin): list_display = ["task", "action", "actor", "object_kind", "object_id", "created_at"] list_filter = ["action", "object_kind", "created_at"] search_fields = ["task__title", "actor__email", "object_id"] @admin.register(TaskExecutionCycle) class TaskExecutionCycleAdmin(admin.ModelAdmin): list_display = [ "task_title", "employee", "due_date_snapshot", "completed_at_snapshot", "status", "protection_until", ] list_filter = ["status", "is_self_assigned", "completed_at_snapshot"] search_fields = ["task_title", "employee__email", "cycle_key"] readonly_fields = [ "task_id_snapshot", "cycle_key", "completed_at_snapshot", "created_at", "updated_at", ] @admin.register(TaskUserSettings) class TaskUserSettingsAdmin(admin.ModelAdmin): list_display = ["user", "default_board", "default_group", "updated_at"] search_fields = [ "user__email", "user__first_name", "user__last_name", "default_board__name", "default_group__name", ] autocomplete_fields = ["user", "default_board", "default_group"]