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)