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
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}
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