cone.app 2.0.0__tar.gz → 2.2.0__tar.gz

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 (170) hide show
  1. {cone_app-2.0.0 → cone_app-2.2.0}/.gitignore +0 -2
  2. {cone_app-2.0.0 → cone_app-2.2.0}/CHANGES.rst +147 -0
  3. {cone_app-2.0.0 → cone_app-2.2.0}/PKG-INFO +153 -5
  4. cone_app-2.2.0/biome.json +31 -0
  5. {cone_app-2.0.0 → cone_app-2.2.0}/include.mk +17 -0
  6. {cone_app-2.0.0 → cone_app-2.2.0}/pyproject.toml +17 -6
  7. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/__init__.py +60 -29
  8. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/actions.py +3 -7
  9. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/ajax.py +11 -6
  10. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/authoring.py +11 -15
  11. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/contextmenu.py +3 -5
  12. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/copysupport.py +1 -2
  13. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/exception.py +17 -12
  14. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/form.py +2 -0
  15. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/login.py +19 -5
  16. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/referencebrowser.py +4 -6
  17. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.js +875 -871
  18. cone_app-2.2.0/src/cone/app/browser/static/cone/cone.app.min.js +1 -0
  19. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/utils.py +37 -0
  20. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/workflow.py +6 -5
  21. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/cone.app.pot +5 -0
  22. cone_app-2.2.0/src/cone/app/locale/de/LC_MESSAGES/cone.app.mo +0 -0
  23. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/de/LC_MESSAGES/cone.app.po +5 -0
  24. cone_app-2.2.0/src/cone/app/locale/en/LC_MESSAGES/cone.app.mo +0 -0
  25. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/en/LC_MESSAGES/cone.app.po +5 -0
  26. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/model.py +5 -7
  27. cone_app-2.2.0/src/cone/app/origin.py +66 -0
  28. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/security.py +73 -10
  29. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/__init__.py +11 -1
  30. cone_app-2.2.0/src/cone/app/testing/data/ugm/users +6 -0
  31. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/mock.py +4 -4
  32. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_app.py +78 -25
  33. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser.py +1 -3
  34. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_actions.py +8 -10
  35. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_ajax.py +54 -11
  36. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_authoring.py +38 -20
  37. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_contents.py +5 -5
  38. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_exception.py +73 -67
  39. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_form.py +53 -15
  40. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_layout.py +24 -22
  41. cone_app-2.2.0/src/cone/app/tests/test_browser_login.py +171 -0
  42. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_referencebrowser.py +76 -60
  43. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_resources.py +3 -9
  44. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_settings.py +15 -23
  45. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_sharing.py +1 -3
  46. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_table.py +1 -3
  47. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_translation.py +1 -3
  48. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_utils.py +39 -0
  49. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_workflow.py +6 -0
  50. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_model.py +9 -13
  51. cone_app-2.2.0/src/cone/app/tests/test_origin.py +182 -0
  52. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_security.py +129 -12
  53. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_workflow.py +1 -1
  54. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/workflow.py +4 -4
  55. cone_app-2.0.0/src/cone/app/browser/static/cone/cone.app.min.js +0 -1
  56. cone_app-2.0.0/src/cone/app/locale/de/LC_MESSAGES/cone.app.mo +0 -0
  57. cone_app-2.0.0/src/cone/app/locale/en/LC_MESSAGES/cone.app.mo +0 -0
  58. cone_app-2.0.0/src/cone/app/testing/data/ugm/users +0 -6
  59. cone_app-2.0.0/src/cone/app/tests/test_browser_login.py +0 -54
  60. {cone_app-2.0.0 → cone_app-2.2.0}/LICENSE.rst +0 -0
  61. {cone_app-2.0.0 → cone_app-2.2.0}/README.rst +0 -0
  62. {cone_app-2.0.0 → cone_app-2.2.0}/TODO.rst +0 -0
  63. {cone_app-2.0.0 → cone_app-2.2.0}/constraints.txt +0 -0
  64. {cone_app-2.0.0 → cone_app-2.2.0}/requirements.txt +0 -0
  65. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/__init__.py +0 -0
  66. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/batch.py +0 -0
  67. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/content.py +0 -0
  68. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/contents.py +1 -1
  69. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/layout.py +1 -1
  70. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/order.py +0 -0
  71. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/resources.py +1 -1
  72. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/search.py +1 -1
  73. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/settings.py +2 -2
  74. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/sharing.py +0 -0
  75. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/css/bootstrap.css +0 -0
  76. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/css/bootstrap.min.css +0 -0
  77. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.css +0 -0
  78. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.json +0 -0
  79. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.min.css +0 -0
  80. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.scss +0 -0
  81. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/fonts/bootstrap-icons.woff +0 -0
  82. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/fonts/bootstrap-icons.woff2 +0 -0
  83. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/bootstrap.bundle.js +0 -0
  84. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/bootstrap.bundle.min.js +0 -0
  85. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/popper.min.js +0 -0
  86. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.css +0 -0
  87. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.min.css +0 -0
  88. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.print.css +0 -0
  89. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/favicon.ico +0 -0
  90. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/de.svg +0 -0
  91. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/en.svg +0 -0
  92. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/fr.svg +0 -0
  93. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/it.svg +0 -0
  94. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/jquery/jquery-4.0.0.js +0 -0
  95. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/jquery/jquery-4.0.0.min.js +0 -0
  96. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/table.py +0 -0
  97. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/action_download.pt +0 -0
  98. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/action_dropdown.pt +0 -0
  99. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/add_dropdown.pt +0 -0
  100. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batch.pt +0 -0
  101. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items.pt +0 -0
  102. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items_footer.pt +0 -0
  103. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items_header.pt +0 -0
  104. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/button_action.pt +0 -0
  105. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/byline.pt +0 -0
  106. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/colortoggler.pt +0 -0
  107. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/content_form.pt +0 -0
  108. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/contextmenu.pt +0 -0
  109. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/contextmenu_dropdown.pt +0 -0
  110. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/default_root.pt +0 -0
  111. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/footer.pt +0 -0
  112. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/insufficient_privileges.pt +0 -0
  113. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/language.pt +0 -0
  114. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/layout.pt +0 -0
  115. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/link_action.pt +0 -0
  116. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/listing.pt +0 -0
  117. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/livesearch.pt +0 -0
  118. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/logo.pt +0 -0
  119. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/main.pt +0 -0
  120. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/mainmenu.pt +0 -0
  121. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/navtree.pt +0 -0
  122. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/navtree_recue.pt +0 -0
  123. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/not_found.pt +0 -0
  124. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/pathbar.pt +0 -0
  125. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/personaltools.pt +0 -0
  126. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/referencebrowser.pt +0 -0
  127. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/referencebrowser_pathbar.pt +0 -0
  128. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/resources.pt +0 -0
  129. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings.pt +0 -0
  130. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings_form.pt +0 -0
  131. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings_sidebar.pt +0 -0
  132. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/sharing.pt +0 -0
  133. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/table.pt +0 -0
  134. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/unauthorized.pt +0 -0
  135. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/wf_dropdown.pt +0 -0
  136. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/translation.py +0 -0
  137. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/compat.py +0 -0
  138. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/configure.zcml +0 -0
  139. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/interfaces.py +0 -0
  140. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/groups +0 -0
  141. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/roles +0 -0
  142. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/groups/group1 +0 -0
  143. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/admin +0 -0
  144. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/editor +0 -0
  145. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/manager +0 -0
  146. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/max +0 -0
  147. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/sepp +0 -0
  148. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/viewer +0 -0
  149. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_action.pt +0 -0
  150. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_batched_items.pt +0 -0
  151. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_form.yaml +0 -0
  152. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_main.pt +0 -0
  153. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_workflow.zcml +0 -0
  154. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/print1.css +0 -0
  155. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/print2.css +0 -0
  156. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/script1.js +0 -0
  157. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/script2.js +0 -0
  158. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/style1.css +0 -0
  159. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/style2.css +0 -0
  160. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_batch.py +0 -0
  161. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_content.py +0 -0
  162. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_contextmenu.py +0 -0
  163. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_copysupport.py +0 -0
  164. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_order.py +0 -0
  165. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_search.py +0 -0
  166. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_testing.py +0 -0
  167. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_ugm.py +0 -0
  168. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_utils.py +0 -0
  169. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/ugm.py +0 -0
  170. {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/utils.py +0 -0
@@ -23,10 +23,8 @@
23
23
  /node_modules/
24
24
  /package-lock.json
25
25
  /pip-selfcheck.json
26
- /pnpm-lock.yaml
27
26
  /pyvenv.cfg
28
27
  /requirements-mxdev.txt
29
28
  /sources/
30
29
  /twistd.pid
31
30
  /venv/
32
- /pnpm-lock.yaml
@@ -1,6 +1,153 @@
1
1
  Changes
2
2
  =======
3
3
 
4
+ 2.2.0 (2026-11-09)
5
+ ------------------
6
+
7
+ - The ``ajaxaction`` view only accepts ``POST`` requests. Requires ``treibstoff``
8
+ 2.1.0.
9
+ [rnix]
10
+
11
+ - The tile ``wf_dropdown`` only performs ``do_transition`` on ``POST`` requests.
12
+ [rnix]
13
+
14
+ - ``Form`` only runs form actions on ``POST`` requests. On any other request it
15
+ renders the form. Tests calling a form action need ``request.method = 'POST'``.
16
+ [rnix]
17
+
18
+ - Answer requests other than ``GET``, ``HEAD`` and ``OPTIONS`` with status ``403``
19
+ if a browser sends them for another site, recognized by the ``Sec-Fetch-Site``
20
+ and ``Origin`` headers. Clients sending neither pass. Add
21
+ ``cone.trusted_origins`` for browser clients of other origins.
22
+ [rnix]
23
+
24
+ - Encode the node title in reference actions and in the link to leaf nodes, and
25
+ the label in display mode of the ``reference`` blueprint. Requires ``yafowil``
26
+ 4.2.0.
27
+ [rnix]
28
+
29
+ - ``main`` refuses to start if ``cone.auth_secret`` is missing or has the former
30
+ default value ``secret``.
31
+ [rnix]
32
+
33
+ - Read ``cone.auth_secure``, ``cone.auth_include_ip``, ``cone.auth_http_only`` and
34
+ ``cone.auth_wild_domain`` as booleans. ``false`` in an ini file was considered
35
+ true before, applications with such a value change their behavior.
36
+ [rnix]
37
+
38
+ - ``cone.auth_http_only`` defaults to ``True``.
39
+ [rnix]
40
+
41
+ - Failures in ajax actions, ajax forms and the exception view answer with a
42
+ general message, the traceback goes to the log. Add setting
43
+ ``cone.show_tracebacks`` to show it to the client during development. Add
44
+ ``browser.utils.client_error_message``.
45
+ [rnix]
46
+
47
+ - ``internal_server_error`` answers with status 500 instead of 200, also for
48
+ ajax requests. A ``default_commit_veto`` configured for ``pyramid_tm`` vetoes
49
+ such a request now, before it committed.
50
+ [rnix]
51
+
52
+ - Compare the credentials of the admin user with ``hmac.compare_digest``.
53
+ [rnix]
54
+
55
+ - A failed login in the login form answers with status 401 instead of 200, so a
56
+ throttle at the edge can recognize it. All failed logins log a warning with the
57
+ first two characters of the login name and the client address. The login form only
58
+ checks the password in the ``login`` view, not on other pages showing the form or
59
+ through ``ajaxaction``.
60
+ [rnix]
61
+
62
+ - ``logout_view`` follows ``came_from`` only to an HTTP URL on the host of the
63
+ application. ``CameFromNext`` considers the scheme too. Add
64
+ ``browser.utils.is_same_host_url``.
65
+ [rnix]
66
+
67
+
68
+ 2.1.0 (2026-10-31)
69
+ ------------------
70
+
71
+ - Require ``cone.tile>2.0.99``. ``cone.tile`` 2.0 secures tiles only if an
72
+ authentication and an authorization policy are registered, so it does not
73
+ protect tiles with the security policy configured by ``cone.app.main``.
74
+ [rnix]
75
+
76
+ - Remove ``MainMenu.on_sidebar_left_resize``, which rendered the main menu
77
+ scrollbar again on each left sidebar resize. Both sidebars live inside the
78
+ content area below the header, so resizing them does not change the width of
79
+ the main menu. ``MainMenu`` keeps the inherited ``LayoutAware`` behavior.
80
+ [rnix]
81
+
82
+ - Fix shift click selection of ``Selectable`` items. Shift click selects the
83
+ range from the last plain or ctrl clicked item (the anchor) to the clicked
84
+ item, as in file managers. Before, a further shift click started the range at
85
+ the wrong item. Shift click without an anchor acts like a plain click.
86
+ ``Selectable.select_direction`` and ``Selectable.get_nearest`` are removed.
87
+ [rnix]
88
+
89
+ - Fix ``SidebarLeft`` and ``SidebarRight`` skipping their initialization on
90
+ small viewports with a stored lock state. The sidebar content and the ajax
91
+ destroy hook were missing.
92
+ [rnix]
93
+
94
+ - Fix ``LayoutAware`` handling a right sidebar resize as a left sidebar resize.
95
+ ``is_sidebar_left_collapsed`` and ``is_sidebar_right_collapsed`` are
96
+ properties now, so ``on_is_sidebar_left_collapsed`` and
97
+ ``on_is_sidebar_right_collapsed`` get called on changes. The unused
98
+ ``is_sidebar_collapsed`` property is removed.
99
+ [rnix]
100
+
101
+ - Fix the color mode toggle not following changes of the OS color scheme.
102
+ A destroyed ``ColorToggler`` stops following them and no longer keeps the
103
+ removed toggle in memory. Fix ``ColorMode.unbind`` not removing its
104
+ listener. ``ColorMode.media_query`` returns the same ``MediaQueryList`` on
105
+ each call now, the new ``ColorMode.unwatch`` removes a listener added with
106
+ ``ColorMode.watch``.
107
+ [rnix]
108
+
109
+ - Fix ``Header`` binding the mobile menu collapse handlers again on each switch
110
+ to compact mode, and keeping them after leaving compact mode or destroying
111
+ the header, which caused a ``TypeError`` on later collapse events.
112
+ [rnix]
113
+
114
+ - Extend the JS tests to 100 % coverage, all modules including bundles are
115
+ loaded by the tests now.
116
+ [rnix]
117
+
118
+ - Lint and format the JS code with biome. ``make check`` runs ``biome check``,
119
+ ``make format`` runs ``biome check --write`` (see ``include.mk``). Behavior
120
+ unchanged.
121
+ [rnix]
122
+
123
+ - JS tooling: Commit ``pnpm-lock.yaml``. Upgrade ``@web/test-runner`` to 1.0
124
+ and run the JS tests headless in Chromium via Playwright, installed in the JS
125
+ CI workflow. Drop the accidental ``install`` dev dependency. Pin patched
126
+ versions of vulnerable transitive dependencies via ``pnpm.overrides``.
127
+ [rnix]
128
+
129
+ - Use a Pyramid security policy instead of the authentication and
130
+ authorization policies deprecated in Pyramid 2.0. ``cone.app.main``
131
+ configures ``cone.app.security.SecurityPolicy`` (auth ticket cookie and
132
+ ACLs, principals from ``groups_callback``) unless a security policy is
133
+ registered already. The ``cone.auth_*`` settings keep working.
134
+ ``cone.app.auth_tkt_factory`` and ``cone.app.acl_factory`` are deprecated.
135
+ [rnix]
136
+
137
+ - Import ``Allow``, ``Deny``, ``Everyone`` and ``ALL_PERMISSIONS`` from
138
+ ``pyramid.authorization``, they are deprecated in ``pyramid.security``.
139
+ [rnix]
140
+
141
+ - Sort the imports with ruff (one per line, ``from`` imports first, no
142
+ sections) and format the code with ``ruff format`` (90 characters per line,
143
+ single quotes).
144
+ [rnix]
145
+
146
+ - Add import sorting (``I`` rules) and the formatter settings to the ruff
147
+ configuration in ``pyproject.toml``.
148
+ [rnix]
149
+
150
+
4
151
  2.0.0 (2026-10-24)
5
152
  ------------------
6
153
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cone.app
3
- Version: 2.0.0
3
+ Version: 2.2.0
4
4
  Summary: Web application stub
5
5
  Project-URL: Homepage, http://github.com/conestack/cone.app
6
6
  Author-email: Cone Contributors <dev@conestack.org>
@@ -14,21 +14,22 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Programming Language :: Python :: 3.15
17
18
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
18
19
  Requires-Python: >=3.10
19
20
  Requires-Dist: chameleon
20
- Requires-Dist: cone-tile>1.99
21
- Requires-Dist: node-ext-ugm>1.99
21
+ Requires-Dist: cone-tile>2.1.99
22
+ Requires-Dist: node-ext-ugm>2.0.99
22
23
  Requires-Dist: node>1.99
23
24
  Requires-Dist: pyramid-chameleon
24
25
  Requires-Dist: pyramid-zcml
25
26
  Requires-Dist: pyramid>=2.0
26
27
  Requires-Dist: repoze-workflow
27
- Requires-Dist: treibstoff>1.99
28
+ Requires-Dist: treibstoff>2.0.99
28
29
  Requires-Dist: webresource>1.2.99
29
30
  Requires-Dist: yafowil-bootstrap>1.99
30
31
  Requires-Dist: yafowil-webob>1.99
31
- Requires-Dist: yafowil>3.99
32
+ Requires-Dist: yafowil>4.1.99
32
33
  Provides-Extra: docs
33
34
  Requires-Dist: repoze-sphinx-autointerface; extra == 'docs'
34
35
  Requires-Dist: sphinx; extra == 'docs'
@@ -103,6 +104,153 @@ Contributors
103
104
  Changes
104
105
  =======
105
106
 
107
+ 2.2.0 (2026-11-09)
108
+ ------------------
109
+
110
+ - The ``ajaxaction`` view only accepts ``POST`` requests. Requires ``treibstoff``
111
+ 2.1.0.
112
+ [rnix]
113
+
114
+ - The tile ``wf_dropdown`` only performs ``do_transition`` on ``POST`` requests.
115
+ [rnix]
116
+
117
+ - ``Form`` only runs form actions on ``POST`` requests. On any other request it
118
+ renders the form. Tests calling a form action need ``request.method = 'POST'``.
119
+ [rnix]
120
+
121
+ - Answer requests other than ``GET``, ``HEAD`` and ``OPTIONS`` with status ``403``
122
+ if a browser sends them for another site, recognized by the ``Sec-Fetch-Site``
123
+ and ``Origin`` headers. Clients sending neither pass. Add
124
+ ``cone.trusted_origins`` for browser clients of other origins.
125
+ [rnix]
126
+
127
+ - Encode the node title in reference actions and in the link to leaf nodes, and
128
+ the label in display mode of the ``reference`` blueprint. Requires ``yafowil``
129
+ 4.2.0.
130
+ [rnix]
131
+
132
+ - ``main`` refuses to start if ``cone.auth_secret`` is missing or has the former
133
+ default value ``secret``.
134
+ [rnix]
135
+
136
+ - Read ``cone.auth_secure``, ``cone.auth_include_ip``, ``cone.auth_http_only`` and
137
+ ``cone.auth_wild_domain`` as booleans. ``false`` in an ini file was considered
138
+ true before, applications with such a value change their behavior.
139
+ [rnix]
140
+
141
+ - ``cone.auth_http_only`` defaults to ``True``.
142
+ [rnix]
143
+
144
+ - Failures in ajax actions, ajax forms and the exception view answer with a
145
+ general message, the traceback goes to the log. Add setting
146
+ ``cone.show_tracebacks`` to show it to the client during development. Add
147
+ ``browser.utils.client_error_message``.
148
+ [rnix]
149
+
150
+ - ``internal_server_error`` answers with status 500 instead of 200, also for
151
+ ajax requests. A ``default_commit_veto`` configured for ``pyramid_tm`` vetoes
152
+ such a request now, before it committed.
153
+ [rnix]
154
+
155
+ - Compare the credentials of the admin user with ``hmac.compare_digest``.
156
+ [rnix]
157
+
158
+ - A failed login in the login form answers with status 401 instead of 200, so a
159
+ throttle at the edge can recognize it. All failed logins log a warning with the
160
+ first two characters of the login name and the client address. The login form only
161
+ checks the password in the ``login`` view, not on other pages showing the form or
162
+ through ``ajaxaction``.
163
+ [rnix]
164
+
165
+ - ``logout_view`` follows ``came_from`` only to an HTTP URL on the host of the
166
+ application. ``CameFromNext`` considers the scheme too. Add
167
+ ``browser.utils.is_same_host_url``.
168
+ [rnix]
169
+
170
+
171
+ 2.1.0 (2026-10-31)
172
+ ------------------
173
+
174
+ - Require ``cone.tile>2.0.99``. ``cone.tile`` 2.0 secures tiles only if an
175
+ authentication and an authorization policy are registered, so it does not
176
+ protect tiles with the security policy configured by ``cone.app.main``.
177
+ [rnix]
178
+
179
+ - Remove ``MainMenu.on_sidebar_left_resize``, which rendered the main menu
180
+ scrollbar again on each left sidebar resize. Both sidebars live inside the
181
+ content area below the header, so resizing them does not change the width of
182
+ the main menu. ``MainMenu`` keeps the inherited ``LayoutAware`` behavior.
183
+ [rnix]
184
+
185
+ - Fix shift click selection of ``Selectable`` items. Shift click selects the
186
+ range from the last plain or ctrl clicked item (the anchor) to the clicked
187
+ item, as in file managers. Before, a further shift click started the range at
188
+ the wrong item. Shift click without an anchor acts like a plain click.
189
+ ``Selectable.select_direction`` and ``Selectable.get_nearest`` are removed.
190
+ [rnix]
191
+
192
+ - Fix ``SidebarLeft`` and ``SidebarRight`` skipping their initialization on
193
+ small viewports with a stored lock state. The sidebar content and the ajax
194
+ destroy hook were missing.
195
+ [rnix]
196
+
197
+ - Fix ``LayoutAware`` handling a right sidebar resize as a left sidebar resize.
198
+ ``is_sidebar_left_collapsed`` and ``is_sidebar_right_collapsed`` are
199
+ properties now, so ``on_is_sidebar_left_collapsed`` and
200
+ ``on_is_sidebar_right_collapsed`` get called on changes. The unused
201
+ ``is_sidebar_collapsed`` property is removed.
202
+ [rnix]
203
+
204
+ - Fix the color mode toggle not following changes of the OS color scheme.
205
+ A destroyed ``ColorToggler`` stops following them and no longer keeps the
206
+ removed toggle in memory. Fix ``ColorMode.unbind`` not removing its
207
+ listener. ``ColorMode.media_query`` returns the same ``MediaQueryList`` on
208
+ each call now, the new ``ColorMode.unwatch`` removes a listener added with
209
+ ``ColorMode.watch``.
210
+ [rnix]
211
+
212
+ - Fix ``Header`` binding the mobile menu collapse handlers again on each switch
213
+ to compact mode, and keeping them after leaving compact mode or destroying
214
+ the header, which caused a ``TypeError`` on later collapse events.
215
+ [rnix]
216
+
217
+ - Extend the JS tests to 100 % coverage, all modules including bundles are
218
+ loaded by the tests now.
219
+ [rnix]
220
+
221
+ - Lint and format the JS code with biome. ``make check`` runs ``biome check``,
222
+ ``make format`` runs ``biome check --write`` (see ``include.mk``). Behavior
223
+ unchanged.
224
+ [rnix]
225
+
226
+ - JS tooling: Commit ``pnpm-lock.yaml``. Upgrade ``@web/test-runner`` to 1.0
227
+ and run the JS tests headless in Chromium via Playwright, installed in the JS
228
+ CI workflow. Drop the accidental ``install`` dev dependency. Pin patched
229
+ versions of vulnerable transitive dependencies via ``pnpm.overrides``.
230
+ [rnix]
231
+
232
+ - Use a Pyramid security policy instead of the authentication and
233
+ authorization policies deprecated in Pyramid 2.0. ``cone.app.main``
234
+ configures ``cone.app.security.SecurityPolicy`` (auth ticket cookie and
235
+ ACLs, principals from ``groups_callback``) unless a security policy is
236
+ registered already. The ``cone.auth_*`` settings keep working.
237
+ ``cone.app.auth_tkt_factory`` and ``cone.app.acl_factory`` are deprecated.
238
+ [rnix]
239
+
240
+ - Import ``Allow``, ``Deny``, ``Everyone`` and ``ALL_PERMISSIONS`` from
241
+ ``pyramid.authorization``, they are deprecated in ``pyramid.security``.
242
+ [rnix]
243
+
244
+ - Sort the imports with ruff (one per line, ``from`` imports first, no
245
+ sections) and format the code with ``ruff format`` (90 characters per line,
246
+ single quotes).
247
+ [rnix]
248
+
249
+ - Add import sorting (``I`` rules) and the formatter settings to the ruff
250
+ configuration in ``pyproject.toml``.
251
+ [rnix]
252
+
253
+
106
254
  2.0.0 (2026-10-24)
107
255
  ------------------
108
256
 
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.6.3/schema.json",
3
+ "files": {
4
+ "includes": ["js/src/**/*.js", "js/tests/**/*.js"]
5
+ },
6
+ "formatter": {
7
+ "enabled": true,
8
+ "indentStyle": "space",
9
+ "indentWidth": 4,
10
+ "lineWidth": 100
11
+ },
12
+ "linter": {
13
+ "enabled": true,
14
+ "rules": {
15
+ "preset": "recommended",
16
+ "correctness": {
17
+ "noUnusedVariables": "warn"
18
+ },
19
+ "complexity": {
20
+ "noStaticOnlyClass": "off",
21
+ "noThisInStatic": "off"
22
+ }
23
+ }
24
+ },
25
+ "javascript": {
26
+ "formatter": {
27
+ "quoteStyle": "single",
28
+ "semicolons": "always"
29
+ }
30
+ }
31
+ }
@@ -46,3 +46,20 @@ example-lingua: $(LINGUA_TARGET)
46
46
  LINGUA_SEARCH_PATH=$(EXAMPLE_LINGUA_SEARCH_PATH) \
47
47
  LINGUA_OPTIONS=$(EXAMPLE_LINGUA_OPTIONS) \
48
48
  lingua
49
+
50
+ ##############################################################################
51
+ # biome (JS linting and formatting)
52
+ ##############################################################################
53
+
54
+ .PHONY: biome-check
55
+ biome-check: $(NODEJS_TARGET)
56
+ @echo "Run biome check"
57
+ @biome check
58
+
59
+ .PHONY: biome-format
60
+ biome-format: $(NODEJS_TARGET)
61
+ @echo "Run biome format"
62
+ @biome check --write
63
+
64
+ CHECK_TARGETS+=biome-check
65
+ FORMAT_TARGETS+=biome-format
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cone.app"
7
- version = "2.0.0"
7
+ version = "2.2.0"
8
8
  description = "Web application stub"
9
9
  dynamic = ["readme"]
10
10
  requires-python = ">=3.10"
@@ -19,22 +19,23 @@ classifiers = [
19
19
  "Programming Language :: Python :: 3.12",
20
20
  "Programming Language :: Python :: 3.13",
21
21
  "Programming Language :: Python :: 3.14",
22
+ "Programming Language :: Python :: 3.15",
22
23
  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
23
24
  ]
24
25
  dependencies = [
25
26
  "Chameleon",
26
- "cone.tile>1.99",
27
- "node.ext.ugm>1.99",
27
+ "cone.tile>2.1.99",
28
+ "node.ext.ugm>2.0.99",
28
29
  "node>1.99",
29
30
  "pyramid>=2.0",
30
31
  "pyramid_chameleon",
31
32
  "pyramid_zcml",
32
33
  "repoze.workflow",
33
- "treibstoff>1.99",
34
+ "treibstoff>2.0.99",
34
35
  "webresource>1.2.99",
35
36
  "yafowil.bootstrap>1.99",
36
37
  "yafowil.webob>1.99",
37
- "yafowil>3.99",
38
+ "yafowil>4.1.99",
38
39
  ]
39
40
 
40
41
  [project.optional-dependencies]
@@ -102,12 +103,22 @@ consider_namespace_packages = true
102
103
  addopts = ["--import-mode=importlib"]
103
104
  pythonpath = "src"
104
105
 
106
+ [tool.ruff]
107
+ line-length = 90
108
+
105
109
  [tool.ruff.lint]
106
- select = ["E4", "E7", "E9", "F", "UP"]
110
+ select = ["E4", "E7", "E9", "F", "I", "UP"]
107
111
  # UP008: zero-argument ``super()`` breaks on ``@plumbing`` decorated classes.
108
112
  # UP031: ``%`` formatting is kept.
109
113
  ignore = ["UP008", "UP031"]
110
114
 
115
+ [tool.ruff.lint.isort]
116
+ force-single-line = true
117
+ from-first = true
118
+ no-sections = true
119
+ lines-after-imports = 2
120
+ order-by-type = false
121
+
111
122
  [tool.ruff.format]
112
123
  quote-style = "single"
113
124
 
@@ -15,7 +15,9 @@ from pyramid.authentication import AuthTktAuthenticationPolicy
15
15
  from pyramid.authorization import ACLAuthorizationPolicy
16
16
  from pyramid.config import Configurator
17
17
  from pyramid.interfaces import ISecurityPolicy
18
+ from pyramid.settings import asbool
18
19
  from pyramid.traversal import ResourceTreeTraverser
20
+ from pyramid.tweens import INGRESS
19
21
  from yafowil.bootstrap import configure_factory
20
22
  from zope.component import adapter
21
23
  from zope.component import getGlobalSiteManager
@@ -25,6 +27,7 @@ import os
25
27
  import pyramid_chameleon
26
28
  import pyramid_zcml
27
29
  import threading
30
+ import warnings
28
31
 
29
32
 
30
33
  logger = logging.getLogger('cone.app')
@@ -32,6 +35,9 @@ logger = logging.getLogger('cone.app')
32
35
  # configuration
33
36
  cfg = Properties()
34
37
 
38
+ # show tracebacks to clients
39
+ cfg.show_tracebacks = False
40
+
35
41
  # available languages
36
42
  cfg.available_languages = []
37
43
 
@@ -169,12 +175,24 @@ def thread_shutdown_hook(func): # pragma: no cover
169
175
  return func
170
176
 
171
177
 
178
+ # B/C
172
179
  def auth_tkt_factory(**kwargs):
180
+ warnings.warn(
181
+ '``cone.app.auth_tkt_factory`` is deprecated, ``cone.app.main`` '
182
+ 'configures ``cone.app.security.SecurityPolicy``',
183
+ DeprecationWarning,
184
+ )
173
185
  kwargs.setdefault('callback', security.groups_callback)
174
186
  return AuthTktAuthenticationPolicy(**kwargs)
175
187
 
176
188
 
189
+ # B/C
177
190
  def acl_factory(**kwargs):
191
+ warnings.warn(
192
+ '``cone.app.acl_factory`` is deprecated, ``cone.app.main`` '
193
+ 'configures ``cone.app.security.SecurityPolicy``',
194
+ DeprecationWarning,
195
+ )
178
196
  return ACLAuthorizationPolicy()
179
197
 
180
198
 
@@ -210,6 +228,41 @@ def start_thread_monitor(): # pragma: no cover
210
228
  monitor.start()
211
229
 
212
230
 
231
+ def create_security_policy(settings):
232
+ """Create the security policy from application settings.
233
+
234
+ The settings used for this get removed from ``settings``.
235
+
236
+ :param settings: The application settings.
237
+ :return: The security policy.
238
+ :raises ValueError: If ``cone.auth_secret`` is missing or the former default.
239
+ """
240
+ auth_secret = settings.pop('cone.auth_secret', None)
241
+ if not auth_secret or auth_secret == 'secret':
242
+ raise ValueError(
243
+ 'cone.auth_secret signs the authentication cookie and must be set to a '
244
+ 'secret value of your own.'
245
+ )
246
+ auth_reissue_time = settings.pop('cone.auth_reissue_time', None)
247
+ if auth_reissue_time is not None:
248
+ auth_reissue_time = int(auth_reissue_time)
249
+ auth_max_age = settings.pop('cone.auth_max_age', None)
250
+ if auth_max_age is not None:
251
+ auth_max_age = int(auth_max_age)
252
+ return security.SecurityPolicy(
253
+ secret=auth_secret,
254
+ cookie_name=settings.pop('cone.auth_cookie_name', 'auth_tkt'),
255
+ secure=asbool(settings.pop('cone.auth_secure', False)),
256
+ include_ip=asbool(settings.pop('cone.auth_include_ip', False)),
257
+ timeout=settings.pop('cone.auth_timeout', None),
258
+ reissue_time=auth_reissue_time,
259
+ max_age=auth_max_age,
260
+ http_only=asbool(settings.pop('cone.auth_http_only', True)),
261
+ path=settings.pop('cone.auth_path', '/'),
262
+ wild_domain=asbool(settings.pop('cone.auth_wild_domain', True)),
263
+ )
264
+
265
+
213
266
  def main(global_config, **settings):
214
267
  """Returns WSGI application."""
215
268
  # set authentication related application properties
@@ -222,33 +275,9 @@ def main(global_config, **settings):
222
275
  if node_available_callback:
223
276
  security.node_available = import_from_string(node_available_callback)
224
277
 
225
- auth_secret = settings.pop('cone.auth_secret', 'secret')
226
- auth_cookie_name = settings.pop('cone.auth_cookie_name', 'auth_tkt')
227
- auth_secure = settings.pop('cone.auth_secure', False)
228
- auth_include_ip = settings.pop('cone.auth_include_ip', False)
229
- auth_timeout = settings.pop('cone.auth_timeout', None)
230
- auth_reissue_time = settings.pop('cone.auth_reissue_time', None)
231
- if auth_reissue_time is not None:
232
- auth_reissue_time = int(auth_reissue_time)
233
- auth_max_age = settings.pop('cone.auth_max_age', None)
234
- if auth_max_age is not None:
235
- auth_max_age = int(auth_max_age)
236
- auth_http_only = settings.pop('cone.auth_http_only', False)
237
- auth_path = settings.pop('cone.auth_path', '/')
238
- auth_wild_domain = settings.pop('cone.auth_wild_domain', True)
278
+ security_policy = create_security_policy(settings)
239
279
 
240
- auth_policy = auth_tkt_factory(
241
- secret=auth_secret,
242
- cookie_name=auth_cookie_name,
243
- secure=auth_secure,
244
- include_ip=auth_include_ip,
245
- timeout=auth_timeout,
246
- reissue_time=auth_reissue_time,
247
- max_age=auth_max_age,
248
- http_only=auth_http_only,
249
- path=auth_path,
250
- wild_domain=auth_wild_domain,
251
- )
280
+ cfg.show_tracebacks = asbool(settings.pop('cone.show_tracebacks', False))
252
281
 
253
282
  # create root node
254
283
  global root
@@ -268,10 +297,9 @@ def main(global_config, **settings):
268
297
  # Initialize resource registry
269
298
  ResourceRegistry.initialize(config, settings)
270
299
 
271
- # set authentication and authorization policies
300
+ # set security policy
272
301
  if config.registry.queryUtility(ISecurityPolicy) is None:
273
- config.set_authentication_policy(auth_policy)
274
- config.set_authorization_policy(acl_factory())
302
+ config.set_security_policy(security_policy)
275
303
  config.commit()
276
304
 
277
305
  # begin configuration
@@ -302,6 +330,9 @@ def main(global_config, **settings):
302
330
  # provide locales either in yafowil resources or as entry points in
303
331
  # all yafowil packages providing translations
304
332
 
333
+ # outermost, a refused request does not reach the transaction or the views
334
+ config.add_tween('cone.app.origin.origin_check_tween_factory', under=INGRESS)
335
+
305
336
  # static routes
306
337
  config.add_route('favicon', '/favicon.ico')
307
338
  # XXX: robots.txt
@@ -1,4 +1,3 @@
1
- import copy
2
1
  from cone.app.browser.utils import bdajax_warning
3
2
  from cone.app.browser.utils import make_query
4
3
  from cone.app.browser.utils import make_url
@@ -10,6 +9,7 @@ from cone.tile import render_tile
10
9
  from node.interfaces import IMappingOrder
11
10
  from odict import odict
12
11
  from pyramid.i18n import TranslationStringFactory
12
+ import copy
13
13
 
14
14
 
15
15
  _ = TranslationStringFactory('cone.app')
@@ -478,9 +478,7 @@ class ActionDelete(LinkAction):
478
478
  id = 'toolbaraction-delete'
479
479
  icon = 'bi-trash3'
480
480
  action = 'delete:NONE:NONE'
481
- confirm = _(
482
- 'delete_item_confirm', default='Do you really want to delete this Item?'
483
- )
481
+ confirm = _('delete_item_confirm', default='Do you really want to delete this Item?')
484
482
  text = _('action_delete', default='Delete')
485
483
 
486
484
  @property
@@ -489,9 +487,7 @@ class ActionDelete(LinkAction):
489
487
  scope = self.action_scope == 'content'
490
488
  if self.model.properties.default_content_tile:
491
489
  scope = self.action_scope == 'view'
492
- return (
493
- self.model.properties.action_delete and self.permitted('delete') and scope
494
- )
490
+ return self.model.properties.action_delete and self.permitted('delete') and scope
495
491
 
496
492
 
497
493
  class ActionDeleteChildren(LinkAction):