예제 #1
0
파일: transforms.py 프로젝트: alkadis/vcv
    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
예제 #2
0
파일: poll.py 프로젝트: alex-obi/adhocracy
    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))
예제 #3
0
파일: poll.py 프로젝트: alex-obi/adhocracy
    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))
예제 #4
0
파일: poll.py 프로젝트: liqd/adhocracy
    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))
예제 #5
0
    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
예제 #6
0
파일: poll.py 프로젝트: liqd/adhocracy
    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))