src/pyams_content/shared/view/merge.py
changeset 796 2ef3bacda742
parent 791 29c778c100e0
child 798 754dcbb0ede9
equal deleted inserted replaced
795:d282eb691486 796:2ef3bacda742
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 from pyams_utils.list import random_iter
       
    13 
    12 
    14 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
    15 
    14 
    16 
    15 
    17 # import standard library
    16 # import standard library
    58     """Views concatenate merge mode"""
    57     """Views concatenate merge mode"""
    59 
    58 
    60     label = _("Concatenate views items in order")
    59     label = _("Concatenate views items in order")
    61 
    60 
    62     @classmethod
    61     @classmethod
    63     def get_results(cls, views, context):
    62     def get_results(cls, views, context, ignore_cache=False):
    64         results = (view.get_results(context) for view in views)
    63         results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
    65         yield from chain(*results)
    64         yield from chain(*results)
    66 
    65 
    67 
    66 
    68 @utility_config(name='random', provides=IViewsMerger)
    67 @utility_config(name='random', provides=IViewsMerger)
    69 class ViewsRandomMergeMode(object):
    68 class ViewsRandomMergeMode(object):
    70     """Views random merge mode"""
    69     """Views random merge mode"""
    71 
    70 
    72     label = _("Extract items randomly")
    71     label = _("Extract items randomly")
    73 
    72 
    74     @classmethod
    73     @classmethod
    75     def get_results(cls, views, context):
    74     def get_results(cls, views, context, ignore_cache=False):
    76         results = (view.get_results(context) for view in views)
    75         results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
    77         results = list(chain(*results))
    76         results = list(chain(*results))
    78         shuffle(results)
    77         shuffle(results)
    79         yield from iter(results)
    78         yield from iter(results)
    80 
    79 
    81 
    80 
    84     """Views zip merge mode"""
    83     """Views zip merge mode"""
    85 
    84 
    86     label = _("Take items from views one by one, in views order")
    85     label = _("Take items from views one by one, in views order")
    87 
    86 
    88     @classmethod
    87     @classmethod
    89     def get_results(cls, views, context):
    88     def get_results(cls, views, context, ignore_cache=False):
    90         results = (view.get_results(context) for view in views)
    89         results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
    91         for array in zip_longest(*results):
    90         for array in zip_longest(*results):
    92             yield from filter(lambda x: x is not None, array)
    91             yield from filter(lambda x: x is not None, array)
    93 
    92 
    94 
    93 
    95 @utility_config(name='zip_random', provides=IViewsMerger)
    94 @utility_config(name='zip_random', provides=IViewsMerger)
    97     """Views random zip merge mode"""
    96     """Views random zip merge mode"""
    98 
    97 
    99     label = _("Take items from views one by one, in random order")
    98     label = _("Take items from views one by one, in random order")
   100 
    99 
   101     @classmethod
   100     @classmethod
   102     def get_results(cls, views, context):
   101     def get_results(cls, views, context, ignore_cache=False):
   103         results = [view.get_results(context) for view in views]
   102         results = [view.get_results(context, ignore_cache=ignore_cache) for view in views]
   104         shuffle(results)
   103         shuffle(results)
   105         for array in zip_longest(*results):
   104         for array in zip_longest(*results):
   106             yield from filter(lambda x: x is not None, array)
   105             yield from filter(lambda x: x is not None, array)
   107 
   106 
   108 
   107 
   111 
   110 
   112     sort_index = None
   111     sort_index = None
   113     sort_key = None
   112     sort_key = None
   114 
   113 
   115     @classmethod
   114     @classmethod
   116     def get_results(cls, views, context):
   115     def get_results(cls, views, context, ignore_cache=False):
   117         results = (view.get_results(context,
   116         results = (view.get_results(context,
   118                                     sort_index=cls.sort_index,
   117                                     sort_index=cls.sort_index,
   119                                     reverse=True)
   118                                     reverse=True,
       
   119                                     ignore_cache=ignore_cache)
   120                    for view in views)
   120                    for view in views)
   121         yield from merge(*results, key=cls.sort_key)
   121         yield from merge(*results, key=cls.sort_key)
   122 
   122 
   123 
   123 
   124 @utility_config(name='{0}.sort'.format(CREATION_DATE_ORDER), provides=IViewsMerger)
   124 @utility_config(name='{0}.sort'.format(CREATION_DATE_ORDER), provides=IViewsMerger)