def _export(self, obj): res = { "id": obj.id, "title": obj.title, "create_time": encode_time(obj.create_time), "description": (None if obj.description is None else obj.description.head.text), "creator": self._user_transform._compute_key(obj.creator), "adhocracy_type": "proposal", "category": obj.category.title if obj.category else None, "tags": [o.name for o, _ in obj.tags], "badges": [o.badge.title for o in obj.delegateablebadges if o.badge.polymorphic_identity != "category"], } if self._options.get("include_proposal_creator_badges", False): res["creator_badges"] = ([o.badge.title for o in obj.creator.userbadges],) if self._options.get("include_ratings", False): res.update( { "rate_pro": obj.rate_poll.tally.num_for, "rate_contra": obj.rate_poll.tally.num_against, "rate_neutral": obj.rate_poll.tally.num_abstain, } ) if votedetail.is_enabled(): vd = votedetail.calc_votedetail_dict(obj.instance, obj.rate_poll, badge_title_only=True) if vd: res["votedetail_rate_poll"] = vd if self._options.get("include_instance_proposal_comment", False): ctransform = CommentTransform(self._options, obj.description.comments, None, self._user_transform) res["comments"] = ctransform.export_all() return res
def vote(self, id, format): c.poll = self._get_open_poll(id) if c.poll.action != model.Poll.ADOPT: abort(400, _("This is not an adoption poll.")) require.poll.vote(c.poll) decision = democracy.Decision(c.user, c.poll) votes = decision.make(self.form_result.get("position")) model.meta.Session.commit() if not asbool(config.get('adhocracy.hide_individual_votes', 'false')): for vote in votes: event.emit(event.T_VOTE_CAST, vote.user, instance=c.instance, topics=[c.poll.scope], vote=vote, poll=c.poll) if format == 'json': vdetail = votedetail.calc_votedetail_dict(c.instance, c.poll)\ if votedetail.is_enabled() else None return render_json( dict(decision=decision, score=c.poll.tally.score, votedetail=vdetail)) else: redirect(h.entity_url(c.poll.subject))
def rate(self, id, format): # rating is like polling but steps via abstention, i.e. if you have # first voted "for", rating will first go to "abstain" and only # then produce "against"- c.poll = self._get_open_poll(id) if c.poll.action not in [model.Poll.RATE, model.Poll.SELECT]: abort(400, _("This is not a rating poll.")) require.poll.vote(c.poll) decision = democracy.Decision(c.user, c.poll) old = decision.result new = self.form_result.get("position") positions = { (model.Vote.YES, model.Vote.YES): model.Vote.YES, (model.Vote.ABSTAIN, model.Vote.YES): model.Vote.YES, (model.Vote.NO, model.Vote.YES): model.Vote.ABSTAIN, (model.Vote.YES, model.Vote.NO): model.Vote.ABSTAIN, (model.Vote.ABSTAIN, model.Vote.NO): model.Vote.NO, (model.Vote.NO, model.Vote.NO): model.Vote.NO } position = positions.get((old, new), new) votes = decision.make(position) tally = model.Tally.create_from_poll(c.poll) event_type = { model.Poll.RATE: event.T_RATING_CAST, model.Poll.SELECT: event.T_SELECT_VARIANT }.get(c.poll.action) model.meta.Session.commit() if not asbool(config.get('adhocracy.hide_individual_votes', 'false')): for vote in votes: event.emit(event_type, vote.user, instance=c.instance, topics=[c.poll.scope], vote=vote, poll=c.poll) if format == 'json': vdetail = votedetail.calc_votedetail_dict(c.instance, c.poll)\ if votedetail.is_enabled() else None return render_json( dict(decision=decision, tally=tally.to_dict(), votedetail=vdetail)) elif format == 'ajax': return self.widget(id, format=self.form_result.get('cls')) elif c.poll.action == model.Poll.SELECT: redirect(h.entity_url(c.poll.selection)) else: redirect(h.entity_url(c.poll.subject))
def rate(self, id, format): # rating is like polling but steps via abstention, i.e. if you have # first voted "for", rating will first go to "abstain" and only # then produce "against"- c.poll = self._get_open_poll(id) if c.poll.action not in [model.Poll.RATE, model.Poll.SELECT]: abort(400, _("This is not a rating poll.")) require.poll.vote(c.poll) decision = democracy.Decision(c.user, c.poll) old = decision.result new = self.form_result.get("position") positions = {(model.Vote.YES, model.Vote.YES): model.Vote.YES, (model.Vote.ABSTAIN, model.Vote.YES): model.Vote.YES, (model.Vote.NO, model.Vote.YES): model.Vote.ABSTAIN, (model.Vote.YES, model.Vote.NO): model.Vote.ABSTAIN, (model.Vote.ABSTAIN, model.Vote.NO): model.Vote.NO, (model.Vote.NO, model.Vote.NO): model.Vote.NO} position = positions.get((old, new), new) votes = decision.make(position) tally = model.Tally.create_from_poll(c.poll) event_type = {model.Poll.RATE: event.T_RATING_CAST, model.Poll.SELECT: event.T_SELECT_VARIANT }.get(c.poll.action) model.meta.Session.commit() if not config.get_bool('adhocracy.hide_individual_votes'): for vote in votes: event.emit(event_type, vote.user, instance=c.instance, topics=[c.poll.scope], vote=vote, poll=c.poll) if format == 'json': vdetail = votedetail.calc_votedetail_dict(c.instance, c.poll)\ if votedetail.is_enabled() else None return render_json(dict(decision=decision, tally=tally.to_dict(), votedetail=vdetail)) elif format == 'ajax': return self.widget(id, format=self.form_result.get('cls')) elif c.poll.action == model.Poll.SELECT: redirect(h.entity_url(c.poll.selection)) else: redirect(h.entity_url(c.poll.subject))
def _export(self, obj): res = { 'id': obj.id, 'title': obj.title, 'description': (None if obj.description is None else obj.description.head.text), 'creator': self._user_transform._compute_key(obj.creator), 'adhocracy_type': 'proposal', 'category': obj.category.title if obj.category else None, 'tags': [o.name for o, _ in obj.tags], 'badges': [ o.badge.title for o in obj.delegateablebadges if o.badge.polymorphic_identity != 'category' ], } if self._options.get('include_proposal_creator_badges', False): res['creator_badges'] = [ o.badge.title for o in obj.creator.userbadges ], if self._options.get('include_ratings', False): res.update({ 'rate_pro': obj.rate_poll.tally.num_for, 'rate_contra': obj.rate_poll.tally.num_against, 'rate_neutral': obj.rate_poll.tally.num_abstain, }) if votedetail.is_enabled(): vd = votedetail.calc_votedetail_dict(obj.instance, obj.rate_poll, badge_title_only=True) if vd: res['votedetail_rate_poll'] = vd if self._options.get('include_instance_proposal_comment', False): ctransform = CommentTransform(self._options, obj.description.comments, None, self._user_transform) res['comments'] = ctransform.export_all() return res
def vote(self, id, format): c.poll = self._get_open_poll(id) if c.poll.action != model.Poll.ADOPT: abort(400, _("This is not an adoption poll.")) require.poll.vote(c.poll) decision = democracy.Decision(c.user, c.poll) votes = decision.make(self.form_result.get("position")) model.meta.Session.commit() if not config.get_bool('adhocracy.hide_individual_votes'): for vote in votes: event.emit(event.T_VOTE_CAST, vote.user, instance=c.instance, topics=[c.poll.scope], vote=vote, poll=c.poll) if format == 'json': vdetail = votedetail.calc_votedetail_dict(c.instance, c.poll)\ if votedetail.is_enabled() else None return render_json(dict(decision=decision, score=c.poll.tally.score, votedetail=vdetail)) else: redirect(h.entity_url(c.poll.subject))