You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

facets.py 3.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.conf import settings
  2. from purl import URL
  3. from six.moves import map
  4. def facet_data(request, form, results): # noqa (too complex (10))
  5. """
  6. Convert Haystack's facet data into a more useful datastructure that
  7. templates can use without having to manually construct URLs
  8. """
  9. facet_data = {}
  10. if not results:
  11. return facet_data
  12. base_url = URL(request.get_full_path())
  13. facet_counts = results.facet_counts()
  14. # Field facets
  15. valid_facets = [f for f in form.selected_facets if ':' in f]
  16. selected = dict(
  17. map(lambda x: x.split(':', 1), valid_facets))
  18. for key, facet in settings.OSCAR_SEARCH_FACETS['fields'].items():
  19. facet_data[key] = {
  20. 'name': facet['name'],
  21. 'results': []}
  22. for name, count in facet_counts['fields'][key]:
  23. # Ignore zero-count facets for field
  24. if count == 0:
  25. continue
  26. field_filter = '%s_exact' % facet['field']
  27. datum = {
  28. 'name': name,
  29. 'count': count}
  30. if selected.get(field_filter, None) == name:
  31. # This filter is selected - build the 'deselect' URL
  32. datum['selected'] = True
  33. url = base_url.remove_query_param(
  34. 'selected_facets', '%s:%s' % (
  35. field_filter, name))
  36. # Don't carry through pagination params
  37. if url.has_query_param('page'):
  38. url = url.remove_query_param('page')
  39. datum['deselect_url'] = url.as_string()
  40. else:
  41. # This filter is not selected - built the 'select' URL
  42. datum['selected'] = False
  43. url = base_url.append_query_param(
  44. 'selected_facets', '%s:%s' % (
  45. field_filter, name))
  46. # Don't carry through pagination params
  47. if url.has_query_param('page'):
  48. url = url.remove_query_param('page')
  49. datum['select_url'] = url.as_string()
  50. facet_data[key]['results'].append(datum)
  51. # Query facets
  52. for key, facet in settings.OSCAR_SEARCH_FACETS['queries'].items():
  53. facet_data[key] = {
  54. 'name': facet['name'],
  55. 'results': []}
  56. for name, query in facet['queries']:
  57. field_filter = '%s_exact' % facet['field']
  58. match = '%s_exact:%s' % (facet['field'], query)
  59. if match not in facet_counts['queries']:
  60. datum = {
  61. 'name': name,
  62. 'count': 0,
  63. }
  64. else:
  65. datum = {
  66. 'name': name,
  67. 'count': facet_counts['queries'][match],
  68. }
  69. if selected.get(field_filter, None) == query:
  70. # Selected
  71. datum['selected'] = True
  72. url = base_url.remove_query_param(
  73. 'selected_facets', match)
  74. datum['deselect_url'] = url.as_string()
  75. else:
  76. datum['selected'] = False
  77. url = base_url.append_query_param(
  78. 'selected_facets', match)
  79. datum['select_url'] = url.as_string()
  80. facet_data[key]['results'].append(datum)
  81. return facet_data