def get(self):
     self.dummy = dummyFactory()
     self.ims = ImsConnectorFactory(LqfbDB)
     self.ims.connect(host=conf['lqfb.host'],
                      password=conf['lqfb.password'])
     self.getIssuesForVoting()
     self.getPublicVotes()
     self.getIssuesToCalculate()
     self.calculateResults()
     self.returnResults()
     self.write("Execution of periodic tasks completed.")
    def post(self):
        """Process the submitted votes and save them in our DummyDB"""
        # First we need to check user credentials. This is done against the source
        # database (e.g. Liquid Feedback).
        username = self.get_argument('username')
        password = self.get_argument('password')
        ims = ImsConnectorFactory(LqfbDB)
        ims.connect(host=conf['lqfb.host'], password=conf['lqfb.password'])
        user_id = ims.userAuthentication(username, password)
        if not user_id:
            raise tornado.web.HTTPError(
                401,
                "To vote, please provide your Liquid Feedback username and password."
            )

        # Fetch issue that is voted on, we need it already
        dummy = dummyFactory()
        issue = dummy.getIssue(self.get_argument('issue_id'))
        # remove wrapper object
        issue = issue.getIssue()

        # Check that issue is in voting state
        if not issue['state'] == 'voting':
            raise tornado.web.HTTPError(
                400,
                'Issue %s is not in "voting" state.' % issue['issue']['id'])

        # Check authorization
        if not ims.userAuthorization(user_id, issue['unit']['id']):
            raise tornado.web.HTTPError(
                403,
                "User '%s' is not authorized to vote in unit <em>%s</em>" %
                (username, issue['unit']['name']))

        if self.get_argument('vote_type') == 'direct':
            # Get user score for each initiative in issue
            scores = {}
            for ini in issue['initiatives']:
                arg = "i" + str(ini['id'])
                value = int(self.get_argument(arg))
                scores[int(ini['id'])] = value

            # Check that values are within allowed range.
            # Rules:
            """You can give the same score to more than one alternative.
        But the scores cannot contain gaps. For example... <br />
        This is allowed: (+1, 0, -1) <br />
        This is also allowed: (+1, +1, 0) <br />
        but this is not allowed: (+2, 0, -1) <br />
        ...since in the latter there is no score +1.<br />
        Note that 0 exists always due to 
        Status Quo, so all your scores have to be around 0: ...+2, +1, 0, -1, -2...
        """
            #Speaking of which, need to add the Status Quo
            scores[None] = 0
            # Now we can check for a consecutive range
            v_list = [v for (k, v) in scores.items()]
            v_list.sort()
            previous = v_list[0]
            for v in v_list:
                if v != previous and v != previous + 1:
                    raise tornado.web.HTTPError(
                        400,
                        'Illegal scores in your vote (there is a gap in the values): '
                        + ", ".join(str(x) for x in v_list))
                previous = v
            # With my logic, the above is also a sufficient check that values are between
            # -nr_ini ... nr_ini

            # We don't actually save the Status Quo vote to database:
            del (scores[None])
            # Now save the vote
            dummy.saveVote(user_id, self.get_argument('issue_id'), scores,
                           'direct')
            self.write(
                "Your vote was saved successfully. Thank you for voting!")
        elif self.get_argument('vote_type') == 'delegated':
            trustee_id = ims.getUserId(
                self.get_argument('trustee_identification'), 'identification')
            if trustee_id:
                dummy.saveVote(user_id, self.get_argument('issue_id'),
                               trustee_id, 'delegated')
                self.write(
                    "Your vote was saved successfully. Thank you for voting!")
            else:
                raise tornado.web.HTTPError(
                    400,
                    'Cannot delegate vote. No such member in this voting system: %s'
                    % self.get_argument('trustee_identification'))
        else:
            raise tornado.web.HTTPError(
                400, 'Invalid vote_type: %s' % self.get_argument('vote_type'))