Revision fc48b144

b/kamaki/cli/commands/image.py
235 235

  
236 236
    def _filtered_by_properties(self, images):
237 237
        new_images = []
238

  
239
        # def like_properties(props):
240
        #     plike = self['prop_like']
241
        #     for k, v in plike.items():
242
        #         likestr = props.get(k, '').lower()
243
        #         if v.lower() not in likestr:
244
        #             return False
245
        #     return True
246

  
247 238
        for img in images:
248 239
            props = [dict(img['properties'])]
249 240
            if self['prop']:
......
253 244
                    props, self['prop_like'], exact_match=False)
254 245
            if props:
255 246
                new_images.append(img)
256

  
257
            #if (
258
            #        self['prop'] and set(
259
            #            self['prop'].items()).difference(props.items())) or (
260
            #        self['prop_like'] and not like_properties(props)):
261
            #    continue
262
            #new_images.append(img)
263 247
        return new_images
264 248

  
265 249
    @errors.generic.all
......
652 636
            'output results in pages (-n to set items per page, default 10)',
653 637
            '--more'),
654 638
        enum=FlagArgument('Enumerate results', '--enumerate'),
639
        name=ValueArgument('filter by name', '--name'),
640
        name_pref=ValueArgument(
641
            'filter by name prefix (case insensitive)',
642
            '--name-prefix'),
643
        name_suff=ValueArgument(
644
            'filter by name suffix (case insensitive)',
645
            '--name-suffix'),
646
        name_like=ValueArgument(
647
            'print only if name contains this (case insensitive)',
648
            '--name-like'),
649
        user_id=ValueArgument('filter by user_id', '--user-id'),
650
        user_name=ValueArgument('filter by username', '--user-name'),
655 651
        meta=KeyValueArgument(
656 652
            'filter by metadata key=value (can be repeated)', ('--metadata')),
657 653
        meta_like=KeyValueArgument(
......
659 655
            ('--metadata-like'))
660 656
    )
661 657

  
658
    def _filtered_by_name(self, images):
659
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
660
        return [img for img in images if (
661
            (not np) or img['name'].lower().startswith(np.lower())) and (
662
            (not ns) or img['name'].lower().endswith(ns.lower())) and (
663
            (not nl) or nl.lower() in img['name'].lower())]
664

  
662 665
    def _filter_by_metadata(self, images):
663 666
        new_images = []
664

  
665 667
        for img in images:
666 668
            meta = [dict(img['metadata'])]
667 669
            if self['meta']:
......
673 675
                new_images.append(img)
674 676
        return new_images
675 677

  
678
    def _filter_by_user(self, images):
679
        uuid = self['user_id'] or self._username2uuid(self['user_name'])
680
        return filter_dicts_by_dict(images, dict(user_id=uuid))
681

  
676 682
    def _add_name(self, images, key='user_id'):
677 683
        uuids = self._uuids2usernames(
678 684
            list(set([img[key] for img in images])))
......
684 690
    @errors.cyclades.connection
685 691
    def _run(self):
686 692
        withmeta = bool(self['meta'] or self['meta_like'])
687
        detail = self['detail'] or withmeta
693
        withuser = bool(self['user_id'] or self['user_name'])
694
        detail = self['detail'] or withmeta or withuser
688 695
        images = self.client.list_images(detail)
696
        images = self._filtered_by_name(images)
697
        if withuser:
698
            images = self._filter_by_user(images)
689 699
        if withmeta:
690 700
            images = self._filter_by_metadata(images)
691 701
        if self['detail'] and not self['json_output']:
692 702
            images = self._add_name(self._add_name(images, 'tenant_id'))
703
        elif detail and not self['detail']:
704
            for img in images:
705
                for key in set(img).difference(self.PERMANENTS):
706
                    img.pop(key)
693 707
        kwargs = dict(with_enumeration=self['enum'])
694 708
        if self['more']:
695 709
            kwargs['page_size'] = self['limit'] or 10

Also available in: Unified diff