예제 #1
0
파일: dashboard.py 프로젝트: etalab/weckan
def metrics(request):
    context = contexts.Ctx(request)
    _ = context._

    datasets = DB.query(Package).filter(Package.state == 'active', ~Package.private).count()

    reuses = DB.query(Related).count()

    resources = DB.query(Resource).filter(Resource.state == 'active').count()

    file_formats = DB.query(distinct(Resource.format)).count()

    organizations = DB.query(Group).filter(Group.is_organization == True, Group.state == 'active').count()

    certified_organizations = DB.query(CertifiedPublicService).join(Group).filter(Group.state == 'active').count()

    users = DB.query(User).count()

    return templates.render_site('metrics.html', request, ws_url=conf['ws_url'], metrics=(
        ('datasets_count', _('Datasets'), datasets),
        ('related_count', _('Reuses'), reuses),
        ('resources_count', _('Resources'), resources),
        ('organizations_count', _('Organizations'), organizations),
        ('certifieds', _('Certified organizations'), certified_organizations),
        ('users', _('Users'), users),
        ('datasets_total_weight', _('Total quality'), '...'),
        ('datasets_average_weight', _('Average quality'), '...'),
        ('datasets_median_weight', _('Median quality'), '...'),
        ('formats_count', _('File formats'), file_formats),
    ))
예제 #2
0
def edit_community(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_url = urls.get_url(lang, 'dataset', dataset_name)

    resource_id = request.urlvars.get('resource')
    resource = CommunityResource.get(resource_id)
    if not resource:
        return wsgihelpers.not_found(context)

    delete_url = urls.get_url(lang, 'dataset', dataset_name,
                              'community/resource', resource_id, 'delete')

    form = CommunityResourceForm(request.POST,
                                 resource,
                                 i18n=context.translator)

    if request.method == 'POST' and form.validate():
        form.populate_obj(resource)
        DB.add(resource)
        DB.commit()
        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/resource-form.html',
                                 request,
                                 new=False,
                                 form=form,
                                 back_url=dataset_url,
                                 delete_url=delete_url)
예제 #3
0
파일: reuse.py 프로젝트: etalab/weckan
def create(request):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)

    dataset_name = request.urlvars.get('name')
    dataset_url = urls.get_url(lang, 'dataset', dataset_name)

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

    form = ReuseForm(request.POST, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        data = ckan_api('related_create', user, {
            'title': form.title.data,
            'description': form.description.data,
            'url': form.url.data,
            'image_url': form.image_url.data,
            'type': form.type.data,
            'dataset_id': dataset_name,
        })

        org_id = request.POST.get('publish_as')
        if org_id:
            reuse = Related.get(data['result']['id'])
            organization = Group.get(org_id)
            reuse_as_org = ReuseAsOrganization(reuse, organization)
            DB.add(reuse_as_org)
            DB.commit()

        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/reuse-form.html', request, new=True, form=form, back_url=dataset_url)
예제 #4
0
def recent_datasets(request):
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    last_datasets = queries.last_datasets()
    last_datasets = last_datasets.filter(Package.owner_org == organization.id)

    count = last_datasets.count()
    end = page * SEARCH_PAGE_SIZE
    start = end - SEARCH_PAGE_SIZE

    return templates.render_site('search-datasets.html', request,
        title = organization.title,
        url_pattern=get_page_url_pattern(request),
        datasets={
            'total': count,
            'page': page,
            'page_size': SEARCH_PAGE_SIZE,
            'total_pages': count / SEARCH_PAGE_SIZE,
            'results': dataset.serialize(last_datasets[start:end])
            }
        )
예제 #5
0
def private_datasets(request):
    user = auth.get_user_from_request(request)
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)
    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    if not user or not (user.sysadmin or user.is_in_group(organization.id)):
        return wsgihelpers.forbidden(context)

    private_datasets = queries.datasets(private=True)
    private_datasets = private_datasets.filter(Package.owner_org == organization.id)

    count = private_datasets.count()
    end = page * SEARCH_PAGE_SIZE
    start = end - SEARCH_PAGE_SIZE

    return templates.render_site('search-datasets.html', request,
        title = organization.title,
        url_pattern=get_page_url_pattern(request),
        datasets={
            'total': count,
            'page': page,
            'page_size': SEARCH_PAGE_SIZE,
            'total_pages': count / SEARCH_PAGE_SIZE,
            'results': dataset.serialize(private_datasets[start:end])
            }
        )
예제 #6
0
def popular_datasets(request):
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    fake, results = dataset.search(None,
                                   request,
                                   page=page,
                                   page_size=SEARCH_PAGE_SIZE,
                                   organization=organization)
    return templates.render_site(
        'search-datasets.html',
        request,
        title=organization.title,
        url_pattern=get_page_url_pattern(request),
        datasets=results,
    )
예제 #7
0
파일: resource.py 프로젝트: etalab/weckan
def edit_community(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_url = urls.get_url(lang, 'dataset', dataset_name)

    resource_id = request.urlvars.get('resource')
    resource = CommunityResource.get(resource_id)
    if not resource:
        return wsgihelpers.not_found(context)

    delete_url = urls.get_url(lang, 'dataset', dataset_name, 'community/resource', resource_id, 'delete')

    form = CommunityResourceForm(request.POST, resource, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        form.populate_obj(resource)
        DB.add(resource)
        DB.commit()
        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/resource-form.html', request, new=False, form=form,
            back_url=dataset_url, delete_url=delete_url)
예제 #8
0
파일: resource.py 프로젝트: etalab/weckan
def edit(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_url = urls.get_url(lang, 'dataset', dataset_name)

    resource_id = request.urlvars.get('resource')
    resource = Resource.get(resource_id)
    delete_url = urls.get_url(lang, 'dataset', dataset_name, 'resource_delete', resource_id)

    form = ResourceForm(request.POST, resource, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        url = forms.handle_upload(request, form.file, user)
        ckan_api('resource_update', user, {
            'id': resource_id,
            'package_id': dataset_name,
            'name': form.name.data,
            'description': form.description.data,
            'url': url or form.url.data,
            'format': form.format.data,
        })
        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/resource-form.html', request, form=form, resource=resource,
            back_url=dataset_url, delete_url=delete_url)
예제 #9
0
def create(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 ?

    form = DatasetForm(request.POST, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        name = build_slug(form.title.data)

        ckan_api('package_create', user, {
            'name': name,
            'title': form.title.data,
            'notes': form.notes.data,
            'owner_org': form.owner_org.data,
            'private': form.private.data,
            'license_id': form.license_id.data,
            'extras': extras_from_form(form),
            'tags': tags_from_form(form),
        })

        dataset = Package.by_name(name)
        fix_groups(dataset, form.groups.data)

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

    back_url = urls.get_url(lang)
    return templates.render_site('forms/dataset-create-form.html', request, form=form, back_url=back_url)
예제 #10
0
파일: group.py 프로젝트: etalab/weckan
def create_group_or_org(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 ?

    form = GroupForm(request.POST, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        name = strings.slugify(form.title.data)
        ckan_api(
            'organization_create' if is_org else 'group_create', user, {
                'name': name,
                'title': form.title.data,
                'description': form.description.data,
                'image_url': form.image_url.data,
            })

        redirect_url = urls.get_url(lang,
                                    'organization' if is_org else 'group',
                                    name)
        return wsgihelpers.redirect(context, location=redirect_url)

    back_url = urls.get_url(lang, 'organizations' if is_org else 'groups')
    return templates.render_site('forms/group-create-form.html',
                                 request,
                                 is_new=True,
                                 is_org=is_org,
                                 form=form,
                                 back_url=back_url)
예제 #11
0
def edit(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)

    form = DatasetForm(request.POST, dataset,
        frequency=dataset.extras.get('frequency'),
        territorial_coverage=dataset.extras.get('territorial_coverage', '').split(','),
        territorial_coverage_granularity=dataset.extras.get('territorial_coverage_granularity'),
        temporal_coverage_from=dataset.extras.get('temporal_coverage_from'),
        temporal_coverage_to=dataset.extras.get('temporal_coverage_to'),
        tags=[tag.name for tag in dataset.get_tags()],
        groups=[group.id for group in dataset.get_groups('group')],
        i18n=context.translator
    )

    if request.method == 'POST' and form.validate():
        name = build_slug(form.title.data, dataset.name)
        extras = [{'key': key, 'value': value} for key, value in dataset.extras.items() if key not in SPECIAL_EXTRAS]
        extras.extend(extras_from_form(form))
        ckan_api('package_update', user, {
            'id': dataset.id,
            'name': name,
            'title': form.title.data,
            'notes': form.notes.data,
            'owner_org': form.owner_org.data,
            'private': form.private.data,
            'license_id': form.license_id.data,
            'extras': extras,
            'tags': tags_from_form(form),
            '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
            ],
        })

        dataset = Package.by_name(name)
        fix_groups(dataset, form.groups.data)

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

    delete_url = urls.get_url(lang, 'dataset/delete', dataset.name)
    back_url = urls.get_url(lang, 'dataset', dataset.name)
    return templates.render_site('forms/dataset-edit-form.html', request,
            dataset=dataset, form=form, back_url=back_url, delete_url=delete_url)
예제 #12
0
def search_more(request):
    query = request.params.get('q', '')
    page = parse_page(request)
    _, results = search(query, request, page, SEARCH_PAGE_SIZE)
    return templates.render_site('search-datasets.html', request,
        search_query=query,
        url_pattern=get_page_url_pattern(request),
        datasets=results
    )
예제 #13
0
def search_more(request):
    query = request.params.get('q', '')
    page = parse_page(request)
    _, results = search(query, page, SEARCH_PAGE_SIZE)
    return templates.render_site('search-organizations.html', request,
        search_query=query,
        url_pattern=get_page_url_pattern(request),
        organizations=results
    )
예제 #14
0
def display(request):
    user = auth.get_user_from_request(request)
    context = contexts.Ctx(request)
    _ = context.translator.ugettext

    organization_name = request.urlvars.get('name')

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    last_datasets = queries.last_datasets()
    last_datasets = last_datasets.filter(Package.owner_org == organization.id)
    last_datasets = last_datasets.limit(NB_DATASETS)

    fake, results = dataset.search(None, request, page_size=NB_DATASETS, organization=organization)

    dataset_tabs = (
        ('popular', _('Most popular'), results['results']),
        ('recents', _('Latest'), dataset.serialize(last_datasets)),
    )

    role = auth.get_role_for(user, organization)
    is_member = user and user.is_in_group(organization.id)
    is_admin = (is_member and role == Role.ADMIN) or (user and user.sysadmin)
    is_editor = is_admin or (is_member and role == Role.EDITOR)

    if is_admin:
        private_datasets = queries.datasets(private=True)
        private_datasets = private_datasets.filter(Package.owner_org == organization.id)
        private_datasets = private_datasets.limit(NB_DATASETS)
        dataset_tabs += (
            ('privates', _('Privates'), dataset.serialize(private_datasets)),
        )

    return templates.render_site('organization.html', context,
        organization=organization,
        nb_members=nb_members,
        nb_datasets=nb_datasets,
        nb_followers=UserFollowingGroup.follower_count(organization.id),
        is_following=UserFollowingGroup.is_following(user.id, organization.id) if organization and user else False,
        is_member=is_member,
        is_admin=is_admin,
        is_editor=is_editor,
        pending=(not is_member and MembershipRequest.is_pending(organization, user)),
        can_edit=auth.can_edit_org(user, organization),
        territory=territories.get_cookie(request),
        dataset_tabs=dataset_tabs,
        pending_requests=MembershipRequest.pending_for(organization) if is_admin else None,
    )
예제 #15
0
def popular_datasets(request):
    ctx = contexts.Ctx(request)
    page = parse_page(request)

    ident, results = search(None, request, page, SEARCH_PAGE_SIZE)

    return templates.render_site('search-datasets.html', request,
        title=ctx._('Popular datasets'),
        url_pattern=get_page_url_pattern(request),
        datasets=results
        )
예제 #16
0
파일: group.py 프로젝트: etalab/weckan
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)
예제 #17
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)
예제 #18
0
def search_results(request):
    query = request.params.get('q', '')

    with futures.ThreadPoolExecutor(max_workers=3) as executor:
        workers = [
            executor.submit(dataset.search, query, request),
            executor.submit(organization.search, query),
            executor.submit(wiki.search, query),
        ]

    results = dict(worker.result() for worker in futures.as_completed(workers))

    return templates.render_site('search.html', request, search_query=query, has_ckan=False, **results)
예제 #19
0
파일: group.py 프로젝트: etalab/weckan
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)
예제 #20
0
파일: reuse.py 프로젝트: etalab/weckan
def edit(request):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)

    dataset_name = request.urlvars.get('name')
    dataset_url = urls.get_url(lang, 'dataset', dataset_name)

    reuse_id = request.urlvars.get('reuse')
    reuse = Related.get(reuse_id)
    owner = User.get(reuse.owner_id)
    publish_as = ReuseAsOrganization.get(reuse)
    delete_url = urls.get_url(lang, 'dataset', dataset_name, 'related/delete', reuse.id)

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

    form = ReuseForm(request.POST, reuse,
        publish_as=publish_as.organization.id if publish_as else None,
        i18n=context.translator,
    )

    if request.method == 'POST' and form.validate():
        ckan_api('related_update', user, {
            'id': reuse_id,
            'title': form.title.data,
            'description': form.description.data,
            'url': form.url.data,
            'image_url': form.image_url.data,
            'type': form.type.data,
            'owner_id': reuse.owner_id,
            'dataset_id': dataset_name,
        })

        org_id = request.POST.get('publish_as')
        if org_id:
            organization = Group.get(org_id)
            if publish_as:
                publish_as.organization = organization
            else:
                publish_as = ReuseAsOrganization(reuse, organization)
            DB.add(publish_as)
            DB.commit()
        elif publish_as:
            DB.delete(publish_as)
            DB.commit()

        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/reuse-form.html', request, new=False, form=form, owner=owner,
            back_url=dataset_url, delete_url=delete_url)
예제 #21
0
파일: group.py 프로젝트: etalab/weckan
def display(request):
    context = contexts.Ctx(request)
    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)
    page = parse_page(request)
    _, results = dataset.search('', request, page, SEARCH_PAGE_SIZE, group)
    main_groups = [t['name'] for t in templates.main_topics()]
    return templates.render_site('group.html', request,
        group=group,
        url_pattern=get_page_url_pattern(request),
        datasets=results,
        group_class='topic-{0}'.format(main_groups.index(group_name) + 1) if group_name in main_groups else None,
    )
예제 #22
0
파일: group.py 프로젝트: etalab/weckan
def edit_group_or_org(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)
    form = GroupForm(request.POST, group, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        name = strings.slugify(form.title.data)
        extras = [{
            'key': key,
            'value': value
        } for key, value in group.extras.items()]
        ckan_api(
            'organization_update' if is_org else 'group_update', user, {
                'id': group.id,
                'name': name,
                'title': form.title.data,
                'description': form.description.data,
                'image_url': form.image_url.data,
                'extras': extras,
                'users': _get_members(group),
            })

        redirect_url = urls.get_url(lang,
                                    'organization' if is_org else 'group',
                                    name)
        return wsgihelpers.redirect(context, location=redirect_url)

    group_type = 'organization' if is_org else 'group'
    group_base_url = urls.get_url(lang, group_type)
    back_url = urls.get_url(lang, group_type, group.name)
    delete_url = urls.get_url(lang, group_type, 'delete', group.name)
    return templates.render_site('forms/group-edit-form.html',
                                 request,
                                 is_org=is_org,
                                 form=form,
                                 group_base_url=group_base_url,
                                 group=group,
                                 back_url=back_url,
                                 delete_url=delete_url)
예제 #23
0
def display(request):
    user = auth.get_user_from_request(request)

    dataset_name = request.urlvars.get('name')

    query = DB.query(Package, Group, func.min(Activity.timestamp))
    query = query.outerjoin(Group, Group.id == Package.owner_org)
    query = query.outerjoin(Activity, Activity.object_id == Package.id)
    query = query.filter(or_(
        Package.name == dataset_name,
        Package.id == dataset_name
    ))
    query = query.group_by(Package, Group)

    if not query.count():
        return wsgihelpers.not_found(contexts.Ctx(request))

    dataset, organization, timestamp = query.first()

    periodicity = dataset.extras.get('frequency', None)

    supplier_id = dataset.extras.get('supplier_id', None)
    supplier = DB.query(Group).filter(Group.id == supplier_id).first() if supplier_id else None


    return templates.render_site('dataset.html', request,
        dataset=dataset,
        publication_date=timestamp,
        organization=organization,
        is_following_org=UserFollowingGroup.is_following(user.id, organization.id) if organization and user else False,
        supplier=supplier,
        owner=queries.owner(dataset).first(),
        nb_followers=UserFollowingDataset.follower_count(dataset.id),
        is_following=UserFollowingDataset.is_following(user.id, dataset.id) if user else False,
        territorial_coverage=build_territorial_coverage(dataset),
        temporal_coverage=build_temporal_coverage(dataset),
        periodicity=periodicity,
        groups=dataset.get_groups('group'),
        can_edit=auth.can_edit_dataset(user, dataset),
        is_fork=queries.is_fork(dataset),
        quality=get_quality(dataset.name),
        ceils=QA_CEILS,
        territory=territories.get_cookie(request),
        bot_name=conf['bot_name'],
        alerts=DatasetAlert.get_open_for(dataset),
        alert_types=ALERT_TYPE_NAMES,
    )
예제 #24
0
def home(request):
    context = contexts.Ctx(request)
    _ = context.translator.ugettext

    fake, results = dataset.search(None, request, page_size=NB_DATASETS)
    last_datasets = queries.last_datasets(False).limit(NB_DATASETS)

    dataset_tabs = (
        ('popular', _('Most popular'), results['results']),
        ('recent', _('Latest'), dataset.serialize(last_datasets)),
    )

    return templates.render_site('home.html', context,
        featured_reuses=queries.featured_reuses().limit(NB_DATASETS),
        territory=territories.get_cookie(request),
        dataset_tabs=dataset_tabs,
    )
예제 #25
0
파일: group.py 프로젝트: etalab/weckan
def group_or_org_membership_requests(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)
    pending_requests = MembershipRequest.pending_for(group)

    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-membership-requests-form.html', request,
        is_org=is_org, pending_requests=pending_requests, group_base_url=group_base_url, back_url=back_url, group=group)
예제 #26
0
파일: group.py 프로젝트: etalab/weckan
def display(request):
    context = contexts.Ctx(request)
    group_name = request.urlvars.get('name')
    group = Group.by_name(group_name)
    if not group:
        return wsgihelpers.not_found(context)
    page = parse_page(request)
    _, results = dataset.search('', request, page, SEARCH_PAGE_SIZE, group)
    main_groups = [t['name'] for t in templates.main_topics()]
    return templates.render_site(
        'group.html',
        request,
        group=group,
        url_pattern=get_page_url_pattern(request),
        datasets=results,
        group_class='topic-{0}'.format(main_groups.index(group_name) + 1)
        if group_name in main_groups else None,
    )
예제 #27
0
파일: group.py 프로젝트: etalab/weckan
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)
예제 #28
0
def popular_datasets(request):
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    fake, results = dataset.search(None, request, page=page, page_size=SEARCH_PAGE_SIZE, organization=organization)
    return templates.render_site('search-datasets.html', request,
        title = organization.title,
        url_pattern=get_page_url_pattern(request),
        datasets=results,
        )
예제 #29
0
def recent_datasets(request):
    ctx = contexts.Ctx(request)
    page = parse_page(request)

    last_datasets = queries.last_datasets(False)
    count = last_datasets.count()
    end = (page * NB_DATASETS) + 1
    start = end - NB_DATASETS

    return templates.render_site('search-datasets.html', request,
        title = ctx._('Recent datasets'),
        url_pattern=get_page_url_pattern(request),
        datasets={
            'total': count,
            'page': page,
            'page_size': NB_DATASETS,
            'total_pages': count / NB_DATASETS,
            'results': serialize(last_datasets[start:end])
            }
        )
예제 #30
0
def private_datasets(request):
    user = auth.get_user_from_request(request)
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)
    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    if not user or not (user.sysadmin or user.is_in_group(organization.id)):
        return wsgihelpers.forbidden(context)

    private_datasets = queries.datasets(private=True)
    private_datasets = private_datasets.filter(
        Package.owner_org == organization.id)

    count = private_datasets.count()
    end = page * SEARCH_PAGE_SIZE
    start = end - SEARCH_PAGE_SIZE

    return templates.render_site('search-datasets.html',
                                 request,
                                 title=organization.title,
                                 url_pattern=get_page_url_pattern(request),
                                 datasets={
                                     'total':
                                     count,
                                     'page':
                                     page,
                                     'page_size':
                                     SEARCH_PAGE_SIZE,
                                     'total_pages':
                                     count / SEARCH_PAGE_SIZE,
                                     'results':
                                     dataset.serialize(
                                         private_datasets[start:end])
                                 })
예제 #31
0
def create(request):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)

    dataset_name = request.urlvars.get('name')
    dataset_url = urls.get_url(lang, 'dataset', dataset_name)

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

    form = ReuseForm(request.POST, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        data = ckan_api(
            'related_create', user, {
                'title': form.title.data,
                'description': form.description.data,
                'url': form.url.data,
                'image_url': form.image_url.data,
                'type': form.type.data,
                'dataset_id': dataset_name,
            })

        org_id = request.POST.get('publish_as')
        if org_id:
            reuse = Related.get(data['result']['id'])
            organization = Group.get(org_id)
            reuse_as_org = ReuseAsOrganization(reuse, organization)
            DB.add(reuse_as_org)
            DB.commit()

        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/reuse-form.html',
                                 request,
                                 new=True,
                                 form=form,
                                 back_url=dataset_url)
예제 #32
0
파일: group.py 프로젝트: etalab/weckan
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)
예제 #33
0
파일: group.py 프로젝트: etalab/weckan
def group_or_org_membership_requests(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)
    pending_requests = MembershipRequest.pending_for(group)

    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-membership-requests-form.html',
                                 request,
                                 is_org=is_org,
                                 pending_requests=pending_requests,
                                 group_base_url=group_base_url,
                                 back_url=back_url,
                                 group=group)
예제 #34
0
def edit(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_url = urls.get_url(lang, 'dataset', dataset_name)

    resource_id = request.urlvars.get('resource')
    resource = Resource.get(resource_id)
    delete_url = urls.get_url(lang, 'dataset', dataset_name, 'resource_delete',
                              resource_id)

    form = ResourceForm(request.POST, resource, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        url = forms.handle_upload(request, form.file, user)
        ckan_api(
            'resource_update', user, {
                'id': resource_id,
                'package_id': dataset_name,
                'name': form.name.data,
                'description': form.description.data,
                'url': url or form.url.data,
                'format': form.format.data,
            })
        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/resource-form.html',
                                 request,
                                 form=form,
                                 resource=resource,
                                 back_url=dataset_url,
                                 delete_url=delete_url)
예제 #35
0
def recent_datasets(request):
    organization_name = request.urlvars.get('name')
    page = parse_page(request)
    context = contexts.Ctx(request)

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    last_datasets = queries.last_datasets()
    last_datasets = last_datasets.filter(Package.owner_org == organization.id)

    count = last_datasets.count()
    end = page * SEARCH_PAGE_SIZE
    start = end - SEARCH_PAGE_SIZE

    return templates.render_site('search-datasets.html',
                                 request,
                                 title=organization.title,
                                 url_pattern=get_page_url_pattern(request),
                                 datasets={
                                     'total':
                                     count,
                                     'page':
                                     page,
                                     'page_size':
                                     SEARCH_PAGE_SIZE,
                                     'total_pages':
                                     count / SEARCH_PAGE_SIZE,
                                     'results':
                                     dataset.serialize(
                                         last_datasets[start:end])
                                 })
예제 #36
0
파일: group.py 프로젝트: etalab/weckan
def edit_group_or_org(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)
    form = GroupForm(request.POST, group, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        name = strings.slugify(form.title.data)
        extras = [{'key': key, 'value': value} for key, value in group.extras.items()]
        ckan_api('organization_update' if is_org else 'group_update', user, {
            'id': group.id,
            'name': name,
            'title': form.title.data,
            'description': form.description.data,
            'image_url': form.image_url.data,
            'extras': extras,
            'users': _get_members(group),
        })

        redirect_url = urls.get_url(lang, 'organization' if is_org else 'group', name)
        return wsgihelpers.redirect(context, location=redirect_url)

    group_type = 'organization' if is_org else 'group'
    group_base_url = urls.get_url(lang, group_type)
    back_url = urls.get_url(lang, group_type, group.name)
    delete_url = urls.get_url(lang, group_type, 'delete', group.name)
    return templates.render_site('forms/group-edit-form.html', request,
        is_org=is_org, form=form, group_base_url=group_base_url, group=group,
        back_url=back_url, delete_url=delete_url)
예제 #37
0
파일: group.py 프로젝트: etalab/weckan
def create_group_or_org(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 ?

    form = GroupForm(request.POST, i18n=context.translator)

    if request.method == 'POST' and form.validate():
        name = strings.slugify(form.title.data)
        ckan_api('organization_create' if is_org else 'group_create', user, {
            'name': name,
            'title': form.title.data,
            'description': form.description.data,
            'image_url': form.image_url.data,
        })

        redirect_url = urls.get_url(lang, 'organization' if is_org else 'group', name)
        return wsgihelpers.redirect(context, location=redirect_url)

    back_url = urls.get_url(lang, 'organizations' if is_org else 'groups')
    return templates.render_site('forms/group-create-form.html', request,
        is_new=True, is_org=is_org, form=form, back_url=back_url)
예제 #38
0
def display(request):
    user = auth.get_user_from_request(request)
    context = contexts.Ctx(request)
    _ = context.translator.ugettext

    organization_name = request.urlvars.get('name')

    query = queries.organizations_and_counters()
    query = query.filter(Group.name == organization_name)

    if not query.count():
        return wsgihelpers.not_found(context)

    organization, nb_datasets, nb_members = query.first()

    last_datasets = queries.last_datasets()
    last_datasets = last_datasets.filter(Package.owner_org == organization.id)
    last_datasets = last_datasets.limit(NB_DATASETS)

    fake, results = dataset.search(None,
                                   request,
                                   page_size=NB_DATASETS,
                                   organization=organization)

    dataset_tabs = (
        ('popular', _('Most popular'), results['results']),
        ('recents', _('Latest'), dataset.serialize(last_datasets)),
    )

    role = auth.get_role_for(user, organization)
    is_member = user and user.is_in_group(organization.id)
    is_admin = (is_member and role == Role.ADMIN) or (user and user.sysadmin)
    is_editor = is_admin or (is_member and role == Role.EDITOR)

    if is_admin:
        private_datasets = queries.datasets(private=True)
        private_datasets = private_datasets.filter(
            Package.owner_org == organization.id)
        private_datasets = private_datasets.limit(NB_DATASETS)
        dataset_tabs += (('privates', _('Privates'),
                          dataset.serialize(private_datasets)), )

    return templates.render_site(
        'organization.html',
        context,
        organization=organization,
        nb_members=nb_members,
        nb_datasets=nb_datasets,
        nb_followers=UserFollowingGroup.follower_count(organization.id),
        is_following=UserFollowingGroup.is_following(user.id, organization.id)
        if organization and user else False,
        is_member=is_member,
        is_admin=is_admin,
        is_editor=is_editor,
        pending=(not is_member
                 and MembershipRequest.is_pending(organization, user)),
        can_edit=auth.can_edit_org(user, organization),
        territory=territories.get_cookie(request),
        dataset_tabs=dataset_tabs,
        pending_requests=MembershipRequest.pending_for(organization)
        if is_admin else None,
    )
예제 #39
0
def redevances(request):
    return templates.render_site('redevances.html', contexts.Ctx(request))
예제 #40
0
def edit(request):
    context = contexts.Ctx(request)
    lang = request.urlvars.get('lang', templates.DEFAULT_LANG)

    dataset_name = request.urlvars.get('name')
    dataset_url = urls.get_url(lang, 'dataset', dataset_name)

    reuse_id = request.urlvars.get('reuse')
    reuse = Related.get(reuse_id)
    owner = User.get(reuse.owner_id)
    publish_as = ReuseAsOrganization.get(reuse)
    delete_url = urls.get_url(lang, 'dataset', dataset_name, 'related/delete',
                              reuse.id)

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

    form = ReuseForm(
        request.POST,
        reuse,
        publish_as=publish_as.organization.id if publish_as else None,
        i18n=context.translator,
    )

    if request.method == 'POST' and form.validate():
        ckan_api(
            'related_update', user, {
                'id': reuse_id,
                'title': form.title.data,
                'description': form.description.data,
                'url': form.url.data,
                'image_url': form.image_url.data,
                'type': form.type.data,
                'owner_id': reuse.owner_id,
                'dataset_id': dataset_name,
            })

        org_id = request.POST.get('publish_as')
        if org_id:
            organization = Group.get(org_id)
            if publish_as:
                publish_as.organization = organization
            else:
                publish_as = ReuseAsOrganization(reuse, organization)
            DB.add(publish_as)
            DB.commit()
        elif publish_as:
            DB.delete(publish_as)
            DB.commit()

        return wsgihelpers.redirect(context, location=dataset_url)

    return templates.render_site('forms/reuse-form.html',
                                 request,
                                 new=False,
                                 form=form,
                                 owner=owner,
                                 back_url=dataset_url,
                                 delete_url=delete_url)