111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
#!/usr/bin/env python
|
|
"""Direct test to verify chart data from database"""
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
# Setup Django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PX360.settings')
|
|
sys.path.insert(0, '/home/ismail/projects/HH')
|
|
django.setup()
|
|
|
|
from apps.surveys.models import SurveyInstance
|
|
from django.db.models import Count, Avg
|
|
from django.db.models.functions import TruncDate
|
|
from django.utils import timezone
|
|
import datetime
|
|
|
|
print("=== SURVEY DATA VERIFICATION ===\n")
|
|
|
|
# Get all survey instances
|
|
all_surveys = SurveyInstance.objects.all()
|
|
total_count = all_surveys.count()
|
|
print(f"Total survey instances: {total_count}")
|
|
|
|
# Check completed surveys
|
|
completed = all_surveys.filter(status='completed')
|
|
completed_count = completed.count()
|
|
print(f"Completed surveys: {completed_count}")
|
|
|
|
# Check surveys with scores
|
|
with_scores = completed.exclude(total_score__isnull=True)
|
|
print(f"Completed surveys with scores: {with_scores.count()}")
|
|
|
|
# Get actual scores
|
|
scores = list(with_scores.values_list('total_score', flat=True))
|
|
print(f"\nActual scores in database: {scores}")
|
|
|
|
# Score Distribution Test
|
|
print("\n=== SCORE DISTRIBUTION ===")
|
|
score_ranges = [
|
|
('1-2', 1, 2),
|
|
('2-3', 2, 3),
|
|
('3-4', 3, 4),
|
|
('4-5', 4, 5),
|
|
]
|
|
|
|
for label, min_score, max_score in score_ranges:
|
|
if max_score == 5:
|
|
count = with_scores.filter(
|
|
total_score__gte=min_score,
|
|
total_score__lte=max_score
|
|
).count()
|
|
else:
|
|
count = with_scores.filter(
|
|
total_score__gte=min_score,
|
|
total_score__lt=max_score
|
|
).count()
|
|
|
|
percentage = round((count / completed_count * 100) if completed_count > 0 else 0, 1)
|
|
print(f" {label}: {count} surveys ({percentage}%)")
|
|
|
|
# Engagement Funnel Test
|
|
print("\n=== ENGAGEMENT FUNNEL ===")
|
|
sent_count = all_surveys.filter(status__in=['sent', 'pending']).count()
|
|
viewed_count = all_surveys.filter(status='viewed').count()
|
|
opened_count = all_surveys.filter(open_count__gt=0).count()
|
|
in_progress_count = all_surveys.filter(status='in_progress').count()
|
|
|
|
print(f" Sent/Pending: {sent_count}")
|
|
print(f" Viewed: {viewed_count}")
|
|
print(f" Opened: {opened_count}")
|
|
print(f" In Progress: {in_progress_count}")
|
|
print(f" Completed: {completed_count}")
|
|
|
|
# Completion Time Test
|
|
print("\n=== COMPLETION TIME ===")
|
|
with_time = completed.filter(time_spent_seconds__isnull=False)
|
|
print(f"Completed surveys with time data: {with_time.count()}")
|
|
|
|
if with_time.exists():
|
|
times = list(with_time.values_list('time_spent_seconds', flat=True))
|
|
print(f"Time values (seconds): {times}")
|
|
|
|
# Distribution
|
|
ranges = [
|
|
('< 1 min', 0, 60),
|
|
('1-5 min', 60, 300),
|
|
('5-10 min', 300, 600),
|
|
('10-20 min', 600, 1200),
|
|
('20+ min', 1200, float('inf')),
|
|
]
|
|
|
|
for label, min_sec, max_sec in ranges:
|
|
if max_sec == float('inf'):
|
|
count = with_time.filter(time_spent_seconds__gte=min_sec).count()
|
|
else:
|
|
count = with_time.filter(
|
|
time_spent_seconds__gte=min_sec,
|
|
time_spent_seconds__lt=max_sec
|
|
).count()
|
|
|
|
percentage = round((count / completed_count * 100) if completed_count > 0 else 0, 1)
|
|
print(f" {label}: {count} surveys ({percentage}%)")
|
|
|
|
print("\n=== SUMMARY ===")
|
|
print("✓ All data exists in the database")
|
|
print("✓ Score distribution ranges are correctly defined")
|
|
print("✓ Engagement funnel has data")
|
|
print("✓ Completion time has data")
|
|
print("\nThe charts should now display properly with the fixes applied.")
|