Skip to content

Commit

Permalink
Merge branch 'issue_90' into redesign_2015
Browse files Browse the repository at this point in the history
  • Loading branch information
msom committed Oct 22, 2015
2 parents 35e6818 + f4ce0d8 commit 2ef4b91
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 20 deletions.
3 changes: 1 addition & 2 deletions buildout/versions.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,9 @@ pyquery = 1.2.8
python-magic = 0.4.6
python-memcached = 1.53
pytz = 2013b
seantis.dir.base = 1.7.8
xlrd = 0.9.2
xlwt = 0.7.5
z3c.jbot = 0.7.1
z3c.unconfigure = 1.1
zc.buildout = 1.7.1
zope.configuration = 3.8.1
zope.configuration = 3.8.1
3 changes: 3 additions & 0 deletions docs/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ Changelog
1.6 (unreleased)
~~~~~~~~~~~~~~~~

- Allow filtering for multiple categories #90.
[msom]

- Limit the range of different guidle categories. Implements #91.
[msom]

Expand Down
10 changes: 2 additions & 8 deletions seantis/dir/events/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
)
from Products.CMFCore.interfaces import IActionSucceededEvent

from seantis.dir.base.catalog import DirectoryCatalog, is_exact_match
from seantis.dir.base.catalog import DirectoryCatalog
from seantis.dir.base.interfaces import IDirectoryCatalog
from seantis.dir.base.utils import previous_and_next, cached_property

Expand Down Expand Up @@ -634,12 +634,6 @@ def export(self, search=None, term=None, max=None, imported=False, **kw):
search = '"{}"*'.format(search)
kw['SearchableText'] = search

elif term:
kw['categories'] = {
'query': term.values(),
'operator': 'and'
}

subset = self.catalog(
path={'query': self.path, 'depth': 1},
object_provides=IEventsDirectoryItem.__identifier__,
Expand All @@ -665,7 +659,7 @@ def export(self, search=None, term=None, max=None, imported=False, **kw):
subset = [brain for brain in subset if brain.id in subset_ids]

if term:
filter_key = partial(is_exact_match, term=term)
filter_key = partial(utils.terms_match, term=term)
subset = filter(filter_key, subset)

subset = sorted(subset, key=self.sortkey())
Expand Down
80 changes: 80 additions & 0 deletions seantis/dir/events/tests/test_catalog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import transaction

from datetime import date, datetime
from seantis.dir.events import dates
from seantis.dir.events.tests import IntegrationTestCase

from seantis.dir.events.catalog import (
LazyList,
EventOrderIndex,
attach_reindex_to_transaction,
ReindexDataManager,
)

from mock import Mock


class TestCatalog(IntegrationTestCase):

def test_export_with_categories(self):

self.login_testuser()

events = [
self.create_event(title='1', cat1=['a'], cat2=['1']),
self.create_event(title='2', cat1=['a', 'b'], cat2=['2']),
self.create_event(title='3', cat1=['b', 'c'], cat2=['2', '3']),
self.create_event(title='4', cat1=['c'], cat2=['1', '3'])
]
for event in events:
event.submit()
event.publish()
transaction.commit()

def _get(cat1=-1, cat2=-1):
term = {}
if cat1 != -1:
term['cat1'] = cat1
if cat2 != -1:
term['cat2'] = cat2

return sorted([s.title for s in self.catalog.export(term=term)])

self.assertEquals(_get(cat1=None), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1=[]), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1=''), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1='a'), ['1', '2'])

self.assertEquals(_get(cat1=['a']), ['1', '2'])
self.assertEquals(_get(cat1=['b']), ['2', '3'])
self.assertEquals(_get(cat1=['c']), ['3', '4'])
self.assertEquals(_get(cat1=['a', 'b']), ['1', '2', '3'])
self.assertEquals(_get(cat1=['a', 'c']), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1=['b', 'c']), ['2', '3', '4'])
self.assertEquals(_get(cat1=['a', 'b', 'c']), ['1', '2', '3', '4'])

self.assertEquals(_get(cat2=None), ['1', '2', '3', '4'])
self.assertEquals(_get(cat2=[]), ['1', '2', '3', '4'])
self.assertEquals(_get(cat2=''), ['1', '2', '3', '4'])
self.assertEquals(_get(cat2='1'), ['1', '4'])

self.assertEquals(_get(cat2=['1']), ['1', '4'])
self.assertEquals(_get(cat2=['2']), ['2', '3'])
self.assertEquals(_get(cat2=['3']), ['3', '4'])
self.assertEquals(_get(cat2=['1', '2']), ['1', '2', '3', '4'])
self.assertEquals(_get(cat2=['1', '3']), ['1', '3', '4'])
self.assertEquals(_get(cat2=['2', '3']), ['2', '3', '4'])
self.assertEquals(_get(cat2=['1', '2', '3']), ['1', '2', '3', '4'])

self.assertEquals(_get(cat1=None, cat2=None), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1=[], cat2=[]), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1='', cat2=''), ['1', '2', '3', '4'])
self.assertEquals(_get(cat1='a', cat2='1'), ['1'])

self.assertEquals(_get(cat1=['a', 'c'], cat2=['1']), ['1', '4'])
self.assertEquals(_get(cat1=['a'], cat2=['2', '3']), ['2'])
self.assertEquals(_get(cat1=['b', 'c'], cat2=['3', '4']), ['3', '4'])

self.directory.manage_delObjects(['1', '2', '3', '4'])
self.portal.manage_delObjects([self.directory.id])
transaction.commit()
45 changes: 36 additions & 9 deletions seantis/dir/events/utils.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
import functools
import time
import json
import pytz
import string
import time

from collections import defaultdict
from collective.geo.geographer.interfaces import IGeoreferenced
from datetime import datetime

from plone.namedfile import NamedFile
from Products.CMFCore.utils import getToolByName

from seantis.dir.base.interfaces import IDirectoryCatalog

from zope import i18n
from zope.component import getMultiAdapter, getAdapter
from zope.component.hooks import getSite
from zope import i18n

from plone.namedfile import NamedFile

from collective.geo.geographer.interfaces import IGeoreferenced


def get_catalog(directory):
Expand Down Expand Up @@ -162,3 +159,33 @@ def wrapper(*args, **kwargs):
return url

return wrapper


def terms_match(item, term):
""" Returns if an item matches the given terms: At least one item of each
given categories must be present. """

item_categories = item.categories
if callable(item.categories):
item_categories = item.categories()

categories = defaultdict(list)
for category, label, value in item_categories:
if isinstance(value, basestring):
categories[category].extend((value.strip(), ))
else:
categories[category].extend(map(string.strip, value))

Found = True
for key, term_values in term.items():

if not term_values or term_values == '!empty':
continue

if isinstance(term_values, basestring):
term_values = (term_values, )

if not set(categories[key]) & set(term_values):
return False

return True
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def get_long_description():
'collective.dexteritytextindexer',
'collective.z3cform.mapwidget',
'collective.js.underscore',
'seantis.dir.base>=1.7',
'seantis.dir.base>=1.8.1',
'seantis.plonetools>=0.16',
'zope.proxy',
'pytz',
Expand Down

0 comments on commit 2ef4b91

Please sign in to comment.