mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 17:51:08 -05:00
91 lines
3.8 KiB
Python
91 lines
3.8 KiB
Python
from django.views.generic import ListView
|
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
|
from django.shortcuts import get_object_or_404
|
|
from django.http import HttpResponse
|
|
from django.contrib import messages
|
|
from django.db.models import Q
|
|
from .models import EditSubmission
|
|
|
|
class ModeratorRequiredMixin(UserPassesTestMixin):
|
|
def test_func(self):
|
|
return self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']
|
|
|
|
class EditSubmissionListView(LoginRequiredMixin, ModeratorRequiredMixin, ListView):
|
|
model = EditSubmission
|
|
template_name = 'moderation/edit_submissions.html'
|
|
context_object_name = 'submissions'
|
|
|
|
def get_queryset(self):
|
|
tab = self.request.GET.get('tab', 'new')
|
|
queryset = EditSubmission.objects.select_related('user', 'content_type')
|
|
|
|
# Include edits by privileged users (mods, admins, superusers) in appropriate tabs
|
|
privileged_roles = ['MODERATOR', 'ADMIN', 'SUPERUSER']
|
|
|
|
if tab == 'new':
|
|
# Show pending submissions, oldest first
|
|
queryset = queryset.filter(status='NEW').order_by('created_at')
|
|
elif tab == 'approved':
|
|
# Show approved submissions and auto-approved edits by privileged users
|
|
queryset = queryset.filter(
|
|
Q(status='APPROVED') |
|
|
Q(user__role__in=privileged_roles, status='NEW') # Include privileged users' edits
|
|
).order_by('-created_at')
|
|
elif tab == 'rejected':
|
|
# Show rejected submissions, newest first
|
|
queryset = queryset.filter(status='REJECTED').order_by('-created_at')
|
|
elif tab == 'escalated' and self.request.user.role in ['ADMIN', 'SUPERUSER']:
|
|
# Show escalated submissions, newest first
|
|
queryset = queryset.filter(status='ESCALATED').order_by('-created_at')
|
|
else:
|
|
# Default to new submissions if invalid tab
|
|
queryset = queryset.filter(status='NEW').order_by('created_at')
|
|
|
|
return queryset
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['active_tab'] = self.request.GET.get('tab', 'new')
|
|
context['new_count'] = EditSubmission.objects.filter(status='NEW').count()
|
|
if self.request.user.role in ['ADMIN', 'SUPERUSER']:
|
|
context['escalated_count'] = EditSubmission.objects.filter(status='ESCALATED').count()
|
|
return context
|
|
|
|
def get_template_names(self):
|
|
if self.request.htmx:
|
|
return ['moderation/partials/submission_list.html']
|
|
return [self.template_name]
|
|
|
|
def approve_submission(request, submission_id):
|
|
submission = get_object_or_404(EditSubmission, id=submission_id)
|
|
|
|
if request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']:
|
|
submission.approve(request.user)
|
|
messages.success(request, 'Submission approved successfully')
|
|
|
|
# Return updated submission list for current tab
|
|
view = EditSubmissionListView.as_view()
|
|
return view(request)
|
|
|
|
def reject_submission(request, submission_id):
|
|
submission = get_object_or_404(EditSubmission, id=submission_id)
|
|
|
|
if request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']:
|
|
submission.reject(request.user)
|
|
messages.success(request, 'Submission rejected successfully')
|
|
|
|
# Return updated submission list for current tab
|
|
view = EditSubmissionListView.as_view()
|
|
return view(request)
|
|
|
|
def escalate_submission(request, submission_id):
|
|
submission = get_object_or_404(EditSubmission, id=submission_id)
|
|
|
|
if request.user.role == 'MODERATOR':
|
|
submission.escalate(request.user)
|
|
messages.success(request, 'Submission escalated to admin')
|
|
|
|
# Return updated submission list for current tab
|
|
view = EditSubmissionListView.as_view()
|
|
return view(request)
|