chore: fix pghistory migration deps and improve htmx utilities

- Update pghistory dependency from 0007 to 0006 in account migrations
- Add docstrings and remove unused imports in htmx_forms.py
- Add DJANGO_SETTINGS_MODULE bash commands to Claude settings
- Add state transition definitions for ride statuses
This commit is contained in:
pacnpal
2025-12-21 17:33:24 -05:00
parent b9063ff4f8
commit 7ba0004c93
74 changed files with 11134 additions and 198 deletions

View File

@@ -0,0 +1,317 @@
{% extends "moderation/base.html" %}
{% block title %}Transition History - ThrillWiki Moderation{% endblock %}
{% block content %}
<div class="transition-history">
<div class="page-header">
<h1>Transition History</h1>
<p class="subtitle">View and analyze state transitions across all moderation models</p>
</div>
<!-- Filters -->
<div class="filters-section card">
<h3>Filters</h3>
<div class="filter-controls">
<div class="filter-group">
<label for="model-filter">Model Type</label>
<select id="model-filter" class="form-select">
<option value="">All Models</option>
<option value="editsubmission">Edit Submissions</option>
<option value="moderationreport">Reports</option>
<option value="moderationqueue">Queue Items</option>
<option value="bulkoperation">Bulk Operations</option>
<option value="photosubmission">Photo Submissions</option>
</select>
</div>
<div class="filter-group">
<label for="state-filter">State</label>
<select id="state-filter" class="form-select">
<option value="">All States</option>
<option value="PENDING">Pending</option>
<option value="APPROVED">Approved</option>
<option value="REJECTED">Rejected</option>
<option value="IN_PROGRESS">In Progress</option>
<option value="COMPLETED">Completed</option>
<option value="ESCALATED">Escalated</option>
</select>
</div>
<div class="filter-group">
<label for="start-date">Start Date</label>
<input type="date" id="start-date" class="form-input" placeholder="Start Date">
</div>
<div class="filter-group">
<label for="end-date">End Date</label>
<input type="date" id="end-date" class="form-input" placeholder="End Date">
</div>
<div class="filter-group">
<label for="user-filter">User ID (optional)</label>
<input type="number" id="user-filter" class="form-input" placeholder="User ID">
</div>
<div class="filter-actions">
<button id="apply-filters" class="btn btn-primary">Apply Filters</button>
<button id="clear-filters" class="btn btn-secondary">Clear</button>
</div>
</div>
</div>
<!-- History Table -->
<div class="history-table-section card">
<h3>Transition Records</h3>
<div class="table-responsive">
<table class="history-table">
<thead>
<tr>
<th>Timestamp</th>
<th>Model</th>
<th>Object ID</th>
<th>Transition</th>
<th>State</th>
<th>User</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="history-tbody">
<tr class="loading-row">
<td colspan="7" class="text-center">
<div class="spinner"></div>
Loading history...
</td>
</tr>
</tbody>
</table>
</div>
<!-- Pagination -->
<div class="pagination" id="pagination">
<button id="prev-page" class="btn btn-sm" disabled>&laquo; Previous</button>
<span id="page-info">Page 1</span>
<button id="next-page" class="btn btn-sm">Next &raquo;</button>
</div>
</div>
<!-- Details Modal -->
<div id="details-modal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h3>Transition Details</h3>
<button class="modal-close" onclick="closeModal()">&times;</button>
</div>
<div class="modal-body" id="modal-body">
<!-- Details will be populated here -->
</div>
</div>
</div>
</div>
<style>
.transition-history {
padding: 20px;
max-width: 1400px;
margin: 0 auto;
}
.page-header {
margin-bottom: 30px;
}
.page-header h1 {
margin: 0 0 10px 0;
font-size: 2rem;
}
.subtitle {
color: #666;
margin: 0;
}
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
}
.filters-section h3,
.history-table-section h3 {
margin-top: 0;
margin-bottom: 20px;
font-size: 1.25rem;
}
.filter-controls {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 15px;
}
.filter-group {
display: flex;
flex-direction: column;
}
.filter-group label {
font-weight: 600;
margin-bottom: 5px;
font-size: 0.875rem;
}
.form-select,
.form-input {
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 0.875rem;
}
.filter-actions {
grid-column: 1 / -1;
display: flex;
gap: 10px;
}
.btn {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-weight: 600;
transition: background-color 0.2s;
}
.btn-primary {
background-color: #007bff;
color: white;
}
.btn-primary:hover {
background-color: #0056b3;
}
.btn-secondary {
background-color: #6c757d;
color: white;
}
.btn-secondary:hover {
background-color: #545b62;
}
.table-responsive {
overflow-x: auto;
}
.history-table {
width: 100%;
border-collapse: collapse;
}
.history-table th,
.history-table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
.history-table th {
background-color: #f8f9fa;
font-weight: 600;
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.history-table tbody tr:hover {
background-color: #f8f9fa;
}
.text-center {
text-align: center;
}
.spinner {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid #f3f3f3;
border-top: 3px solid #007bff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 15px;
margin-top: 20px;
}
.btn-sm {
padding: 6px 12px;
font-size: 0.875rem;
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-content {
background: white;
border-radius: 8px;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
border-bottom: 1px solid #ddd;
}
.modal-header h3 {
margin: 0;
}
.modal-close {
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
padding: 0;
width: 30px;
height: 30px;
}
.modal-body {
padding: 20px;
}
</style>
<script src="{% static 'js/moderation/history.js' %}"></script>
{% endblock %}