# Admin Base Classes and Mixins

This document describes the base admin classes and mixins available for building standardized Django admin interfaces in ThrillWiki.

## Overview

The admin infrastructure provides reusable components that ensure consistency, optimize performance, and reduce code duplication across all admin interfaces.

## Base Classes

### BaseModelAdmin

The foundational admin class that all model admins should inherit from.

```python
from apps.core.admin import BaseModelAdmin

class MyModelAdmin(BaseModelAdmin):
    list_display = ['name', 'status', 'created_at']
```

**Features:**
- Consistent pagination (50 items per page)
- Optimized result count behavior
- Standard empty value display
- Save buttons at top of forms
- Filter preservation after saves

## Mixins

### QueryOptimizationMixin

Provides automatic query optimization to prevent N+1 queries.

```python
from apps.core.admin import QueryOptimizationMixin, BaseModelAdmin

class RideAdmin(QueryOptimizationMixin, BaseModelAdmin):
    list_display = ['name', 'park', 'manufacturer']
    list_select_related = ['park', 'manufacturer']
    list_prefetch_related = ['reviews', 'photos']
```

**Attributes:**
- `list_select_related`: List of ForeignKey fields to select
- `list_prefetch_related`: List of related fields to prefetch

### ReadOnlyAdminMixin

Disables add, change, and delete permissions for auto-generated data.

```python
from apps.core.admin import ReadOnlyAdminMixin, BaseModelAdmin

class RankingAdmin(ReadOnlyAdminMixin, BaseModelAdmin):
    list_display = ['ride', 'rank', 'calculated_at']
```

**Use cases:**
- Rankings and leaderboards
- Audit logs and history
- Calculated statistics
- State transition logs

### TimestampFieldsMixin

Provides standard handling for `created_at` and `updated_at` fields.

```python
from apps.core.admin import TimestampFieldsMixin, BaseModelAdmin

class MyModelAdmin(TimestampFieldsMixin, BaseModelAdmin):
    fieldsets = [
        ('Basic Info', {'fields': ['name', 'description']}),
    ] + TimestampFieldsMixin.get_timestamp_fieldset()
```

**Features:**
- Automatically adds timestamp fields to readonly_fields
- Provides a collapsible fieldset for metadata

### SlugFieldMixin

Configures automatic slug population from name field.

```python
from apps.core.admin import SlugFieldMixin, BaseModelAdmin

class ParkAdmin(SlugFieldMixin, BaseModelAdmin):
    slug_source_field = 'name'  # Optional, defaults to 'name'
```

### ExportActionMixin

Adds CSV and JSON export functionality.

```python
from apps.core.admin import ExportActionMixin, BaseModelAdmin

class ParkAdmin(ExportActionMixin, BaseModelAdmin):
    export_fields = ['id', 'name', 'status', 'created_at']
    export_filename_prefix = 'parks'
```

**Actions added:**
- Export selected to CSV
- Export selected to JSON

### BulkStatusChangeMixin

Provides bulk status change actions.

```python
from apps.core.admin import BulkStatusChangeMixin, BaseModelAdmin

class RideAdmin(BulkStatusChangeMixin, BaseModelAdmin):
    status_field = 'status'
    status_choices = [
        ('active', 'Activate'),
        ('inactive', 'Deactivate'),
    ]
```

### ModerationMixin

Adds moderation actions for user-generated content.

```python
from apps.core.admin import ModerationMixin, BaseModelAdmin

class ReviewAdmin(ModerationMixin, BaseModelAdmin):
    moderation_status_field = 'moderation_status'
    moderated_by_field = 'moderated_by'
    moderated_at_field = 'moderated_at'
```

**Actions added:**
- Approve selected items
- Reject selected items

## Combining Mixins

Mixins can be combined to create feature-rich admin classes:

```python
from apps.core.admin import (
    BaseModelAdmin,
    QueryOptimizationMixin,
    ExportActionMixin,
    TimestampFieldsMixin,
    SlugFieldMixin,
)

class ParkAdmin(
    QueryOptimizationMixin,
    ExportActionMixin,
    TimestampFieldsMixin,
    SlugFieldMixin,
    BaseModelAdmin
):
    list_display = ['name', 'operator', 'status', 'created_at']
    list_select_related = ['operator', 'location']
    list_prefetch_related = ['areas', 'rides']
    export_fields = ['id', 'name', 'slug', 'status']
```

## Best Practices

1. **Always use BaseModelAdmin** as the final parent class
2. **List mixins before BaseModelAdmin** in inheritance order
3. **Define list_select_related** for all ForeignKey fields in list_display
4. **Use prefetch_related** for reverse relations and M2M fields
5. **Test query counts** using Django Debug Toolbar
6. **Add export_fields** explicitly for control over exported data

## Performance Targets

- List views: < 10 queries
- Change views: < 15 queries
- Page load time: < 500ms for 100 records
