Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # challenges view
- from django.shortcuts import render, redirect
- from django.core.exceptions import ObjectDoesNotExist
- from django.contrib import messages
- from results.models import ContestResult
- from contests.models import Contest
- from .forms import FlagForm
- from .models import Challenge, Tag
- def index(request):
- tag_name = request.GET.get('tag')
- sort = request.GET.get('sort')
- if sort not in ['name', 'modified', 'created', 'score']:
- sort = 'created'
- if tag_name:
- try:
- tag = Tag.objects.get(name=tag_name)
- except ObjectDoesNotExist:
- messages.info('Tag {} does not exist! Showing all challenges instead.'.format(tag_name))
- challenges = Challenge.objects.all().order_by(sort)
- else:
- challenges = tag.challenge_set.all().filter(hidden=False).order_by(sort)
- else:
- challenges = Challenge.objects.all().filter(hidden=False).order_by(sort)
- return render(request, 'challenges/index.html', {'challenges': challenges})
- def tags(request):
- tags = Tag.objects.all()
- return render(request, 'challenges/tags.html', {'tags': tags})
- def challenge(request, challenge_slug, contest_slug=None):
- # Get contest object or redirect to contests.views.index
- if contest_slug is not None:
- is_in_contest = True
- try:
- contest = Contest.objects.get(slug=contest_slug)
- if contest.state == '1':
- messages.info('The Contest has not started yet.')
- redirect('contests.views.index')
- if contest.state == '3':
- messages.info('The Contest has ended go to challenges tab or contest\'s main page')
- redirect('contests.views.index')
- except Contest.DoesNotExist:
- messages.warning('No contest with slug - {}'.format(contest_slug))
- return redirect('contests.views.index')
- else:
- is_in_contest = False
- # Get challenge or redirect according to in contest or challenge tab
- try:
- chal = Challenge.objects.get(slug=challenge_slug)
- except Challenge.DoesNotExist:
- if is_in_contest:
- messages.warning('No challenge with slug - {}'.format(contest_slug))
- return redirect('contests.views.contest_view', contest_slug=contest_slug)
- else:
- messages.warning('No challenge with slug - {}'.format(challenge_slug))
- return redirect('challenges.views.index')
- # Makes challenge inaccessible out of contest even when user try with url manipulation
- if chal.hidden and (not is_in_contest):
- messages.warning('No challenge with slug - {}'.format(challenge_slug))
- return redirect('challenges.views.index')
- # If user opens challenges other than the ones in contest through contest tab
- # redirect them away from getting unnecessary score
- if is_in_contest:
- if chal not in contest.challenge_set.all():
- messages.warning('No challenge with slug - {}'.format(challenge_slug))
- return redirect('contests.views.contest_view')
- # main challenge checking code
- # makes necessary changes to user challenge and ContestResult objects
- if request.method == 'POST':
- if request.user.is_authenticated():
- form = FlagForm(request.POST)
- if form.is_valid():
- if form.cleaned_data['flag'] == chal.flag:
- if chal not in request.user.userprofile.solved_challenges.all():
- request.user.userprofile.solved_challenges.add(chal)
- request.user.userprofile.save()
- chal.solve_count += 1
- chal.save()
- if is_in_contest:
- try:
- contest_result = ContestResult.objects.get(user=request.user.pk, contest=contest.pk)
- except ContestResult.DoesNotExist:
- return redirect('contests.views.contest_register')
- finally:
- if chal not in contest_result.solved_challenges.all():
- contest_result.solved_challenges.add(chal)
- contest_result.score += chal.score
- messages.success('You did it! You solved the challenge successfully!')
- else:
- messages.info('Sorry! You got it wrong. Try harder')
- else:
- messages.danger('You must be logged in to submit flags')
- form = FlagForm()
- return render(request, 'challenges/challenge.html', {'challenge': chal, 'form': form})
- else:
- form = FlagForm()
- return render(request, 'challenges/challenge.html', {'challenge': chal, 'form': form})
- # contests views
- from django.shortcuts import render, redirect
- from django.contrib import messages
- from .models import Contest
- from results.models import ContestResult
- from challenges.views import challenge
- from questionnaire.views import question
- def index(request):
- contests = Contest.objects.all()
- # may be make this client side by filtering state in templates
- yet_to_begin = contests.filter(state='1')
- ongoing = contests.filter(state='2')
- ended = contests.filter(state='3')
- return render(request, 'contests/index.html', {
- 'yet_to_begin': yet_to_begin, 'ongoing': ongoing, 'ended': ended})
- def contest_view(request, contest_slug):
- try:
- contest = Contest.objects.get(slug=contest_slug)
- except Contest.DoesNotExist:
- messages.warning(request, 'No contest with slug - {}'.format(contest_slug))
- return redirect('contests.views.index')
- if contest.state == '1':
- has_registered = check_registered_contests(request, contest)
- return render(request, 'contests/contest_1.html', {
- 'contest': contest, 'has_registered': has_registered})
- elif contest.state == '2':
- challenges = contest.challenge_set.all()
- return render(request, 'contests/contest_2.html', {
- 'contest': contest, 'challenges': challenges})
- elif contest.state == '3':
- challenges = contest.challenge_set.all()
- return render(request, 'contests/contest_3.html', {
- 'contest': contest, 'challenges': challenges})
- def challenge_solve(request, contest_slug, challenge_slug):
- return challenge(request, challenge_slug, contest_slug)
- def question_solve(request, contest_slug, quiz_slug, question_slug):
- return question(request, question_slug, quiz_slug, contest_slug)
- def contest_register(request, contest_slug):
- user = request.user
- try:
- contest = Contest.objects.get(slug=contest_slug)
- except Contest.DoesNotExist:
- messages.warning(request, 'No contest with slug - {}'.format(contest_slug))
- return redirect('contests.views.index')
- has_registered = check_registered_contests(request, contest)
- if not has_registered:
- contest_result = ContestResult.create(user, contest)
- contest_result.save()
- return redirect('contests.views.contest_view', contst_slug=contest_slug)
- def check_registered_contests(request, contest):
- try:
- contest_result = ContestResult.objects.get(user=request.user.pk,contest=contest.pk)
- has_registered = True
- except ContestResult.DoesNotExist:
- has_registered = False
- finally:
- return has_registered
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement