Changeset 12824


Ignore:
Timestamp:
24 Mar 2015, 11:51:08 (10 years ago)
Author:
uli
Message:

Find payment ids also if only the beginning is given.

Location:
main/waeup.ikoba/trunk/src/waeup/ikoba/payments
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.ikoba/trunk/src/waeup/ikoba/payments/catalog.py

    r12823 r12824  
    1919"""
    2020import grok
    21 from hurry.query import Eq
    22 from hurry.query.query import Query
    2321from zope.catalog.interfaces import ICatalog
    2422from zope.component import queryUtility
     
    3028    """Search payments catalog.
    3129
    32     `query` gives a string we search, `searchtype` the fieldname.
     30    `query` gives a string we search for, `searchtype` the fieldname.
     31
     32    Query '*' returns all entries stored.
     33
     34    Fields containing strings are searched in a
     35    'startswith'-manner. That means, we find all entries starting with
     36    the given query string.
     37
     38    For other fields we only return exact matches. For instance for
     39    `anount`, we require a decimal number (no string) and will find
     40    all payments with that very amount given in `query`.
     41
     42    Returns a (possibly empty) catalog result set.
    3343    """
    3444    # Temporary solution to display all payments added
     45    cat = queryUtility(ICatalog, name='payments_catalog')
    3546    if query == '*':
    36         cat = queryUtility(ICatalog, name='payments_catalog')
    37         results = cat.searchResults(payment_id=(None, None))
     47        searchtype, query, upper_bound = 'payment_id', None, None
    3848    else:
    39         results = Query().searchResults(
    40             Eq(('payments_catalog', searchtype), query))
     49        if searchtype.endswith('_id'):
     50            upper_bound = query + ('Z' * 48)
     51        else:
     52            upper_bound = query
     53    search_params = {searchtype: (query, upper_bound)}
     54    results = cat.searchResults(**search_params)
    4155    return results
    4256
  • main/waeup.ikoba/trunk/src/waeup/ikoba/payments/tests/test_catalog.py

    r12822 r12824  
     1import decimal
    12from zope.catalog.interfaces import ICatalog
    23from zope.component import queryUtility
    34from zope.component.hooks import setSite
    45from waeup.ikoba.app import Company
    5 from waeup.ikoba.payments.payment import Payment
     6from waeup.ikoba.payments.payment import Payment, PaymentItem
    67from waeup.ikoba.payments.testing import FakePayer, FakePayable
    78from waeup.ikoba.testing import FunctionalLayer, FunctionalTestCase
     
    4546        result = [x for x in result]
    4647        self.assertEqual(len(result), 1)
     48
     49    def test_search_payer_id_starts_with_query(self):
     50        # we can find payer_ids starting with query string.
     51        app = self.create_app()
     52        payer1, payer2, payer3 = FakePayer(), FakePayer(), FakePayer()
     53        payer1.payer_id = u'PAYER_11'
     54        payer2.payer_id = u'PAYER_12'
     55        payer3.payer_id = u'PAYER_20'
     56        payment1 = Payment(payer=payer1, payable=FakePayable())
     57        payment2 = Payment(payer=payer2, payable=FakePayable())
     58        payment3 = Payment(payer=payer3, payable=FakePayable())
     59        app['p1'], app['p2'], app['p3'] = payment1, payment2, payment3
     60        result1 = search(query='PAYER_1', searchtype='payer_id')
     61        result1 = [x for x in result1]
     62        self.assertEqual(len(result1), 2)
     63        result2 = search(query='PAYER_2', searchtype='payer_id')
     64        result2 = [x for x in result2]
     65        self.assertEqual(len(result2), 1)
     66        result3 = search(query='PAYER_3', searchtype='payer_id')
     67        result3 = [x for x in result3]
     68        self.assertEqual(len(result3), 0)
     69        result4 = search(query='PAYER_11', searchtype='payer_id')
     70        result4 = [x for x in result4]
     71        self.assertEqual(len(result4), 1)
     72
     73    def test_search_amount(self):
     74        # we can find given amounts starting with query string.
     75        app = self.create_app()
     76        payable1, payable2 = FakePayable(), FakePayable()
     77        payable1.payment_items = (
     78            PaymentItem(u'Item 1', decimal.Decimal("1.0")), )
     79        payable2.payment_items = (
     80            PaymentItem(u'Item 2', decimal.Decimal("2.0")), )
     81        payment1 = Payment(payer=FakePayer(), payable=payable1)
     82        payment2 = Payment(payer=FakePayer(), payable=payable2)
     83        app['p1'], app['p2'] = payment1, payment2
     84        result1 = search(query=decimal.Decimal("1.00"), searchtype='amount')
     85        result1 = [x for x in result1]
     86        self.assertEqual(len(result1), 1)
     87        result2 = search(query=decimal.Decimal("2.00"), searchtype='amount')
     88        result2 = [x for x in result2]
     89        self.assertEqual(len(result2), 1)
     90        result3 = search(query=decimal.Decimal("3.00"), searchtype='amount')
     91        result3 = [x for x in result3]
     92        self.assertEqual(len(result3), 0)
Note: See TracChangeset for help on using the changeset viewer.