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> " + "<span class='nobr'><img src='/static/img/button-no.png'> " + _('No') + "</span> " + "<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 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> " + "<span class='nobr'><img src='/static/img/button-no.png'> " + _('No') + "</span> " + "<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'))
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'))
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()
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)
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()
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()