All checks were successful
Build and Push Docker Image / build (push) Successful in 4m14s
Reference numbers (unified scheme PREFIX-YYYYMM-HOSP-NNNN, e.g. CMP-202606-HHN-0001): - new ReferenceSequence model + generate_reference() helper (apps/core) - Complaint/Inquiry/Observation/Appreciation/Suggestion emit unified refs via save() - prefix-based auto-routing in public track API (CMP/INQ/OBS trackable; APR/SGT internal-only) - removed legacy CMP-/INQ- generators in ui_views, integrations, px_sources - migrations: core.0003_referencesequence, appreciation.0006, feedback.0008, observations.0012 - unit tests (format, sanitization, monthly reset, 40-thread concurrency) QA audit: - isolated E2E hospital sandbox mirroring HH-N + 10 role users (create_e2e_isolated_env) - feedback-modules-audit.spec.ts + audit helper (headed, run-to-completion) - reports/feedback-modules-qa-report.md Also bundles accumulated in-progress work across complaints, observations, organizations, templates, and other modules.
124 lines
5.0 KiB
Python
124 lines
5.0 KiB
Python
from django.core.management.base import BaseCommand
|
|
from django.db import connection
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Wipe all dev data: complaints, observations, appreciation, feedback, staff, departments, sections, patients, integrations"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument("--confirm", action="store_true", help="Confirm data wipe")
|
|
parser.add_argument("--keep-org", action="store_true", help="Keep hospitals, departments, sections, staff")
|
|
|
|
def handle(self, *args, **options):
|
|
if not options["confirm"]:
|
|
self.stdout.write(self.style.ERROR("Add --confirm to confirm data wipe"))
|
|
return
|
|
|
|
keep_org = options.get("keep_org", False)
|
|
|
|
truncate_order = [
|
|
"complaints_complaintupdate",
|
|
"complaints_complaintattachment",
|
|
"complaints_complaintinvolvedstaff",
|
|
"complaints_complaintinvolveddepartment",
|
|
"complaints_complaintadverseaction_involved_staff",
|
|
"complaints_complaintadverseaction",
|
|
"complaints_complaintadverseactionattachment",
|
|
"complaints_complaintcommunication",
|
|
"complaints_complaintexplanation",
|
|
"complaints_explanationattachment",
|
|
"complaints_complaintmeeting",
|
|
"complaints_complaintprinteraction",
|
|
"complaints_departmentmanagerreview",
|
|
"complaints_managerreviewanswer",
|
|
"complaints_complaint",
|
|
"complaints_inquiryattachment",
|
|
"complaints_inquiryexplanation",
|
|
"complaints_inquiryexplanationattachment",
|
|
"complaints_inquiryupdate",
|
|
"complaints_inquiry",
|
|
"complaints_governmentticket",
|
|
"complaints_patientcomplaintsession",
|
|
"complaints_oncalladminschedule",
|
|
"complaints_oncalladmin",
|
|
"observations_observationattachment",
|
|
"observations_observationnote",
|
|
"observations_observationstatuslog",
|
|
"observations_observation",
|
|
"appreciation_userbadge",
|
|
"appreciation_appreciationbadge",
|
|
"appreciation_appreciationstats",
|
|
"appreciation_appreciation",
|
|
"feedback_feedbackattachment",
|
|
"feedback_feedbackresponse",
|
|
"feedback_commentactionplan",
|
|
"feedback_commentimport",
|
|
"feedback_patientcomment",
|
|
"feedback_feedback",
|
|
"dashboard_complaintrequest",
|
|
"dashboard_escalatedcomplaintlog",
|
|
"dashboard_evaluationnote",
|
|
"dashboard_inquirydetail",
|
|
"dashboard_reportcompletion",
|
|
"analytics_kpivalue",
|
|
"analytics_kpireportdepartmentbreakdown",
|
|
"analytics_kpireportlocationbreakdown",
|
|
"analytics_kpireportmonthlydata",
|
|
"analytics_kpireportsourcebreakdown",
|
|
"analytics_kpireport",
|
|
"analytics_kpi",
|
|
"surveys_surveyinstance",
|
|
"physicians_physicianindividualrating",
|
|
"physicians_physicianmonthlyrating",
|
|
"rca_rcaattachment",
|
|
"rca_rcacorrectiveaction",
|
|
"rca_rcanote",
|
|
"rca_rcarootcause",
|
|
"rca_rcastatuslog",
|
|
"rca_rootcauseanalysis",
|
|
"projects_qiproject_related_actions",
|
|
"projects_qiproject_team_members",
|
|
"projects_qiprojecttask",
|
|
"projects_pdcaphase",
|
|
"projects_focusphase",
|
|
"projects_qiproject",
|
|
"organizations_staffsubsection",
|
|
"organizations_staffsection",
|
|
"organizations_staff",
|
|
"organizations_section",
|
|
"organizations_department",
|
|
"organizations_legacyhierarchymapping",
|
|
"organizations_subsection",
|
|
"organizations_mainsection",
|
|
"organizations_location",
|
|
"organizations_patient",
|
|
"integrations_hispatientvisit",
|
|
"integrations_histestpatient",
|
|
"integrations_histestvisit",
|
|
]
|
|
|
|
org_tables = {
|
|
"organizations_staff",
|
|
"organizations_staffsection",
|
|
"organizations_staffsubsection",
|
|
"organizations_section",
|
|
"organizations_department",
|
|
}
|
|
|
|
with connection.cursor() as cursor:
|
|
for table in truncate_order:
|
|
if keep_org and table in org_tables:
|
|
self.stdout.write(f" SKIP (keep-org): {table}")
|
|
continue
|
|
for table in truncate_order:
|
|
try:
|
|
cursor.execute(f'TRUNCATE TABLE "{table}" CASCADE')
|
|
self.stdout.write(f" Truncated: {table}")
|
|
except Exception as e:
|
|
self.stdout.write(self.style.WARNING(f" SKIP {table}: {e}"))
|
|
|
|
cursor.execute("UPDATE accounts_user SET department_id = NULL")
|
|
self.stdout.write(" Nullified: accounts_user.department_id")
|
|
|
|
self.stdout.write(self.style.SUCCESS("\nDone. All dev data wiped."))
|