Example #1
0
def my_pending_organizations():
    """
    Publishers with pending for approval
    :return:
    """
    log.debug('dashboard pending orgainzations')
    # Anonymous user should not be allowed to visit the link
    context = {
        u'model': model,
        u'for_view': True,
        u'user': g.user,
        u'auth_user_obj': g.userobj
    }
    data_dict = {u'user_obj': g.userobj}
    try:
        if not c.user:
            raise NotAuthorized
        pending_organizations = iati_h.organization_list_pending()
        extra_vars = _extra_template_variables(context, data_dict)
        page = h.get_page_number(request.params) or 1
        c.page = h.Page(
            collection=pending_organizations,
            page=page,
            url=h.pager_url,
            item_count=len(pending_organizations),
            items_per_page=20,
        )
        extra_vars["page"] = c.page
        extra_vars['pending_organizations'] = pending_organizations
        return render('user/dashboard_pending_organizations.html', extra_vars)
    except NotAuthorized:
        p.toolkit.abort(
            401,
            _('Unauthorized to visit pending publisher page %s') % '')
Example #2
0
    def index(self):
        group_type = self._guess_group_type()

        page = h.get_page_number(request.params) or 1
        items_per_page = 21

        context = {
            'model': model,
            'session': model.Session,
            'user': c.user,
            'for_view': True,
            'with_private': False
        }

        q = c.q = request.params.get('q', '')
        sort_by = c.sort_by_selected = request.params.get('sort')
        if sort_by is None:
            sort_by = 'title asc'
        try:
            self._check_access('site_read', context)
            self._check_access('group_list', context)
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        # pass user info to context as needed to view private datasets of
        # orgs correctly
        if c.userobj:
            context['user_id'] = c.userobj.id
            context['user_is_admin'] = c.userobj.sysadmin

        data_dict_global_results = {
            'all_fields': False,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group',
        }
        global_results = self._action('group_list')(context,
                                                    data_dict_global_results)

        data_dict_page_results = {
            'all_fields': True,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group',
            'limit': items_per_page,
            'offset': items_per_page * (page - 1),
        }
        page_results = self._action('group_list')(context,
                                                  data_dict_page_results)

        c.page = h.Page(
            collection=global_results,
            page=page,
            url=h.pager_url,
            items_per_page=items_per_page,
        )

        c.page.items = page_results
        return render(self._index_template(group_type),
                      extra_vars={'group_type': group_type})
Example #3
0
    def dashboard_datasets(self):
        """User Dashboard > My Datasets pagination."""
        context = {'for_view': True, 'user': c.user or c.author,
                   'auth_user_obj': c.userobj}
        data_dict = {'user_obj': c.userobj, 'include_datasets': True}

        try:
            user_dict = logic.get_action('user_show')(context, data_dict)
        except NotFound:
            abort(404, _('User not found'))
        except NotAuthorized:
            abort(401, _('Not authorized to see this page'))
        c.user_dict = user_dict

        items_per_page =  20  # , readme

        # check ckan version and call appropriate get_page number
        if p.toolkit.check_ckan_version(min_version='2.5.0',
                                        max_version='2.5.3'):
            page = self._get_page_number(request.params) or 1
        else:
            page = h.get_page_number(request.params)  or 1

        c.page = h.Page(
            collection=user_dict['datasets'],
            page=page,
            url=h.pager_url,
            item_count=len(user_dict['datasets']),
            items_per_page=items_per_page,
        )
        c.page.items = user_dict['datasets']

        return render('user/dashboard_datasets.html')
Example #4
0
def datasets():
    """
    User Dashboard > My Datasets pagination.
    """
    context = {u'for_view': True, u'user': g.user, u'auth_user_obj': g.userobj}
    data_dict = {u'user_obj': g.userobj, u'include_datasets': True}
    extra_vars = _extra_template_variables(context, data_dict)

    items_per_page = 10  # , readme

    # check ckan version and call appropriate get_page number
    if p.toolkit.check_ckan_version(min_version='2.5.0', max_version='2.5.3'):
        page = self._get_page_number(request.params) or 1
    else:
        page = h.get_page_number(request.params) or 1

    c.page = h.Page(
        collection=extra_vars['user_dict']['datasets'],
        page=page,
        url=h.pager_url,
        item_count=len(extra_vars['user_dict']['datasets']),
        items_per_page=items_per_page,
    )
    c.page.items = extra_vars['user_dict']['datasets']

    return render(u'user/dashboard_datasets.html', extra_vars)
Example #5
0
def index():
    page_number = h.get_page_number(request.params)
    q = request.params.get(u'q', u'')
    order_by = request.params.get(u'order_by', u'name')
    limit = int(
        request.params.get(u'limit', config.get(u'ckan.user_list_limit', 20)))
    context = {
        u'return_query': True,
        u'user': g.user,
        u'auth_user_obj': g.userobj
    }

    data_dict = {
        u'q': q,
        u'order_by': order_by
    }

    try:
        logic.check_access(u'user_list', context, data_dict)
    except logic.NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    users_list = logic.get_action(u'user_list')(context, data_dict)

    page = h.Page(
        collection=users_list,
        page=page_number,
        url=h.pager_url,
        item_count=users_list.count(),
        items_per_page=limit)

    extra_vars = {u'page': page, u'q': q, u'order_by': order_by}
    return base.render(u'user/list.html', extra_vars)
Example #6
0
    def index(self):
        c.q = request.params.get("q", "")

        context = {
            "model": model,
            "session": model.Session,
            "user": c.user,
            "auth_user_obj": c.userobj,
            "for_view": True,
        }

        data_dict = {"all_fields": True}

        if c.q:
            page = h.get_page_number(request.params)
            data_dict["q"] = c.q
            data_dict["limit"] = LIMIT
            data_dict["offset"] = (page - 1) * LIMIT
            data_dict["return_objects"] = True

        results = logic.get_action("tag_list")(context, data_dict)

        if c.q:
            c.page = h.Page(collection=results, page=page, item_count=len(results), items_per_page=LIMIT)
            c.page.items = results
        else:
            c.page = AlphaPage(
                collection=results, page=request.params.get("page", "A"), alpha_attribute="name", other_text=_("Other")
            )

        return base.render("tag/index.html")
Example #7
0
    def index(self):

        custom_base.g_analitics()

        group_type = self._guess_group_type()

        page = h.get_page_number(request.params) or 1
        items_per_page = 21

        context = {'model': model, 'session': model.Session,
                   'user': c.user or c.author, 'for_view': True,
                   'with_private': False}

        q = c.q = request.params.get('q', '')
        sort_by = c.sort_by_selected = request.params.get('sort')
        empty_string = ""
        # default sort by number of organization's datasets
        if sort_by is None or sort_by == empty_string:
            sort_by = 'package_count desc'
        try:
            self._check_access('site_read', context)
        except NotAuthorized:
            abort(401, _('Not authorized to see this page'))

        # pass user info to context as needed to view private datasets of
        # orgs correctly
        if c.userobj:
            context['user_id'] = c.userobj.id
            context['user_is_admin'] = c.userobj.sysadmin

        data_dict_global_results = {
            'all_fields': False,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group',
        }
        global_results = self._action('group_list')(context,
                                                    data_dict_global_results)

        data_dict_page_results = {
            'all_fields': True,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group',
            'limit': items_per_page,
            'offset': items_per_page * (page - 1),
        }
        page_results = self._action('group_list')(context,
                                                  data_dict_page_results)

        c.page = h.Page(
            collection=global_results,
            page=page,
            url=h.pager_url,
            items_per_page=items_per_page,
        )

        c.page.items = page_results
        return render(self._index_template(group_type),
                      extra_vars={'group_type': group_type})
Example #8
0
    def index(self):
        page = h.get_page_number(request.params)
        c.q = request.params.get('q', '')
        c.order_by = request.params.get('order_by', 'name')

        context = {
            'return_query': True,
            'user': c.user,
            'auth_user_obj': c.userobj
        }

        data_dict = {'q': c.q, 'order_by': c.order_by}

        limit = int(
            request.params.get('limit', config.get('ckan.user_list_limit',
                                                   20)))
        try:
            check_access('user_list', context, data_dict)
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        users_list = get_action('user_list')(context, data_dict)

        c.page = h.Page(collection=users_list,
                        page=page,
                        url=h.pager_url,
                        item_count=users_list.count(),
                        items_per_page=limit)
        return render('user/list.html')
Example #9
0
    def index(self):
        page = h.get_page_number(request.params)
        c.q = request.params.get('q', '')
        c.order_by = request.params.get('order_by', 'name')

        context = {'return_query': True, 'user': c.user,
                   'auth_user_obj': c.userobj}

        data_dict = {'q': c.q,
                     'order_by': c.order_by}

        limit = int(
            request.params.get('limit', config.get('ckan.user_list_limit', 20))
        )
        try:
            check_access('user_list', context, data_dict)
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        users_list = get_action('user_list')(context, data_dict)

        c.page = h.Page(
            collection=users_list,
            page=page,
            url=h.pager_url,
            item_count=users_list.count(),
            items_per_page=limit
        )
        return render('user/list.html')
Example #10
0
File: user.py Project: tino097/ckan
def index():
    page_number = h.get_page_number(request.args)
    q = request.args.get('q', '')
    order_by = request.args.get('order_by', 'name')
    default_limit: int = config.get_value('ckan.user_list_limit')
    limit = int(request.args.get('limit', default_limit))
    context = cast(
        Context, {
            u'return_query': True,
            u'user': current_user.name,
            u'auth_user_obj': current_user
        })

    data_dict = {u'q': q, u'order_by': order_by}

    try:
        logic.check_access(u'user_list', context, data_dict)
    except logic.NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    users_list = logic.get_action(u'user_list')(context, data_dict)

    page = h.Page(collection=users_list,
                  page=page_number,
                  url=h.pager_url,
                  item_count=users_list.count(),
                  items_per_page=limit)

    extra_vars: dict[str, Any] = {
        u'page': page,
        u'q': q,
        u'order_by': order_by
    }
    return base.render(u'user/list.html', extra_vars)
Example #11
0
def index():
    page_number = h.get_page_number(request.params)
    q = request.params.get(u'q', u'')
    order_by = request.params.get(u'order_by', u'name')
    limit = int(
        request.params.get(u'limit', config.get(u'ckan.user_list_limit', 20)))
    context = {
        u'return_query': True,
        u'user': g.user,
        u'auth_user_obj': g.userobj
    }

    data_dict = {u'q': q, u'order_by': order_by}

    try:
        logic.check_access(u'user_list', context, data_dict)
    except logic.NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    users_list = logic.get_action(u'user_list')(context, data_dict)

    page = h.Page(collection=users_list,
                  page=page_number,
                  url=h.pager_url,
                  item_count=users_list.count(),
                  items_per_page=limit)

    extra_vars = {u'page': page, u'q': q, u'order_by': order_by}
    return base.render(u'user/list.html', extra_vars)
Example #12
0
    def index(self):
        c.q = request.params.get('q', '')

        context = {'model': model, 'session': model.Session,
                   'user': c.user, 'auth_user_obj': c.userobj,
                   'for_view': True}

        data_dict = {'all_fields': True}

        if c.q:
            page = h.get_page_number(request.params)
            data_dict['q'] = c.q
            data_dict['limit'] = LIMIT
            data_dict['offset'] = (page - 1) * LIMIT
            data_dict['return_objects'] = True

        results = logic.get_action('tag_list')(context, data_dict)

        if c.q:
            c.page = h.Page(
                collection=results,
                page=page,
                item_count=len(results),
                items_per_page=LIMIT
            )
            c.page.items = results
        else:
            c.page = AlphaPage(
                collection=results,
                page=request.params.get('page', 'A'),
                alpha_attribute='name',
                other_text=_('Other'),
            )

        return base.render('tag/index.html')
Example #13
0
def my_organizations():
    log.debug('dashboard my orgainzations')
    context = {
        u'model': model,
        u'for_view': True,
        u'user': g.user,
        u'auth_user_obj': g.userobj
    }
    data_dict = {u'user_obj': g.userobj}
    try:
        if not c.user:
            raise NotAuthorized
        organizations = iati_h.organizations_available_with_extra_fields()
        extra_vars = _extra_template_variables(context, data_dict)
        page = h.get_page_number(request.params) or 1
        c.page = h.Page(
            collection=organizations,
            page=page,
            url=h.pager_url,
            item_count=len(organizations),
            items_per_page=20,
        )
        extra_vars["page"] = c.page
        extra_vars['organizations'] = organizations
        return render('user/my_organizations.html', extra_vars)
    except NotAuthorized:
        p.toolkit.abort(401,
                        _('Unauthorized to visit my publisher page  %s') % '')
Example #14
0
 def activity(self):
     do_if_user_not_sysadmin()
     page = get_page_number(tk.request.params)
     total_rows = App.all().count()
     total_pages = ((total_rows - 1) / self.paginated_by + 1) or 1
     # redirect for delete page parameter reason
     if not 0 < page <= total_pages:
         redirect_to('apps_activity')
     apps_activity = App.all().order_by(App.created.desc()).offset(
         (page - 1) * self.paginated_by).limit(self.paginated_by)
     activity = [
         dict(id=i.id,
              url=i.get_absolute_url(),
              content=i.content,
              name=i.name,
              status=i.status,
              author_name=i.author.name,
              created=i.created) for i in apps_activity
     ]
     c.page = Page(collection=apps_activity,
                   page=page,
                   item_count=total_rows,
                   items_per_page=self.paginated_by)
     context = {
         'activity': sorted(activity,
                            key=itemgetter('created'),
                            reverse=True),
         'statuses': STATUSES,
     }
     return self.__render('apps_activity.html', context)
Example #15
0
    def index(self):
        context = {
            'model': model,
            'session': model.Session,
            'user': g.user,
            'auth_user_obj': g.userobj
        }
        # Package needs to have a organization group in the call to
        # check_access and also to save it
        try:
            logic.check_access('sysadmin', context, {})
        except logic.NotAuthorized:
            base.abort(403, _('Need to be system administrator'))

        page = h.get_page_number(request.params)
        total = model.Session.query(SearchQuery).count()
        queries = model.Session.query(SearchQuery).order_by(
            SearchQuery.count.desc()
        ).limit(PER_PAGE).offset((page - 1) * PER_PAGE)

        pager = h.Page(
            collection=queries,
            page=page,
            url=lambda page: h.url_for('search_queries.index', page=page),
            item_count=total,
            items_per_page=PER_PAGE
        )

        return render(
            'search_queries/index.html', {
                'queries': queries,
                'pager': pager
            }
        )
Example #16
0
    def organization_dashboard(self, name):

        org = get_action('organization_show')({}, {'id': name, 'include_extras': True})

        if 'orgdashboards_is_active' in org and org['orgdashboards_is_active'] == '0':
            return plugins.toolkit.render('dashboards/snippets/not_active.html')

        from ckan.lib.search import SearchError

        package_type = 'dataset'

        try:
            context = {'model': model, 'user': c.user or c.author,
                       'auth_user_obj': c.userobj}
            check_access('site_read', context)
        except NotAuthorized:
            abort(401, _('Not authorized to see this page'))

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False
        if p.toolkit.check_ckan_version(min_version='2.5.0', max_version='2.5.3'):
            page = self._get_page_number(request.params)
        else:
            page = h.get_page_number(request.params)

        try:
            limit = int(org['orgdashboards_datasets_per_page'])
        except KeyError, ValueError:
            limit = int(config.get('ckanext.orgdashboards.datasets_per_page', '6'))
Example #17
0
    def index(self):

        page = h.get_page_number(request.params) or 1
        items_per_page = 21

        context = {
            'model': model,
            'session': model.Session,
            'user': c.user,
            'for_view': True,
            'with_private': False
        }

        q = c.q = request.params.get('q', '')
        sort_by = c.sort_by_selected = request.params.get('sort')
        try:
            tk.check_access('basket_list', context, {})
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        # pass user info to context as needed to view private datasets of
        # orgs correctly
        if c.userobj:
            context['user_id'] = c.userobj.id
            context['user_is_admin'] = c.userobj.sysadmin

        try:
            data_dict_global_results = {
                'all_fields': False,
                'q': q,
                'sort': sort_by,
            }
            global_results = tk.get_action('basket_list')(
                context, data_dict_global_results)
        except ValidationError as e:
            if e.error_dict and e.error_dict.get('message'):
                msg = e.error_dict['message']
            else:
                msg = str(e)
            h.flash_error(msg)
            c.page = h.Page([], 0)
            # return render(self._index_template(group_type),
            #               extra_vars={'group_type': group_type})

        page_results = tk.get_action('basket_list')(context, {})

        c.page = h.Page(
            collection=global_results,
            page=page,
            url=h.pager_url,
            items_per_page=items_per_page,
        )

        c.page.items = page_results
        return tk.render('basket/index.html', {'title': 'Baskets'})
Example #18
0
    def embed(self, id, limit=5):
        """
            Fetch given organization's packages and show them in an embeddable list view.
            See Nginx config for X-Frame-Options SAMEORIGIN header modifications.
        """
        def make_pager_url(q=None, page=None):
            ctrlr = 'ckanext.ytp.controller:YtpOrganizationController'
            url = h.url_for(controller=ctrlr, action='embed', id=id)
            return url + u'?page=' + str(page)

        try:
            context = {
                'model': model,
                'session': model.Session,
                'user': c.user or c.author
            }
            check_access('group_show', context, {'id': id})
        except NotFound:
            abort(404, _('Group not found'))
        except NotAuthorized:
            g = model.Session.query(
                model.Group).filter(model.Group.name == id).first()
            if g is None or g.state != 'active':
                return self._render_template(
                    'group/organization_not_found.html')

        page = h.get_page_number(request.params) or 1

        group_dict = {'id': id}
        group_dict['include_datasets'] = False
        c.group_dict = self._action('group_show')(context, group_dict)
        c.group = context['group']

        q = c.q = request.params.get('q', '')
        q += ' owner_org:"%s"' % c.group_dict.get('id')

        data_dict = {
            'q': q,
            'rows': limit,
            'start': (page - 1) * limit,
            'extras': {}
        }

        query = get_action('package_search')(context, data_dict)

        c.page = h.Page(collection=query['results'],
                        page=page,
                        url=make_pager_url,
                        item_count=query['count'],
                        items_per_page=limit)

        c.page.items = query['results']

        return render("organization/embed.html")
Example #19
0
    def subdashboardpage_show(self, org_name, subdashboard_name):
        data_dict = {'id': org_name, 'include_extras': True}
        org = get_action('organization_show')({}, data_dict)

        subdashboards_list = get_action('orgportals_pages_show')({}, {'org_name': org_name, 'page_name': 'data'})
        subdashboards_topics = json.loads(subdashboards_list['topics'])
        subdashboards_dict = {x['subdashboard']: x for x in subdashboards_topics}

        data_dict = {'org_name': org_name, 'subdashboard_name': subdashboard_name}
        subdashboard = get_action('orgportals_subdashboards_show')({}, data_dict)
        subdashboard['subdashboard_title'] = subdashboards_dict[subdashboard['name']]['title']
        org['subdashboards'] = subdashboards_topics

        if not _is_portal_active(org_name):
            extra_vars = {'type': 'portal'}

            return p.toolkit.render('portals/snippets/not_active.html', extra_vars=extra_vars)

        if 'is_active' in subdashboard and subdashboard['is_active'] == False:
            extra_vars = {'type': 'subdashboard'}

            return p.toolkit.render('portals/snippets/not_active.html', extra_vars=extra_vars)

        package_type = 'dataset'

        try:
            context = {
                'model': model,
                'user': c.user or c.author,
                'auth_user_obj': c.userobj
            }

            check_access('site_read', context)
        except p.toolkit.NotAuthorized:
            p.toolkit.abort(401, _('Not authorized to see this page'))

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False

        # check ckan version and call appropriate get_page number
        if p.toolkit.check_ckan_version(min_version='2.5.0',
                                        max_version='2.5.3'):
            page = self._get_page_number(request.params)
        else:
            page = h.get_page_number(request.params)

        try:
            limit = int(org['orgportals_datasets_per_page'])
        except KeyError, ValueError:
            limit = int(config.get('ckanext.orgportals.datasets_per_page',
                                   '6'))
Example #20
0
    def index(self):
        group_type = self._guess_group_type()

        page = h.get_page_number(request.params) or 1
        items_per_page = 21

        context = {'model': model, 'session': model.Session,
                   'user': c.user or c.author, 'for_view': True,
                   'with_private': False}

        q = c.q = request.params.get('q', '')
        sort_by = c.sort_by_selected = request.params.get('sort')
        try:
            self._check_access('site_read', context)
        except NotAuthorized:
            abort(401, _('Not authorized to see this page'))

        # pass user info to context as needed to view private datasets of
        # orgs correctly
        if c.userobj:
            context['user_id'] = c.userobj.id
            context['user_is_admin'] = c.userobj.sysadmin

        data_dict_global_results = {
            'all_fields': False,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group',
        }
        global_results = self._action('group_list')(context,
                                                    data_dict_global_results)

        data_dict_page_results = {
            'all_fields': True,
            'include_extras': True,
            'q': q,
            'sort': sort_by,
            'type': group_type or 'group'
        }
        page_results = self._action('group_list')(context,
                                                  data_dict_page_results)

        c.page = h.Page(
            collection=global_results,
            page=page,
            url=h.pager_url,
            items_per_page=items_per_page,
        )

        c.page.items = page_results
        return render(self._index_template(group_type),
                      extra_vars={'group_type': group_type})
Example #21
0
    def custom(self):
        q = request.params.get('q', u'')
        fq = ''
        search_params = {}
        for (param, value) in request.params.items():
            if param not in ['q', 'page', 'sort'] \
                    and len(value) and not param.startswith('_'):
                search_params[param] = value
                fq += ' %s:"%s"' % (param, value)

        page = h.get_page_number(request.params)

        limit = ITEMS_LIMIT
        data_dict = {
            'q': q,
            'fq': fq,
            'start': (page - 1) * limit,
            'rows': limit,
            'sort': request.params.get('sort', None),
        }

        item_count, results = _package_search(data_dict)

        navigation_urls = self._navigation_urls(request.params,
                                                item_count=item_count,
                                                limit=data_dict['rows'],
                                                controller='feed',
                                                action='custom')

        feed_url = self._feed_url(request.params,
                                  controller='feed',
                                  action='custom')

        atom_url = h._url_with_params('/feeds/custom.atom',
                                      search_params.items())

        alternate_url = self._alternate_url(request.params)

        site_title = config.get('ckan.site_title', 'CKAN')

        return self.output_feed(results,
                                feed_title=u'%s - Custom query' % site_title,
                                feed_description=u'Recently created or updated'
                                ' datasets on %s. Custom query: \'%s\'' %
                                (site_title, q),
                                feed_link=alternate_url,
                                feed_guid=_create_atom_id(atom_url),
                                feed_url=feed_url,
                                navigation_urls=navigation_urls)
Example #22
0
    def custom(self):
        q = request.params.get('q', u'')
        fq = ''
        search_params = {}
        for (param, value) in request.params.items():
            if param not in ['q', 'page', 'sort'] \
                    and len(value) and not param.startswith('_'):
                search_params[param] = value
                fq += ' %s:"%s"' % (param, value)

        page = h.get_page_number(request.params)

        limit = ITEMS_LIMIT
        data_dict = {
            'q': q,
            'fq': fq,
            'start': (page - 1) * limit,
            'rows': limit,
            'sort': request.params.get('sort', None),
        }

        item_count, results = _package_search(data_dict)

        navigation_urls = self._navigation_urls(request.params,
                                                item_count=item_count,
                                                limit=data_dict['rows'],
                                                controller='feed',
                                                action='custom')

        feed_url = self._feed_url(request.params,
                                  controller='feed',
                                  action='custom')

        atom_url = h._url_with_params('/feeds/custom.atom',
                                      search_params.items())

        alternate_url = self._alternate_url(request.params)

        site_title = config.get('ckan.site_title', 'CKAN')

        return self.output_feed(results,
                                feed_title=u'%s - Custom query' % site_title,
                                feed_description=u'Recently created or updated'
                                ' datasets on %s. Custom query: \'%s\'' %
                                (site_title, q),
                                feed_link=alternate_url,
                                feed_guid=_create_atom_id(atom_url),
                                feed_url=feed_url,
                                navigation_urls=navigation_urls)
Example #23
0
def custom():
    """
    Custom atom feed

    """
    q = request.params.get(u'q', u'')
    fq = u''
    search_params = {}
    for (param, value) in request.params.items():
        if param not in [u'q', u'page', u'sort'] \
                and len(value) and not param.startswith(u'_'):
            search_params[param] = value
            fq += u'%s:"%s"' % (param, value)

    page = h.get_page_number(request.params)

    limit = ITEMS_LIMIT
    data_dict = {
        u'q': q,
        u'fq': fq,
        u'start': (page - 1) * limit,
        u'rows': limit,
        u'sort': request.params.get(u'sort', None)
    }

    item_count, results = _package_search(data_dict)

    navigation_urls = _navigation_urls(
        request.params,
        item_count=item_count,
        limit=data_dict['rows'],
        controller=u'feeds',
        action=u'custom')

    feed_url = _feed_url(request.params, controller=u'feeds', action=u'custom')

    atom_url = h._url_with_params(u'/feeds/custom.atom', search_params.items())

    alternate_url = _alternate_url(request.params)

    return output_feed(
        results,
        feed_title=u'%s - Custom query' % SITE_TITLE,
        feed_description=u'Recently created or updated'
        ' datasets on %s. Custom query: \'%s\'' % (SITE_TITLE, q),
        feed_link=alternate_url,
        feed_guid=_create_atom_id(atom_url),
        feed_url=feed_url,
        navigation_urls=navigation_urls)
Example #24
0
def custom():
    """
    Custom atom feed

    """
    q = request.params.get(u'q', u'')
    fq = u''
    search_params = {}
    for (param, value) in request.params.items():
        if param not in [u'q', u'page', u'sort'] \
                and len(value) and not param.startswith(u'_'):
            search_params[param] = value
            fq += u'%s:"%s"' % (param, value)

    page = h.get_page_number(request.params)

    limit = ITEMS_LIMIT
    data_dict = {
        u'q': q,
        u'fq': fq,
        u'start': (page - 1) * limit,
        u'rows': limit,
        u'sort': request.params.get(u'sort', None)
    }

    item_count, results = _package_search(data_dict)

    navigation_urls = _navigation_urls(
        request.params,
        item_count=item_count,
        limit=data_dict['rows'],
        controller=u'feeds',
        action=u'custom')

    feed_url = _feed_url(request.params, controller=u'feeds', action=u'custom')

    atom_url = h._url_with_params(u'/feeds/custom.atom', search_params.items())

    alternate_url = _alternate_url(request.params)

    return output_feed(
        results,
        feed_title=u'%s - Custom query' % SITE_TITLE,
        feed_description=u'Recently created or updated'
        ' datasets on %s. Custom query: \'%s\'' % (SITE_TITLE, q),
        feed_link=alternate_url,
        feed_guid=_create_atom_id(atom_url),
        feed_url=feed_url,
        navigation_urls=navigation_urls)
Example #25
0
    def index(self):
        page = get_page_number(tk.request.params)
        total_rows = Thread.all().count()
        total_pages = ((Thread.all().count() - 1) / self.paginated_by + 1) or 1
        if not 0 < page <= total_pages:
            # redirect for delete page parameter reason
            redirect_to('forum_index')
        thread_list = Thread.all().offset(
            (page - 1) * self.paginated_by).limit(self.paginated_by)

        c.page = Page(collection=thread_list,
                      page=page,
                      item_count=total_rows,
                      items_per_page=self.paginated_by)
        return self.__render('forum_index.html', {'thread_list': thread_list})
def index():
    u''' dashboards index view function '''

    extra_vars = {}

    context = _get_context()

    try:
        check_access(u'dashboard_list', context)
    except NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    page = h.get_page_number(request.params) or 1
    items_per_page = int(
        config.get(u'ckanext.'
                   u'knowledgehub.dashboards_per_page', 10))
    q = request.params.get(u'q', u'')
    sort_by = request.params.get(u'sort', u'name asc')

    data_dict_global_results = {u'q': q, u'sort': sort_by}

    data_dict_page_results = {
        u'q': q,
        u'sort': sort_by,
        u'limit': items_per_page,
        u'offset': items_per_page * (page - 1)
    }

    extra_vars["q"] = q
    extra_vars["sort_by_selected"] = sort_by

    global_results = get_action(u'dashboard_list')(context,
                                                   data_dict_global_results)

    context.pop('ignore_auth', None)
    context.pop('__auth_user_obj_checked', None)

    page_results = get_action(u'dashboard_list')(context,
                                                 data_dict_page_results)

    extra_vars["page"] = h.Page(collection=global_results['data'],
                                page=page,
                                url=h.pager_url,
                                items_per_page=items_per_page)

    extra_vars['page'].items = page_results['data']

    return base.render(u'dashboard/index.html', extra_vars=extra_vars)
Example #27
0
def index():
    u''' Themes index view function '''

    extra_vars = {}

    context = _get_context()

    # TODO add appropriate check
    # try:
    #     check_access(u'theme_list', context)
    # except NotAuthorized:
    #     base.abort(403, _(u'Not authorized to see this page'))

    page = h.get_page_number(request.params) or 1
    items_per_page = int(
        config.get(u'ckanext.'
                   u'knowledgehub.themes_per_page', 10))
    q = request.params.get(u'q', u'')
    sort_by = request.params.get(u'sort', u'name asc')

    data_dict_global_results = {u'q': q, u'sort': sort_by}

    data_dict_page_results = {
        u'q': q,
        u'sort': sort_by,
        u'limit': items_per_page,
        u'offset': items_per_page * (page - 1)
    }

    extra_vars["q"] = q
    extra_vars["sort_by_selected"] = sort_by

    global_results = get_action(u'theme_list')(context,
                                               data_dict_global_results)

    page_results = get_action(u'theme_list')(context, data_dict_page_results)

    extra_vars["page"] = h.Page(
        collection=global_results['data'],
        page=page,
        url=h.pager_url,
        items_per_page=items_per_page,
    )

    extra_vars['page'].items = page_results['data']

    return base.render(u'theme/index.html', extra_vars=extra_vars)
Example #28
0
def _parse_url_params():
    """
    Constructs a search-query dict from the URL query parameters.

    Returns the constructed search-query dict, and the valid URL
    query parameters.
    """
    page = h.get_page_number(request.params)

    limit = ITEMS_LIMIT
    data_dict = {u'start': (page - 1) * limit, u'rows': limit}

    # Filter ignored query parameters
    valid_params = ['page']
    params = dict((p, request.params.get(p)) for p in valid_params
                  if p in request.params)
    return data_dict, params
Example #29
0
File: feed.py Project: tino097/ckan
def _parse_url_params() -> tuple[dict[str, Any], dict[str, Any]]:
    """
    Constructs a search-query dict from the URL query parameters.

    Returns the constructed search-query dict, and the valid URL
    query parameters.
    """
    page = h.get_page_number(request.args)

    limit = config.get_value('ckan.feeds.limit')
    data_dict = {u'start': (page - 1) * limit, u'rows': limit}

    # Filter ignored query parameters
    valid_params = ['page']
    params = dict(
        (p, request.args.get(p)) for p in valid_params if p in request.args)
    return data_dict, params
Example #30
0
    def _parse_url_params(self):
        """
        Constructs a search-query dict from the URL query parameters.

        Returns the constructed search-query dict, and the valid URL
        query parameters.
        """
        page = h.get_page_number(request.params)

        limit = ITEMS_LIMIT
        data_dict = {'start': (page - 1) * limit, 'rows': limit}

        # Filter ignored query parameters
        valid_params = ['page']
        params = dict((p, request.params.get(p)) for p in valid_params
                      if p in request.params)
        return data_dict, params
Example #31
0
 def thread_show(self, slug, id):
     thread = Thread.get_by_id(id=id)
     if not thread:
         abort(404)
     if not thread.active and (not c.userobj or not c.userobj.sysadmin):
         abort(404)
     form = CreatePostForm(tk.request.POST)
     if tk.request.POST:
         if c.userobj is None:
             tk.redirect_to(tk.url_for(controller='user', action='login'))
         if BannedUser.check_by_id(c.userobj):
             flash_error(tk._('You are banned'))
             tk.redirect_to(thread.get_absolute_url())
         if form.validate():
             post = tk.get_action('forum_create_post')(
                 {
                     'auth_user_obj': c.userobj
                 }, {
                     'thread_id': id,
                     'content': form.data['content']
                 })
             if post:
                 jobs.enqueue(
                     send_notifications_on_new_post,
                     [post, tk.request.environ.get('CKAN_LANG')])
                 flash_success(tk._('You successfully create comment'))
             else:
                 flash_error(tk._('Thread is closed for comments'))
             return tk.redirect_to(thread.get_absolute_url())
         else:
             flash_error(tk._('You have errors in form'))
     page = get_page_number(tk.request.params)
     total_rows = Post.filter_thread(thread.id).count()
     total_pages = (total_rows / self.paginated_by + 1) or 1
     if not 0 < page <= total_pages:
         # redirect for delete page parameter reason
         redirect_to('forum_index')
     posts_list = Post.filter_thread(thread.id).offset(
         (page - 1) * self.paginated_by).limit(self.paginated_by)
     c.page = Page(collection=posts_list,
                   page=page,
                   item_count=total_rows,
                   items_per_page=self.paginated_by)
     context = {'thread': thread, 'form': form, 'posts': posts_list}
     return self.__render('thread.html', context)
Example #32
0
    def datapage_show(self, org_name):
        data_dict = {'id': org_name, 'include_extras': True}
        org = get_action('organization_show')({}, data_dict)

        if not _is_portal_active(org_name):
            extra_vars = {'type': 'portal'}

            return p.toolkit.render('portals/snippets/not_active.html',
                                    extra_vars=extra_vars)

        package_type = 'dataset'

        c.page_name = 'data'
        c.org_name = org_name

        try:
            context = {
                'model': model,
                'user': c.user or c.author,
                'auth_user_obj': c.userobj
            }

            check_access('site_read', context)
        except p.toolkit.NotAuthorized:
            p.toolkit.abort(401, _('Not authorized to see this page'))

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False

        # check ckan version and call appropriate get_page number
        if p.toolkit.check_ckan_version(min_version='2.5.0',
                                        max_version='2.5.3'):
            page = self._get_page_number(request.params)
        else:
            page = h.get_page_number(request.params)

        try:
            limit = int(org['orgportals_datasets_per_page'])
        except KeyError, ValueError:
            limit = int(config.get('ckanext.orgportals.datasets_per_page',
                                   '6'))
Example #33
0
 def board_show(self, slug):
     board = Board.get_by_slug(slug)
     if not board:
         abort(404)
     page = get_page_number(tk.request.params)
     total_rows = Thread.filter_board(board_slug=board.slug).count()
     total_pages = (total_rows / self.paginated_by + 1) or 1
     if not 0 < page <= total_pages:
         # redirect for delete page parameter reason
         redirect_to('forum_index')
     thread_list = Thread.filter_board(board_slug=board.slug).offset(
         (page - 1) * self.paginated_by).limit(self.paginated_by)
     c.page = Page(collection=thread_list,
                   page=page,
                   item_count=total_rows,
                   items_per_page=self.paginated_by)
     return self.__render('forum_index.html', {
         'board': board,
         'thread_list': thread_list
     })
    def get(self):
        page = h.get_page_number(request.params)
        total = model.Session.query(SearchQuery).count()
        queries = model.Session.query(SearchQuery).order_by(
            SearchQuery.count.desc()
        ).limit(PER_PAGE).offset((page - 1) * PER_PAGE)
        pager = h.Page(
            collection=queries,
            page=page,
            url=lambda page: h.url_for('search_queries.index', page=page),
            item_count=total,
            items_per_page=PER_PAGE
        )

        return render(
            'search_queries/index.html', {
                'queries': queries,
                'pager': pager
            }
        )
Example #35
0
    def index(self):
        page = get_page_number(tk.request.params)
        total_rows = App.all_active().count()
        total_pages = ((total_rows - 1) / self.paginated_by + 1) or 1
        # redirect for delete page parameter reason
        if not 0 < page <= total_pages:
            redirect_to('apps_index')

        apps_list = tk.get_action('apps_active_apps')(
            data_dict={
                "page": page,
                "paginated_by": self.paginated_by
            })
        c.page = Page(collection=apps_list,
                      page=page,
                      item_count=total_rows,
                      items_per_page=self.paginated_by)
        context = {
            'apps_list': apps_list,
        }
        log.debug('AppsController.index context: %s', context)
        return self.__render('apps_index.html', context)
Example #36
0
 def board_show(self, slug):
     board = Board.get_by_slug(slug)
     if not board:
         abort(404)
     page = get_page_number(tk.request.params)
     total_rows = App.filter_board(board_slug=board.slug).count()
     total_pages = (total_rows / self.paginated_by + 1) or 1
     # redirect for delete page parameter reason
     if not 0 < page <= total_pages:
         redirect_to('apps_index')
     apps_list = App.filter_board(board_slug=board.slug).offset(
         (page - 1) * self.paginated_by).limit(self.paginated_by)
     c.page = Page(collection=apps_list,
                   page=page,
                   item_count=total_rows,
                   items_per_page=self.paginated_by)
     context = {
         'board': board,
         'apps_list': apps_list,
     }
     log.debug('AppController.board_show context: %s', context)
     return self.__render('apps_index.html', context)
Example #37
0
 def activity(self):
     do_if_user_not_sysadmin()
     page = get_page_number(tk.request.params)
     total_rows = Thread.all().count()
     total_pages = ((total_rows - 1) / self.paginated_by + 1) or 1
     if not 0 < page <= total_pages:
         # redirect for delete page parameter reason
         redirect_to('forum_activity')
     thread_activity = Thread.all().order_by(Thread.created.desc())
     post_activity = Post.all().order_by(Post.created.desc())
     activity = [
         dict(id=i.id,
              url=i.get_absolute_url(),
              ban_url=tk.url_for('forum_thread_ban', id=i.id),
              type=tk._('Thread'),
              content=i.content,
              author_name=i.author.name,
              created=i.created) for i in thread_activity
     ]
     activity += [
         dict(id=i.id,
              url=i.get_absolute_url(),
              ban_url=tk.url_for('forum_post_ban', id=i.id),
              type=tk._('Post'),
              content=i.content,
              author_name=i.author.name,
              created=i.created) for i in post_activity
     ]
     activity = sorted(activity, key=itemgetter('created'), reverse=True)
     start_elem = int((page - 1) * self.paginated_by)
     end_elem = int(page * self.paginated_by)
     c.page = Page(collection=thread_activity,
                   page=page,
                   item_count=total_rows,
                   items_per_page=self.paginated_by)
     return self.__render('forum_activity.html',
                          {'activity': activity[start_elem:end_elem]})
Example #38
0
    def dashboard_datasets(self):
        """User Dashboard > My Datasets pagination."""
        context = {
            'for_view': True,
            'user': c.user or c.author,
            'auth_user_obj': c.userobj
        }
        data_dict = {'user_obj': c.userobj, 'include_datasets': True}

        try:
            user_dict = logic.get_action('user_show')(context, data_dict)
        except NotFound:
            abort(404, _('User not found'))
        except NotAuthorized:
            abort(401, _('Not authorized to see this page'))
        c.user_dict = user_dict

        items_per_page = g.datasets_per_page or 20  # , readme

        # check ckan version and call appropriate get_page number
        if p.toolkit.check_ckan_version(min_version='2.5.0',
                                        max_version='2.5.3'):
            page = self._get_page_number(request.params) or 1
        else:
            page = h.get_page_number(request.params) or 1

        c.page = h.Page(
            collection=user_dict['datasets'],
            page=page,
            url=h.pager_url,
            item_count=len(user_dict['datasets']),
            items_per_page=items_per_page,
        )
        c.page.items = user_dict['datasets']

        return render('user/dashboard_datasets.html')
Example #39
0
    def search(self):
        from ckan.lib.search import SearchError, SearchQueryError

        package_type = self._guess_package_type()

        try:
            context = {'model': model, 'user': c.user,
                       'auth_user_obj': c.userobj}
            check_access('site_read', context)
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False
        page = h.get_page_number(request.params)

        limit = int(config.get('ckan.datasets_per_page', 20))

        # most search operations should reset the page counter:
        params_nopage = [(k, v) for k, v in request.params.items()
                         if k != 'page']

        def drill_down_url(alternative_url=None, **by):
            return h.add_url_param(alternative_url=alternative_url,
                                   controller='ckanext.sixodp_showcase.controller:Sixodp_ShowcaseController', action='search',
                                   new_params=by)

        c.drill_down_url = drill_down_url

        def remove_field(key, value=None, replace=None):
            return h.remove_url_param(key, value=value, replace=replace,
                                      controller='ckanext.sixodp_showcase.controller:Sixodp_ShowcaseController',
                                      action='search')

        c.remove_field = remove_field

        sort_by = request.params.get('sort', None)
        params_nosort = [(k, v) for k, v in params_nopage if k != 'sort']

        def _sort_by(fields):
            """
            Sort by the given list of fields.
            Each entry in the list is a 2-tuple: (fieldname, sort_order)
            eg - [('metadata_modified', 'desc'), ('name', 'asc')]
            If fields is empty, then the default ordering is used.
            """
            params = params_nosort[:]

            if fields:
                sort_string = ', '.join('%s %s' % f for f in fields)
                params.append(('sort', sort_string))
            return search_url(params, package_type)

        c.sort_by = _sort_by
        if not sort_by:
            c.sort_by_fields = []
        else:
            c.sort_by_fields = [field.split()[0]
                                for field in sort_by.split(',')]

        def pager_url(q=None, page=None):
            params = list(params_nopage)
            params.append(('page', page))
            return search_url(params, package_type)

        c.search_url_params = urlencode(_encode_params(params_nopage))

        try:
            c.fields = []
            # c.fields_grouped will contain a dict of params containing
            # a list of values eg {'tags':['tag1', 'tag2']}
            c.fields_grouped = {}
            search_extras = {}
            fq = ''
            for (param, value) in request.params.items():
                if param not in ['q', 'page', 'sort'] \
                        and len(value) and not param.startswith('_'):
                    if not param.startswith('ext_'):
                        c.fields.append((param, value))
                        fq += ' %s:"%s"' % (param, value)
                        if param not in c.fields_grouped:
                            c.fields_grouped[param] = [value]
                        else:
                            c.fields_grouped[param].append(value)
                    else:
                        search_extras[param] = value

            context = {'model': model, 'session': model.Session,
                       'user': c.user, 'for_view': True,
                       'auth_user_obj': c.userobj}

            if package_type and package_type != 'dataset':
                # Only show datasets of this particular type
                fq += ' +dataset_type:{type}'.format(type=package_type)
            else:
                # Unless changed via config options, don't show non standard
                # dataset types on the default search page
                if not asbool(
                        config.get('ckan.search.show_all_types', 'False')):
                    fq += ' +dataset_type:dataset'

            facets = OrderedDict()

            default_facet_titles = {
                'organization': _('Organizations'),
                'groups': _('Groups'),
                'tags': _('Tags'),
                'res_format': _('Formats'),
                'license_id': _('Licenses'),
            }

            for facet in h.facets():
                if facet in default_facet_titles:
                    facets[facet] = default_facet_titles[facet]
                else:
                    facets[facet] = facet

            # Facet titles
            for plugin in ckan.plugins.PluginImplementations(ckan.plugins.IFacets):
                facets = plugin.dataset_facets(facets, package_type)

            c.facet_titles = facets

            # Set the custom default sort parameter here
            # Might need a rewrite when ckan is updated
            if not sort_by:
                sort_by = 'metadata_created desc'

            data_dict = {
                'q': q,
                'fq': fq.strip(),
                'facet.field': facets.keys(),
                'rows': limit,
                'start': (page - 1) * limit,
                'sort': sort_by,
                'extras': search_extras,
                'include_private': asbool(config.get(
                    'ckan.search.default_include_private', True)),
            }

            query = get_action('package_search')(context, data_dict)
            c.sort_by_selected = query['sort']

            c.page = h.Page(
                collection=query['results'],
                page=page,
                url=pager_url,
                item_count=query['count'],
                items_per_page=limit
            )
            c.facets = query['facets']
            c.search_facets = query['search_facets']
            c.page.items = query['results']
        except SearchQueryError, se:
            # User's search parameters are invalid, in such a way that is not
            # achievable with the web interface, so return a proper error to
            # discourage spiders which are the main cause of this.
            log.info('Dataset search query rejected: %r', se.args)
            abort(400, _('Invalid search query: {error_message}')
                  .format(error_message=str(se)))
Example #40
0
    def list(self):
        format = request.params.get("format", "")
        if format == "atom":
            # Generate and return Atom 1.0 document.
            from webhelpers.feedgenerator import Atom1Feed

            feed = Atom1Feed(
                title=_(u"CKAN Repository Revision History"),
                link=h.url_for(controller="revision", action="list", id=""),
                description=_(u"Recent changes to the CKAN repository."),
                language=unicode(get_lang()),
            )
            # TODO: make this configurable?
            # we do not want the system to fall over!
            maxresults = 200
            try:
                dayHorizon = int(request.params.get("days", 5))
            except:
                dayHorizon = 5
            ourtimedelta = timedelta(days=-dayHorizon)
            since_when = datetime.now() + ourtimedelta
            revision_query = model.repo.history()
            revision_query = revision_query.filter(model.Revision.timestamp >= since_when).filter(
                model.Revision.id != None
            )
            revision_query = revision_query.limit(maxresults)
            for revision in revision_query:
                package_indications = []
                revision_changes = model.repo.list_changes(revision)
                resource_revisions = revision_changes[model.Resource]
                package_extra_revisions = revision_changes[model.PackageExtra]
                for package in revision.packages:
                    if not package:
                        # package is None sometimes - I don't know why,
                        # but in the meantime while that is fixed,
                        # avoid an exception here
                        continue
                    if package.private:
                        continue
                    number = len(package.all_revisions)
                    package_revision = None
                    count = 0
                    for pr in package.all_revisions:
                        count += 1
                        if pr.revision.id == revision.id:
                            package_revision = pr
                            break
                    if package_revision and package_revision.state == model.State.DELETED:
                        transition = "deleted"
                    elif package_revision and count == number:
                        transition = "created"
                    else:
                        transition = "updated"
                        for resource_revision in resource_revisions:
                            if resource_revision.package_id == package.id:
                                transition += ":resources"
                                break
                        for package_extra_revision in package_extra_revisions:
                            if package_extra_revision.package_id == package.id:
                                if package_extra_revision.key == "date_updated":
                                    transition += ":date_updated"
                                    break
                    indication = "%s:%s" % (package.name, transition)
                    package_indications.append(indication)
                pkgs = u"[%s]" % " ".join(package_indications)
                item_title = u"r%s " % (revision.id)
                item_title += pkgs
                if revision.message:
                    item_title += ": %s" % (revision.message or "")
                item_link = h.url_for(controller="revision", action="read", id=revision.id)
                item_description = _("Datasets affected: %s.\n") % pkgs
                item_description += "%s" % (revision.message or "")
                item_author_name = revision.author
                item_pubdate = revision.timestamp
                feed.add_item(
                    title=item_title,
                    link=item_link,
                    description=item_description,
                    author_name=item_author_name,
                    pubdate=item_pubdate,
                )
            feed.content_type = "application/atom+xml"
            return feed.writeString("utf-8")
        else:
            query = model.Session.query(model.Revision)
            c.page = h.Page(
                collection=query, page=h.get_page_number(request.params), url=h.pager_url, items_per_page=20
            )
            return base.render("revision/list.html")
Example #41
0
    def search(self):
        from ckan.lib.search import SearchError, SearchQueryError

        # Get package type name
        package_type = self._guess_package_type()[:-1]
        c.package_type = package_type


        # Get page content from Wordpress
        # =========================================
        import ckanext.dadosgovbr.helpers.wordpress as wp
        wp_page_slug = 'scheming_'+package_type+'s'
        c.wp_page = type('Nothing', (object,), {})  
        c.wp_page.content = type('Nothing', (object,), {})  
        c.wp_page.content.rendered = "Conteudo da pagina nao encontrado..."
        try:
            c.wp_page = wp.page(wp_page_slug)
        except:
            pass

        # DEBUG
        # from pprint import pprint 
        # pprint(c.concursos)

        # Package type facets (filters)
        # =========================================
        package_type_facets = u'organization groups tags res_format license_id'
        if(package_type == 'inventario'):
            package_type_facets = u'organization situacao_base informacoes_sigilosas_base informacoes_publicas_base atualizacoes_base dados_abertos_base'

        if(package_type == 'concurso'):
            package_type_facets = u'organization datasets_used'

        if(package_type == 'aplicativo'):
            package_type_facets = u'organization groups tags res_format license_id'
        

        try:
            context = {'model': model, 'user': c.user,
                       'auth_user_obj': c.userobj}
            check_access('site_read', context)
        except NotAuthorized:
            abort(403, _('Not authorized to see this page'))

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False
        page = h.get_page_number(request.params)

        limit = int(config.get('ckan.datasets_per_page', 20))

        # most search operations should reset the page counter:
        params_nopage = [(k, v) for k, v in request.params.items()
                         if k != 'page']

        def drill_down_url(alternative_url=None, **by):
            return h.add_url_param(alternative_url=alternative_url,
                                   controller='package', action='search',
                                   new_params=by)

        c.drill_down_url = drill_down_url

        def remove_field(key, value=None, replace=None):
            return h.remove_url_param(key, value=value, replace=replace,
                                      controller='package', action='search')

        c.remove_field = remove_field

        sort_by = request.params.get('sort', None)
        params_nosort = [(k, v) for k, v in params_nopage if k != 'sort']

        def _sort_by(fields):
            """
            Sort by the given list of fields.
            Each entry in the list is a 2-tuple: (fieldname, sort_order)
            eg - [('metadata_modified', 'desc'), ('name', 'asc')]
            If fields is empty, then the default ordering is used.
            """
            params = params_nosort[:]

            if fields:
                sort_string = ', '.join('%s %s' % f for f in fields)
                params.append(('sort', sort_string))
            return search_url(params, package_type)

        c.sort_by = _sort_by
        if not sort_by:
            c.sort_by_fields = []
        else:
            c.sort_by_fields = [field.split()[0]
                                for field in sort_by.split(',')]

        def pager_url(q=None, page=None):
            params = list(params_nopage)
            params.append(('page', page))
            return search_url(params, package_type)

        c.search_url_params = urlencode(_encode_params(params_nopage))

        try:
            c.fields = []
            # c.fields_grouped will contain a dict of params containing
            # a list of values eg {'tags':['tag1', 'tag2']}
            c.fields_grouped = {}
            search_extras = {}
            fq = ''
            for (param, value) in request.params.items():
                if param not in ['q', 'page', 'sort'] \
                        and len(value) and not param.startswith('_'):
                    if not param.startswith('ext_'):
                        c.fields.append((param, value))
                        fq += ' %s:"%s"' % (param, value)
                        if param not in c.fields_grouped:
                            c.fields_grouped[param] = [value]
                        else:
                            c.fields_grouped[param].append(value)
                    else:
                        search_extras[param] = value

            context = {'model': model, 'session': model.Session,
                       'user': c.user, 'for_view': True,
                       'auth_user_obj': c.userobj}

            if package_type and package_type != 'dataset':
                # Only show datasets of this particular type
                fq += ' +dataset_type:{type}'.format(type=package_type)
            else:
                # Unless changed via config options, don't show non standard
                # dataset types on the default search page
                if not asbool(
                        config.get('ckan.search.show_all_types', 'False')):
                    fq += ' +dataset_type:dataset'

            facets = OrderedDict()
            

            default_facet_titles = {
                # Default package
                'organization': _('Organizations'),
                'groups': _('Groups'),
                'tags': _('Tags'),
                'res_format': _('Formats'),
                'license_id': _('Licenses'),

                # Inventário package
                'situacao_base': _(u'Situação da base'),
                'informacoes_sigilosas_base': _(u'Base possui informações sigilosas?'),
                'vocab_sim': _(u'Sim'),
                'vocab_nao': _(u'Não'),
                'informacoes_publicas_base': _(u'Base possui informações públicas?'),
                'informacoes_publicas_base_publico': _(u'Público'),
                'atualizacoes_base': _(u'Período de atualização dos dados'),
                'dados_abertos_base': _(u'Exporta para dados abertos?'),



                # Concurso package
                'datasets_used': _(u'Dados utilizados'),
                'tags': _(u'Tags'),
                'date': _(u'Data de início'),
                'end_date': _(u'Data final'),




                'publico': _(u'Público'),
                'sim': _(u'Sim'),
                'nao': _(u'Não'),
                }


            for facet in config.get(u'search.facets', package_type_facets.split()):
                if facet in default_facet_titles:
                    facets[facet] = default_facet_titles[facet]
                else:
                    facets[facet] = facet

            # Facet titles
            for plugin in p.PluginImplementations(p.IFacets):
                facets = plugin.dataset_facets(facets, package_type)

            c.facet_titles = facets

            data_dict = {
                'q': q,
                'fq': fq.strip(),
                'facet.field': facets.keys(),
                'rows': limit,
                'start': (page - 1) * limit,
                'sort': sort_by,
                'extras': search_extras,
                'include_private': asbool(config.get(
                    'ckan.search.default_include_private', True)),
            }

            query = get_action('package_search')(context, data_dict)
            c.sort_by_selected = query['sort']

            c.page = h.Page(
                collection=query['results'],
                page=page,
                url=pager_url,
                item_count=query['count'],
                items_per_page=limit
            )
            c.search_facets = query['search_facets']
            c.page.items = query['results']
        except SearchQueryError, se:
            # User's search parameters are invalid, in such a way that is not
            # achievable with the web interface, so return a proper error to
            # discourage spiders which are the main cause of this.
            log.info('Dataset search query rejected: %r', se.args)
            abort(400, _('Invalid search query: {error_message}')
                  .format(error_message=str(se)))
Example #42
0
File: group.py Project: ckan/ckan
def _read(id, limit, group_type):
    u''' This is common code used by both read and bulk_process'''
    extra_vars = {}
    context = {
        u'model': model,
        u'session': model.Session,
        u'user': g.user,
        u'schema': _db_to_form_schema(group_type=group_type),
        u'for_view': True,
        u'extras_as_string': True
    }

    q = request.params.get(u'q', u'')

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.q = q

    # Search within group
    if g.group_dict.get(u'is_organization'):
        fq = u' owner_org:"%s"' % g.group_dict.get(u'id')
    else:
        fq = u' groups:"%s"' % g.group_dict.get(u'name')

    extra_vars["q"] = q

    g.description_formatted = \
        h.render_markdown(g.group_dict.get(u'description'))

    context['return_query'] = True

    page = h.get_page_number(request.params)

    # most search operations should reset the page counter:
    params_nopage = [(k, v) for k, v in request.params.items() if k != u'page']
    sort_by = request.params.get(u'sort', None)

    def search_url(params):
        controller = lookup_group_controller(group_type)
        action = u'bulk_process' if getattr(
            g, u'action', u'') == u'bulk_process' else u'read'
        url = h.url_for(u'.'.join([controller, action]), id=id)
        params = [(k, v.encode(u'utf-8')
                   if isinstance(v, string_types) else str(v))
                  for k, v in params]
        return url + u'?' + urlencode(params)

    def drill_down_url(**by):
        return h.add_url_param(
            alternative_url=None,
            controller=u'group',
            action=u'read',
            extras=dict(id=g.group_dict.get(u'name')),
            new_params=by)

    extra_vars["drill_down_url"] = drill_down_url

    def remove_field(key, value=None, replace=None):
        controller = lookup_group_controller(group_type)
        return h.remove_url_param(
            key,
            value=value,
            replace=replace,
            controller=controller,
            action=u'read',
            extras=dict(id=g.group_dict.get(u'name')))

    extra_vars["remove_field"] = remove_field

    def pager_url(q=None, page=None):
        params = list(params_nopage)
        params.append((u'page', page))
        return search_url(params)

    try:
        extra_vars["fields"] = fields = []
        extra_vars["fields_grouped"] = fields_grouped = {}
        search_extras = {}
        for (param, value) in request.params.items():
            if param not in [u'q', u'page', u'sort'] \
                    and len(value) and not param.startswith(u'_'):
                if not param.startswith(u'ext_'):
                    fields.append((param, value))
                    q += u' %s: "%s"' % (param, value)
                    if param not in fields_grouped:
                        fields_grouped[param] = [value]
                    else:
                        fields_grouped[param].append(value)
                else:
                    search_extras[param] = value

        # TODO: Remove
        # ckan 2.9: Adding variables that were removed from c object for
        # compatibility with templates in existing extensions
        g.fields = fields
        g.fields_grouped = fields_grouped

        facets = OrderedDict()

        default_facet_titles = {
            u'organization': _(u'Organizations'),
            u'groups': _(u'Groups'),
            u'tags': _(u'Tags'),
            u'res_format': _(u'Formats'),
            u'license_id': _(u'Licenses')
        }

        for facet in h.facets():
            if facet in default_facet_titles:
                facets[facet] = default_facet_titles[facet]
            else:
                facets[facet] = facet

        # Facet titles
        _update_facet_titles(facets, group_type)

        extra_vars["facet_titles"] = facets

        data_dict = {
            u'q': q,
            u'fq': fq,
            u'include_private': True,
            u'facet.field': facets.keys(),
            u'rows': limit,
            u'sort': sort_by,
            u'start': (page - 1) * limit,
            u'extras': search_extras
        }

        context_ = dict((k, v) for (k, v) in context.items() if k != u'schema')
        query = get_action(u'package_search')(context_, data_dict)

        extra_vars["page"] = h.Page(
            collection=query['results'],
            page=page,
            url=pager_url,
            item_count=query['count'],
            items_per_page=limit)

        # TODO: Remove
        # ckan 2.9: Adding variables that were removed from c object for
        # compatibility with templates in existing extensions
        g.group_dict['package_count'] = query['count']

        extra_vars["search_facets"] = g.search_facets = query['search_facets']
        extra_vars["search_facets_limits"] = g.search_facets_limits = {}
        for facet in g.search_facets.keys():
            limit = int(
                request.params.get(u'_%s_limit' % facet,
                                   config.get(u'search.facets.default', 10)))
            g.search_facets_limits[facet] = limit
        extra_vars["page"].items = query['results']

        extra_vars["sort_by_selected"] = sort_by

    except search.SearchError as se:
        log.error(u'Group search error: %r', se.args)
        extra_vars["query_error"] = True
        extra_vars["page"] = h.Page(collection=[])

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.facet_titles = facets
    g.page = extra_vars["page"]

    extra_vars["group_type"] = group_type
    _setup_template_variables(context, {u'id': id}, group_type=group_type)
    return extra_vars
Example #43
0
File: group.py Project: ckan/ckan
def index(group_type, is_organization):
    extra_vars = {}
    set_org(is_organization)
    page = h.get_page_number(request.params) or 1
    items_per_page = int(config.get(u'ckan.datasets_per_page', 20))

    context = {
        u'model': model,
        u'session': model.Session,
        u'user': g.user,
        u'for_view': True,
        u'with_private': False
    }

    try:
        _check_access(u'site_read', context)
        _check_access(u'group_list', context)
    except NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    q = request.params.get(u'q', u'')
    sort_by = request.params.get(u'sort')

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.q = q
    g.sort_by_selected = sort_by

    extra_vars["q"] = q
    extra_vars["sort_by_selected"] = sort_by

    # pass user info to context as needed to view private datasets of
    # orgs correctly
    if g.userobj:
        context['user_id'] = g.userobj.id
        context['user_is_admin'] = g.userobj.sysadmin

    try:
        data_dict_global_results = {
            u'all_fields': False,
            u'q': q,
            u'sort': sort_by,
            u'type': group_type or u'group',
        }
        global_results = _action(u'group_list')(context,
                                                data_dict_global_results)
    except ValidationError as e:
        if e.error_dict and e.error_dict.get(u'message'):
            msg = e.error_dict['message']
        else:
            msg = str(e)
        h.flash_error(msg)
        extra_vars["page"] = h.Page([], 0)
        extra_vars["group_type"] = group_type
        return base.render(_index_template(group_type), extra_vars)

    data_dict_page_results = {
        u'all_fields': True,
        u'q': q,
        u'sort': sort_by,
        u'type': group_type or u'group',
        u'limit': items_per_page,
        u'offset': items_per_page * (page - 1),
        u'include_extras': True
    }
    page_results = _action(u'group_list')(context, data_dict_page_results)

    extra_vars["page"] = h.Page(
        collection=global_results,
        page=page,
        url=h.pager_url,
        items_per_page=items_per_page, )

    extra_vars["page"].items = page_results
    extra_vars["group_type"] = group_type

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.page = extra_vars["page"]
    return base.render(_index_template(group_type), extra_vars)
Example #44
0
def search(package_type):
    extra_vars = {}

    try:
        context = {
            u'model': model,
            u'user': g.user,
            u'auth_user_obj': g.userobj
        }
        check_access(u'site_read', context)
    except NotAuthorized:
        base.abort(403, _(u'Not authorized to see this page'))

    # unicode format (decoded from utf8)
    extra_vars[u'q'] = q = request.args.get(u'q', u'')

    extra_vars['query_error'] = False
    page = h.get_page_number(request.args)

    limit = int(config.get(u'ckan.datasets_per_page', 20))

    # most search operations should reset the page counter:
    params_nopage = [(k, v) for k, v in request.args.items() if k != u'page']

    extra_vars[u'drill_down_url'] = drill_down_url
    extra_vars[u'remove_field'] = partial(remove_field, package_type)

    sort_by = request.args.get(u'sort', None)
    params_nosort = [(k, v) for k, v in params_nopage if k != u'sort']

    extra_vars[u'sort_by'] = partial(_sort_by, params_nosort, package_type)

    if not sort_by:
        sort_by_fields = []
    else:
        sort_by_fields = [field.split()[0] for field in sort_by.split(u',')]
    extra_vars[u'sort_by_fields'] = sort_by_fields

    pager_url = partial(_pager_url, params_nopage, package_type)

    search_url_params = urlencode(_encode_params(params_nopage))
    extra_vars[u'search_url_params'] = search_url_params

    try:
        # fields_grouped will contain a dict of params containing
        # a list of values eg {u'tags':[u'tag1', u'tag2']}

        extra_vars[u'fields'] = fields = []
        extra_vars[u'fields_grouped'] = fields_grouped = {}
        search_extras = {}
        fq = u''
        for (param, value) in request.args.items():
            if param not in [u'q', u'page', u'sort'] \
                    and len(value) and not param.startswith(u'_'):
                if not param.startswith(u'ext_'):
                    fields.append((param, value))
                    fq += u' %s:"%s"' % (param, value)
                    if param not in fields_grouped:
                        fields_grouped[param] = [value]
                    else:
                        fields_grouped[param].append(value)
                else:
                    search_extras[param] = value

        context = {
            u'model': model,
            u'session': model.Session,
            u'user': g.user,
            u'for_view': True,
            u'auth_user_obj': g.userobj
        }

        # Unless changed via config options, don't show other dataset
        # types any search page. Potential alternatives are do show them
        # on the default search page (dataset) or on one other search page
        search_all_type = config.get(u'ckan.search.show_all_types', u'dataset')
        search_all = False

        try:
            # If the "type" is set to True or False, convert to bool
            # and we know that no type was specified, so use traditional
            # behaviour of applying this only to dataset type
            search_all = asbool(search_all_type)
            search_all_type = u'dataset'
        # Otherwise we treat as a string representing a type
        except ValueError:
            search_all = True

        if not search_all or package_type != search_all_type:
            # Only show datasets of this particular type
            fq += u' +dataset_type:{type}'.format(type=package_type)

        facets = OrderedDict()

        default_facet_titles = {
            u'organization': _(u'Organizations'),
            u'groups': _(u'Groups'),
            u'tags': _(u'Tags'),
            u'res_format': _(u'Formats'),
            u'license_id': _(u'Licenses'),
        }

        for facet in h.facets():
            if facet in default_facet_titles:
                facets[facet] = default_facet_titles[facet]
            else:
                facets[facet] = facet

        # Facet titles
        for plugin in plugins.PluginImplementations(plugins.IFacets):
            facets = plugin.dataset_facets(facets, package_type)

        extra_vars[u'facet_titles'] = facets
        data_dict = {
            u'q': q,
            u'fq': fq.strip(),
            u'facet.field': facets.keys(),
            u'rows': limit,
            u'start': (page - 1) * limit,
            u'sort': sort_by,
            u'extras': search_extras,
            u'include_private': asbool(
                config.get(u'ckan.search.default_include_private', True)
            ),
        }

        query = get_action(u'package_search')(context, data_dict)

        extra_vars[u'sort_by_selected'] = query[u'sort']

        extra_vars[u'page'] = h.Page(
            collection=query[u'results'],
            page=page,
            url=pager_url,
            item_count=query[u'count'],
            items_per_page=limit
        )
        extra_vars[u'search_facets'] = query[u'search_facets']
        extra_vars[u'page'].items = query[u'results']

    except SearchQueryError as se:
        # User's search parameters are invalid, in such a way that is not
        # achievable with the web interface, so return a proper error to
        # discourage spiders which are the main cause of this.
        log.info(u'Dataset search query rejected: %r', se.args)
        base.abort(
            400,
            _(u'Invalid search query: {error_message}')
            .format(error_message=str(se))
        )
    except SearchError as se:
        # May be bad input from the user, but may also be more serious like
        # bad code causing a SOLR syntax error, or a problem connecting to
        # SOLR
        log.error(u'Dataset search error: %r', se.args)
        extra_vars[u'query_error'] = True
        extra_vars[u'search_facets'] = {}
        extra_vars[u'page'] = h.Page(collection=[])

    # FIXME: try to avoid using global variables
    g.search_facets_limits = {}

    for facet in extra_vars[u'search_facets'].keys():
        try:
            limit = int(
                request.args.get(
                    u'_%s_limit' % facet,
                    int(config.get(u'search.facets.default', 10))
                )
            )
        except ValueError:
            base.abort(
                400,
                _(u'Parameter u"{parameter_name}" is not '
                  u'an integer').format(parameter_name=u'_%s_limit' % facet)
            )

        g.search_facets_limits[facet] = limit

    _setup_template_variables(context, {}, package_type=package_type)

    extra_vars[u'dataset_type'] = package_type

    # TODO: remove
    for key, value in extra_vars.iteritems():
        setattr(g, key, value)

    return base.render(
        _get_pkg_template(u'search_template', package_type), extra_vars
    )
Example #45
0
    def _read(self, id, limit, group_type):
        ''' This is common code used by both read and bulk_process'''
        context = {'model': model, 'session': model.Session,
                   'user': c.user,
                   'schema': self._db_to_form_schema(group_type=group_type),
                   'for_view': True, 'extras_as_string': True}

        q = c.q = request.params.get('q', '')
        # Search within group
        if c.group_dict.get('is_organization'):
            q += ' owner_org:"%s"' % c.group_dict.get('id')
        else:
            q += ' groups:"%s"' % c.group_dict.get('name')

        c.description_formatted = \
            h.render_markdown(c.group_dict.get('description'))

        context['return_query'] = True

        page = h.get_page_number(request.params)

        # most search operations should reset the page counter:
        params_nopage = [(k, v) for k, v in request.params.items()
                         if k != 'page']
        sort_by = request.params.get('sort', None)

        def search_url(params):
            controller = lookup_group_controller(group_type)
            action = 'bulk_process' if c.action == 'bulk_process' else 'read'
            url = h.url_for(controller=controller, action=action, id=id)
            params = [(k, v.encode('utf-8') if isinstance(v, basestring)
                       else str(v)) for k, v in params]
            return url + u'?' + urlencode(params)

        def drill_down_url(**by):
            return h.add_url_param(alternative_url=None,
                                   controller='group', action='read',
                                   extras=dict(id=c.group_dict.get('name')),
                                   new_params=by)

        c.drill_down_url = drill_down_url

        def remove_field(key, value=None, replace=None):
            controller = lookup_group_controller(group_type)
            return h.remove_url_param(key, value=value, replace=replace,
                                      controller=controller, action='read',
                                      extras=dict(id=c.group_dict.get('name')))

        c.remove_field = remove_field

        def pager_url(q=None, page=None):
            params = list(params_nopage)
            params.append(('page', page))
            return search_url(params)

        try:
            c.fields = []
            c.fields_grouped = {}
            search_extras = {}
            for (param, value) in request.params.items():
                if param not in ['q', 'page', 'sort'] \
                        and len(value) and not param.startswith('_'):
                    if not param.startswith('ext_'):
                        c.fields.append((param, value))
                        q += ' %s: "%s"' % (param, value)
                        if param not in c.fields_grouped:
                            c.fields_grouped[param] = [value]
                        else:
                            c.fields_grouped[param].append(value)
                    else:
                        search_extras[param] = value

            facets = OrderedDict()

            default_facet_titles = {'organization': _('Organizations'),
                                    'groups': _('Groups'),
                                    'tags': _('Tags'),
                                    'res_format': _('Formats'),
                                    'license_id': _('Licenses')}

            for facet in h.facets():
                if facet in default_facet_titles:
                    facets[facet] = default_facet_titles[facet]
                else:
                    facets[facet] = facet

            # Facet titles
            self._update_facet_titles(facets, group_type)

            c.facet_titles = facets

            data_dict = {
                'q': q,
                'fq': '',
                'include_private': True,
                'facet.field': facets.keys(),
                'rows': limit,
                'sort': sort_by,
                'start': (page - 1) * limit,
                'extras': search_extras
            }

            context_ = dict((k, v) for (k, v) in context.items()
                            if k != 'schema')
            query = get_action('package_search')(context_, data_dict)

            c.page = h.Page(
                collection=query['results'],
                page=page,
                url=pager_url,
                item_count=query['count'],
                items_per_page=limit
            )

            c.group_dict['package_count'] = query['count']

            c.search_facets = query['search_facets']
            c.search_facets_limits = {}
            for facet in c.search_facets.keys():
                limit = int(request.params.get('_%s_limit' % facet,
                            config.get('search.facets.default', 10)))
                c.search_facets_limits[facet] = limit
            c.page.items = query['results']

            c.sort_by_selected = sort_by

        except search.SearchError, se:
            log.error('Group search error: %r', se.args)
            c.query_error = True
            c.page = h.Page(collection=[])
Example #46
0
def _read(id, limit, group_type):
    u''' This is common code used by both read and bulk_process'''
    extra_vars = {}
    context = {
        u'model': model,
        u'session': model.Session,
        u'user': g.user,
        u'schema': _db_to_form_schema(group_type=group_type),
        u'for_view': True,
        u'extras_as_string': True
    }

    q = request.params.get(u'q', u'')

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.q = q

    # Search within group
    if g.group_dict.get(u'is_organization'):
        fq = u' owner_org:"%s"' % g.group_dict.get(u'id')
    else:
        fq = u' groups:"%s"' % g.group_dict.get(u'name')

    extra_vars["q"] = q

    g.description_formatted = \
        h.render_markdown(g.group_dict.get(u'description'))

    context['return_query'] = True

    page = h.get_page_number(request.params)

    # most search operations should reset the page counter:
    params_nopage = [(k, v) for k, v in request.params.items() if k != u'page']
    sort_by = request.params.get(u'sort', None)

    def search_url(params):
        controller = lookup_group_controller(group_type)
        action = u'bulk_process' if getattr(
            g, u'action', u'') == u'bulk_process' else u'read'
        url = h.url_for(u'.'.join([controller, action]), id=id)
        params = [(k, v.encode(u'utf-8')
                   if isinstance(v, string_types) else str(v))
                  for k, v in params]
        return url + u'?' + urlencode(params)

    def drill_down_url(**by):
        return h.add_url_param(
            alternative_url=None,
            controller=u'group',
            action=u'read',
            extras=dict(id=g.group_dict.get(u'name')),
            new_params=by)

    extra_vars["drill_down_url"] = drill_down_url

    def remove_field(key, value=None, replace=None):
        controller = lookup_group_controller(group_type)
        return h.remove_url_param(
            key,
            value=value,
            replace=replace,
            controller=controller,
            action=u'read',
            extras=dict(id=g.group_dict.get(u'name')))

    extra_vars["remove_field"] = remove_field

    def pager_url(q=None, page=None):
        params = list(params_nopage)
        params.append((u'page', page))
        return search_url(params)

    try:
        extra_vars["fields"] = fields = []
        extra_vars["fields_grouped"] = fields_grouped = {}
        search_extras = {}
        for (param, value) in request.params.items():
            if param not in [u'q', u'page', u'sort'] \
                    and len(value) and not param.startswith(u'_'):
                if not param.startswith(u'ext_'):
                    fields.append((param, value))
                    q += u' %s: "%s"' % (param, value)
                    if param not in fields_grouped:
                        fields_grouped[param] = [value]
                    else:
                        fields_grouped[param].append(value)
                else:
                    search_extras[param] = value

        # TODO: Remove
        # ckan 2.9: Adding variables that were removed from c object for
        # compatibility with templates in existing extensions
        g.fields = fields
        g.fields_grouped = fields_grouped

        facets = OrderedDict()

        default_facet_titles = {
            u'organization': _(u'Organizations'),
            u'groups': _(u'Groups'),
            u'tags': _(u'Tags'),
            u'res_format': _(u'Formats'),
            u'license_id': _(u'Licenses')
        }

        for facet in h.facets():
            if facet in default_facet_titles:
                facets[facet] = default_facet_titles[facet]
            else:
                facets[facet] = facet

        # Facet titles
        _update_facet_titles(facets, group_type)

        extra_vars["facet_titles"] = facets

        data_dict = {
            u'q': q,
            u'fq': fq,
            u'include_private': True,
            u'facet.field': facets.keys(),
            u'rows': limit,
            u'sort': sort_by,
            u'start': (page - 1) * limit,
            u'extras': search_extras
        }

        context_ = dict((k, v) for (k, v) in context.items() if k != u'schema')
        query = get_action(u'package_search')(context_, data_dict)

        extra_vars["page"] = h.Page(
            collection=query['results'],
            page=page,
            url=pager_url,
            item_count=query['count'],
            items_per_page=limit)

        # TODO: Remove
        # ckan 2.9: Adding variables that were removed from c object for
        # compatibility with templates in existing extensions
        g.group_dict['package_count'] = query['count']

        extra_vars["search_facets"] = g.search_facets = query['search_facets']
        extra_vars["search_facets_limits"] = g.search_facets_limits = {}
        for facet in g.search_facets.keys():
            limit = int(
                request.params.get(u'_%s_limit' % facet,
                                   config.get(u'search.facets.default', 10)))
            g.search_facets_limits[facet] = limit
        extra_vars["page"].items = query['results']

        extra_vars["sort_by_selected"] = sort_by

    except search.SearchError as se:
        log.error(u'Group search error: %r', se.args)
        extra_vars["query_error"] = True
        extra_vars["page"] = h.Page(collection=[])

    # TODO: Remove
    # ckan 2.9: Adding variables that were removed from c object for
    # compatibility with templates in existing extensions
    g.facet_titles = facets
    g.page = extra_vars["page"]

    extra_vars["group_type"] = group_type
    _setup_template_variables(context, {u'id': id}, group_type=group_type)
    return extra_vars
Example #47
0
    def _add_dataset_search(self, showcase_id, showcase_name):
        '''
        Search logic for discovering datasets to add to a showcase.
        '''

        from ckan.lib.search import SearchError

        package_type = 'dataset'

        # unicode format (decoded from utf8)
        q = c.q = request.params.get('q', u'')
        c.query_error = False
        try:
            page = self._get_page_number(request.params)
        except AttributeError:
            # in CKAN >= 2.5 _get_page_number has been moved
            page = h.get_page_number(request.params)

        limit = int(config.get('ckan.datasets_per_page', 20))

        # most search operations should reset the page counter:
        params_nopage = [(k, v) for k, v in request.params.items()
                         if k != 'page']

        def drill_down_url(alternative_url=None, **by):
            return h.add_url_param(alternative_url=alternative_url,
                                   controller='package', action='search',
                                   new_params=by)

        c.drill_down_url = drill_down_url

        def remove_field(key, value=None, replace=None):
            return h.remove_url_param(key, value=value, replace=replace,
                                      controller='package', action='search')

        c.remove_field = remove_field

        sort_by = request.params.get('sort', None)
        params_nosort = [(k, v) for k, v in params_nopage if k != 'sort']

        def _sort_by(fields):
            """
            Sort by the given list of fields.

            Each entry in the list is a 2-tuple: (fieldname, sort_order)

            eg - [('metadata_modified', 'desc'), ('name', 'asc')]

            If fields is empty, then the default ordering is used.
            """
            params = params_nosort[:]

            if fields:
                sort_string = ', '.join('%s %s' % f for f in fields)
                params.append(('sort', sort_string))
            return self._search_url(params, showcase_name)

        c.sort_by = _sort_by
        if sort_by is None:
            c.sort_by_fields = []
        else:
            c.sort_by_fields = [field.split()[0]
                                for field in sort_by.split(',')]

        def pager_url(q=None, page=None):
            params = list(params_nopage)
            params.append(('page', page))
            return self._search_url(params, showcase_name)

        c.search_url_params = urlencode(_encode_params(params_nopage))

        try:
            c.fields = []
            # c.fields_grouped will contain a dict of params containing
            # a list of values eg {'tags':['tag1', 'tag2']}
            c.fields_grouped = {}
            search_extras = {}
            fq = ''
            for (param, value) in request.params.items():
                if param not in ['q', 'page', 'sort'] \
                        and len(value) and not param.startswith('_'):
                    if not param.startswith('ext_'):
                        c.fields.append((param, value))
                        fq += ' %s:"%s"' % (param, value)
                        if param not in c.fields_grouped:
                            c.fields_grouped[param] = [value]
                        else:
                            c.fields_grouped[param].append(value)
                    else:
                        search_extras[param] = value

            context = {'model': model, 'session': model.Session,
                       'user': c.user or c.author, 'for_view': True,
                       'auth_user_obj': c.userobj}

            if package_type and package_type != 'dataset':
                # Only show datasets of this particular type
                fq += ' +dataset_type:{type}'.format(type=package_type)
            else:
                # Unless changed via config options, don't show non standard
                # dataset types on the default search page
                if not tk.asbool(config.get('ckan.search.show_all_types',
                                            'False')):
                    fq += ' +dataset_type:dataset'

            # Only search for packages that aren't already associated with the
            # Showcase
            associated_package_ids = ShowcasePackageAssociation.get_package_ids_for_showcase(showcase_id)
            # flatten resulting list to space separated string
            if associated_package_ids:
                associated_package_ids_str = \
                    ' OR '.join([id[0] for id in associated_package_ids])
                fq += ' !id:({0})'.format(associated_package_ids_str)

            facets = OrderedDict()

            default_facet_titles = {
                    'organization': _('Organizations'),
                    'groups': _('Groups'),
                    'tags': _('Tags'),
                    'res_format': _('Formats'),
                    'license_id': _('Licenses'),
                    }

            # for CKAN-Versions that do not provide the facets-method from
            # helper-context, import facets from ckan.common
            if hasattr(h, 'facets'):
                current_facets = h.facets()
            else:
                from ckan.common import g
                current_facets = g.facets

            for facet in current_facets:
                if facet in default_facet_titles:
                    facets[facet] = default_facet_titles[facet]
                else:
                    facets[facet] = facet

            # Facet titles
            for plugin in p.PluginImplementations(p.IFacets):
                facets = plugin.dataset_facets(facets, package_type)

            c.facet_titles = facets

            data_dict = {
                'q': q,
                'fq': fq.strip(),
                'facet.field': facets.keys(),
                'rows': limit,
                'start': (page - 1) * limit,
                'sort': sort_by,
                'extras': search_extras
            }

            query = get_action('package_search')(context, data_dict)
            c.sort_by_selected = query['sort']

            c.page = h.Page(
                collection=query['results'],
                page=page,
                url=pager_url,
                item_count=query['count'],
                items_per_page=limit
            )
            c.facets = query['facets']
            c.search_facets = query['search_facets']
            c.page.items = query['results']
        except SearchError, se:
            log.error('Dataset search error: %r', se.args)
            c.query_error = True
            c.facets = {}
            c.search_facets = {}
            c.page = h.Page(collection=[])