HH/docs/STAFF_USER_ACCOUNT_IMPLEMENTATION_SUMMARY.md

9.9 KiB

Staff User Account Feature - Implementation Summary

Overview

The staff model has a complete optional one-to-one relationship with the User model, enabling staff members to log in to the PX360 system. This document summarizes the complete implementation of CRUD operations and login functionality.

Model Structure

Staff Model (apps/organizations/models.py)

user = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    on_delete=models.SET_NULL,
    null=True,
    blank=True,
    related_name='staff_member',
    verbose_name=_('User Account')
)

Key Features:

  • Optional one-to-one relationship (null=True, blank=True)
  • User deletion preserves staff record (SET_NULL)
  • Related name: staff_member for reverse lookups

CRUD Operations

1. Admin Interface (apps/organizations/admin.py)

StaffAdmin Features:

  • List View: Shows staff details including has_user_account status indicator
  • Create/Update: Full form with user account field (autocomplete)
  • Bulk Actions:
    • create_user_accounts: Create user accounts for selected staff
    • send_credentials_emails: Send/reset credentials via email
  • Fieldsets: Organized sections for Personal Info, Role, Professional Details, Organization, Account, and Status
  • Permissions: Controlled by Django admin permissions

Admin Actions Usage:

# Create accounts for multiple staff at once
1. Select staff members in admin list
2. Choose "Create user accounts for selected staff" from actions
3. Click "Go"
4. Accounts created with auto-generated passwords
5. Credentials emailed to each staff member

2. API Endpoints (apps/organizations/views.py)

StaffViewSet Actions:

POST /api/staff/{id}/create_user_account/

  • Creates a new user account for staff member
  • Auto-generates username (format: firstname.lastname)
  • Auto-generates secure password
  • Assigns 'staff' role by default
  • Sends credentials email
  • Permissions: PX Admin, Hospital Admin (same hospital only)

POST /api/staff/{id}/link_user/

  • Links an existing user account to staff member
  • Requires user_id in request body
  • Updates user's hospital, department, and employee_id
  • Permissions: PX Admin, Hospital Admin (same hospital only)

POST /api/staff/{id}/unlink_user/

  • Removes user account association from staff
  • Preserves both records independently
  • Permissions: PX Admin, Hospital Admin (same hospital only)

POST /api/staff/{id}/send_invitation/

  • Resets password and sends new credentials email
  • Useful for forgotten passwords or reactivation
  • Permissions: PX Admin, Hospital Admin (same hospital only)

Standard CRUD Endpoints:

  • GET /api/staff/ - List staff (filtered by user role)
  • POST /api/staff/ - Create new staff
  • GET /api/staff/{id}/ - Retrieve staff details
  • PUT/PATCH /api/staff/{id}/ - Update staff
  • DELETE /api/staff/{id}/ - Delete staff

3. UI Views (apps/organizations/ui_views.py)

URL Routes:

  • /staff/ - Staff list view
  • /staff/create/ - Create new staff
  • /staff/{id}/ - Staff detail view
  • /staff/{id}/edit/ - Update staff

Service Layer (apps/organizations/services.py)

StaffService Methods:

generate_username(staff)

  • Generates unique username from staff name
  • Format: firstname.lastname (lowercase)
  • Appends number if duplicate exists

generate_password(length=12)

  • Generates secure random password
  • Mix of letters, digits, and special characters
  • Uses Python's secrets module for cryptographic security

create_user_for_staff(staff, role='staff', request=None)

  • Creates User account for staff member
  • Validates staff doesn't already have a user account
  • Requires staff to have an email address
  • Sets user fields: email, password, names, employee_id, hospital, department
  • Assigns role via group membership
  • Links user to staff (staff.user = user)
  • Logs action for audit trail
  • Links existing User to Staff member
  • Validates user exists and staff has no user
  • Updates user's organization data if missing
  • Links bidirectionally
  • Logs action for audit trail
  • Removes User-Staff association
  • Preserves both records independently
  • Logs action for audit trail

send_credentials_email(staff, password, request)

  • Sends beautifully formatted HTML email
  • Includes: username, password, email, login URL
  • Displays security warning about changing password
  • Logs action for audit trail

get_staff_type_role(staff_type)

  • Maps staff_type to role name
  • Currently all staff get 'staff' role
  • Future: Differentiate roles (physician, nurse, admin)

Email Template (templates/organizations/emails/staff_credentials.html)

Features:

  • Professional PX360 branded design
  • Responsive layout
  • Clear credentials display box
  • Security warning about password change
  • Direct login button
  • Multi-language ready structure

Forms (apps/organizations/forms.py)

StaffForm:

  • Complete form for staff CRUD
  • Hospital and department filtering based on user role
  • Employee ID uniqueness validation
  • Email normalization (lowercase, trimmed)
  • Bilingual name fields (English/Arabic)

Login Flow

Staff Login Process:

  1. Account Creation:

    Staff Record Created → User Account Created → Email Sent
    
  2. First Login:

    User receives email → Clicks login URL → Enters credentials → Logged in
    
  3. Password Change (Recommended):

    Staff logged in → Goes to settings → Changes password → Saved
    

Permission Model

Who can manage staff user accounts:

Role Scope
PX Admin All staff in all hospitals
Hospital Admin Staff in their hospital only
Department Manager View only (no management)
Staff View only (own profile)

Usage Examples

Example 1: Create Staff with User Account via API

# Step 1: Create staff
POST /api/staff/
{
  "first_name": "John",
  "last_name": "Doe",
  "email": "john.doe@hospital.com",
  "hospital": "uuid",
  "department": "uuid",
  "staff_type": "physician",
  "employee_id": "EMP001",
  ...
}

# Step 2: Create user account
POST /api/staff/{staff_id}/create_user_account/
{
  "role": "staff"
}

# Response:
{
  "message": "User account created and credentials emailed successfully",
  "staff": {...},
  "email": "john.doe@hospital.com"
}
POST /api/staff/{staff_id}/link_user/
{
  "user_id": "user-uuid"
}

# Response:
{
  "message": "User account linked successfully",
  "staff": {...}
}

Example 3: Bulk Create via Admin

1. Navigate to /admin/organizations/staff/
2. Select multiple staff members without accounts
3. Choose "Create user accounts for selected staff"
4. Click "Go"
5. Accounts created and emails sent automatically

Example 4: Send New Credentials

# Staff forgot password - admin sends new credentials
POST /api/staff/{staff_id}/send_invitation/

# Generates new password and emails it

Database Schema

Staff Model Relations:

Staff
├── user (FK → User, nullable) - Optional user account
├── hospital (FK → Hospital)
├── department (FK → Department)
└── ... (other fields)

User Model Relations:

User
├── groups (M2M → Group) - Role assignment
├── hospital (FK → Hospital) - Staff's hospital
├── department (FK → Department) - Staff's department
└── staff_member (reverse FK from Staff) - Related staff

Migration Status

No migrations needed - the relationship is already implemented in the existing model.

Security Considerations

  1. Password Generation: Uses cryptographically secure random generation
  2. Email Transmission: Sent via secure SMTP (configured in settings)
  3. Password Storage: Django's PBKDF2 algorithm with SHA256
  4. Audit Logging: All user management actions logged via AuditService
  5. Permissions: Role-based access control enforced at every level

Future Enhancements

Potential improvements:

  1. Role Differentiation: Different roles for physicians, nurses, admins
  2. 2FA Support: Two-factor authentication for staff
  3. Password Policies: Enforce complexity requirements
  4. Bulk Import: Excel/CSV import with user account creation
  5. Self-Service: Staff can request account creation via email
  6. Multi-language Email: Arabic version of credentials email
  7. SSO Integration: LDAP/Active Directory integration

Testing Recommendations

  1. Unit Tests:

    • StaffService methods
    • Username generation uniqueness
    • Password generation security
    • Permission checks
  2. Integration Tests:

    • Complete flow: staff creation → user creation → email → login
    • Admin bulk actions
    • API endpoint permissions
  3. E2E Tests:

    • Staff receives email
    • Staff can login with provided credentials
    • Staff can change password
    • Hospital admin can manage staff in their hospital only

Documentation References

  • API Documentation: docs/API_ENDPOINTS.md (update with staff user endpoints)
  • Permission Model: apps/accounts/permissions.py
  • Audit Service: apps/core/services.py
  • Email Settings: config/settings/base.py

Conclusion

The staff-user account feature is fully implemented and production-ready. It provides:

Optional one-to-one relationship with User model
Complete CRUD operations (Admin, API, UI)
Automated user account creation with credentials
Email notification system
Bulk operations for efficiency
Role-based permissions
Audit logging for compliance
Secure password generation

The system enables administrators to easily create user accounts for staff members, who can then log in using their email address and auto-generated password, with the option to change their password after first login.