diff --git a/backend/apps/slack/admin.py b/backend/apps/slack/admin.py deleted file mode 100644 index e912f45dab..0000000000 --- a/backend/apps/slack/admin.py +++ /dev/null @@ -1,182 +0,0 @@ -"""Slack app admin.""" - -from django.contrib import admin, messages - -from apps.slack.models.conversation import Conversation -from apps.slack.models.event import Event -from apps.slack.models.member import Member -from apps.slack.models.message import Message -from apps.slack.models.workspace import Workspace - - -class ConversationAdmin(admin.ModelAdmin): - """Admin for Conversation model.""" - - list_display = ( - "name", - "slack_channel_id", - "created_at", - "total_members_count", - ) - search_fields = ( - "name", - "topic", - "purpose", - "slack_channel_id", - "slack_creator_id", - ) - list_filter = ( - "sync_messages", - "is_archived", - "is_channel", - "is_general", - "is_im", - "is_private", - ) - readonly_fields = ( - "slack_channel_id", - "created_at", - "slack_creator_id", - ) - fieldsets = ( - ( - "Conversation Information", - { - "fields": ( - "slack_channel_id", - "name", - "created_at", - "slack_creator_id", - ) - }, - ), - ( - "Properties", - { - "fields": ( - "is_private", - "is_archived", - "is_general", - ) - }, - ), - ( - "Content", - { - "fields": ( - "topic", - "purpose", - ) - }, - ), - ( - "Additional attributes", - {"fields": ("sync_messages",)}, - ), - ) - - -class EventAdmin(admin.ModelAdmin): - """Admin for Event model.""" - - list_display = ( - "nest_created_at", - "trigger", - "user_id", - ) - list_filter = ("trigger",) - search_fields = ( - "channel_id", - "channel_name", - "text", - "user_id", - "user_name", - ) - - -class MemberAdmin(admin.ModelAdmin): - """Admin for Member model.""" - - actions = ("approve_suggested_users",) - autocomplete_fields = ("user",) - filter_horizontal = ("suggested_users",) - list_filter = ( - "is_bot", - "workspace", - ) - search_fields = ( - "slack_user_id", - "username", - "real_name", - "email", - "user__login", - ) - - def approve_suggested_users(self, request, queryset): - """Approve all suggested users for selected members, enforcing one-to-one constraints.""" - for entity in queryset: - suggestions = entity.suggested_users.all() - - if suggestions.count() == 1: - entity.user = suggestions.first() # only one suggested user - entity.save() - self.message_user( - request, - f" assigned user for {entity}.", - messages.SUCCESS, - ) - elif suggestions.count() > 1: - self.message_user( - request, - f"Error: Multiple suggested users found for {entity}. " - f"Only one user can be assigned due to the one-to-one constraint.", - messages.ERROR, - ) - else: - self.message_user( - request, - f"No suggested users found for {entity}.", - messages.WARNING, - ) - - approve_suggested_users.short_description = "Approve the suggested user (if only one exists)" - - -class MessageAdmin(admin.ModelAdmin): - """Admin for Message model.""" - - autocomplete_fields = ( - "author", - "conversation", - "parent_message", - ) - list_display = ( - "created_at", - "has_replies", - "author", - "conversation", - ) - list_filter = ( - "has_replies", - "conversation", - ) - search_fields = ( - "slack_message_id", - "raw_data__text", - ) - - -class WorkspaceAdmin(admin.ModelAdmin): - """Admin for Workspace model.""" - - search_fields = ( - "name", - "slack_workspace_id", - ) - - -admin.site.register(Conversation, ConversationAdmin) -admin.site.register(Event, EventAdmin) -admin.site.register(Member, MemberAdmin) -admin.site.register(Message, MessageAdmin) -admin.site.register(Workspace, WorkspaceAdmin) diff --git a/backend/apps/slack/admin/__init__.py b/backend/apps/slack/admin/__init__.py new file mode 100644 index 0000000000..b3193ffb04 --- /dev/null +++ b/backend/apps/slack/admin/__init__.py @@ -0,0 +1,7 @@ +"""Slack app admin.""" + +from .conversation import ConversationAdmin +from .event import EventAdmin +from .member import MemberAdmin +from .message import MessageAdmin +from .workspace import WorkspaceAdmin diff --git a/backend/apps/slack/admin/conversation.py b/backend/apps/slack/admin/conversation.py new file mode 100644 index 0000000000..2e0d946147 --- /dev/null +++ b/backend/apps/slack/admin/conversation.py @@ -0,0 +1,75 @@ +"""Conversation admin configuration.""" + +from django.contrib import admin + +from apps.slack.models.conversation import Conversation + + +class ConversationAdmin(admin.ModelAdmin): + """Admin for Conversation model.""" + + fieldsets = ( + ( + "Conversation Information", + { + "fields": ( + "slack_channel_id", + "name", + "created_at", + "slack_creator_id", + ) + }, + ), + ( + "Properties", + { + "fields": ( + "is_private", + "is_archived", + "is_general", + ) + }, + ), + ( + "Content", + { + "fields": ( + "topic", + "purpose", + ) + }, + ), + ( + "Additional attributes", + {"fields": ("sync_messages",)}, + ), + ) + list_display = ( + "name", + "slack_channel_id", + "created_at", + "total_members_count", + ) + list_filter = ( + "sync_messages", + "is_archived", + "is_channel", + "is_general", + "is_im", + "is_private", + ) + readonly_fields = ( + "slack_channel_id", + "created_at", + "slack_creator_id", + ) + search_fields = ( + "name", + "topic", + "purpose", + "slack_channel_id", + "slack_creator_id", + ) + + +admin.site.register(Conversation, ConversationAdmin) diff --git a/backend/apps/slack/admin/event.py b/backend/apps/slack/admin/event.py new file mode 100644 index 0000000000..1f9a209415 --- /dev/null +++ b/backend/apps/slack/admin/event.py @@ -0,0 +1,26 @@ +"""Event admin configuration.""" + +from django.contrib import admin + +from apps.slack.models.event import Event + + +class EventAdmin(admin.ModelAdmin): + """Admin for Event model.""" + + list_display = ( + "nest_created_at", + "trigger", + "user_id", + ) + list_filter = ("trigger",) + search_fields = ( + "channel_id", + "channel_name", + "text", + "user_id", + "user_name", + ) + + +admin.site.register(Event, EventAdmin) diff --git a/backend/apps/slack/admin/member.py b/backend/apps/slack/admin/member.py new file mode 100644 index 0000000000..7dfa92e34a --- /dev/null +++ b/backend/apps/slack/admin/member.py @@ -0,0 +1,56 @@ +"""Member admin configuration.""" + +from django.contrib import admin, messages + +from apps.slack.models.member import Member + + +class MemberAdmin(admin.ModelAdmin): + """Admin for Member model.""" + + actions = ("approve_suggested_users",) + autocomplete_fields = ("user",) + filter_horizontal = ("suggested_users",) + list_filter = ( + "is_bot", + "workspace", + ) + search_fields = ( + "slack_user_id", + "username", + "real_name", + "email", + "user__login", + ) + + def approve_suggested_users(self, request, queryset): + """Approve all suggested users for selected members, enforcing one-to-one constraints.""" + for entity in queryset: + suggestions = entity.suggested_users.all() + + if suggestions.count() == 1: + entity.user = suggestions.first() # only one suggested user + entity.save() + self.message_user( + request, + f" assigned user for {entity}.", + messages.SUCCESS, + ) + elif suggestions.count() > 1: + self.message_user( + request, + f"Error: Multiple suggested users found for {entity}. " + f"Only one user can be assigned due to the one-to-one constraint.", + messages.ERROR, + ) + else: + self.message_user( + request, + f"No suggested users found for {entity}.", + messages.WARNING, + ) + + approve_suggested_users.short_description = "Approve the suggested user (if only one exists)" + + +admin.site.register(Member, MemberAdmin) diff --git a/backend/apps/slack/admin/message.py b/backend/apps/slack/admin/message.py new file mode 100644 index 0000000000..f77e80e187 --- /dev/null +++ b/backend/apps/slack/admin/message.py @@ -0,0 +1,32 @@ +"""Message admin configuration.""" + +from django.contrib import admin + +from apps.slack.models.message import Message + + +class MessageAdmin(admin.ModelAdmin): + """Admin for Message model.""" + + autocomplete_fields = ( + "author", + "conversation", + "parent_message", + ) + list_display = ( + "created_at", + "has_replies", + "author", + "conversation", + ) + list_filter = ( + "has_replies", + "conversation", + ) + search_fields = ( + "slack_message_id", + "raw_data__text", + ) + + +admin.site.register(Message, MessageAdmin) diff --git a/backend/apps/slack/admin/workspace.py b/backend/apps/slack/admin/workspace.py new file mode 100644 index 0000000000..cacc07c482 --- /dev/null +++ b/backend/apps/slack/admin/workspace.py @@ -0,0 +1,17 @@ +"""Workspace admin configuration.""" + +from django.contrib import admin + +from apps.slack.models.workspace import Workspace + + +class WorkspaceAdmin(admin.ModelAdmin): + """Admin for Workspace model.""" + + search_fields = ( + "name", + "slack_workspace_id", + ) + + +admin.site.register(Workspace, WorkspaceAdmin)