Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.28 KB | None | 0 0
  1. # challenges view
  2. from django.shortcuts import render, redirect
  3. from django.core.exceptions import ObjectDoesNotExist
  4. from django.contrib import messages
  5.  
  6. from results.models import ContestResult
  7. from contests.models import Contest
  8. from .forms import FlagForm
  9. from .models import Challenge, Tag
  10.  
  11.  
  12. def index(request):
  13. tag_name = request.GET.get('tag')
  14.  
  15. sort = request.GET.get('sort')
  16. if sort not in ['name', 'modified', 'created', 'score']:
  17. sort = 'created'
  18.  
  19. if tag_name:
  20. try:
  21. tag = Tag.objects.get(name=tag_name)
  22. except ObjectDoesNotExist:
  23. messages.info('Tag {} does not exist! Showing all challenges instead.'.format(tag_name))
  24. challenges = Challenge.objects.all().order_by(sort)
  25. else:
  26. challenges = tag.challenge_set.all().filter(hidden=False).order_by(sort)
  27. else:
  28. challenges = Challenge.objects.all().filter(hidden=False).order_by(sort)
  29.  
  30. return render(request, 'challenges/index.html', {'challenges': challenges})
  31.  
  32.  
  33. def tags(request):
  34. tags = Tag.objects.all()
  35. return render(request, 'challenges/tags.html', {'tags': tags})
  36.  
  37.  
  38. def challenge(request, challenge_slug, contest_slug=None):
  39. # Get contest object or redirect to contests.views.index
  40. if contest_slug is not None:
  41. is_in_contest = True
  42. try:
  43. contest = Contest.objects.get(slug=contest_slug)
  44. if contest.state == '1':
  45. messages.info('The Contest has not started yet.')
  46. redirect('contests.views.index')
  47. if contest.state == '3':
  48. messages.info('The Contest has ended go to challenges tab or contest\'s main page')
  49. redirect('contests.views.index')
  50. except Contest.DoesNotExist:
  51. messages.warning('No contest with slug - {}'.format(contest_slug))
  52. return redirect('contests.views.index')
  53. else:
  54. is_in_contest = False
  55.  
  56. # Get challenge or redirect according to in contest or challenge tab
  57. try:
  58. chal = Challenge.objects.get(slug=challenge_slug)
  59. except Challenge.DoesNotExist:
  60. if is_in_contest:
  61. messages.warning('No challenge with slug - {}'.format(contest_slug))
  62. return redirect('contests.views.contest_view', contest_slug=contest_slug)
  63. else:
  64. messages.warning('No challenge with slug - {}'.format(challenge_slug))
  65. return redirect('challenges.views.index')
  66.  
  67. # Makes challenge inaccessible out of contest even when user try with url manipulation
  68. if chal.hidden and (not is_in_contest):
  69. messages.warning('No challenge with slug - {}'.format(challenge_slug))
  70. return redirect('challenges.views.index')
  71.  
  72. # If user opens challenges other than the ones in contest through contest tab
  73. # redirect them away from getting unnecessary score
  74. if is_in_contest:
  75. if chal not in contest.challenge_set.all():
  76. messages.warning('No challenge with slug - {}'.format(challenge_slug))
  77. return redirect('contests.views.contest_view')
  78.  
  79. # main challenge checking code
  80. # makes necessary changes to user challenge and ContestResult objects
  81. if request.method == 'POST':
  82. if request.user.is_authenticated():
  83. form = FlagForm(request.POST)
  84. if form.is_valid():
  85. if form.cleaned_data['flag'] == chal.flag:
  86. if chal not in request.user.userprofile.solved_challenges.all():
  87. request.user.userprofile.solved_challenges.add(chal)
  88. request.user.userprofile.save()
  89. chal.solve_count += 1
  90. chal.save()
  91. if is_in_contest:
  92. try:
  93. contest_result = ContestResult.objects.get(user=request.user.pk, contest=contest.pk)
  94. except ContestResult.DoesNotExist:
  95. return redirect('contests.views.contest_register')
  96. finally:
  97. if chal not in contest_result.solved_challenges.all():
  98. contest_result.solved_challenges.add(chal)
  99. contest_result.score += chal.score
  100.  
  101. messages.success('You did it! You solved the challenge successfully!')
  102. else:
  103. messages.info('Sorry! You got it wrong. Try harder')
  104. else:
  105. messages.danger('You must be logged in to submit flags')
  106. form = FlagForm()
  107. return render(request, 'challenges/challenge.html', {'challenge': chal, 'form': form})
  108.  
  109. else:
  110. form = FlagForm()
  111.  
  112. return render(request, 'challenges/challenge.html', {'challenge': chal, 'form': form})
  113.  
  114. # contests views
  115.  
  116. from django.shortcuts import render, redirect
  117. from django.contrib import messages
  118.  
  119. from .models import Contest
  120. from results.models import ContestResult
  121. from challenges.views import challenge
  122. from questionnaire.views import question
  123.  
  124.  
  125. def index(request):
  126. contests = Contest.objects.all()
  127. # may be make this client side by filtering state in templates
  128. yet_to_begin = contests.filter(state='1')
  129. ongoing = contests.filter(state='2')
  130. ended = contests.filter(state='3')
  131. return render(request, 'contests/index.html', {
  132. 'yet_to_begin': yet_to_begin, 'ongoing': ongoing, 'ended': ended})
  133.  
  134.  
  135. def contest_view(request, contest_slug):
  136. try:
  137. contest = Contest.objects.get(slug=contest_slug)
  138. except Contest.DoesNotExist:
  139. messages.warning(request, 'No contest with slug - {}'.format(contest_slug))
  140. return redirect('contests.views.index')
  141.  
  142. if contest.state == '1':
  143. has_registered = check_registered_contests(request, contest)
  144. return render(request, 'contests/contest_1.html', {
  145. 'contest': contest, 'has_registered': has_registered})
  146. elif contest.state == '2':
  147. challenges = contest.challenge_set.all()
  148. return render(request, 'contests/contest_2.html', {
  149. 'contest': contest, 'challenges': challenges})
  150. elif contest.state == '3':
  151. challenges = contest.challenge_set.all()
  152. return render(request, 'contests/contest_3.html', {
  153. 'contest': contest, 'challenges': challenges})
  154.  
  155.  
  156. def challenge_solve(request, contest_slug, challenge_slug):
  157. return challenge(request, challenge_slug, contest_slug)
  158.  
  159.  
  160. def question_solve(request, contest_slug, quiz_slug, question_slug):
  161. return question(request, question_slug, quiz_slug, contest_slug)
  162.  
  163.  
  164. def contest_register(request, contest_slug):
  165. user = request.user
  166.  
  167. try:
  168. contest = Contest.objects.get(slug=contest_slug)
  169. except Contest.DoesNotExist:
  170. messages.warning(request, 'No contest with slug - {}'.format(contest_slug))
  171. return redirect('contests.views.index')
  172. has_registered = check_registered_contests(request, contest)
  173. if not has_registered:
  174. contest_result = ContestResult.create(user, contest)
  175. contest_result.save()
  176. return redirect('contests.views.contest_view', contst_slug=contest_slug)
  177.  
  178.  
  179. def check_registered_contests(request, contest):
  180. try:
  181. contest_result = ContestResult.objects.get(user=request.user.pk,contest=contest.pk)
  182. has_registered = True
  183. except ContestResult.DoesNotExist:
  184. has_registered = False
  185. finally:
  186. return has_registered
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement