def vote_success(self, appstruct): #Just in case the form rendered before the poll closed if not self.can_vote: raise HTTPForbidden(_("You're not allowed to vote")) Vote = self.poll_plugin.get_vote_class() if not IVote.implementedBy(Vote): raise TypeError("Poll plugins method get_vote_class returned something that didn't implement IVote.") appstruct.pop('csrf_token', None) userid = self.api.userid if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote) vote.set_vote_data(appstruct) else: vote = Vote(creators = [userid]) #We don't need to send events here, since object added will take care of that vote.set_vote_data(appstruct, notify = False) #To fire events after set_vote_data is done self.context[userid] = vote success_msg = _(u"Your vote has been registered!") if self.request.is_xhr: self.response['success_msg'] = success_msg return Response(render("templates/snippets/vote_success.pt", self.response, request = self.request)) self.api.flash_messages.add(success_msg) url = self.request.resource_url(self.context.__parent__, anchor = self.context.uid) return HTTPFound(location = url)
def vote_success(self, appstruct): #Just in case the form rendered before the poll closed if not self.can_vote: raise HTTPForbidden(_("You're not allowed to vote")) Vote = self.poll_plugin.get_vote_class() if not IVote.implementedBy(Vote): raise TypeError( "Poll plugins method get_vote_class returned something that didn't implement IVote." ) appstruct.pop('csrf_token', None) userid = self.request.authenticated_userid if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote), "%r doesn't provide IVote" % vote vote.set_vote_data(appstruct) success_msg = _("Your vote was changed.") else: vote = Vote(creators=[userid]) #We don't need to send events here, since object added will take care of that vote.set_vote_data(appstruct, notify=False) #To fire events after set_vote_data is done self.context[userid] = vote success_msg = _( "vote_success_msg", default="Your vote has been added. If you wish to change it, " "you may do so as long as the poll is open.") self.flash_messages.add(success_msg) return self._remove_modal_response()
def poll_form(self): """ Return rendered poll form or process a vote. """ poll_plugin = self.query_poll_plugin(self.context) if not poll_plugin: return HTTPForbidden() schema = poll_plugin.get_vote_schema(self.request, self.api) add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, action=self.request.resource_url(self.context, '_poll_form'), buttons=(button_vote, ), formid="vote_form") can_vote = has_permission(security.ADD_VOTE, self.context, self.request) userid = self.api.userid post = self.request.POST if 'vote' in post: if not can_vote: raise HTTPForbidden(u"You're not allowed to vote") controls = post.items() try: appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response Vote = poll_plugin.get_vote_class() if not IVote.implementedBy(Vote): raise TypeError( "Poll plugins method get_vote_class returned something that didn't implement IVote." ) #Remove crsf_token from appstruct after validation appstruct.pop('csrf_token', None) if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote) vote.set_vote_data(appstruct) else: vote = Vote(creators=[userid]) #We don't need to send events here, since object added will take care of that vote.set_vote_data(appstruct, notify=False) #To fire events after set_vote_data is done self.context[userid] = vote success_msg = _(u"Your vote has been registered!") if self.request.is_xhr: self.response['success_msg'] = success_msg return Response( render("templates/snippets/vote_success.pt", self.response, request=self.request)) self.api.flash_messages.add(success_msg) url = self.request.resource_url(self.context.__parent__, anchor=self.context.uid) return HTTPFound(location=url)
def poll_form(self): """ Return rendered poll form or process a vote. """ poll_plugin = self.query_poll_plugin(self.context) if not poll_plugin: return HTTPForbidden() schema = poll_plugin.get_vote_schema(self.request, self.api) add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api = self.api) form = Form(schema, action = self.request.resource_url(self.context, '_poll_form'), buttons = (button_vote,), formid = "vote_form") can_vote = has_permission(security.ADD_VOTE, self.context, self.request) userid = self.api.userid post = self.request.POST if 'vote' in post: if not can_vote: raise HTTPForbidden(u"You're not allowed to vote") controls = post.items() try: appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response Vote = poll_plugin.get_vote_class() if not IVote.implementedBy(Vote): raise TypeError("Poll plugins method get_vote_class returned something that didn't implement IVote.") #Remove crsf_token from appstruct after validation appstruct.pop('csrf_token', None) if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote) vote.set_vote_data(appstruct) else: vote = Vote(creators = [userid]) #We don't need to send events here, since object added will take care of that vote.set_vote_data(appstruct, notify = False) #To fire events after set_vote_data is done self.context[userid] = vote success_msg = _(u"Your vote has been registered!") if self.request.is_xhr: self.response['success_msg'] = success_msg return Response(render("templates/snippets/vote_success.pt", self.response, request = self.request)) self.api.flash_messages.add(success_msg) url = self.request.resource_url(self.context.__parent__, anchor = self.context.uid) return HTTPFound(location = url)
def print_voting_timestamps(poll, request): print "\n" print poll.title print "="*80 print "Start time:".ljust(20), request.dt_handler.format_dt(poll.start_time) print "End time:".ljust(20), request.dt_handler.format_dt(poll.end_time) print "Minutes since poll started, within this minute. (Ie 1 min, voted in 0-59 seconds)" vote_times = {} for vote in poll.values(): if not IVote.providedBy(vote): continue ts_min = (vote.created - poll.start_time).total_seconds() // 60 ts_min = int(floor(ts_min) + 1) if ts_min not in vote_times: vote_times[ts_min] = 0 vote_times[ts_min] += 1 sv_times = sorted(vote_times.items(), key=lambda x: x[0]) print "-"*80 print "Minutes".ljust(20), "Voters" for (k, v) in sv_times: print str(k).ljust(20), v print "\n" print "Total:".ljust(20), sum(vote_times.values())
def add(self, name, other, send_events=True): assert IVote.providedBy(other) super(Poll, self).add(name, other, send_events=send_events)
def calculate_ballots(self): ballot_counter = Ballots() for vote in self.values(): assert IVote.providedBy(vote) ballot_counter.add(vote.get_vote_data()) return ballot_counter.result()
success_msg = _(u"Your vote has been registered!") if self.request.is_xhr: self.response['success_msg'] = success_msg return Response( render("templates/snippets/vote_success.pt", self.response, request=self.request)) self.api.flash_messages.add(success_msg) url = self.request.resource_url(self.context.__parent__, anchor=self.context.uid) return HTTPFound(location=url) #No vote recieved, continue to render form if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote) appstruct = vote.get_vote_data() #Poll might still be open, in that case the poll should be changable readonly = not can_vote self.response['form'] = form.render(appstruct=appstruct, readonly=readonly) #User has not voted else: readonly = not can_vote self.response['form'] = form.render(readonly=readonly) return self.response @view_config(name='modal_poll', context=IPoll, permission=security.VIEW, xhr=True) #
def _recurse(base, results): for obj in base.values(): if IBaseContent.providedBy(obj) or IVote.providedBy(obj): results.add(obj) _recurse(obj, results)
def get_all_votes(self): """ Returns all votes in this context. """ return frozenset([x for x in self.values() if IVote.providedBy(x)])
#We don't need to send events here, since object added will take care of that vote.set_vote_data(appstruct, notify = False) #To fire events after set_vote_data is done self.context[userid] = vote success_msg = _(u"Your vote has been registered!") if self.request.is_xhr: self.response['success_msg'] = success_msg return Response(render("templates/snippets/vote_success.pt", self.response, request = self.request)) self.api.flash_messages.add(success_msg) url = self.request.resource_url(self.context.__parent__, anchor = self.context.uid) return HTTPFound(location = url) #No vote recieved, continue to render form if userid in self.context: vote = self.context[userid] assert IVote.providedBy(vote) appstruct = vote.get_vote_data() #Poll might still be open, in that case the poll should be changable readonly = not can_vote self.response['form'] = form.render(appstruct=appstruct, readonly=readonly) #User has not voted else: readonly = not can_vote self.response['form'] = form.render(readonly=readonly) return self.response @view_config(name = 'modal_poll', context = IPoll, permission = security.VIEW, xhr = True) # def poll_view(self): """ This is the modal window that opens when you click for instance the vote button It will also call the view that renders the actual poll form. """