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_memberfor reverse lookups
CRUD Operations
1. Admin Interface (apps/organizations/admin.py)
StaffAdmin Features:
- List View: Shows staff details including
has_user_accountstatus indicator - Create/Update: Full form with user account field (autocomplete)
- Bulk Actions:
create_user_accounts: Create user accounts for selected staffsend_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_idin 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
secretsmodule 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
link_user_to_staff(staff, user_id, request=None)
- 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
unlink_user_from_staff(staff, request=None)
- 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:
-
Account Creation:
Staff Record Created → User Account Created → Email Sent -
First Login:
User receives email → Clicks login URL → Enters credentials → Logged in -
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"
}
Example 2: Link Existing User via API
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
- Password Generation: Uses cryptographically secure random generation
- Email Transmission: Sent via secure SMTP (configured in settings)
- Password Storage: Django's PBKDF2 algorithm with SHA256
- Audit Logging: All user management actions logged via AuditService
- Permissions: Role-based access control enforced at every level
Future Enhancements
Potential improvements:
- Role Differentiation: Different roles for physicians, nurses, admins
- 2FA Support: Two-factor authentication for staff
- Password Policies: Enforce complexity requirements
- Bulk Import: Excel/CSV import with user account creation
- Self-Service: Staff can request account creation via email
- Multi-language Email: Arabic version of credentials email
- SSO Integration: LDAP/Active Directory integration
Testing Recommendations
-
Unit Tests:
- StaffService methods
- Username generation uniqueness
- Password generation security
- Permission checks
-
Integration Tests:
- Complete flow: staff creation → user creation → email → login
- Admin bulk actions
- API endpoint permissions
-
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.