Пример #1
0
def group_or_org_delete_extra(request, is_org):
    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    extra_key = request.urlvars.get('key', '').strip().decode('utf8')
    if not extra_key in group.extras.keys():
        return wsgihelpers.not_found(context)

    extras = [{'key': key, 'value': value} for key, value in group.extras.items() if not key == extra_key]
    extras.append({'key': extra_key, 'value': group.extras.get(extra_key), 'deleted': True})
    data = ckan_api('organization_update' if is_org else 'group_update', user, {
        'id': group.id,
        'name': group.name,
        'title': group.title,
        'description': group.description,
        'image_url': group.image_url,
        'extras': extras,
        'users': _get_members(group)
    })
    if data['success']:
        return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
    return wsgihelpers.respond_json(context, {}, headers=headers, code=400)
Пример #2
0
def group_or_org_members(request, is_org):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(
            context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    if request.method == 'POST':
        form = GroupRoleForm(request.POST)
        headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
        if form.validate():
            data = ckan_api(
                'member_create', user, {
                    'id': group.id,
                    'object': form.pk.data,
                    'object_type': 'user',
                    'capacity': form.value.data,
                })
            if data['success']:
                return wsgihelpers.respond_json(context, {},
                                                headers=headers,
                                                code=200)
        return wsgihelpers.respond_json(context, {}, headers=headers, code=400)

    members = DB.query(Member, User).filter(
        Member.group == group,
        Member.state == 'active',
        Member.table_id == User.id,
        Member.table_name == 'user',
    )

    roles = {
        'admin': context._('Administrator'),
        'editor': context._('Editor'),
        'member': context._('Member'),
    }

    group_base_url = urls.get_url(lang, 'organization' if is_org else 'group')
    back_url = urls.get_url(group, group.name)
    return templates.render_site('forms/group-members-form.html',
                                 request,
                                 is_org=is_org,
                                 members=members,
                                 group_base_url=group_base_url,
                                 back_url=back_url,
                                 group=group,
                                 roles=roles)
Пример #3
0
def extras(request):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    dataset_name = request.urlvars.get('name')
    dataset = Package.get(dataset_name)
    if not dataset:
        return wsgihelpers.not_found(context)

    if request.method == 'POST':
        headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
        form = DatasetExtrasForm(request.POST)
        if form.validate():
            extras = [
                {'key': key, 'value': value}
                for key, value in dataset.extras.items()
                if not key == (form.old_key.data or form.key.data)
            ]
            extras.append({'key': form.key.data, 'value': form.value.data})
            data = ckan_api('package_update', user, {
                'id': dataset.id,
                'name': dataset.name,
                'title': dataset.title,
                'notes': dataset.notes,
                'owner_org': dataset.owner_org,
                'private': dataset.private,
                'license_id': dataset.license_id,
                'extras': extras,
                'tags': [{'name': package_tag.tag.name} for package_tag in dataset.package_tag_all],
                'resources': [{
                    'id': resource.id,
                    'url': resource.url,
                    'description': resource.description,
                    'format': resource.format,
                    'name': resource.name,
                    'resource_type': resource.resource_type,
                    } for resource in dataset.active_resources
                ],
            })
            if data['success']:
                return wsgihelpers.respond_json(context, {'key': form.key.data, 'value': form.value.data}, headers=headers, code=200)
        return wsgihelpers.respond_json(context, {}, headers=headers, code=400)

        redirect_url = urls.get_url(lang, 'dataset', dataset.name)
        return wsgihelpers.redirect(context, location=redirect_url)

    extras = [(key, value) for key, value in dataset.extras.items() if key not in SPECIAL_EXTRAS]
    back_url = urls.get_url(lang, 'dataset', dataset.name)
    return templates.render_site('forms/dataset-extras-form.html', request, dataset=dataset, extras=extras, back_url=back_url)
Пример #4
0
def group_or_org_extras(request, is_org):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(
            context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    if request.method == 'POST':
        headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
        form = GroupExtrasForm(request.POST)
        if form.validate():
            extras = [{
                'key': key,
                'value': value
            } for key, value in group.extras.items()
                      if not key == (form.old_key.data or form.key.data)]
            extras.append({'key': form.key.data, 'value': form.value.data})
            data = ckan_api(
                'organization_update' if is_org else 'group_update', user, {
                    'id': group.id,
                    'name': group.name,
                    'title': group.title,
                    'description': group.description,
                    'image_url': group.image_url,
                    'extras': extras,
                    'users': _get_members(group)
                })
            if data['success']:
                return wsgihelpers.respond_json(context, {
                    'key': form.key.data,
                    'value': form.value.data
                },
                                                headers=headers,
                                                code=200)
        return wsgihelpers.respond_json(context, {}, headers=headers, code=400)

    group_base_url = urls.get_url(lang, 'organization' if is_org else 'group')
    back_url = urls.get_url(lang, 'group', group.name)
    return templates.render_site('forms/group-extras-form.html',
                                 request,
                                 is_org=is_org,
                                 extras=group.extras.items(),
                                 group_base_url=group_base_url,
                                 back_url=back_url,
                                 group=group)
Пример #5
0
def autocomplete_formats(request):
    context = contexts.Ctx(request)
    pattern = request.params.get('q', '')
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    if not pattern:
        return wsgihelpers.respond_json(context, [], headers=headers)

    pattern = '{0}%'.format(pattern)
    num = int(request.params.get('num', 0))

    query = DB.query(distinct(func.lower(Resource.format)).label('format'), func.count(Resource.id).label('count'))
    query = query.filter(Resource.format.ilike(pattern))
    query = query.order_by('count', 'format').group_by('format')
    if num:
        query = query.limit(num)

    data = [row[0] for row in query]
    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #6
0
def group_or_org_members(request, is_org):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    if request.method == 'POST':
        form = GroupRoleForm(request.POST)
        headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
        if form.validate():
            data = ckan_api('member_create', user, {
                'id': group.id,
                'object': form.pk.data,
                'object_type': 'user',
                'capacity': form.value.data,
            })
            if data['success']:
                return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
        return wsgihelpers.respond_json(context, {}, headers=headers, code=400)

    members = DB.query(Member, User).filter(
        Member.group == group,
        Member.state == 'active',
        Member.table_id == User.id,
        Member.table_name == 'user',
    )

    roles = {
        'admin': context._('Administrator'),
        'editor': context._('Editor'),
        'member': context._('Member'),
    }

    group_base_url = urls.get_url(lang, 'organization' if is_org else 'group')
    back_url = urls.get_url(group, group.name)
    return templates.render_site('forms/group-members-form.html', request,
        is_org=is_org, members=members, group_base_url=group_base_url, back_url=back_url, group=group, roles=roles)
Пример #7
0
def delete_extra(request):
    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    dataset_name = request.urlvars.get('name')
    dataset = Package.get(dataset_name)
    if not dataset:
        return wsgihelpers.not_found(context)

    extra_key = request.urlvars.get('key', '').strip().decode('utf8')
    if not extra_key in dataset.extras.keys():
        return wsgihelpers.not_found(context)

    extras = [{'key': key, 'value': value} for key, value in dataset.extras.items() if not key == extra_key]
    extras.append({'key': extra_key, 'value': dataset.extras.get(extra_key), 'deleted': True})
    data = ckan_api('package_update', user, {
        'id': dataset.id,
        'name': dataset.name,
        'title': dataset.title,
        'notes': dataset.notes,
        'owner_org': dataset.owner_org,
        'private': dataset.private,
        'license_id': dataset.license_id,
        'extras': extras,
        'tags': [{'name': package_tag.tag.name} for package_tag in dataset.package_tag_all],
        'resources': [{
            'id': resource.id,
            'url': resource.url,
            'description': resource.description,
            'format': resource.format,
            'name': resource.name,
            'resource_type': resource.resource_type,
            } for resource in dataset.active_resources
        ],
    })
    if data['success']:
        return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
    return wsgihelpers.respond_json(context, {}, headers=headers, code=400)
Пример #8
0
def group_or_org_delete_member(request, is_org):
    context = contexts.Ctx(request)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    username = request.urlvars.get('username')
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
    data = ckan_api('member_delete', user, {
        'id': group.id,
        'object': username,
        'object_type': 'user',
    })
    if data['success']:
        return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
    return wsgihelpers.respond_json(context, {}, headers=headers, code=400)
Пример #9
0
def autocomplete_formats(request):
    context = contexts.Ctx(request)
    pattern = request.params.get('q', '')
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    if not pattern:
        return wsgihelpers.respond_json(context, [], headers=headers)

    pattern = '{0}%'.format(pattern)
    num = int(request.params.get('num', 0))

    query = DB.query(
        distinct(func.lower(Resource.format)).label('format'),
        func.count(Resource.id).label('count'))
    query = query.filter(Resource.format.ilike(pattern))
    query = query.order_by('count', 'format').group_by('format')
    if num:
        query = query.limit(num)

    data = [row[0] for row in query]
    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #10
0
def group_or_org_delete_extra(request, is_org):
    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(
            context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    extra_key = request.urlvars.get('key', '').strip().decode('utf8')
    if not extra_key in group.extras.keys():
        return wsgihelpers.not_found(context)

    extras = [{
        'key': key,
        'value': value
    } for key, value in group.extras.items() if not key == extra_key]
    extras.append({
        'key': extra_key,
        'value': group.extras.get(extra_key),
        'deleted': True
    })
    data = ckan_api(
        'organization_update' if is_org else 'group_update', user, {
            'id': group.id,
            'name': group.name,
            'title': group.title,
            'description': group.description,
            'image_url': group.image_url,
            'extras': extras,
            'users': _get_members(group)
        })
    if data['success']:
        return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
    return wsgihelpers.respond_json(context, {}, headers=headers, code=400)
Пример #11
0
def group_or_org_delete_member(request, is_org):
    context = contexts.Ctx(request)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(
            context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    username = request.urlvars.get('username')
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
    data = ckan_api('member_delete', user, {
        'id': group.id,
        'object': username,
        'object_type': 'user',
    })
    if data['success']:
        return wsgihelpers.respond_json(context, {}, headers=headers, code=200)
    return wsgihelpers.respond_json(context, {}, headers=headers, code=400)
Пример #12
0
def group_or_org_extras(request, is_org):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)
    user = auth.get_user_from_request(request)
    if not user:
        return wsgihelpers.unauthorized(context)  # redirect to login/register ?

    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)

    if request.method == 'POST':
        headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
        form = GroupExtrasForm(request.POST)
        if form.validate():
            extras = [
                {'key': key, 'value': value}
                for key, value in group.extras.items()
                if not key == (form.old_key.data or form.key.data)
            ]
            extras.append({'key': form.key.data, 'value': form.value.data})
            data = ckan_api('organization_update' if is_org else 'group_update', user, {
                'id': group.id,
                'name': group.name,
                'title': group.title,
                'description': group.description,
                'image_url': group.image_url,
                'extras': extras,
                'users': _get_members(group)
            })
            if data['success']:
                return wsgihelpers.respond_json(context, {'key': form.key.data, 'value': form.value.data}, headers=headers, code=200)
        return wsgihelpers.respond_json(context, {}, headers=headers, code=400)

    group_base_url = urls.get_url(lang, 'organization' if is_org else 'group')
    back_url = urls.get_url(lang, 'group', group.name)
    return templates.render_site('forms/group-extras-form.html', request,
        is_org=is_org, extras=group.extras.items(), group_base_url=group_base_url, back_url=back_url, group=group)
Пример #13
0
def autocomplete(request):
    context = contexts.Ctx(request)
    pattern = '{0}%'.format(request.params.get('q', ''))
    num = int(request.params.get('num', 0))

    query = DB.query(distinct(func.lower(Tag.name)).label('name'), func.count(PackageTag.package_id).label('total'))
    query = query.join(PackageTag)
    query = query.filter(Tag.name.ilike(pattern))
    query = query.order_by('total desc', 'name').group_by('name')
    if num:
        query = query.limit(num)

    data = [row[0] for row in query]
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #14
0
def autocomplete(request):
    query = request.params.get('q', '')
    num = int(request.params.get('num', SEARCH_MAX_ORGANIZATIONS))
    _, results = search(query, 1, num)

    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    data = [{
            'name': organization.name,
            'title': organization.display_name,
            'image_url': organization.image_url or templates.static('/img/placeholder_producer.png'),
        } for organization, _, _ in results['results']]

    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #15
0
def autocomplete(request):
    query = request.params.get('q', '')
    num = int(request.params.get('num', NB_DATASETS))
    _, results = search(query, request, 1, num)

    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
    data = [{
            'name': dataset['name'],
            'title': dataset['display_name'],
            'image_url': (
                (dataset['organization'].image_url if dataset['organization'] else None)
                or templates.static('/img/placeholder_producer.png')
            ),
        } for dataset in results['results']]

    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #16
0
def autocomplete(request):
    context = contexts.Ctx(request)
    pattern = '{0}%'.format(request.params.get('q', ''))
    num = int(request.params.get('num', 0))

    query = DB.query(
        distinct(func.lower(Tag.name)).label('name'),
        func.count(PackageTag.package_id).label('total'))
    query = query.join(PackageTag)
    query = query.filter(Tag.name.ilike(pattern))
    query = query.order_by('total desc', 'name').group_by('name')
    if num:
        query = query.limit(num)

    data = [row[0] for row in query]
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)
    return wsgihelpers.respond_json(context, data, headers=headers)
Пример #17
0
def autocomplete(request):
    query = request.params.get('q', '')
    num = int(request.params.get('num', SEARCH_MAX_ORGANIZATIONS))
    _, results = search(query, 1, num)

    context = contexts.Ctx(request)
    headers = wsgihelpers.handle_cross_origin_resource_sharing(context)

    data = [{
        'name':
        organization.name,
        'title':
        organization.display_name,
        'image_url':
        organization.image_url
        or templates.static('/img/placeholder_producer.png'),
    } for organization, _, _ in results['results']]

    return wsgihelpers.respond_json(context, data, headers=headers)