def handleSave(self, action):
        """Handles the Edit action of the form"""
        data, errors = self.extractData()
        #If all validators are ok: proceed
        if len(errors) == 0:
            #get the session from z3c.sacofig
            session = named_scoped_session('footballchallenge')
            event_id = session.query(Event).filter(
                Event.deadline > datetime.now()).one().id_
            #get the userid we need it to find the right team
            membershiptool = getToolByName(self.context, 'portal_membership')
            userid = membershiptool.getAuthenticatedMember().getId()
            if not session.query(Team).filter_by(user_id=userid).filter_by(event_id=event_id).all():
                #create the team if it doesn't exist.
                team = Team(userid, event_id, name=data['name'])
                session.add(team)                
            else:
                team = session.query(Team).filter_by(user_id=userid).filter_by(event_id=event_id).one()
            session.query(Teams_Players).filter(Teams_Players.team_id==\
            team.id_).delete()
            team.name = data['name']
            nations = []
            all_nations = []
            for k, v in data.items():
                if not k == 'name' and v:
                    player = session.query(Player).filter(Player.id_ == v).one()
                    #Create relationsship between Team and Player
                    if bool(not 'substitute' in k):
                        if not player.nation_id in nations:
                            nations.append(player.nation_id)
                        if not player.nation_id in all_nations:
                            all_nations.append(player.nation_id)
                    else:
                        if not player.nation_id in all_nations:
                            all_nations.append(player.nation_id)

                    team.players.append(Teams_Players(team.id_, player,
                                        bool(not 'substitute' in k)))

            if len(nations) >= 6 and len(all_nations) >=12 and len(team.players) == 22:
                team.valid = True
            else:
                msg = _(u'label_not_valid', default=u'Your Team is not valid and will not receive any points')
                IStatusMessage(self.request).addStatusMessage(
                    msg, type='warning')
                team.valid = False

            msg = _(u'label_changes_saved', default=u'Your changes are saved successfully')
            IStatusMessage(self.request).addStatusMessage(
                msg, type='info')

            return self.request.RESPONSE.redirect(self.context.absolute_url()+'/team_overview')
 def __call__(self):
     session = named_scoped_session('footballchallenge')
     if not session.query(Event).filter(Event.deadline > datetime.now()).all():
         msg = _(u'label_not_edit', default="The Event has started. You can't edit your Team now.")
         IStatusMessage(self.request).addStatusMessage(
             msg, type='error')
         return self.request.response.redirect(self.context.absolute_url())
     else:
         return super(EditTeamForm, self).__call__()
    def get_tabs(self):
        tabs = []
        session = named_scoped_session("footballchallenge")
        event_id = session.query(Event).all()[-1].id_
        leagues = session.query(League).filter(League.event_id == event_id).all()

        for league in leagues:
            self.register_league_tab(league)
            tabs.append({'id': _('league-%i' % league.id_, default=league.name),
                         'class': ''})

        return tabs
 def handleImport(self, action):
     data, errors = self.extractData()
     if len(errors) == 0:
         name = data['name']
         event = data['event']
         session = named_scoped_session('footballchallenge')
         league = League(name, event)
         session.add(league)
         portal_actions = getToolByName(self.context, 'portal_actions')
         transaction.commit()
         msg = _(u'league_created', default=u'League created successfully')
         IStatusMessage(self.request).addStatusMessage(
             msg, type='information')
         return self.request.RESPONSE.redirect(self.context.absolute_url()+'/ranking/'+str(league.id_))
 def handleImport(self, action):
     data, errors = self.extractData()
     if len(errors) == 0:
         session = named_scoped_session('footballchallenge')
         league = session.query(League).filter(League.id_ == self.league_id).one()
         teams = []
         event_id = session.query(Event).order_by(desc(Event.deadline)).first().id_
         for user_id in data['teams']:
             if session.query(Team).filter(Team.user_id == user_id).all():
                 team = session.query(Team).filter(Team.user_id == user_id).one()
             else:
                 team = Team(user_id, event_id)
                 session.add(team)
             teams.append(team)
         league.teams = teams
         msg = _(u'label_teams_assign', default=u'Teams were assigned successfully.')
         IStatusMessage(self.request).addStatusMessage(
             msg, type='information')
         return self.request.RESPONSE.redirect(self.context.absolute_url() + '/assign_users/'+self.league_id)
    def player_only_once(data):
        """A Validator that checks if every Player is only used once"""
        keys = EditTeamSchema
        playerset = set([getattr(data, name) for name in keys.names()])
        playerlist = [getattr(data, name) for name in keys.names()]
        if len(playerset) == len(keys.names()):
            return True
        double_players = [x for x in playerset if playerlist.count(x) > 1]
        playernames = ''
        session = named_scoped_session('footballchallenge')
        if len(double_players) == 1:
            if not double_players[0]:
                return True
        for player_id in double_players:
            if player_id:
                playernames += session.query(Player).filter(
                    Player.id_ == player_id).one().name

        raise Invalid(_(u"You can't use the player ${players} multiple times", mapping={'players':playernames}))
    def get_log(self):
        """Returns a Log with all Events that
           influenced the Points of a Player

        """
        #TODO: Check if we can refactor this. The code looks bloody awful
        session = named_scoped_session('footballchallenge')
        log = []
        #get right mapping
        if self.position == "striker":
            mapping = POINT_MAPPING_STRIKER
        elif self.position == "midfield":
            mapping = POINT_MAPPING_MIDFIELD
        elif self.position == "defender":
            mapping = POINT_MAPPING_DEFENDER
        else:
            mapping = POINT_MAPPING_KEEPER
        #get all games where this player played
        games = session.query(Game).filter(Game.players.any(
            id_=self.id_)).order_by(Game.date).all()
        for game in games:
            if game.nation1 == self.nation:
                enemy = game.nation2
            else:
                enemy = game.nation1

            #get his cards for this game
            cards = self.get_cards(session, game.id_)
            if cards:
                log.append([cards[0], mapping[cards[0].color.lower()], cards[0].color.encode('utf-8')+ ' Card'])
            goals = self.get_goals(session, game.id_)
            #get his goals
            if goals:
                for goal in goals:
                    if goal.is_penalty == False:
                        log.append([goal, mapping['goal'],
                                   _(u'label_goal', default=u'Goal vs ${enemy}', mapping=dict(enemy=enemy.name))])
                    else:
                        log.append([goal, mapping['penalty'],
                                   _(u'label_penalty_log', default=u'Penalty vs ${enemy}', mapping=dict(enemy=enemy.name))])

            assists = self.get_assists(session, game.id_)
            if assists:
                for assist in assists:
                    log.append([assist, mapping['assist'],
                                _(u'label_assist', default=u'Assist vs ${enemy}', mapping=dict(enemy=enemy.name))])
            saves = self.get_saves(session, game.id_)
            if saves:
                for save in saves:
                    log.append([save, mapping['save'],
                    _(u'label_save_log', default=u'Save vs ${enemy}', mapping=dict(enemy=enemy.name))])

            #distribute points for victory, draw and loss
            if game.nation1 == self.nation:
                if game.score_nation1 > game.score_nation2:
                    log.append([game, mapping['victory'], _(u'label_victory', default=u'Victory vs ${nation}', mapping=dict(nation=game.nation2.name))])
                elif game.score_nation1 == game.score_nation2:
                    log.append([game, mapping['draw'],_(u'label_draw', default=u'Draw vs ${nation}', mapping=dict(nation=game.nation2.name))])
                elif game.score_nation1 < game.score_nation2:
                    log.append([game, mapping['loss'], _(u'label_loss', default=u'Loss vs ${nation}', mapping=dict(nation=game.nation2.name))])
                if self.position == "defender" or self.position == "keeper":
                    if game.score_nation2 == 0:
                        log.append([game, mapping['no_goals'],
                                   _(u'label_nogoals', default=u'No Goals received')])
                    elif game.score_nation2 >=3:
                        log.append([game, mapping['3_goals'], _(u'label_3goals', default=u'3 Goals received')])
            else:
                if game.score_nation1 > game.score_nation2:
                    log.append([game, mapping['loss'], _(u'label_loss', default=u'Loss vs ${nation}', mapping=dict(nation=game.nation1.name))])
                elif game.score_nation1 == game.score_nation2:
                    log.append([game, mapping['draw'],
                               _(u'label_draw', default=u'Draw vs ${nation}', mapping=dict(nation=game.nation1.name))])
                elif game.score_nation1 < game.score_nation2:
                    log.append([game, mapping['victory'],
                               _(u'label_victory', default=u'Victory vs ${nation}', mapping=dict(nation=game.nation1.name))])
                if self.position == "defender" or self.position == "keeper":
                    if game.score_nation1 == 0:
                        log.append([game, mapping['no_goals'],
                                   _(u'label_nogoals', default=u'No Goals received')])
                    elif game.score_nation1 >=3:
                        log.append([game, mapping['3_goals'], _(u'label_3goals', default=u'3 Goals received')])
        return log
        self.calculated = calculated
    def __repr__(self):
        return '<Game %s-%s>' % (self.nation1.country, self.nation2.country)

    def has_penalty(self):
        penaltys = []
        for goal in self.goals:
            if goal.is_penalty:
                penaltys.append(goal)
        return bool(penaltys)

    def get_penalty(self):
        total_nation1_score = self.score_nation1
        total_nation2_score = self.score_nation2
        for goal in self.goals:
            if goal.is_penalty:
                if goal.player.nation_id == self.nation1_id:
                    total_nation1_score += 1
                else:
                    total_nation2_score += 1
        return '('+str(total_nation1_score)+':'+str(total_nation2_score)+' n.P.)'


RoundVocabulary = SimpleVocabulary(
    [SimpleTerm(value=u'group1', title=_(u'label_group1', default=u'Group1')),
     SimpleTerm(value=u'group2', title=_(u'label_group2', default=u'Group2')),
     SimpleTerm(value=u'group3', title=_(u'label_group3', default=u'Group3')),
     SimpleTerm(value=u'roundof16', title=_(u'label_roundof16', default=u'Round of Sixteen')),
     SimpleTerm(value=u'quarterfinals', title=_(u'label_quarterfinals', default=u'Quarterfinals')),
     SimpleTerm(value=u'semifinals', title=_(u'label_semifinals', default=u'Semifinals')),
     SimpleTerm(value=u'finals', title=_(u'label_finals', default=u'Finals'))])