Revision aed77afe snf-cyclades-app/synnefo/plankton/backend.py

b/snf-cyclades-app/synnefo/plankton/backend.py
255 255
        location = get_location(account, container, object)
256 256
        return self._get_image(location)
257 257

  
258
    def iter(self):
259
        """Iter over all images available to the user"""
260

  
261
        backend = self.backend
262
        for account in backend.list_accounts(self.user):
263
            for container in backend.list_containers(self.user, account,
264
                                                     shared=True):
265
                for path, version_id in backend.list_objects(self.user,
266
                        account, container, domain=PLANKTON_DOMAIN):
267
                    location = get_location(account, container, path)
268
                    image = self._get_image(location)
269
                    if image:
270
                        yield image
271

  
272
    def iter_public(self, filters=None):
258
    def _iter(self, public=False, filters=None, shared_from=None):
273 259
        filters = filters or {}
274
        backend = self.backend
275 260

  
261
        # Fix keys
276 262
        keys = [PLANKTON_PREFIX + 'name']
277 263
        size_range = (None, None)
278

  
279 264
        for key, val in filters.items():
280 265
            if key == 'size_min':
281 266
                size_range = (int(val), size_range[1])
......
284 269
            else:
285 270
                keys.append('%s = %s' % (PLANKTON_PREFIX + key, val))
286 271

  
287
        for account in backend.list_accounts(None):
288
            for container in backend.list_containers(None, account,
272
        backend = self.backend
273
        if shared_from:
274
            # To get shared images, we connect as shared_from member and
275
            # get the list shared by us
276
            user = shared_from
277
            accounts = [self.user]
278
        else:
279
            user = None if public else self.user
280
            accounts = backend.list_accounts(user)
281

  
282
        for account in accounts:
283
            for container in backend.list_containers(user, account,
289 284
                                                     shared=True):
290
                for path, version_id in backend.list_objects(None, account,
291
                        container, domain=PLANKTON_DOMAIN, keys=keys,
292
                        shared=True, size_range=size_range):
285
                for path, _ in backend.list_objects(user, account, container,
286
                                                    domain=PLANKTON_DOMAIN,
287
                                                    keys=keys, shared=True,
288
                                                    size_range=size_range):
293 289
                    location = get_location(account, container, path)
294 290
                    image = self._get_image(location)
295 291
                    if image:
296 292
                        yield image
297 293

  
298
    def iter_shared(self, member):
299
        """Iterate over image ids shared to this member"""
294
    def iter(self, filters=None):
295
        """Iter over all images available to the user"""
296
        return self._iter(filters=filters)
300 297

  
301
        backend = self.backend
298
    def iter_public(self, filters=None):
299
        """Iter over public images"""
300
        return self._iter(public=True, filters=filters)
302 301

  
303
        # To get the list we connect as member and get the list shared by us
304
        for container in  backend.list_containers(member, self.user):
305
            for object, version_id in backend.list_objects(member, self.user,
306
                    container, domain=PLANKTON_DOMAIN):
307
                try:
308
                    location = get_location(self.user, container, object)
309
                    meta = backend.get_object_meta(member, self.user,
310
                            container, object, PLANKTON_DOMAIN)
311
                    if PLANKTON_PREFIX + 'name' in meta:
312
                        yield meta['uuid']
313
                except (NameError, NotAllowedError):
314
                    continue
315

  
316
    def list(self):
317
        """Iter over all images available to the user"""
302
    def iter_shared(self, filters=None, member=None):
303
        """Iter over images shared to member"""
304
        return self._iter(filters=filters)
318 305

  
319
        return list(self.iter())
306
    def list(self, filters=None, params={}):
307
        """Return all images available to the user"""
308
        images = list(self.iter(filters))
309
        key = itemgetter(params.get('sort_key', 'created_at'))
310
        reverse = params.get('sort_dir', 'desc') == 'desc'
311
        images.sort(key=key, reverse=reverse)
312
        return images
320 313

  
321
    def list_public(self, filters, params):
314
    def list_public(self, filters, params={}):
315
        """Return public images"""
322 316
        images = list(self.iter_public(filters))
323 317
        key = itemgetter(params.get('sort_key', 'created_at'))
324 318
        reverse = params.get('sort_dir', 'desc') == 'desc'
......
385 379
            raise BackendException("Invalid checksum")
386 380

  
387 381
        is_public = params.pop('is_public', False)
388
        permissions = {'read': ['*']} if is_public else {}
382
        if is_public:
383
            permissions = {'read': ['*']}
384
        else:
385
            permissions = {'read': [self.user]}
389 386

  
390 387
        meta = {}
391 388
        meta['properties'] = params.pop('properties', {})

Also available in: Unified diff