diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 146cd899b86..8bfb4f5095d 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -750,34 +750,22 @@ def group_package_show(context, data_dict): :rtype: list of dictionaries ''' - model = context["model"] - user = context["user"] - id = _get_or_bust(data_dict, 'id') - limit = data_dict.get("limit") + model = context['model'] + group_id = _get_or_bust(data_dict, 'id') - group = model.Group.get(id) + # FIXME: What if limit is not an int? Schema and validation needed. + limit = data_dict.get('limit') + + group = model.Group.get(group_id) context['group'] = group if group is None: raise NotFound _check_access('group_show', context, data_dict) - query = model.Session.query(model.PackageRevision)\ - .filter(model.PackageRevision.state=='active')\ - .filter(model.PackageRevision.current==True)\ - .join(model.Member, model.Member.table_id==model.PackageRevision.id)\ - .join(model.Group, model.Group.id==model.Member.group_id)\ - .filter_by(id=group.id)\ - .order_by(model.PackageRevision.name) - - if limit: - query = query.limit(limit) - - if context.get('return_query'): - return query - result = [] - for pkg_rev in query.all(): + for pkg_rev in group.get_package_revisions(limit=limit, + return_query=context.get('return_query')): result.append(model_dictize.package_dictize(pkg_rev, context)) return result diff --git a/ckan/model/group.py b/ckan/model/group.py index 62767671538..b0227c05203 100644 --- a/ckan/model/group.py +++ b/ckan/model/group.py @@ -199,6 +199,33 @@ def active_packages(self, load_eager=True, with_private=False): return query + def get_package_revisions(self, limit=None, return_query=False): + '''Return a group's packages. + + :param limit: the maximum number of packages to return + :type limit: int + + :returns: a list of the group's packages, sorted by name + :rtype: list of PackageRevision objects + + ''' + import ckan.model as model + q = model.Session.query(model.PackageRevision) + q = q.filter(model.PackageRevision.state == 'active') + q = q.filter(model.PackageRevision.current == True) + q = q.join(model.Member, + model.Member.table_id == model.PackageRevision.id) + q = q.join(model.Group, model.Group.id == model.Member.group_id) + q = q.filter_by(id=self.id) + q = q.order_by(model.PackageRevision.name) + if limit is not None: + q = q.limit(limit) + if return_query: + return q + else: + return q.all() + + @classmethod def search_by_name_or_title(cls, text_query, group_type=None): text_query = text_query.strip().lower()