mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-12-16 19:46:48 +01:00
docs: add migration documentation for DeletionRequest
Created comprehensive documentation for migration 1076 including: - Overview and migration details - Complete field descriptions - How to apply and rollback - Testing instructions - Performance and security considerations Co-authored-by: dawnsystem <42047891+dawnsystem@users.noreply.github.com>
This commit is contained in:
parent
ad2df8c7ff
commit
3ae23cddfa
1 changed files with 171 additions and 0 deletions
171
docs/MIGRATION_1076_DELETION_REQUEST.md
Normal file
171
docs/MIGRATION_1076_DELETION_REQUEST.md
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
# Migration 1076: DeletionRequest Model
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
This migration adds the `DeletionRequest` model to track AI-initiated deletion requests that require explicit user approval.
|
||||||
|
|
||||||
|
## Migration Details
|
||||||
|
- **File**: `src/documents/migrations/1076_add_deletion_request.py`
|
||||||
|
- **Dependencies**: Migration 1075 (add_performance_indexes)
|
||||||
|
- **Generated**: Manually based on model definition
|
||||||
|
- **Django Version**: 5.2+
|
||||||
|
|
||||||
|
## What This Migration Does
|
||||||
|
|
||||||
|
### Creates DeletionRequest Table
|
||||||
|
The migration creates a new table `documents_deletionrequest` with the following fields:
|
||||||
|
|
||||||
|
#### Core Fields
|
||||||
|
- `id`: BigAutoField (Primary Key)
|
||||||
|
- `created_at`: DateTimeField (auto_now_add=True)
|
||||||
|
- `updated_at`: DateTimeField (auto_now=True)
|
||||||
|
|
||||||
|
#### Request Information
|
||||||
|
- `requested_by_ai`: BooleanField (default=True)
|
||||||
|
- `ai_reason`: TextField - Detailed explanation from AI
|
||||||
|
- `status`: CharField(max_length=20) with choices:
|
||||||
|
- `pending` (default)
|
||||||
|
- `approved`
|
||||||
|
- `rejected`
|
||||||
|
- `cancelled`
|
||||||
|
- `completed`
|
||||||
|
|
||||||
|
#### Relationships
|
||||||
|
- `user`: ForeignKey to User (CASCADE) - User who must approve
|
||||||
|
- `reviewed_by`: ForeignKey to User (SET_NULL, nullable) - User who reviewed
|
||||||
|
- `documents`: ManyToManyField to Document - Documents to be deleted
|
||||||
|
|
||||||
|
#### Metadata
|
||||||
|
- `impact_summary`: JSONField - Summary of deletion impact
|
||||||
|
- `reviewed_at`: DateTimeField (nullable) - When reviewed
|
||||||
|
- `review_comment`: TextField (blank) - User's review comment
|
||||||
|
- `completed_at`: DateTimeField (nullable) - When completed
|
||||||
|
- `completion_details`: JSONField - Execution details
|
||||||
|
|
||||||
|
### Custom Indexes
|
||||||
|
The migration creates two indexes for optimal query performance:
|
||||||
|
|
||||||
|
1. **Composite Index**: `del_req_status_user_idx`
|
||||||
|
- Fields: `[status, user]`
|
||||||
|
- Purpose: Optimize queries filtering by status and user (e.g., "show me all pending requests for this user")
|
||||||
|
|
||||||
|
2. **Single Index**: `del_req_created_idx`
|
||||||
|
- Fields: `[created_at]`
|
||||||
|
- Purpose: Optimize chronological queries and ordering
|
||||||
|
|
||||||
|
## How to Apply This Migration
|
||||||
|
|
||||||
|
### Development Environment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd src
|
||||||
|
python manage.py migrate documents 1076
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Environment
|
||||||
|
|
||||||
|
1. **Backup your database first**:
|
||||||
|
```bash
|
||||||
|
pg_dump paperless > backup_before_1076.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Apply the migration**:
|
||||||
|
```bash
|
||||||
|
python manage.py migrate documents 1076
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Verify the migration**:
|
||||||
|
```bash
|
||||||
|
python manage.py showmigrations documents
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rollback Instructions
|
||||||
|
|
||||||
|
If you need to rollback this migration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python manage.py migrate documents 1075
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Drop the `documents_deletionrequest` table
|
||||||
|
- Drop the ManyToMany through table
|
||||||
|
- Remove the custom indexes
|
||||||
|
|
||||||
|
## Backward Compatibility
|
||||||
|
|
||||||
|
✅ **This migration is backward compatible**:
|
||||||
|
- It only adds new tables and indexes
|
||||||
|
- It does not modify existing tables
|
||||||
|
- No data migration is required
|
||||||
|
- Old code will continue to work (new model is optional)
|
||||||
|
|
||||||
|
## Data Migration
|
||||||
|
|
||||||
|
No data migration is required as this is a new model with no pre-existing data.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Verify Table Creation
|
||||||
|
```sql
|
||||||
|
-- Check table exists
|
||||||
|
SELECT table_name
|
||||||
|
FROM information_schema.tables
|
||||||
|
WHERE table_name = 'documents_deletionrequest';
|
||||||
|
|
||||||
|
-- Check columns
|
||||||
|
\d documents_deletionrequest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify Indexes
|
||||||
|
```sql
|
||||||
|
-- Check indexes exist
|
||||||
|
SELECT indexname, indexdef
|
||||||
|
FROM pg_indexes
|
||||||
|
WHERE tablename = 'documents_deletionrequest';
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Model Operations
|
||||||
|
```python
|
||||||
|
from documents.models import DeletionRequest
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
# Create a test deletion request
|
||||||
|
user = User.objects.first()
|
||||||
|
dr = DeletionRequest.objects.create(
|
||||||
|
user=user,
|
||||||
|
ai_reason="Test deletion request",
|
||||||
|
status=DeletionRequest.STATUS_PENDING
|
||||||
|
)
|
||||||
|
|
||||||
|
# Verify it was created
|
||||||
|
assert DeletionRequest.objects.filter(id=dr.id).exists()
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
dr.delete()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Impact
|
||||||
|
|
||||||
|
- **Write Performance**: Minimal impact. Additional table with moderate write frequency expected.
|
||||||
|
- **Read Performance**: Improved by custom indexes for common query patterns.
|
||||||
|
- **Storage**: Approximately 1-2 KB per deletion request record.
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
- The migration implements proper foreign key constraints to ensure referential integrity
|
||||||
|
- CASCADE delete on `user` field ensures cleanup when users are deleted
|
||||||
|
- SET_NULL on `reviewed_by` preserves audit trail even if reviewer is deleted
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- Model definition: `src/documents/models.py` (line 1586)
|
||||||
|
- AI Scanner documentation: `AI_SCANNER_IMPLEMENTATION.md`
|
||||||
|
- agents.md: Safety requirements section
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
If you encounter issues with this migration:
|
||||||
|
1. Check Django version is 5.2+
|
||||||
|
2. Verify database supports JSONField (PostgreSQL 9.4+)
|
||||||
|
3. Check migration dependencies are satisfied
|
||||||
|
4. Review Django logs for detailed error messages
|
||||||
Loading…
Add table
Add a link
Reference in a new issue