Add toggle button
This commit is contained in:
parent
1f14ef7747
commit
39e3f2b1c2
15 changed files with 135 additions and 44 deletions
|
@ -57,7 +57,9 @@ class ContestMiddleware(object):
|
|||
profile.update_contest()
|
||||
request.participation = profile.current_contest
|
||||
request.in_contest = request.participation is not None
|
||||
request.contest_mode = request.session.get('contest_mode', True)
|
||||
else:
|
||||
request.in_contest = False
|
||||
request.participation = None
|
||||
request.in_contest_mode = request.in_contest and request.contest_mode
|
||||
return self.get_response(request)
|
||||
|
|
|
@ -15,7 +15,7 @@ from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
|
|||
from django.db import IntegrityError
|
||||
from django.db.models import Case, Count, F, FloatField, IntegerField, Max, Min, Q, Sum, Value, When
|
||||
from django.db.models.expressions import CombinedExpression
|
||||
from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse
|
||||
from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse, HttpResponseNotAllowed
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.template.defaultfilters import date as date_filter
|
||||
from django.urls import reverse, reverse_lazy
|
||||
|
@ -46,7 +46,7 @@ from judge.widgets import HeavyPreviewPageDownWidget
|
|||
__all__ = ['ContestList', 'ContestDetail', 'ContestRanking', 'ContestJoin', 'ContestLeave', 'ContestCalendar',
|
||||
'ContestClone', 'ContestStats', 'ContestMossView', 'ContestMossDelete', 'contest_ranking_ajax',
|
||||
'ContestParticipationList', 'ContestParticipationDisqualify', 'get_contest_ranking_list',
|
||||
'base_contest_ranking_list', 'ContestClarificationView']
|
||||
'base_contest_ranking_list', 'ContestClarificationView', 'update_contest_mode']
|
||||
|
||||
|
||||
def _find_contest(request, key, private_check=True):
|
||||
|
@ -428,6 +428,7 @@ class ContestLeave(LoginRequiredMixin, ContestMixin, BaseDetailView):
|
|||
_('You are not in contest "%s".') % contest.key, 404)
|
||||
|
||||
profile.remove_contest()
|
||||
request.session['contest_mode'] = True # reset contest_mode
|
||||
return HttpResponseRedirect(reverse('contest_view', args=(contest.key,)))
|
||||
|
||||
|
||||
|
@ -953,3 +954,12 @@ class ContestClarificationAjax(ContestMixin, DetailView):
|
|||
cla['order'] = self.object.get_label_for_problem(problems.index(cla['problem']))
|
||||
|
||||
return JsonResponse(queryset, safe=False, json_dumps_params={'ensure_ascii': False})
|
||||
|
||||
|
||||
def update_contest_mode(request):
|
||||
if not request.is_ajax() or not request.method=='POST':
|
||||
return HttpResponseNotAllowed(['POST'])
|
||||
|
||||
old_mode = request.session.get('contest_mode', True)
|
||||
request.session['contest_mode'] = not old_mode
|
||||
return HttpResponse()
|
|
@ -71,7 +71,8 @@ class ProblemMixin(object):
|
|||
def get(self, request, *args, **kwargs):
|
||||
try:
|
||||
return super(ProblemMixin, self).get(request, *args, **kwargs)
|
||||
except Http404:
|
||||
except Http404 as e:
|
||||
print(e)
|
||||
return self.no_such_problem()
|
||||
|
||||
|
||||
|
@ -90,7 +91,8 @@ class SolvedProblemMixin(object):
|
|||
|
||||
@cached_property
|
||||
def in_contest(self):
|
||||
return self.profile is not None and self.profile.current_contest is not None
|
||||
return self.profile is not None and self.profile.current_contest is not None \
|
||||
and self.request.in_contest_mode
|
||||
|
||||
@cached_property
|
||||
def contest(self):
|
||||
|
@ -120,10 +122,9 @@ class ProblemSolution(SolvedProblemMixin, ProblemMixin, TitleMixin, CommentedDet
|
|||
solution = get_object_or_404(Solution, problem=self.object)
|
||||
|
||||
if (not solution.is_public or solution.publish_on > timezone.now()) and \
|
||||
not self.request.user.has_perm('judge.see_private_solution') or \
|
||||
(self.request.user.is_authenticated and
|
||||
self.request.profile.current_contest):
|
||||
not self.request.user.has_perm('judge.see_private_solution'):
|
||||
raise Http404()
|
||||
|
||||
context['solution'] = solution
|
||||
context['has_solved_problem'] = self.object.id in self.get_completed_problems()
|
||||
return context
|
||||
|
|
|
@ -262,7 +262,8 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView):
|
|||
|
||||
@cached_property
|
||||
def in_contest(self):
|
||||
return self.request.user.is_authenticated and self.request.profile.current_contest is not None
|
||||
return self.request.user.is_authenticated and self.request.profile.current_contest is not None \
|
||||
and self.request.in_contest_mode
|
||||
|
||||
@cached_property
|
||||
def contest(self):
|
||||
|
|
|
@ -92,7 +92,8 @@ class UserPage(TitleMixin, UserMixin, DetailView):
|
|||
|
||||
@cached_property
|
||||
def in_contest(self):
|
||||
return self.profile is not None and self.profile.current_contest is not None
|
||||
return self.profile is not None and self.profile.current_contest is not None \
|
||||
and self.request.in_contest_mode
|
||||
|
||||
def get_completed_problems(self):
|
||||
if self.in_contest:
|
||||
|
@ -374,8 +375,8 @@ class FixedContestRanking(ContestRanking):
|
|||
|
||||
def users(request):
|
||||
if request.user.is_authenticated:
|
||||
participation = request.profile.current_contest
|
||||
if participation is not None:
|
||||
if request.in_contest_mode:
|
||||
participation = request.profile.current_contest
|
||||
contest = participation.contest
|
||||
return FixedContestRanking.as_view(contest=contest)(request, contest=contest.key)
|
||||
return user_list_view(request)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue