mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 14:11:09 -05:00
936 lines
32 KiB
Python
936 lines
32 KiB
Python
"""
|
|
Rich Choice Objects for Moderation Domain
|
|
|
|
This module defines all choice options for the moderation system using the Rich Choice Objects pattern.
|
|
All choices include rich metadata for UI styling, business logic, and enhanced functionality.
|
|
"""
|
|
|
|
from apps.core.choices.base import RichChoice, ChoiceCategory
|
|
from apps.core.choices.registry import register_choices
|
|
|
|
# ============================================================================
|
|
# EditSubmission Choices
|
|
# ============================================================================
|
|
|
|
EDIT_SUBMISSION_STATUSES = [
|
|
RichChoice(
|
|
value="PENDING",
|
|
label="Pending",
|
|
description="Submission awaiting moderator review",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'clock',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'can_transition_to': ['APPROVED', 'REJECTED', 'ESCALATED'],
|
|
'requires_moderator': True,
|
|
'is_actionable': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="APPROVED",
|
|
label="Approved",
|
|
description="Submission has been approved and changes applied",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'check-circle',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 2,
|
|
'can_transition_to': [],
|
|
'requires_moderator': True,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="REJECTED",
|
|
label="Rejected",
|
|
description="Submission has been rejected and will not be applied",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'x-circle',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 3,
|
|
'can_transition_to': [],
|
|
'requires_moderator': True,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="ESCALATED",
|
|
label="Escalated",
|
|
description="Submission has been escalated for higher-level review",
|
|
metadata={
|
|
'color': 'purple',
|
|
'icon': 'arrow-up',
|
|
'css_class': 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'sort_order': 4,
|
|
'can_transition_to': ['APPROVED', 'REJECTED'],
|
|
'requires_moderator': True,
|
|
'is_actionable': True,
|
|
'escalation_level': 'admin'
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
]
|
|
|
|
SUBMISSION_TYPES = [
|
|
RichChoice(
|
|
value="EDIT",
|
|
label="Edit Existing",
|
|
description="Modification to existing content",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'pencil',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 1,
|
|
'requires_existing_object': True,
|
|
'complexity_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="CREATE",
|
|
label="Create New",
|
|
description="Creation of new content",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'plus-circle',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 2,
|
|
'requires_existing_object': False,
|
|
'complexity_level': 'high'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
]
|
|
|
|
# ============================================================================
|
|
# ModerationReport Choices
|
|
# ============================================================================
|
|
|
|
MODERATION_REPORT_STATUSES = [
|
|
RichChoice(
|
|
value="PENDING",
|
|
label="Pending Review",
|
|
description="Report awaiting initial moderator review",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'clock',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'can_transition_to': ['UNDER_REVIEW', 'DISMISSED'],
|
|
'requires_assignment': False,
|
|
'is_actionable': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="UNDER_REVIEW",
|
|
label="Under Review",
|
|
description="Report is actively being investigated by a moderator",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'eye',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 2,
|
|
'can_transition_to': ['RESOLVED', 'DISMISSED'],
|
|
'requires_assignment': True,
|
|
'is_actionable': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="RESOLVED",
|
|
label="Resolved",
|
|
description="Report has been resolved with appropriate action taken",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'check-circle',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 3,
|
|
'can_transition_to': [],
|
|
'requires_assignment': True,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="DISMISSED",
|
|
label="Dismissed",
|
|
description="Report was reviewed but no action was necessary",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'x-circle',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 4,
|
|
'can_transition_to': [],
|
|
'requires_assignment': True,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
]
|
|
|
|
PRIORITY_LEVELS = [
|
|
RichChoice(
|
|
value="LOW",
|
|
label="Low",
|
|
description="Low priority - can be handled in regular workflow",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'arrow-down',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 1,
|
|
'sla_hours': 168, # 7 days
|
|
'escalation_threshold': 240, # 10 days
|
|
'urgency_level': 1
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="MEDIUM",
|
|
label="Medium",
|
|
description="Medium priority - standard response time expected",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'minus',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 2,
|
|
'sla_hours': 72, # 3 days
|
|
'escalation_threshold': 120, # 5 days
|
|
'urgency_level': 2
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="HIGH",
|
|
label="High",
|
|
description="High priority - requires prompt attention",
|
|
metadata={
|
|
'color': 'orange',
|
|
'icon': 'arrow-up',
|
|
'css_class': 'bg-orange-100 text-orange-800 border-orange-200',
|
|
'sort_order': 3,
|
|
'sla_hours': 24, # 1 day
|
|
'escalation_threshold': 48, # 2 days
|
|
'urgency_level': 3
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="URGENT",
|
|
label="Urgent",
|
|
description="Urgent priority - immediate attention required",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'exclamation',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 4,
|
|
'sla_hours': 4, # 4 hours
|
|
'escalation_threshold': 8, # 8 hours
|
|
'urgency_level': 4,
|
|
'requires_immediate_notification': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
]
|
|
|
|
REPORT_TYPES = [
|
|
RichChoice(
|
|
value="SPAM",
|
|
label="Spam",
|
|
description="Unwanted or repetitive content",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'ban',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'default_priority': 'MEDIUM',
|
|
'auto_actions': ['content_review'],
|
|
'severity_level': 2
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="HARASSMENT",
|
|
label="Harassment",
|
|
description="Targeted harassment or bullying behavior",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'shield-exclamation',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 2,
|
|
'default_priority': 'HIGH',
|
|
'auto_actions': ['user_review', 'content_review'],
|
|
'severity_level': 4,
|
|
'requires_user_action': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="INAPPROPRIATE_CONTENT",
|
|
label="Inappropriate Content",
|
|
description="Content that violates community guidelines",
|
|
metadata={
|
|
'color': 'orange',
|
|
'icon': 'exclamation-triangle',
|
|
'css_class': 'bg-orange-100 text-orange-800 border-orange-200',
|
|
'sort_order': 3,
|
|
'default_priority': 'HIGH',
|
|
'auto_actions': ['content_review'],
|
|
'severity_level': 3
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="MISINFORMATION",
|
|
label="Misinformation",
|
|
description="False or misleading information",
|
|
metadata={
|
|
'color': 'purple',
|
|
'icon': 'information-circle',
|
|
'css_class': 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'sort_order': 4,
|
|
'default_priority': 'HIGH',
|
|
'auto_actions': ['content_review', 'fact_check'],
|
|
'severity_level': 3,
|
|
'requires_expert_review': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="COPYRIGHT",
|
|
label="Copyright Violation",
|
|
description="Unauthorized use of copyrighted material",
|
|
metadata={
|
|
'color': 'indigo',
|
|
'icon': 'document-duplicate',
|
|
'css_class': 'bg-indigo-100 text-indigo-800 border-indigo-200',
|
|
'sort_order': 5,
|
|
'default_priority': 'HIGH',
|
|
'auto_actions': ['content_review', 'legal_review'],
|
|
'severity_level': 4,
|
|
'requires_legal_review': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="PRIVACY",
|
|
label="Privacy Violation",
|
|
description="Unauthorized sharing of private information",
|
|
metadata={
|
|
'color': 'pink',
|
|
'icon': 'lock-closed',
|
|
'css_class': 'bg-pink-100 text-pink-800 border-pink-200',
|
|
'sort_order': 6,
|
|
'default_priority': 'URGENT',
|
|
'auto_actions': ['content_removal', 'user_review'],
|
|
'severity_level': 5,
|
|
'requires_immediate_action': True
|
|
},
|
|
category=ChoiceCategory.SECURITY
|
|
),
|
|
RichChoice(
|
|
value="HATE_SPEECH",
|
|
label="Hate Speech",
|
|
description="Content promoting hatred or discrimination",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'fire',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 7,
|
|
'default_priority': 'URGENT',
|
|
'auto_actions': ['content_removal', 'user_suspension'],
|
|
'severity_level': 5,
|
|
'requires_immediate_action': True,
|
|
'zero_tolerance': True
|
|
},
|
|
category=ChoiceCategory.SECURITY
|
|
),
|
|
RichChoice(
|
|
value="VIOLENCE",
|
|
label="Violence or Threats",
|
|
description="Content containing violence or threatening behavior",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'exclamation',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 8,
|
|
'default_priority': 'URGENT',
|
|
'auto_actions': ['content_removal', 'user_ban', 'law_enforcement_notification'],
|
|
'severity_level': 5,
|
|
'requires_immediate_action': True,
|
|
'zero_tolerance': True,
|
|
'requires_law_enforcement': True
|
|
},
|
|
category=ChoiceCategory.SECURITY
|
|
),
|
|
RichChoice(
|
|
value="OTHER",
|
|
label="Other",
|
|
description="Other issues not covered by specific categories",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'dots-horizontal',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 9,
|
|
'default_priority': 'MEDIUM',
|
|
'auto_actions': ['manual_review'],
|
|
'severity_level': 1,
|
|
'requires_manual_categorization': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
]
|
|
|
|
# ============================================================================
|
|
# ModerationQueue Choices
|
|
# ============================================================================
|
|
|
|
MODERATION_QUEUE_STATUSES = [
|
|
RichChoice(
|
|
value="PENDING",
|
|
label="Pending",
|
|
description="Queue item awaiting assignment or action",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'clock',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'can_transition_to': ['IN_PROGRESS', 'CANCELLED'],
|
|
'requires_assignment': False,
|
|
'is_actionable': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="IN_PROGRESS",
|
|
label="In Progress",
|
|
description="Queue item is actively being worked on",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'play',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 2,
|
|
'can_transition_to': ['COMPLETED', 'CANCELLED'],
|
|
'requires_assignment': True,
|
|
'is_actionable': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="COMPLETED",
|
|
label="Completed",
|
|
description="Queue item has been successfully completed",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'check-circle',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 3,
|
|
'can_transition_to': [],
|
|
'requires_assignment': True,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="CANCELLED",
|
|
label="Cancelled",
|
|
description="Queue item was cancelled and will not be completed",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'x-circle',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 4,
|
|
'can_transition_to': [],
|
|
'requires_assignment': False,
|
|
'is_actionable': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
]
|
|
|
|
QUEUE_ITEM_TYPES = [
|
|
RichChoice(
|
|
value="CONTENT_REVIEW",
|
|
label="Content Review",
|
|
description="Review of user-submitted content for policy compliance",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'document-text',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 1,
|
|
'estimated_time_minutes': 15,
|
|
'required_permissions': ['content_moderation'],
|
|
'complexity_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="USER_REVIEW",
|
|
label="User Review",
|
|
description="Review of user account or behavior",
|
|
metadata={
|
|
'color': 'purple',
|
|
'icon': 'user',
|
|
'css_class': 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'sort_order': 2,
|
|
'estimated_time_minutes': 30,
|
|
'required_permissions': ['user_moderation'],
|
|
'complexity_level': 'high'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="BULK_ACTION",
|
|
label="Bulk Action",
|
|
description="Large-scale administrative operation",
|
|
metadata={
|
|
'color': 'indigo',
|
|
'icon': 'collection',
|
|
'css_class': 'bg-indigo-100 text-indigo-800 border-indigo-200',
|
|
'sort_order': 3,
|
|
'estimated_time_minutes': 60,
|
|
'required_permissions': ['bulk_operations'],
|
|
'complexity_level': 'high'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="POLICY_VIOLATION",
|
|
label="Policy Violation",
|
|
description="Investigation of potential policy violations",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'shield-exclamation',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 4,
|
|
'estimated_time_minutes': 45,
|
|
'required_permissions': ['policy_enforcement'],
|
|
'complexity_level': 'high'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="APPEAL",
|
|
label="Appeal",
|
|
description="Review of user appeal against moderation action",
|
|
metadata={
|
|
'color': 'orange',
|
|
'icon': 'scale',
|
|
'css_class': 'bg-orange-100 text-orange-800 border-orange-200',
|
|
'sort_order': 5,
|
|
'estimated_time_minutes': 30,
|
|
'required_permissions': ['appeal_review'],
|
|
'complexity_level': 'high'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="OTHER",
|
|
label="Other",
|
|
description="Other moderation tasks not covered by specific types",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'dots-horizontal',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 6,
|
|
'estimated_time_minutes': 20,
|
|
'required_permissions': ['general_moderation'],
|
|
'complexity_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
]
|
|
|
|
# ============================================================================
|
|
# ModerationAction Choices
|
|
# ============================================================================
|
|
|
|
MODERATION_ACTION_TYPES = [
|
|
RichChoice(
|
|
value="WARNING",
|
|
label="Warning",
|
|
description="Formal warning issued to user",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'exclamation-triangle',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'severity_level': 1,
|
|
'is_temporary': False,
|
|
'affects_privileges': False,
|
|
'escalation_path': ['USER_SUSPENSION']
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="USER_SUSPENSION",
|
|
label="User Suspension",
|
|
description="Temporary suspension of user account",
|
|
metadata={
|
|
'color': 'orange',
|
|
'icon': 'pause',
|
|
'css_class': 'bg-orange-100 text-orange-800 border-orange-200',
|
|
'sort_order': 2,
|
|
'severity_level': 3,
|
|
'is_temporary': True,
|
|
'affects_privileges': True,
|
|
'requires_duration': True,
|
|
'escalation_path': ['USER_BAN']
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="USER_BAN",
|
|
label="User Ban",
|
|
description="Permanent ban of user account",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'ban',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 3,
|
|
'severity_level': 5,
|
|
'is_temporary': False,
|
|
'affects_privileges': True,
|
|
'is_permanent': True,
|
|
'requires_admin_approval': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="CONTENT_REMOVAL",
|
|
label="Content Removal",
|
|
description="Removal of specific content",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'trash',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 4,
|
|
'severity_level': 2,
|
|
'is_temporary': False,
|
|
'affects_privileges': False,
|
|
'is_content_action': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="CONTENT_EDIT",
|
|
label="Content Edit",
|
|
description="Modification of content to comply with policies",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'pencil',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 5,
|
|
'severity_level': 1,
|
|
'is_temporary': False,
|
|
'affects_privileges': False,
|
|
'is_content_action': True,
|
|
'preserves_content': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="CONTENT_RESTRICTION",
|
|
label="Content Restriction",
|
|
description="Restriction of content visibility or access",
|
|
metadata={
|
|
'color': 'purple',
|
|
'icon': 'eye-off',
|
|
'css_class': 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'sort_order': 6,
|
|
'severity_level': 2,
|
|
'is_temporary': True,
|
|
'affects_privileges': False,
|
|
'is_content_action': True,
|
|
'requires_duration': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="ACCOUNT_RESTRICTION",
|
|
label="Account Restriction",
|
|
description="Restriction of specific account privileges",
|
|
metadata={
|
|
'color': 'indigo',
|
|
'icon': 'lock-closed',
|
|
'css_class': 'bg-indigo-100 text-indigo-800 border-indigo-200',
|
|
'sort_order': 7,
|
|
'severity_level': 3,
|
|
'is_temporary': True,
|
|
'affects_privileges': True,
|
|
'requires_duration': True,
|
|
'escalation_path': ['USER_SUSPENSION']
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
RichChoice(
|
|
value="OTHER",
|
|
label="Other",
|
|
description="Other moderation actions not covered by specific types",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'dots-horizontal',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 8,
|
|
'severity_level': 1,
|
|
'is_temporary': False,
|
|
'affects_privileges': False,
|
|
'requires_manual_review': True
|
|
},
|
|
category=ChoiceCategory.CLASSIFICATION
|
|
),
|
|
]
|
|
|
|
# ============================================================================
|
|
# BulkOperation Choices
|
|
# ============================================================================
|
|
|
|
BULK_OPERATION_STATUSES = [
|
|
RichChoice(
|
|
value="PENDING",
|
|
label="Pending",
|
|
description="Operation is queued and waiting to start",
|
|
metadata={
|
|
'color': 'yellow',
|
|
'icon': 'clock',
|
|
'css_class': 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'sort_order': 1,
|
|
'can_transition_to': ['RUNNING', 'CANCELLED'],
|
|
'is_actionable': True,
|
|
'can_cancel': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="RUNNING",
|
|
label="Running",
|
|
description="Operation is currently executing",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'play',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 2,
|
|
'can_transition_to': ['COMPLETED', 'FAILED', 'CANCELLED'],
|
|
'is_actionable': True,
|
|
'can_cancel': True,
|
|
'shows_progress': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="COMPLETED",
|
|
label="Completed",
|
|
description="Operation completed successfully",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'check-circle',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 3,
|
|
'can_transition_to': [],
|
|
'is_actionable': False,
|
|
'can_cancel': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="FAILED",
|
|
label="Failed",
|
|
description="Operation failed with errors",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'x-circle',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 4,
|
|
'can_transition_to': [],
|
|
'is_actionable': False,
|
|
'can_cancel': False,
|
|
'is_final': True,
|
|
'requires_investigation': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
RichChoice(
|
|
value="CANCELLED",
|
|
label="Cancelled",
|
|
description="Operation was cancelled before completion",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'stop',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 5,
|
|
'can_transition_to': [],
|
|
'is_actionable': False,
|
|
'can_cancel': False,
|
|
'is_final': True
|
|
},
|
|
category=ChoiceCategory.STATUS
|
|
),
|
|
]
|
|
|
|
BULK_OPERATION_TYPES = [
|
|
RichChoice(
|
|
value="UPDATE_PARKS",
|
|
label="Update Parks",
|
|
description="Bulk update operations on park data",
|
|
metadata={
|
|
'color': 'green',
|
|
'icon': 'map',
|
|
'css_class': 'bg-green-100 text-green-800 border-green-200',
|
|
'sort_order': 1,
|
|
'estimated_duration_minutes': 30,
|
|
'required_permissions': ['bulk_park_operations'],
|
|
'affects_data': ['parks'],
|
|
'risk_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="UPDATE_RIDES",
|
|
label="Update Rides",
|
|
description="Bulk update operations on ride data",
|
|
metadata={
|
|
'color': 'blue',
|
|
'icon': 'cog',
|
|
'css_class': 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'sort_order': 2,
|
|
'estimated_duration_minutes': 45,
|
|
'required_permissions': ['bulk_ride_operations'],
|
|
'affects_data': ['rides'],
|
|
'risk_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="IMPORT_DATA",
|
|
label="Import Data",
|
|
description="Import data from external sources",
|
|
metadata={
|
|
'color': 'purple',
|
|
'icon': 'download',
|
|
'css_class': 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'sort_order': 3,
|
|
'estimated_duration_minutes': 60,
|
|
'required_permissions': ['data_import'],
|
|
'affects_data': ['parks', 'rides', 'users'],
|
|
'risk_level': 'high'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="EXPORT_DATA",
|
|
label="Export Data",
|
|
description="Export data for backup or analysis",
|
|
metadata={
|
|
'color': 'indigo',
|
|
'icon': 'upload',
|
|
'css_class': 'bg-indigo-100 text-indigo-800 border-indigo-200',
|
|
'sort_order': 4,
|
|
'estimated_duration_minutes': 20,
|
|
'required_permissions': ['data_export'],
|
|
'affects_data': [],
|
|
'risk_level': 'low'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="MODERATE_CONTENT",
|
|
label="Moderate Content",
|
|
description="Bulk moderation actions on content",
|
|
metadata={
|
|
'color': 'orange',
|
|
'icon': 'shield-check',
|
|
'css_class': 'bg-orange-100 text-orange-800 border-orange-200',
|
|
'sort_order': 5,
|
|
'estimated_duration_minutes': 40,
|
|
'required_permissions': ['bulk_moderation'],
|
|
'affects_data': ['content', 'users'],
|
|
'risk_level': 'high'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="USER_ACTIONS",
|
|
label="User Actions",
|
|
description="Bulk actions on user accounts",
|
|
metadata={
|
|
'color': 'red',
|
|
'icon': 'users',
|
|
'css_class': 'bg-red-100 text-red-800 border-red-200',
|
|
'sort_order': 6,
|
|
'estimated_duration_minutes': 50,
|
|
'required_permissions': ['bulk_user_operations'],
|
|
'affects_data': ['users'],
|
|
'risk_level': 'high'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="CLEANUP",
|
|
label="Cleanup",
|
|
description="System cleanup and maintenance operations",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'trash',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 7,
|
|
'estimated_duration_minutes': 25,
|
|
'required_permissions': ['system_maintenance'],
|
|
'affects_data': ['system'],
|
|
'risk_level': 'low'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
RichChoice(
|
|
value="OTHER",
|
|
label="Other",
|
|
description="Other bulk operations not covered by specific types",
|
|
metadata={
|
|
'color': 'gray',
|
|
'icon': 'dots-horizontal',
|
|
'css_class': 'bg-gray-100 text-gray-800 border-gray-200',
|
|
'sort_order': 8,
|
|
'estimated_duration_minutes': 30,
|
|
'required_permissions': ['general_operations'],
|
|
'affects_data': [],
|
|
'risk_level': 'medium'
|
|
},
|
|
category=ChoiceCategory.TECHNICAL
|
|
),
|
|
]
|
|
|
|
# ============================================================================
|
|
# PhotoSubmission Choices (Shared with EditSubmission)
|
|
# ============================================================================
|
|
|
|
# PhotoSubmission uses the same STATUS_CHOICES as EditSubmission
|
|
PHOTO_SUBMISSION_STATUSES = EDIT_SUBMISSION_STATUSES
|
|
|
|
# ============================================================================
|
|
# Choice Registration
|
|
# ============================================================================
|
|
|
|
# Register all choice groups with the global registry
|
|
register_choices("edit_submission_statuses", EDIT_SUBMISSION_STATUSES, "moderation", "Edit submission status options")
|
|
register_choices("submission_types", SUBMISSION_TYPES, "moderation", "Submission type classifications")
|
|
register_choices("moderation_report_statuses", MODERATION_REPORT_STATUSES, "moderation", "Moderation report status options")
|
|
register_choices("priority_levels", PRIORITY_LEVELS, "moderation", "Priority level classifications")
|
|
register_choices("report_types", REPORT_TYPES, "moderation", "Report type classifications")
|
|
register_choices("moderation_queue_statuses", MODERATION_QUEUE_STATUSES, "moderation", "Moderation queue status options")
|
|
register_choices("queue_item_types", QUEUE_ITEM_TYPES, "moderation", "Queue item type classifications")
|
|
register_choices("moderation_action_types", MODERATION_ACTION_TYPES, "moderation", "Moderation action type classifications")
|
|
register_choices("bulk_operation_statuses", BULK_OPERATION_STATUSES, "moderation", "Bulk operation status options")
|
|
register_choices("bulk_operation_types", BULK_OPERATION_TYPES, "moderation", "Bulk operation type classifications")
|
|
register_choices("photo_submission_statuses", PHOTO_SUBMISSION_STATUSES, "moderation", "Photo submission status options")
|