335 lines
9.9 KiB
Markdown
335 lines
9.9 KiB
Markdown
# 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`)
|
|
```python
|
|
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:
|
|
```python
|
|
# 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
|
|
|
|
#### `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:
|
|
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
# 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.
|