Beispiel #1
0
def group_list(context, data_dict):
    """Returns a list of groups"""

    model = context["model"]
    user = context["user"]
    api = context.get("api_version") or "1"
    ref_group_by = "id" if api == "2" else "name"
    order_by = data_dict.get("order_by", "name")
    if order_by not in set(("name", "packages")):
        raise ValidationError('"order_by" value %r not implemented.' % order_by)
    all_fields = data_dict.get("all_fields", None)

    check_access("group_list", context, data_dict)

    query = model.Session.query(model.Group).join(model.GroupRevision)
    query = query.filter(model.GroupRevision.state == "active")
    query = query.filter(model.GroupRevision.current == True)

    if order_by == "name":
        sort_by, reverse = "name", False

    groups = query.all()

    if order_by == "packages":
        sort_by, reverse = "packages", True

    if not all_fields:
        group_list = [getattr(p, ref_group_by) for p in groups]
    else:
        group_list = group_list_dictize(groups, context, lambda x: x[sort_by], reverse)

    return group_list
Beispiel #2
0
def group_list(context, data_dict):
    '''Returns a list of groups'''

    model = context['model']
    user = context['user']
    api = context.get('api_version') or '1'
    ref_group_by = 'id' if api == '2' else 'name'
    order_by = data_dict.get('order_by', 'name')
    if order_by not in set(('name', 'packages')):
        raise ValidationError('"order_by" value %r not implemented.' %
                              order_by)
    all_fields = data_dict.get('all_fields', None)

    check_access('group_list', context, data_dict)

    query = model.Session.query(model.Group).join(model.GroupRevision)
    query = query.filter(model.GroupRevision.state == 'active')
    query = query.filter(model.GroupRevision.current == True)

    if order_by == 'name':
        sort_by, reverse = 'name', False

    groups = query.all()

    if order_by == 'packages':
        sort_by, reverse = 'packages', True

    group_list = group_list_dictize(groups, context, lambda x: x[sort_by],
                                    reverse)

    if not all_fields:
        group_list = [group[ref_group_by] for group in group_list]

    return group_list
    def groups(self, id):

        q = (
            model.Session.query(model.Group)
            .filter(model.Group.is_organization == False)
            .filter(model.Group.state == "active")
        )

        groups = q.all()

        """
        package = c.get('package')
        if package:
            groups = set(groups) - set(package.get_groups())
        """

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

        group_list = model_dictize.group_list_dictize(groups, context)

        c.event_dropdown = [[group["id"], group["display_name"]] for group in group_list]

        return super(MapactionPackageController, self).groups(id)
def metadata_collection_dictize(metadata_collection, context):
    model = context['model']
    is_latest_revision = not (context.get('revision_id')
                              or context.get('revision_date'))
    execute = _execute if is_latest_revision else _execute_with_revision

    result_dict = ckan_model_dictize.group_dictize(
        metadata_collection,
        context,
        include_groups=False,
        include_tags=False,
        include_users=False,
        include_extras=True,
        packages_field='dataset_count')

    # infrastructures
    if is_latest_revision:
        member = model.member_table
    else:
        member = model.member_revision_table
    group = model.group_table
    q = select([group, member.c.capacity],
               from_obj=member.join(group, group.c.id == member.c.group_id)
               ).where(member.c.table_id == metadata_collection.id)\
                .where(member.c.state == 'active') \
                .where(group.c.is_organization == False) \
                .where(group.c.type == 'infrastructure')
    result = execute(q, member, context)
    context['with_capacity'] = False
    result_dict['infrastructures'] = ckan_model_dictize.group_list_dictize(
        result, context, with_package_counts=False)

    return result_dict
Beispiel #5
0
def organization_list_without_memberships(context, data_dict):

    model = context['model']
    if data_dict.get('id'):
        user_obj = model.User.get(data_dict['id'])
        if not user_obj:
            raise NotFound
        user = user_obj.name
    else:
        user = context['user']

    logic.check_access('organization_list_without_memberships', context, data_dict)

    user_id = authz.get_user_id_for_username(user, allow_none=True)
    if not user_id:
        return []

    subquery = model.Session.query(model.Group.id)\
        .filter(model.Member.table_name == 'user')\
        .filter(model.Member.table_id == user_id)\
        .filter(model.Group.id == model.Member.group_id)\
        .filter(model.Member.state.in_(['active', 'pending'])) \
        .distinct(model.Group.id) \
        .filter(model.Group.is_organization == True)  # noqa

    groups = model.Session.query(model.Group) \
        .filter(model.Group.id.notin_(subquery)).all()

    return model_dictize.group_list_dictize(groups,
                                            context,
                                            with_package_counts=asbool(data_dict.get('include_dataset_count')))
Beispiel #6
0
def group_list_authz(context, data_dict):
    """Return the list of groups that the user is authorized to edit. Replaces
    the core authz method of the same name."""

    user = context["user"]
    model = context["model"]

    user_id = authz.get_user_id_for_username(user, allow_none=True)

    toolkit.check_access("group_list_authz", context, data_dict)

    if GroupAdmin.is_user_group_admin(model.Session, user_id):
        q = (
            model.Session.query(model.Group)
            .filter(model.Group.is_organization == False)
            .filter(model.Group.state == "active")
        )

        groups = q.all()

        group_list = model_dictize.group_list_dictize(groups, context)
        return group_list
    else:
        # defer to core method
        return core_group_list_authz(context, data_dict)
Beispiel #7
0
def group_list(context, data_dict):
    '''Returns a list of groups'''

    model = context['model']
    user = context['user']
    api = context.get('api_version') or '1'
    ref_group_by = 'id' if api == '2' else 'name';
    order_by = data_dict.get('order_by', 'name')
    if order_by not in set(('name', 'packages')):
        raise ValidationError('"order_by" value %r not implemented.' % order_by)
    all_fields = data_dict.get('all_fields',None)

    check_access('group_list',context, data_dict)

    query = model.Session.query(model.Group).join(model.GroupRevision)
    query = query.filter(model.GroupRevision.state=='active')
    query = query.filter(model.GroupRevision.current==True)

    if order_by == 'name':
        sort_by, reverse = 'name', False

    groups = query.all()

    if order_by == 'packages':
        sort_by, reverse = 'packages', True

    group_list = group_list_dictize(groups, context,
                                    lambda x:x[sort_by], reverse)

    if not all_fields:
        group_list = [group[ref_group_by] for group in group_list]

    return group_list
Beispiel #8
0
def group_list_authz(context, data_dict):
    try:
        check_access('member_create', context, data_dict)
    except:
        return []
    available_only = data_dict.get('available_only', False)
    glist = set([(g['id'], g['display_name'])
                 for g in ckan_action.get.group_list_authz(context, data_dict)
                 ])
    for t in ['topic', 'product', 'lad', 'accesslevel']:
        glist |= set([(g['id'], g['display_name'])
                      for g in group_list(context, {
                          'type': t,
                          'all_fields': True
                      })])

    if available_only:
        package = context.get('package')
        if package:
            glist -= set([(g['id'], g['display_name'])
                          for g in model_dictize.group_list_dictize(
                              package.get_groups(), context)])

    return [{
        'id': g[0],
        'display_name': g[1]
    } for g in sorted(list(glist), key=lambda g: g[1].lower())]
    def logged_in(self):
        # we need to set the language via a redirect
        lang = session.pop('lang', None)
        session.save()

        # we need to set the language explicitly here or the flash
        # messages will not be translated.
        i18n.set_lang(lang)

        if c.user:
            is_new = False
            is_sysadmin = new_authz.is_sysadmin(c.user)

            # Retrieve information about the current user
            context = {'model': model, 'session': model.Session,
                   'user': c.user or c.author,
                   'schema': schema.user_new_form_schema()}
            data_dict = {'id': c.user}

            user_dict = get_action('user_show')(context, data_dict)

            # This check is not needed (or correct) for sys admins
            if not is_sysadmin:

                # Get all organizations and all groups the user belongs to
                orgs_q = model.Session.query(model.Group) \
                    .filter(model.Group.is_organization == True) \
                    .filter(model.Group.state == 'active')
                q = model.Session.query(model.Member) \
                    .filter(model.Member.table_name == 'user') \
                    .filter(model.Member.table_id == user_dict['id'])

                group_ids = []
                for row in q.all():
                    group_ids.append(row.group_id)

                if not group_ids:
                    is_new = True
                else:
                    orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))

                    orgs_list = model_dictize.group_list_dictize(orgs_q.all(), context)

                    if len(orgs_list) == 0:
                        is_new = True

            h.flash_success(_("<p><strong>Note</strong></p>"
                "<p>%s is now logged in</p>") %
                user_dict['display_name'], allow_html=True)

            if is_new:
                return h.redirect_to(controller='ckanext.canada.controller:CanadaController',
                                         action='view_new_user', locale=lang)
            else:
                return h.redirect_to(controller='package',
                    action='search', locale=lang)
        else:
            h.flash_error(_('Login failed. Bad username or password.'))
            return h.redirect_to(controller='user',
                action='login', locale=lang)
Beispiel #10
0
def organization_list_without_memberships(context, data_dict):

    model = context['model']
    if data_dict.get('id'):
        user_obj = model.User.get(data_dict['id'])
        if not user_obj:
            raise NotFound
        user = user_obj.name
    else:
        user = context['user']

    logic.check_access('organization_list_without_memberships', context, data_dict)

    user_id = authz.get_user_id_for_username(user, allow_none=True)
    if not user_id:
        return []

    subquery = model.Session.query(model.Group.id)\
        .filter(model.Member.table_name == 'user')\
        .filter(model.Member.table_id == user_id)\
        .filter(model.Group.id == model.Member.group_id)\
        .filter(model.Member.state.in_(['active', 'pending'])) \
        .distinct(model.Group.id) \
        .filter(model.Group.is_organization == True)  # noqa

    groups = model.Session.query(model.Group) \
        .filter(model.Group.id.notin_(subquery)).all()

    return model_dictize.group_list_dictize(groups,
                                            context,
                                            with_package_counts=asbool(data_dict.get('include_dataset_count')))
Beispiel #11
0
def group_list(context, data_dict):
    '''Returns a list of groups'''

    model = context['model']
    user = context['user']
    api = context.get('api_version') or '1'
    ref_group_by = 'id' if api == '2' else 'name';
    order_by = data_dict.get('order_by', 'name')
    if order_by not in set(('name', 'packages')):
        raise ValidationError('"order_by" value %r not implemented.' % order_by)
    all_fields = data_dict.get('all_fields',None)
   
    check_access('group_list',context, data_dict)

    query = model.Session.query(model.Group).join(model.GroupRevision)
    query = query.filter(model.GroupRevision.state=='active')
    query = query.filter(model.GroupRevision.current==True)

    if order_by == 'name':
        query = query.order_by(model.Group.name.asc())
        query = query.order_by(model.Group.title.asc())

    groups = query.all()

    if order_by == 'packages':
        groups = sorted(query.all(),
                        key=lambda g: len(g.packages),
                        reverse=True)

    if not all_fields:
        group_list = [getattr(p, ref_group_by) for p in groups]
    else:
        group_list = group_list_dictize(groups,context)

    return group_list
Beispiel #12
0
    def test_group_list_dictize_sort_by_package_count(self):
        group1 = factories.Group()
        group2 = factories.Group()
        factories.Dataset(groups=[{
            "name": group1["name"]
        }, {
            "name": group2["name"]
        }])
        factories.Dataset(groups=[{"name": group2["name"]}])
        group_list = [
            model.Group.get(group2["name"]),
            model.Group.get(group1["name"])
        ]
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list,
            context,
            sort_key=lambda x: x["package_count"],
            with_package_counts=True,
        )

        # list is resorted by package counts
        assert group_dicts[0]["name"] == group1["name"]
        assert group_dicts[1]["name"] == group2["name"]
Beispiel #13
0
def group_list_authz(context, data_dict):
    '''Return the list of groups that the user is authorized to edit.
    :param available_only: remove the existing groups in the package
      (optional, default: ``False``)
    :type available_only: boolean
    :param am_member: if ``True`` return only the groups the logged-in user is
      a member of, otherwise return all groups that the user is authorized to
      edit (for example, sysadmin users are authorized to edit all groups)
      (optional, default: ``False``)
    :type am-member: boolean
    :returns: list of dictized groups that the user is authorized to edit
    :rtype: list of dicts
    '''
    model = context['model']
    user = context['user']
    available_only = data_dict.get('available_only', False)
    am_member = data_dict.get('am_member', False)
    group_type = data_dict.get('type', 'group')

    _check_access('group_list_authz', context, data_dict)

    sysadmin = authz.is_sysadmin(user)
    roles = authz.get_roles_with_permission('manage_group')
    if not roles:
        return []
    user_id = authz.get_user_id_for_username(user, allow_none=True)
    if not user_id:
        return []

    if not sysadmin or am_member:
        q = model.Session.query(model.Member) \
            .filter(model.Member.table_name == 'user') \
            .filter(model.Member.capacity.in_(roles)) \
            .filter(model.Member.table_id == user_id) \
            .filter(model.Member.state == 'active')
        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)

        if not group_ids:
            return []

    q = model.Session.query(model.Group) \
        .filter(model.Group.is_organization == False) \
        .filter(model.Group.state == 'active') \
        .filter(model.Group.type == group_type)

    if not sysadmin or am_member:
        q = q.filter(model.Group.id.in_(group_ids))

    groups = q.all()

    if available_only:
        package = context.get('package')
        if package:
            groups = set(groups) - set(package.get_groups())

    group_list = model_dictize.group_list_dictize(groups, context)
    return group_list
Beispiel #14
0
def organization_list_for_user(context, data_dict):
    perm = data_dict.get('permission')
    if perm in ['create_dataset', 'update_dataset', 'delete_dataset']:
        # Create a copy of the data dict, and change the request permission to
        # 'read' which will be granted to all members of a group.
        data_dict = dict(data_dict.items() + {'permission': 'read'}.items())

    #return fb(context, data_dict)
    #return core_org_list_for_user(context, data_dict)
    '''Return the list of organizations that the user is a member of.

    :param permission: the permission the user has against the returned organizations
      (optional, default: ``edit_group``)
    :type permission: string

    :returns: list of dictized organizations that the user is authorized to edit
    :rtype: list of dicts

    '''
    model = context['model']
    user = context['user']

    _check_access('organization_list_for_user', context, data_dict)
    sysadmin = new_authz.is_sysadmin(user)

    orgs_q = model.Session.query(model.Group) \
        .filter(model.Group.is_organization == True) \
        .filter(model.Group.state == 'active')

    if not sysadmin:
        # for non-Sysadmins check they have the required permission

        permission = data_dict.get('permission', 'edit_group')

        roles = ckan.new_authz.get_roles_with_permission(permission)

        if not roles:
            return []
        user_id = new_authz.get_user_id_for_username(user, allow_none=True)
        if not user_id:
            return []

        q = model.Session.query(model.Member) \
            .filter(model.Member.table_name == 'user') \
            .filter(model.Member.capacity.in_(roles)) \
            .filter(model.Member.table_id == user_id)

        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)

        if not group_ids:
            return []

        orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))

    orgs_list = model_dictize.group_list_dictize(orgs_q.all(), context)
    return orgs_list
    def test_group_list_dictize_including_extras(self):
        factories.Group(extras=[{'key': 'k1', 'value': 'v1'}])
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context,
                                                       include_extras=True)

        assert_equal(group_dicts[0]['extras'][0]['key'], 'k1')
    def test_group_list_dictize_including_extras(self):
        factories.Group(extras=[{'key': 'k1', 'value': 'v1'}])
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context,
                                                       include_extras=True)

        assert_equal(group_dicts[0]['extras'][0]['key'], 'k1')
Beispiel #17
0
def organization_list(context, data_dict):
    """ Modified from ckan.logic.action.get._group_or_org_list.
        Sort by title instead of name and lower case ordering.
    """

    model = context['model']
    api = context.get('api_version')
    groups = data_dict.get('groups')
    ref_group_by = 'id' if api == 2 else 'name'

    sort = data_dict.get('sort', 'title')
    q = data_dict.get('q')

    # order_by deprecated in ckan 1.8
    # if it is supplied and sort isn't use order_by and raise a warning
    order_by = data_dict.get('order_by', '')
    if order_by:
        log.warn('`order_by` deprecated please use `sort`')
        if not data_dict.get('sort'):
            sort = order_by
    # if the sort is packages and no sort direction is supplied we want to do a
    # reverse sort to maintain compatibility.
    if sort.strip() == 'packages':
        sort = 'packages desc'

    sort_info = ckan.logic.action.get._unpick_search(sort,
                                                     allowed_fields=['name', 'packages', 'title'],
                                                     total=1)

    all_fields = data_dict.get('all_fields', None)


    query = model.Session.query(model.Group).join(model.GroupRevision)
    query = query.filter(model.GroupRevision.state=='active')
    query = query.filter(model.GroupRevision.current==True)
    if groups:
        query = query.filter(model.GroupRevision.name.in_(groups))
    if q:
        q = u'%{0}%'.format(q)
        query = query.filter(_or_(
            model.GroupRevision.name.ilike(q),
            model.GroupRevision.title.ilike(q),
            model.GroupRevision.description.ilike(q),
        ))


    query = query.filter(model.GroupRevision.is_organization==True)

    groups = query.all()
    group_list = model_dictize.group_list_dictize(groups, context,
                                                  lambda x:x[sort_info[0][0]].lower(),
                                                  sort_info[0][1] == 'desc')

    if not all_fields:
        group_list = [group[ref_group_by] for group in group_list]

    return group_list
Beispiel #18
0
    def test_group_list_dictize_including_extras(self):
        group = factories.Group.model(extras=[{"key": "k1", "value": "v1"}])
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(
            [group], context, include_extras=True
        )

        assert group_dicts[0]["extras"][0]["key"] == "k1"
Beispiel #19
0
def organization_list_for_user(context, data_dict):
    '''Return the organizations that the user has a given permission for.
    By default this returns the list of organizations that the currently
    authorized user can edit, i.e. the list of organizations that the user is an
    admin of.
    Specifically it returns the list of organizations that the currently
    authorized user has a given permission (for example: "edit_group") against.
    When a user becomes a member of an organization in CKAN they're given a
    "capacity" (sometimes called a "role"), for example "member", "editor" or
    "admin".
    Each of these roles has certain permissions associated with it. For example
    the admin role has the "admin" permission (which means they have permission
    to do anything). The editor role has permissions like "create_dataset",
    "update_dataset" and "delete_dataset". The member role has the "read"
    permission.
    This function returns the list of organizations that the authorized user has
    a given permission for. For example the list of organizations that the user
    is an admin of, or the list of organizations that the user can create
    datasets in.
    :param permission: the permission the user has against the
    returned organizations, for example ``"read"`` or ``"create_dataset"``
    (optional, default: ``"edit_group"``)
    :type permission: string
    :returns: list of organizations that the user has the given permission for
    :rtype: list of dicts
    '''
    model = context['model']
    user = context['user']
    logic.check_access('organization_list_for_user', context, data_dict)
    sysadmin = new_authz.is_sysadmin(user)
    orgs_q = model.Session.query(model.Group) \
    .filter(model.Group.is_organization == True) \
    .filter(model.Group.state == 'active')
    user_roles = user_custom_roles(context, data_dict)
    if not sysadmin and not Roles.MOD_R_DATA in user_roles:
        # for non-Sysadmins check they have the required permission
        permission = data_dict.get('permission', 'edit_group')
        roles = new_authz.get_roles_with_permission(permission)
        if not roles:
            return []
        user_id = new_authz.get_user_id_for_username(user, allow_none=True)
        if not user_id:
            return []
        q = model.Session.query(model.Member) \
        .filter(model.Member.table_name == 'user') \
        .filter(model.Member.capacity.in_(roles)) \
        .filter(model.Member.table_id == user_id) \
        .filter(model.Member.state == 'active')
        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)
        if not group_ids:
            return []
        orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))
    orgs_list = model_dictize.group_list_dictize(orgs_q.all(), context)
    return orgs_list
Beispiel #20
0
def organization_list_for_user(context, data_dict):
    '''Return the organizations that the user has a given permission for.
    By default this returns the list of organizations that the currently
    authorized user can edit, i.e. the list of organizations that the user is an
    admin of.
    Specifically it returns the list of organizations that the currently
    authorized user has a given permission (for example: "edit_group") against.
    When a user becomes a member of an organization in CKAN they're given a
    "capacity" (sometimes called a "role"), for example "member", "editor" or
    "admin".
    Each of these roles has certain permissions associated with it. For example
    the admin role has the "admin" permission (which means they have permission
    to do anything). The editor role has permissions like "create_dataset",
    "update_dataset" and "delete_dataset". The member role has the "read"
    permission.
    This function returns the list of organizations that the authorized user has
    a given permission for. For example the list of organizations that the user
    is an admin of, or the list of organizations that the user can create
    datasets in.
    :param permission: the permission the user has against the
    returned organizations, for example ``"read"`` or ``"create_dataset"``
    (optional, default: ``"edit_group"``)
    :type permission: string
    :returns: list of organizations that the user has the given permission for
    :rtype: list of dicts
    '''
    model = context['model']
    user = context['user']
    logic.check_access('organization_list_for_user', context, data_dict)
    sysadmin = new_authz.is_sysadmin(user)
    orgs_q = model.Session.query(model.Group) \
    .filter(model.Group.is_organization == True) \
    .filter(model.Group.state == 'active')
    user_roles = user_custom_roles(context, data_dict)
    if not sysadmin and not 'datovy-kurator' in user_roles:
        # for non-Sysadmins check they have the required permission
        permission = data_dict.get('permission', 'edit_group')
        roles = new_authz.get_roles_with_permission(permission)
        if not roles:
            return []
        user_id = new_authz.get_user_id_for_username(user, allow_none=True)
        if not user_id:
            return []
        q = model.Session.query(model.Member) \
        .filter(model.Member.table_name == 'user') \
        .filter(model.Member.capacity.in_(roles)) \
        .filter(model.Member.table_id == user_id) \
        .filter(model.Member.state == 'active')
        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)
        if not group_ids:
            return []
        orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))
    orgs_list = model_dictize.group_list_dictize(orgs_q.all(), context)
    return orgs_list
Beispiel #21
0
    def test_group_list_dictize_without_package_count(self):
        group_ = factories.Group()
        factories.Dataset(groups=[{'name': group_['name']}])
        group_list = [model.Group.get(group_['name'])]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list, context, with_package_counts=False)

        assert 'packages' not in group_dicts[0]
Beispiel #22
0
    def test_group_list_dictize_without_package_count(self):
        group_ = factories.Group()
        factories.Dataset(groups=[{"name": group_["name"]}])
        group_list = [model.Group.get(group_["name"])]
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list, context, with_package_counts=False)

        assert "packages" not in group_dicts[0]
    def test_group_list_dictize_without_package_count(self):
        group_ = factories.Group()
        factories.Dataset(groups=[{'name': group_['name']}])
        group_list = [model.Group.get(group_['name'])]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list, context, with_package_counts=False)

        assert 'packages' not in group_dicts[0]
Beispiel #24
0
    def test_group_list_dictize_including_extras(self):
        factories.Group(extras=[{"key": "k1", "value": "v1"}])
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list,
                                                       context,
                                                       include_extras=True)

        assert group_dicts[0]["extras"][0]["key"] == "k1"
Beispiel #25
0
def dge_dataset_form_organization_list():
    """
    Get a list of all active organizations
    """
    context = {'model': model}
    orgs_q = model.Session.query(model.Group) \
        .filter(model.Group.is_organization == True) \
        .filter(model.Group.state == 'active')

    orgs_list = model_dictize.group_list_dictize(orgs_q.all(), context)
    return orgs_list
Beispiel #26
0
    def test_group_list_dictize_sorted(self):
        factories.Group(name='aa')
        factories.Group(name='bb')
        group_list = [model.Group.get(u'bb'), model.Group.get(u'aa')]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        # list is resorted by name
        assert_equal(group_dicts[0]['name'], 'aa')
        assert_equal(group_dicts[1]['name'], 'bb')
Beispiel #27
0
    def test_group_list_dictize_sorted(self):
        factories.Group(name="aa")
        factories.Group(name="bb")
        group_list = [model.Group.get(u"bb"), model.Group.get(u"aa")]
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        # list is resorted by name
        assert group_dicts[0]["name"] == "aa"
        assert group_dicts[1]["name"] == "bb"
    def test_group_list_dictize_reverse_sorted(self):
        factories.Group(name='aa')
        factories.Group(name='bb')
        group_list = [model.Group.get(u'aa'),
                      model.Group.get(u'bb')]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context,
                                                       reverse=True)

        assert_equal(group_dicts[0]['name'], 'bb')
        assert_equal(group_dicts[1]['name'], 'aa')
Beispiel #29
0
    def test_group_list_dictize(self):
        group = factories.Group.model()
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize([group], context)

        assert len(group_dicts) == 1
        assert group_dicts[0]["name"] == group.name
        assert group_dicts[0]["package_count"] == 0
        assert "extras" not in group_dicts[0]
        assert "tags" not in group_dicts[0]
        assert "groups" not in group_dicts[0]
Beispiel #30
0
    def test_group_list_dictize(self):
        group = factories.Group()
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        assert len(group_dicts) == 1
        assert group_dicts[0]["name"] == group["name"]
        assert group_dicts[0]["package_count"] == 0
        assert "extras" not in group_dicts[0]
        assert "tags" not in group_dicts[0]
        assert "groups" not in group_dicts[0]
    def test_group_list_dictize_including_groups(self):
        factories.Group(name='parent')
        factories.Group(name='child', groups=[{'name': 'parent'}])
        group_list = [model.Group.get(u'parent'), model.Group.get(u'child')]
        context = {'model': model, 'session': model.Session}

        child_dict, parent_dict = model_dictize.group_list_dictize(
            group_list, context, include_groups=True)

        assert_equal(parent_dict['name'], 'parent')
        assert_equal(child_dict['name'], 'child')
        assert_equal(parent_dict['groups'], [])
        assert_equal(child_dict['groups'][0]['name'], 'parent')
    def test_group_list_dictize(self):
        group = factories.Group()
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        assert_equal(len(group_dicts), 1)
        assert_equal(group_dicts[0]['name'], group['name'])
        assert_equal(group_dicts[0]['packages'], 0)
        assert 'extras' not in group_dicts[0]
        assert 'tags' not in group_dicts[0]
        assert 'groups' not in group_dicts[0]
Beispiel #33
0
    def test_group_list_dictize_sorted(self):
        # we need to set the title because group_list_dictze by default sorts
        # them per display_name
        group1 = factories.Group(title="aa")
        group2 = factories.Group(title="bb")
        group_list = [model.Group.get(group2["name"]), model.Group.get(group1["name"])]
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        # list is resorted by name
        assert group_dicts[0]["name"] == group1["name"]
        assert group_dicts[1]["name"] == group2["name"]
Beispiel #34
0
    def test_group_list_dictize_including_tags(self):
        group = factories.Group.model()
        tag = factories.Tag.model()
        member = model.Member(group=group, table_id=tag.id, table_name="tag")
        model.Session.add(member)
        model.Session.commit()
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize([group],
                                                       context,
                                                       include_tags=True)

        assert group_dicts[0]["tags"][0]["name"] == tag.name
Beispiel #35
0
    def test_group_list_dictize_including_groups(self):
        factories.Group(name="parent")
        factories.Group(name="child", groups=[{"name": "parent"}])
        group_list = [model.Group.get(u"parent"), model.Group.get(u"child")]
        context = {"model": model, "session": model.Session}

        child_dict, parent_dict = model_dictize.group_list_dictize(
            group_list, context, include_groups=True)

        assert parent_dict["name"] == "parent"
        assert child_dict["name"] == "child"
        assert parent_dict["groups"] == []
        assert child_dict["groups"][0]["name"] == "parent"
Beispiel #36
0
    def test_group_list_dictize_including_groups(self):
        factories.Group(name='parent')
        factories.Group(name='child', groups=[{'name': 'parent'}])
        group_list = [model.Group.get(u'parent'), model.Group.get(u'child')]
        context = {'model': model, 'session': model.Session}

        child_dict, parent_dict = model_dictize.group_list_dictize(
            group_list, context, include_groups=True)

        assert_equal(parent_dict['name'], 'parent')
        assert_equal(child_dict['name'], 'child')
        assert_equal(parent_dict['groups'], [])
        assert_equal(child_dict['groups'][0]['name'], 'parent')
Beispiel #37
0
    def test_group_list_dictize(self):
        group = factories.Group()
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context)

        assert_equal(len(group_dicts), 1)
        assert_equal(group_dicts[0]['name'], group['name'])
        assert_equal(group_dicts[0]['packages'], 0)
        assert 'extras' not in group_dicts[0]
        assert 'tags' not in group_dicts[0]
        assert 'groups' not in group_dicts[0]
Beispiel #38
0
    def test_group_list_dictize_including_groups(self):
        parent = factories.Group(title="Parent")
        child = factories.Group(title="Child", groups=[{"name": parent["name"]}])
        group_list = [model.Group.get(parent["name"]), model.Group.get(child["name"])]
        context = {"model": model, "session": model.Session}

        child_dict, parent_dict = model_dictize.group_list_dictize(
            group_list, context, sort_key=operator.itemgetter("title"),
            include_groups=True
        )

        assert parent_dict["name"] == parent["name"]
        assert child_dict["name"] == child["name"]
        assert parent_dict["groups"] == []
        assert child_dict["groups"][0]["name"] == parent["name"]
    def test_group_list_dictize_sort_by_package_count(self):
        factories.Group(name='aa')
        factories.Group(name='bb')
        factories.Dataset(groups=[{'name': 'aa'}, {'name': 'bb'}])
        factories.Dataset(groups=[{'name': 'bb'}])
        group_list = [model.Group.get(u'bb'),
                      model.Group.get(u'aa')]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list, context, sort_key=lambda x: x['package_count'],
            with_package_counts=True)

        # list is resorted by package counts
        assert_equal(group_dicts[0]['name'], 'aa')
        assert_equal(group_dicts[1]['name'], 'bb')
    def test_group_list_dictize_sort_by_package_count(self):
        factories.Group(name='aa')
        factories.Group(name='bb')
        factories.Dataset(groups=[{'name': 'aa'}, {'name': 'bb'}])
        factories.Dataset(groups=[{'name': 'bb'}])
        group_list = [model.Group.get(u'bb'),
                      model.Group.get(u'aa')]
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list, context, sort_key=lambda x: x['package_count'],
            with_package_counts=True)

        # list is resorted by package counts
        assert_equal(group_dicts[0]['name'], 'aa')
        assert_equal(group_dicts[1]['name'], 'bb')
Beispiel #41
0
		def organization_list_for_user(ctx, data_dict=None):
			user = model.User.get(ctx['user'])
			if user is None:
				return []
			
			#	We have too
			logic.check_access('organization_list_for_user', ctx, data_dict)
			
			rel = db.UserOrgRelation.get(user.id)
			if rel is None:
				#	Not a student, revert
				return logic.action.get.organization_list_for_user(ctx, data_dict)
			
			org_list = [model.Group.get(rel.org_id)]
			pkg_count_flag = tk.asbool(data_dict.get('include_dataset_count', 'false'))
			return model_dictize.group_list_dictize(org_list, ctx, with_package_counts=pkg_count_flag)
Beispiel #42
0
def get_package_groups(package_id):
    context = {
        'model': model,
        'session': model.Session,
        'for_view': True,
        'use_cache': False
    }

    data_dict = {'all_fields': True, 'include_extras': True}

    groups = get_action('group_list')(context, data_dict)
    group_list = []

    try:
        pkg_obj = Package.get(package_id)
        pkg_group_ids = set(group['id'] for group in group_list_dictize(
            pkg_obj.get_groups('group', None), context))

        group_list = [
            group for group in groups if group['id'] in pkg_group_ids
        ]

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

            data_dict = {'id': package_id}
            users_groups = get_action('group_list_authz')(context, data_dict)

            user_group_ids = set(group['id'] for group in users_groups)

            for group in group_list:
                group['user_member'] = (group['id'] in user_group_ids)

    except (NotFound):
        abort(404, _('Dataset not found'))

    return group_list
Beispiel #43
0
    def test_group_list_dictize_sort_by_package_count(self):
        factories.Group(name="aa")
        factories.Group(name="bb")
        factories.Dataset(groups=[{"name": "aa"}, {"name": "bb"}])
        factories.Dataset(groups=[{"name": "bb"}])
        group_list = [model.Group.get(u"bb"), model.Group.get(u"aa")]
        context = {"model": model, "session": model.Session}

        group_dicts = model_dictize.group_list_dictize(
            group_list,
            context,
            sort_key=lambda x: x["package_count"],
            with_package_counts=True,
        )

        # list is resorted by package counts
        assert group_dicts[0]["name"] == "aa"
        assert group_dicts[1]["name"] == "bb"
Beispiel #44
0
    def _service_organizations(self):
        ''' modified from organization_list_for_user '''
        context = {'user': c.user}
        data_dict = {'permission': 'create_dataset'}
        user = context['user']

        toolkit.check_access('organization_list_for_user', context, data_dict)
        sysadmin = new_authz.is_sysadmin(user)

        orgs_q = model.Session.query(model.Group) \
            .filter(model.Group.is_organization == True) \
            .filter(model.Group.state == 'active')  # noqa

        if not sysadmin:
            # for non-Sysadmins check they have the required permission

            permission = data_dict.get('permission', 'edit_group')

            roles = new_authz.get_roles_with_permission(permission)

            if not roles:
                return []
            user_id = new_authz.get_user_id_for_username(user, allow_none=True)
            if not user_id:
                return []

            q = model.Session.query(model.Member) \
                .filter(model.Member.table_name == 'user') \
                .filter(model.Member.capacity.in_(roles)) \
                .filter(model.Member.table_id == user_id) \
                .filter(model.Member.state == 'active')

            group_ids = []
            for row in q.all():
                group_ids.append(row.group_id)

            if not group_ids:
                return []

            orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))
            orgs_q = orgs_q.join(model.GroupExtra).filter(model.GroupExtra.key == u'public_adminstration_organization') \
                .filter(model.GroupExtra.value == u'true')  # YTP modification

        return model_dictize.group_list_dictize(orgs_q.all(), context)
Beispiel #45
0
    def _service_organizations(self):
        ''' modified from organization_list_for_user '''
        context = {'user': c.user}
        data_dict = {'permission': 'create_dataset'}
        user = context['user']

        toolkit.check_access('organization_list_for_user', context, data_dict)
        sysadmin = authz.is_sysadmin(user)

        orgs_q = model.Session.query(model.Group) \
            .filter(model.Group.is_organization == True) \
            .filter(model.Group.state == 'active')  # noqa

        if not sysadmin:
            # for non-Sysadmins check they have the required permission

            permission = data_dict.get('permission', 'edit_group')

            roles = authz.get_roles_with_permission(permission)

            if not roles:
                return []
            user_id = authz.get_user_id_for_username(user, allow_none=True)
            if not user_id:
                return []

            q = model.Session.query(model.Member) \
                .filter(model.Member.table_name == 'user') \
                .filter(model.Member.capacity.in_(roles)) \
                .filter(model.Member.table_id == user_id) \
                .filter(model.Member.state == 'active')

            group_ids = []
            for row in q.all():
                group_ids.append(row.group_id)

            if not group_ids:
                return []

            orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))
            orgs_q = orgs_q.join(model.GroupExtra).filter(model.GroupExtra.key == u'public_adminstration_organization') \
                .filter(model.GroupExtra.value == u'true')  # YTP modification

        return model_dictize.group_list_dictize(orgs_q.all(), context)
    def test_group_list_dictize_including_tags(self):
        factories.Group()
        # group tags aren't in the group_create schema, so its slightly more
        # convoluted way to create them
        group_obj = model.Session.query(model.Group).first()
        tag = model.Tag(name='t1')
        model.Session.add(tag)
        model.Session.commit()
        tag = model.Session.query(model.Tag).first()
        group_obj = model.Session.query(model.Group).first()
        member = model.Member(group=group_obj, table_id=tag.id,
                              table_name='tag')
        model.Session.add(member)
        model.repo.new_revision()
        model.Session.commit()
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context,
                                                       include_tags=True)

        assert_equal(group_dicts[0]['tags'][0]['name'], 't1')
    def test_group_list_dictize_including_tags(self):
        factories.Group()
        # group tags aren't in the group_create schema, so its slightly more
        # convoluted way to create them
        group_obj = model.Session.query(model.Group).first()
        tag = model.Tag(name='t1')
        model.Session.add(tag)
        model.Session.commit()
        tag = model.Session.query(model.Tag).first()
        group_obj = model.Session.query(model.Group).first()
        member = model.Member(group=group_obj, table_id=tag.id,
                              table_name='tag')
        model.Session.add(member)
        model.repo.new_revision()
        model.Session.commit()
        group_list = model.Session.query(model.Group).filter_by().all()
        context = {'model': model, 'session': model.Session}

        group_dicts = model_dictize.group_list_dictize(group_list, context,
                                                       include_tags=True)

        assert_equal(group_dicts[0]['tags'][0]['name'], 't1')
Beispiel #48
0
def showings_list_admin(context, data_dict):
    '''
    Return a list of showings groups for which the authorized user is admin.

    This is like login.action.get.group_list_authz, but without being tied up
    with 'organizations' conditionals.
    '''
    model = context['model']
    user = context['user']

    toolkit.check_access('group_list_authz', context, data_dict)

    if new_authz.auth_is_loggedin_user():
        user_id = new_authz.get_user_id_for_username(user.get('name'), allow_none=True)
    else:
        return []

    if user_id is None:
        return []

    q = model.Session.query(model.Member) \
        .filter(model.Member.table_name == 'user') \
        .filter(model.Member.capacity == 'admin') \
        .filter(model.Member.table_id == user_id)
    group_ids = [row.group_id for row in q.all()]

    if not group_ids:
        return []

    q = model.Session.query(model.Group) \
        .filter(model.Group.type == 'showing') \
        .filter(model.Group.state == 'active')

    groups = q.filter(model.Group.id.in_(group_ids)).all()

    group_list = model_dictize.group_list_dictize(groups, context)
    return group_list
Beispiel #49
0
def organization_list_for_user(context, data_dict):
    '''Return the list of organizations that the user is a member of.

    :param permission: the permission the user has against the returned organizations
      (optional, default: ``edit_group``)
    :type permission: string

    :returns: list of dictized organizations that the user is authorized to edit
    :rtype: list of dicts

    '''
    model = context['model']
    user = context['user']

    _check_access('organization_list_for_user',context, data_dict)
    sysadmin = new_authz.is_sysadmin(user)

    orgs_q = model.Session.query(model.Group) \
        .filter(model.Group.is_organization == True) \
        .filter(model.Group.state == 'active')

    if not sysadmin:
        # for non-Sysadmins check they have the required permission

        permission = data_dict.get('permission', 'edit_group')

        roles = ckan.new_authz.get_roles_with_permission(permission)

        if not roles:
            return []
        user_id = new_authz.get_user_id_for_username(user, allow_none=True)
        if not user_id:
            return []

        q = model.Session.query(model.Member) \
            .filter(model.Member.table_name == 'user') \
            .filter(model.Member.capacity.in_(roles)) \
            .filter(model.Member.table_id == user_id) \
            .filter(model.Member.state == 'active')

        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)

        if not group_ids:
            return []

        orgs_q = orgs_q.filter(model.Group.id.in_(group_ids))

    orgs_list_complete = orgs_q.all()
    orgs_list = model_dictize.group_list_dictize(orgs_list_complete, context)
    
#to be used in case we want to display the created field
#    org_list_map ={}
#    for it in orgs_list_complete:
#        org_list_map[it.id]=it
#    for it in orgs_list:
#        id=it['id']
#        org = org_list_map[id]
#        it['created']=org.created.isoformat()
    return orgs_list
def group_list_authz(context, data_dict):
    ''' Return the list of groups that the user is authorized to edit.
    
    Action "group_list_authz" ovewrites core "group_list_authz" action.
    It does so in order to allow users, other than the sysadmin, add/delete 
    members to/from a thematic group. The only precondition to that right,
    is the user having at least editor rights for at least one organization.

    :param available_only: remove the existing groups in the package
      (optional, default: ``False``)
    :type available_only: boolean

    :param am_member: if True return only the groups the logged-in user is a
      member of, otherwise return all groups that the user is authorized to
      edit (for example, sysadmin users are authorized to edit all groups)
      (optional, default: False)
    :type am-member: boolean

    :returns: list of dictized groups that the user is authorized to edit
    :rtype: list of dicts

    '''
    model = context['model']
    user = context['user']
    available_only = data_dict.get('available_only', False)
    am_member = data_dict.get('am_member', False)
    
    
    _check_access('group_list_authz',context, data_dict)
    
    sysadmin = new_authz.is_sysadmin(user)
    
    roles = new_authz.get_roles_with_permission('update_dataset')
    if not roles:
        return []
    user_id = new_authz.get_user_id_for_username(user, allow_none=True)
    if not user_id:
        return []
    
    if not sysadmin or am_member:
        q = model.Session.query(model.Member) \
            .filter(model.Member.table_name == 'user') \
            .filter(model.Member.capacity.in_(roles)) \
            .filter(model.Member.table_id == user_id)
        group_ids = []
        for row in q.all():
            group_ids.append(row.group_id)

        if not group_ids:
            return []
        
        if context.get('package'):
            package_org = context.get('package').owner_org
            if package_org not in group_ids:
                return []
        
    q = model.Session.query(model.Group) \
        .filter(model.Group.is_organization == False) \
        .filter(model.Group.state == 'active')

    groups = q.all()

    if available_only:
        package = context.get('package')
        if package:
            groups = set(groups) - set(package.get_groups())

    group_list = model_dictize.group_list_dictize(groups, context)
    return group_list
Beispiel #51
0
def topics_list_for_user(context, data_dict):
    '''Return the all types of groups that the user has a given permission for.

    By default this returns the list of all types of groups that the currently
    authorized user can edit, i.e. the list of all types of groups that the user is an
    admin of.

    Specifically it returns the list of all types of groups that the currently
    authorized user has a given permission (for example: "manage_group") against.

    When a user becomes a member of a group in CKAN they're given a
    "capacity" (sometimes called a "role"), for example "member", "editor" or
    "admin".

    Each of these roles has certain permissions associated with it. For example
    the admin role has the "admin" permission (which means they have permission
    to do anything). The editor role has permissions like "create_dataset",
    "update_dataset" and "delete_dataset".  The member role has the "read"
    permission.

    This function returns the list of all types of groups that the authorized user
    has a given permission for. For example the list of all types of groups that the
    user is an admin of, or the list of all types of groups that the user can create
    datasets in. This takes account of when permissions cascade down an
    all types of groups hierarchy.

    :param permission: the permission the user has against the
        returned organizations, for example ``"read"`` or ``"create_dataset"``
        (optional, default: ``"edit_group"``)
    :type permission: string

    :returns: list of all types of groups that the user has the given permission for
    :rtype: list of dicts

    '''
    model = context['model']
    user = context['user']

    _check_access('organization_list_for_user', context, data_dict)
    sysadmin = authz.is_sysadmin(user)

    topics_q = model.Session.query(model.Group) \
        .filter(model.Group.type == "topics") \
        .filter(model.Group.state == 'active')
    """
    if not sysadmin:
        # for non-Sysadmins check they have the required permission

        # NB 'edit_group' doesn't exist so by default this action returns just
        # orgs with admin role
        permission = data_dict.get('permission', 'edit_group')

        roles = authz.get_roles_with_permission(permission)

        if not roles:
            return []
        user_id = authz.get_user_id_for_username(user, allow_none=True)
        if not user_id:
            return []

        q = model.Session.query(model.Member, model.Group) \
            .filter(model.Member.table_name == 'user') \
            .filter(model.Member.capacity.in_(roles)) \
            .filter(model.Member.table_id == user_id) \
            .filter(model.Member.state == 'active') \
            .join(model.Group)

        group_ids = set()
        roles_that_cascade = \
            authz.check_config_permission('roles_that_cascade_to_sub_groups')
        for member, group in q.all():
            if member.capacity in roles_that_cascade:
                group_ids |= set([
                    grp_tuple[0] for grp_tuple
                    in group.get_children_group_hierarchy(type='topics')
                    ])
            group_ids.add(group.id)

        if not group_ids:
            return []

        topics_q = topics_q.filter(model.Group.id.in_(group_ids))
    """
    orgs_list = model_dictize.group_list_dictize(topics_q.all(), context)
    for o in orgs_list:
        o['title'] = o['title'].decode('utf_8')
    return orgs_list
Beispiel #52
0
    def organization_list_related(self, ver=None):
        '''
        Returns the list of organizations including parent_of and child_of relationships.
        '''
        # FIXME: use IActions plugin instead
        from ckan.lib.search import SearchError

        help_str =  "Return a list of the names of the site's organizations.\n\n" + \
                    ":param order_by: the field to sort the list by, must be ``'name'`` or \n" + \
                    " ``'packages'`` (optional, default: ``'name'``) Deprecated use sort. \n" + \
                    ":type order_by: string \n" + \
                    ":param sort: sorting of the search results.  Optional.  Default:\n" + \
                    "'name asc' string of field name and sort-order. The allowed fields are \n" + \
                    "'name' and 'packages' \n" + \
                    ":type sort: string \n" + \
                    ":param organizations: a list of names of the groups to return, if given only \n" + \
                    "groups whose names are in this list will be returned (optional) \n" + \
                    ":type organizations: list of strings \n" + \
                    ":param all_fields: return full group dictionaries instead of  just names \n" + \
                    "(optional, default: ``False``) \n" + \
                    ":type all_fields: boolean \n" + \
                    ":rtype: list of strings \n"

        return_dict = {"help": help_str}

        data_dict = self._get_request_data(try_url_params=True)
        all_fields = data_dict.get('all_fields', False)
        order_by = data_dict.get('order_by', 'name')
        sort = data_dict.get('sort', 'name asc')
        organizations = data_dict.get('organizations', [])



        context = {'model': model, 'session': model.Session, 'user': c.user,
                   'api_version': ver, 'auth_user_obj': c.userobj}

        org_list = get_action('organization_list')(context, data_dict)

        if (all_fields):

            #add the child orgs to the response:
            for org in org_list:
                children = []
                branches = get_organization_branches(org['id'])
                group_list = model_dictize.group_list_dictize(branches, context)
                for branch in group_list:
                    d = {}
                    d['title'] = branch['title']
                    children.append(d)

                org['parent_of'] = children

                parents = []
                branches = get_parent_orgs(org['id'])
                group_list = model_dictize.group_list_dictize(branches, context)
                for branch in group_list:
                    d = {}
                    d['title'] = branch['title']
                    parents.append(d)
                org['child_of'] = parents

        return_dict['success'] = True
        return_dict['result'] = org_list
        return self._finish_ok(return_dict)
def package_dictize_with_revisions(pkg, context):
    '''
    Given a Package object, returns an equivalent dictionary.

    Normally this is the most recent version, but you can provide revision_id
    or revision_date in the context and it will filter to an earlier time.

    May raise NotFound if:
    * the specified revision_id doesn't exist
    * the specified revision_date was before the package was created
    '''
    model = context['model']
    is_latest_revision = not(context.get(u'revision_id') or
                             context.get(u'revision_date'))
    execute = _execute if is_latest_revision else _execute_with_revision
    # package
    if is_latest_revision:
        if isinstance(pkg, revision_model.PackageRevision):
            pkg = model.Package.get(pkg.id)
        result = pkg
    else:
        package_rev = revision_model.package_revision_table
        q = select([package_rev]).where(package_rev.c.id == pkg.id)
        result = execute(q, package_rev, context).first()
    if not result:
        raise logic.NotFound
    result_dict = d.table_dictize(result, context)
    # strip whitespace from title
    if result_dict.get(u'title'):
        result_dict['title'] = result_dict['title'].strip()

    # resources
    if is_latest_revision:
        res = model.resource_table
    else:
        res = revision_model.resource_revision_table
    q = select([res]).where(res.c.package_id == pkg.id)
    result = execute(q, res, context)
    result_dict["resources"] = resource_list_dictize(result, context)
    result_dict['num_resources'] = len(result_dict.get(u'resources', []))

    # tags
    tag = model.tag_table
    if is_latest_revision:
        pkg_tag = model.package_tag_table
    else:
        pkg_tag = revision_model.package_tag_revision_table
    q = select([tag, pkg_tag.c.state],
               from_obj=pkg_tag.join(tag, tag.c.id == pkg_tag.c.tag_id)
               ).where(pkg_tag.c.package_id == pkg.id)
    result = execute(q, pkg_tag, context)
    result_dict["tags"] = d.obj_list_dictize(result, context,
                                             lambda x: x["name"])
    result_dict['num_tags'] = len(result_dict.get(u'tags', []))

    # Add display_names to tags. At first a tag's display_name is just the
    # same as its name, but the display_name might get changed later (e.g.
    # translated into another language by the multilingual extension).
    for tag in result_dict['tags']:
        assert u'display_name' not in tag
        tag['display_name'] = tag['name']

    # extras
    if is_latest_revision:
        extra = model.package_extra_table
    else:
        extra = revision_model.extra_revision_table
    q = select([extra]).where(extra.c.package_id == pkg.id)
    result = execute(q, extra, context)
    result_dict["extras"] = extras_list_dictize(result, context)

    # groups
    if is_latest_revision:
        member = model.member_table
    else:
        member = revision_model.member_revision_table
    group = model.group_table
    q = select([group, member.c.capacity],
               from_obj=member.join(group, group.c.id == member.c.group_id)
               ).where(member.c.table_id == pkg.id)\
                .where(member.c.state == u'active') \
                .where(group.c.is_organization == False)  # noqa
    result = execute(q, member, context)
    context['with_capacity'] = False
    # no package counts as cannot fetch from search index at the same
    # time as indexing to it.
    # tags, extras and sub-groups are not included for speed
    result_dict["groups"] = group_list_dictize(result, context,
                                               with_package_counts=False)

    # owning organization
    if is_latest_revision:
        group = model.group_table
    else:
        group = revision_model.group_revision_table
    q = select([group]
               ).where(group.c.id == result_dict['owner_org']) \
                .where(group.c.state == u'active')
    result = execute(q, group, context)
    organizations = d.obj_list_dictize(result, context)
    if organizations:
        result_dict["organization"] = organizations[0]
    else:
        result_dict["organization"] = None

    # relations
    if is_latest_revision:
        rel = model.package_relationship_table
    else:
        rel = revision_model \
            .package_relationship_revision_table
    q = select([rel]).where(rel.c.subject_package_id == pkg.id)
    result = execute(q, rel, context)
    result_dict["relationships_as_subject"] = \
        d.obj_list_dictize(result, context)
    q = select([rel]).where(rel.c.object_package_id == pkg.id)
    result = execute(q, rel, context)
    result_dict["relationships_as_object"] = \
        d.obj_list_dictize(result, context)

    # Extra properties from the domain object
    # We need an actual Package object for this, not a PackageRevision
    # if isinstance(pkg, model.PackageRevision):
    #     pkg = model.Package.get(pkg.id)

    # isopen
    result_dict['isopen'] = pkg.isopen if isinstance(pkg.isopen, bool) \
        else pkg.isopen()

    # type
    # if null assign the default value to make searching easier
    result_dict['type'] = pkg.type or u'dataset'

    # license
    if pkg.license and pkg.license.url:
        result_dict['license_url'] = pkg.license.url
        result_dict['license_title'] = pkg.license.title.split(u'::')[-1]
    elif pkg.license:
        result_dict['license_title'] = pkg.license.title
    else:
        result_dict['license_title'] = pkg.license_id

    # creation and modification date
    if is_latest_revision:
        result_dict['metadata_modified'] = pkg.metadata_modified.isoformat()
    # (If not is_latest_revision, don't use pkg which is the latest version.
    # Instead, use the dates already in result_dict that came from the dictized
    # PackageRevision)
    result_dict['metadata_created'] = pkg.metadata_created.isoformat()

    return result_dict
Beispiel #54
0
def _approval_needed(context, data_dict, is_org=False):
    model = context['model']
    api = context.get('api_version')
    groups = data_dict.get('groups')
    group_type = data_dict.get('type', 'group')
    ref_group_by = 'id' if api == 2 else 'name'

    sort = data_dict.get('sort', 'name')
    q = data_dict.get('q')

    # order_by deprecated in ckan 1.8
    # if it is supplied and sort isn't use order_by and raise a warning
    order_by = data_dict.get('order_by', '')
    if order_by:
        log.warn('`order_by` deprecated please use `sort`')
        if not data_dict.get('sort'):
            sort = order_by
    # if the sort is packages and no sort direction is supplied we want to do a
    # reverse sort to maintain compatibility.
    if sort.strip() in ('packages', 'package_count'):
        sort = 'package_count desc'

    sort_info = _unpick_search(sort,
                               allowed_fields=['name', 'packages',
                                               'package_count', 'title'],
                               total=1)

    all_fields = data_dict.get('all_fields', None)
    include_extras = all_fields and \
                     asbool(data_dict.get('include_extras', False))

    query = model.Session.query(model.Group)
    if include_extras:
        # this does an eager load of the extras, avoiding an sql query every
        # time group_list_dictize accesses a group's extra.
        query = query.options(sqlalchemy.orm.joinedload(model.Group._extras))
    query = query.filter(model.Group.state == 'approval_needed')
    if groups:
        query = query.filter(model.Group.name.in_(groups))
    if q:
        q = u'%{0}%'.format(q)
        query = query.filter(_or_(
            model.Group.name.ilike(q),
            model.Group.title.ilike(q),
            model.Group.description.ilike(q),
        ))

    query = query.filter(model.Group.is_organization == is_org)
    if not is_org:
        query = query.filter(model.Group.type == group_type)

    groups = query.all()
    if all_fields:
        include_tags = asbool(data_dict.get('include_tags', False))
    else:
        include_tags = False
    # even if we are not going to return all_fields, we need to dictize all the
    # groups so that we can sort by any field.
    group_list = model_dictize.group_list_dictize(
        groups, context,
        sort_key=lambda x: x[sort_info[0][0]],
        reverse=sort_info[0][1] == 'desc',
        with_package_counts=all_fields or
        sort_info[0][0] in ('packages', 'package_count'),
        include_groups=asbool(data_dict.get('include_groups', False)),
        include_tags=include_tags,
        include_extras=include_extras,
        )

    if not all_fields:
        group_list = [group[ref_group_by] for group in group_list]

    return group_list