Example #1
0
    def getAllDocuments(self, option_json):
        response = {"rows": []}
        kw = {}
        if isinstance(option_json.get('query'), dict):
            kw['query'] = self.parseQuery(option_json["query"])
            kw['query'] = ComplexQuery(
              kw['query'],
              ComplexQuery(
                operator='or',
                *[SimpleQuery(comparison_operator="=", portal_type=x) \
                  for x in self.allowed_portal_type_list]
              ),
              comparison_operator='and'
            )
        else:
            kw['query'] = ComplexQuery(
              operator='or',
              *[SimpleQuery(comparison_operator="=", portal_type=x) \
                for x in self.allowed_portal_type_list]
            )

        if isinstance(option_json.get('limit'), list):
            kw['limit'] = tuple(option_json['limit'])

        c = self.simple_conversion_dict
        if isinstance(option_json.get('sort_on'), list):
            for i in range(len(option_json['sort_on'])):
                s = option_json['sort_on'][i]
                option_json['sort_on'][i] = dictGetKeyFromValue(c, s[0], s[0])
            kw['sort_on'] = option_json['sort_on']

        if not isinstance(option_json.get('select_list'), list):
            option_json['select_list'] = []
        if option_json['select_list'] != []:
            id_list = context.portal_catalog.getSQLCatalog().getColumnIds()
            i = len(option_json['select_list']) - 1
            while i >= 0:
                s = option_json['select_list'][i]
                option_json['select_list'][i] = dictGetKeyFromValue(c, s, s)
                if option_json['select_list'][i] not in id_list:
                    option_json['select_list'].pop(i)
                i -= 1
        kw['select_list'] = option_json['select_list']
        #portal.person_module.log("catalog ----------===============>", kw);
        for document in context.portal_catalog(**kw):
            url = tool.getUrlFromDocument(document)
            row = {"id": url, "key": url, "value": {}}
            for erp5_meta in option_json['select_list']:
                jio_meta = c.get(erp5_meta, erp5_meta)
                row['value'][jio_meta] = getattr(document, erp5_meta, None)
                if isinstance(row['value'][jio_meta], DateTime):
                    row['value'][jio_meta] = row['value'][jio_meta].ISO8601()
            if option_json.get('include_docs') is True:
                row["doc"] = self.getDocumentMetadata({"_id": url})
            response["rows"].append(row)
        response["total_rows"] = len(response["rows"])
        return response
Example #2
0
 def test_006_testRelatedKey_with_multiple_join(self):
   # The name of catalog parameter does not matter at all
   # ComplexQuery(ComplexQuery(AutoQuery(RelatedQuery(SimpleQuery())), AutoQuery(RelatedQuery(SimpleQuery()))))
   # 'AutoQuery' doesn't need any ReferenceQuery equivalent.
   self.catalog(ReferenceQuery(ReferenceQuery(
                    ReferenceQuery(RelatedReferenceQuery(ReferenceQuery(operator='=', default='a')), operator='and'),
                    ReferenceQuery(RelatedReferenceQuery(ReferenceQuery(operator='=', default='b')), operator='and')
                  , operator='and'), operator='and'),
                {'query': ComplexQuery(Query(related_default='a'), Query(related_default='b'))})
def _getEffectiveModel(self, start_date, stop_date):
    """Return the most appropriate model using effective_date, expiration_date
  and version number.
  An effective model is a model which start and stop_date are equal (or
  excluded) to the range of the given start and stop_date and with the
  higher version number (if there is more than one)

  XXX Should we moved this function to a class ? Which one ?
      What about reusing IVersionable ?
  """
    reference = self.getProperty('reference')
    if not reference:
        return self

    query_list = [
        Query(reference=reference),
        Query(portal_type=self.getPortalType()),
        Query(validation_state=('deleted', 'invalidated'), operator='NOT')
    ]
    if start_date is not None:
        query_list.append(
            ComplexQuery(Query(effective_date=None),
                         Query(effective_date=start_date, range='<='),
                         logical_operator='OR'))
    if stop_date is not None:
        query_list.append(
            ComplexQuery(Query(expiration_date=None),
                         Query(expiration_date=stop_date, range='>'),
                         logical_operator='OR'))

    # XXX What to do the catalog returns nothing (either because 'self' was just
    #     created and not yet indexed, or because it was invalidated) ?
    #     For the moment, we return self if self is invalidated and we raise otherwise.
    #     This way, if this happens in activity it may succeed when activity is retried.
    model_list = self.getPortalObject(
    ).portal_catalog.unrestrictedSearchResults(
        query=ComplexQuery(logical_operator='AND', *query_list),
        sort_on=(('version', 'descending'), ))
    if not model_list:
        if self.getValidationState() == 'invalidated':
            return self
        raise KeyError('No %s found with the reference %s between %s and %s' % \
                (self.getPortalType(), reference, start_date, stop_date))
    return model_list[0].getObject()
Example #4
0
 def rec(query_dict):
     if query_dict.get("type") == "simple":
         # if query_dict.get("key") not in self.allowed_property_id_list:
         #   return None
         for erp5_key, jio_key in self.simple_conversion_dict.items():
             if query_dict["key"] == jio_key:
                 query_dict["key"] = erp5_key
                 break
         return SimpleQuery(comparison_operator=query_dict['operator'],
                            **{query_dict['key']: query_dict['value']})
     if query_dict.get("type") == "complex":
         tool.listMapReplace(rec, query_dict['query_list'])
         try:
             while True:
                 query_dict['query_list'].remove(None)
         except ValueError:
             pass
         return ComplexQuery(operator=query_dict['operator'],
                             *query_dict['query_list'])
     return None
Example #5
0
        node = portal.portal_catalog.getObject(params['node_uid'])
        is_pl_account = node.isMemberOf('account_type/expense')\
                     or node.isMemberOf('account_type/income')

# remove unknown catalog keys from params
params.pop('detailed_from_date_summary', None)

period_start_date = params.pop('period_start_date', None)
if is_pl_account and not from_date:
    from_date = period_start_date

if portal.portal_selections.getSelectionParamsFor(selection_name).get(
        'hide_grouping'):
    if params.get('at_date'):
        params['grouping_query'] = ComplexQuery(
            Query(grouping_reference=None),
            Query(grouping_date=params['at_date'], range="min"),
            operator="OR")
    else:
        params['grouping_reference'] = None

if from_date or is_pl_account:
    # Create a new parameter list to get the previous balance
    get_inventory_kw = params.copy()

    initial_balance_from_date = from_date

    # ignore any at_date that could lay in params
    get_inventory_kw.pop('at_date', None)

    if period_start_date:
        if is_pl_account:
Example #6
0
        for ledger_category in ledger
    ]
    for ledger_value in ledger_value_list:
        params.setdefault('ledger_uid', []).append(ledger_value.getUid())

default_selection_params = params.copy()
default_selection_params['period_start_date'] = period_start_date
default_selection_params[
    'movement_portal_type'] = portal.getPortalAccountingMovementTypeList()
default_selection_params['no_mirror_section_uid_cache'] = 1

# if user request report without grouping reference, don't show accounts that only have grouped lines in the period.
if request.get('omit_grouping_reference', False):
    if at_date:
        params['grouping_query'] = ComplexQuery(Query(grouping_reference=None),
                                                Query(grouping_date=at_date,
                                                      range="min"),
                                                logical_operator="OR")
    else:
        params['grouping_reference'] = None

analytic_column_list = ()
if hide_analytic:
    default_selection_params['group_by'] = ('explanation_uid',
                                            'mirror_section_uid',
                                            'payment_uid')
else:
    analytic_column_list = context.accounting_module.AccountModule_getAnalyticColumnList(
    )
request.set(
    'analytic_column_list',
    analytic_column_list)  # for Movement_getExplanationTitleAndAnalytics
"""Guess the path of categories, taking as input a mapping {base_category:
category}, where category can be the relative_url, the title or the reference
of the category
"""

from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery
portal = context.getPortalObject()
result_dict = {}

for base_category_name, category in category_dict.items():
    category_object = \
      context.getPortalObject().portal_categories[base_category_name]

    category_value = category_object.restrictedTraverse(category, None)
    if category_value is None:
        query = ComplexQuery(
            ComplexQuery(Query(title=category, key='ExactMatch'),
                         Query(reference=category, key='ExactMatch'),
                         logical_operator='OR'),
            ComplexQuery(Query(relative_url='%s/%%' % base_category_name)))
        category_value = portal.portal_catalog.getResultValue(query=query)

    if category_value is not None:
        # remove base category from relative_url
        result_dict[base_category_name] = \
          category_value.getRelativeUrl().split('/', 1)[1]

return result_dict
Example #8
0
def generateNestedQuery(getQuery,
                        priority_list,
                        criterion_dict,
                        possible_worklist_id_dict=None):
    """
  """
    assert possible_worklist_id_dict is None \
           or len(possible_worklist_id_dict) != 0
    my_priority_list = priority_list[:]
    my_criterion_id = my_priority_list.pop()
    query_list = []
    append = query_list.append
    my_criterion_dict = criterion_dict[my_criterion_id]
    if len(my_priority_list) > 0:
        for criterion_value, worklist_id_dict in my_criterion_dict.iteritems():
            if possible_worklist_id_dict is not None:
                criterion_worklist_id_dict = worklist_id_dict.copy()
                # Do not use iterkeys since the dictionary will be modified in the
                # loop
                for worklist_id in criterion_worklist_id_dict.keys():
                    if worklist_id not in possible_worklist_id_dict:
                        del criterion_worklist_id_dict[worklist_id]
            else:
                criterion_worklist_id_dict = worklist_id_dict
            if len(criterion_worklist_id_dict):
                subcriterion_query = generateNestedQuery(
                    getQuery=getQuery,
                    priority_list=my_priority_list,
                    criterion_dict=criterion_dict,
                    possible_worklist_id_dict=criterion_worklist_id_dict)
                if subcriterion_query is not None:
                    query = getQuery(comparison_operator='IN',
                                     **{my_criterion_id: criterion_value})
                    if isinstance(criterion_value, ExclusionTuple):
                        query = NegatedQuery(query)
                        query = ComplexQuery(
                            logical_operator='OR',
                            *(query, getQuery(**{my_criterion_id: None})))
                    append(
                        ComplexQuery(query,
                                     subcriterion_query,
                                     logical_operator='AND'))
    else:
        possible_value_list = tuple()
        impossible_value_list = tuple()
        possible = True
        for criterion_value, criterion_worklist_id_dict \
            in my_criterion_dict.iteritems():
            if possible_worklist_id_dict is not None:
                possible = False
                for worklist_id in criterion_worklist_id_dict.iterkeys():
                    if worklist_id in possible_worklist_id_dict:
                        possible = True
                        break
            if possible:
                if isinstance(criterion_value, ExclusionTuple):
                    impossible_value_list += criterion_value
                else:
                    possible_value_list += criterion_value
        value_query_list = []
        if len(possible_value_list):
            query = getQuery(comparison_operator='IN',
                             **{my_criterion_id: possible_value_list})
            value_query_list.append(query)
        if len(impossible_value_list):
            query = getQuery(comparison_operator='IN',
                             **{my_criterion_id: impossible_value_list})
            query = NegatedQuery(query)
            query = ComplexQuery(logical_operator='OR',
                                 *(query, getQuery(**{my_criterion_id: None})))
            value_query_list.append(query)
        append(ComplexQuery(logical_operator='AND', *value_query_list))
    if len(query_list):
        return ComplexQuery(logical_operator='OR', *query_list)
    return None
Example #9
0
  def getInventoryQueryDict(self, budget_cell):
    """ Query dict to pass to simulation query
    """
    query_dict = dict()
    axis = self.getInventoryAxis()
    if not axis:
      return query_dict
    base_category = self.getProperty('variation_base_category')
    if not base_category:
      return query_dict
    budget_line = budget_cell.getParentValue()

    context = budget_cell
    if self.isMemberOf('budget_variation/budget'):
      context = budget_line.getParentValue()
    elif self.isMemberOf('budget_variation/budget_line'):
      context = budget_line
    
    if axis == 'movement':
      axis = 'default_%s' % base_category
    if axis == 'movement_strict_membership':
      axis = 'default_strict_%s' % base_category
    
    uid_based_axis = False
    if axis in ('node', 'section', 'payment', 'function', 'project',
                'mirror_section', 'mirror_node', 'funding' ):
      axis = '%s_uid' % axis
      uid_based_axis = True

    query = None
    portal_categories = self.getPortalObject().portal_categories
    for criterion_category in context.getMembershipCriterionCategoryList():
      if '/' not in criterion_category: # safe ...
        continue
      criterion_base_category, node_url = criterion_category.split('/', 1)
      if criterion_base_category == base_category:
        if node_url == 'budget_special_node/none':
          # This is the "Nothing" virtual node
          query = Query(**{axis: None})
        elif node_url == 'budget_special_node/all_other':
          # This is the "All Other" virtual node
          other_uid_list = []
          none_node_selected = False
          for node in self._getNodeList(budget_line):
            if '%s/%s' % (base_category, node.getRelativeUrl()) in\
                                    budget_line.getVariationCategoryList():
              if node.getRelativeUrl() == 'budget_special_node/none':
                none_node_selected = True
              else:
                if uid_based_axis:
                  other_uid_list.append(node.getUid())
                else:
                  other_uid_list.append(node.getRelativeUrl())
          if none_node_selected:
            # in this case we don't want to include NULL in All others
            query = NegatedQuery(Query(**{axis: other_uid_list}))
          else:
            query = ComplexQuery(
                            NegatedQuery(Query(**{axis: other_uid_list})),
                            Query(**{axis: None}),
                            operator="OR")

        else:
          value = portal_categories.getCategoryValue(node_url,
                  base_category=criterion_base_category)
          if uid_based_axis:
            query_dict.setdefault(axis, []).append(value.getUid())
          else:
            query_dict.setdefault(axis, []).append(value.getRelativeUrl())

    if query:
      if axis in query_dict:
        query_dict[axis] = ComplexQuery(
              query,
              Query(**{axis: query_dict[axis]}),
              operator='OR')
      else:
        query_dict[axis] = query


    return query_dict
Example #10
0
# the id_group is extended with the group path so that
# each local registry has a different sequence

group = (date.year(), )

new_registry_number = request_eform.portal_ids.generateNewId(
    id_group=group, method=attachLocationYearInfo)

# build a query and search in person module if the person already exists,
# if the person does not exist, create the person and a new assignment for
# the person with function commercant on the organisation if the
# person exist, just add a new assignment for the person with the function
# commercant on organisation
query = ComplexQuery(
    Query(title=request_eform.getTitle()),
    Query(birth_date=request_eform.getStartDate()),
    Query(birthplace_city=request_eform.getDefaultBirthplaceAddressCity()),
    logical_operator="AND")
person_list = [
    person.getObject() for person in person_module.searchFolder(query=query)
]
if request_eform.getBeginning() or request_eform.getOpening():
    if len(person_list) == 0:
        person = person_module.newContent(portal_type='Person')
        person.edit(first_name=request_eform.getFirstName(),
                    last_name=request_eform.getLastName(),
                    default_address_street_address=request_eform.
                    getHeadOfficeAddress(),
                    start_date=request_eform.getStartDate(),
                    default_birthplace_address_city=request_eform.
                    getDefaultBirthplaceAddressCity(),
Example #11
0
  def asQuery(self, strict_membership=False):
    """
    A Predicate can be rendered as a set of catalog conditions. This
    can be useful to create reporting trees based on the
    ZSQLCatalog. This condition set is however partial since
    python scripts which are used by the test method of the predicate
    cannot be converted to catalog conditions. If a python script is defined to
    implement test, results obtained through asQuery must be additionnaly
    tested by invoking test().
    """
    portal_catalog = self.getPortalObject().portal_catalog
    buildSingleQuery = portal_catalog.getSQLCatalog().buildSingleQuery
    getCategoryParameterDict = portal_catalog.getCategoryParameterDict
    def filterCategoryList(base_category_set, category_list):
      return [
        x for x in category_list
        if x.split('/', 1)[0] in base_category_set
      ]
    next_join_counter = itertools.count().next
    def buildSeparateJoinQuery(name, value):
      query = buildSingleQuery(name, value)
      suffix = str(next_join_counter())
      # XXX: using a deprecated API and accessing properties which are not part
      # of the API. Of course this will never break !
      query.setTableAliasList([
        (x, x + suffix) for x in query.search_key.table_list
      ])
      return query

    query_list = []
    append = query_list.append

    for buildQuery, getBaseCategorySet, getCategoryList in (
      ( # Single-membership criterion
        lambda name, value: buildSingleQuery(name, value),
        self.getMembershipCriterionBaseCategoryList,
        self.getMembershipCriterionCategoryList,
      ),
      ( # Multi-membership criterion
        buildSeparateJoinQuery,
        self.getMultimembershipCriterionBaseCategoryList,
        self.getMembershipCriterionCategoryList,
      ),
    ):
      append(
        getCategoryParameterDict(
          filterCategoryList(getBaseCategorySet(), getCategoryList()),
          strict_membership=strict_membership,
          onMissing=lambda category: False,
        ),
      )

    # Value criterion
    for criterion in self.getCriterionList():
      if not criterion.min and not criterion.max:
        append(buildSingleQuery(criterion.property, criterion.identity))
        continue
      if criterion.min:
        append(SimpleQuery(
          comparison_operator='>=',
          **{criterion.property: criterion.min}
        ))
      if criterion.max:
        append(SimpleQuery(
          comparison_operator='<=',
          **{criterion.property: criterion.max}
        ))

    if query_list:
      return ComplexQuery(query_list, logical_operator='AND')
    elif not getattr(self, 'isEmptyCriterionValid', lambda: True)():
      # By catalog definition, no object has uid 0, so this condition forces an
      # empty result.
      return SimpleQuery(uid=0)
    return SimpleQuery(uid=0, comparison_operator='>')
Example #12
0
attachment_pdf_list=[]
current_object = context.getObject()
event_list = current_object.getFollowUpRelatedValueList()
attachment_list =[x.getAggregateValueList() for x in event_list]
for y in attachment_list:
 attachment_pdf_list.extend(filter(lambda x:(x.getPortalType()=='PDF'),y))
event_uid_list = map(lambda x: x.getUid(), event_list)
attachment_pdf_uid_list =[x.getUid() for x in attachment_pdf_list]

if not event_uid_list:
 return []

# Build query
query = ComplexQuery(Query(parent_uid=event_uid_list),
                     Query(uid=event_uid_list),
                     Query(parent_uid=attachment_pdf_uid_list),
                     Query(uid=attachment_pdf_uid_list),
                     operator="OR")

kw['portal_type'] = ('PDF')
result_uid = [x.getUid() for x in context.portal_catalog(query=query, **kw)]
result_document = [x.getObject() for x in context.portal_catalog(query=query, **kw)]
display = 'thumbnail'
format = 'jpg'
resolution ='75'
for doc in result_document:
   content_information = doc.getContentInformation()
   page_number = int(content_information.get('Pages', 0))
   page_list = range(page_number)
   page_number_list = []
   for i in page_list:
Example #13
0
    def getSecurityQuery(self,
                         query=None,
                         sql_catalog_id=None,
                         local_roles=None,
                         **kw):
        """
        Build a query based on allowed roles or on a list of security_uid
        values. The query takes into account the fact that some roles are
        catalogued with columns.
      """
        user = _getAuthenticatedUser(self)
        user_str = str(user)
        user_is_superuser = (user == system_user) or (user_str == SUPER_USER)
        if user_is_superuser:
            # We need no security check for super user.
            return query
        original_query = query
        security_uid_dict, role_column_dict, local_role_column_dict = \
            self.getSecurityUidDictAndRoleColumnDict(
              sql_catalog_id=sql_catalog_id,
              local_roles=local_roles,
            )

        role_query = None
        security_uid_query = None
        if role_column_dict:
            query_list = []
            for key, value in role_column_dict.items():
                new_query = Query(**{key: value})
                query_list.append(new_query)
            operator_kw = {'operator': 'OR'}
            role_query = ComplexQuery(*query_list, **operator_kw)
        if security_uid_dict:
            catalog_security_uid_groups_columns_dict = \
                self.getSQLCatalog().getSQLCatalogSecurityUidGroupsColumnsDict()

            query_list = []
            for local_roles_group_id, security_uid_list in\
                     security_uid_dict.iteritems():
                assert security_uid_list
                query_list.append(
                    Query(
                        **{
                            catalog_security_uid_groups_columns_dict[local_roles_group_id]:
                            security_uid_list,
                            'operator':
                            'IN'
                        }))

            security_uid_query = ComplexQuery(*query_list, operator='OR')

        if role_query:
            if security_uid_query:
                # merge
                query = ComplexQuery(security_uid_query,
                                     role_query,
                                     operator='OR')
            else:
                query = role_query
        elif security_uid_query:
            query = security_uid_query

        else:
            # XXX A false query has to be generated.
            # As it is not possible to use SQLKey for now, pass impossible value
            # on uid (which will be detected as False by MySQL, as it is not in the
            # column range)
            # Do not pass security_uid_list as empty in order to prevent useless
            # overhead
            query = Query(uid=-1)

        if local_role_column_dict:
            query_list = []
            for key, value in local_role_column_dict.items():
                new_query = Query(**{key: value})
                query_list.append(new_query)
            operator_kw = {'operator': 'AND'}
            local_role_query = ComplexQuery(*query_list, **operator_kw)
            query = ComplexQuery(query, local_role_query, operator='AND')

        if original_query is not None:
            query = ComplexQuery(query, original_query, operator='AND')
        return query
Example #14
0
# To make `translated_title` behave like `title`, we support the LIKE operator.
# If user made a search with %, we treat it as a LIKE.
operator_value_dict, logical_operator, _ = search_key.processSearchValue(
    detect_like=True,
    search_value=search_value,
    default_logical_operator=logical_operator,
    comparison_operator=comparison_operator,
)

if 'like' in operator_value_dict:
    return AndQuery(
        ComplexQuery(
            [
                SimpleQuery(
                    **{
                        'content_translation.translated_text': search_term,
                        'comparison_operator': 'like'
                    }) for search_term in operator_value_dict['like']
            ],
            logical_operator=logical_operator,
        ),
        Query(**{'content_translation.property_name': 'title'}),
    )

# This scriptable key supports content_translation if the table is present
catalog = portal.portal_catalog.getSQLCatalog()
if 'content_translation' in catalog.getSqlSearchTablesList():
    if [x for x in catalog.getSqlCatalogSearchKeysList() if 'Mroonga' in x]:
        return AndQuery(
            SimpleQuery(
                **{
                    'content_translation.translated_text': search_value,
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery
kw.pop('relative_url', None)
kw.pop('follow_up_uid', None)

portal = context.getPortalObject()
portal_catalog = portal.portal_catalog

if portal_type is None:
    portal_type = portal.getPortalDocumentTypeList(
    ) + portal.getPortalEmbeddedDocumentTypeList()
limit = kw.pop('limit', None)
follow_up_related_document_list = portal_catalog(
    portal_type=portal_type, follow_up_uid=context.getUid(), **kw)
if follow_up_related_document_list:
    document_query = ComplexQuery(
        Query(relative_url='%s/%%' %
              context.getRelativeUrl().replace('_', r'\_')),
        Query(uid=[x.getUid() for x in follow_up_related_document_list]),
        logical_operator='or')
else:
    document_query = Query(relative_url='%s/%%' %
                           context.getRelativeUrl().replace('_', r'\_'))
if query is None:
    query = document_query
else:
    query = ComplexQuery(query, document_query, logical_operator='and')

return portal_catalog(portal_type=portal_type, query=query, limit=limit, **kw)
Example #16
0
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery

if document_type == 'Image':
    portal_type = ['Image']
else:
    portal_type = [
        x for x in context.getPortalDocumentTypeList() if x != 'Image'
    ]

return ComplexQuery(Query(portal_type=portal_type),
                    ComplexQuery(Query(
                        validation_state=('published', 'published_alive',
                                          'released', 'released_alive',
                                          'shared', 'shared_alive'),
                        reference='!=None'),
                                 Query(validation_state='embedded',
                                       parent_uid=context.getUid()),
                                 operator='or'),
                    operator='and')
if creation_from:
    query_list.append(
        SimpleQuery(creation_date=creation_from.strftime('>=' + date_format)))
if creation_to:
    query_list.append(
        SimpleQuery(creation_date=creation_to.strftime('<=' + date_format)))
if modification_from:
    query_list.append(
        SimpleQuery(modification_date=modification_from.strftime('>=' +
                                                                 date_format)))
if modification_to:
    query_list.append(
        SimpleQuery(modification_date=modification_to.strftime('<=' +
                                                               date_format)))
if query_list:
    query_kw['query'] = ComplexQuery(query_list, logical_operator='and')

if parsed_search_string.get('mine', None) is not None:
    # user wants only his documents
    query_kw['owner'] = portal.portal_membership.getAuthenticatedMember(
    ).getId()

# add contributor title
contributor_title = parsed_search_string.get('contributor_title', None)
if contributor_title is not None:
    query_kw['contributor_title'] = contributor_title

if parsed_search_string.get('newest', None) is not None:
    #...and now we check for only the newest versions
    # but we need to preserve order
    query_kw['group_by'] = ('reference', )
Example #18
0
from Products.PythonScripts.standard import Object
portal = context.getPortalObject()

assert account_type in ('account_type/asset/receivable',
                        'account_type/liability/payable')

currency = context.Base_getCurrencyForSection(section_category)
precision = context.account_module.getQuantityPrecisionFromResource(currency)
# we set the precision in request, for formatting on editable fields
portal.REQUEST.set('precision', precision)

section_uid = portal.Base_getSectionUidListForSectionCategory(
    section_category, section_category_strict)

grouping_query = ComplexQuery(SimpleQuery(grouping_reference=None),
                              SimpleQuery(grouping_date=at_date,
                                          comparison_operator=">="),
                              logical_operator="OR")

account_number_memo = {}


def getAccountNumber(account_url):
    try:
        return account_number_memo[account_url]
    except KeyError:
        account_number_memo[account_url] =\
          portal.restrictedTraverse(account_url).Account_getGapId()
    return account_number_memo[account_url]


section_title_memo = {None: ''}
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery
kw.pop('relative_url', None)
kw.pop('follow_up_uid', None)
portal_catalog=context.getPortalObject().portal_catalog
project_object_list = portal_catalog(
           portal_type=portal_type,
           source_project_title=context.getTitle(), **kw)
kw['query'] = Query(relative_url='%s/%%' % context.getRelativeUrl().replace('_', r'\_'))
if project_object_list:
  kw['query'] = ComplexQuery(
    kw['query'],
    Query(uid=[x.getUid() for x in project_object_list]),
    logical_operator='or')
return portal_catalog(portal_type=portal_type, limit=limit, **kw)
Example #20
0
# Initialise query
query_list = []

# Assemble query 
for action in ordered_global_action_list:
  workflow_id = action.get('workflow_id', None)
  worklist_id = action.get('worklist_id', None)
  if workflow_id is not None and worklist_id is not None:
    # get worklist defined local roles
    local_roles = context.Base_getWorkflowWorklistInfo(workflow_id, worklist_id)
    query_dict = context.WebSite_getWorklistSettingsFor(action)
    if query_dict:
      sub_query_list = []
      for k, v in query_dict.items():
        sub_query_list.append(Query(**{k: v}))
      complex_query = ComplexQuery(logical_operator="AND", *sub_query_list)
      # add to query filtering by local roles as defined in worklist
      complex_query = portal.portal_catalog.getSecurityQuery(query=complex_query, local_roles=local_roles)
      query_list.append(complex_query)

# Return empty list if nothing defined
if not query_list:
  if kw.get('_count', 0):
    return [[0]]
  else:
    return []

# Invoke catalog
query = ComplexQuery(logical_operator="OR", *query_list)
#query = portal.portal_catalog.getSecurityQuery(query)
#result_list = portal.portal_catalog(query=query,
ledger = ledger or request.get('ledger')
if ledger:
    search_kw['ledger_uid'] = [
        portal.portal_categories.restrictedTraverse(x).getUid() for x in ledger
    ]

if grouping == 'grouping':
    search_kw['grouping_reference'] = None
else:
    assert grouping == 'ungrouping', grouping
    search_kw['grouping_reference'] = NegatedQuery(
        Query(grouping_reference=None))

if title:
    search_kw['title_query'] = ComplexQuery(Query(title=title),
                                            Query(parent_title=title),
                                            logical_operator='OR')
if delivery_reference:
    search_kw['parent_reference'] = delivery_reference
if debit_price:
    search_kw['stock.total_price'] = debit_price
if credit_price:
    try:
        search_kw['stock.total_price'] = -float(credit_price['query'])
    except ValueError, e:
        # happens when user entered a complex query (like "> 100 AND < 200")
        # in that case, there is not much we can do.
        search_kw['stock.total_price'] = credit_price['query']
if date:
    search_kw['stock.date'] = date
# Find the applicable language
if language is None:
    language = portal.Localizer.get_selected_language()

if validation_state is None:
    validation_state = ('released', 'released_alive', 'published',
                        'published_alive', 'shared', 'shared_alive', 'public',
                        'validated')

if effective_date is None:
    if now is None:
        now = DateTime()
    effective_date = ComplexQuery(
        SimpleQuery(effective_date=None),
        SimpleQuery(effective_date=now, comparison_operator='<='),
        logical_operator='or',
    )

# Note: In sorts, NULL is considered lesser than non-NULL. So in descending
# sort, NULLs will be listed after non-NULLs, which is perfect for
# effective_date, which defines the date at which content becomes effective.
# None (NULL) effective date hence means "effective since infinite in te past".
base_sort = (('effective_date', 'descending'), )

# Portal Type and validation state should be handled by predicate
# By default
document_list = context.searchResults(reference=name,
                                      effective_date=effective_date,
                                      language=(language, ''),
                                      sort_on=(('language', 'descending'), ) +
Example #23
0
  def getInventoryListQueryDict(self, budget_line):
    """Returns the query dict to pass to simulation query for a budget line
    """
    axis = self.getInventoryAxis()
    if not axis:
      return dict()
    base_category = self.getProperty('variation_base_category')
    if not base_category:
      return dict()

    context = budget_line
    if self.isMemberOf('budget_variation/budget'):
      context = budget_line.getParentValue()

    portal_categories = self.getPortalObject().portal_categories
    query_dict = dict()
    uid_based_axis = False
    if axis == 'movement':
      axis = 'default_%s_uid' % base_category
      query_dict['select_list'] = [axis]
      query_dict['group_by'] = [axis]
      uid_based_axis = True
    elif axis == 'movement_strict_membership':
      axis = 'default_strict_%s_uid' % base_category
      query_dict['select_list'] = [axis]
      query_dict['group_by'] = [axis]
      uid_based_axis = True
    else:
      query_dict['group_by_%s' % axis] = True

    if axis in ('node', 'section', 'payment', 'function', 'project',
                'mirror_section', 'mirror_node', 'funding' ):
      axis = '%s_uid' % axis
      uid_based_axis = True

    # if we have a virtual "all others" node, we don't set a criterion here.
    if self.getProperty('include_virtual_other_node'):
      return query_dict

    if self.getProperty('full_consumption_detail'):
      if self.isMemberOf('budget_variation/budget'):
        category_list = [item[1] for item in
          self.getBudgetVariationRangeCategoryList(context)]
      else:
        category_list = [item[1] for item in
          self.getBudgetLineVariationRangeCategoryList(context)]
    else:
      category_list = context.getVariationCategoryList(
        base_category_list=(base_category,))

    found = False
    for node_url in category_list:
      if node_url != '%s/budget_special_node/none' % base_category:
        __traceback_info__ = (node_url, )
        if uid_based_axis:
          query_dict.setdefault(axis, []).append(
                portal_categories.getCategoryValue(node_url,
                      base_category=base_category).getUid())
        else:
          query_dict.setdefault(axis, []).append(
                portal_categories.getCategoryValue(node_url,
                      base_category=base_category).getRelativeUrl())
      found = True
    if found:
      if self.getProperty('include_virtual_none_node'):
        if axis in query_dict:
          query_dict[axis] = ComplexQuery(
                Query(**{axis: None}),
                Query(**{axis: query_dict[axis]}),
                operator="OR")
        else:
          query_dict[axis] = Query(**{axis: None})
      return query_dict
    return dict()
Example #24
0
# Aggregate the Pay Sheet Transactions that will be declared in
# the current DSN Report.
# Pay Sheet Transactions are chosen by date and establishment
from Products.ZSQLCatalog.SQLCatalog import ComplexQuery, Query

portal = context.getPortalObject()

destination_trade = portal.restrictedTraverse(destination_trade_category)

catalog_kw = {
    'query':
    ComplexQuery(Query(start_date=">=%s" % from_date.strftime("%Y/%m/%d")),
                 Query(stop_date="<=%s" % to_date.strftime("%Y/%m/%d")),
                 Query(destination_trade_uid=Query(
                     destination_trade_uid=destination_trade.getUid())),
                 Query(simulation_state='!=cancelled'),
                 Query(simulation_state='!=deleted'),
                 Query(simulation_state='!=draft'),
                 logical_operator="AND")
}

paysheet_list = portal.accounting_module.searchFolder(
    portal_type="Pay Sheet Transaction", **catalog_kw)

for paysheet in paysheet_list:
    paysheet = paysheet.getObject()
    aggregate_list = paysheet.getAggregateList([])
    if context.getRelativeUrl() not in aggregate_list:
        aggregate_list.append(context.getRelativeUrl())
        paysheet.edit(aggregate_list=aggregate_list)
Example #25
0
    def _searchPredicateList(self,
                             context,
                             test=1,
                             sort_method=None,
                             ignored_category_list=None,
                             tested_base_category_list=None,
                             filter_method=None,
                             acquired=1,
                             sort_key_method=None,
                             query=None,
                             restricted=False,
                             **kw):
        """
      Search all predicates which corresponds to this particular
      context.

      - sort_method parameter should not be used, if possible, because
        it can be very slow. Use sort_key_method instead.

      - sort_key_method parameter is passed to list.sort as key parameter if it
        is not None. This allows to sort the list of predicates found. The most
        important predicate is the first one in the list.

      - ignored_category_list:  this is the list of category that we do
        not want to test. For example, we might want to not test the
        destination or the source of a predicate.

      - tested_base_category_list:  this is the list of category that we do
        want to test. For example, we might want to test only the
        destination or the source of a predicate.

      - the acquired parameter allows to define if we want to use
        acquisition for categories. By default we want.
    """
        if not kw.pop('strict', True):
            raise ValueError('"strict" mode cannot be disabled anymore')
        portal = self.getPortalObject()
        portal_catalog = portal.portal_catalog
        portal_categories = portal.portal_categories
        # Search the columns of the predicate table
        query_list = [] if query is None else [query]
        for column in portal_catalog.getSQLCatalog().getTableColumnList(
                'predicate'):
            # Arbitrary suffix choice, this code expects COLUMN, COLUMN_range_min
            # and COLUMN_range_max to be simultaneously present for ranged
            # properties. Only checking one suffix simplifies the code flow.
            if column.endswith('_range_min'):
                property_name = column[:-10]
                # We have to check a range property
                equality = 'predicate.' + property_name
                range_min = equality + '_range_min'
                range_max = equality + '_range_max'

                value = context.getProperty(property_name)

                query = ComplexQuery(SimpleQuery(**{equality: None}),
                                     SimpleQuery(**{range_min: None}),
                                     SimpleQuery(**{range_max: None}),
                                     logical_operator='AND')

                if value is not None:
                    query = ComplexQuery(
                        query,
                        SimpleQuery(**{equality: value}),
                        ComplexQuery(
                            SimpleQuery(comparison_operator='<=',
                                        **{range_min: value}),
                            SimpleQuery(**{range_max: None}),
                            logical_operator='AND',
                        ),
                        ComplexQuery(
                            SimpleQuery(**{range_min: None}),
                            SimpleQuery(comparison_operator='>=',
                                        **{range_max: value}),
                            logical_operator='AND',
                        ),
                        ComplexQuery(
                            SimpleQuery(comparison_operator='<=',
                                        **{range_min: value}),
                            SimpleQuery(comparison_operator='>=',
                                        **{range_max: value}),
                            logical_operator='AND',
                        ),
                        logical_operator='OR',
                    )

                query_list.append(query)

        if tested_base_category_list != []:
            # Add category selection
            if tested_base_category_list is None:
                if acquired:
                    category_list = context.getAcquiredCategoryList()
                else:
                    category_list = context.getCategoryList()
            else:
                if acquired:
                    getter = context.getAcquiredCategoryMembershipList
                else:
                    getter = context.getCategoryMembershipList
                category_list = []
                extend = category_list.extend
                for tested_base_category in tested_base_category_list:
                    if portal_categories.get(tested_base_category) is None:
                        raise ValueError('Unknown base category: %r' %
                                         (tested_base_category, ))
                    tested_category_list = getter(tested_base_category, base=1)
                    if tested_category_list:
                        extend(tested_category_list)
                    else:
                        # Developer requested specific base categories, but context do not
                        # declare one of these. Skipping this criterion risks matching too
                        # many predicates, breaking the system performance-wise. So let
                        # developer know there is an unexpected situation by raising.
                        raise ValueError('%r does not have any %r relation' % (
                            context.getPath(),
                            tested_base_category,
                        ))
            left_join_list = kw.get('left_join_list', [])[:]
            inner_join_list = kw.get('inner_join_list', [])[:]
            if category_list:
                preferred_predicate_category_list = portal.portal_preferences.getPreferredPredicateCategoryList(
                    [])
                left_join_category_list = []
                inner_join_category_list = []
                for category in category_list:
                    if portal_categories.getBaseCategoryId(
                            category) in preferred_predicate_category_list:
                        inner_join_category_list.append(category)
                    else:
                        left_join_category_list.append(category)

                def onMissing(category):
                    # BBB: ValueError would seem more appropriate here, but original code
                    # was raising TypeError - and this is explicitely tested for.
                    raise TypeError('Unknown category: %r' % (category, ))

                def onInnerJoin(column_name):
                    inner_join_list.append(column_name)
                    # Base category is part of preferred predicate categories, predicates
                    # which ignore it are indexed with category_uid=0.
                    return SimpleQuery(**{column_name: 0})

                query_list.append(
                    portal_catalog.getCategoryParameterDict(
                        inner_join_category_list,
                        category_table='predicate_category',
                        onMissing=onMissing,
                        onJoin=onInnerJoin,
                    ))

                def onLeftJoin(column_name):
                    left_join_list.append(column_name)
                    # Base category is not part of preferred predicate categories,
                    # predicates which ignore it get no predicate_category row inserted
                    # for it, so an SQL NULL appears, translating to None.
                    return SimpleQuery(**{column_name: None})

                query_list.append(
                    portal_catalog.getCategoryParameterDict(
                        left_join_category_list,
                        category_table='predicate_category',
                        onMissing=onMissing,
                        onJoin=onLeftJoin,
                    ))
            else:
                # No category to match against, so predicates expecting any relation
                # would not apply, so we can exclude these.
                # Note: this relies on a special indexation mechanism for predicate
                # categories, which inserts a base_category_uid=0 line when indexed
                # predicate membership_criterion_category_list is empty.
                base_category_uid_column = 'predicate_category.base_category_uid'
                kw[base_category_uid_column] = 0
                inner_join_list.append(base_category_uid_column)
            kw['left_join_list'] = left_join_list
            kw['inner_join_list'] = inner_join_list
        if query_list:
            kw['query'] = ComplexQuery(logical_operator='AND', *query_list)

        if restricted:
            sql_result_list = portal_catalog.searchResults(**kw)
        else:
            sql_result_list = portal_catalog.unrestrictedSearchResults(**kw)
        if kw.get('src__'):
            return sql_result_list
        result_list = []
        if sql_result_list:
            if test:
                cache = {}

                def isMemberOf(context, c, strict_membership):
                    if c in cache:
                        return cache[c]
                    cache[c] = result = portal_categories.isMemberOf(
                        context, c, strict_membership=strict_membership)
                    return result

            for predicate in sql_result_list:
                predicate = predicate.getObject()
                if not test or predicate.test(context,
                                              tested_base_category_list,
                                              isMemberOf=isMemberOf):
                    result_list.append(predicate)
            if filter_method is not None:
                result_list = filter_method(result_list)
            if sort_key_method is not None:
                result_list.sort(key=sort_key_method)
            elif sort_method is not None:
                result_list.sort(cmp=sort_method)
        return result_list
Example #26
0
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery
kw.pop('relative_url', None)
kw.pop('follow_up_uid', None)

portal = context.getPortalObject()
portal_catalog = portal.portal_catalog

if portal_type is None:
    portal_type = portal.getPortalDocumentTypeList(
    ) + portal.getPortalEmbeddedDocumentTypeList()
limit = kw.pop('limit', None)
follow_up_related_document_list = portal_catalog(
    portal_type=portal_type,
    follow_up_uid=context.getUid(),
)
document_query = Query(relative_url='%s/%%' %
                       context.getRelativeUrl().replace('_', r'\_'))
if follow_up_related_document_list:
    document_query = ComplexQuery(
        document_query,
        Query(uid=[x.getUid() for x in follow_up_related_document_list]),
        logical_operator='or')
if query is None:
    query = document_query
else:
    query = ComplexQuery(query, document_query, logical_operator='and')

return portal_catalog(portal_type=portal_type, query=query, limit=limit, **kw)
Example #27
0
request = context.REQUEST
portal_catalog = context.portal_catalog

reference = request.get('reference')
data_chunk = request.get('data_chunk')

if data_chunk is not None and reference is not None:
    # here we rely that fluentd will pass to us its tag which we use
    # as reference but we can extract it sometimes from sensor data
    # it thus depends on sensor and the fluentd topography
    query = ComplexQuery(Query(portal_type='Data Supply'),
                         Query(reference=reference),
                         Query(validation_state='validated'),
                         Query(**{
                             'delivery.stop_date': now,
                             'range': 'min'
                         }),
                         Query(**{
                             'delivery.start_date': now,
                             'range': 'max'
                         }),
                         logical_operator="AND")
    data_supply = portal_catalog.getResultValue(query=query)

    #context.log(data_supply)
    # we can have multiple lines for each sensor and we filter out by reference
    # XXX: in future we will use Predicates to find already generated
    # Data Ingestion (Movements)
    if data_supply is not None:
        for data_supply_line in data_supply.objectValues():
            sensor = data_supply_line.getSourceValue()
            if sensor is not None and sensor.getReference() == reference:
Example #28
0
    def _searchPredicateList(self,
                             context,
                             test=1,
                             sort_method=None,
                             ignored_category_list=None,
                             tested_base_category_list=None,
                             filter_method=None,
                             acquired=1,
                             strict=True,
                             sort_key_method=None,
                             query=None,
                             restricted=False,
                             **kw):
        # XXX: about "strict" parameter: This is a transition parameter,
        # allowing someone hitting a bug to revert to original behaviour easily.
        # It is not a correct name, as pointed out by Jerome. But instead of
        # searching for another name, it would be much better to just remove it.
        """
      Search all predicates which corresponds to this particular 
      context.

      - sort_method parameter should not be used, if possible, because
        it can be very slow. Use sort_key_method instead.

      - sort_key_method parameter is passed to list.sort as key parameter if it
        is not None. This allows to sort the list of predicates found. The most
        important predicate is the first one in the list.

      - ignored_category_list:  this is the list of category that we do
        not want to test. For example, we might want to not test the 
        destination or the source of a predicate.

      - tested_base_category_list:  this is the list of category that we do
        want to test. For example, we might want to test only the 
        destination or the source of a predicate.

      - the acquired parameter allows to define if we want to use
        acquisition for categories. By default we want.

      - strict: if True, generate SQL which will match predicates matching
        all those categories at the same time, except for categories they do
        not check at all. Example:
          Predicate_1 checks foo/bar
          Predicate_2 checks foo/baz region/somewhere
          Predicate_3 checks foo/bar region/somewhere
          When called with category list ['foo/bar', 'region/somewhere'] and
          strict parameter to True, it will return [Predicate_1, Predicate_3].
          With strict to False or by not giving a category list, it would also
          return Predicate_2, because it matches on one criterion out of the 2
          it checks.
        Note that it changes the value returned by this function if it was
        invoked with "test=False" value. Otherwise, it should only change
        execution duration.
      """
        portal = self.getPortalObject()
        portal_catalog = portal.portal_catalog
        portal_categories = portal.portal_categories
        # Search the columns of the predicate table
        range_column_set = set()
        query_list = [] if query is None else [query]
        for column in portal_catalog.getColumnIds():
            if column[:10] == 'predicate.' and \
               column[-10:] in ('_range_min', '_range_max'):
                property_name = column[10:-10]
                if property_name not in range_column_set:
                    range_column_set.add(property_name)
                    # We have to check a range property
                    equality = 'predicate.' + property_name
                    range_min = equality + '_range_min'
                    range_max = equality + '_range_max'

                    value = context.getProperty(property_name)

                    query = ComplexQuery(Query(**{equality: None}),
                                         Query(**{range_min: None}),
                                         Query(**{range_max: None}),
                                         logical_operator='AND')

                    if value is not None:
                        query = ComplexQuery(
                            query,
                            ComplexQuery(
                                Query(**{equality: value}),
                                ComplexQuery(
                                    ComplexQuery(
                                        Query(
                                            **{
                                                range_min:
                                                dict(
                                                    query=value,
                                                    range='ngt',
                                                )
                                            }),
                                        Query(**{range_max: None}),
                                        logical_operator='AND',
                                    ),
                                    ComplexQuery(
                                        Query(**{range_min: None}),
                                        Query(
                                            **{
                                                range_max:
                                                dict(
                                                    query=value,
                                                    range='min',
                                                )
                                            }),
                                        logical_operator='AND',
                                    ),
                                    ComplexQuery(
                                        Query(
                                            **{
                                                range_min:
                                                dict(
                                                    query=value,
                                                    range='ngt',
                                                )
                                            }),
                                        Query(
                                            **{
                                                range_max:
                                                dict(
                                                    query=value,
                                                    range='min',
                                                )
                                            }),
                                        logical_operator='AND',
                                    ),
                                    logical_operator='OR',
                                ),
                                logical_operator='OR',
                            ),
                            logical_operator='OR')

                    query_list.append(query)

        # Add category selection
        if tested_base_category_list is None:
            if acquired:
                category_list = context.getAcquiredCategoryList()
            else:
                category_list = context.getCategoryList()
        else:
            if acquired:
                getter = context.getAcquiredCategoryMembershipList
            else:
                getter = context.getCategoryMembershipList
            category_list = []
            extend = category_list.extend
            for tested_base_category in tested_base_category_list:
                extend(getter(tested_base_category, base=1))

        if tested_base_category_list != []:
            preferred_predicate_category_list = portal.portal_preferences.getPreferredPredicateCategoryList(
            )

            if (preferred_predicate_category_list
                    and tested_base_category_list is not None
                    and set(preferred_predicate_category_list).issuperset(
                        tested_base_category_list)):
                # New behavior is enabled only if preferred predicate category is
                # defined and tested_base_category_list is passed.
                predicate_category_query_list = []
                predicate_category_table_name_list = []
                category_dict = {}
                for relative_url in category_list:
                    category_value = portal_categories.getCategoryValue(
                        relative_url)
                    base_category_id = portal_categories.getBaseCategoryId(
                        relative_url)
                    base_category_value = portal_categories.getCategoryValue(
                        base_category_id)
                    if not base_category_value in category_dict:
                        category_dict[base_category_value] = []
                    category_dict[base_category_value].append(category_value)

                for base_category_value, category_value_list in category_dict.iteritems(
                ):
                    if base_category_value.getId(
                    ) in preferred_predicate_category_list:
                        table_index = len(predicate_category_query_list)
                        predicate_category_table_name = 'predicate_category_for_domain_tool_%s' % table_index
                        table_alias_list = [('predicate_category',
                                             predicate_category_table_name)]
                        predicate_category_query_list.append(
                            ComplexQuery(
                                Query(predicate_category_base_category_uid=
                                      base_category_value.getUid(),
                                      table_alias_list=table_alias_list),
                                Query(
                                    predicate_category_category_strict_membership
                                    =1,
                                    table_alias_list=table_alias_list),
                                ComplexQuery(
                                    Query(predicate_category_category_uid=[
                                        category_value.getUid() for
                                        category_value in category_value_list
                                    ],
                                          table_alias_list=table_alias_list),
                                    Query(
                                        predicate_category_category_uid='NULL',
                                        table_alias_list=table_alias_list),
                                    logical_operator='OR'),
                                logical_operator='AND'))

                if not predicate_category_query_list:
                    # Prevent matching everything
                    predicate_category_query_list.append(
                        Query(predicate_category_base_category_uid=0))

                predicate_category_query = ComplexQuery(
                    logical_operator='AND', *predicate_category_query_list)
                query_list.append(predicate_category_query)
            else:
                # Traditional behavior
                category_expression_dict = portal_categories.buildAdvancedSQLSelector(
                    category_list or ['NULL'],
                    query_table='predicate_category',
                    none_sql_value=0,
                    strict=strict)
                where_expression = category_expression_dict['where_expression']
                if where_expression:
                    kw['where_expression'] = SQLQuery(where_expression)

                if 'from_expression' in category_expression_dict:
                    kw['from_expression'] = category_expression_dict[
                        'from_expression']
                else:
                    # Add predicate_category.uid for automatic join
                    kw['predicate_category.uid'] = '!=NULL'

        if query_list:
            kw['query'] = ComplexQuery(logical_operator='AND', *query_list)

        if restricted:
            sql_result_list = portal_catalog.searchResults(**kw)
        else:
            sql_result_list = portal_catalog.unrestrictedSearchResults(**kw)
        if kw.get('src__'):
            return sql_result_list
        result_list = []
        for predicate in sql_result_list:
            predicate = predicate.getObject()
            if (not test) or predicate.test(
                    context,
                    tested_base_category_list=tested_base_category_list):
                result_list.append(predicate)
        if filter_method is not None:
            result_list = filter_method(result_list)
        if sort_key_method is not None:
            result_list.sort(key=sort_key_method)
        elif sort_method is not None:
            result_list.sort(cmp=sort_method)
        return result_list
Example #29
0
    real_key = key[:-7]
    new_mapping['%s_value_' % real_key] = new_mapping[real_key]
    new_mapping['%s_usage_' % real_key] = value
    # TODO: this is a quick and dirty implementation of what should be done by
    # Query.asSearchTextExpression. Instead of keeping '%s_value_' and '%s_usage_',
    # we'll simply keep the query.
    new_mapping[real_key] = '%s %s' % (usage_map[value], new_mapping[real_key])

  else:
    if request.form.get('%s_is_excluded_' % key):
      # Build a negated query
      nq_kw = {'strict_%s' % key : value}
      q_kw = {key : None}
      left_join_list.append(key) 
      left_join_list.append('strict_%s' % key)
      query_list.append(ComplexQuery(NegatedQuery(Query(**nq_kw)), Query(**q_kw), logical_operator="OR"))
      new_mapping[key] = ""
      new_mapping["dialog_%s" %(key,)] = value
      new_mapping["dialog_excluded_%s" %(key,)] = True
    else:
      if request.form.get('%s_is_strict_' % key):
        new_mapping['strict_%s' % key] = value
        new_mapping['dialog_strict_%s' % key] = value
      else:
        new_mapping[key] = value
        new_mapping['dialog_%s' % key] = value

      
new_mapping["query"] = ComplexQuery(query_list)
new_mapping['left_join_list'] = left_join_list
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery

kw['query'] = ComplexQuery(
    Query(portal_type='Simulation Movement',
          explanation_portal_type='Returned Purchase Order'),
    ComplexQuery(Query(parent_specialise_portal_type=[
        'Order Rule', 'Delivery Rule', 'Delivery Root Simulation Rule'
    ],
                       simulation_state='confirmed'),
                 Query(
                     parent_specialise_portal_type='Delivery Simulation Rule',
                     grand_parent_simulation_state='confirmed'),
                 logical_operator='or'),
    logical_operator='and')

kw['delivery_uid'] = None
kw['left_join_list'] = ['delivery_uid']
kw['select_dict'] = dict(delivery_uid=None)
kw['group_by'] = ('uid', )

kw['src__'] = src__
return context.portal_catalog(**kw)