HH/apps/ai_engine/signals.py
2025-12-24 14:10:18 +03:00

182 lines
6.2 KiB
Python

"""
AI Engine signals - Auto-analyze text content from various apps
This module automatically triggers sentiment analysis when text content is created
or updated in various apps throughout the system.
"""
from django.db.models.signals import post_save
from django.dispatch import receiver
from .services import AIEngineService
@receiver(post_save, sender='complaints.Complaint')
def analyze_complaint_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment when a complaint is created or updated.
Analyzes the complaint description for sentiment.
"""
if instance.description:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.description,
content_object=instance
)
except Exception as e:
# Log error but don't fail the complaint creation
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze complaint sentiment: {e}")
@receiver(post_save, sender='feedback.Feedback')
def analyze_feedback_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment when feedback is created or updated.
Analyzes the feedback message for sentiment.
"""
if instance.message:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.message,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze feedback sentiment: {e}")
@receiver(post_save, sender='surveys.SurveyResponse')
def analyze_survey_response_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for text survey responses.
Only analyzes responses with text_value (text/textarea questions).
"""
if instance.text_value and len(instance.text_value.strip()) > 10:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.text_value,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze survey response sentiment: {e}")
@receiver(post_save, sender='social.SocialMention')
def analyze_social_mention_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for social media mentions.
Analyzes the content of social media posts.
Updates the SocialMention model with sentiment data.
"""
if instance.content and not instance.sentiment:
try:
# Analyze sentiment
sentiment_result = AIEngineService.sentiment.analyze_and_save(
text=instance.content,
content_object=instance
)
# Update the social mention with sentiment data
instance.sentiment = sentiment_result.sentiment
instance.sentiment_score = sentiment_result.sentiment_score
instance.sentiment_analyzed_at = sentiment_result.created_at
instance.save(update_fields=['sentiment', 'sentiment_score', 'sentiment_analyzed_at'])
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze social mention sentiment: {e}")
@receiver(post_save, sender='callcenter.CallCenterInteraction')
def analyze_callcenter_notes_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for call center interaction notes.
Analyzes both notes and resolution_notes for sentiment.
"""
# Combine notes and resolution notes
text_to_analyze = []
if instance.notes:
text_to_analyze.append(instance.notes)
if instance.resolution_notes:
text_to_analyze.append(instance.resolution_notes)
if text_to_analyze:
combined_text = " ".join(text_to_analyze)
try:
AIEngineService.sentiment.analyze_and_save(
text=combined_text,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze call center interaction sentiment: {e}")
@receiver(post_save, sender='complaints.ComplaintUpdate')
def analyze_complaint_update_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for complaint updates/notes.
Analyzes the message in complaint updates.
"""
if instance.message and len(instance.message.strip()) > 10:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.message,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze complaint update sentiment: {e}")
@receiver(post_save, sender='feedback.FeedbackResponse')
def analyze_feedback_response_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for feedback responses.
Analyzes the message in feedback responses.
"""
if instance.message and len(instance.message.strip()) > 10:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.message,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze feedback response sentiment: {e}")
@receiver(post_save, sender='complaints.Inquiry')
def analyze_inquiry_sentiment(sender, instance, created, **kwargs):
"""
Analyze sentiment for inquiries.
Analyzes the inquiry message and response.
"""
# Analyze the inquiry message
if instance.message:
try:
AIEngineService.sentiment.analyze_and_save(
text=instance.message,
content_object=instance
)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Failed to analyze inquiry sentiment: {e}")