Example #1
0
 def test_get_team_solved_subquery(self):
     t = self.make_team()
     c1 = self.make_challenge()
     c2 = self.make_challenge()
     s1 = Submission(challenge=c1, team=t)
     self.dbsession.add_all([s1, c2])
     self.dbsession.flush()
     query = get_team_solved_subquery(t.id)
     query = self.dbsession.query(query)
     assert query.count() == 1
     exists, = query.first()
     assert exists
Example #2
0
 def challenges(self):
     """
     A list of all challenges similar to the scoreboard view in a table.
     It has a very complex query that gets all challennges together with
     a boolean of whether the current team has solved it, and the number
     of times this challenge was solved overall. This list of tuples
     ``(challenge, team_solved, number_solved_total)`` is then given to the
     template and rendered.
     """
     team_id = self.request.authenticated_userid
     team_solved_subquery = get_team_solved_subquery(team_id)
     number_of_solved_subquery = get_number_solved_subquery()
     challenges = (DBSession.query(
         Challenge, team_solved_subquery, number_of_solved_subquery).
         options(joinedload("category")).
         filter(Challenge.published).
         order_by(Challenge.id))
     return {'challenges': challenges}
Example #3
0
 def challenge(self):
     """
     A view of a single challenge. The query is very similar to that of
     :meth:`challenges` with the limitation that only one challenge is
     fetched. Additionally, this page displays a form to enter the solution
     of that challenge and fetches a list of announcements for the
     challenge.
     """
     challenge_id = int(self.request.matchdict["id"])
     team_id = self.request.authenticated_userid
     team_solved_subquery = get_team_solved_subquery(team_id)
     try:
         challenge, is_solved = (
             DBSession.query(Challenge, team_solved_subquery).
             filter(Challenge.id == challenge_id).
             filter(Challenge.published).one()
         )
     except NoResultFound:
         self.request.session.flash("Challenge not found or published.")
         return HTTPFound(location=self.request.route_url('challenges'))
     form = SolutionSubmitForm(self.request.POST, csrf_context=self.request)
     retparams = {'challenge': challenge,
                  'form': form,
                  'is_solved': is_solved,
                  }
     # solved or after CTF
     feedback_obj = None
     if is_solved or (CTF_ENDED, True) == self.current_state:
         feedback_obj = (
             DBSession.query(Feedback).
             filter(Feedback.team_id == self.request.team.id).
             filter(Feedback.challenge_id == challenge.id).
             first())
         if not feedback_obj:
             feedback_obj = Feedback(team_id=self.request.team.id,
                                     challenge_id=challenge.id)
             DBSession.add(feedback_obj)
         retparams['feedback'] = FeedbackForm(
             self.request.POST, obj=feedback_obj,
             csrf_context=self.request)
     if self.request.method == 'POST':
         if 'submit_feedback' in self.request.POST:
             if not retparams['feedback'].validate():
                 return retparams
             if feedback_obj:
                 retparams['feedback'].populate_obj(feedback_obj)
                 self.request.session.flash(
                     'Thanks for your feedback. You can edit it at any '
                     'point.')
         else:
             if not form.validate():
                 return retparams
             is_solved, msg = check_submission(
                 challenge, form.solution.data, self.request.team,
                 self.request.settings)
             self.request.session.flash(msg,
                                        'success' if is_solved else 'error')
         return HTTPFound(location=self.request.route_url('challenge',
                                                          id=challenge.id)
                          )
     return retparams