Пример #1
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")
Пример #2
0
Файл: tag.py Проект: alkadis/vcv
    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")
Пример #3
0
    def all(self, format="html"):
        if c.instance is None:
            require.perm("event.index_all")

        events = (
            model.Event.all_q(
                instance=c.instance, include_hidden=False, event_filter=request.params.getall("event_filter")
            )
            .order_by(model.Event.time.desc())
            .limit(min(int(request.params.get("count", 50)), 100))
            .all()
        )

        if format == "rss":
            return event.rss_feed(
                events, _("%s News" % h.site.name()), h.base_url(instance=None), _("News from %s") % h.site.name()
            )

        elif format == "ajax":
            query_params = request.params.copy()
            while True:
                try:
                    query_params.pop("count")
                except KeyError:
                    break

            more_url = h.base_url(instance=c.instance, member="event/all", query_params=query_params)
            return render_def("/event/tiles.html", "carousel", events=events, more_url=more_url)
        else:
            c.event_pager = pager.events(events, count=50)

            if format == "overlay":
                return render("/event/all.html", overlay=True, overlay_size=OVERLAY_SMALL)
            else:
                return render("/event/all.html")
Пример #4
0
    def all(self, format='html'):
        events = model.Event.all_q(
            include_hidden=False,
            event_filter=request.params.getall('event_filter'))\
            .order_by(model.Event.time.desc())\
            .limit(min(int(request.params.get('count', 50)), 100)).all()

        if format == 'rss':
            return event.rss_feed(events,
                                  _('%s News' % h.site.name()),
                                  h.base_url(instance=None),
                                  _("News from %s") % h.site.name())

        elif format == 'ajax':
            query_params = request.params.copy()
            while True:
                try:
                    query_params.pop('count')
                except KeyError:
                    break

            more_url = h.base_url(instance=None,
                                  member='event/all',
                                  query_params=query_params)
            return render_def('/event/tiles.html', 'carousel',
                              events=events, more_url=more_url)
        else:
            c.event_pager = pager.events(events, count=50)

            if format == 'overlay':
                return render('/event/all.html', overlay=True,
                              overlay_size=OVERLAY_SMALL)
            else:
                return render('/event/all.html')
Пример #5
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")
Пример #6
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')
Пример #7
0
    def index(self, format='html'):

        if c.instance:
            redirect(h.entity_url(c.instance))

        if format == 'rss':
            return EventController().all(format='rss')

        name = config.get('adhocracy.redirect_startpage_to_instance')
        if name != u'':
            # get_entity_or_abort does no work for instances
            instance = model.Instance.find(name)
            if instance is not None:
                redirect(h.entity_url(instance))

        data = {}

        instances_in_root = config.get_int(
            'adhocracy.startpage.instances.list_length')
        if instances_in_root > 0:
            data['instances'] = model.Instance.all(limit=instances_in_root)
        elif instances_in_root == -1:
            data['instances'] = model.Instance.all()

        add_static_content(data, u'adhocracy.static_index_path')
        c.body_css_classes += data.get('css_classes', [])
        c.body_css_classes.append('added_static_content')
        if data['title'] is None:
            data['title'] = config.get('adhocracy.site.name')

        proposals_number = config.get_int(
            'adhocracy.startpage.proposals.list_length')

        if proposals_number > 0:
            proposals = model.Proposal.all_q()\
                .join(model.Instance).filter(not_(
                    model.Instance.key.in_(model.Instance.SPECIAL_KEYS)))\
                .order_by(model.Proposal.create_time.desc())

            data['new_proposals_pager'] = pager.proposals(
                proposals, size=proposals_number,
                default_sort=sorting.entity_newest,
                enable_pages=False,
                enable_sorts=False)
        else:
            data['new_proposals_pager'] = None

        if config.get_bool('adhocracy.show_stats_on_frontpage'):
            data['stats_global'] = {
                "members": model.User.all_q().count(),
                "comments": model.Comment.all_q().count(),
                "proposals": model.Proposal.all_q().count(),
                "votes": model.Vote.all_q().count(),
            }

        if format == 'overlay':
            return render('index.html', data, overlay=True)
        else:
            return render('index.html', data)
Пример #8
0
Файл: tag.py Проект: alkadis/vcv
 def index(self, format='html'):
     tags = model.Tag.popular_tags(limit=500)
     if format == 'json':
         return render_json(tags)
     c.tags = sorted(h.tag.tag_cloud_normalize(tags),
                     key=lambda (k, c, v): k.name.lower())
     if format == 'overlay':
         return render("/tag/index.html", overlay=True)
     else:
         return render("/tag/index.html")
Пример #9
0
 def serve(self, page_name, format='html'):
     begin_time = time()
     c.static = StaticPage(page_name)
     if not c.static.exists:
         abort(404, _('The requested page was not found'))
     if format == 'simple':
         ret = render('/plain_doc.html')
     else:
         ret = render('/template_doc.html')
     ms = (time() - begin_time) * 1000
     log.debug("Rendering static %s took %sms" % (page_name, ms))
     return ret
Пример #10
0
 def serve(self, page_name, format='html'):
     begin_time = time()
     c.static = StaticPage(page_name)
     if not c.static.exists:
         abort(404, _('The requested page was not found'))
     if format == 'simple':
         ret = render('/plain_doc.html')
     else:
         ret = render('/template_doc.html')
     ms = (time() - begin_time) * 1000
     log.debug("Rendering static %s took %sms" % (page_name, ms))
     return ret
Пример #11
0
 def edit(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.edit(c.comment)
     extra_vars = {'comment': c.comment}
     if c.came_from != u'':
         extra_vars[u'came_from'] = c.came_from
     if format == 'ajax':
         return render_def('/comment/tiles.html', 'edit_form',
                           extra_vars=extra_vars)
     elif format == 'overlay':
         return render('/comment/edit.html', overlay=True)
     else:
         return render('/comment/edit.html')
Пример #12
0
 def _failure(self, openid, message):
     """
     Abort an OpenID authenication attempt and return to login page,
     giving an error message at the openid field.
     """
     log.info("OpenID: %s - Error: %s" % (openid, message))
     if c.user:
         h.flash(message, "error")
         return redirect(h.entity_url(c.user, member="settings/login"))
     else:
         loginhtml = render("/user/login_tile.html")
         form = formencode.htmlfill.render(loginhtml, defaults={"openid": openid}, errors={"openid": message})
         return render("/user/login.html", {"login_form_code": form})
Пример #13
0
    def serve(self, key, format='html'):
        page = get_static_page(key)
        if page is None:
            return abort(404, _('The requested page was not found'))

        data = {
            'static': page,
            'active_global_nav': key,
        }
        if format == 'simple':
            ret = render('/plain_doc.html', data)
        else:
            ret = render('/template_doc.html', data)
        return ret
Пример #14
0
 def edit(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.edit(c.comment)
     extra_vars = {'comment': c.comment}
     if c.came_from != u'':
         extra_vars[u'came_from'] = c.came_from
     if format == 'ajax':
         return render_def('/comment/tiles.html',
                           'edit_form',
                           extra_vars=extra_vars)
     elif format == 'overlay':
         return render('/comment/edit.html', overlay=True)
     else:
         return render('/comment/edit.html')
Пример #15
0
    def index(self, format="html"):

        c.active_global_nav = 'instances'

        include_hidden = h.has_permission('global.admin')
        c.instance_pager = pager.solr_instance_pager(include_hidden)

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

        c.tile = tiles.instance.InstanceTile(c.instance)
        if format == 'overlay':
            return render("/instance/index.html", overlay=True)
        else:
            return render("/instance/index.html")
Пример #16
0
 def _failure(self, openid, message):
     """
     Abort an OpenID authenication attempt and return to login page,
     giving an error message at the openid field.
     """
     log.info("OpenID: %s - Error: %s" % (openid, message))
     if c.user:
         h.flash(message, 'error')
         return redirect(h.entity_url(c.user, member='settings/login'))
     else:
         loginhtml = render("/user/login_tile.html")
         form = formencode.htmlfill.render(loginhtml,
                                           defaults={'openid': openid},
                                           errors={'openid': message})
         return render('/user/login.html', {'login_form_code': form})
Пример #17
0
 def settings_voting_form(self, id):
     c.page_instance = self._get_current_instance(id)
     c.settings_menu = self.settings_menu(c.page_instance, 'voting')
     c.delay_options = []
     for delay in ((0, _("No delay")), (1, _("1 Day")), (2, _("2 Days")),
                   (7, _("One Week")), (14, _("Two Weeks")),
                   (28, _("Four Weeks"))):
         c.delay_options.append({
             'value':
             delay[0],
             'label':
             h.literal(delay[1]),
             'selected':
             c.page_instance.activation_delay == delay[0]
         })
     c.majority_options = []
     for majority in ((0.5, _("A simple majority (½ of vote)")),
                      (0.66, _("A two-thirds majority"))):
         c.majority_options.append({
             'value':
             majority[0],
             'label':
             h.literal(majority[1]),
             'selected':
             c.page_instance.required_majority == majority[0]
         })
     return render("/instance/settings_voting.html")
Пример #18
0
 def user_import_form(self, errors=None, format="html"):
     return formencode.htmlfill.render(
         render("/admin/userimport_form.html", {}, overlay=format == "overlay"),
         defaults=dict(request.params),
         errors=errors,
         force_defaults=False,
     )
Пример #19
0
    def settings_general_form(self, id):
        c.page_instance = self._get_current_instance(id)
        c.settings_menu = self.settings_menu(c.page_instance, 'general')
        c.locales = []
        for locale in i18n.LOCALES:
            c.locales.append({
                'value': str(locale),
                'label': locale.display_name,
                'selected': locale == c.page_instance.locale
            })

        c.default_group_options = []
        c.default_group = (c.page_instance.default_group.code
                           if c.page_instance.default_group else
                           model.Group.INSTANCE_DEFAULT)

        for groupname in model.Group.INSTANCE_GROUPS:
            group = model.Group.by_code(groupname)
            c.default_group_options.append({
                'value':
                group.code,
                'label':
                h.literal(_(group.group_name)),
                'selected':
                group.code == c.default_group
            })

        rendered = render("/instance/settings_general.html")
        return rendered
Пример #20
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")
Пример #21
0
 def add(self, errors=None):
     c.form_title = c.save_button = _("Add Badge")
     c.action_url = self.base_url + '/add'
     c.groups = meta.Session.query(Group).order_by(Group.group_name).all()
     return htmlfill.render(render("/badge/form.html"),
                            defaults=dict(request.params),
                            errors=errors)
Пример #22
0
    def preview(self, subject, body, recipients, sender_email, sender_name,
                instance, include_footer):
        recipients_list = sorted(list(recipients), key=lambda r: r.name)
        if recipients_list:
            try:
                rendered_body = render_body(body, recipients_list[0],
                                            is_preview=True)
            except (KeyError, ValueError) as e:
                rendered_body = _('Could not render message: %s') % str(e)
        else:
            rendered_body = body

        # wrap body, but leave long words (e.g. links) intact
        rendered_body = u'\n'.join(textwrap.fill(line, break_long_words=False)
                                   for line in rendered_body.split(u'\n'))

        data = {
            'sender_email': sender_email,
            'sender_name': sender_name,
            'subject': subject,
            'body': rendered_body,
            'recipients': recipients_list,
            'recipients_count': len(recipients_list),
            'params': request.params,
            'include_footer': include_footer,
            'instance': instance,
        }
        return render('/massmessage/preview.html', data)
Пример #23
0
    def settings_general_form(self, id):
        c.page_instance = self._get_current_instance(id)
        c.settings_menu = self.settings_menu(c.page_instance, "general")
        c.locales = []
        for locale in i18n.LOCALES:
            c.locales.append(
                {"value": str(locale), "label": locale.display_name, "selected": locale == c.page_instance.locale}
            )

        c.default_group_options = []
        c.default_group = (
            c.page_instance.default_group.code if c.page_instance.default_group else model.Group.INSTANCE_DEFAULT
        )

        for groupname in model.Group.INSTANCE_GROUPS:
            group = model.Group.by_code(groupname)
            c.default_group_options.append(
                {
                    "value": group.code,
                    "label": h.literal(_(group.group_name)),
                    "selected": group.code == c.default_group,
                }
            )

        rendered = render("/instance/settings_general.html")
        return rendered
Пример #24
0
    def _settings_voting_form(self, id):
        c.page_instance = self._get_current_instance(id)
        c.settings_menu = settings_menu(c.page_instance, 'voting')
        c.delay_options = []
        for delay in ((0, _("No delay")),
                      (1, _("1 Day")),
                      (2, _("2 Days")),
                      (7, _("One Week")),
                      (14, _("Two Weeks")),
                      (28, _("Four Weeks"))):
            c.delay_options.append(
                {'value': delay[0],
                 'label': h.literal(delay[1]),
                 'selected': c.page_instance.activation_delay == delay[0]})
        c.majority_options = []
        for majority in ((0.5, _("A simple majority (½ of vote)")),
                         (0.66, _("A two-thirds majority"))):
            c.majority_options.append(
                {'value': majority[0],
                 'label': h.literal(majority[1]),
                 'selected': c.page_instance.required_majority == majority[0]})
        if votedetail.is_enabled():
            c.votedetail_all_userbadges = model.UserBadge.all(
                instance=c.page_instance, include_global=True)
        else:
            c.votedetail_all_userbadges = None

        return render("/instance/settings_voting.html")
Пример #25
0
    def new(self, id=None, errors={}, format=u'html'):

        if id is None:
            require.perm('global.message')
            template = '/massmessage/new.html'
            c.preview_url = h.base_url('/message/preview')
        else:
            c.page_instance = InstanceController._get_current_instance(id)
            require.instance.message(c.page_instance)
            template = '/instance/message.html'
            c.preview_url = h.base_url('/instance/%s/message/preview' % id)

        defaults = dict(request.params)
        defaults.setdefault('include_footer', 'on')

        data = {
            'instances': self._get_allowed_instances(c.user),
            'sender_options': self._get_allowed_sender_options(c.user),
            'userbadges': UserBadge.all(instance=c.instance,
                                        include_global=True)
        }

        return htmlfill.render(render(template,
                                      data,
                                      overlay=format == u'overlay'),
                               defaults=defaults,
                               errors=errors,
                               force_defaults=False)
Пример #26
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')
Пример #27
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)
Пример #28
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")
Пример #29
0
    def document(self):
        resp = request.environ.get('pylons.original_response')
        if resp is None:
            raise abort(404)
        response.status = resp.status
        if resp.content_type == 'text/javascript':
            response.content_type == resp.content_type
            return resp.body

        # YOU DO NOT SEE THIS. IF YOU DO, ITS NOT WHAT IT LOOKS LIKE
        # I DID NOT HAVE REGEX RELATIONS WITH THAT HTML PAGE
        for match in BODY_RE.finditer(resp.body):
            c.error_message = match.group(1)

        c.error_code = cgi.escape(request.GET.get('code',
                                                  str(resp.status_int)))

        if not c.error_message:
            c.error_message = _("Error %s") % c.error_code

        if asbool(config.get('adhocracy.interactive_debugging', 'false')):
            c.trace_url = request.environ['pylons.original_response']\
                .headers.get('X-Debug-URL', None)

            if c.trace_url is not None:
                # this may only happen in debug mode
                assert (asbool(config.get('debug', 'false')))
        else:
            c.trace_url = None

        return render("/error/http.html")
Пример #30
0
    def explain(self):
        if not config.get_bool("adhocracy.debug.sql"):
            raise ValueError("Not in debugging mode")
        statement = request.params.get("statement")
        if not statement.lower().startswith("select"):
            raise ValueError("We explain only select statements")
        parameters = request.params.get("parameters")
        c.parameters = json_loads(parameters)

        # collect explain results
        if engine.name.startswith("sqlite"):
            explain_query = "EXPLAIN QUERY PLAN %s" % statement
        else:
            explain_query = "EXPLAIN %s" % statement

        explain_result = engine.execute(explain_query, c.parameters)
        data_result = engine.execute(statement, c.parameters)
        c.results = []
        for (title, result) in (("Explain", explain_result), ("Data", data_result)):
            c.results.append({"title": title, "result": result.fetchall(), "headers": result.keys()})

        # other data to display
        c.statement = statement
        c.duration = float(request.params["duration"])

        return render("/debug/explain.html")
Пример #31
0
    def index(self, format='html'):
        require.proposal.index()
        if c.instance:
            redirect(h.entity_url(c.instance))

        c.instances = model.Instance.all()[:5]
        c.page = StaticPage('index')

        #query = self.form_result.get('proposals_q')
        #proposals = libsearch.query.run(query,
        #                                entity_type=model.Proposal)[:10]
        c.milestones = model.Milestone.all()
        #c.proposals_pager = pager.proposals(proposals)
        #c.proposals = c.proposals_pager.here()
        c.stats_global = {
                "members": model.User.all_q().count(),
                "comments": model.Comment.all_q().count(),
                "proposals": model.Proposal.all_q().count(),
                "votes": model.Vote.all_q().count(),
            }

        if format == 'rss':
            return EventController().all(format='rss')

        return render('index.html')
Пример #32
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")
Пример #33
0
    def new(self, id=None, errors={}, format=u'html'):

        if id is None:
            require.perm('global.message')
            template = '/massmessage/new.html'
            c.preview_url = h.base_url('/message/preview')
        else:
            c.page_instance = InstanceController._get_current_instance(id)
            require.instance.message(c.page_instance)
            template = '/instance/message.html'
            c.preview_url = h.base_url(
                '/instance/%s/message/preview' % id)

        defaults = dict(request.params)
        defaults.setdefault('include_footer', 'on')

        data = {
            'instances': self._get_allowed_instances(c.user),
            'sender_options': self._get_allowed_sender_options(c.user),
            'userbadges': UserBadge.all(instance=c.instance,
                                        include_global=True)
        }

        return htmlfill.render(render(template, data,
                                      overlay=format == u'overlay'),
                               defaults=defaults, errors=errors,
                               force_defaults=False)
Пример #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")
Пример #35
0
 def settings_voting_form(self, id):
     c.page_instance = self._get_current_instance(id)
     c.settings_menu = self.settings_menu(c.page_instance, "voting")
     c.delay_options = []
     for delay in (
         (0, _("No delay")),
         (1, _("1 Day")),
         (2, _("2 Days")),
         (7, _("One Week")),
         (14, _("Two Weeks")),
         (28, _("Four Weeks")),
     ):
         c.delay_options.append(
             {
                 "value": delay[0],
                 "label": h.literal(delay[1]),
                 "selected": c.page_instance.activation_delay == delay[0],
             }
         )
     c.majority_options = []
     for majority in ((0.5, _("A simple majority (½ of vote)")), (0.66, _("A two-thirds majority"))):
         c.majority_options.append(
             {
                 "value": majority[0],
                 "label": h.literal(majority[1]),
                 "selected": c.page_instance.required_majority == majority[0],
             }
         )
     return render("/instance/settings_voting.html")
Пример #36
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")
Пример #37
0
    def edit(self, id):
        c.page_instance = self._get_current_instance(id)
        require.instance.edit(c.page_instance)

        c._Group = model.Group
        c.locales = i18n.LOCALES
        default_group = c.page_instance.default_group.code if \
                        c.page_instance.default_group else \
                        model.Group.INSTANCE_DEFAULT
        return htmlfill.render(render("/instance/edit.html"),
                               defaults={
                                   '_method': 'PUT',
                                   'label': c.page_instance.label,
                                   'description': c.page_instance.description,
                                   'css': c.page_instance.css,
                                   'required_majority':
                                   c.page_instance.required_majority,
                                   'activation_delay':
                                   c.page_instance.activation_delay,
                                   'allow_adopt': c.page_instance.allow_adopt,
                                   'allow_delegate':
                                   c.page_instance.allow_delegate,
                                   'allow_propose':
                                   c.page_instance.allow_propose,
                                   'allow_index': c.page_instance.allow_index,
                                   'hidden': c.page_instance.hidden,
                                   'milestones': c.page_instance.milestones,
                                   'frozen': c.page_instance.frozen,
                                   'locale': c.page_instance.locale,
                                   'use_norms': c.page_instance.use_norms,
                                   '_tok': csrf.token_id(),
                                   'default_group': default_group
                               })
Пример #38
0
 def sitemap_xml(self):
     if c.instance:
         redirect(h.base_url(None, path="/sitemap.xml"))
     c.delegateables = model.Delegateable.all()
     c.change_time = datetime.utcnow()
     response.content_type = "text/xml"
     return render("sitemap.xml")
Пример #39
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')
Пример #40
0
 def user_import_form(self, errors=None, format='html'):
     return formencode.htmlfill.render(render("/admin/userimport_form.html",
                                              {},
                                              overlay=format == 'overlay'),
                                       defaults=dict(request.params),
                                       errors=errors,
                                       force_defaults=False)
Пример #41
0
 def settings_members_import_save(self, id, format='html'):
     c.page_instance = self._get_current_instance(id)
     c.settings_menu = settings_menu(c.page_instance,
                                     'members_import')
     require.instance.edit(c.page_instance)
     AdminController()._create_users(self.form_result)
     return(render("/instance/settings_members_import_success.html"))
Пример #42
0
    def index(self, format='html'):
        require.proposal.index()
        if c.instance:
            redirect(h.entity_url(c.instance))

        instances_in_root = asint(
            config.get('adhocracy.startpage.instances.list_length', 0))
        if instances_in_root > 0:
            c.instances = model.Instance.all(limit=instances_in_root)
        elif instances_in_root == -1:
            c.instances = model.Instance.all()

        c.page = StaticPage('index')

        #query = self.form_result.get('proposals_q')
        #proposals = libsearch.query.run(query,
        #                                entity_type=model.Proposal)[:10]
        c.milestones = model.Milestone.all()
        #c.proposals_pager = pager.proposals(proposals)
        #c.proposals = c.proposals_pager.here()
        c.stats_global = {
            "members": model.User.all_q().count(),
            "comments": model.Comment.all_q().count(),
            "proposals": model.Proposal.all_q().count(),
            "votes": model.Vote.all_q().count(),
        }

        if format == 'rss':
            return EventController().all(format='rss')

        return render('index.html')
Пример #43
0
    def preview(self, subject, body, recipients, sender_email, sender_name,
                instance, include_footer):
        recipients_list = sorted(list(recipients), key=lambda r: r.name)
        if recipients_list:
            try:
                rendered_body = render_body(body,
                                            recipients_list[0],
                                            is_preview=True)
            except (KeyError, ValueError) as e:
                rendered_body = _('Could not render message: %s') % str(e)
        else:
            rendered_body = body

        # wrap body, but leave long words (e.g. links) intact
        rendered_body = u'\n'.join(
            textwrap.fill(line, break_long_words=False)
            for line in rendered_body.split(u'\n'))

        data = {
            'sender_email': sender_email,
            'sender_name': sender_name,
            'subject': subject,
            'body': rendered_body,
            'recipients': recipients_list,
            'recipients_count': len(recipients_list),
            'params': request.params,
            'include_footer': include_footer,
            'instance': instance,
        }
        return render('/massmessage/preview.html', data)
Пример #44
0
 def edit(self, id, format='html'):
     c.comment = get_entity_or_abort(model.Comment, id)
     require.comment.edit(c.comment)
     extra_vars = {'comment': c.comment}
     ret_url = request.params.get(u'ret_url', u'')
     if validate_ret_url(ret_url):
         extra_vars[u'ret_url'] = ret_url
         c.ret_url = ret_url
     if format == 'ajax':
         return render_def('/comment/tiles.html',
                           'edit_form',
                           extra_vars=extra_vars)
     elif format == 'overlay':
         return render('/comment/edit.html', overlay=True)
     else:
         return render('/comment/edit.html')
Пример #45
0
    def edit(self, id):
        c.page_instance = self._get_current_instance(id)
        require.instance.edit(c.page_instance)

        c._Group = model.Group
        c.locales = i18n.LOCALES
        default_group = c.page_instance.default_group.code if \
                        c.page_instance.default_group else \
                        model.Group.INSTANCE_DEFAULT
        return htmlfill.render(
            render("/instance/edit.html"),
            defaults={
                '_method': 'PUT',
                'label': c.page_instance.label,
                'description': c.page_instance.description,
                'css': c.page_instance.css,
                'required_majority': c.page_instance.required_majority,
                'activation_delay': c.page_instance.activation_delay,
                'allow_adopt': c.page_instance.allow_adopt,
                'allow_delegate': c.page_instance.allow_delegate,
                'allow_propose': c.page_instance.allow_propose,
                'allow_index': c.page_instance.allow_index,
                'hidden': c.page_instance.hidden,
                'milestones': c.page_instance.milestones,
                'frozen': c.page_instance.frozen,
                'locale': c.page_instance.locale,
                'use_norms': c.page_instance.use_norms,
                '_tok': csrf.token_id(),
                'default_group': default_group})
Пример #46
0
 def add(self, errors=None):
     c.form_title = c.save_button = _("Add Badge")
     c.action_url = self.base_url + '/add'
     c.groups = meta.Session.query(Group).order_by(Group.group_name).all()
     return htmlfill.render(render("/badge/form.html"),
                            defaults=dict(request.params),
                            errors=errors)
Пример #47
0
    def explain(self):
        if not config.get('adhocracy.debug.sql'):
            raise ValueError('Not in debugging mode')
        statement = request.params.get('statement')
        if not statement.lower().startswith('select'):
            raise ValueError('We explain only select statements')
        parameters = request.params.get('parameters')
        c.parameters = json_loads(parameters)

        # collect explain results
        if engine.name.startswith('sqlite'):
            explain_query = 'EXPLAIN QUERY PLAN %s' % statement
        else:
            explain_query = 'EXPLAIN %s' % statement

        explain_result = engine.execute(explain_query, c.parameters)
        data_result = engine.execute(statement, c.parameters)
        c.results = []
        for (title, result) in (('Explain', explain_result), ('Data',
                                                              data_result)):
            c.results.append({
                'title': title,
                'result': result.fetchall(),
                'headers': result.keys()
            })

        # other data to display
        c.statement = statement
        c.duration = float(request.params['duration'])

        return render('/debug/explain.html')
Пример #48
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)
Пример #49
0
    def carousel(self, format=u"html"):
        if c.instance is None:
            require.perm("event.index_all")

        data = {u"data_url": h.base_url("/event/all", query_params=request.params)}

        return render("/event/carousel.html", data, overlay=format == u"overlay", overlay_size=OVERLAY_SMALL)
Пример #50
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")
Пример #51
0
class MessageController(BaseController):
    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)

    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())

        c.body = self.form_result.get('body')
        c.subject = self.form_result.get('subject')
        message = render("/message/body.txt")
        headers = {}
        if c.user.is_email_activated():
            headers['Reply-To'] = c.user.email

        from adhocracy.lib.mail import to_user
        label = h.site.name() if c.instance is None else c.instance.label
        subject = _("[%s] Message from %s: %s") % (label, c.user.name,
                                                   c.subject)
        to_user(c.page_user, subject, message, headers=headers)

        h.flash(_("Your message has been sent. Thanks."), 'success')
        redirect(h.entity_url(c.page_user, instance=c.instance))
Пример #52
0
    def post_login(self):
        if c.user:
            session['logged_in'] = True
            session.save()
            came_from = session.get('came_from', None)
            if came_from is not None:
                del session['came_from']
                session.save()
                redirect(came_from)
            # redirect to the dashboard inside the instance exceptionally
            # to be able to link to proposals and norms in the welcome
            # message.
            redirect(h.base_url(path='/user/%s/dashboard' % c.user.user_name))
        else:
            login_configuration = h.allowed_login_types()
            error_message = _("Invalid login")

            if 'username+password' in login_configuration:
                if 'email+password' in login_configuration:
                    error_message = _("Invalid email / user name or password")
                else:
                    error_message = _("Invalid user name or password")
            else:
                if 'email+password' in login_configuration:
                    error_message = _("Invalid email or password")

            return formencode.htmlfill.render(
                render("/user/login.html"),
                errors={"login": error_message})