eea.facetednavigation 16.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. eea/facetednavigation/README.txt +34 -0
  2. eea/facetednavigation/__init__.py +10 -0
  3. eea/facetednavigation/browser/__init__.py +2 -0
  4. eea/facetednavigation/browser/app/__init__.py +2 -0
  5. eea/facetednavigation/browser/app/catalog.py +43 -0
  6. eea/facetednavigation/browser/app/configure.py +307 -0
  7. eea/facetednavigation/browser/app/counter.py +77 -0
  8. eea/facetednavigation/browser/app/error.py +28 -0
  9. eea/facetednavigation/browser/app/exportimport.py +85 -0
  10. eea/facetednavigation/browser/app/query.py +209 -0
  11. eea/facetednavigation/browser/app/schema.py +39 -0
  12. eea/facetednavigation/browser/app/view.py +169 -0
  13. eea/facetednavigation/browser/configure.zcml +155 -0
  14. eea/facetednavigation/browser/interfaces.py +52 -0
  15. eea/facetednavigation/browser/javascript/edit.js +1198 -0
  16. eea/facetednavigation/browser/javascript/expand.js +107 -0
  17. eea/facetednavigation/browser/javascript/independent.js +25 -0
  18. eea/facetednavigation/browser/javascript/view.js +551 -0
  19. eea/facetednavigation/browser/static/30px.png +0 -0
  20. eea/facetednavigation/browser/static/32px.png +0 -0
  21. eea/facetednavigation/browser/static/README.md +6 -0
  22. eea/facetednavigation/browser/static/ajax-loader-small.gif +0 -0
  23. eea/facetednavigation/browser/static/ajax-loader.gif +0 -0
  24. eea/facetednavigation/browser/static/faceted-edit.css +325 -0
  25. eea/facetednavigation/browser/static/faceted-edit.css.map +1 -0
  26. eea/facetednavigation/browser/static/faceted-edit.min.css +2 -0
  27. eea/facetednavigation/browser/static/faceted-edit.min.css.map +1 -0
  28. eea/facetednavigation/browser/static/faceted-edit.min.js +1 -0
  29. eea/facetednavigation/browser/static/faceted-jquery.css +4117 -0
  30. eea/facetednavigation/browser/static/faceted-jquery.css.map +1 -0
  31. eea/facetednavigation/browser/static/faceted-jquery.min.css +6 -0
  32. eea/facetednavigation/browser/static/faceted-jquery.min.css.map +1 -0
  33. eea/facetednavigation/browser/static/faceted-jquery.min.js +2 -0
  34. eea/facetednavigation/browser/static/faceted-jquery.min.js.LICENSE.txt +263 -0
  35. eea/facetednavigation/browser/static/faceted-view.css +447 -0
  36. eea/facetednavigation/browser/static/faceted-view.css.map +1 -0
  37. eea/facetednavigation/browser/static/faceted-view.min.css +2 -0
  38. eea/facetednavigation/browser/static/faceted-view.min.css.map +1 -0
  39. eea/facetednavigation/browser/static/faceted-view.min.js +1 -0
  40. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-bold-webfont.eot +0 -0
  41. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-bold-webfont.svg +2377 -0
  42. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-bold-webfont.ttf +0 -0
  43. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-bold-webfont.woff +0 -0
  44. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-extralight-webfont.eot +0 -0
  45. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-extralight-webfont.svg +2410 -0
  46. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-extralight-webfont.ttf +0 -0
  47. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-extralight-webfont.woff +0 -0
  48. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-regular-webfont.eot +0 -0
  49. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-regular-webfont.svg +2725 -0
  50. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-regular-webfont.ttf +0 -0
  51. eea/facetednavigation/browser/static/fonts/titillium/titilliumweb-regular-webfont.woff +0 -0
  52. eea/facetednavigation/browser/static/hide.png +0 -0
  53. eea/facetednavigation/browser/static/images/ui-icons_444444_256x240.png +0 -0
  54. eea/facetednavigation/browser/static/images/ui-icons_555555_256x240.png +0 -0
  55. eea/facetednavigation/browser/static/images/ui-icons_777620_256x240.png +0 -0
  56. eea/facetednavigation/browser/static/images/ui-icons_777777_256x240.png +0 -0
  57. eea/facetednavigation/browser/static/images/ui-icons_cc0000_256x240.png +0 -0
  58. eea/facetednavigation/browser/static/images/ui-icons_ffffff_256x240.png +0 -0
  59. eea/facetednavigation/browser/static/select2-spinner.gif +0 -0
  60. eea/facetednavigation/browser/static/select2.png +0 -0
  61. eea/facetednavigation/browser/static/select2x2.png +0 -0
  62. eea/facetednavigation/browser/static/show.png +0 -0
  63. eea/facetednavigation/browser/static/throbber.gif +0 -0
  64. eea/facetednavigation/browser/stylesheets/edit.scss +383 -0
  65. eea/facetednavigation/browser/stylesheets/view.scss +126 -0
  66. eea/facetednavigation/browser/template/configure.pt +180 -0
  67. eea/facetednavigation/browser/template/counter.pt +0 -0
  68. eea/facetednavigation/browser/template/default.xml +54 -0
  69. eea/facetednavigation/browser/template/error.pt +15 -0
  70. eea/facetednavigation/browser/template/macros.pt +59 -0
  71. eea/facetednavigation/browser/template/query.pt +14 -0
  72. eea/facetednavigation/browser/template/simple_view.pt +9 -0
  73. eea/facetednavigation/browser/template/view.pt +34 -0
  74. eea/facetednavigation/browser/template/widgets.pt +57 -0
  75. eea/facetednavigation/caching/__init__.py +24 -0
  76. eea/facetednavigation/caching/cache.py +64 -0
  77. eea/facetednavigation/caching/configure.zcml +17 -0
  78. eea/facetednavigation/caching/nocache.py +24 -0
  79. eea/facetednavigation/config.py +6 -0
  80. eea/facetednavigation/configure.zcml +29 -0
  81. eea/facetednavigation/criteria/__init__.py +2 -0
  82. eea/facetednavigation/criteria/configure.zcml +12 -0
  83. eea/facetednavigation/criteria/handler.py +291 -0
  84. eea/facetednavigation/criteria/interfaces.py +7 -0
  85. eea/facetednavigation/criteria/utils.py +11 -0
  86. eea/facetednavigation/data/vocabularies/faceted_sortorder.vdex +115 -0
  87. eea/facetednavigation/docs/browser.txt +294 -0
  88. eea/facetednavigation/docs/counter.txt +76 -0
  89. eea/facetednavigation/docs/criteria.txt +134 -0
  90. eea/facetednavigation/docs/exportimport.txt +544 -0
  91. eea/facetednavigation/docs/facetednavigation.txt +113 -0
  92. eea/facetednavigation/docs/solr.txt +66 -0
  93. eea/facetednavigation/docs/syndication.txt +36 -0
  94. eea/facetednavigation/docs/unicode.txt +224 -0
  95. eea/facetednavigation/docs/versions.txt +175 -0
  96. eea/facetednavigation/docs/vocabularies.txt +69 -0
  97. eea/facetednavigation/docs/widgets.txt +10 -0
  98. eea/facetednavigation/docs/wrapper.txt +87 -0
  99. eea/facetednavigation/events.py +56 -0
  100. eea/facetednavigation/exportimport/__init__.py +2 -0
  101. eea/facetednavigation/exportimport/configure.zcml +27 -0
  102. eea/facetednavigation/exportimport/criteria.py +103 -0
  103. eea/facetednavigation/exportimport/criterion.py +75 -0
  104. eea/facetednavigation/exportimport/faceted.py +35 -0
  105. eea/facetednavigation/indexes/__init__.py +2 -0
  106. eea/facetednavigation/indexes/configure.zcml +8 -0
  107. eea/facetednavigation/indexes/language/__init__.py +2 -0
  108. eea/facetednavigation/indexes/language/adapter.py +77 -0
  109. eea/facetednavigation/indexes/language/configure.zcml +13 -0
  110. eea/facetednavigation/indexes/language/interfaces.py +7 -0
  111. eea/facetednavigation/interfaces.py +109 -0
  112. eea/facetednavigation/layout/__init__.py +2 -0
  113. eea/facetednavigation/layout/configure.zcml +38 -0
  114. eea/facetednavigation/layout/events.py +63 -0
  115. eea/facetednavigation/layout/interfaces.py +21 -0
  116. eea/facetednavigation/layout/layout.py +95 -0
  117. eea/facetednavigation/layout/menu.py +77 -0
  118. eea/facetednavigation/layout/overrides.zcml +13 -0
  119. eea/facetednavigation/locales/bg/LC_MESSAGES/eea.mo +0 -0
  120. eea/facetednavigation/locales/bg/LC_MESSAGES/eea.po +1179 -0
  121. eea/facetednavigation/locales/bg/LC_MESSAGES/plone.mo +0 -0
  122. eea/facetednavigation/locales/bg/LC_MESSAGES/plone.po +37 -0
  123. eea/facetednavigation/locales/ca/LC_MESSAGES/eea.mo +0 -0
  124. eea/facetednavigation/locales/ca/LC_MESSAGES/eea.po +1180 -0
  125. eea/facetednavigation/locales/ca/LC_MESSAGES/plone.mo +0 -0
  126. eea/facetednavigation/locales/ca/LC_MESSAGES/plone.po +38 -0
  127. eea/facetednavigation/locales/cs/LC_MESSAGES/eea.mo +0 -0
  128. eea/facetednavigation/locales/cs/LC_MESSAGES/eea.po +1179 -0
  129. eea/facetednavigation/locales/cs/LC_MESSAGES/plone.mo +0 -0
  130. eea/facetednavigation/locales/cs/LC_MESSAGES/plone.po +37 -0
  131. eea/facetednavigation/locales/da/LC_MESSAGES/eea.mo +0 -0
  132. eea/facetednavigation/locales/da/LC_MESSAGES/eea.po +1179 -0
  133. eea/facetednavigation/locales/da/LC_MESSAGES/plone.mo +0 -0
  134. eea/facetednavigation/locales/da/LC_MESSAGES/plone.po +37 -0
  135. eea/facetednavigation/locales/de/LC_MESSAGES/eea.mo +0 -0
  136. eea/facetednavigation/locales/de/LC_MESSAGES/eea.po +1236 -0
  137. eea/facetednavigation/locales/de/LC_MESSAGES/plone.mo +0 -0
  138. eea/facetednavigation/locales/de/LC_MESSAGES/plone.po +37 -0
  139. eea/facetednavigation/locales/eea.pot +1182 -0
  140. eea/facetednavigation/locales/el/LC_MESSAGES/eea.mo +0 -0
  141. eea/facetednavigation/locales/el/LC_MESSAGES/eea.po +1179 -0
  142. eea/facetednavigation/locales/el/LC_MESSAGES/plone.mo +0 -0
  143. eea/facetednavigation/locales/el/LC_MESSAGES/plone.po +37 -0
  144. eea/facetednavigation/locales/en/LC_MESSAGES/eea.mo +0 -0
  145. eea/facetednavigation/locales/en/LC_MESSAGES/eea.po +1179 -0
  146. eea/facetednavigation/locales/en/LC_MESSAGES/plone.mo +0 -0
  147. eea/facetednavigation/locales/en/LC_MESSAGES/plone.po +37 -0
  148. eea/facetednavigation/locales/es/LC_MESSAGES/eea.mo +0 -0
  149. eea/facetednavigation/locales/es/LC_MESSAGES/eea.po +1247 -0
  150. eea/facetednavigation/locales/es/LC_MESSAGES/plone.mo +0 -0
  151. eea/facetednavigation/locales/es/LC_MESSAGES/plone.po +39 -0
  152. eea/facetednavigation/locales/et/LC_MESSAGES/eea.mo +0 -0
  153. eea/facetednavigation/locales/et/LC_MESSAGES/eea.po +1179 -0
  154. eea/facetednavigation/locales/et/LC_MESSAGES/plone.mo +0 -0
  155. eea/facetednavigation/locales/et/LC_MESSAGES/plone.po +37 -0
  156. eea/facetednavigation/locales/eu/LC_MESSAGES/eea.mo +0 -0
  157. eea/facetednavigation/locales/eu/LC_MESSAGES/eea.po +1247 -0
  158. eea/facetednavigation/locales/eu/LC_MESSAGES/plone.mo +0 -0
  159. eea/facetednavigation/locales/eu/LC_MESSAGES/plone.po +37 -0
  160. eea/facetednavigation/locales/fi/LC_MESSAGES/eea.mo +0 -0
  161. eea/facetednavigation/locales/fi/LC_MESSAGES/eea.po +1179 -0
  162. eea/facetednavigation/locales/fi/LC_MESSAGES/plone.mo +0 -0
  163. eea/facetednavigation/locales/fi/LC_MESSAGES/plone.po +37 -0
  164. eea/facetednavigation/locales/fr/LC_MESSAGES/eea.mo +0 -0
  165. eea/facetednavigation/locales/fr/LC_MESSAGES/eea.po +1247 -0
  166. eea/facetednavigation/locales/fr/LC_MESSAGES/plone.mo +0 -0
  167. eea/facetednavigation/locales/fr/LC_MESSAGES/plone.po +37 -0
  168. eea/facetednavigation/locales/hr/LC_MESSAGES/eea.mo +0 -0
  169. eea/facetednavigation/locales/hr/LC_MESSAGES/eea.po +1182 -0
  170. eea/facetednavigation/locales/hr/LC_MESSAGES/plone.mo +0 -0
  171. eea/facetednavigation/locales/hr/LC_MESSAGES/plone.po +37 -0
  172. eea/facetednavigation/locales/hu/LC_MESSAGES/eea.mo +0 -0
  173. eea/facetednavigation/locales/hu/LC_MESSAGES/eea.po +1179 -0
  174. eea/facetednavigation/locales/hu/LC_MESSAGES/plone.mo +0 -0
  175. eea/facetednavigation/locales/hu/LC_MESSAGES/plone.po +37 -0
  176. eea/facetednavigation/locales/is/LC_MESSAGES/eea.mo +0 -0
  177. eea/facetednavigation/locales/is/LC_MESSAGES/eea.po +1179 -0
  178. eea/facetednavigation/locales/is/LC_MESSAGES/plone.mo +0 -0
  179. eea/facetednavigation/locales/is/LC_MESSAGES/plone.po +37 -0
  180. eea/facetednavigation/locales/it/LC_MESSAGES/eea.mo +0 -0
  181. eea/facetednavigation/locales/it/LC_MESSAGES/eea.po +1242 -0
  182. eea/facetednavigation/locales/it/LC_MESSAGES/plone.mo +0 -0
  183. eea/facetednavigation/locales/it/LC_MESSAGES/plone.po +37 -0
  184. eea/facetednavigation/locales/kl/LC_MESSAGES/eea.mo +0 -0
  185. eea/facetednavigation/locales/kl/LC_MESSAGES/eea.po +1179 -0
  186. eea/facetednavigation/locales/kl/LC_MESSAGES/plone.mo +0 -0
  187. eea/facetednavigation/locales/kl/LC_MESSAGES/plone.po +37 -0
  188. eea/facetednavigation/locales/lt/LC_MESSAGES/eea.mo +0 -0
  189. eea/facetednavigation/locales/lt/LC_MESSAGES/eea.po +1179 -0
  190. eea/facetednavigation/locales/lt/LC_MESSAGES/plone.mo +0 -0
  191. eea/facetednavigation/locales/lt/LC_MESSAGES/plone.po +37 -0
  192. eea/facetednavigation/locales/lv/LC_MESSAGES/eea.mo +0 -0
  193. eea/facetednavigation/locales/lv/LC_MESSAGES/eea.po +1179 -0
  194. eea/facetednavigation/locales/lv/LC_MESSAGES/plone.mo +0 -0
  195. eea/facetednavigation/locales/lv/LC_MESSAGES/plone.po +37 -0
  196. eea/facetednavigation/locales/mt/LC_MESSAGES/eea.mo +0 -0
  197. eea/facetednavigation/locales/mt/LC_MESSAGES/eea.po +1179 -0
  198. eea/facetednavigation/locales/mt/LC_MESSAGES/plone.mo +0 -0
  199. eea/facetednavigation/locales/mt/LC_MESSAGES/plone.po +37 -0
  200. eea/facetednavigation/locales/nl/LC_MESSAGES/eea.mo +0 -0
  201. eea/facetednavigation/locales/nl/LC_MESSAGES/eea.po +1179 -0
  202. eea/facetednavigation/locales/nl/LC_MESSAGES/plone.mo +0 -0
  203. eea/facetednavigation/locales/nl/LC_MESSAGES/plone.po +37 -0
  204. eea/facetednavigation/locales/no/LC_MESSAGES/eea.mo +0 -0
  205. eea/facetednavigation/locales/no/LC_MESSAGES/eea.po +1179 -0
  206. eea/facetednavigation/locales/no/LC_MESSAGES/plone.mo +0 -0
  207. eea/facetednavigation/locales/no/LC_MESSAGES/plone.po +37 -0
  208. eea/facetednavigation/locales/pl/LC_MESSAGES/eea.mo +0 -0
  209. eea/facetednavigation/locales/pl/LC_MESSAGES/eea.po +1242 -0
  210. eea/facetednavigation/locales/pl/LC_MESSAGES/plone.mo +0 -0
  211. eea/facetednavigation/locales/pl/LC_MESSAGES/plone.po +37 -0
  212. eea/facetednavigation/locales/plone-manual.pot +38 -0
  213. eea/facetednavigation/locales/pt/LC_MESSAGES/eea.mo +0 -0
  214. eea/facetednavigation/locales/pt/LC_MESSAGES/eea.po +1179 -0
  215. eea/facetednavigation/locales/pt/LC_MESSAGES/plone.mo +0 -0
  216. eea/facetednavigation/locales/pt/LC_MESSAGES/plone.po +37 -0
  217. eea/facetednavigation/locales/pt_BR/LC_MESSAGES/eea.mo +0 -0
  218. eea/facetednavigation/locales/pt_BR/LC_MESSAGES/eea.po +1180 -0
  219. eea/facetednavigation/locales/pt_BR/LC_MESSAGES/plone.mo +0 -0
  220. eea/facetednavigation/locales/pt_BR/LC_MESSAGES/plone.po +37 -0
  221. eea/facetednavigation/locales/ro/LC_MESSAGES/eea.mo +0 -0
  222. eea/facetednavigation/locales/ro/LC_MESSAGES/eea.po +1244 -0
  223. eea/facetednavigation/locales/ro/LC_MESSAGES/plone.mo +0 -0
  224. eea/facetednavigation/locales/ro/LC_MESSAGES/plone.po +37 -0
  225. eea/facetednavigation/locales/ru/LC_MESSAGES/eea.mo +0 -0
  226. eea/facetednavigation/locales/ru/LC_MESSAGES/eea.po +1179 -0
  227. eea/facetednavigation/locales/ru/LC_MESSAGES/plone.mo +0 -0
  228. eea/facetednavigation/locales/ru/LC_MESSAGES/plone.po +37 -0
  229. eea/facetednavigation/locales/sk/LC_MESSAGES/eea.mo +0 -0
  230. eea/facetednavigation/locales/sk/LC_MESSAGES/eea.po +1179 -0
  231. eea/facetednavigation/locales/sk/LC_MESSAGES/plone.mo +0 -0
  232. eea/facetednavigation/locales/sk/LC_MESSAGES/plone.po +37 -0
  233. eea/facetednavigation/locales/sl/LC_MESSAGES/eea.mo +0 -0
  234. eea/facetednavigation/locales/sl/LC_MESSAGES/eea.po +1179 -0
  235. eea/facetednavigation/locales/sl/LC_MESSAGES/plone.mo +0 -0
  236. eea/facetednavigation/locales/sl/LC_MESSAGES/plone.po +37 -0
  237. eea/facetednavigation/locales/sv/LC_MESSAGES/eea.mo +0 -0
  238. eea/facetednavigation/locales/sv/LC_MESSAGES/eea.po +1179 -0
  239. eea/facetednavigation/locales/sv/LC_MESSAGES/plone.mo +0 -0
  240. eea/facetednavigation/locales/sv/LC_MESSAGES/plone.po +37 -0
  241. eea/facetednavigation/locales/tr/LC_MESSAGES/eea.mo +0 -0
  242. eea/facetednavigation/locales/tr/LC_MESSAGES/eea.po +1179 -0
  243. eea/facetednavigation/locales/tr/LC_MESSAGES/plone.mo +0 -0
  244. eea/facetednavigation/locales/tr/LC_MESSAGES/plone.po +37 -0
  245. eea/facetednavigation/locales/update.sh +6 -0
  246. eea/facetednavigation/locales/zh_TW/LC_MESSAGES/eea.mo +0 -0
  247. eea/facetednavigation/locales/zh_TW/LC_MESSAGES/eea.po +1243 -0
  248. eea/facetednavigation/locales/zh_TW/LC_MESSAGES/plone.mo +0 -0
  249. eea/facetednavigation/locales/zh_TW/LC_MESSAGES/plone.po +37 -0
  250. eea/facetednavigation/meta.zcml +22 -0
  251. eea/facetednavigation/overrides.zcml +11 -0
  252. eea/facetednavigation/permissions.zcml +12 -0
  253. eea/facetednavigation/plonex.py +36 -0
  254. eea/facetednavigation/profiles/default/actions.xml +67 -0
  255. eea/facetednavigation/profiles/default/eea.facetednavigation.txt +0 -0
  256. eea/facetednavigation/profiles/default/metadata.xml +4 -0
  257. eea/facetednavigation/profiles/default/registry.xml +48 -0
  258. eea/facetednavigation/profiles/default/rolemap.xml +11 -0
  259. eea/facetednavigation/profiles/uninstall/actions.xml +11 -0
  260. eea/facetednavigation/profiles/uninstall/eea.facetednavigation.txt +0 -0
  261. eea/facetednavigation/profiles/uninstall/registry.xml +8 -0
  262. eea/facetednavigation/profiles.zcml +42 -0
  263. eea/facetednavigation/search/__init__.py +2 -0
  264. eea/facetednavigation/search/catalog.py +84 -0
  265. eea/facetednavigation/search/configure.zcml +8 -0
  266. eea/facetednavigation/search/interfaces.py +10 -0
  267. eea/facetednavigation/settings/__init__.py +2 -0
  268. eea/facetednavigation/settings/configure.zcml +34 -0
  269. eea/facetednavigation/settings/interfaces.py +52 -0
  270. eea/facetednavigation/settings/menu.py +170 -0
  271. eea/facetednavigation/setuphandlers.py +92 -0
  272. eea/facetednavigation/subtypes/__init__.py +2 -0
  273. eea/facetednavigation/subtypes/configure.zcml +61 -0
  274. eea/facetednavigation/subtypes/interfaces.py +45 -0
  275. eea/facetednavigation/subtypes/subtyper.py +130 -0
  276. eea/facetednavigation/subtypes/wrapper.py +39 -0
  277. eea/facetednavigation/syndication/__init__.py +2 -0
  278. eea/facetednavigation/syndication/configure.zcml +13 -0
  279. eea/facetednavigation/syndication/feed.py +19 -0
  280. eea/facetednavigation/tests/__init__.py +2 -0
  281. eea/facetednavigation/tests/autocomplete.py +33 -0
  282. eea/facetednavigation/tests/autocomplete.zcml +15 -0
  283. eea/facetednavigation/tests/base.py +49 -0
  284. eea/facetednavigation/tests/configure.zcml +17 -0
  285. eea/facetednavigation/tests/data/criteria_with_purge_false.xml +15 -0
  286. eea/facetednavigation/tests/data/criteria_with_purge_true.xml +15 -0
  287. eea/facetednavigation/tests/data/criterion_with_purge_false.xml +15 -0
  288. eea/facetednavigation/tests/data/criterion_with_purge_true.xml +15 -0
  289. eea/facetednavigation/tests/data/exportimport.xml +31 -0
  290. eea/facetednavigation/tests/profiles/testing/types/Document.xml +6 -0
  291. eea/facetednavigation/tests/profiles/testing/types.xml +4 -0
  292. eea/facetednavigation/tests/test_bundles.py +42 -0
  293. eea/facetednavigation/tests/test_doctests.py +139 -0
  294. eea/facetednavigation/tests/utils.py +39 -0
  295. eea/facetednavigation/upgrades/__init__.py +2 -0
  296. eea/facetednavigation/upgrades/configure.zcml +28 -0
  297. eea/facetednavigation/upgrades/evolve165.py +13 -0
  298. eea/facetednavigation/utils.py +66 -0
  299. eea/facetednavigation/version.txt +1 -0
  300. eea/facetednavigation/versions/__init__.py +2 -0
  301. eea/facetednavigation/versions/browser.py +78 -0
  302. eea/facetednavigation/versions/configure.zcml +20 -0
  303. eea/facetednavigation/versions/events.py +16 -0
  304. eea/facetednavigation/versions/interfaces.py +15 -0
  305. eea/facetednavigation/views/__init__.py +2 -0
  306. eea/facetednavigation/views/configure.zcml +41 -0
  307. eea/facetednavigation/views/example/__init__.py +2 -0
  308. eea/facetednavigation/views/example/configure.zcml +24 -0
  309. eea/facetednavigation/views/example/summary.pt +74 -0
  310. eea/facetednavigation/views/example/summary.py +20 -0
  311. eea/facetednavigation/views/interfaces.py +7 -0
  312. eea/facetednavigation/views/meta.py +63 -0
  313. eea/facetednavigation/views/preview-item.pt +10 -0
  314. eea/facetednavigation/views/preview-items.pt +38 -0
  315. eea/facetednavigation/views/preview.py +74 -0
  316. eea/facetednavigation/vocabularies/__init__.py +2 -0
  317. eea/facetednavigation/vocabularies/autocomplete.py +44 -0
  318. eea/facetednavigation/vocabularies/catalog.py +204 -0
  319. eea/facetednavigation/vocabularies/configure.zcml +101 -0
  320. eea/facetednavigation/vocabularies/faceted.py +62 -0
  321. eea/facetednavigation/vocabularies/portal.py +55 -0
  322. eea/facetednavigation/vocabularies/position.py +23 -0
  323. eea/facetednavigation/vocabularies/section.py +19 -0
  324. eea/facetednavigation/vocabularies/simple.py +40 -0
  325. eea/facetednavigation/vocabularies/types.py +23 -0
  326. eea/facetednavigation/vocabularies/utils.py +10 -0
  327. eea/facetednavigation/widgets/__init__.py +12 -0
  328. eea/facetednavigation/widgets/alphabetic/__init__.py +2 -0
  329. eea/facetednavigation/widgets/alphabetic/adapters.py +48 -0
  330. eea/facetednavigation/widgets/alphabetic/alphabets.py +1042 -0
  331. eea/facetednavigation/widgets/alphabetic/configure.zcml +19 -0
  332. eea/facetednavigation/widgets/alphabetic/edit.js +80 -0
  333. eea/facetednavigation/widgets/alphabetic/edit.scss +0 -0
  334. eea/facetednavigation/widgets/alphabetic/interfaces.py +44 -0
  335. eea/facetednavigation/widgets/alphabetic/tests.py +32 -0
  336. eea/facetednavigation/widgets/alphabetic/view.js +229 -0
  337. eea/facetednavigation/widgets/alphabetic/view.scss +47 -0
  338. eea/facetednavigation/widgets/alphabetic/widget.pt +45 -0
  339. eea/facetednavigation/widgets/alphabetic/widget.py +64 -0
  340. eea/facetednavigation/widgets/alphabetic/widget.txt +104 -0
  341. eea/facetednavigation/widgets/autocomplete/__init__.py +2 -0
  342. eea/facetednavigation/widgets/autocomplete/configure.zcml +20 -0
  343. eea/facetednavigation/widgets/autocomplete/edit.js +52 -0
  344. eea/facetednavigation/widgets/autocomplete/edit.scss +0 -0
  345. eea/facetednavigation/widgets/autocomplete/interfaces.py +77 -0
  346. eea/facetednavigation/widgets/autocomplete/tests.py +32 -0
  347. eea/facetednavigation/widgets/autocomplete/view.js +245 -0
  348. eea/facetednavigation/widgets/autocomplete/view.scss +52 -0
  349. eea/facetednavigation/widgets/autocomplete/widget.pt +63 -0
  350. eea/facetednavigation/widgets/autocomplete/widget.py +117 -0
  351. eea/facetednavigation/widgets/autocomplete/widget.txt +142 -0
  352. eea/facetednavigation/widgets/boolean/__init__.py +2 -0
  353. eea/facetednavigation/widgets/boolean/configure.zcml +12 -0
  354. eea/facetednavigation/widgets/boolean/interfaces.py +48 -0
  355. eea/facetednavigation/widgets/boolean/widget.pt +46 -0
  356. eea/facetednavigation/widgets/boolean/widget.py +56 -0
  357. eea/facetednavigation/widgets/checkbox/__init__.py +2 -0
  358. eea/facetednavigation/widgets/checkbox/configure.zcml +12 -0
  359. eea/facetednavigation/widgets/checkbox/edit.js +115 -0
  360. eea/facetednavigation/widgets/checkbox/edit.scss +0 -0
  361. eea/facetednavigation/widgets/checkbox/interfaces.py +104 -0
  362. eea/facetednavigation/widgets/checkbox/view.js +319 -0
  363. eea/facetednavigation/widgets/checkbox/view.scss +59 -0
  364. eea/facetednavigation/widgets/checkbox/widget.pt +75 -0
  365. eea/facetednavigation/widgets/checkbox/widget.py +102 -0
  366. eea/facetednavigation/widgets/configure.zcml +30 -0
  367. eea/facetednavigation/widgets/criteria/__init__.py +2 -0
  368. eea/facetednavigation/widgets/criteria/configure.zcml +12 -0
  369. eea/facetednavigation/widgets/criteria/edit.js +0 -0
  370. eea/facetednavigation/widgets/criteria/edit.scss +0 -0
  371. eea/facetednavigation/widgets/criteria/interfaces.py +35 -0
  372. eea/facetednavigation/widgets/criteria/view.js +123 -0
  373. eea/facetednavigation/widgets/criteria/view.scss +61 -0
  374. eea/facetednavigation/widgets/criteria/widget.pt +36 -0
  375. eea/facetednavigation/widgets/criteria/widget.py +17 -0
  376. eea/facetednavigation/widgets/date/__init__.py +2 -0
  377. eea/facetednavigation/widgets/date/configure.zcml +12 -0
  378. eea/facetednavigation/widgets/date/edit.js +89 -0
  379. eea/facetednavigation/widgets/date/edit.scss +0 -0
  380. eea/facetednavigation/widgets/date/interfaces.py +36 -0
  381. eea/facetednavigation/widgets/date/tests.py +32 -0
  382. eea/facetednavigation/widgets/date/view.js +195 -0
  383. eea/facetednavigation/widgets/date/view.scss +10 -0
  384. eea/facetednavigation/widgets/date/widget.pt +40 -0
  385. eea/facetednavigation/widgets/date/widget.py +166 -0
  386. eea/facetednavigation/widgets/date/widget.txt +225 -0
  387. eea/facetednavigation/widgets/daterange/__init__.py +2 -0
  388. eea/facetednavigation/widgets/daterange/configure.zcml +12 -0
  389. eea/facetednavigation/widgets/daterange/edit.js +114 -0
  390. eea/facetednavigation/widgets/daterange/edit.scss +0 -0
  391. eea/facetednavigation/widgets/daterange/interfaces.py +102 -0
  392. eea/facetednavigation/widgets/daterange/tests.py +32 -0
  393. eea/facetednavigation/widgets/daterange/utils.py +117 -0
  394. eea/facetednavigation/widgets/daterange/view.js +308 -0
  395. eea/facetednavigation/widgets/daterange/view.scss +14 -0
  396. eea/facetednavigation/widgets/daterange/widget.pt +61 -0
  397. eea/facetednavigation/widgets/daterange/widget.py +184 -0
  398. eea/facetednavigation/widgets/daterange/widget.txt +280 -0
  399. eea/facetednavigation/widgets/debug/__init__.py +2 -0
  400. eea/facetednavigation/widgets/debug/browser.py +161 -0
  401. eea/facetednavigation/widgets/debug/configure.zcml +58 -0
  402. eea/facetednavigation/widgets/debug/edit.js +104 -0
  403. eea/facetednavigation/widgets/debug/edit.scss +0 -0
  404. eea/facetednavigation/widgets/debug/interfaces.py +35 -0
  405. eea/facetednavigation/widgets/debug/view.js +109 -0
  406. eea/facetednavigation/widgets/debug/view.scss +6 -0
  407. eea/facetednavigation/widgets/debug/vocabulary.py +21 -0
  408. eea/facetednavigation/widgets/debug/widget.pt +43 -0
  409. eea/facetednavigation/widgets/debug/widget.py +17 -0
  410. eea/facetednavigation/widgets/etag/__init__.py +2 -0
  411. eea/facetednavigation/widgets/etag/configure.zcml +12 -0
  412. eea/facetednavigation/widgets/etag/edit.js +51 -0
  413. eea/facetednavigation/widgets/etag/edit.scss +0 -0
  414. eea/facetednavigation/widgets/etag/interfaces.py +52 -0
  415. eea/facetednavigation/widgets/etag/view.js +0 -0
  416. eea/facetednavigation/widgets/etag/view.scss +0 -0
  417. eea/facetednavigation/widgets/etag/widget.pt +25 -0
  418. eea/facetednavigation/widgets/etag/widget.py +16 -0
  419. eea/facetednavigation/widgets/interfaces.py +156 -0
  420. eea/facetednavigation/widgets/multiselect/__init__.py +2 -0
  421. eea/facetednavigation/widgets/multiselect/configure.zcml +12 -0
  422. eea/facetednavigation/widgets/multiselect/edit.js +131 -0
  423. eea/facetednavigation/widgets/multiselect/edit.scss +0 -0
  424. eea/facetednavigation/widgets/multiselect/interfaces.py +120 -0
  425. eea/facetednavigation/widgets/multiselect/view.js +383 -0
  426. eea/facetednavigation/widgets/multiselect/view.scss +65 -0
  427. eea/facetednavigation/widgets/multiselect/widget.pt +73 -0
  428. eea/facetednavigation/widgets/multiselect/widget.py +107 -0
  429. eea/facetednavigation/widgets/path/__init__.py +2 -0
  430. eea/facetednavigation/widgets/path/configure.zcml +28 -0
  431. eea/facetednavigation/widgets/path/edit.js +63 -0
  432. eea/facetednavigation/widgets/path/edit.scss +0 -0
  433. eea/facetednavigation/widgets/path/interfaces.py +67 -0
  434. eea/facetednavigation/widgets/path/tree.js +99 -0
  435. eea/facetednavigation/widgets/path/tree.py +171 -0
  436. eea/facetednavigation/widgets/path/view.js +158 -0
  437. eea/facetednavigation/widgets/path/view.scss +16 -0
  438. eea/facetednavigation/widgets/path/widget.pt +29 -0
  439. eea/facetednavigation/widgets/path/widget.py +134 -0
  440. eea/facetednavigation/widgets/portlet/__init__.py +2 -0
  441. eea/facetednavigation/widgets/portlet/configure.zcml +12 -0
  442. eea/facetednavigation/widgets/portlet/edit.js +0 -0
  443. eea/facetednavigation/widgets/portlet/edit.scss +0 -0
  444. eea/facetednavigation/widgets/portlet/interfaces.py +34 -0
  445. eea/facetednavigation/widgets/portlet/view.js +23 -0
  446. eea/facetednavigation/widgets/portlet/view.scss +6 -0
  447. eea/facetednavigation/widgets/portlet/widget.pt +20 -0
  448. eea/facetednavigation/widgets/portlet/widget.py +46 -0
  449. eea/facetednavigation/widgets/radio/__init__.py +2 -0
  450. eea/facetednavigation/widgets/radio/configure.zcml +12 -0
  451. eea/facetednavigation/widgets/radio/edit.js +76 -0
  452. eea/facetednavigation/widgets/radio/edit.scss +0 -0
  453. eea/facetednavigation/widgets/radio/interfaces.py +76 -0
  454. eea/facetednavigation/widgets/radio/view.js +262 -0
  455. eea/facetednavigation/widgets/radio/view.scss +11 -0
  456. eea/facetednavigation/widgets/radio/widget.pt +71 -0
  457. eea/facetednavigation/widgets/radio/widget.py +53 -0
  458. eea/facetednavigation/widgets/range/__init__.py +2 -0
  459. eea/facetednavigation/widgets/range/configure.zcml +12 -0
  460. eea/facetednavigation/widgets/range/edit.js +66 -0
  461. eea/facetednavigation/widgets/range/edit.scss +0 -0
  462. eea/facetednavigation/widgets/range/interfaces.py +78 -0
  463. eea/facetednavigation/widgets/range/tests.py +32 -0
  464. eea/facetednavigation/widgets/range/view.js +176 -0
  465. eea/facetednavigation/widgets/range/view.scss +14 -0
  466. eea/facetednavigation/widgets/range/widget.pt +50 -0
  467. eea/facetednavigation/widgets/range/widget.py +74 -0
  468. eea/facetednavigation/widgets/range/widget.txt +153 -0
  469. eea/facetednavigation/widgets/resultsfilter/__init__.py +2 -0
  470. eea/facetednavigation/widgets/resultsfilter/adapters.py +18 -0
  471. eea/facetednavigation/widgets/resultsfilter/configure.zcml +19 -0
  472. eea/facetednavigation/widgets/resultsfilter/edit.js +54 -0
  473. eea/facetednavigation/widgets/resultsfilter/edit.scss +0 -0
  474. eea/facetednavigation/widgets/resultsfilter/interfaces.py +41 -0
  475. eea/facetednavigation/widgets/resultsfilter/tests.py +32 -0
  476. eea/facetednavigation/widgets/resultsfilter/view.js +0 -0
  477. eea/facetednavigation/widgets/resultsfilter/view.scss +0 -0
  478. eea/facetednavigation/widgets/resultsfilter/widget.pt +24 -0
  479. eea/facetednavigation/widgets/resultsfilter/widget.py +94 -0
  480. eea/facetednavigation/widgets/resultsfilter/widget.txt +66 -0
  481. eea/facetednavigation/widgets/resultsperpage/__init__.py +2 -0
  482. eea/facetednavigation/widgets/resultsperpage/configure.zcml +12 -0
  483. eea/facetednavigation/widgets/resultsperpage/edit.js +47 -0
  484. eea/facetednavigation/widgets/resultsperpage/edit.scss +0 -0
  485. eea/facetednavigation/widgets/resultsperpage/interfaces.py +65 -0
  486. eea/facetednavigation/widgets/resultsperpage/view.js +159 -0
  487. eea/facetednavigation/widgets/resultsperpage/view.scss +5 -0
  488. eea/facetednavigation/widgets/resultsperpage/widget.pt +45 -0
  489. eea/facetednavigation/widgets/resultsperpage/widget.py +71 -0
  490. eea/facetednavigation/widgets/schema.pt +36 -0
  491. eea/facetednavigation/widgets/schema.py +31 -0
  492. eea/facetednavigation/widgets/select/__init__.py +2 -0
  493. eea/facetednavigation/widgets/select/configure.zcml +12 -0
  494. eea/facetednavigation/widgets/select/edit.js +63 -0
  495. eea/facetednavigation/widgets/select/edit.scss +0 -0
  496. eea/facetednavigation/widgets/select/interfaces.py +68 -0
  497. eea/facetednavigation/widgets/select/view.js +239 -0
  498. eea/facetednavigation/widgets/select/view.scss +24 -0
  499. eea/facetednavigation/widgets/select/widget.pt +59 -0
  500. eea/facetednavigation/widgets/select/widget.py +44 -0
  501. eea/facetednavigation/widgets/sorting/__init__.py +2 -0
  502. eea/facetednavigation/widgets/sorting/configure.zcml +12 -0
  503. eea/facetednavigation/widgets/sorting/edit.js +55 -0
  504. eea/facetednavigation/widgets/sorting/edit.scss +0 -0
  505. eea/facetednavigation/widgets/sorting/interfaces.py +35 -0
  506. eea/facetednavigation/widgets/sorting/view.js +213 -0
  507. eea/facetednavigation/widgets/sorting/view.scss +9 -0
  508. eea/facetednavigation/widgets/sorting/widget.pt +58 -0
  509. eea/facetednavigation/widgets/sorting/widget.py +80 -0
  510. eea/facetednavigation/widgets/storage.py +65 -0
  511. eea/facetednavigation/widgets/tagscloud/__init__.py +2 -0
  512. eea/facetednavigation/widgets/tagscloud/configure.zcml +20 -0
  513. eea/facetednavigation/widgets/tagscloud/counter.pt +0 -0
  514. eea/facetednavigation/widgets/tagscloud/counter.py +79 -0
  515. eea/facetednavigation/widgets/tagscloud/edit.js +150 -0
  516. eea/facetednavigation/widgets/tagscloud/edit.scss +0 -0
  517. eea/facetednavigation/widgets/tagscloud/interfaces.py +154 -0
  518. eea/facetednavigation/widgets/tagscloud/tagcloud.js +210 -0
  519. eea/facetednavigation/widgets/tagscloud/view.js +301 -0
  520. eea/facetednavigation/widgets/tagscloud/view.scss +33 -0
  521. eea/facetednavigation/widgets/tagscloud/widget.pt +65 -0
  522. eea/facetednavigation/widgets/tagscloud/widget.py +100 -0
  523. eea/facetednavigation/widgets/tal/__init__.py +2 -0
  524. eea/facetednavigation/widgets/tal/configure.zcml +12 -0
  525. eea/facetednavigation/widgets/tal/edit.js +54 -0
  526. eea/facetednavigation/widgets/tal/edit.scss +0 -0
  527. eea/facetednavigation/widgets/tal/interfaces.py +42 -0
  528. eea/facetednavigation/widgets/tal/tests.py +32 -0
  529. eea/facetednavigation/widgets/tal/view.js +0 -0
  530. eea/facetednavigation/widgets/tal/view.scss +0 -0
  531. eea/facetednavigation/widgets/tal/widget.pt +24 -0
  532. eea/facetednavigation/widgets/tal/widget.py +118 -0
  533. eea/facetednavigation/widgets/tal/widget.txt +216 -0
  534. eea/facetednavigation/widgets/text/__init__.py +2 -0
  535. eea/facetednavigation/widgets/text/configure.zcml +12 -0
  536. eea/facetednavigation/widgets/text/edit.js +52 -0
  537. eea/facetednavigation/widgets/text/edit.scss +0 -0
  538. eea/facetednavigation/widgets/text/interfaces.py +64 -0
  539. eea/facetednavigation/widgets/text/tests.py +32 -0
  540. eea/facetednavigation/widgets/text/view.js +190 -0
  541. eea/facetednavigation/widgets/text/view.scss +15 -0
  542. eea/facetednavigation/widgets/text/widget.pt +53 -0
  543. eea/facetednavigation/widgets/text/widget.py +77 -0
  544. eea/facetednavigation/widgets/text/widget.txt +153 -0
  545. eea/facetednavigation/widgets/widget.py +386 -0
  546. eea/facetednavigation/widgets/widgets.py +127 -0
  547. eea.facetednavigation-16.5-py3.14-nspkg.pth +1 -0
  548. eea_facetednavigation-16.5.dist-info/METADATA +1617 -0
  549. eea_facetednavigation-16.5.dist-info/RECORD +553 -0
  550. eea_facetednavigation-16.5.dist-info/WHEEL +5 -0
  551. eea_facetednavigation-16.5.dist-info/entry_points.txt +2 -0
  552. eea_facetednavigation-16.5.dist-info/namespace_packages.txt +1 -0
  553. eea_facetednavigation-16.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,34 @@
1
+ Overview
2
+ ========
3
+ Faceted navigation is a revolutionary plone package that redefines search
4
+ and navigation within plone sites.
5
+
6
+ * See more: http://plone.org/products/eea.facetednavigation
7
+
8
+
9
+ Installation
10
+ ============
11
+ * Go to "admin > Site Setup > Add-ons"
12
+ * Activate "EEA Faceted Navigation"
13
+ * Go to "admin > Site Setup > Content Types"
14
+ * Select one content type and go to "Behaviors"
15
+ * Enable "Faceted navigable" behavior
16
+
17
+
18
+ Extra
19
+ =====
20
+ You can extend faceted navigation functionality by installing the following
21
+ addons:
22
+
23
+ * Cache (memcache)
24
+ - plone.memoize
25
+ - eea.cache
26
+
27
+ Documentation
28
+ =============
29
+ See the **docs** directory in this package.
30
+
31
+
32
+ Authors
33
+ =======
34
+ "European Environment Agency", mailto:webadmin@eea europa eu
@@ -0,0 +1,10 @@
1
+ """ Main product initializer
2
+ """
3
+ from zope.i18nmessageid.message import MessageFactory
4
+
5
+
6
+ _ = MessageFactory("eea")
7
+
8
+
9
+ def initialize(context):
10
+ """Initializer called when used as a Zope 2 product."""
@@ -0,0 +1,2 @@
1
+ """ Browser
2
+ """
@@ -0,0 +1,2 @@
1
+ """ Browser APP
2
+ """
@@ -0,0 +1,43 @@
1
+ """ Faceted catalog views
2
+ """
3
+ import json
4
+ import logging
5
+ from Products.CMFCore.utils import getToolByName
6
+ from Products.Five.browser import BrowserView
7
+ from eea.facetednavigation.caching import ramcache
8
+
9
+ logger = logging.getLogger("eea.facetednavigation")
10
+
11
+
12
+ def cacheKey(method, self, *args, **kwargs):
13
+ """Generate unique cache id for faceted catalog indexes types"""
14
+ form = getattr(self.request, "form", {})
15
+ return form
16
+
17
+
18
+ class FacetedCatalog(BrowserView):
19
+ """Render an error message when something is wrong with widgets"""
20
+
21
+ def types(self, **kwargs):
22
+ """Return a mapping between catalog indexes and types"""
23
+ ctool = getToolByName(self.context, "portal_catalog")
24
+ indexes = ctool.getIndexObjects()
25
+ res = {}
26
+ for index in indexes:
27
+ operator = "operator" in getattr(index, "query_options", [])
28
+ res[index.getId()] = {
29
+ "metatype": index.meta_type,
30
+ "operator": operator and ["or", "and"] or ["or"],
31
+ }
32
+ return res
33
+
34
+ @ramcache(cacheKey, dependencies=["eea.facetednavigation"])
35
+ def json_types(self, **kwargs):
36
+ """Return catalog indexes, types mapping as json object"""
37
+ if self.request:
38
+ kwargs.update(self.request.form)
39
+ self.request.response.setHeader(
40
+ "Content-Type", "application/json; charset=utf-8"
41
+ )
42
+
43
+ return json.dumps(self.types(**kwargs))
@@ -0,0 +1,307 @@
1
+ """ Faceted configure
2
+ """
3
+ from eea.facetednavigation import _
4
+ from eea.facetednavigation.browser import interfaces
5
+ from eea.facetednavigation.events import FacetedGlobalSettingsChangedEvent
6
+ from eea.facetednavigation.events import FacetedSettingsWillBeChangedEvent
7
+ from eea.facetednavigation.interfaces import ICriteria
8
+ from eea.facetednavigation.interfaces import IWidgetsInfo
9
+ from plone.protect.interfaces import IDisableCSRFProtection
10
+ from Products.Five.browser import BrowserView
11
+ from Products.statusmessages.interfaces import IStatusMessage
12
+ from zope.component import getMultiAdapter
13
+ from zope.component import getUtility
14
+ from zope.event import notify
15
+ from zope.interface import alsoProvides
16
+ from zope.interface import implementer
17
+ from zope.schema.interfaces import IVocabularyFactory
18
+
19
+ import logging
20
+
21
+
22
+ logger = logging.getLogger("eea.facetednavigation")
23
+ #
24
+ # Controllers
25
+ #
26
+
27
+
28
+ class FacetedBasicHandler(BrowserView):
29
+ """Define common methods for criteria handlers"""
30
+
31
+ def __init__(self, context, request=None):
32
+ self.context = context
33
+ self.request = request or getattr(context, "request", None)
34
+ self.redirect = context.absolute_url() + "/configure_faceted.html"
35
+
36
+ def _redirect(self, msg="", to=""):
37
+ """Return or redirect"""
38
+ if not to:
39
+ return msg
40
+
41
+ if not self.request:
42
+ return msg
43
+
44
+ if msg:
45
+ IStatusMessage(self.request).addStatusMessage(str(msg), type="info")
46
+ self.request.response.redirect(to)
47
+ return msg
48
+
49
+
50
+ @implementer(interfaces.IFacetedCriteriaHandler)
51
+ class FacetedCriteriaHandler(FacetedBasicHandler):
52
+ """Edit criteria"""
53
+
54
+ def add(self, **kwargs):
55
+ """See IFacetedCriteriaHandler"""
56
+ wid = kwargs.pop("wtype", None)
57
+ position = kwargs.pop("wposition", "right")
58
+ section = kwargs.pop("wsection", "default")
59
+ try:
60
+ ICriteria(self.context).add(wid, position, section)
61
+ except NameError as err:
62
+ msg = err
63
+ else:
64
+ msg = _("Filter added")
65
+ return self._redirect(msg=msg, to=self.redirect)
66
+
67
+ def edit(self, **kwargs):
68
+ """See IFacetedCriteriaHandler"""
69
+ criteria = ICriteria(self.context)
70
+ handler = getMultiAdapter(
71
+ (self.context, self.request), name="faceted_update_criterion"
72
+ )
73
+ for cid in criteria.keys():
74
+ properties = {}
75
+ for key, value in kwargs.items():
76
+ if not key.startswith(cid):
77
+ continue
78
+ key = key[len(cid) + 1 :]
79
+ properties[key] = value
80
+ handler.edit(cid, **properties)
81
+ return self._redirect("Changes saved", to=self.redirect)
82
+
83
+ def delete(self, **kwargs):
84
+ """See IFacetedCriteriaHandler"""
85
+ to_delete = kwargs.get("paths", kwargs.get("ids", ()))
86
+ handler = getMultiAdapter(
87
+ (self.context, self.request), name="faceted_update_criterion"
88
+ )
89
+ for cid in to_delete:
90
+ handler.delete(cid)
91
+ return self._redirect(_("Filters deleted"), to=self.redirect)
92
+
93
+
94
+ @implementer(interfaces.IFacetedCriterionHandler)
95
+ class FacetedCriterionHandler(FacetedBasicHandler):
96
+ """Edit criterion"""
97
+
98
+ def extractData(self, widget, **kwargs):
99
+ """Extract form"""
100
+ widget.update()
101
+ form, _errors = widget.extractData()
102
+ form.update(kwargs)
103
+ return form
104
+
105
+ def add(self, **kwargs):
106
+ """See IFacetedCriterionHandler"""
107
+ wid = kwargs.pop("wtype", self.request.get("wtype", None))
108
+ position = kwargs.pop("wposition", self.request.get("wposition", "right"))
109
+ section = kwargs.pop("wsection", self.request.get("wsection", "default"))
110
+
111
+ criteria = ICriteria(self.context)
112
+ cid = criteria.add(wid, position, section)
113
+ return self.edit(cid, __new__=True, **kwargs)
114
+
115
+ def edit(self, cid, **kwargs):
116
+ """See IFacetedCriterionHandler"""
117
+ criteria = ICriteria(self.context)
118
+ widget = criteria.widget(cid=cid)
119
+ criterion = criteria.get(cid)
120
+ if kwargs.pop("__new__", False):
121
+ criterion = criterion.__class__(cid="c0")
122
+ widget = widget(self.context, self.request, criterion)
123
+
124
+ wid = kwargs.pop("widget", None)
125
+ properties = self.extractData(widget, **kwargs)
126
+ if wid:
127
+ properties["widget"] = wid
128
+
129
+ update = {}
130
+ for prop, value in properties.items():
131
+ form_key = "faceted.%s.%s" % (cid, prop)
132
+ if form_key not in kwargs and value is None:
133
+ continue
134
+ update[prop] = value
135
+
136
+ if update:
137
+ criteria.edit(cid, **update)
138
+ if widget.hidden:
139
+ notify(FacetedGlobalSettingsChangedEvent(self.context))
140
+ elif set(["hidden", "operator"]).intersection(list(update.keys())):
141
+ notify(FacetedGlobalSettingsChangedEvent(self.context))
142
+
143
+ return self._redirect("Changes saved")
144
+
145
+ def delete(self, cid, **kwargs):
146
+ """See IFacetedCriterionHandler"""
147
+ try:
148
+ ICriteria(self.context).delete(cid)
149
+ except (TypeError, KeyError) as err:
150
+ msg = err
151
+ else:
152
+ msg = _("Filter deleted")
153
+ return self._redirect(msg=msg)
154
+
155
+
156
+ @implementer(interfaces.IFacetedPositionHandler)
157
+ class FacetedPositionHandler(FacetedBasicHandler):
158
+ """Edit criteria position"""
159
+
160
+ def update(self, **kwargs):
161
+ """Update position by given slots"""
162
+ logger.debug(kwargs)
163
+ ICriteria(self.context).position(**kwargs)
164
+ return self._redirect("Position changed")
165
+
166
+ def move_up(self, cid, **kwargs):
167
+ """Move criterion up"""
168
+ ICriteria(self.context).up(cid)
169
+ return self._redirect("Position changed", to=self.redirect)
170
+
171
+ def move_down(self, cid, **kwargs):
172
+ """Move criterion down"""
173
+ ICriteria(self.context).down(cid)
174
+ return self._redirect("Position changed", to=self.redirect)
175
+
176
+
177
+ @implementer(interfaces.IFacetedFormHandler)
178
+ class FacetedFormHandler(FacetedBasicHandler):
179
+ """Edit criteria using a static form"""
180
+
181
+ def __init__(self, context, request):
182
+ super(FacetedFormHandler, self).__init__(context, request)
183
+ # XXX Quick fix until we figure out how to enable CSRF Protection
184
+ alsoProvides(request, IDisableCSRFProtection)
185
+
186
+ def __call__(self, **kwargs):
187
+ """This method is called from a form with more than one submit buttons"""
188
+ sanitized_form = {}
189
+ for key, value in getattr(self.request, "form", {}).items():
190
+ key = key.replace("[]", "")
191
+ if isinstance(value, bytes):
192
+ value = value.decode("utf-8")
193
+ sanitized_form[key] = value
194
+
195
+ if sanitized_form:
196
+ self.request.form = sanitized_form
197
+ kwargs.update(sanitized_form)
198
+
199
+ notify(FacetedSettingsWillBeChangedEvent(self.context))
200
+ #
201
+ # Criteria
202
+ #
203
+ handler = getMultiAdapter(
204
+ (self.context, self.request), name="faceted_update_criteria"
205
+ )
206
+
207
+ # Add button clicked
208
+ if kwargs.get("addWidget_button", None):
209
+ return handler.add(**kwargs)
210
+
211
+ # Delete button clicked
212
+ if kwargs.get("deleteWidgets_button", None):
213
+ return handler.delete(**kwargs)
214
+
215
+ # Save button clicked
216
+ if kwargs.get("saveChanges_button", None):
217
+ return handler.edit(**kwargs)
218
+ #
219
+ # Criterion
220
+ #
221
+ handler = getMultiAdapter(
222
+ (self.context, self.request), name="faceted_update_criterion"
223
+ )
224
+ # Add button clicked
225
+ if kwargs.pop("addPropertiesWidget_button", None):
226
+ return handler.add(**kwargs)
227
+
228
+ # Delete button clicked
229
+ if kwargs.pop("deleteWidget_button", None):
230
+ cid = kwargs.pop("path", kwargs.pop("cid", ""))
231
+ return handler.delete(cid=cid, **kwargs)
232
+
233
+ # Save button clicked
234
+ if kwargs.pop("updateCriterion_button", None):
235
+ return handler.edit(**kwargs)
236
+ #
237
+ # Position
238
+ #
239
+ handler = getMultiAdapter(
240
+ (self.context, self.request), name="faceted_update_position"
241
+ )
242
+
243
+ # Update position
244
+ if kwargs.get("updatePosition_button", None):
245
+ return handler.update(**kwargs)
246
+
247
+ # Move up button clicked
248
+ move_up = [k for k in kwargs if k.startswith("moveUp_button")]
249
+ if move_up:
250
+ cid = move_up[0].split("+++")[1]
251
+ return handler.move_up(cid)
252
+
253
+ # Move down button clicked
254
+ move_down = [k for k in kwargs if k.startswith("moveDown_button")]
255
+ if move_down:
256
+ cid = move_down[0].split("+++")[1]
257
+ return handler.move_down(cid)
258
+
259
+ # Return
260
+ self._redirect("Nothing changed", to=self.redirect)
261
+
262
+
263
+ # View
264
+ #
265
+ class FacetedConfigureView(object):
266
+ """Faceted configure"""
267
+
268
+ def __init__(self, context, request):
269
+ self.context = context
270
+ self.request = request
271
+
272
+ @property
273
+ def positions(self):
274
+ """Possible positions"""
275
+ voc = getUtility(IVocabularyFactory, "eea.faceted.vocabularies.WidgetPositions")
276
+ return voc(self.context)
277
+
278
+ @property
279
+ def sections(self):
280
+ """Possible sections"""
281
+ voc = getUtility(IVocabularyFactory, "eea.faceted.vocabularies.WidgetSections")
282
+ return voc(self.context)
283
+
284
+ def get_widget(self, wid):
285
+ """Get widget by given widget id"""
286
+ return ICriteria(self.context).widget(wid)
287
+
288
+ def get_widget_types(self):
289
+ """Widget types"""
290
+ info = getUtility(IWidgetsInfo)
291
+ res = [x for x in info.widgets.values()]
292
+
293
+ def compare(x):
294
+ """Compare"""
295
+ return x.widget_label
296
+
297
+ res.sort(key=compare)
298
+ return res
299
+
300
+ def get_schema(self, criterion):
301
+ """Get edit schema"""
302
+ schema = getMultiAdapter((self.context, self.request), name="faceted_schema")
303
+ return schema(criterion=criterion.getId())
304
+
305
+ def get_criteria(self):
306
+ """Get criteria"""
307
+ return list(ICriteria(self.context).values())
@@ -0,0 +1,77 @@
1
+ """ Counter
2
+ """
3
+ import logging
4
+ import time
5
+ import json
6
+
7
+ from zope.component import getMultiAdapter
8
+ from eea.facetednavigation.caching import ramcache
9
+ from eea.facetednavigation.caching import cacheCounterKeyFacetedNavigation
10
+ from eea.facetednavigation.interfaces import ICriteria
11
+
12
+ logger = logging.getLogger("eea.facetednavigation")
13
+
14
+
15
+ class FacetedQueryCounter(object):
16
+ """Count results per query"""
17
+
18
+ def __init__(self, context, request):
19
+ self.context = context
20
+ self.request = request
21
+
22
+ def query(self, cid, **kwargs):
23
+ """Count catalog items"""
24
+ # Cleanup query
25
+ kwargs.pop("sort_on", None)
26
+ kwargs.pop("sort_order", None)
27
+ kwargs.pop("sort[]", None)
28
+ kwargs.pop("sort", None)
29
+ kwargs.pop("reversed[]", None)
30
+ oid = "%s-operator" % cid
31
+ operator = kwargs.pop(oid, kwargs.pop(oid + "[]", None))
32
+
33
+ if not operator or operator != "and":
34
+ kwargs.pop(cid, None)
35
+ self.request.form.pop(cid, None)
36
+ # jQuery >= 1.4 adds type to params keys
37
+ # $.param({ a: [2,3,4] }) // "a[]=2&a[]=3&a[]=4"
38
+ # Let's fix this
39
+ kwargs.pop(cid + "[]", None)
40
+ self.request.form.pop(cid + "[]", None)
41
+
42
+ criteria = ICriteria(self.context)
43
+ criterion = criteria.get(cid)
44
+
45
+ start = time.time()
46
+ # Query catalog
47
+ handler = getMultiAdapter((self.context, self.request), name="faceted_query")
48
+
49
+ if criterion.get("index", "") == "Language":
50
+ kwargs["_language_count_"] = True
51
+ kwargs["counter_query"] = True
52
+ brains = handler.query(batch=False, sort=False, **kwargs)
53
+
54
+ # Get index
55
+ widget = criteria.widget(cid=cid)(self.context, self.request, criterion)
56
+ count = getattr(widget, "count", lambda brains: {})
57
+ res = count(brains)
58
+ logger.debug("Benchmark %s: %s", cid, time.time() - start)
59
+ return res
60
+
61
+ @ramcache(cacheCounterKeyFacetedNavigation, dependencies=["eea.facetednavigation"])
62
+ def __call__(self, *args, **kwargs):
63
+ # Calling self.index() will set cache headers for varnish
64
+ self.index()
65
+
66
+ if self.request:
67
+ kwargs.update(self.request.form)
68
+ self.request.response.setHeader(
69
+ "Content-Type", "application/json; charset=utf-8"
70
+ )
71
+
72
+ cid = kwargs.pop("cid", None)
73
+ if not cid:
74
+ return {}
75
+
76
+ res = self.query(cid, **kwargs)
77
+ return json.dumps(res)
@@ -0,0 +1,28 @@
1
+ """ Errors
2
+ """
3
+ import logging
4
+ from pprint import pformat
5
+ from zope.component import queryAdapter
6
+ from eea.facetednavigation.interfaces import ICriteria
7
+ from Products.Five.browser import BrowserView
8
+
9
+ logger = logging.getLogger("eea.facetednavigation")
10
+
11
+
12
+ class FacetedError(BrowserView):
13
+ """Render an error message when something is wrong with widgets"""
14
+
15
+ def __call__(self, **kwargs):
16
+ error = kwargs.get("error", None)
17
+ res = {"type": getattr(error, "type", ""), "value": getattr(error, "value", "")}
18
+ cid = kwargs.get("cid", "")
19
+ msg = ""
20
+ if cid:
21
+ criteria = queryAdapter(self.context, ICriteria)
22
+ if criteria:
23
+ data = criteria.get(cid)
24
+ if data:
25
+ msg = pformat(data.__dict__)
26
+
27
+ logger.exception("\n%s\n", msg)
28
+ return self.index(error=res)
@@ -0,0 +1,85 @@
1
+ """ Export / Import faceted configuration
2
+ """
3
+ from eea.facetednavigation import _
4
+ from plone.protect.interfaces import IDisableCSRFProtection
5
+ from Products.GenericSetup.context import SnapshotExportContext
6
+ from Products.GenericSetup.context import SnapshotImportContext
7
+ from Products.GenericSetup.interfaces import IBody
8
+ from Products.statusmessages.interfaces import IStatusMessage
9
+ from zope.component import queryMultiAdapter
10
+ from zope.interface import alsoProvides
11
+
12
+
13
+ class FacetedExportImport(object):
14
+ """Faceted view"""
15
+
16
+ def __init__(self, context, request):
17
+ self.context = context
18
+ self.request = request
19
+ # XXX Quick fix until we figure out how to enable CSRF Protection
20
+ alsoProvides(request, IDisableCSRFProtection)
21
+
22
+ def _redirect(self, msg="", to="configure_faceted.html"):
23
+ """Set status message and redirect"""
24
+ if not to:
25
+ return msg
26
+
27
+ if msg:
28
+ IStatusMessage(self.request).addStatusMessage(str(msg), type="info")
29
+ self.request.response.redirect(to)
30
+
31
+ def _import_xml(self, **kwargs):
32
+ """Import"""
33
+ upload_file = kwargs.get("import_file", None)
34
+ if getattr(upload_file, "read", None):
35
+ upload_file = upload_file.read()
36
+ xml = upload_file or b""
37
+ if not xml.startswith(b'<?xml version="1.0"'):
38
+ return _("Please provide a valid xml file")
39
+
40
+ environ = SnapshotImportContext(self.context, "utf-8")
41
+ importer = queryMultiAdapter((self.context, environ), IBody)
42
+ if not importer:
43
+ return "No adapter found"
44
+
45
+ try:
46
+ importer.body = xml
47
+ except Exception as err:
48
+ return "ERROR: %s" % err
49
+ else:
50
+ return _("Configuration imported")
51
+
52
+ def import_xml(self, **kwargs):
53
+ """Import config from xml"""
54
+ msg = self._import_xml(**kwargs)
55
+ return self._redirect(msg, kwargs.get("redirect", "configure_faceted.html"))
56
+
57
+ def _export_xml(self, **kwargs):
58
+ """Export"""
59
+ environ = SnapshotExportContext(self.context, "utf-8")
60
+ return queryMultiAdapter((self.context, environ), IBody)
61
+
62
+ def export_xml(self, **kwargs):
63
+ """Export config as xml"""
64
+ exporter = self._export_xml(**kwargs)
65
+ if not exporter:
66
+ return self._redirect(
67
+ "No adapter found", kwargs.get("redirect", "configure_faceted.html")
68
+ )
69
+
70
+ self.request.response.setHeader("content-type", "text/xml; charset=utf-8")
71
+ self.request.response.addHeader(
72
+ "content-disposition",
73
+ "attachment; filename=%s.xml" % (self.context.getId(),),
74
+ )
75
+ return exporter.body
76
+
77
+ def __call__(self, **kwargs):
78
+ """Export / Import configuration"""
79
+ if self.request:
80
+ kwargs.update(self.request.form)
81
+ if "import_button" in kwargs.keys():
82
+ return self.import_xml(**kwargs)
83
+ if "export_button" in kwargs.keys():
84
+ return self.export_xml(**kwargs)
85
+ self._redirect(_("No action provided"), "configure_faceted.html")