Beispiel #1
0
    def ask_delete(self, proposal_id, id):
        c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
        c.selection = get_entity_or_abort(model.Selection, id)
        require.selection.delete(c.selection)
        c.proposal_tile = tiles.proposal.ProposalTile(c.proposal)

        return render("/selection/ask_delete.html")
Beispiel #2
0
    def details(self, proposal_id, selection_id, format='html'):
        '''
        '''
        selection = get_entity_or_abort(model.Selection, selection_id)
        proposal = get_entity_or_abort(model.Proposal, proposal_id)
        if selection.proposal is not proposal:
            ret_abort(_('Page not Found'), code=404)
        c.page = selection.page
        variant_polls = dict(selection.variant_polls)
        variant_to_show = selection.selected
        if not variant_to_show:
            variant_to_show = model.Text.HEAD

        variant_items = PageController.variant_items(c.page,
                                                       selection=selection)
        get_score = lambda item: \
            selection.variant_poll(item['variant']).tally.score
        c.variant_items = PageController.insert_variant_score_and_sort(
            variant_items, get_score)

        c.variant_details = PageController.variant_details(
            c.page, variant_to_show)
        c.variant_details_json = json.dumps(c.variant_details, indent=4)
        c.selection_details = PageController.selection_urls(selection)
        c.selection_details_json = json.dumps(c.selection_details, indent=4)
        c.current_variant_poll = variant_polls[variant_to_show]
        c.selection = selection
        if format == 'overlay':
            return render('/proposal/details.html', overlay=True)
        return render('/proposal/details.html')
Beispiel #3
0
    def ask_delete(self, proposal_id, id):
        c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
        c.selection = get_entity_or_abort(model.Selection, id)
        require.selection.delete(c.selection)
        c.proposal_tile = tiles.proposal.ProposalTile(c.proposal)

        return render("/selection/ask_delete.html")
Beispiel #4
0
    def delete(self, proposal_id, id):
        c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
        c.selection = get_entity_or_abort(model.Selection, id)
        require.selection.delete(c.selection)

        # TODO implement
        # event.emit(event.T_PROPOSAL_DELETE, c.user, instance=c.instance,
        #           topics=[c.proposal], proposal=c.proposal)
        c.selection.delete()
        model.meta.Session.commit()
        h.flash(_("The inclusion of %s has been deleted.") % c.selection.page.title, "success")

        redirect(h.entity_url(c.proposal))
Beispiel #5
0
    def delete(self, proposal_id, id):
        c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
        c.selection = get_entity_or_abort(model.Selection, id)
        require.selection.delete(c.selection)

        # TODO implement
        #event.emit(event.T_PROPOSAL_DELETE, c.user, instance=c.instance,
        #           topics=[c.proposal], proposal=c.proposal)
        c.selection.delete()
        model.meta.Session.commit()
        h.flash(_("The inclusion of %s has been deleted.") %
                c.selection.page.title,
                'success')

        redirect(h.entity_url(c.proposal))
Beispiel #6
0
 def groupmod(self, id):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.supervise(c.page_user)
     to_group = self.form_result.get("to_group")
     if not to_group.code in model.Group.INSTANCE_GROUPS:
         h.flash(
             _("Cannot make %(user)s a member of %(group)s") % {
                 'user': c.page_user.name,
                 'group': to_group.group_name
             }, 'error')
         redirect(h.entity_url(c.page_user))
     had_vote = c.page_user._has_permission("vote.cast")
     for membership in c.page_user.memberships:
         if (not membership.is_expired()
                 and membership.instance == c.instance):
             membership.group = to_group
     model.meta.Session.commit()
     event.emit(event.T_INSTANCE_MEMBERSHIP_UPDATE,
                c.page_user,
                instance=c.instance,
                group=to_group,
                admin=c.user)
     if had_vote and not c.page_user._has_permission("vote.cast"):
         # user has lost voting privileges
         c.page_user.revoke_delegations(c.instance)
     model.meta.Session.commit()
     redirect(h.entity_url(c.page_user))
Beispiel #7
0
    def watchlist(self, id, format='html'):
        require.watch.index()
        c.active_global_nav = 'watchlist'
        c.page_user = get_entity_or_abort(model.User,
                                          id,
                                          instance_filter=False)
        require.user.show(c.page_user)
        watches = model.Watch.all_by_user(c.page_user)
        entities = [w.entity for w in watches if (w.entity is not None) \
            and (not isinstance(w.entity, unicode))]

        c.entities_pager = NamedPager('watches',
                                      entities,
                                      tiles.dispatch_row_with_comments,
                                      sorts={
                                          _("oldest"): sorting.entity_oldest,
                                          _("newest"): sorting.entity_newest
                                      },
                                      default_sort=sorting.entity_newest)

        if format == 'json':
            return render_json(c.entities_pager)

        self._common_metadata(c.page_user, member='watchlist')
        return render("/user/watchlist.html")
Beispiel #8
0
 def reset(self, id):
     c.page_user = get_entity_or_abort(model.User,
                                       id,
                                       instance_filter=False)
     try:
         if c.page_user.reset_code != self.form_result.get('c'):
             raise ValueError()
         new_password = random_token()
         c.page_user.password = new_password
         model.meta.Session.add(c.page_user)
         model.meta.Session.commit()
         body = (
             _("your password has been reset. It is now:") + "\r\n\r\n  " +
             new_password + "\r\n\r\n" +
             _("Please login and change the password in your user "
               "settings.") + "\n\n" +
             _("Your user name to login is: %s") % c.page_user.user_name)
         libmail.to_user(c.page_user, _("Your new password"), body)
         h.flash(
             _("Success. You have been sent an email with your new "
               "password."), 'success')
     except Exception:
         h.flash(
             _("The reset code is invalid. Please repeat the password"
               " recovery procedure."), 'error')
     redirect('/login')
Beispiel #9
0
 def reply_form(self, id):
     parent = get_entity_or_abort(model.Comment, int(id))
     require.comment.reply(parent)
     topic = parent.topic
     variant = getattr(topic, 'variant', None)
     came_from = c.came_from
     return self._render_ajax_create_form(parent, topic, variant, came_from)
Beispiel #10
0
 def reply_form(self, id):
     parent = get_entity_or_abort(model.Comment, int(id))
     require.comment.reply(parent)
     topic = parent.topic
     variant = getattr(topic, 'variant', None)
     ret_url = request.params['ret_url']
     return self._render_ajax_create_form(parent, topic, variant, ret_url)
Beispiel #11
0
    def show(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        require.proposal.index()
        query = self.form_result.get('proposals_q')

        category = get_entity_or_abort(model.CategoryBadge, id)

        pages = model.Page.all_q(instance=c.instance,
                                 functions=model.Page.LISTED) \
            .join(model.DelegateableBadges) \
            .filter(model.DelegateableBadges.badge_id == category.id) \
            .all()
        pages = filter(lambda p: p.parent is None, pages)
        pages_pager = pager.NamedPager('pages', pages, tiles.page.smallrow,
                                       enable_pages=False, enable_sorts=False)

        default_sorting = config.get(
            'adhocracy.listings.instance_proposal.sorting')
        proposals_pager = pager.solr_proposal_pager(
            c.instance,
            {'text': query},
            default_sorting=default_sorting,
            extra_filter={'facet.delegateable.badgecategory': category.id})

        data = {
            'category': category,
            'pages_pager': pages_pager,
            'proposals_pager': proposals_pager,
        }
        return render('/category/show.html', data,
                      overlay=format == u'overlay')
Beispiel #12
0
 def edit(self, id):
     c.page_user = get_entity_or_abort(model.User, id,
                                       instance_filter=False)
     require.user.edit(c.page_user)
     c.locales = i18n.LOCALES
     c.tile = tiles.user.UserTile(c.page_user)
     return render("/user/edit.html")
Beispiel #13
0
    def show(self, id, format='html'):
        c.page_instance = get_entity_or_abort(model.Instance, id)
        require.instance.show(c.page_instance)

        if format == 'json':
            return render_json(c.page_instance)

        if format == 'rss':
            return self.activity(id, format)

        if c.page_instance != c.instance:
            redirect(h.entity_url(c.page_instance))

        c.tile = tiles.instance.InstanceTile(c.page_instance)
        proposals = model.Proposal.all(instance=c.page_instance)
        c.new_proposals_pager = pager.proposals(
            proposals, size=7, enable_sorts=False,
            enable_pages=False, default_sort=sorting.entity_newest)

        c.sidebar_delegations = (_('Delegations are enabled.') if
                                 c.page_instance.allow_delegate else
                                 _('Delegations are disabled.'))

        #pages = model.Page.all(instance=c.page_instance,
        #        functions=[model.Page.NORM])
        #c.top_pages_pager = pager.pages(
        #    pages, size=7, enable_sorts=False,
        #    enable_pages=False, default_sort=sorting.norm_selections)
        #tags = model.Tag.popular_tags(limit=40)
        #c.tags = sorted(text.tag_cloud_normalize(tags),
        #                key=lambda (k, c, v): k.name)

        if asbool(config.get('adhocracy.show_instance_overview_milestones')) \
           and c.page_instance.milestones:

            number = asint(config.get(
                'adhocracy.number_instance_overview_milestones', 3))
            
            milestones = model.Milestone.all_future_q(
                instance=c.page_instance).limit(number).all()

            c.next_milestones_pager = pager.milestones(
                milestones, size=number, enable_sorts=False,
                enable_pages=False, default_sort=sorting.milestone_time)

        events = model.Event.find_by_instance(c.page_instance, limit=3)

        c.events_pager = pager.events(events,
                                      enable_pages=False, 
                                      enable_sorts=False)

        c.stats = {
            'comments': model.Comment.all_q().count(),
            'proposals': model.Proposal.all_q(
                instance=c.page_instance).count(),
            'members': model.Membership.all_q().count()
        }
        c.tutorial_intro = _('tutorial_instance_show_intro')
        c.tutorial = 'instance_show'
        return render("/instance/show.html")
Beispiel #14
0
 def edit(self, id):
     c.page_user = get_entity_or_abort(model.User,
                                       id,
                                       instance_filter=False)
     require.user.edit(c.page_user)
     c.locales = i18n.LOCALES
     return render("/user/edit.html")
Beispiel #15
0
 def image(self, id, y, x=None):
     if not c.instance.display_category_pages:
         abort(404)
     category = get_entity_or_abort(model.CategoryBadge,
                                    id,
                                    instance_filter=False)
     return render_logo(category, y, x=x)
Beispiel #16
0
 def edit(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.edit(c.comment)
     if format == 'ajax':
         return render_def('/comment/tiles.html', 'edit_form',
                           {'comment': c.comment})
     return render('/comment/edit.html')
Beispiel #17
0
    def events(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        category = get_entity_or_abort(model.CategoryBadge, id)

        events = h.category.event_q(
            category,
            event_filter=request.params.getall('event_filter'),
            count=min(int(request.params.get('count', 50)), 100),
        ).all()

        enable_sorts = asbool(request.params.get('enable_sorts', 'true'))
        enable_pages = asbool(request.params.get('enable_pages', 'true'))
        row_type = request.params.get('row_type', 'row')

        if row_type not in ['row', 'profile_row', 'sidebar_row', 'tiny_row']:
            abort(400)

        data = {
            'event_pager': pager.events(events,
                                        enable_sorts=enable_sorts,
                                        enable_pages=enable_pages,
                                        row_type=row_type),
        }
        return render('/category/events.html', data,
                      overlay=format == 'overlay',
                      overlay_size=OVERLAY_SMALL)
Beispiel #18
0
    def update(self, id, format='html'):
        c.comment = get_entity_or_abort(model.Comment, id)
        require.comment.edit(c.comment)
        rev = c.comment.create_revision(
            self.form_result.get('text'),
            c.user,
            sentiment=self.form_result.get('sentiment'))
        model.meta.Session.commit()
        if can.user.vote():
            decision = democracy.Decision(c.user, c.comment.poll)
            if not decision.result == model.Vote.YES:
                decision.make(model.Vote.YES)
        model.meta.Session.commit()

        # do not modify watch state as comments are always watched

        event.emit(event.T_COMMENT_EDIT, c.user, instance=c.instance,
                   topics=[c.comment.topic], comment=c.comment,
                   topic=c.comment.topic, rev=rev)
        if c.came_from != u'':
            redirect(c.came_from + "#c" + str(c.comment.id))
        if format != 'html':
            return ret_success(entity=c.comment, format=format)
        else:
            return ret_success(entity=c.comment, format='fwd')
Beispiel #19
0
    def update(self, id, format='html'):
        c.comment = get_entity_or_abort(model.Comment, id)
        require.comment.edit(c.comment)
        rev = c.comment.create_revision(
            self.form_result.get('text'),
            c.user,
            sentiment=self.form_result.get('sentiment'))
        model.meta.Session.commit()
        if can.user.vote():
            decision = democracy.Decision(c.user, c.comment.poll)
            if not decision.result == model.Vote.YES:
                decision.make(model.Vote.YES)
        model.meta.Session.commit()

        # do not modify watch state as comments are always watched

        event.emit(event.T_COMMENT_EDIT,
                   c.user,
                   instance=c.instance,
                   topics=[c.comment.topic],
                   comment=c.comment,
                   topic=c.comment.topic,
                   rev=rev)
        if len(request.params.get('ret_url', '')):
            redirect(request.params.get('ret_url') + "#c" + str(c.comment.id))
        if format != 'html':
            return ret_success(entity=c.comment, format=format)
        else:
            return ret_success(entity=c.comment, format='fwd')
Beispiel #20
0
 def reply_form(self, id):
     parent = get_entity_or_abort(model.Comment, int(id))
     require.comment.reply(parent)
     topic = parent.topic
     variant = getattr(topic, 'variant', None)
     came_from = c.came_from
     return self._render_ajax_create_form(parent, topic, variant, came_from)
Beispiel #21
0
 def create(self, id, format='html'):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.message(c.page_user)
     try:
         self.form_result = MessageCreateForm().to_python(request.params)
     except Invalid, i:
         return self.new(id, errors=i.unpack_errors())
Beispiel #22
0
 def create(self, proposal_id, format='html'):
     c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
     require.selection.create(c.proposal)
     try:
         self.form_result = SelectionCreateForm().to_python(request.params)
     except Invalid, i:
         return self.propose(proposal_id, errors=i.unpack_errors())
Beispiel #23
0
 def unban(self, id):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.manage(c.page_user)
     c.page_user.banned = False
     model.meta.Session.commit()
     h.flash(_("The account has been re-activated."), 'success')
     redirect(h.entity_url(c.page_user))
Beispiel #24
0
    def events(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        category = get_entity_or_abort(model.CategoryBadge, id)

        events = h.category.event_q(
            category,
            event_filter=request.params.getall('event_filter'),
            count=min(int(request.params.get('count', 50)), 100),
        ).all()

        enable_sorts = asbool(request.params.get('enable_sorts', 'true'))
        enable_pages = asbool(request.params.get('enable_pages', 'true'))
        row_type = request.params.get('row_type', 'row')

        if row_type not in ['row', 'profile_row', 'sidebar_row', 'tiny_row']:
            abort(400)

        data = {
            'event_pager':
            pager.events(events,
                         enable_sorts=enable_sorts,
                         enable_pages=enable_pages,
                         row_type=row_type),
        }
        return render('/category/events.html',
                      data,
                      overlay=format == 'overlay',
                      overlay_size=OVERLAY_SMALL)
Beispiel #25
0
    def activate(self, id):
        c.page_user = get_entity_or_abort(model.User, id,
                                          instance_filter=False)
        code = self.form_result.get('c')

        if c.page_user.activation_code is None:
            h.flash(_(u'Thank you, The address is already activated.'))
            redirect(h.entity_url(c.page_user))
        elif c.page_user.activation_code != code:
            h.flash(_("The activation code is invalid. Please have it "
                      "resent."), 'error')
            redirect(h.entity_url(c.page_user))

        c.page_user.activation_code = None
        model.meta.Session.commit()
        if code.startswith(model.User.IMPORT_MARKER):
            # Users imported by admins
            login_user(c.page_user, request)
            h.flash(_("Welcome to %s") % h.site.name(), 'success')
            if c.instance:
                membership = model.Membership(c.page_user, c.instance,
                                              c.instance.default_group)
                model.meta.Session.expunge(membership)
                model.meta.Session.add(membership)
                model.meta.Session.commit()
                redirect(h.entity_url(c.instance))
            else:
                redirect(h.base_url('/instance', None))
        else:
            h.flash(_("Your email has been confirmed."), 'success')
            redirect(h.entity_url(c.page_user))

        redirect(h.entity_url(c.page_user))
Beispiel #26
0
    def show(self, id, format='html'):
        c.tag = get_entity_or_abort(model.Tag, id)
        require.tag.show(c.tag)
        require.proposal.index()
        require.page.index()

        if format == 'json':
            return render_json(c.tag)

        entities = libsearch.query.run(u'tag:' + c.tag.name,
                                       instance=c.instance)
        entities = [e for e in entities if (isinstance(e, model.Proposal) or
                                            isinstance(e, model.Page))]

        c.entities_pager = NamedPager(
            'entities', entities, tiles.dispatch_row,
            sorts={_("oldest"): sorting.entity_oldest,
                   _("newest"): sorting.entity_newest,
                   _("alphabetically"): sorting.delegateable_title,
                   _("relevance"): sorting.entity_stable},
            default_sort=sorting.entity_stable,
            q=c.query)

        tags = model.Tag.similar_tags(c.tag, limit=50)
        c.cloud_tags = sorted(text.tag_cloud_normalize(tags),
                              key=lambda (k, c, v): k.name)
        return render("/tag/show.html")
Beispiel #27
0
    def show(self, id, format='html'):
        c.tag = get_entity_or_abort(model.Tag, id)
        require.tag.show(c.tag)
        require.proposal.index()
        require.page.index()

        if format == 'json':
            return render_json(c.tag)

        entities = libsearch.query.run(u'tag:' + c.tag.name,
                                       instance=c.instance)
        entities = [e for e in entities if (isinstance(e, model.Proposal) or
                                            isinstance(e, model.Page))]

        c.entities_pager = NamedPager(
            'entities', entities, tiles.dispatch_row,
            sorts={_("oldest"): sorting.entity_oldest,
                   _("newest"): sorting.entity_newest,
                   _("alphabetically"): sorting.delegateable_title,
                   _("relevance"): sorting.entity_stable},
            default_sort=sorting.entity_stable,
            q=c.query)

        tags = model.Tag.similar_tags(c.tag, limit=50)
        c.cloud_tags = sorted(h.tag.tag_cloud_normalize(tags),
                              key=lambda (k, c, v): k.name)

        if format == 'overlay':
            return render("/tag/show.html", overlay=True)
        else:
            return render("/tag/show.html")
Beispiel #28
0
    def votes(self, id, format='html'):
        c.poll = get_entity_or_abort(model.Poll, id)

        # cover over data inconsistency because of a bug where pages (norms)
        # where deleted when a proposal was deleted.
        # Fixes http://trac.adhocracy.de/ticket/262
        if (c.poll.action == model.Poll.SELECT and
                c.poll.selection is None):
            logmsg = ('Poll: "%s" is a model.Poll.rate poll, which should '
                      'have a selection, but the selection is None. Subject '
                      'of the Poll is %s') % (c.poll, c.poll.subject)
            log.error(logmsg)
            raise abort(404)

        require.poll.show(c.poll)
        decisions = democracy.Decision.for_poll(c.poll)
        if (hasattr(self, 'form_result') and
                self.form_result.get('result') != None):
            result_form = self.form_result.get('result')
            decisions = filter(lambda d: d.result == result_form, decisions)
        c.decisions_pager = pager.scope_decisions(decisions)

        if format == 'overlay':
            return render_def('/pager.html', 'overlay_pager',
                              pager=c.decisions_pager,
                              render_facets=False)

        if format == 'json':
            return render_json(c.decisions_pager)

        return render("/poll/votes.html")
Beispiel #29
0
    def show(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        require.proposal.index()
        query = self.form_result.get('proposals_q')

        category = get_entity_or_abort(model.CategoryBadge, id)

        pages = model.Page.all_q(instance=c.instance,
                                 functions=model.Page.LISTED) \
            .join(model.DelegateableBadges) \
            .filter(model.DelegateableBadges.badge_id == category.id) \
            .all()
        pages = filter(lambda p: p.parent is None, pages)
        pages_pager = pager.NamedPager('pages',
                                       pages,
                                       tiles.page.smallrow,
                                       enable_pages=False,
                                       enable_sorts=False)

        default_sorting = config.get(
            'adhocracy.listings.instance_proposal.sorting')
        proposals_pager = pager.solr_proposal_pager(
            c.instance, {'text': query},
            default_sorting=default_sorting,
            extra_filter={'facet.delegateable.badgecategory': category.id})

        data = {
            'category': category,
            'pages_pager': pages_pager,
            'proposals_pager': proposals_pager,
        }
        return render('/category/show.html',
                      data,
                      overlay=format == u'overlay')
Beispiel #30
0
    def update_badges(self, id):
        user = get_entity_or_abort(model.User, id)
        badges = self.form_result.get('badge')

        if not has('global.admin'):
            # instance admins may only add user badges limited to this instance

            for badge in badges:
                if not badge.instance == c.instance:
                    h.flash(_(u'Invalid badge choice.'), u'error')
                    redirect(h.entity_url(user))

        creator = c.user

        added = []
        removed = []
        for badge in user.badges:
            if badge not in badges:
                removed.append(badge)
                user.badges.remove(badge)

        for badge in badges:
            if badge not in user.badges:
                badge.assign(user, creator)
                added.append(badge)

        model.meta.Session.flush()
        # FIXME: needs commit() cause we do an redirect() which raises
        # an Exception.
        model.meta.Session.commit()
        post_update(user, model.update.UPDATE)
        redirect(h.entity_url(user, instance=c.instance))
Beispiel #31
0
 def create(self, id, format='html'):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.message(c.page_user)
     try:
         self.form_result = MessageCreateForm().to_python(request.params)
     except Invalid, i:
         return self.new(id, errors=i.unpack_errors())
Beispiel #32
0
 def _new(self, proposal_id, template, errors):
     c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
     require.selection.create(c.proposal)
     defaults = dict(request.params)
     c.proposal_tile = tiles.proposal.ProposalTile(c.proposal)
     return htmlfill.render(render(template), defaults=defaults,
                            errors=errors, force_defaults=False)
Beispiel #33
0
    def update(self, id):
        c.page_user = get_entity_or_abort(model.User, id,
                                          instance_filter=False)
        require.user.edit(c.page_user)
        if self.form_result.get("password_change"):
            c.page_user.password = self.form_result.get("password_change")
        c.page_user.display_name = self.form_result.get("display_name")
        c.page_user.page_size = self.form_result.get("page_size")
        c.page_user.no_help = self.form_result.get("no_help")
        c.page_user.bio = self.form_result.get("bio")
        email = self.form_result.get("email").lower()
        email_changed = email != c.page_user.email
        c.page_user.email = email
        c.page_user.email_priority = self.form_result.get("email_priority")
        #if c.page_user.twitter:
        #    c.page_user.twitter.priority = \
        #        self.form_result.get("twitter_priority")
        #    model.meta.Session.add(c.page_user.twitter)
        locale = Locale(self.form_result.get("locale"))
        if locale and locale in i18n.LOCALES:
            c.page_user.locale = locale
        model.meta.Session.add(c.page_user)
        model.meta.Session.commit()
        if email_changed:
            libmail.send_activation_link(c.page_user)

        if c.page_user == c.user:
            event.emit(event.T_USER_EDIT, c.user)
        else:
            event.emit(event.T_USER_ADMIN_EDIT, c.page_user, admin=c.user)
        redirect(h.entity_url(c.page_user))
Beispiel #34
0
    def show(self, id, format='html'):
        c.page_instance = get_entity_or_abort(model.Instance, id)
        require.instance.show(c.page_instance)

        if format == 'json':
            return render_json(c.page_instance)

        if format == 'rss':
            return self.activity(id, format)

        if c.page_instance != c.instance:
            redirect(h.entity_url(c.page_instance))

        c.tile = tiles.instance.InstanceTile(c.page_instance)
        proposals = model.Proposal.all(instance=c.page_instance)
        c.new_proposals_pager = pager.proposals(
            proposals, size=7, enable_sorts=False,
            enable_pages=False, default_sort=sorting.entity_newest)
        #pages = model.Page.all(instance=c.page_instance,
        #        functions=[model.Page.NORM])
        #c.top_pages_pager = pager.pages(
        #    pages, size=7, enable_sorts=False,
        #    enable_pages=False, default_sort=sorting.norm_selections)
        #tags = model.Tag.popular_tags(limit=40)
        #c.tags = sorted(text.tag_cloud_normalize(tags),
        #                key=lambda (k, c, v): k.name)
        if c.page_instance.milestones:
            c.milestones = model.Milestone.all(instance=c.page_instance)
        c.stats = {
            'comments': model.Comment.all_q().count(),
            'proposals': model.Proposal.all_q(
                instance=c.page_instance).count(),
            'members': model.Membership.all_q().count()
        }
        return render("/instance/show.html")
Beispiel #35
0
    def votes(self, id, format='html'):
        c.poll = get_entity_or_abort(model.Poll, id)

        # cover over data inconsistency because of a bug where pages (norms)
        # were deleted when a proposal was deleted.
        # Fixes http://trac.adhocracy.de/ticket/262
        if (c.poll.action == model.Poll.SELECT and
                c.poll.selection is None):
            logmsg = ('Poll: "%s" is a model.Poll.rate poll, which should '
                      'have a selection, but the selection is None. Subject '
                      'of the Poll is %s') % (c.poll, c.poll.subject)
            log.error(logmsg)
            raise abort(404)

        require.poll.show(c.poll)
        decisions = democracy.Decision.for_poll(c.poll)
        if (hasattr(self, 'form_result') and
                self.form_result.get('result') is not None):
            result_form = self.form_result.get('result')
            decisions = filter(lambda d: d.result == result_form, decisions)
        c.decisions_pager = pager.scope_decisions(decisions)

        if format == 'json':
            return render_json(c.decisions_pager)
        elif format == 'ajax':
            return render_def('/pager.html', 'overlay_pager',
                              pager=c.decisions_pager,
                              render_facets=False)
        elif format == 'overlay':
            return render("/poll/votes.html", overlay=True)
        else:
            return render("/poll/votes.html")
Beispiel #36
0
    def show(self, id, format='html'):
        c.delegation = get_entity_or_abort(model.Delegation, id)
        require.delegation.show(c.delegation)
        c.scope = c.delegation.scope
        decisions = democracy.Decision.for_user(c.delegation.principal,
                                                c.instance)
        decisions = filter(lambda d: c.delegation in d.delegations, decisions)
        decisions = filter(
            lambda d: isinstance(d.poll.subject, model.Proposal), decisions)
        c.decisions_pager = pager.NamedPager(
            'decisions',
            decisions,
            tiles.decision.user_row,
            sorts={
                _("oldest"): sorting.entity_oldest,
                _("newest"): sorting.entity_newest
            },
            default_sort=sorting.entity_newest)

        if format == 'json':
            return render_json((c.delegation, c.decisions_pager))
        elif format == 'overlay':
            return render("delegation/show.html", overlay=True)
        else:
            return render("delegation/show.html")
Beispiel #37
0
    def update_badges(self, id, format='html'):
        instance = get_entity_or_abort(model.Instance, id)
        editable_badges = self._editable_badges(instance)
        badges = self.form_result.get('badge')
        #remove badges
        for badge in instance.badges:
            if badge not in editable_badges:
                # the user can not edit the badge, so we don't remove it
                continue
            if badge not in badges:
                instance.badges.remove(badge)
        #add badges
        for badge in badges:
            if badge not in instance.badges:
                badge.assign(instance, c.user)

        model.meta.Session.commit()
        post_update(instance, model.update.UPDATE)
        if format == 'ajax':
            obj = {
                'html':
                render_def('/badge/tiles.html',
                           'badges',
                           badges=instance.badges)
            }
            return render_json(obj)
Beispiel #38
0
 def create(self, proposal_id, format="html"):
     c.proposal = get_entity_or_abort(model.Proposal, proposal_id)
     require.selection.create(c.proposal)
     try:
         self.form_result = SelectionCreateForm().to_python(request.params)
     except Invalid, i:
         return self.propose(proposal_id, errors=i.unpack_errors())
Beispiel #39
0
    def show(self, id, format='html'):
        poll = get_entity_or_abort(model.Poll, id)
        require.poll.show(poll)

        if format == 'json':
            return render_json(poll)

        return self.not_implemented(format=format)
Beispiel #40
0
    def show(self, id, format='html'):
        poll = get_entity_or_abort(model.Poll, id)
        require.poll.show(poll)

        if format == 'json':
            return render_json(poll)
        else:
            return self.not_implemented(format=format)
Beispiel #41
0
 def new_proposal(self, proposal_id, errors={}, format=u'html'):
     c.proposal = get_entity_or_abort(Proposal, proposal_id)
     require.proposal.message(c.proposal)
     defaults = dict(request.params)
     return htmlfill.render(render('/massmessage/new_proposal.html',
                                   overlay=format == u'overlay'),
                            defaults=defaults, errors=errors,
                            force_defaults=False)
Beispiel #42
0
 def show(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.show(c.comment)
     if format == 'fwd':
         redirect(h.entity_url(c.comment))
     elif format == 'json':
         return render_json(c.comment)
     return render('/comment/show.html')
Beispiel #43
0
 def resend(self, id):
     c.page_user = get_entity_or_abort(model.User, id,
                                       instance_filter=False)
     require.user.edit(c.page_user)
     libmail.send_activation_link(c.page_user)
     h.flash(_("The activation link has been re-sent to your email "
               "address."), 'notice')
     redirect(h.entity_url(c.page_user, member='edit'))
Beispiel #44
0
 def new(self, id, format='html', errors={}):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.message(c.page_user)
     html = render("/message/new.html", overlay=format == u'overlay')
     return htmlfill.render(html,
                            defaults=request.params,
                            errors=errors,
                            force_defaults=False)
Beispiel #45
0
 def badges(self, id, errors=None):
     c.badges = model.Badge.all()
     c.badges = filter(lambda x: not x.badge_delegateable, c.badges)
     c.badges = sorted(c.badges, key=attrgetter('title'))
     c.page_user = get_entity_or_abort(model.User, id)
     defaults = {'badge': [str(badge.id) for badge in c.page_user.badges]}
     return formencode.htmlfill.render(
         render("/user/badges.html"),
         defaults=defaults)
Beispiel #46
0
 def resend(self, id):
     c.page_user = get_entity_or_abort(model.User, id,
                                       instance_filter=False)
     require.user.edit(c.page_user)
     libmail.send_activation_link(c.page_user)
     path = request.params.get('came_from', None)
     ret_success(
         message=_("The activation link has been re-sent to your email "
                   "address."), category='success',
         entity=c.page_user, member='edit', force_path=path)
Beispiel #47
0
    def set_password(self, id):
        c.page_user = get_entity_or_abort(model.User, id,
                                          instance_filter=False)
        require.user.edit(c.page_user)
        c.page_user.password = self.form_result.get('password')
        model.meta.Session.add(c.page_user)
        model.meta.Session.commit()

        h.flash(_('Password has been set. Have fun!'), 'success')
        redirect(h.base_url('/'))
Beispiel #48
0
 def delete(self, id):
     c.page_user = get_entity_or_abort(model.User, id)
     require.user.delete(c.page_user)
     c.page_user.delete()
     model.meta.Session.commit()
     h.flash(_("The account has been deleted."), 'success')
     if c.instance is not None:
         redirect(h.instance.url(c.instance))
     else:
         redirect(h.site.base_url(instance=None))
Beispiel #49
0
    def show(self, id, format="html"):
        c.page_instance = get_entity_or_abort(model.Instance, id)
        require.instance.show(c.page_instance)

        if format == "json":
            return render_json(c.page_instance)

        if format == "rss":
            return self.activity(id, format)

        if c.page_instance != c.instance:
            redirect(h.entity_url(c.page_instance))

        c.tile = tiles.instance.InstanceTile(c.page_instance)
        proposals = model.Proposal.all(instance=c.page_instance)
        c.new_proposals_pager = pager.proposals(
            proposals, size=7, enable_sorts=False, enable_pages=False, default_sort=sorting.entity_newest
        )

        c.sidebar_delegations = (
            _("Delegations are enabled.") if c.page_instance.allow_delegate else _("Delegations are disabled.")
        )

        # pages = model.Page.all(instance=c.page_instance,
        #        functions=[model.Page.NORM])
        # c.top_pages_pager = pager.pages(
        #    pages, size=7, enable_sorts=False,
        #    enable_pages=False, default_sort=sorting.norm_selections)
        # tags = model.Tag.popular_tags(limit=40)
        # c.tags = sorted(text.tag_cloud_normalize(tags),
        #                key=lambda (k, c, v): k.name)

        if asbool(config.get("adhocracy.show_instance_overview_milestones")) and c.page_instance.milestones:

            number = asint(config.get("adhocracy.number_instance_overview_milestones", 3))

            milestones = model.Milestone.all_future_q(instance=c.page_instance).limit(number).all()

            c.next_milestones_pager = pager.milestones(
                milestones, size=number, enable_sorts=False, enable_pages=False, default_sort=sorting.milestone_time
            )

        events = model.Event.find_by_instance(c.page_instance, limit=3)

        c.events_pager = pager.events(events, enable_pages=False, enable_sorts=False)

        c.stats = {
            "comments": model.Comment.all_q().count(),
            "proposals": model.Proposal.all_q(instance=c.page_instance).count(),
            "members": model.Membership.all_q().count(),
        }
        c.tutorial_intro = _("tutorial_instance_show_intro")
        c.tutorial = "instance_show"
        return render("/instance/show.html")
Beispiel #50
0
 def history(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.show(c.comment)
     c.revisions_pager = NamedPager(
         'revisions', c.comment.revisions, tiles.revision.row, count=10,
         sorts={_("oldest"): sorting.entity_oldest,
                _("newest"): sorting.entity_newest},
                                  default_sort=sorting.entity_newest)
     if format == 'json':
         return render_json(c.revisions_pager)
     return render('/comment/history.html')
Beispiel #51
0
    def delete(self, id, format='html'):
        c.comment = get_entity_or_abort(model.Comment, id)
        require.comment.delete(c.comment)
        c.comment.delete()
        model.meta.Session.commit()

        event.emit(event.T_COMMENT_DELETE, c.user, instance=c.instance,
                   topics=[c.comment.topic], comment=c.comment,
                   topic=c.comment.topic)
        return ret_success(message=_("The comment has been deleted."),
                           entity=c.comment.topic,
                           format=format)