HH/apps/accounts/management/commands/init_onboarding_data.py
2026-01-06 13:36:43 +03:00

560 lines
27 KiB
Python

"""
Management command to initialize onboarding acknowledgement data
"""
from django.core.management.base import BaseCommand
from django.utils import timezone
from apps.accounts.models import (
AcknowledgementContent,
AcknowledgementChecklistItem,
Role
)
class Command(BaseCommand):
help = 'Initialize default acknowledgement content and checklist items'
def handle(self, *args, **options):
self.stdout.write('Initializing onboarding acknowledgement data...')
# Create generic content (applies to all users)
self._create_generic_content()
# Create role-specific content
self._create_px_admin_content()
self._create_hospital_admin_content()
self._create_department_manager_content()
self._create_physician_content()
self._create_staff_content()
self.stdout.write(self.style.SUCCESS('Onboarding data initialized successfully!'))
def _create_generic_content(self):
"""Create generic acknowledgement content for all users"""
self.stdout.write('Creating generic content...')
role = None # Generic content
# Create generic content items
contents = [
{
'code': 'INTRO_PX360',
'order': 1,
'title_en': 'Welcome to PX360',
'title_ar': 'مرحبًا بك في PX360',
'description_en': 'Overview of the PX360 Patient Experience Management System',
'description_ar': 'نظرة عامة على نظام إدارة تجربة المريض PX360',
'content_en': """
<h2>Welcome to PX360</h2>
<p>PX360 is a comprehensive Patient Experience Management System designed to help healthcare organizations improve patient satisfaction and quality of care.</p>
<h3>Key Features:</h3>
<ul>
<li><strong>Patient Feedback Collection:</strong> Gather and analyze patient feedback across multiple channels</li>
<li><strong>Analytics & Reporting:</strong> Real-time dashboards and detailed reports</li>
<li><strong>Complaint Management:</strong> Streamlined process for handling patient complaints</li>
<li><strong>Quality Observations:</strong> Track and improve service quality</li>
<li><strong>Physician Management:</strong> Manage physician profiles and credentials</li>
<li><strong>Call Center Integration:</strong> Integrated call center for patient communication</li>
</ul>
<h3>Getting Started:</h3>
<p>This wizard will guide you through the essential features and policies of the system. Please review each section carefully and acknowledge the checklist items to complete your onboarding.</p>
""",
'content_ar': """
<h2>مرحبًا بك في PX360</h2>
<p>PX360 هو نظام شامل لإدارة تجربة المرضى مصمم لمساعدة المؤسسات الصحية على تحسين رضا المرضى وجودة الرعاية.</p>
<h3>الميزات الرئيسية:</h3>
<ul>
<li><strong>جمع ملاحظات المرضى:</strong> جمع وتحليل ملاحظات المرضى عبر قنوات متعددة</li>
<li><strong>التحليلات والتقارير:</strong> لوحات تحكم في الوقت الفعلي وتقارير مفصلة</li>
<li><strong>إدارة الشكاوى:</strong> عملية مبسطة للتعامل مع شكاوى المرضى</li>
<li><strong>ملاحظات الجودة:</strong> تتبع وتحسين جودة الخدمة</li>
<li><strong>إدارة الأطباء:</strong> إدارة ملفات الأطباء واعتماداتهم</li>
<li><strong>تكامل مركز الاتصال:</strong> مركز اتصال متكامل للتواصل مع المرضى</li>
</ul>
<h3>البدء:</h3>
<p>سيقوم هذا المعالج بإرشادك عبر الميزات والسياسات الأساسية للنظام. يرجى مراجعة كل قسم بعناية والاعتراف بالبنود المدرجة في القائمة لإكمال التسجيل.</p>
"""
},
{
'code': 'DATA_PRIVACY',
'order': 2,
'title_en': 'Data Privacy & Security',
'title_ar': 'خصوصية البيانات والأمان',
'description_en': 'Understanding data protection and security policies',
'description_ar': 'فهم سياسات حماية البيانات والأمان',
'content_en': """
<h2>Data Privacy & Security</h2>
<h3>Data Protection Principles:</h3>
<ul>
<li>All patient data is confidential and protected</li>
<li>Access is granted based on role and need-to-know basis</li>
<li>Data is encrypted in transit and at rest</li>
<li>All access is logged and auditable</li>
</ul>
<h3>User Responsibilities:</h3>
<ul>
<li>Keep your password secure and do not share it</li>
<li>Log out when leaving your workstation</li>
<li>Report any suspected security incidents immediately</li>
<li>Access only the data you need for your role</li>
</ul>
""",
'content_ar': """
<h2>خصوصية البيانات والأمان</h2>
<h3>مبادئ حماية البيانات:</h3>
<ul>
<li>جميع بيانات المرضى سرية ومحمية</li>
<li>يتم منح الوصول بناءً على الدورة والحاجة للمعرفة</li>
<li>يتم تشفير البيانات أثناء النقل والتخزين</li>
<li>جميع عمليات الوصول مسجلة وقابلة للتدقيق</li>
</ul>
<h3>مسؤوليات المستخدم:</h3>
<ul>
<li>احتفظ بكلمة المرور آمنة ولا تشاركها مع أحد</li>
<li>قم بتسجيل الخروج عند مغادرة محطة العمل</li>
<li>أبلغ عن أي حوادث أمنية مشتبه بها فورًا</li>
<li>الوصول فقط إلى البيانات التي تحتاجها لدورك</li>
</ul>
"""
},
{
'code': 'SYSTEM_USAGE',
'order': 3,
'title_en': 'System Usage Guidelines',
'title_ar': 'إرشادات استخدام النظام',
'description_en': 'Best practices for using PX360 effectively',
'description_ar': 'أفضل الممارسات لاستخدام PX360 بشكل فعال',
'content_en': """
<h2>System Usage Guidelines</h2>
<h3>Best Practices:</h3>
<ul>
<li><strong>Regular Updates:</strong> Check dashboards daily for updates</li>
<li><strong>Timely Actions:</strong> Respond to patient feedback and complaints promptly</li>
<li><strong>Accurate Data:</strong> Ensure all entered data is accurate and complete</li>
<li><strong>Communication:</strong> Use the system for all official communications</li>
</ul>
<h3>Support:</h3>
<p>If you need assistance:</p>
<ul>
<li>Contact your department manager</li>
<li>Submit a support ticket through the help center</li>
<li>Refer to the user documentation</li>
</ul>
""",
'content_ar': """
<h2>إرشادات استخدام النظام</h2>
<h3>أفضل الممارسات:</h3>
<ul>
<li><strong>التحديثات المنتظمة:</strong> تحقق من لوحات التحكم يوميًا للحصول على التحديثات</li>
<li><strong>الإجراءات في الوقت المناسب:</strong> استجب لملاحظات وشكاوى المرضى بسرعة</li>
<li><strong>البيانات الدقيقة:</strong> تأكد من أن جميع البيانات المدخلة دقيقة ومكتملة</li>
<li><strong>التواصل:</strong> استخدم النظام لجميع الاتصالات الرسمية</li>
</ul>
<h3>الدعم:</h3>
<p>إذا كنت بحاجة إلى المساعدة:</p>
<ul>
<li>اتصل بمدير قسمك</li>
<li>قدم تذكرة دعم من خلال مركز المساعدة</li>
<li>راجع وثائق المستخدم</li>
</ul>
"""
}
]
for content_data in contents:
AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
# Create checklist items for generic content
intro_content = AcknowledgementContent.objects.get(code='INTRO_PX360')
privacy_content = AcknowledgementContent.objects.get(code='DATA_PRIVACY')
usage_content = AcknowledgementContent.objects.get(code='SYSTEM_USAGE')
checklist_items = [
{
'content': intro_content,
'code': 'INTRO_ACK',
'order': 1,
'text_en': 'I have reviewed the PX360 system overview',
'text_ar': 'لقد راجعت نظرة عامة على نظام PX360',
'description_en': 'Confirm that you understand the system purpose and key features',
'description_ar': 'أكد أنك تفهم الغرض من النظام والميزات الرئيسية',
'is_required': True
},
{
'content': privacy_content,
'code': 'PRIVACY_ACK',
'order': 1,
'text_en': 'I acknowledge and agree to the data privacy and security policies',
'text_ar': 'أعترف وأوافق على سياسات خصوصية البيانات والأمان',
'description_en': 'Confirm that you understand your responsibilities regarding data protection',
'description_ar': 'أكد أنك تفهم مسؤولياتك فيما يتعلق بحماية البيانات',
'is_required': True
},
{
'content': privacy_content,
'code': 'PRIVACY_PASSWORD',
'order': 2,
'text_en': 'I will keep my password secure and report any security incidents',
'text_ar': 'سأحتفظ بكلمة المرور آمنة وسأبلغ عن أي حوادث أمنية',
'description_en': 'Commit to password security and incident reporting',
'description_ar': 'الالتزام بأمان كلمة المرور والإبلاغ عن الحوادث',
'is_required': True
},
{
'content': usage_content,
'code': 'USAGE_ACK',
'order': 1,
'text_en': 'I will follow system usage guidelines and best practices',
'text_ar': 'سأتبع إرشادات استخدام النظام وأفضل الممارسات',
'description_en': 'Commit to using the system effectively and responsibly',
'description_ar': 'الالتزام باستخدام النظام بفعالية ومسؤولية',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)
def _create_px_admin_content(self):
"""Create PX Admin specific content"""
try:
role = Role.objects.get(name='PX_ADMIN')
except Role.DoesNotExist:
self.stdout.write(self.style.WARNING('PX Admin role not found, skipping PX Admin content'))
return
self.stdout.write('Creating PX Admin content...')
content_data = {
'code': 'PX_ADMIN_RESP',
'role': role,
'order': 4,
'title_en': 'PX Admin Responsibilities',
'title_ar': 'مسؤوليات مسؤول PX',
'description_en': 'Understanding PX Admin role and permissions',
'description_ar': 'فهم دور وصلاحيات مسؤول PX',
'content_en': """
<h2>PX Admin Responsibilities</h2>
<p>As a PX Admin, you have full access to all system features and are responsible for:</p>
<ul>
<li>User and role management</li>
<li>System configuration</li>
<li>Audit and compliance</li>
<li>Content management for acknowledgements</li>
<li>Organizational settings</li>
</ul>
<p><strong>Note:</strong> With great power comes great responsibility. All your actions are logged and audited.</p>
""",
'content_ar': """
<h2>مسؤوليات مسؤول PX</h2>
<p>بصفتك مسؤول PX، لديك حق الوصول الكامل إلى جميع ميزات النظام ومسؤول عن:</p>
<ul>
<li>إدارة المستخدمين والأدوار</li>
<li>تكوين النظام</li>
<li>التدقيق والامتثال</li>
<li>إدارة المحتوى للاعترافات</li>
<li>إعدادات المؤسسة</li>
</ul>
<p><strong>ملاحظة:</strong> مع السلطة العالية تأتي المسؤولية الكبيرة. جميع إجراءاتك مسجلة وقابلة للتدقيق.</p>
"""
}
content, _ = AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
checklist_items = [
{
'content': content,
'code': 'PX_ADMIN_OVERSIGHT',
'order': 1,
'text_en': 'I understand my role as PX Admin and will use permissions responsibly',
'text_ar': 'أفهم دوري كمسؤول PX وسأستخدم الصلاحيات بمسؤولية',
'description_en': 'Accept responsibility for PX Admin role',
'description_ar': 'قبول المسؤولية لدور مسؤول PX',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)
def _create_hospital_admin_content(self):
"""Create Hospital Admin specific content"""
try:
role = Role.objects.get(name='HOSPITAL_ADMIN')
except Role.DoesNotExist:
return
self.stdout.write('Creating Hospital Admin content...')
content_data = {
'code': 'HOSPITAL_ADMIN_RESP',
'role': role,
'order': 4,
'title_en': 'Hospital Admin Responsibilities',
'title_ar': 'مسؤوليات مدير المستشفى',
'description_en': 'Understanding Hospital Admin role and scope',
'description_ar': 'فهم دور ونطاق مدير المستشفى',
'content_en': """
<h2>Hospital Admin Responsibilities</h2>
<p>As a Hospital Admin, you can manage users, view reports, and oversee operations within your hospital.</p>
<ul>
<li>Manage hospital-level settings</li>
<li>Oversee department operations</li>
<li>Access comprehensive analytics</li>
<li>Manage hospital staff</li>
</ul>
""",
'content_ar': """
<h2>مسؤوليات مدير المستشفى</h2>
<p>بصفتك مدير المستشفى، يمكنك إدارة المستخدمين وعرض التقارير والإشراف على العمليات داخل مستشفاك.</p>
<ul>
<li>إدارة إعدادات مستوى المستشفى</li>
<li>الإشراف على عمليات الأقسام</li>
<li>الوصول إلى تحليلات شاملة</li>
<li>إدارة موظفي المستشفى</li>
</ul>
"""
}
content, _ = AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
checklist_items = [
{
'content': content,
'code': 'HOSPITAL_ADMIN_SCOPE',
'order': 1,
'text_en': 'I understand my Hospital Admin role and hospital-level responsibilities',
'text_ar': 'أفهم دوري كمدير مستشفى ومسؤولياتي على مستوى المستشفى',
'description_en': 'Accept responsibility for Hospital Admin role',
'description_ar': 'قبول المسؤولية لدور مدير المستشفى',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)
def _create_department_manager_content(self):
"""Create Department Manager specific content"""
try:
role = Role.objects.get(name='DEPARTMENT_MANAGER')
except Role.DoesNotExist:
return
self.stdout.write('Creating Department Manager content...')
content_data = {
'code': 'DEPT_MGR_RESP',
'role': role,
'order': 4,
'title_en': 'Department Manager Responsibilities',
'title_ar': 'مسؤوليات مدير القسم',
'description_en': 'Understanding Department Manager role and operations',
'description_ar': 'فهم دور وعمليات مدير القسم',
'content_en': """
<h2>Department Manager Responsibilities</h2>
<p>As a Department Manager, you oversee your department's operations and staff performance.</p>
<ul>
<li>Manage department staff</li>
<li>Monitor department metrics</li>
<li>Respond to department-specific feedback</li>
<li>Improve patient experience in your area</li>
</ul>
""",
'content_ar': """
<h2>مسؤوليات مدير القسم</h2>
<p>بصفتك مدير القسم، تشرف على عمليات قسمك وأداء الموظفين.</p>
<ul>
<li>إدارة موظفي القسم</li>
<li>مراقبة مؤشرات القسم</li>
<li>الرد على الملاحظات الخاصة بالقسم</li>
<li>تحسين تجربة المريض في منطقتك</li>
</ul>
"""
}
content, _ = AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
checklist_items = [
{
'content': content,
'code': 'DEPT_MGR_SCOPE',
'order': 1,
'text_en': 'I understand my Department Manager role and responsibilities',
'text_ar': 'أفهم دوري ومسؤولياتي كمدير قسم',
'description_en': 'Accept responsibility for Department Manager role',
'description_ar': 'قبول المسؤولية لدور مدير القسم',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)
def _create_physician_content(self):
"""Create Physician specific content"""
try:
role = Role.objects.get(name='PHYSICIAN')
except Role.DoesNotExist:
return
self.stdout.write('Creating Physician content...')
content_data = {
'code': 'PHYSICIAN_RESP',
'role': role,
'order': 4,
'title_en': 'Physician Responsibilities',
'title_ar': 'مسؤوليات الطبيب',
'description_en': 'Understanding Physician role in PX360',
'description_ar': 'فهم دور الطبيب في PX360',
'content_en': """
<h2>Physician Responsibilities</h2>
<p>As a Physician, you play a key role in patient experience and quality of care.</p>
<ul>
<li>Review and respond to patient feedback</li>
<li>Maintain accurate physician profile</li>
<li>Participate in quality initiatives</li>
<li>Improve patient care based on insights</li>
</ul>
""",
'content_ar': """
<h2>مسؤوليات الطبيب</h2>
<p>بصفتك طبيبًا، تلعب دورًا رئيسيًا في تجربة المريض وجودة الرعاية.</p>
<ul>
<li>مراجعة والرد على ملاحظات المرضى</li>
<li>الحفاظ على ملف الطبيب بدقة</li>
<li>المشاركة في مبادرات الجودة</li>
<li>تحسين رعاية المرضى بناءً على الرؤى</li>
</ul>
"""
}
content, _ = AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
checklist_items = [
{
'content': content,
'code': 'PHYSICIAN_SCOPE',
'order': 1,
'text_en': 'I understand my Physician role and commitment to patient care',
'text_ar': 'أفهم دوري كطبيب والالتزام برعاية المرضى',
'description_en': 'Accept responsibility for Physician role',
'description_ar': 'قبول المسؤولية لدور الطبيب',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)
def _create_staff_content(self):
"""Create Staff specific content"""
try:
role = Role.objects.get(name='STAFF')
except Role.DoesNotExist:
return
self.stdout.write('Creating Staff content...')
content_data = {
'code': 'STAFF_RESP',
'role': role,
'order': 4,
'title_en': 'Staff Responsibilities',
'title_ar': 'مسؤوليات الموظف',
'description_en': 'Understanding Staff role and daily operations',
'description_ar': 'فهم دور الموظف والعمليات اليومية',
'content_en': """
<h2>Staff Responsibilities</h2>
<p>As a Staff member, you contribute to daily operations and patient experience.</p>
<ul>
<li>Complete assigned tasks efficiently</li>
<li>Report patient feedback and concerns</li>
<li>Follow established procedures</li>
<li>Maintain high service standards</li>
</ul>
""",
'content_ar': """
<h2>مسؤوليات الموظف</h2>
<p>بصفتك موظفًا، تساهم في العمليات اليومية وتجربة المريض.</p>
<ul>
<li>إكمال المهام المخصصة بكفاءة</li>
<li>الإبلاغ عن ملاحظات ومخاوف المرضى</li>
<li>اتباع الإجراءات المعمول بها</li>
<li>الحفاظ على معايير خدمة عالية</li>
</ul>
"""
}
content, _ = AcknowledgementContent.objects.update_or_create(
code=content_data['code'],
role=role,
defaults=content_data
)
checklist_items = [
{
'content': content,
'code': 'STAFF_SCOPE',
'order': 1,
'text_en': 'I understand my Staff role and commitment to quality service',
'text_ar': 'أفهم دوري كموظف والالتزام بخدمة عالية الجودة',
'description_en': 'Accept responsibility for Staff role',
'description_ar': 'قبول المسؤولية لدور الموظف',
'is_required': True
}
]
for item_data in checklist_items:
AcknowledgementChecklistItem.objects.update_or_create(
code=item_data['code'],
defaults=item_data
)