def on_start(self, poll):
        if type(poll) == MotionPoll and Ballot:
            ballot = Ballot(poll)
            ballot.create_absentee_ballots()

        # Get candidate name (if is an election with one candidate only)
        candidate_str = ''
        if (type(poll) == AssignmentPoll) and (AssignmentOption.objects.filter(
                poll=poll).all().count() == 1):
            candidate = AssignmentOption.objects.filter(poll=poll)[0].candidate
            candidate_str = "<div class='spacer candidate'>" + str(
                candidate) + "</div>"

        # Show voting prompt on projector.
        projector = Projector.objects.get(id=1)
        projector.config[self.voting_key] = {
            'name':
            'voting/prompt',
            'message':
            _(config['votecollector_vote_started_msg']) + "<br>" +
            "<span class='nobr'><img src='/static/img/button-yes.png'> " +
            _('Yes') + "</span> &nbsp; " +
            "<span class='nobr'><img src='/static/img/button-no.png'> " +
            _('No') + "</span> &nbsp; " +
            "<span class='nobr'><img src='/static/img/button-abstain.png'> " +
            _('Abstain') + "</span>" + candidate_str,
            'visible':
            True,
            'stable':
            True
        }
        projector.save(information={'votecollector_voting_msg_toggled': True})
Esempio n. 2
0
    def on_start(self, poll):
        if type(poll) == MotionPoll and Ballot:
            ballot = Ballot(poll)
            ballot.create_absentee_ballots()

        # Get candidate name (if is an election with one candidate only)
        candidate_str = ''
        if (type(poll) == AssignmentPoll) and (AssignmentOption.objects.filter(poll=poll).all().count() == 1):
            candidate = AssignmentOption.objects.filter(poll=poll)[0].candidate
            candidate_str = "<div class='spacer candidate'>" + str(candidate) + "</div>"

        # Show voting prompt on projector.
        projector = Projector.objects.get(id=1)
        projector.config[self.voting_key] = {
            'name': 'voting/prompt',
            'message' : _(config['votecollector_vote_started_msg']) +
                "<br>" +
                "<span class='nobr'><img src='/static/img/button-yes.png'> " + _('Yes') + "</span> &nbsp; " +
                "<span class='nobr'><img src='/static/img/button-no.png'> " + _('No') + "</span> &nbsp; " +
                "<span class='nobr'><img src='/static/img/button-abstain.png'> " + _('Abstain') + "</span>" +
                candidate_str,
            'visible': True,
            'stable': True
        }
        projector.save(information={'votecollector_voting_msg_toggled': True})
    def post(self, request, poll_id, keypad_id):
        keypad = super(VoteCallback, self).post(request, poll_id, keypad_id)
        if keypad is None:
            return HttpResponse(_('Vote rejected'))

        # Validate vote value.
        value = request.POST.get('value')
        if value not in ('Y', 'N', 'A'):
            return HttpResponse(_('Vote invalid'))

        # Save vote.
        vc = VoteCollector.objects.get(id=1)
        model = MotionPoll if vc.voting_mode == 'MotionPoll' else AssignmentPoll
        try:
            poll = model.objects.get(id=poll_id)
        except model.DoesNotExist:
            return HttpResponse(_('Vote rejected'))

        if vc.voting_mode == 'MotionPoll':
            is_valid_keypad = 1
            if Ballot:
                ballot = Ballot(poll)
                is_valid_keypad = ballot.register_vote(keypad_id, value) > 0
            if is_valid_keypad:
                try:
                    conn = MotionPollKeypadConnection.objects.get(
                        poll=poll, keypad=keypad)
                except MotionPollKeypadConnection.DoesNotExist:
                    conn = MotionPollKeypadConnection()
                    conn.poll = poll
                    conn.keypad = keypad
                conn.serial_number = request.POST.get('sn')
                conn.value = value
                conn.save()
            else:
                return HttpResponse(_('Vote rejected'))

        else:
            try:
                conn = AssignmentPollKeypadConnection.objects.get(
                    poll=poll, keypad=keypad)
            except AssignmentPollKeypadConnection.DoesNotExist:
                conn = AssignmentPollKeypadConnection()
                conn.poll = poll
                conn.keypad = keypad
            conn.serial_number = request.POST.get('sn')
            conn.value = value
            conn.save()

        # Update votecollector.
        vc.votes_received = request.POST.get('votes', 0)
        vc.voting_duration = request.POST.get('elapsed', 0)
        vc.save()

        return HttpResponse(_('Vote submitted'))
Esempio n. 4
0
    def post(self, request, poll_id, keypad_id):
        keypad = super(VoteCallback, self).post(request, poll_id, keypad_id)
        if keypad is None:
            return HttpResponse(_('Vote rejected'))

        # Validate vote value.
        value = request.POST.get('value')
        if value not in ('Y', 'N', 'A'):
            return HttpResponse(_('Vote invalid'))

        # Save vote.
        vc = VoteCollector.objects.get(id=1)
        model = MotionPoll if vc.voting_mode == 'MotionPoll' else AssignmentPoll
        try:
            poll = model.objects.get(id=poll_id)
        except model.DoesNotExist:
            return HttpResponse(_('Vote rejected'))

        if vc.voting_mode == 'MotionPoll':
            is_valid_keypad = 1
            if Ballot:
                ballot = Ballot(poll)
                is_valid_keypad = ballot.register_vote(keypad_id, value) > 0
            if is_valid_keypad:
                try:
                    conn = MotionPollKeypadConnection.objects.get(poll=poll, keypad=keypad)
                except MotionPollKeypadConnection.DoesNotExist:
                    conn = MotionPollKeypadConnection()
                    conn.poll = poll
                    conn.keypad = keypad
                conn.serial_number = request.POST.get('sn')
                conn.value = value
                conn.save()
            else:
                return HttpResponse(_('Vote rejected'))

        else:
            try:
                conn = AssignmentPollKeypadConnection.objects.get(poll=poll, keypad=keypad)
            except AssignmentPollKeypadConnection.DoesNotExist:
                conn = AssignmentPollKeypadConnection()
                conn.poll = poll
                conn.keypad = keypad
            conn.serial_number = request.POST.get('sn')
            conn.value = value
            conn.save()

        # Update votecollector.
        vc.votes_received = request.POST.get('votes', 0)
        vc.voting_duration = request.POST.get('elapsed', 0)
        vc.save()

        return HttpResponse(_('Vote submitted'))
Esempio n. 5
0
    def clear_votes(self, poll):
        # poll is MotionPoll or AssignmentPoll
        if poll.has_votes():
            poll.get_votes().delete()
            poll.votescast = poll.votesinvalid = poll.votesvalid = None
            poll.save()

        model = MotionPollKeypadConnection if type(poll) == MotionPoll else AssignmentPollKeypadConnection
        # collect all votes of the poll (with their collection_string and id)
        args = []
        for instance_dict in model.objects.filter(poll=poll).values('pk'):
            pk = instance_dict['pk']
            args.append((model.get_collection_string(), pk))
        model.objects.filter(poll=poll).delete()
        # trigger autoupdate
        if len(args) > 0:
            inform_deleted_data(args)

        if Ballot and type(poll) == MotionPoll:
            ballot = Ballot(poll)
            ballot.delete_ballots()
Esempio n. 6
0
 def get(self, request, *args, **kwargs):
     poll = self.get_poll_object()
     if not self.error:
         vc = VoteCollector.objects.get(id=1)
         if vc.voting_mode == kwargs['model'] and vc.voting_target == int(kwargs['id']):
             if vc.voting_mode == 'AssignmentPoll' and poll.pollmethod == 'votes':
                 # Calculate vote result.
                 self.result = {
                     'invalid': 0,
                     'valid': 0
                 }
                 for option in poll.get_options().all():
                     self.result['vote_' + str(option.candidate_id)] = 0
                 for conn in AssignmentPollKeypadConnection.objects.filter(poll_id=vc.voting_target):
                     key = 'vote_' + str(conn.candidate_id)
                     if conn.candidate and key in self.result:
                         self.result[key] += 1
                         self.result['valid'] += 1
                     else:
                         self.result['invalid'] += 1
             elif vc.voting_mode == 'MotionPoll' and Ballot:
                 ballot = Ballot(poll)
                 result = ballot.count_votes()
                 # print(result)
                 self.result = [
                     int(result['Y'][1]),
                     int(result['N'][1]),
                     int(result['A'][1])
                 ]
             else:
                 # Get vote result from votecollector.
                 try:
                     self.result = get_voting_result()
                 except VoteCollectorError as e:
                     self.error = e.value
         else:
             self.error = _('Another voting is active.')
     return super(VotingResult, self).get(request, *args, **kwargs)
    def clear_votes(self, poll):
        # poll is MotionPoll or AssignmentPoll
        if poll.has_votes():
            poll.get_votes().delete()
            poll.votescast = poll.votesinvalid = poll.votesvalid = None
            poll.save()

        model = MotionPollKeypadConnection if type(
            poll) == MotionPoll else AssignmentPollKeypadConnection
        # collect all votes of the poll (with their collection_string and id)
        args = []
        for instance_dict in model.objects.filter(poll=poll).values('pk'):
            pk = instance_dict['pk']
            args.append(model.get_collection_string())
            args.append(pk)
        model.objects.filter(poll=poll).delete()
        # trigger autoupdate
        if args:
            inform_deleted_data(*args)

        if Ballot and type(poll) == MotionPoll:
            ballot = Ballot(poll)
            ballot.delete_ballots()
 def get(self, request, *args, **kwargs):
     poll = self.get_poll_object()
     if not self.error:
         vc = VoteCollector.objects.get(id=1)
         if vc.voting_mode == kwargs['model'] and vc.voting_target == int(
                 kwargs['id']):
             if vc.voting_mode == 'AssignmentPoll' and poll.pollmethod == 'votes':
                 # Calculate vote result.
                 self.result = {'invalid': 0, 'valid': 0}
                 for option in poll.get_options().all():
                     self.result['vote_' + str(option.candidate_id)] = 0
                 for conn in AssignmentPollKeypadConnection.objects.filter(
                         poll_id=vc.voting_target):
                     key = 'vote_' + str(conn.candidate_id)
                     if conn.candidate and key in self.result:
                         self.result[key] += 1
                         self.result['valid'] += 1
                     else:
                         self.result['invalid'] += 1
             elif vc.voting_mode == 'MotionPoll' and Ballot:
                 ballot = Ballot(poll)
                 result = ballot.count_votes()
                 # print(result)
                 self.result = [
                     int(result['Y'][1]),
                     int(result['N'][1]),
                     int(result['A'][1])
                 ]
             else:
                 # Get vote result from votecollector.
                 try:
                     self.result = get_voting_result()
                 except VoteCollectorError as e:
                     self.error = e.value
         else:
             self.error = _('Another voting is active.')
     return super(VotingResult, self).get(request, *args, **kwargs)
Esempio n. 9
0
    def post(self, request, poll_id):
        # Get poll instance.
        vc = VoteCollector.objects.get(id=1)
        if vc.voting_mode == 'MotionPoll':
            poll_model = MotionPoll
            conn_model = MotionPollKeypadConnection
        else:
            poll_model = AssignmentPoll
            conn_model = AssignmentPollKeypadConnection
        try:
            poll = poll_model.objects.get(id=poll_id)
        except poll_model.DoesNotExist:
            return HttpResponse('')

        # Get ballot instance.
        ballot = Ballot(poll) if Ballot else None

        # Load json list from request body.
        votes = json.loads(request.body.decode('utf-8'))
        keypad_set = set()
        connections = []
        for vote in votes:
            keypad_id = vote['id']
            try:
                keypad = Keypad.objects.get(keypad_id=keypad_id)
            except Keypad.DoesNotExist:
                continue

            # Mark keypad as in range and update battery level.
            keypad.in_range = True
            keypad.battery_level = vote['bl']
            keypad.save(skip_autoupdate=True)

            # Validate vote value.
            value = vote['value']
            if value not in ('Y', 'N', 'A'):
                continue

            # Write ballot and poll keypad connection.
            is_valid_keypad = True
            if ballot and vc.voting_mode == 'MotionPoll':
                # TODO: Ballot currently only implemented for MotionPoll.
                is_valid_keypad = ballot.register_vote(keypad_id, value, commit=False) > 0
            if is_valid_keypad:
                try:
                    conn = conn_model.objects.get(poll=poll, keypad=keypad)
                except conn_model.DoesNotExist:
                    conn = conn_model(poll=poll, keypad=keypad)
                conn.serial_number = vote['sn']
                conn.value = value
                if conn.pk:
                    # Save updated connection.
                    conn.save(skip_autoupdate=True)
                else:
                    # Add new connection to bulk create list.
                    connections.append(conn)
                keypad_set.add(keypad.id)

        # Bulk create ballots and connections.
        if ballot:
            ballot.save_ballots()
        conn_model.objects.bulk_create(connections)

        # Trigger auto update.
        connections = conn_model.objects.filter(poll=poll, keypad_id__in=keypad_set)
        inform_changed_data(connections)

        return HttpResponse()
Esempio n. 10
0
    def post(self, request, poll_id):
        # Get poll instance.
        vc = VoteCollector.objects.get(id=1)
        if vc.voting_mode == 'MotionPoll':
            poll_model = MotionPoll
            conn_model = MotionPollKeypadConnection
        else:
            poll_model = AssignmentPoll
            conn_model = AssignmentPollKeypadConnection
        try:
            poll = poll_model.objects.get(id=poll_id)
        except poll_model.DoesNotExist:
            return HttpResponse('')

        # Get ballot instance.
        ballot = Ballot(poll) if Ballot else None

        # Load json list from request body.
        votes = json.loads(request.body.decode('utf-8'))
        keypad_set = set()
        connections = []
        for vote in votes:
            keypad_id = vote['id']
            try:
                keypad = Keypad.objects.get(keypad_id=keypad_id)
            except Keypad.DoesNotExist:
                continue

            # Mark keypad as in range and update battery level.
            keypad.in_range = True
            keypad.battery_level = vote['bl']
            keypad.save(skip_autoupdate=True)

            # Validate vote value.
            value = vote['value']
            if value not in ('Y', 'N', 'A'):
                continue

            # Write ballot and poll keypad connection.
            is_valid_keypad = True
            if ballot and vc.voting_mode == 'MotionPoll':
                # TODO: Ballot currently only implemented for MotionPoll.
                is_valid_keypad = ballot.register_vote(
                    keypad_id, value, commit=False) > 0
            if is_valid_keypad:
                try:
                    conn = conn_model.objects.get(poll=poll, keypad=keypad)
                except conn_model.DoesNotExist:
                    conn = conn_model(poll=poll, keypad=keypad)
                conn.serial_number = vote['sn']
                conn.value = value
                if conn.pk:
                    # Save updated connection.
                    conn.save(skip_autoupdate=True)
                else:
                    # Add new connection to bulk create list.
                    connections.append(conn)
                keypad_set.add(keypad.id)

        # Bulk create ballots and connections.
        if ballot:
            ballot.save_ballots()
        conn_model.objects.bulk_create(connections)

        # Trigger auto update.
        connections = conn_model.objects.filter(poll=poll,
                                                keypad_id__in=keypad_set)
        inform_changed_data(connections)

        return HttpResponse()