def hdx_organizations_available_with_roles(): organizations_available = h.organizations_available('read') if organizations_available and len(organizations_available) > 0: orgs_where_editor = [] orgs_where_admin = [] am_sysadmin = new_authz.is_sysadmin(c.user) if not am_sysadmin: orgs_where_editor = set( [org['id'] for org in h.organizations_available('create_dataset')]) orgs_where_admin = set( [org['id'] for org in h.organizations_available('admin')]) for org in organizations_available: org['has_add_dataset_rights'] = True if am_sysadmin: org['role'] = 'sysadmin' elif org['id'] in orgs_where_admin: org['role'] = 'admin' elif org['id'] in orgs_where_editor: org['role'] = 'editor' else: org['role'] = 'member' org['has_add_dataset_rights'] = False organizations_available.sort(key=lambda y: y['display_name'].lower()) return organizations_available
def hdx_organizations_available_with_roles(): """ Gets roles of organizations the current user belongs to """ import ckanext.hdx_org_group.helpers.organization_helper as hdx_helper organizations_available = h.organizations_available( 'read', include_dataset_count=True) # if organizations_available and len(organizations_available) > 0: orgs_where_editor = [] orgs_where_admin = [] am_sysadmin = new_authz.is_sysadmin(c.user) if not am_sysadmin: orgs_where_editor = set( [org['id'] for org in h.organizations_available('create_dataset')]) orgs_where_admin = set( [org['id'] for org in h.organizations_available('admin')]) for org in organizations_available: org['has_add_dataset_rights'] = True if am_sysadmin: org['role'] = 'sysadmin' elif org['id'] in orgs_where_admin: org['role'] = 'admin' elif org['id'] in orgs_where_editor: org['role'] = 'editor' else: org['role'] = 'member' org['has_add_dataset_rights'] = False organizations_available.sort(key=lambda y: y['display_name'].lower()) hdx_helper.org_add_last_updated_field(organizations_available) return organizations_available
def hdx_organizations_available_with_roles(): organizations_available = h.organizations_available('read') if organizations_available and len(organizations_available) > 0: orgs_where_editor = [] orgs_where_admin = [] am_sysadmin = new_authz.is_sysadmin(c.user) if not am_sysadmin: orgs_where_editor = set( [org['id'] for org in h.organizations_available('create_dataset')]) orgs_where_admin = set([org['id'] for org in h.organizations_available('admin')]) for org in organizations_available: org['has_add_dataset_rights'] = True if am_sysadmin: org['role'] = 'sysadmin' elif org['id'] in orgs_where_admin: org['role'] = 'admin' elif org['id'] in orgs_where_editor: org['role'] = 'editor' else: org['role'] = 'member' org['has_add_dataset_rights'] = False organizations_available.sort(key=lambda y: y['display_name'].lower()) return organizations_available
def dcat_transform_creator(self, result): """ If the 'dct:creator' property exists, replace its value with a more human-readable version as well as making it a resolvable URL. """ target = 'dct:creator' if target in result: n = len(target) + 1 index_start = result.find(target) + n value_front = result[:index_start] index_end = result.find(';', index_start) - 1 value_back = result[index_end:] replace = '' id_creator = result[index_start + 1:index_end - 1] for org in helpers.organizations_available('create_dataset'): if org['id'] == id_creator: replace = '<' + str( toolkit.request.host_url) + '/organization/' + str( org['name']) + '>' result = result[:index_start] + replace + result[index_end:] return result
def querytool_list_by_group(context, data_dict): '''Returns a list of query tools that belong to a specified group. :rtype: list of dictionaries ''' # check_access('', # context, data_dict) group = data_dict.get('group') # get a user's organizations: user_orgs = ch.organizations_available('read') querytools = [] if c.userobj is not None: if c.userobj.sysadmin is not None: querytools += CkanextQueryTool.search(group=group) else: for org in user_orgs: querytools += CkanextQueryTool.search(group=group, owner_org=org['id']) else: querytools += CkanextQueryTool.search(group=group, private=False) out = [] for querytool in querytools: querytool = table_dictize(querytool, context) out.append(querytool) return out
def read(self, id=None): context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'auth_user_obj': c.userobj, 'for_view': True} data_dict = {'id': id, 'user_obj': c.userobj} context['with_related'] = True self._setup_template_variables(context, data_dict) c.user_dict['datasets'] = [] # find datasets for requested id userobj = model.User.get(c.user_dict['id']) user_dataset_q = (model.Session.query(model.Package) .join(model.PackageRole) .filter_by(user=userobj, role=model.Role.ADMIN) .order_by(None)) # if signed in, find datasets for organizations where user is admin if c.userobj and c.userobj.name == id: orgs = h.organizations_available('admin') org_ids = [] for org in orgs: org_ids.append(org['id']) if len(org_ids): org_dataset_q = (model.Session.query(model.Package) .join(model.PackageRole) .filter_by(role=model.Role.ADMIN) .filter(model.Package.owner_org.in_(org_ids)) .join(model.User) .filter(model.User.name != 'harvest') .filter(model.User.name != 'default') .order_by(None)) dataset_q = user_dataset_q.union(org_dataset_q) else: dataset_q = user_dataset_q else: dataset_q = user_dataset_q # get datasets, access rights are checked during package_show for dataset in dataset_q: try: dataset_dict = get_action('package_show')( context, {'id': dataset.id}) except NotAuthorized: continue c.user_dict['datasets'].append(dataset_dict) # The legacy templates have the user's activity stream on the user # profile page, new templates do not. if h.asbool(config.get('ckan.legacy_templates', False)): c.user_activity_stream = get_action('user_activity_list_html')( context, {'id': c.user_dict['id']}) return render('user/read.html')
def hdx_organisation_list(): orgs = h.organizations_available('create_dataset') orgs_dict_list = [{ 'value': org.get('name'), 'text': org.get('title') } for org in orgs] return orgs_dict_list
def before_search(self, search_params): deployment_mode = toolkit.asbool( config.get('ckan.ab_scheming.deployment', False)) if deployment_mode: return search_params user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): # added for more control on result datasets # based on our requirement search_params.update({ 'include_private': True, 'include_drafts': True }) if c.process_state: # for the filters in user dashboard and organization. if search_params.get("q"): search_params['q'] += ' %s: "%s"' % ('process_state', c.process_state) else: search_params['q'] = '%s: "%s"' % ('process_state', c.process_state) if search_params.get('fq'): if re.search(r'dataset_type', search_params['fq']): # this is for general search search_params.update({ 'include_private': True, 'include_drafts': True }) return search_params
def ccca_check_member (context, org_id): user_groups = h.organizations_available(permission="read") for g in user_groups: if org_id == g['id']: return True return False
def generate_mandatory_fields(): ''' :return: dataset dict with mandatory fields filled :rtype: dict ''' user = c.user or c.author # random_string = str(uuid.uuid4()).replace('-', '')[:8] # dataset_name = 'autogenerated-{}-{}'.format(user, random_string) selected_org = None orgs = h.organizations_available('create_dataset') if len(orgs) == 0: raise NoOrganization( _('The user needs to belong to at least 1 organisation')) else: selected_org = orgs[0] data_dict = { 'private': True, # 'name': dataset_name, # 'title': dataset_name, 'license_id': 'cc-by', 'owner_org': selected_org.get('id'), 'dataset_source': selected_org.get('title'), 'maintainer': user, 'subnational': 1, 'data_update_frequency': config.get('hdx.default_frequency', '-999'), 'dataset_preview_check': '1', 'dataset_preview': vd._DATASET_PREVIEW_FIRST_RESOURCE, 'dataset_preview_value': vd._DATASET_PREVIEW_FIRST_RESOURCE } return data_dict
def ccca_check_member(context, org_id): user_groups = h.organizations_available(permission="read") for g in user_groups: if org_id == g['id']: return True return False
def more_filters(): org_utente = [org['name'] for org in h.organizations_available('read')] fq = '(capacity:"public"' for org in org_utente: fq += ' OR (capacity:"private" AND organization:"' + org + '")' fq += ')' fq += 'state:"active"' return fq
def manage_notifications(context, data_dict): my_organizations = helpers.organizations_available() can_manage = [org['name'] for org in my_organizations] if data_dict['organization_id'] in can_manage: return {'success': True} else: return { 'success': False, 'msg': 'You do not have permission to register slack for this organization' }
def dge_package_list_for_source(source_id): ''' Creates a dataset list with the ones belonging to a particular harvest source. It calls the package_list snippet and the pager. ''' DATASET_TYPE_NAME = 'harvest' limit = 20 page = int(request.params.get('page', 1)) fq = 'harvest_source_id:"{0}"'.format(source_id) search_dict = { 'fq': fq, 'rows': limit, 'sort': 'metadata_modified desc', 'start': (page - 1) * limit, } context = {'model': model, 'session': model.Session} owner_org = toolkit.c.harvest_source.get('owner_org', '') if owner_org: user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (toolkit.c.harvest_source and owner_org in user_member_of_orgs): context['ignore_capacity_check'] = True query = logic.get_action('package_search')(context, search_dict) base_url = h.url_for('{0}_read'.format(DATASET_TYPE_NAME), id=source_id) def pager_url(q=None, page=None): url = base_url if page: url += '?page={0}'.format(page) return url pager = h.Page(collection=query['results'], page=page, url=pager_url, item_count=query['count'], items_per_page=limit) pager.items = query['results'] if query['results']: out = h.snippet('snippets/dge_package_list.html', packages=query['results']) out += pager.pager() else: out = h.snippet('snippets/package_list_empty.html') return out
def package_list_for_source(source_id): ''' Creates a dataset list with the ones belonging to a particular harvest source. It calls the package_list snippet and the pager. ''' limit = 20 page = int(request.params.get('page', 1)) fq = '+harvest_source_id:"{0}"'.format(source_id) search_dict = { 'fq': fq, 'rows': limit, 'sort': 'metadata_modified desc', 'start': (page - 1) * limit, } context = {'model': model, 'session': model.Session} harvest_source = get_harvest_source(source_id) owner_org = harvest_source.get('owner_org', '') if owner_org: user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (harvest_source and owner_org in user_member_of_orgs): context['ignore_capacity_check'] = True query = logic.get_action('package_search')(context, search_dict) base_url = h.url_for('{0}_read'.format(DATASET_TYPE_NAME), id=source_id) def pager_url(q=None, page=None): url = base_url if page: url += '?page={0}'.format(page) return url pager = h.Page( collection=query['results'], page=page, url=pager_url, item_count=query['count'], items_per_page=limit ) pager.items = query['results'] if query['results']: out = h.snippet('snippets/package_list.html', packages=query['results']) out += pager.pager() else: out = h.snippet('snippets/package_list_empty.html') return out
def querytool_update(context, data_dict): ''' Authorization check for updating querytool or visualizations ''' querytool = data_dict.get('name') if querytool: # check if user has an edit permission for given querytool: querytool = CkanextQueryTool.get(name=querytool) return {'success': user_in_org_or_group(querytool.owner_org)} # if querytool is None then we need to create one: # check if user has a edit permission for any org: orgs = organizations_available() return {'success': any([org['capacity'] != 'member' for org in orgs])}
def hdx_organizations_available_with_roles(): organizations_available = h.organizations_available("read") if organizations_available and len(organizations_available) > 0: orgs_where_editor = [] orgs_where_admin = [] am_sysadmin = new_authz.is_sysadmin(c.user) if not am_sysadmin: orgs_where_editor = set([org["id"] for org in h.organizations_available("create_dataset")]) orgs_where_admin = set([org["id"] for org in h.organizations_available("admin")]) for org in organizations_available: org["has_add_dataset_rights"] = True if am_sysadmin: org["role"] = "sysadmin" elif org["id"] in orgs_where_admin: org["role"] = "admin" elif org["id"] in orgs_where_editor: org["role"] = "editor" else: org["role"] = "member" org["has_add_dataset_rights"] = False organizations_available.sort(key=lambda y: y["display_name"].lower()) return organizations_available
def helper_main_organization(user=None): user = user or c.userobj if not user: return None main_organization = user.extras.get('main_organization', None) if main_organization: context = {'model': model, 'session': model.Session, 'user': c.user} return toolkit.get_action('organization_show')(context, {'id': main_organization}) else: if c.userobj.sysadmin: return None # Admin is part of all organization so main organization would be invalid every time. available = helpers.organizations_available() return available[0] if available else None
def querytool_update(context, data_dict): ''' Authorization check for updating querytool or visualizations ''' querytool = data_dict.get('name') if querytool: # check if user an edit permission for given querytool: querytool = CkanextQueryTool.get(name=querytool) user_in_org = user_in_org_or_group(querytool.owner_org) if user_in_org: return {'success': True} return {'success': False} # if querytool is None then we need to create one: # check if user has a read permission for any org: orgs = organizations_available('read') if len(orgs) == 0: return {'success': False} return {'success': True}
def helper_main_organization(user=None): user = user or c.userobj if not user: return None main_organization = user.extras.get('main_organization', None) if main_organization: context = {'model': model, 'session': model.Session, 'user': c.user} return toolkit.get_action('organization_show')(context, { 'id': main_organization }) else: if c.userobj.sysadmin: return None # Admin is part of all organization so main organization would be invalid every time. available = helpers.organizations_available() return available[0] if available else None
def orgs_for_admin_report(): context = {'model': model, 'session': model.Session} admin_orgs = organizations_available(permission='admin') # relationship_managers = literal_eval(config.get('dgu.relationship_managers', '{}')) # allowed_orgs = relationship_managers.get(c.user, []) # if allowed_orgs: # data_dict = { # 'organizations': allowed_orgs, # 'all_fields': True, # } # rm_orgs = get_action('organization_list')(context, data_dict) # else: # rm_orgs = [] all_orgs = {} # for org in (admin_orgs + rm_orgs): for org in admin_orgs: all_orgs[org['name']] = org return sorted(all_orgs.values(), key=lambda x: x['title'])
params.append(("page", page)) return search_url(params) try: c.fields = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org["id"] for org in h.organizations_available("read")] if c.group and c.group.id in user_member_of_orgs: fq = "" context["ignore_capacity_check"] = True facets = OrderedDict() default_facet_titles = { "groups": _("Groups"), "tags": _("Tags"), "res_format": _("Formats"), "license": _("Licence"), } for facet in g.facets:
try: c.fields = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = {'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license': _('Licence'), } for facet in g.facets: if facet in default_facet_titles: facets[facet] = default_facet_titles[facet]
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 or c.author, '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 # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = authz.get_group_or_org_admin_ids(c.group.id) page = self._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): return h.remove_url_param(key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = {'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses')} for facet in g.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) if 'capacity' in facets and (group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, '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'] lang = get_lang()[0] q_results = model.Session.query(GroupMultilang).filter(GroupMultilang.group_id == c.group_dict.get('id'), GroupMultilang.lang == lang).all() if q_results: for result in q_results: c.group_dict[result.field] = result.text if result.field == 'title': c.group_dict['display_name'] = result.text c.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int(request.params.get('_%s_limit' % facet, g.facets_default_number)) c.search_facets_limits[facet] = limit # MULTILANG - Localizing Organizations display names in Facet list organizations = c.search_facets.get('organization') for org in organizations.get('items'): q_results = model.Session.query(GroupMultilang).filter(GroupMultilang.name == org.get('name'), GroupMultilang.lang == lang).all() if q_results: for result in q_results: if result.field == 'title': org['display_name'] = result.text # MULTILANG - Localizing Groups display names in Facet list groups = c.search_facets.get('groups') for group in groups.get('items'): q_results = model.Session.query(GroupMultilang).filter(GroupMultilang.name == group.get('name'), GroupMultilang.lang == lang).all() if q_results: for result in q_results: if result.field == 'title': group['display_name'] = result.text # MULTILANG - Localizing Tags display names in Facet list tags = c.search_facets.get('tags') for tag in tags.get('items'): localized_tag = TagMultilang.by_name(tag.get('name'), lang) if localized_tag: tag['display_name'] = localized_tag.text c.page.items = query['results'] # MULTILANG - Localizing Datasets names and descriptions in search list log.info(':::::::::::: Retrieving the corresponding localized title and abstract :::::::::::::::') for item in c.page.items: lang = get_lang()[0] q_results = model.Session.query(PackageMultilang).filter(PackageMultilang.package_id == item.get('id'), PackageMultilang.lang == lang).all() if q_results: for result in q_results: item[result.field] = result.text c.sort_by_selected = sort_by except search.SearchError, se: log.error('Group search error: %r', se.args) c.query_error = True c.facets = {} c.page = h.Page(collection=[])
def _read(self, id, limit, group_type): # noqa c.include_children_selected = False if not c.group_dict.get('is_organization'): return ''' This is common code used by both read and bulk_process''' context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'schema': self._db_to_form_schema(group_type=group_type), 'for_view': True, 'extras_as_string': True} c.description_formatted = \ h.render_markdown(c.group_dict.get('description')) context['return_query'] = True # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = authz.get_group_or_org_admin_ids(c.group.id) 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): return h.remove_url_param(key, value=value, replace=replace, controller='group', 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: q = c.q = request.params.get('q', '') fq = c.fq = request.params.get('fq', '') c.fields = [] 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)) fq += ' %s: "%s"' % (param, value) else: search_extras[param] = value user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): context['ignore_capacity_check'] = True else: fq += ' capacity:"public"' 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) if 'capacity' in facets and (group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets # filter by organization with fq (filter query) c.include_children_selected = True children = _children_name_list( hierarchy_helpers.group_tree_section( c.group_dict.get('id'), include_parents=False, include_siblings=False ).get('children', []) ) if not children: fq += ' organization:"%s"' % c.group_dict.get('name') else: fq += ' organization:("%s"' % c.group_dict.get('name') for name in children: if name: fq += ' OR "%s"' % name fq += ")" data_dict = { 'q': q, 'fq': fq, '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.search_facets = {} c.page = h.Page(collection=[])
params.append(('sort', sort_string)) return search_url(params, package_type) 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(',')] ## fin sort ## aux_q = '' first_org = '' for item in h.organizations_available(): if aux_q: aux_q += ' || organization:%s' % item.get('name') else: aux_q = 'organization:%s' % item.get('name') first_org = item.get('name') query_q = asciify(request.params.get('q', u'')) if query_q: c.query_q = request.params.get('q', u'') aux_q += ' && ' + query_q else: c.query_q = '' log.error(aux_q) c.search_result = get_action('package_search')(context, {'q': aux_q, 'rows': limit, 'start': (page -1) * limit, 'sort': sort_by, 'fq': fq.strip()})
def _read(self, id, limit): ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, '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') description = c.group_dict.get('description') if description: if group_type == 'group': c.description_formatted = h.render_markdown( description.get(h.lang())) else: c.description_formatted = h.render_markdown(description) context['return_query'] = True # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = new_authz.get_group_or_org_admin_ids(c.group.id) page = self._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'] default_sort_by = 'metadata_modified desc' sort_by = request.params.get('sort', default_sort_by) def search_url(params): if group_type == 'organization': if c.action == 'bulk_process': url = self._url_for(controller='organization', action='bulk_process', id=id) else: url = self._url_for(controller='organization', action='read', id=id) else: url = self._url_for(controller='group', action='read', 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): return h.remove_url_param(key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = { 'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses') } for facet in g.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): if self.group_type == 'organization': facets = plugin.organization_facets( facets, self.group_type, None) else: facets = plugin.group_facets(facets, self.group_type, None) if 'capacity' in facets and (self.group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, '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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') 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, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[])
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): return h.remove_url_param(key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value include_private = False user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): include_private = True facets = OrderedDict() default_facet_titles = { 'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses') } for facet in g.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) if 'capacity' in facets and (group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': '', 'include_private': include_private, '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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int( request.params.get('_%s_limit' % facet, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[])
def helper_organizations_for_select(): organizations = [{ 'value': organization['id'], 'text': organization['display_name'] } for organization in helpers.organizations_available()] return [{'value': '', 'text': ''}] + organizations
def querytool_list(context, data_dict): # check if user has a read permission for any org: orgs = organizations_available('read') if len(orgs) == 0: return {'success': False} return {'success': True}
def count_organizations(): organizations = h.organizations_available('create_dataset') count = len(organizations) return count
class EDCOrganizationController(OrganizationController): def index(self): # FIXME: index copied from GroupController and modified to # show only parent groups context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, 'for_view': True, 'with_private': False } data_dict = {'all_fields': False} 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 search_result = self._action('organization_list')(context, data_dict) org_model = context['model'] #Get the list of all groups of type "organization" that have no parents. top_level_orgs = org_model.Group.get_top_level_groups( type="organization") top_results = [ org for org in top_level_orgs if org.name in search_result ] facets = OrderedDict() facets['organization'] = _('Organizations') data_dict = { 'facet.field': facets.keys(), } query = get_action('package_search')(context, data_dict) c.org_pkg_count = query['facets'].get('organization') c.top_orgs_items = top_results return render('organization/index.html') def _read(self, id, limit, group_type='organization'): # FIXME: copied and modified from GroupController to collect # sub organizations, create c.fields_grouped and hard-code # search facets ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, 'schema': self._db_to_form_schema(group_type=group_type), 'for_view': True, 'extras_as_string': True } # Get the subgorgs of this org org_id = c.group_dict.get('id') q = c.q = request.params.get('q', '') # XXX: unfortunate hack, copy sort default behaviour from # before_search because we're using the q parameter below # even when no text query was submitted if not q and request.params.get('sort') in (None, 'rank'): sort_by = 'record_publish_date desc, metadata_modified desc' else: sort_by = request.params.get('sort', None) suborgs = ['"' + org + '"' for org in get_suborgs(org_id)] if suborgs != []: q += ' owner_org:("' + org_id + '" OR ' + ' OR '.join( suborgs) + ')' else: q += ' owner_org:"%s"' % org_id c.description_formatted = h.render_markdown( c.group_dict.get('description')) context['return_query'] = True try: page = int(request.params.get('page', 1)) except ValueError, e: abort(400, ('"page" parameter must be an integer')) # most search operations should reset the page counter: params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] def search_url(params): action = 'bulk_process' if c.action == 'bulk_process' else 'read' url = h.url_for(controller='organization', 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='organization', 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): return h.remove_url_param(key, value=value, replace=replace, controller='organization', 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 = [] search_extras = {} c.fields_grouped = {} for (param, value) in request.params.items(): if not param 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 fq = 'capacity:"public"' user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = { 'organization': _('Organizations'), 'edc_state': _('States'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses'), 'type': _('Dataset types') } for facet in default_facet_titles: facets[facet] = default_facet_titles[facet] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, 'facet.field': facets.keys(), 'rows': limit, 'sort': sort_by, 'start': (page - 1) * limit, 'extras': search_extras } 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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int( request.params.get('_%s_limit' % facet, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[])
class ECODPGroupController(GroupController): def index(self): start = time.time() group_type = self._guess_group_type() language = tk.request.environ['CKAN_LANG'] or config.get('ckan.locale_default', 'en') 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', '') data_dict = {'all_fields': True, 'q': q} sort_by = c.sort_by_selected = request.params.get('sort') if sort_by: data_dict['sort'] = sort_by 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 results = self._action('group_list')(context, data_dict) c.amount_group_displayed = amount_group_displayed c.groups = results[:amount_group_displayed] c.hasmoregroups = len(results) > amount_group_displayed c.themes = self._action('theme_list')(context, {}) c.catalogs = CatalogDcatApOp.get_ui_list_catalogs(config.get('ckan.locale_default', 'en')) c.amount_catalog_displayed = amount_catalog_displayed #c.page = h.Page( # collection=results, # page=request.params.get('page', 1), # url=h.pager_url, # items_per_page=21 #) # @cache.cache('cached_render', expire=3600) def cached_render(user, languge, group_type): _render = base.render(group_type) return _render start_render = time.time() _render = cached_render(context.get('user'), language, self._index_template(group_type)) duration_render= time.time() - start_render log.info("Duration index render. {0}".format(duration_render)) duration = time.time() - start log.info("Duration index. {0}".format(duration)) return _render def read(self, id, limit=20): start = time.time() if request.GET.get('ext_boolean') in ['all', 'any', 'exact']: base.session['ext_boolean'] = request.GET['ext_boolean'] base.session.save() language = tk.request.environ['CKAN_LANG'] or config.get('ckan.locale_default', 'en') group_type = self._get_group_type(id.split('@')[0]) if (group_type != self.group_type) and (group_type != "eurovoc_domain"): abort(404, _('Incorrect group type')) context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'schema': self._db_to_form_schema(group_type=group_type), 'for_view': True} # Do not query for the group datasets when dictizing, as they will # be ignored and get requested on the controller anyway data_dict = {'id': id, 'include_datasets': False} # unicode format (decoded from utf8) q = c.q = request.params.get('q', '') try: stratqs = time.time() if 'eurovoc_domain' in data_dict.get('id','') : raise NotFound('EurovocDomains are not available any more') result = self._action('group_show_read')(context, data_dict) c.group_dict = result.get('group_dict', None) context["group"] = result.get('group') durationgs = time.time() - stratqs log.info("Duration group show read. {0}".format(durationgs)) c.group = context['group'] except NotFound: abort(404, _('Group not found')) except NotAuthorized: abort(401, _('Unauthorized to read group %s') % id) self._read(id, limit) start_render = time.time() # @cache.cache('render_cached_read', expire=3600) def render_cached(user, id, language, group_type): _render = base.render(self._read_template(c.group_dict['type'])) return _render _render = render_cached(context.get('user'), id, language, c.group_dict['type']) duration_render = time.time() - start_render # _render = base.render(self._read_template(c.group_dict['type'])) duration = time.time() - start log.info("Duration read_group. {0}".format(duration)) return _render def _read(self, id, limit=20): import time language = tk.request.environ['CKAN_LANG'] or config.get('ckan.locale_default', 'en') start = time.time() ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = {'model': model, 'session': model.Session, 'user': c.user or c.author, '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 q != u'': qTab = q.split(' ') checkbox = request.params.get('ext_boolean') if checkbox == 'all': q = '(' + ' AND '.join(qTab) + ')' elif checkbox == 'any': q = '(' + ' OR '.join(qTab) + ')' else: #checkbox == 'exact' q = '"' + q + '"' c.description_formatted = h.render_markdown(c.group_dict.get('description')) context['return_query'] = True # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = new_authz.get_group_or_org_admin_ids(c.group.id) try: page = int(request.params.get('page', 1)) except ValueError, e: abort(400, ('"page" parameter must be an integer')) # most search operations should reset the page counter: params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] new_params_nopage = [] for key, value in params_nopage: if key == 'eurovoc_domains': new_params_nopage.append(('groups', value)) else: new_params_nopage.append((key,value)) params_nopage = new_params_nopage #sort_by = request.params.get('sort', 'name asc') sort_by = request.params.get('sort', None) @cache.cache('search_url', expire=3600) def search_url(params): if group_type == 'organization': if c.action == 'bulk_process': url = self._url_for(controller='organization', action='bulk_process', id=id) else: url = self._url_for(controller='organization', action='read', id=id) else: url = self._url_for(controller='group', action='read', 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) @cache.cache('drill_down_url', expire=3600) 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): if c.group_dict.get('is_organization'): return h.remove_url_param(key, value=value, replace=replace, controller='organization', action='read', extras=dict(id=c.group_dict.get('id'))) else: return h.remove_url_param(key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): c.fields.append((param, value)) param = 'eurovoc_domains' if (param == 'eurovoc_domains') else param; q += ' %s:"%s"' % (param, value) else: search_extras[param] = value fq = '' if c.group_dict.get('is_organization'): q += ' owner_org:"%s"' % c.group_dict.get('id') elif c.group_dict.get('name') not in q: q += ' groups:"%s"' % c.group_dict.get('name') fq = fq + ' capacity:"public"' user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = {'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses')} for facet in g.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): if self.group_type == 'organization': facets = plugin.organization_facets( facets, self.group_type, None) else: facets = plugin.group_facets( facets, self.group_type, None) if 'capacity' in facets and (self.group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, 'facet.field': facets.keys(), 'rows': limit, 'sort': sort_by, 'start': (page - 1) * limit, 'extras': search_extras, 'defType': 'edismax' } active_cache = config.get('ckan.cache.active', 'false') context_ = dict((k, v) for (k, v) in context.items() if k != 'schema') has_result = False dict_as_pickle = None if active_cache == 'true': dict_as_pickle = pickle.dumps(data_dict) query_json = redis.get_from_cache(dict_as_pickle, pool=redis.MISC_POOL) if query_json: query = pickle.loads(query_json) has_result = True if has_result == False: query = get_action('package_search')(context_, data_dict) if active_cache == 'true': redis.set_value_in_cache(dict_as_pickle, pickle.dumps(query), pool=redis.MISC_POOL) c.search_url_params = urlencode(_encode_params(params_nopage)) c.page = page_util.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.facets = query['facets'] #maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int(request.params.get('_%s_limit' % facet, g.facets_default_number)) c.search_facets_limits[facet] = limit c.page.items = query['results'] c.sort_by_selected = sort_by duration = time.time() - start log.info("Duration _read. {0}".format(duration)) except search.SearchError, se: log.error('Group search error: %r', se.args) c.query_error = True c.facets = {} c.page = page_util.Page(collection=[]) c.search_url_params = ''
class ECODPOrganizationController(OrganizationController): def _url_for(self, *args, **kw): ''' Overwrite to use the publisher link, not organization (as derived from the core's group controller otherwise. ''' if 'controller' in kw: kw['controller'] = 'ckanext.ecportal.controllers.organization:ECODPOrganizationController' return h.url_for(*args, **kw) def index(self, max_element=None): group_type = self._guess_group_type() context = { 'model': model, 'session': model.Session, 'user': c.user, 'for_view': True, 'with_private': False } if c.user: context['with_private'] = True locale = request.environ['CKAN_LANG'] or config.get( 'ckan.locale_default', 'en') start = time.time() result = get_action('get_skos_hierarchy')(context, max_element) duration = time.time() - start factory = ControlledVocabularyFactory() publ_mdr = factory.get_controlled_vocabulary_util( ControlledVocabularyFactory.CORPORATE_BODY ) #type: CorporateBodiesUtil for top_level, item in result.items(): translation = publ_mdr.get_translation_for_language( top_level, locale) item['name'] = top_level.split('/')[-1].lower() item['label'] = translation interim = [] for child in item.get('children', []): translation = publ_mdr.get_translation_for_language( child[0], locale) interim.append( (child[0].split('/')[-1].lower(), translation, child[1])) item['children'] = sorted(interim, key=lambda child: child[1]) log.info("get SKOS hierachy took {0}".format(duration)) c.items = result return render(self._index_template(group_type)) def _read(self, id, limit): ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, 'schema': self._db_to_form_schema(group_type=group_type), 'for_view': True, 'extras_as_string': True } q = c.q # = request.params.get('q', '') log.info('Organization read q: %s in organization: %s' % (q, c.group_dict.get('id', ''))) if q != u'': result = '' if request.params.get('ext_boolean') == 'any': result = build_search_for_any_words(q) q = result elif request.params.get('ext_boolean') == 'exact': result = '"%s"' % (q) q = result log.info("%s" % (request.params.get('ext_boolean'))) c.description_formatted = h.render_markdown( c.group_dict.get('description')) context['return_query'] = True # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = new_authz.get_group_or_org_admin_ids(c.group.id) try: page = int(request.params.get('page', 1)) except ValueError, e: abort(400, ('"page" parameter must be an integer')) # most search operations should reset the page counter: params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] new_params_nopage = [] for key, value in params_nopage: if key == 'eurovoc_domains': new_params_nopage.append(('groups', value)) else: new_params_nopage.append((key, value)) # todo check why it is added # params_nopage = new_params_nopage; # sort_by = request.params.get('sort', 'name asc') sort_by = request.params.get('sort', None) def search_url(params): if group_type == 'organization': if c.action == 'bulk_process': url = self._url_for(controller='organization', action='bulk_process', id=id) else: url = self._url_for(controller='organization', action='read', id=id) else: url = self._url_for(controller='group', action='read', 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): if c.group_dict.get('is_organization'): # ORGANIZATION_CONTROLLER return h.remove_url_param( key, value=value, replace=replace, controller=ORGANIZATION_CONTROLLER, action='read', extras=dict(id=c.group_dict.get('id'))) else: return h.remove_url_param( key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): c.fields.append((param, value)) # todo: facet group eurovoc doamin check why we replace eurovoc_domain with groups # param = 'groups' if (param == 'eurovoc_domains') else param; q += ' %s:"%s"' % (param, value) else: search_extras[param] = value # Search within group add group id herel if c.group_dict.get('is_organization'): q += ' owner_org:"%s"' % c.group_dict.get('id') elif c.group_dict.get('name') not in q: q += ' groups:"%s"' % c.group_dict.get('name') fq = 'capacity:"public"' user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = { 'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses') } for facet in g.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): if self.group_type == 'organization': facets = plugin.organization_facets( facets, self.group_type, None) else: facets = plugin.group_facets(facets, self.group_type, None) if 'capacity' in facets and (self.group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, 'facet.field': facets.keys(), 'rows': limit, 'sort': sort_by, 'start': (page - 1) * limit, 'extras': search_extras, 'defType': 'edismax' } context_ = dict( (k, v) for (k, v) in context.items() if k != 'schema') query = get_action('package_search')(context_, data_dict) c.search_url_params = urlencode(_encode_params(params_nopage)) c.page = page_util.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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int( request.params.get('_%s_limit' % facet, g.facets_default_number)) c.search_facets_limits[facet] = limit c.page.items = query['results'] c.sort_by_selected = sort_by except search.SearchError, se: log.error('Organization search error: %r', se.args) c.query_error = True c.facets = {} c.page = page_util.Page(collection=[]) c.search_url_params = ''
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 = self._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): return h.remove_url_param( key, value=value, replace=replace, controller="group", 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org["id"] for org in h.organizations_available("read")] if c.group and c.group.id in user_member_of_orgs: fq = "" context["ignore_capacity_check"] = True facets = OrderedDict() default_facet_titles = { "organization": _("Organizations"), "groups": _("Groups"), "tags": _("Tags"), "res_format": _("Formats"), "license_id": _("Licenses"), } for facet in g.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) if "capacity" in facets and (group_type != "organization" or not user_member_of_orgs): del facets["capacity"] c.facet_titles = facets data_dict = { "q": q, "fq": fq, "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.facets = query["facets"] maintain.deprecate_context_item("facets", "Use `c.search_facets` instead.") c.search_facets = query["search_facets"] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int(request.params.get("_%s_limit" % facet, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[])
def _read(self, id, limit): ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = {'model': model, 'session': model.Session, 'user': c.user or c.author, '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') description = c.group_dict.get('description') if description: if group_type == 'group': c.description_formatted = h.render_markdown(description.get(h.lang())) else: c.description_formatted = h.render_markdown(description) context['return_query'] = True # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = new_authz.get_group_or_org_admin_ids(c.group.id) page = self._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): if group_type == 'organization': if c.action == 'bulk_process': url = self._url_for(controller='organization', action='bulk_process', id=id) else: url = self._url_for(controller='organization', action='read', id=id) else: url = self._url_for(controller='group', action='read', 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): return h.remove_url_param(key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = {'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses')} for facet in g.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): if self.group_type == 'organization': facets = plugin.organization_facets( facets, self.group_type, None) else: facets = plugin.group_facets( facets, self.group_type, None) if 'capacity' in facets and (self.group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, '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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int(request.params.get('_%s_limit' % facet, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[])
def helper_organizations_for_select(): organizations = [{'value': organization['id'], 'text': organization['display_name']} for organization in helpers.organizations_available()] return [{'value': '', 'text': ''}] + organizations
class GroupController(base.BaseController): group_type = 'group' ## hooks for subclasses def _group_form(self, group_type=None): return lookup_group_plugin(group_type).group_form() def _form_to_db_schema(self, group_type=None): return lookup_group_plugin(group_type).form_to_db_schema() def _db_to_form_schema(self, group_type=None): '''This is an interface to manipulate data from the database into a format suitable for the form (optional)''' return lookup_group_plugin(group_type).db_to_form_schema() def _setup_template_variables(self, context, data_dict, group_type=None): return lookup_group_plugin(group_type).\ setup_template_variables(context, data_dict) def _new_template(self, group_type): return lookup_group_plugin(group_type).new_template() def _index_template(self, group_type): return lookup_group_plugin(group_type).index_template() def _about_template(self, group_type): return lookup_group_plugin(group_type).about_template() def _read_template(self, group_type): return lookup_group_plugin(group_type).read_template() def _history_template(self, group_type): return lookup_group_plugin(group_type).history_template() def _edit_template(self, group_type): return lookup_group_plugin(group_type).edit_template() def _activity_template(self, group_type): return lookup_group_plugin(group_type).activity_template() def _admins_template(self, group_type): return lookup_group_plugin(group_type).admins_template() def _bulk_process_template(self, group_type): return lookup_group_plugin(group_type).bulk_process_template() ## end hooks def _replace_group_org(self, string): ''' substitute organization for group if this is an org''' if self.group_type == 'organization': string = re.sub('^group', 'organization', string) return string def _action(self, action_name): ''' select the correct group/org action ''' return get_action(self._replace_group_org(action_name)) def _check_access(self, action_name, *args, **kw): ''' select the correct group/org check_access ''' return check_access(self._replace_group_org(action_name), *args, **kw) def _render_template(self, template_name): ''' render the correct group/org template ''' return render(self._replace_group_org(template_name)) def _redirect_to(self, *args, **kw): ''' wrapper to ensue the correct controller is used ''' if self.group_type == 'organization' and 'controller' in kw: kw['controller'] = 'organization' return h.redirect_to(*args, **kw) def _url_for(self, *args, **kw): ''' wrapper to ensue the correct controller is used ''' if self.group_type == 'organization' and 'controller' in kw: kw['controller'] = 'organization' return h.url_for(*args, **kw) def _guess_group_type(self, expecting_name=False): """ Guess the type of group from the URL handling the case where there is a prefix on the URL (such as /data/organization) """ parts = [x for x in request.path.split('/') if x] idx = -1 if expecting_name: idx = -2 gt = parts[idx] if gt == 'group': gt = None return gt def index(self): group_type = self._guess_group_type() 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', '') data_dict = {'all_fields': True, 'q': q} sort_by = c.sort_by_selected = request.params.get('sort') if sort_by: data_dict['sort'] = sort_by 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 results = self._action('group_list')(context, data_dict) c.amount_group_diplayed = amount_group_displayed c.groups = results[:amount_group_displayed] c.hasmoregroups = len(results) > amount_group_displayed #c.page = h.Page( # collection=results, # page=request.params.get('page', 1), # url=h.pager_url, # items_per_page=21 #) return render(self._index_template(group_type)) def read(self, id, limit=20): if request.GET.get('ext_boolean') in ['all', 'any', 'exact']: base.session['ext_boolean'] = request.GET['ext_boolean'] base.session.save() group_type = self._get_group_type(id.split('@')[0]) if (group_type != self.group_type) and (group_type != "eurovoc_domain"): abort(404, _('Incorrect group type')) context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, 'schema': self._db_to_form_schema(group_type=group_type), 'for_view': True } # Do not query for the group datasets when dictizing, as they will # be ignored and get requested on the controller anyway data_dict = {'id': id, 'include_datasets': False} # unicode format (decoded from utf8) q = c.q = request.params.get('q', '') try: c.group_dict = self._action('group_show')(context, data_dict) c.group = context['group'] except NotFound: abort(404, _('Group not found')) except NotAuthorized: abort(401, _('Unauthorized to read group %s') % id) self._read(id, limit) return render(self._read_template(c.group_dict['type'])) def _read(self, id, limit): ''' This is common code used by both read and bulk_process''' group_type = self._get_group_type(id.split('@')[0]) context = { 'model': model, 'session': model.Session, 'user': c.user or c.author, '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 # c.group_admins is used by CKAN's legacy (Genshi) templates only, # if we drop support for those then we can delete this line. c.group_admins = new_authz.get_group_or_org_admin_ids(c.group.id) try: page = int(request.params.get('page', 1)) except ValueError, e: abort(400, ('"page" parameter must be an integer')) # most search operations should reset the page counter: params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] new_params_nopage = [] for key, value in params_nopage: if key == 'eurovoc_domains': new_params_nopage.append(('groups', value)) else: new_params_nopage.append((key, value)) params_nopage = new_params_nopage #sort_by = request.params.get('sort', 'name asc') sort_by = request.params.get('sort', None) def search_url(params): if group_type == 'organization': if c.action == 'bulk_process': url = self._url_for(controller='organization', action='bulk_process', id=id) else: url = self._url_for(controller='organization', action='read', id=id) else: url = self._url_for(controller='group', action='read', 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): if c.group_dict.get('is_organization'): return h.remove_url_param( key, value=value, replace=replace, controller='organization', action='read', extras=dict(id=c.group_dict.get('id'))) else: return h.remove_url_param( key, value=value, replace=replace, controller='group', 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 = [] search_extras = {} for (param, value) in request.params.items(): if not param in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): c.fields.append((param, value)) param = 'groups' if (param == 'eurovoc_domains') else param q += ' %s: "%s"' % (param, value) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [ org['id'] for org in h.organizations_available('read') ] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = { 'organization': _('Organizations'), 'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license_id': _('Licenses') } for facet in g.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): if self.group_type == 'organization': facets = plugin.organization_facets( facets, self.group_type, None) else: facets = plugin.group_facets(facets, self.group_type, None) if 'capacity' in facets and (self.group_type != 'organization' or not user_member_of_orgs): del facets['capacity'] c.facet_titles = facets data_dict = { 'q': q, 'fq': fq, '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.search_url_params = urlencode(_encode_params(params_nopage)) 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.facets = query['facets'] maintain.deprecate_context_item('facets', 'Use `c.search_facets` instead.') c.search_facets = query['search_facets'] c.search_facets_limits = {} for facet in c.facets.keys(): limit = int( request.params.get('_%s_limit' % facet, g.facets_default_number)) 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.facets = {} c.page = h.Page(collection=[]) c.search_url_params = ''
try: c.fields = [] search_extras = {} for (param, value) in request.params.items(): if not param 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) else: search_extras[param] = value fq = 'capacity:"public"' user_member_of_orgs = [org['id'] for org in h.organizations_available('read')] if (c.group and c.group.id in user_member_of_orgs): fq = '' context['ignore_capacity_check'] = True facets = OrderedDict() default_facet_titles = {'groups': _('Groups'), 'tags': _('Tags'), 'res_format': _('Formats'), 'license': _('Licence')} for facet in g.facets: if facet in default_facet_titles: facets[facet] = default_facet_titles[facet]