Add problem volunteer
This commit is contained in:
parent
e51129d36f
commit
e70618ed19
15 changed files with 396 additions and 5 deletions
35
judge/views/internal.py
Normal file
35
judge/views/internal.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
from django.views.generic import ListView
|
||||
from django.utils.translation import gettext as _, gettext_lazy
|
||||
from django.db.models import Count
|
||||
from django.http import HttpResponseForbidden
|
||||
|
||||
from judge.utils.diggpaginator import DiggPaginator
|
||||
from judge.models import VolunteerProblemVote, Problem
|
||||
|
||||
class InternalProblem(ListView):
|
||||
model = Problem
|
||||
title = _('Internal problems')
|
||||
template_name = 'internal/base.html'
|
||||
paginate_by = 100
|
||||
context_object_name = 'problems'
|
||||
|
||||
def get_paginator(self, queryset, per_page, orphans=0,
|
||||
allow_empty_first_page=True, **kwargs):
|
||||
return DiggPaginator(queryset, per_page, body=6, padding=2, orphans=orphans,
|
||||
allow_empty_first_page=allow_empty_first_page, **kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = Problem.objects.annotate(vote_count=Count('volunteer_user_votes')) \
|
||||
.filter(vote_count__gte=1).order_by('-vote_count')
|
||||
return queryset
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(InternalProblem, self).get_context_data(**kwargs)
|
||||
context['page_type'] = 'problem'
|
||||
context['title'] = self.title
|
||||
return context
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
if request.user.is_superuser:
|
||||
return super(InternalProblem, self).get(request, *args, **kwargs)
|
||||
return HttpResponseForbidden()
|
|
@ -30,7 +30,7 @@ from judge.comments import CommentedDetailView
|
|||
from judge.forms import ProblemCloneForm, ProblemSubmitForm, ProblemPointsVoteForm
|
||||
from judge.models import ContestProblem, ContestSubmission, Judge, Language, Problem, ProblemClarification, \
|
||||
ProblemGroup, ProblemTranslation, ProblemType, ProblemPointsVote, RuntimeVersion, Solution, Submission, SubmissionSource, \
|
||||
TranslatedProblemForeignKeyQuerySet, Organization
|
||||
TranslatedProblemForeignKeyQuerySet, Organization , VolunteerProblemVote
|
||||
from judge.pdf_problems import DefaultPdfMaker, HAS_PDF
|
||||
from judge.utils.diggpaginator import DiggPaginator
|
||||
from judge.utils.opengraph import generate_opengraph
|
||||
|
@ -594,6 +594,7 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
|
||||
cf_logger = logging.getLogger('judge.ml.collab_filter')
|
||||
|
||||
|
||||
class ProblemFeed(ProblemList):
|
||||
model = Problem
|
||||
context_object_name = 'problems'
|
||||
|
@ -640,6 +641,9 @@ class ProblemFeed(ProblemList):
|
|||
|
||||
if self.feed_type == 'new':
|
||||
return queryset.order_by('-date')
|
||||
elif user and self.feed_type == 'volunteer':
|
||||
voted_problems = user.volunteer_problem_votes.values_list('problem', flat=True)
|
||||
return queryset.exclude(id__in=voted_problems).order_by('?')
|
||||
if not settings.ML_OUTPUT_PATH or not user:
|
||||
return queryset.order_by('?')
|
||||
|
||||
|
|
33
judge/views/volunteer.py
Normal file
33
judge/views/volunteer.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
from django.http import HttpResponseBadRequest, JsonResponse
|
||||
from django.db import transaction
|
||||
|
||||
from judge.models import VolunteerProblemVote, Problem, ProblemType
|
||||
|
||||
|
||||
def vote_problem(request):
|
||||
if not request.user or not request.user.has_perm('judge.suggest_problem_changes'):
|
||||
return HttpResponseBadRequest()
|
||||
if not request.method == 'POST':
|
||||
return HttpResponseBadRequest()
|
||||
try:
|
||||
types_id = request.POST.getlist('types[]')
|
||||
types = ProblemType.objects.filter(id__in=types_id)
|
||||
problem = Problem.objects.get(code=request.POST['problem'])
|
||||
knowledge_points = request.POST['knowledge_points']
|
||||
thinking_points = request.POST['thinking_points']
|
||||
feedback = request.POST['feedback']
|
||||
except Exception as e:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
with transaction.atomic():
|
||||
vote, _ = VolunteerProblemVote.objects.get_or_create(
|
||||
voter=request.profile,
|
||||
problem=problem,
|
||||
defaults={'knowledge_points': 0, 'thinking_points': 0},
|
||||
)
|
||||
vote.knowledge_points = knowledge_points
|
||||
vote.thinking_points = thinking_points
|
||||
vote.feedback = feedback
|
||||
vote.types.set(types)
|
||||
vote.save()
|
||||
return JsonResponse({})
|
Loading…
Add table
Add a link
Reference in a new issue