import logging from django.contrib import admin from access_core.intake.models import ( FormSubmissionEvent, IntakeAssessment, IntakeFemaleHealth, IntakeIdentifier, IntakeLifestyle, IntakeMaleHealth, IntakeMSK, IntakeRecord, IntakeReviewStatus, ParticipationReadiness, RawIngestionRecord, SafetyScreening, ) logger = logging.getLogger(__name__) @admin.register(IntakeRecord) class IntakeRecordAdmin(admin.ModelAdmin): list_display = [ "first_name", "last_name", "dob", "sex", "status", "is_synthetic", "created_at", ] list_filter = ["status", "sex", "is_synthetic"] search_fields = ["first_name", "last_name", "external_form_id"] readonly_fields = ["id", "created_at", "updated_at"] @admin.register(IntakeIdentifier) class IntakeIdentifierAdmin(admin.ModelAdmin): list_display = ["intake_record", "identifier_type", "is_primary"] list_filter = ["identifier_type"] @admin.register(RawIngestionRecord) class RawIngestionRecordAdmin(admin.ModelAdmin): list_display = [ "source_system", "source_record_id", "processing_status", "ingested_at", ] list_filter = ["source_system", "processing_status"] readonly_fields = ["id", "ingested_at"] actions = ["reprocess_selected"] @admin.action( description="Reprocess selected records (after e.g. API key rotation)" ) def reprocess_selected(self, request, queryset): from access_core.intake.consumers import reprocess_raw_record reprocessed = skipped = 0 errors = [] for record in queryset.filter(source_system="healthie"): try: result = reprocess_raw_record(record) except Exception as exc: logger.exception(f"Reprocess failed for {record}") errors.append(f"{record.source_record_id}: {exc}") continue if result == "reprocessed": reprocessed += 1 else: skipped += 1 message = f"Reprocessed {reprocessed} record(s), skipped {skipped}" if errors: message += f", FAILED {len(errors)}: {'; '.join(errors[:3])}" self.message_user(request, message, level="error") else: self.message_user(request, message) @admin.register(IntakeAssessment) class IntakeAssessmentAdmin(admin.ModelAdmin): list_display = ["intake_record", "created_at"] search_fields = ["intake_record__first_name", "intake_record__last_name"] @admin.register(IntakeLifestyle) class IntakeLifestyleAdmin(admin.ModelAdmin): list_display = ["intake_record", "bmi", "created_at"] @admin.register(IntakeFemaleHealth) class IntakeFemaleHealthAdmin(admin.ModelAdmin): list_display = ["intake_record", "created_at"] @admin.register(IntakeMaleHealth) class IntakeMaleHealthAdmin(admin.ModelAdmin): list_display = ["intake_record", "created_at"] @admin.register(IntakeMSK) class IntakeMSKAdmin(admin.ModelAdmin): list_display = ["intake_record", "pain_severity", "created_at"] @admin.register(SafetyScreening) class SafetyScreeningAdmin(admin.ModelAdmin): list_display = [ "intake_record", "safety_stop_applies", "screening_status", "created_at", ] list_filter = ["screening_status"] @admin.register(ParticipationReadiness) class ParticipationReadinessAdmin(admin.ModelAdmin): list_display = ["intake_record", "acknowledged", "status"] list_filter = ["status"] @admin.register(IntakeReviewStatus) class IntakeReviewStatusAdmin(admin.ModelAdmin): list_display = ["intake_record", "status", "reviewed_by", "reviewed_at"] list_filter = ["status"] @admin.register(FormSubmissionEvent) class FormSubmissionEventAdmin(admin.ModelAdmin): list_display = ["intake_record", "source_system", "status", "submitted_at"] list_filter = ["source_system", "status"]