HH/apps/surveys/management/commands/generate_survey_analytics_report.py

149 lines
5.0 KiB
Python

"""
Generate comprehensive survey analytics report
This command generates detailed analytics for:
- Each survey template (overall metrics)
- Each question within each template (detailed metrics)
- Statistical analysis (correlation, skewness, kurtosis)
- Question rankings and insights
- Trends, correlations, and insights
Usage:
python manage.py generate_survey_analytics_report
python manage.py generate_survey_analytics_report --template "Inpatient"
python manage.py generate_survey_analytics_report --start-date 2025-01-01 --end-date 2025-12-31
python manage.py generate_survey_analytics_report --json
python manage.py generate_survey_analytics_report --html
"""
import json
import os
from datetime import datetime, timedelta
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.conf import settings
from apps.surveys.models import SurveyTemplate
from apps.surveys.analytics_utils import (
calculate_survey_analytics,
generate_markdown_report,
generate_html_report,
ReportGenerator,
)
class Command(BaseCommand):
help = 'Generate comprehensive survey analytics report'
def add_arguments(self, parser):
parser.add_argument(
'--template',
type=str,
help='Specific survey template name to analyze',
)
parser.add_argument(
'--start-date',
type=str,
help='Start date (YYYY-MM-DD)',
)
parser.add_argument(
'--end-date',
type=str,
help='End date (YYYY-MM-DD)',
)
parser.add_argument(
'--json',
action='store_true',
help='Generate JSON output file',
)
parser.add_argument(
'--html',
action='store_true',
help='Generate HTML output file',
)
parser.add_argument(
'--output-dir',
type=str,
default='.',
help='Output directory for reports',
)
def handle(self, *args, **options):
"""Command handler"""
self.stdout.write(self.style.SUCCESS('Generating Survey Analytics Report...\n'))
# Parse date range
start_date, end_date = self._parse_date_range(options)
self.stdout.write(f'Date Range: {start_date.date()} to {end_date.date()}')
# Get survey templates
templates = self._get_survey_templates(options.get('template'))
self.stdout.write(f'\nAnalyzing {len(templates)} survey template(s)...')
# Generate analytics data
analytics_data = calculate_survey_analytics(
template_name=options.get('template'),
start_date=start_date.date(),
end_date=end_date.date()
)
# Generate outputs
self._generate_outputs(analytics_data, options)
self.stdout.write(self.style.SUCCESS('\n✓ Report generation complete!'))
def _parse_date_range(self, options):
"""Parse date range from options"""
start_date = options.get('start_date')
end_date = options.get('end_date')
if start_date:
start_date = datetime.strptime(start_date, '%Y-%m-%d')
start_date = timezone.make_aware(start_date)
else:
start_date = timezone.now() - timedelta(days=365)
if end_date:
end_date = datetime.strptime(end_date, '%Y-%m-%d')
end_date = timezone.make_aware(end_date)
end_date = end_date.replace(hour=23, minute=59, second=59)
else:
end_date = timezone.now()
return start_date, end_date
def _get_survey_templates(self, template_name):
"""Get survey templates to analyze"""
templates = SurveyTemplate.objects.filter(is_active=True)
if template_name:
templates = templates.filter(name__icontains=template_name)
return templates.order_by('name')
def _generate_outputs(self, analytics_data, options):
"""Generate output files"""
output_dir = options.get('output_dir', '.')
os.makedirs(output_dir, exist_ok=True)
# Generate Markdown report
report_gen = ReportGenerator()
report_gen.generate_markdown_to_file(analytics_data, output_dir)
self.stdout.write(f'✓ Markdown report: {os.path.join(output_dir, "survey_analytics_report.md")}')
# Generate JSON file if requested
if options.get('json'):
self._generate_json_report(analytics_data, output_dir)
# Generate HTML file if requested
if options.get('html'):
report_gen.generate_html_to_file(analytics_data, output_dir)
self.stdout.write(f'✓ HTML report: {os.path.join(output_dir, "survey_analytics_report.html")}')
def _generate_json_report(self, data, output_dir):
"""Generate JSON report"""
output_path = os.path.join(output_dir, 'survey_analytics_data.json')
with open(output_path, 'w') as f:
json.dump(data, f, indent=2, default=str)
self.stdout.write(f'✓ JSON report: {output_path}')