def image_get_all(context, filters=None, marker=None, limit=None, sort_key='created_at', sort_dir='desc'): """ Get all images that match zero or more filters. :param filters: dict of filter keys and values. If a 'properties' key is present, it is treated as a dict of key/value filters on the image properties attribute :param marker: image id after which to start page :param limit: maximum number of images to return :param sort_key: image attribute by which results should be sorted :param sort_dir: direction in which results should be sorted (asc, desc) """ filters = filters or {} session = get_session() query = session.query(models.Image).\ options(joinedload(models.Image.properties)).\ options(joinedload(models.Image.members)) if 'size_min' in filters: query = query.filter(models.Image.size >= filters['size_min']) del filters['size_min'] if 'size_max' in filters: query = query.filter(models.Image.size <= filters['size_max']) del filters['size_max'] if 'is_public' in filters and filters['is_public'] is not None: the_filter = [models.Image.is_public == filters['is_public']] if filters['is_public'] and context.owner is not None: the_filter.extend([(models.Image.owner == context.owner), models.Image.members.any(member=context.owner, deleted=False)]) if len(the_filter) > 1: query = query.filter(or_(*the_filter)) else: query = query.filter(the_filter[0]) del filters['is_public'] showing_deleted = False if 'changes-since' in filters: # normalize timestamp to UTC, as sqlalchemy doesn't appear to # respect timezone offsets changes_since = utils.normalize_time(filters.pop('changes-since')) query = query.filter(models.Image.updated_at > changes_since) showing_deleted = True if 'deleted' in filters: deleted_filter = filters.pop('deleted') query = query.filter_by(deleted=deleted_filter) showing_deleted = deleted_filter # TODO(bcwaldon): handle this logic in registry server if not deleted_filter: query = query.filter(models.Image.status != 'killed') for (k, v) in filters.pop('properties', {}).items(): query = query.filter(models.Image.properties.any(name=k, value=v)) for (k, v) in filters.items(): if v is not None: query = query.filter(getattr(models.Image, k) == v) marker_image = None if marker is not None: marker_image = image_get(context, marker, force_show_deleted=showing_deleted) query = paginate_query(query, models.Image, limit, [sort_key, 'created_at', 'id'], marker=marker_image, sort_dir=sort_dir) return query.all()
def test_west_normalize(self): str = '2012-02-14T20:53:07+21:00' west = utils.parse_isotime(str) normed = utils.normalize_time(west) self._instaneous(normed, 2012, 2, 13, 23, 53, 07, 0)
def test_east_normalize(self): str = '2012-02-14T20:53:07-07:00' east = utils.parse_isotime(str) normed = utils.normalize_time(east) self._instaneous(normed, 2012, 2, 15, 03, 53, 07, 0)
def test_zulu_normalize(self): str = '2012-02-14T20:53:07Z' zulu = utils.parse_isotime(str) normed = utils.normalize_time(zulu) self._instaneous(normed, 2012, 2, 14, 20, 53, 07, 0)