src/pyams_content/shared/view/reference.py
changeset 1217 ac40004d7c73
parent 1207 a97f2023131a
child 1240 921ff38f1aae
equal deleted inserted replaced
1216:30602138e7f7 1217:ac40004d7c73
    45 
    45 
    46     def get_references(self, context):
    46     def get_references(self, context):
    47         refs = []
    47         refs = []
    48         if self.select_context_references:
    48         if self.select_context_references:
    49             references = IInternalReferencesList(context, None)
    49             references = IInternalReferencesList(context, None)
    50             if references is not None:
    50             if (references is not None) and references.references:
    51                 refs.extend(references.references)
    51                 refs.extend(references.references)
    52         if self.references:
    52         if self.references:
    53             refs.extend(self.references)
    53             refs.extend(self.references)
    54         return refs
    54         return refs
    55 
    55 
    68 
    68 
    69     weight = 10
    69     weight = 10
    70 
    70 
    71     def get_params(self, context, request=None):
    71     def get_params(self, context, request=None):
    72         settings = IViewInternalReferencesSettings(self.context)
    72         settings = IViewInternalReferencesSettings(self.context)
    73         catalog = get_utility(ICatalog)
       
    74         # check view settings
       
    75         if settings.exclude_context:
       
    76             sequence = ISequentialIdInfo(context, None)
       
    77             if sequence is not None:
       
    78                 oid = sequence.hex_oid
       
    79                 yield NotEq(catalog['oid'], oid)
       
    80         # check view references mode
    73         # check view references mode
    81         if settings.references_mode == ONLY_REFERENCE_MODE:
    74         if settings.references_mode == ONLY_REFERENCE_MODE:
    82             yield Any(catalog['oid'], settings.references), False
    75             # references are retrieved by query filter extension, so no params are required!
       
    76             yield None
       
    77         else:
       
    78             # check view settings
       
    79             if settings.exclude_context:
       
    80                 sequence = ISequentialIdInfo(context, None)
       
    81                 if sequence is not None:
       
    82                     oid = sequence.hex_oid
       
    83                     catalog = get_utility(ICatalog)
       
    84                     yield NotEq(catalog['oid'], oid)
    83 
    85 
    84 
    86 
    85 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension)
    87 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension)
    86 class ViewInternalReferencesQueryFilterExtension(ContextAdapter):
    88 class ViewInternalReferencesQueryFilterExtension(ContextAdapter):
    87     """View internal references filter extension"""
    89     """View internal references filter extension
       
    90 
       
    91     If internal references are selected, these references are forced.
       
    92     """
    88 
    93 
    89     weight = 999
    94     weight = 999
    90 
    95 
    91     def filter(self, context, items, request=None):
    96     def filter(self, context, items, request=None):
    92         settings = IViewInternalReferencesSettings(self.context)
    97         settings = IViewInternalReferencesSettings(self.context)
    93         if not settings.references:
    98         references = settings.get_references(context)
       
    99         if not references:
    94             return items
   100             return items
    95         if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE):
   101         excluded_oid = None
       
   102         if settings.exclude_context:
       
   103             sequence = ISequentialIdInfo(context, None)
       
   104             if sequence is not None:
       
   105                 excluded_oid = sequence.hex_oid
       
   106         if (not items) or (settings.references_mode in (ALWAYS_REFERENCE_MODE, ONLY_REFERENCE_MODE)):
    96             catalog = get_utility(ICatalog)
   107             catalog = get_utility(ICatalog)
    97             for reference in settings.references:
   108             for reference in reversed(references):
       
   109                 if reference == excluded_oid:
       
   110                     continue
    98                 params = Eq(catalog['oid'], reference) & \
   111                 params = Eq(catalog['oid'], reference) & \
    99                          Any(catalog['workflow_state'], VISIBLE_STATES)
   112                          Any(catalog['workflow_state'], VISIBLE_STATES)
   100                 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params)))
   113                 items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params)))
   101         return items
   114         return items