def get(self, game_id): game = Game.get_by_id(int(game_id)) if not game: self.response.out.write("Error: invalid game ID") logging.error("Invalid game ID: " + str(game_id)) return voters = Token.query(ndb.AND(Token.game == game.key, Token.used == True)).fetch(100) non_voters = Token.query(ndb.AND(Token.game == game.key, Token.used == False)).fetch(100) template = jinja_environment.get_template('templates/voters.html') params = {'voters':voters,'non_voters':non_voters,'game':game} self.response.out.write(template.render(params))
def get(self, token_string): token = Token.query(Token.value == token_string).get() if not token: template = jinja_environment.get_template("templates/error.html") self.response.out.write(template.render({'errmsg': "invalid voting token"})) return if token.used: template = jinja_environment.get_template("templates/error.html") self.response.out.write(template.render({'errmsg': "You've already voted!"})) return voter = token.voter.get(); game = token.game.get() players = ndb.get_multi(game.players) players.sort(key=lambda p: p.name) errmsg = None if self.request.get("err") == str(ERROR_DUPLICATE_VOTE): errmsg = "You can't vote for the same person twice" elif self.request.get("err") == str(ERROR_VOTE_FOR_SELF): errmsg = "You can't vote for yourself!" args = {'game':game, 'players':players, 'token':token.value, 'errmsg':errmsg, 'voter':voter} template = jinja_environment.get_template("templates/vote.html") self.response.out.write(template.render(args))
def post(self): token_string = self.request.get("token") num_votes = self.request.get("votes") token = Token.query(Token.value == token_string).get() if not token: return game = token.game.get() voter = token.voter.get() num_votes = self.request.get("votes") if num_votes == "1": votes_text = "1 vote" else: votes_text = num_votes + " votes" template = jinja_environment.get_template("templates/self_vote_email.txt") if game.team == Team.WOMEN: pronoun = "herself" else: pronoun = "himself" subject = "OUARFC: " + voter.name + " tried to give " + pronoun + " " + votes_text message = mail.EmailMessage(sender="OUARFC <*****@*****.**>", subject=subject) message.to = "*****@*****.**" message.body = template.render( {"name": voter.name, "opponent": game.opponent, "date": game.date, "pronoun": pronoun, "votes": votes_text} ) message.send() logging.info(message.body) vote = SelfVote(game=game.key, voter=voter.key) vote.put()
def delete_game(self, game): tokens = Token.query(Token.game == game.key) keys = [token.key for token in tokens] votes = Vote.query(Vote.game == game.key) keys.extend([vote.key for vote in votes]) votes = SelfVote.query(SelfVote.game == game.key) keys.extend([vote.key for vote in votes]) ndb.delete_multi_async(keys) game.key.delete()
def post(self): token_string = self.request.get("token") token = Token.query(Token.value == token_string).get() if not token: template = jinja_environment.get_template("templates/error.html") self.response.out.write(template.render({'errmsg': "invalid voting token"})) return if token.used: template = jinja_environment.get_template("templates/error.html") self.response.out.write(template.render({'errmsg': "You've already voted!"})) return game = token.game voter = token.voter three = self.request.get("three") two = self.request.get("two") one = self.request.get("one") if one in [two, three] or two == three: return self.redirect("/vote/" + token.value + "?err=" + str(ERROR_DUPLICATE_VOTE)) if str(voter.id()) in [one, two, three]: return self.redirect("/vote/" + token.value + "?err=" + str(ERROR_VOTE_FOR_SELF)) three_player = Player.get_by_id(int(three)) two_player = Player.get_by_id(int(two)) one_player = Player.get_by_id(int(one)) vote = Vote(game=game, three=three_player.key, two=two_player.key, one=one_player.key) token.used = True vote.put() token.put() template = jinja_environment.get_template('templates/success.html') self.response.out.write(template.render({}))
def post(self): player_id = self.request.get("player") game_id = self.request.get("game") player = Player.get_by_id(int(player_id)) game = Game.get_by_id(int(game_id)) token = Token.query(ndb.AND(Token.game == game.key, Token.voter == player.key)).get() if not token: logging.info("No token found for %s. Creating new token.", player.name) token_string = base64.urlsafe_b64encode(os.urandom(16)) token = Token(value=token_string, voter=player.key, game=game.key, used=False) token.put() else: logging.info("Token found for %s.", player.name) if token.used: logging.info("%s has already voted, not sending email.", player.name) return url = "http://vote.ouarfc.co.uk/vote/" + token.value if player.phone: logging.info("Sending SMS to %s", player.name) template = jinja_environment.get_template("templates/sms.txt") sms_data = { "ORIGINATOR": "OUARFC", "NUMBERS": player.phone, "BODY": template.render({"url": url, "opponent": game.opponent, "team": Team.getString(game.team)}), } response = urlfetch.fetch( "https://api.zensend.io/v3/sendsms", payload=urllib.urlencode(sms_data), method=urlfetch.POST, headers={"X-API-KEY": config.zensend_key}, ) content_type = response.headers["content-type"] if content_type is not None and "application/json" in content_type: result = json.loads(response.content) if "success" in result: logging.info("Successfully sent SMS to " + player.phone) if config.phone_only: # SMS was a success, don't send email return elif "failure" in result: failure = result["failure"] logging.error( "SMS send failed. Player: %s, phone: %s, parameter: %s, error code: %s, status code: %s", player.name, player.phone, failure["parameter"], failure["failcode"], response.status_code, ) else: logging.error("SMS send failed. Status code: %s", response.status_code) else: logging.error("SMS send failed. Status code: %s", response.status_code) template = jinja_environment.get_template("templates/email.txt") subject = "OUARFC: Please Vote For Best & Fairest" message = mail.EmailMessage(sender="OUARFC <*****@*****.**>", subject=subject) message.to = player.email message.body = template.render( { "name": player.name, "opponent": game.opponent, "date": game.date, "team": Team.getString(game.team), "url": url, } ) logging.info("Sending email to " + player.email) message.send() logging.info(message.body)