here we go

This commit is contained in:
pacnpal
2024-10-31 22:32:01 +00:00
parent 71272e36a6
commit 3cbda93094
68 changed files with 3114 additions and 1485 deletions

View File

@@ -1,100 +1,90 @@
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import JsonResponse
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import get_object_or_404
from django.utils import timezone
from .models import EditSubmission, PhotoSubmission
from .mixins import ModeratorRequiredMixin
from django.http import HttpResponse
from django.contrib import messages
from django.db.models import Q
from .models import EditSubmission
class EditSubmissionListView(ModeratorRequiredMixin, ListView):
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/admin/edit_submission_list.html'
template_name = 'moderation/edit_submissions.html'
context_object_name = 'submissions'
paginate_by = 20
def get_queryset(self):
queryset = super().get_queryset().select_related(
'user', 'reviewed_by', 'content_type'
).order_by('-submitted_at')
# Filter by status
status = self.request.GET.get('status')
if status:
queryset = queryset.filter(status=status)
# Filter by submission type
submission_type = self.request.GET.get('type')
if submission_type:
queryset = queryset.filter(submission_type=submission_type)
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 post(self, request, *args, **kwargs):
submission_id = request.POST.get('submission_id')
action = request.POST.get('action')
review_notes = request.POST.get('review_notes', '')
submission = get_object_or_404(EditSubmission, id=submission_id)
if action == 'approve':
obj = submission.approve(request.user, review_notes)
message = 'New addition approved successfully.' if submission.submission_type == 'CREATE' else 'Changes approved successfully.'
return JsonResponse({
'status': 'success',
'message': message,
'redirect_url': obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else None
})
elif action == 'reject':
submission.reject(request.user, review_notes)
message = 'New addition rejected.' if submission.submission_type == 'CREATE' else 'Changes rejected.'
return JsonResponse({
'status': 'success',
'message': message
})
return JsonResponse({
'status': 'error',
'message': 'Invalid action.'
}, status=400)
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
class PhotoSubmissionListView(ModeratorRequiredMixin, ListView):
model = PhotoSubmission
template_name = 'moderation/admin/photo_submission_list.html'
context_object_name = 'submissions'
paginate_by = 20
def get_template_names(self):
if self.request.htmx:
return ['moderation/partials/submission_list.html']
return [self.template_name]
def get_queryset(self):
queryset = super().get_queryset().select_related(
'user', 'reviewed_by', 'content_type'
).order_by('-submitted_at')
status = self.request.GET.get('status')
if status:
queryset = queryset.filter(status=status)
return queryset
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 post(self, request, *args, **kwargs):
submission_id = request.POST.get('submission_id')
action = request.POST.get('action')
review_notes = request.POST.get('review_notes', '')
submission = get_object_or_404(PhotoSubmission, id=submission_id)
if action == 'approve':
submission.approve(request.user, review_notes)
return JsonResponse({
'status': 'success',
'message': 'Photo approved successfully.'
})
elif action == 'reject':
submission.reject(request.user, review_notes)
return JsonResponse({
'status': 'success',
'message': 'Photo rejected successfully.'
})
return JsonResponse({
'status': 'error',
'message': 'Invalid action.'
}, status=400)
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)