wagtail 6.3.1__py3-none-any.whl → 6.3.3__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 (37) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.mo +0 -0
  3. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.po +5 -5
  4. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  5. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +29 -0
  6. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  7. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  8. wagtail/admin/static/wagtailadmin/css/panels/streamfield.css +1 -1
  9. wagtail/admin/userbar.py +1 -0
  10. wagtail/blocks/migrations/operations.py +10 -10
  11. wagtail/blocks/stream_block.py +1 -1
  12. wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.mo +0 -0
  13. wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.po +4 -4
  14. wagtail/contrib/forms/tests/test_models.py +7 -5
  15. wagtail/contrib/frontend_cache/backends/cloudfront.py +1 -1
  16. wagtail/contrib/frontend_cache/tests.py +1 -1
  17. wagtail/images/blocks.py +8 -0
  18. wagtail/images/tests/test_blocks.py +31 -0
  19. wagtail/search/backends/database/mysql/mysql.py +6 -2
  20. wagtail/search/tests/test_mysql_backend.py +75 -0
  21. wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
  22. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +4 -3
  23. wagtail/test/snippets/apps.py +10 -0
  24. wagtail/test/streamfield_migrations/testutils.py +4 -4
  25. wagtail/tests/streamfield_migrations/test_migration_names.py +6 -6
  26. wagtail/tests/streamfield_migrations/test_migrations.py +46 -1
  27. wagtail/tests/test_streamfield.py +18 -0
  28. wagtail/users/locale/nl/LC_MESSAGES/django.mo +0 -0
  29. wagtail/users/locale/nl/LC_MESSAGES/django.po +4 -3
  30. wagtail/users/permission_order.py +16 -2
  31. wagtail/users/templatetags/wagtailusers_tags.py +3 -2
  32. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/METADATA +1 -1
  33. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/RECORD +37 -37
  34. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/LICENSE +0 -0
  35. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/WHEEL +0 -0
  36. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/entry_points.txt +0 -0
  37. {wagtail-6.3.1.dist-info → wagtail-6.3.3.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- .DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}.Draftail-Icon{fill:currentColor;pointer-events:none;vertical-align:middle}.Draftail-Editor{--draftail-offset-inline-start:2rem;--draftail-text-direction:1;border:0;border-radius:0;position:relative}.Draftail-Editor[dir=rtl],[dir=rtl] .Draftail-Editor{--draftail-text-direction:-1}.Draftail-Editor--readonly{pointer-events:none}.Draftail-Editor--readonly .DraftEditor-editorContainer{opacity:.5}.Draftail-Editor--readonly .DraftEditor-editorContainer:before{content:"";display:block;height:100%;inset-inline-start:0;position:absolute;top:0;width:100%;z-index:21}.Draftail-Editor .DraftEditor-root{color:var(--w-color-text-context);font-family:var(--w-font-sans);font-size:1.1875rem;font-variant-ligatures:none;line-height:1.5;overflow:auto}.Draftail-Editor .public-DraftEditor-content,.Draftail-Editor .public-DraftEditorPlaceholder-root{padding:.625rem 1.25rem}.Draftail-Editor .public-DraftEditor-content>*>figure{margin:0}.Draftail-Editor .public-DraftEditorPlaceholder-inner{color:var(--w-color-text-placeholder)}.Draftail-Editor .public-DraftEditorPlaceholder-inner,.Draftail-block--unstyled{margin:.625rem 0}.Draftail-block--empty:not([class*=-list-item]):before{color:var(--w-color-text-placeholder);pointer-events:none;position:absolute;-webkit-user-select:none;user-select:none}@media (forced-colors:active){.Draftail-block--empty:not([class*=-list-item]):before{color:GrayText}}.Draftail-Editor .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.Draftail-Editor [data-tippy-root]{max-width:calc(100vw - 10px)}.Draftail-Editor .tippy-box{position:relative;transition-property:transform,visibility,opacity}.Draftail-Editor .tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.Draftail-Editor .tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;inset-inline-start:0;transform-origin:center top}.Draftail-Editor .tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.Draftail-Editor .tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;inset-inline-start:0;top:-7px;transform-origin:center bottom}.Draftail-Editor .tippy-box[data-placement^=left]>.tippy-arrow{inset-inline-end:0}.Draftail-Editor .tippy-box[data-placement^=left]>.tippy-arrow:before{border-inline-start-color:initial;border-width:8px 0 8px 8px;inset-inline-end:-7px;transform-origin:center left}.Draftail-Editor .tippy-box[data-placement^=right]>.tippy-arrow{inset-inline-start:0}.Draftail-Editor .tippy-box[data-placement^=right]>.tippy-arrow:before{border-inline-end-color:initial;border-width:8px 8px 8px 0;inset-inline-start:-7px;transform-origin:center right}.Draftail-Editor .tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.Draftail-Editor .tippy-arrow{height:16px;width:16px}.Draftail-Editor .tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.Draftail-Editor .tippy-content{padding:5px 9px;position:relative;z-index:1}.Draftail-Tooltip{background:none;border-radius:0;color:inherit;font-size:inherit;outline:var(--draftail-contrast-outline-modal,10px solid #0000)}.Draftail-Tooltip .tippy-content{padding:0}.Draftail-Tooltip__target{pointer-events:none;position:absolute;visibility:hidden}.Draftail-Tooltip__backdrop{background-color:#0000;bottom:0;inset-inline-end:0;inset-inline-start:0;position:relative;top:0;transition:background-color .1s 0s;z-index:41}.Draftail-Tooltip__backdrop--visible{background-color:#0000001a;position:fixed}.Draftail-ComboBox{background:var(--w-color-surface-field);border-radius:5px;box-shadow:5px 5px 20px #0000001a;color:var(--w-color-text-context);font-size:1.1875rem;min-width:240px;outline:var(--draftail-contrast-outline-modal,10px solid #0000)}.Draftail-ComboBox__label{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.Draftail-ComboBox__field{padding:10px}.Draftail-ComboBox--inline input[disabled]{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.Draftail-ComboBox [aria-autocomplete=list]{border:0;border-radius:0;line-height:1.5;padding:7px 20px;width:100%}.Draftail-ComboBox [aria-autocomplete=list]::placeholder{color:var(--w-color-text-placeholder)}.Draftail-ComboBox__optgroup-label{border-top:var(--draftail-contrast-outline,2px solid #0000);font-size:1rem;font-weight:700;padding:10px}@media (forced-colors:active){.Draftail-ComboBox__optgroup-label{color:GrayText}}.Draftail-ComboBox__menu{max-height:70vh;overflow-y:scroll}.Draftail-ComboBox__option{cursor:pointer}.Draftail-ComboBox__option,.Draftail-ComboBox__status{align-items:center;border:var(--draftail-contrast-outline,2px solid #0000);display:flex;font-size:.875rem;font-weight:700;line-height:1.4;padding:10px}.Draftail-ComboBox__option[aria-selected=true],.Draftail-ComboBox__status[aria-selected=true]{background-color:#ddd;border-color:currentColor}@media (forced-colors:active){.Draftail-ComboBox__option[aria-selected=true],.Draftail-ComboBox__status[aria-selected=true]{background:Highlight;color:HighlightText}}.Draftail-ComboBox__option-icon{height:1.25rem;margin-inline-end:6px;margin-inline-start:6px;width:1.25rem}@media (forced-colors:active){.Draftail-ComboBox__option-icon,.Draftail-ComboBox__option-text{color:initial}}.Draftail-Toolbar{background-color:var(--w-color-surface-menus);border-bottom:0;border-radius:.3125rem;color:var(--w-color-text-button);padding:.375rem;position:relative}.Draftail-Editor--focus .Draftail-Toolbar{position:sticky;top:0;z-index:31}.Draftail-BlockToolbar{float:left}[dir=rtl] .Draftail-BlockToolbar{float:right}.Draftail-BlockToolbar~.DraftEditor-root,.Draftail-BlockToolbar~.Draftail-Toolbar{margin-inline-start:var(--draftail-offset-inline-start)}.Draftail-BlockToolbar__trigger{align-items:center;-webkit-appearance:none;appearance:none;background:var(--w-color-surface-field);border:1px solid;border-radius:50%;color:inherit;display:grid;height:1.5rem;justify-content:center;margin:0;margin-inline-end:.5rem;padding:0;position:absolute;transform:translateY(-50%);visibility:hidden;width:1.5rem}.Draftail-BlockToolbar__trigger:focus,.Draftail-BlockToolbar__trigger:hover,.Draftail-Editor--focus .Draftail-BlockToolbar__trigger,.Draftail-Editor:focus-within .Draftail-BlockToolbar__trigger{visibility:visible}.Draftail-FloatingToolbar{background-color:var(--w-color-surface-menus);border:0;border-radius:.3125rem;color:var(--w-color-text-button);outline:var(--draftail-contrast-outline-modal,10px solid #0000);padding:.375rem}.Draftail-FloatingToolbar__target{pointer-events:none;position:absolute;visibility:hidden}.Draftail-MetaToolbar{background-color:var(--w-color-surface-field);border-top:var(--draftail-contrast-outline,2px solid #0000);color:var(--w-color-surface-menus);display:flex;justify-content:flex-end;padding:.375rem;position:relative}.Draftail-ToolbarGroup{display:inline-block}.Draftail-ToolbarGroup:before{background-color:initial;content:"";display:inline-block;height:1rem;margin:0 .1875rem;vertical-align:middle;width:.0625rem}.Draftail-ToolbarGroup:first-of-type:before{display:none}.Draftail-Editor--readonly .Draftail-ToolbarGroup{opacity:.5}.Draftail-ToolbarButton{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#0000;border:1px solid #0000;border-radius:.3125rem;color:inherit;cursor:pointer;display:inline-block;font-size:1rem;font-weight:600;max-height:2.875rem;min-width:2.875rem;outline:var(--draftail-contrast-outline,2px solid #0000);padding:.75rem;-webkit-user-select:none;user-select:none}.Draftail-ToolbarButton--active{background-color:#ffffff1a;border:1px solid #fff3}@media (forced-colors:active){.Draftail-ToolbarButton--active{background:Highlight;border-color:currentColor;color:HighlightText}}.Draftail-ToolbarButton__label{display:inline-block;height:1em;vertical-align:middle}@media (forced-colors:active){.Draftail-ToolbarButton__label{color:initial}}[data-draftail-balloon]{cursor:pointer;position:relative}[data-draftail-balloon]:after,[data-draftail-balloon]:before{opacity:0;pointer-events:none;position:absolute;z-index:41}[data-draftail-balloon]:before{content:""}[data-draftail-balloon]:after{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#111111e6;border-radius:4px;color:#fff;content:attr(aria-label);font-size:.875em;outline:var(--draftail-contrast-outline-modal,10px solid #0000);padding:.5em 1em;white-space:pre}[data-draftail-balloon]:hover:after,[data-draftail-balloon]:hover:before{opacity:1;transition:all .1s ease-out 1s}[data-draftail-balloon=up]:after,[data-draftail-balloon=up]:before{inset-inline-start:50%;top:100%;transform:translate(calc(-50%*var(--draftail-text-direction)),-10px)}[data-draftail-balloon=up]:hover:after,[data-draftail-balloon=up]:hover:before{transform:translate(calc(-50%*var(--draftail-text-direction)))}[data-draftail-balloon=up]:after{margin-top:11px}[data-draftail-balloon=up]:before{border-bottom:9px solid #0000;border-color:#0000 #0000 #111111e6;border-style:solid;border-width:0 9px 6px;margin-top:5px}[data-draftail-balloon=down]:after,[data-draftail-balloon=down]:before{bottom:100%;inset-inline-start:50%;transform:translate(calc(-50%*var(--draftail-text-direction)),10px)}[data-draftail-balloon=down]:hover:after,[data-draftail-balloon=down]:hover:before{transform:translate(calc(-50%*var(--draftail-text-direction)))}[data-draftail-balloon=down]:after{margin-bottom:11px}[data-draftail-balloon=down]:before{border-top:9px solid #0000;border-color:#111111e6 #0000 #0000;border-style:solid;border-width:6px 9px 0;margin-bottom:5px}.Draftail-ToolbarButton--pin{background-color:var(--w-color-text-button);border:0;border-bottom-right-radius:0;border-end-end-radius:0;border-start-start-radius:0;border-top-left-radius:0;color:var(--w-color-surface-menus);inset-inline-end:0;padding:0;position:absolute;top:0}.Draftail-ToolbarButton--pin .Draftail-Icon{height:.75rem;width:.75rem}.Draftail-ToolbarButton--pin .Draftail-ToolbarButton__label{vertical-align:top}.Draftail-ToolbarButton--pin:before{margin-bottom:2px}.Draftail-ToolbarButton--pin:after{margin-bottom:8px}.Draftail-Toolbar--pin{padding-inline-end:1.5rem}.Draftail-DividerBlock{background:#ddd;border:0;height:1px;margin:10px 0}@media (forced-colors:active){.Draftail-DividerBlock{background:CanvasText}}.Tooltip{background-color:var(--w-color-surface-menus);border-radius:.3125rem;box-shadow:0 0 5px var(--w-color-black-35);color:#fff;padding:.625rem;position:absolute;z-index:11}.Tooltip:before{border:15px solid #0000;content:"";position:absolute}.Tooltip--top{margin-top:.625rem;transform:translateX(calc(var(--w-direction-factor)*-50%))}.Tooltip--top:before{content:none}.Tooltip--left{margin-inline-start:25px;transform:translateY(-50%)}.Tooltip--left:before{border-inline-end-color:var(--w-color-surface-menus);inset-inline-end:100%;top:50%;transform:translateY(-50%)}.Tooltip--top-left{margin-top:25px}.Tooltip--top-left:before{border-bottom-color:var(--w-color-surface-menus);bottom:100%;inset-inline-start:25px}.Tooltip__link{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-size:.875rem;margin-inline-end:1.5rem}.Tooltip__link,.Tooltip__link:hover{color:var(--w-color-text-button)}.Tooltip__button.no.button-secondary{border-color:currentColor;color:var(--w-color-critical-100)}.Tooltip__button.no.button-secondary:hover{color:var(--w-color-critical-200)}.Draftail-CommentControl{display:none}.tab-content--comments-enabled .Draftail-CommentControl{display:inline-block}.Draftail-CommentControl .Draftail-ToolbarButton{color:var(--w-color-text-button-outline-default)}.Draftail-CommentControl .Draftail-ToolbarButton:hover .icon-comment-add-reversed,.Draftail-CommentControl .Draftail-ToolbarButton:not(:hover) .icon-comment-add{display:none}.EditorFallback__textarea{border-radius:6px;border-width:1px;margin-top:1rem;min-height:150px;padding:1rem;resize:vertical}.EditorFallback__error{background:none;box-shadow:none}.TooltipEntity{cursor:pointer}.TooltipEntity:hover{color:var(--w-color-surface-button-default)}.TooltipEntity .icon-warning{color:var(--w-color-critical-200)}.TooltipEntity .icon{height:1em;margin-inline-end:.2em;vertical-align:middle;width:1em}.MediaBlock{border:0;cursor:pointer;display:inline-block;padding:0;position:relative}.MediaBlock__icon-wrapper{background:var(--w-color-surface-menus);color:var(--w-color-text-button);inset-inline-end:0;line-height:1;padding:.75rem 1.125rem;pointer-events:none;position:absolute;top:0}.MediaBlock__icon-wrapper .icon{height:1em;vertical-align:text-top;width:1em}.MediaBlock__icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.MediaBlock__img{background-color:var(--w-color-text-context);display:block;height:auto;min-height:50px;min-width:256px;object-fit:contain;pointer-events:none;width:256px}.MediaBlock__fallback{align-items:center;bottom:0;color:var(--w-color-surface-page);display:flex;inset-inline-end:0;inset-inline-start:0;justify-content:center;position:absolute;top:0}.ImageBlock__field{color:var(--w-color-surface-page);cursor:pointer;display:block;float:none;margin-bottom:1.5rem;padding:0;width:auto}.ImageBlock__field__input{background-color:var(--w-color-surface-field);border:0;color:var(--w-color-text-context);font-size:inherit;font-size:1rem}.ImageBlock__field__input[readonly]{color:var(--w-color-border-field-inactive)}.ImageBlock__alt{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:.875rem}.EmbedBlock__link{display:block;margin-bottom:.75rem}.Draftail-Editor .DraftEditor-editorContainer h1,.Draftail-Editor .DraftEditor-editorContainer h2,.Draftail-Editor .DraftEditor-editorContainer h3,.Draftail-Editor .DraftEditor-editorContainer h4,.Draftail-Editor .DraftEditor-editorContainer h5,.Draftail-Editor .DraftEditor-editorContainer h6{color:inherit;font-weight:700;line-height:1.3}.Draftail-Editor .DraftEditor-editorContainer h1{font-size:1.875rem}.Draftail-Editor .DraftEditor-editorContainer h2{font-size:1.5rem}.Draftail-Editor .DraftEditor-editorContainer h3{font-size:1.375rem}.Draftail-Editor .DraftEditor-editorContainer h4{font-size:1.125rem}.Draftail-Editor .DraftEditor-editorContainer h5{font-size:1rem}.Draftail-Editor .DraftEditor-editorContainer h6{font-size:.875rem}.Draftail-Editor{--draftail-offset-inline-start:0px;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-field);border:1px solid var(--w-color-border-field-default);border-radius:.3125rem;color:var(--w-color-text-context)}.w-contrast-more .Draftail-Editor{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-more .Draftail-Editor:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-more .Draftail-Editor[disabled],.w-contrast-more .Draftail-Editor[disabled]:hover{border-style:dashed}@media (prefers-contrast:more){.w-contrast-system .Draftail-Editor{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-system .Draftail-Editor:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-system .Draftail-Editor[disabled],.w-contrast-system .Draftail-Editor[disabled]:hover{border-style:dashed}}.Draftail-Editor:hover{border-color:var(--w-color-border-field-hover)}.Draftail-Editor[disabled],.Draftail-Editor[disabled]:hover{background-color:var(--w-color-surface-field-inactive);border-color:var(--w-color-border-field-inactive);color:var(--w-color-text-placeholder);cursor:not-allowed}.Draftail-Editor[aria-invalid=true],.w-field--error>.w-field__input>*>.Draftail-Editor,.w-field--error>.w-field__input>.Draftail-Editor{border-color:var(--w-color-critical-200)}.Draftail-Editor::placeholder{color:var(--w-color-text-placeholder)}.Draftail-Editor--focus{outline:3px solid var(--w-color-focus)}.Draftail-Editor__wrapper{position:relative;width:100%}.Draftail-Toolbar{background-color:var(--w-color-surface-field);border-end-end-radius:0;border-end-start-radius:0;border-width:0;color:var(--w-color-text-placeholder)}.Draftail-Toolbar--pin{display:flex;flex-wrap:wrap}.Draftail-Editor--focus .Draftail-Toolbar{color:var(--w-color-text-context);top:100px}@media screen and (min-width:50em){.Draftail-Editor--focus .Draftail-Toolbar{top:50px}}.w-theme-light .Draftail-Toolbar .Draftail-ToolbarButton--active{background-color:var(--w-color-surface-header);border-color:var(--w-color-border-furniture)}@media (forced-colors:active){.w-theme-light .Draftail-Toolbar .Draftail-ToolbarButton--active{background:Highlight}}@media (prefers-color-scheme:light){.w-theme-system .Draftail-Toolbar .Draftail-ToolbarButton--active{background-color:var(--w-color-surface-header);border-color:var(--w-color-border-furniture)}}@media (prefers-color-scheme:light) and (forced-colors:active){.w-theme-system .Draftail-Toolbar .Draftail-ToolbarButton--active{background:Highlight}}.Draftail-MetaToolbar{background-color:initial;inset-inline-end:0;position:absolute;visibility:hidden}.Draftail-MetaToolbar:empty{display:none}@media (hover:hover){.Draftail-MetaToolbar{visibility:hidden}.Draftail-Editor:focus-within .Draftail-MetaToolbar,.Draftail-Editor:hover .Draftail-MetaToolbar{visibility:visible}}.Draftail-BlockToolbar{background:#0000;display:flex;height:100%;inset-inline-start:-40px;justify-content:center;position:absolute;top:0;width:40px}.Draftail-BlockToolbar__trigger{color:var(--w-color-text-button-outline-default);height:1rem;margin-inline-end:calc(.25rem - 2px);width:1rem}@media screen and (min-width:50em){.Draftail-BlockToolbar__trigger{margin-inline-end:calc(1.375rem - 2px)}}.Draftail-BlockToolbar__trigger:before{background:#0000;border-radius:.3125rem;content:"";display:block;height:30px;inset-inline-start:50%;position:absolute;top:50%;transform:translate(calc(var(--w-direction-factor)*-50%),-50%);width:30px;z-index:1}.Draftail-Editor:not(:hover,.Draftail-Editor--focus,:focus-within) .Draftail-BlockToolbar__trigger{visibility:hidden!important}.Draftail-BlockToolbar__trigger:focus-visible,.Draftail-BlockToolbar__trigger:hover{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.Draftail-BlockToolbar__trigger .icon{height:.75rem;transition:transform .3s ease;width:.75rem}.Draftail-BlockToolbar__trigger[aria-expanded=true] .icon{transform:rotate(45deg)}.Draftail-ToolbarGroup{display:flex}.Draftail-ToolbarGroup:before{display:none}.Draftail-ToolbarButton{align-items:center;display:flex;height:1.875rem;justify-content:center;margin-inline-end:.625rem;min-width:1.875rem;padding:0}.w-contrast-more .Draftail-ToolbarButton{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-more .Draftail-ToolbarButton:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-more .Draftail-ToolbarButton[disabled],.w-contrast-more .Draftail-ToolbarButton[disabled]:hover{border-style:dashed}@media (prefers-contrast:more){.w-contrast-system .Draftail-ToolbarButton{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-system .Draftail-ToolbarButton:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-system .Draftail-ToolbarButton[disabled],.w-contrast-system .Draftail-ToolbarButton[disabled]:hover{border-style:dashed}}.Draftail-ToolbarGroup:last-of-type .Draftail-ToolbarButton:last-of-type{margin-inline-end:0}.Draftail-ToolbarButton[disabled]{opacity:.3}.Draftail-ToolbarButton:active,.Draftail-ToolbarButton:hover{border:1px solid var(--w-color-border-button-small-outline-default)}.Draftail-ToolbarButton .icon{height:1em;vertical-align:middle;width:1em}.Draftail-ToolbarButton .icon-h1,.Draftail-ToolbarButton .icon-h2,.Draftail-ToolbarButton .icon-h3,.Draftail-ToolbarButton .icon-h4,.Draftail-ToolbarButton .icon-h5,.Draftail-ToolbarButton .icon-h6{height:1.25em;width:1.25em}.Draftail-ToolbarButton--pin{border:1px solid var(--w-color-surface-tooltip);height:1.5rem;min-width:1.5rem}.Draftail-ToolbarButton--pin:hover{border-color:var(--w-color-surface-tooltip)}.Draftail-Toolbar .Draftail-ToolbarButton--pin{background-color:var(--w-color-surface-page);border-color:var(--w-color-border-field-default);border-inline-end-width:0;border-top-width:0;color:currentColor}.Draftail-Editor:hover .Draftail-Toolbar .Draftail-ToolbarButton--pin{border-color:var(--w-color-border-field-hover)}.Draftail-block--blockquote{border-inline-start:.25em solid var(--w-color-border-field-default);color:var(--w-color-text-meta);margin:1em 0;padding:1em 2em}.DraftEditor-editorContainer{border:0}
1
+ .DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}.Draftail-Icon{fill:currentColor;pointer-events:none;vertical-align:middle}.Draftail-Editor{--draftail-offset-inline-start:2rem;--draftail-text-direction:1;border:0;border-radius:0;position:relative}.Draftail-Editor[dir=rtl],[dir=rtl] .Draftail-Editor{--draftail-text-direction:-1}.Draftail-Editor--readonly{pointer-events:none}.Draftail-Editor--readonly .DraftEditor-editorContainer{opacity:.5}.Draftail-Editor--readonly .DraftEditor-editorContainer:before{content:"";display:block;height:100%;inset-inline-start:0;position:absolute;top:0;width:100%;z-index:21}.Draftail-Editor .DraftEditor-root{color:var(--w-color-text-context);font-family:var(--w-font-sans);font-size:1.1875rem;font-variant-ligatures:none;line-height:1.5;overflow:auto}.Draftail-Editor .public-DraftEditor-content,.Draftail-Editor .public-DraftEditorPlaceholder-root{padding:.625rem 1.25rem}.Draftail-Editor .public-DraftEditor-content>*>figure{margin:0}.Draftail-Editor .public-DraftEditorPlaceholder-inner{color:var(--w-color-text-placeholder)}.Draftail-Editor .public-DraftEditorPlaceholder-inner,.Draftail-block--unstyled{margin:.625rem 0}.Draftail-block--empty:not([class*=-list-item]):before{color:var(--w-color-text-placeholder);pointer-events:none;position:absolute;-webkit-user-select:none;user-select:none}@media (forced-colors:active){.Draftail-block--empty:not([class*=-list-item]):before{color:GrayText}}.Draftail-Editor .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.Draftail-Editor [data-tippy-root]{max-width:calc(100vw - 10px)}.Draftail-Editor .tippy-box{position:relative;transition-property:transform,visibility,opacity}.Draftail-Editor .tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.Draftail-Editor .tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;inset-inline-start:0;transform-origin:center top}.Draftail-Editor .tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.Draftail-Editor .tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;inset-inline-start:0;top:-7px;transform-origin:center bottom}.Draftail-Editor .tippy-box[data-placement^=left]>.tippy-arrow{inset-inline-end:0}.Draftail-Editor .tippy-box[data-placement^=left]>.tippy-arrow:before{border-inline-start-color:initial;border-width:8px 0 8px 8px;inset-inline-end:-7px;transform-origin:center left}.Draftail-Editor .tippy-box[data-placement^=right]>.tippy-arrow{inset-inline-start:0}.Draftail-Editor .tippy-box[data-placement^=right]>.tippy-arrow:before{border-inline-end-color:initial;border-width:8px 8px 8px 0;inset-inline-start:-7px;transform-origin:center right}.Draftail-Editor .tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.Draftail-Editor .tippy-arrow{height:16px;width:16px}.Draftail-Editor .tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.Draftail-Editor .tippy-content{padding:5px 9px;position:relative;z-index:1}.Draftail-Tooltip{background:none;border-radius:0;color:inherit;font-size:inherit;outline:var(--draftail-contrast-outline-modal,10px solid #0000)}.Draftail-Tooltip .tippy-content{padding:0}.Draftail-Tooltip__target{pointer-events:none;position:absolute;visibility:hidden}.Draftail-Tooltip__backdrop{background-color:#0000;bottom:0;inset-inline-end:0;inset-inline-start:0;position:relative;top:0;transition:background-color .1s 0s;z-index:41}.Draftail-Tooltip__backdrop--visible{background-color:#0000001a;position:fixed}.Draftail-ComboBox{background:var(--w-color-surface-field);border-radius:5px;box-shadow:5px 5px 20px #0000001a;color:var(--w-color-text-context);font-size:1.1875rem;min-width:240px;outline:var(--draftail-contrast-outline-modal,10px solid #0000)}.Draftail-ComboBox__label{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.Draftail-ComboBox__field{padding:10px}.Draftail-ComboBox--inline input[disabled]{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.Draftail-ComboBox [aria-autocomplete=list]{border:0;border-radius:0;line-height:1.5;padding:7px 20px;width:100%}.Draftail-ComboBox [aria-autocomplete=list]::placeholder{color:var(--w-color-text-placeholder)}.Draftail-ComboBox__optgroup-label{border-top:var(--draftail-contrast-outline,2px solid #0000);font-size:1rem;font-weight:700;padding:10px}@media (forced-colors:active){.Draftail-ComboBox__optgroup-label{color:GrayText}}.Draftail-ComboBox__menu{max-height:70vh;overflow-y:scroll}.Draftail-ComboBox__option{cursor:pointer}.Draftail-ComboBox__option,.Draftail-ComboBox__status{align-items:center;border:var(--draftail-contrast-outline,2px solid #0000);display:flex;font-size:.875rem;font-weight:700;line-height:1.4;padding:10px}.Draftail-ComboBox__option[aria-selected=true],.Draftail-ComboBox__status[aria-selected=true]{background-color:#ddd;border-color:currentColor}@media (forced-colors:active){.Draftail-ComboBox__option[aria-selected=true],.Draftail-ComboBox__status[aria-selected=true]{background:Highlight;color:HighlightText}}.Draftail-ComboBox__option-icon{height:1.25rem;margin-inline-end:6px;margin-inline-start:6px;width:1.25rem}@media (forced-colors:active){.Draftail-ComboBox__option-icon,.Draftail-ComboBox__option-text{color:initial}}.Draftail-Toolbar{background-color:var(--w-color-surface-menus);border-bottom:0;border-radius:.3125rem;color:var(--w-color-text-button);padding:.375rem;position:relative}.Draftail-Editor--focus .Draftail-Toolbar{position:sticky;top:0;z-index:31}.Draftail-BlockToolbar{float:left}[dir=rtl] .Draftail-BlockToolbar{float:right}.Draftail-BlockToolbar~.DraftEditor-root,.Draftail-BlockToolbar~.Draftail-Toolbar{margin-inline-start:var(--draftail-offset-inline-start)}.Draftail-BlockToolbar__trigger{align-items:center;-webkit-appearance:none;appearance:none;background:var(--w-color-surface-field);border:1px solid;border-radius:50%;color:inherit;display:grid;height:1.5rem;justify-content:center;margin:0;margin-inline-end:.5rem;padding:0;position:absolute;transform:translateY(-50%);visibility:hidden;width:1.5rem}.Draftail-BlockToolbar__trigger:focus,.Draftail-BlockToolbar__trigger:hover,.Draftail-Editor--focus .Draftail-BlockToolbar__trigger,.Draftail-Editor:focus-within .Draftail-BlockToolbar__trigger{visibility:visible}.Draftail-FloatingToolbar{background-color:var(--w-color-surface-menus);border:0;border-radius:.3125rem;color:var(--w-color-text-button);outline:var(--draftail-contrast-outline-modal,10px solid #0000);padding:.375rem}.Draftail-FloatingToolbar__target{pointer-events:none;position:absolute;visibility:hidden}.Draftail-MetaToolbar{background-color:var(--w-color-surface-field);border-top:var(--draftail-contrast-outline,2px solid #0000);color:var(--w-color-surface-menus);display:flex;justify-content:flex-end;padding:.375rem;position:relative}.Draftail-ToolbarGroup{display:inline-block}.Draftail-ToolbarGroup:before{background-color:initial;content:"";display:inline-block;height:1rem;margin:0 .1875rem;vertical-align:middle;width:.0625rem}.Draftail-ToolbarGroup:first-of-type:before{display:none}.Draftail-Editor--readonly .Draftail-ToolbarGroup{opacity:.5}.Draftail-ToolbarButton{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#0000;border:1px solid #0000;border-radius:.3125rem;color:inherit;cursor:pointer;display:inline-block;font-size:1rem;font-weight:600;max-height:2.875rem;min-width:2.875rem;outline:var(--draftail-contrast-outline,2px solid #0000);padding:.75rem;-webkit-user-select:none;user-select:none}.Draftail-ToolbarButton--active{background-color:#ffffff1a;border:1px solid #fff3}@media (forced-colors:active){.Draftail-ToolbarButton--active{background:Highlight;border-color:currentColor;color:HighlightText}}.Draftail-ToolbarButton__label{display:inline-block;height:1em;vertical-align:middle}@media (forced-colors:active){.Draftail-ToolbarButton__label{color:initial}}[data-draftail-balloon]{cursor:pointer;position:relative}[data-draftail-balloon]:after,[data-draftail-balloon]:before{opacity:0;pointer-events:none;position:absolute;z-index:41}[data-draftail-balloon]:before{content:""}[data-draftail-balloon]:after{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#111111e6;border-radius:4px;color:#fff;content:attr(aria-label);font-size:.875em;outline:var(--draftail-contrast-outline-modal,10px solid #0000);padding:.5em 1em;white-space:pre}[data-draftail-balloon]:hover:after,[data-draftail-balloon]:hover:before{opacity:1;transition:all .1s ease-out 1s}[data-draftail-balloon=up]:after,[data-draftail-balloon=up]:before{inset-inline-start:50%;top:100%;transform:translate(calc(-50%*var(--draftail-text-direction)),-10px)}[data-draftail-balloon=up]:hover:after,[data-draftail-balloon=up]:hover:before{transform:translate(calc(-50%*var(--draftail-text-direction)))}[data-draftail-balloon=up]:after{margin-top:11px}[data-draftail-balloon=up]:before{border-bottom:9px solid #0000;border-color:#0000 #0000 #111111e6;border-style:solid;border-width:0 9px 6px;margin-top:5px}[data-draftail-balloon=down]:after,[data-draftail-balloon=down]:before{bottom:100%;inset-inline-start:50%;transform:translate(calc(-50%*var(--draftail-text-direction)),10px)}[data-draftail-balloon=down]:hover:after,[data-draftail-balloon=down]:hover:before{transform:translate(calc(-50%*var(--draftail-text-direction)))}[data-draftail-balloon=down]:after{margin-bottom:11px}[data-draftail-balloon=down]:before{border-top:9px solid #0000;border-color:#111111e6 #0000 #0000;border-style:solid;border-width:6px 9px 0;margin-bottom:5px}.Draftail-ToolbarButton--pin{background-color:var(--w-color-text-button);border:0;border-bottom-right-radius:0;border-end-end-radius:0;border-start-start-radius:0;border-top-left-radius:0;color:var(--w-color-surface-menus);inset-inline-end:0;padding:0;position:absolute;top:0}.Draftail-ToolbarButton--pin .Draftail-Icon{height:.75rem;width:.75rem}.Draftail-ToolbarButton--pin .Draftail-ToolbarButton__label{vertical-align:top}.Draftail-ToolbarButton--pin:before{margin-bottom:2px}.Draftail-ToolbarButton--pin:after{margin-bottom:8px}.Draftail-Toolbar--pin{padding-inline-end:1.5rem}.Draftail-DividerBlock{background:#ddd;border:0;height:1px;margin:10px 0}@media (forced-colors:active){.Draftail-DividerBlock{background:CanvasText}}.Tooltip{background-color:var(--w-color-surface-menus);border-radius:.3125rem;box-shadow:0 0 5px var(--w-color-black-35);color:#fff;padding:.625rem;position:absolute;z-index:11}.Tooltip:before{border:15px solid #0000;content:"";position:absolute}.Tooltip--top{margin-top:.625rem;transform:translateX(calc(var(--w-direction-factor)*-50%))}.Tooltip--top:before{content:none}.Tooltip--left{margin-inline-start:25px;transform:translateY(-50%)}.Tooltip--left:before{border-inline-end-color:var(--w-color-surface-menus);inset-inline-end:100%;top:50%;transform:translateY(-50%)}.Tooltip--top-left{margin-top:25px}.Tooltip--top-left:before{border-bottom-color:var(--w-color-surface-menus);bottom:100%;inset-inline-start:25px}.Tooltip__link{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-size:.875rem;margin-inline-end:1.5rem}.Tooltip__link,.Tooltip__link:hover{color:var(--w-color-text-button)}.Tooltip__button.no.button-secondary{border-color:currentColor;color:var(--w-color-critical-100)}.Tooltip__button.no.button-secondary:hover{color:var(--w-color-critical-200)}.Draftail-CommentControl{display:none}.tab-content--comments-enabled .Draftail-CommentControl{display:inline-block}.Draftail-CommentControl .Draftail-ToolbarButton{color:var(--w-color-text-button-outline-default)}.Draftail-CommentControl .Draftail-ToolbarButton:hover .icon-comment-add-reversed,.Draftail-CommentControl .Draftail-ToolbarButton:not(:hover) .icon-comment-add{display:none}.EditorFallback__textarea{border-radius:6px;border-width:1px;margin-top:1rem;min-height:150px;padding:1rem;resize:vertical}.EditorFallback__error{background:none;box-shadow:none}.TooltipEntity{cursor:pointer}.TooltipEntity:hover{color:var(--w-color-surface-button-default)}.TooltipEntity .icon-warning{color:var(--w-color-critical-200)}.TooltipEntity .icon{height:1em;margin-inline-end:.2em;vertical-align:middle;width:1em}.MediaBlock{border:0;cursor:pointer;display:inline-block;padding:0;position:relative}.MediaBlock__icon-wrapper{background:var(--w-color-surface-menus);color:var(--w-color-text-button);inset-inline-end:0;line-height:1;padding:.75rem 1.125rem;pointer-events:none;position:absolute;top:0}.MediaBlock__icon-wrapper .icon{height:1em;vertical-align:text-top;width:1em}.MediaBlock__icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.MediaBlock__img{background-color:var(--w-color-text-context);display:block;height:auto;min-height:50px;min-width:256px;object-fit:contain;pointer-events:none;width:256px}.MediaBlock__fallback{align-items:center;bottom:0;color:var(--w-color-surface-page);display:flex;inset-inline-end:0;inset-inline-start:0;justify-content:center;position:absolute;top:0}.ImageBlock__field{color:var(--w-color-surface-page);cursor:pointer;display:block;float:none;margin-bottom:1.5rem;padding:0;width:auto}.ImageBlock__field__input{background-color:var(--w-color-surface-field);border:0;color:var(--w-color-text-context);font-size:inherit;font-size:1rem}.ImageBlock__field__input[readonly]{color:var(--w-color-border-field-inactive)}.ImageBlock__alt{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:.875rem}.EmbedBlock__link{display:block;margin-bottom:.75rem}.Draftail-Editor .DraftEditor-editorContainer h1,.Draftail-Editor .DraftEditor-editorContainer h2,.Draftail-Editor .DraftEditor-editorContainer h3,.Draftail-Editor .DraftEditor-editorContainer h4,.Draftail-Editor .DraftEditor-editorContainer h5,.Draftail-Editor .DraftEditor-editorContainer h6{color:inherit;font-weight:700;line-height:1.3}.Draftail-Editor .DraftEditor-editorContainer h1{font-size:1.875rem}.Draftail-Editor .DraftEditor-editorContainer h2{font-size:1.5rem}.Draftail-Editor .DraftEditor-editorContainer h3{font-size:1.375rem}.Draftail-Editor .DraftEditor-editorContainer h4{font-size:1.125rem}.Draftail-Editor .DraftEditor-editorContainer h5{font-size:1rem}.Draftail-Editor .DraftEditor-editorContainer h6{font-size:.875rem}.Draftail-Editor{--draftail-offset-inline-start:0px;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-field);border:1px solid var(--w-color-border-field-default);border-radius:.3125rem;color:var(--w-color-text-context)}.w-contrast-more .Draftail-Editor{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-more .Draftail-Editor:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-more .Draftail-Editor[disabled],.w-contrast-more .Draftail-Editor[disabled]:hover{border-style:dashed}@media (prefers-contrast:more){.w-contrast-system .Draftail-Editor{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-system .Draftail-Editor:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-system .Draftail-Editor[disabled],.w-contrast-system .Draftail-Editor[disabled]:hover{border-style:dashed}}.Draftail-Editor:hover{border-color:var(--w-color-border-field-hover)}.Draftail-Editor[disabled],.Draftail-Editor[disabled]:hover{background-color:var(--w-color-surface-field-inactive);border-color:var(--w-color-border-field-inactive);color:var(--w-color-text-placeholder);cursor:not-allowed}.Draftail-Editor[aria-invalid=true],.w-field--error>.w-field__input>*>.Draftail-Editor,.w-field--error>.w-field__input>.Draftail-Editor{border-color:var(--w-color-critical-200)}.Draftail-Editor::placeholder{color:var(--w-color-text-placeholder)}.Draftail-Editor--focus{outline:3px solid var(--w-color-focus)}.Draftail-Editor__wrapper{position:relative;width:100%}.Draftail-Toolbar{background-color:var(--w-color-surface-field);border-end-end-radius:0;border-end-start-radius:0;border-width:0;color:var(--w-color-text-placeholder)}.Draftail-Toolbar--pin{display:flex;flex-wrap:wrap}.Draftail-Editor--focus .Draftail-Toolbar{color:var(--w-color-text-context);top:100px}@media screen and (min-width:50em){.Draftail-Editor--focus .Draftail-Toolbar{top:50px}}.w-theme-light .Draftail-Toolbar .Draftail-ToolbarButton--active{background-color:var(--w-color-surface-header);border-color:var(--w-color-border-furniture)}@media (forced-colors:active){.w-theme-light .Draftail-Toolbar .Draftail-ToolbarButton--active{background:Highlight}}@media (prefers-color-scheme:light){.w-theme-system .Draftail-Toolbar .Draftail-ToolbarButton--active{background-color:var(--w-color-surface-header);border-color:var(--w-color-border-furniture)}}@media (prefers-color-scheme:light) and (forced-colors:active){.w-theme-system .Draftail-Toolbar .Draftail-ToolbarButton--active{background:Highlight}}.Draftail-MetaToolbar{background-color:initial;inset-inline-end:0;position:absolute;visibility:hidden}.Draftail-MetaToolbar:empty{display:none}@media (hover:hover){.Draftail-MetaToolbar{visibility:hidden}.Draftail-Editor:focus-within .Draftail-MetaToolbar,.Draftail-Editor:hover .Draftail-MetaToolbar{visibility:visible}}.Draftail-BlockToolbar{background:#0000;display:flex;height:100%;inset-inline-start:-40px;justify-content:center;position:absolute;top:0;width:40px}.Draftail-BlockToolbar__trigger{color:var(--w-color-text-button-outline-default);height:1rem;margin-inline-end:calc(.25rem - 2px);width:1rem}@media screen and (min-width:50em){.Draftail-BlockToolbar__trigger{margin-inline-end:calc(1.375rem - 2px)}}.Draftail-BlockToolbar__trigger:before{background:#0000;border-radius:.3125rem;content:"";display:block;height:30px;inset-inline-start:50%;position:absolute;top:50%;transform:translate(calc(var(--w-direction-factor)*-50%),-50%);width:30px;z-index:1}.Draftail-Editor:not(:hover,.Draftail-Editor--focus,:focus-within) .Draftail-BlockToolbar__trigger{visibility:hidden!important}.Draftail-BlockToolbar__trigger:focus-visible,.Draftail-BlockToolbar__trigger:hover{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.Draftail-BlockToolbar__trigger .icon{height:.75rem;transition:transform .3s ease;width:.75rem}.Draftail-BlockToolbar__trigger[aria-expanded=true] .icon{transform:rotate(45deg)}.Draftail-ToolbarGroup{display:flex;flex-wrap:wrap}.Draftail-ToolbarGroup:before{display:none}.Draftail-ToolbarButton{align-items:center;display:flex;height:1.875rem;justify-content:center;margin-inline-end:.625rem;min-width:1.875rem;padding:0}.w-contrast-more .Draftail-ToolbarButton{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-more .Draftail-ToolbarButton:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-more .Draftail-ToolbarButton[disabled],.w-contrast-more .Draftail-ToolbarButton[disabled]:hover{border-style:dashed}@media (prefers-contrast:more){.w-contrast-system .Draftail-ToolbarButton{border:1px solid var(--w-color-border-interactive-more-contrast)}.w-contrast-system .Draftail-ToolbarButton:hover{border-color:var(--w-color-border-interactive-more-contrast-hover)}.w-contrast-system .Draftail-ToolbarButton[disabled],.w-contrast-system .Draftail-ToolbarButton[disabled]:hover{border-style:dashed}}.Draftail-ToolbarGroup:last-of-type .Draftail-ToolbarButton:last-of-type{margin-inline-end:0}.Draftail-ToolbarButton[disabled]{opacity:.3}.Draftail-ToolbarButton:active,.Draftail-ToolbarButton:hover{border:1px solid var(--w-color-border-button-small-outline-default)}.Draftail-ToolbarButton .icon{height:1em;vertical-align:middle;width:1em}.Draftail-ToolbarButton .icon-h1,.Draftail-ToolbarButton .icon-h2,.Draftail-ToolbarButton .icon-h3,.Draftail-ToolbarButton .icon-h4,.Draftail-ToolbarButton .icon-h5,.Draftail-ToolbarButton .icon-h6{height:1.25em;width:1.25em}.Draftail-ToolbarButton--pin{border:1px solid var(--w-color-surface-tooltip);height:1.5rem;min-width:1.5rem}.Draftail-ToolbarButton--pin:hover{border-color:var(--w-color-surface-tooltip)}.Draftail-Toolbar .Draftail-ToolbarButton--pin{background-color:var(--w-color-surface-page);border-color:var(--w-color-border-field-default);border-inline-end-width:0;border-top-width:0;color:currentColor}.Draftail-Editor:hover .Draftail-Toolbar .Draftail-ToolbarButton--pin{border-color:var(--w-color-border-field-hover)}.Draftail-block--blockquote{border-inline-start:.25em solid var(--w-color-border-field-default);color:var(--w-color-text-meta);margin:1em 0;padding:1em 2em}.DraftEditor-editorContainer{border:0}
@@ -1 +1 @@
1
- .c-sf-add-button{align-items:center;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-page);color:var(--w-color-text-button-outline-default);cursor:pointer;display:grid;height:1.5rem;justify-content:center;margin-inline-start:calc(-1px + -.25rem);padding:0;width:1.5rem}.c-sf-add-button .icon{border:1px solid;border-radius:100%;height:1rem;padding:.125rem;transition:transform .3s ease;width:1rem}.c-sf-add-button[aria-expanded=true] .icon{transform:rotate(45deg)}.c-sf-add-button:focus-visible .icon,.c-sf-add-button:hover .icon{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.c-sf-add-button[disabled]{opacity:.2}@media (forced-colors:active){.c-sf-add-button[disabled]{color:GrayText}}[aria-expanded=true]+.w-panel__heading .c-sf-block__title{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}[aria-expanded=false]+.w-panel__heading .c-sf-block__title:not(:empty)+.c-sf-block__type{display:none}.c-sf-help .help{margin-bottom:1.5rem;margin-top:0}
1
+ .c-sf-add-button{align-items:center;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-page);color:var(--w-color-text-button-outline-default);cursor:pointer;display:grid;height:1.5rem;justify-content:center;margin-inline-start:calc(-1px + -.25rem);padding:0;width:1.5rem}.c-sf-add-button .icon{border:1px solid;border-radius:100%;height:1rem;padding:.125rem;transition:transform .3s ease;width:1rem}.c-sf-add-button[aria-expanded=true] .icon{transform:rotate(45deg)}.c-sf-add-button:focus-visible .icon,.c-sf-add-button:hover .icon{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.c-sf-add-button[disabled]{opacity:.2}@media (forced-colors:active){.c-sf-add-button[disabled]{color:GrayText}}[aria-expanded=true]+.w-panel__heading .c-sf-block__title{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}[aria-expanded=false]+.w-panel__heading .c-sf-block__title:not(:empty)+.c-sf-block__type{display:none}.c-sf-help .help{margin-bottom:1rem;margin-top:0}
wagtail/admin/userbar.py CHANGED
@@ -55,6 +55,7 @@ class AccessibilityItem(BaseItem):
55
55
  "input-button-name",
56
56
  "link-name",
57
57
  "p-as-heading",
58
+ "alt-text-quality",
58
59
  ]
59
60
 
60
61
  #: A dictionary that maps axe-core rule IDs to a dictionary of rule options,
@@ -153,29 +153,29 @@ class StreamChildrenToListBlockOperation(BaseBlockOperation):
153
153
  super().__init__()
154
154
  self.block_name = block_name
155
155
  self.list_block_name = list_block_name
156
- self.temp_blocks = []
157
156
 
158
157
  def apply(self, block_value):
158
+ candidate_blocks = []
159
159
  mapped_block_value = []
160
160
  for child_block in block_value:
161
161
  if child_block["type"] == self.block_name:
162
- self.temp_blocks.append(child_block)
162
+ candidate_blocks.append(child_block)
163
163
  else:
164
164
  mapped_block_value.append(child_block)
165
165
 
166
- self.map_temp_blocks_to_list_items()
166
+ list_items = self.map_temp_blocks_to_list_items(candidate_blocks)
167
167
 
168
- if self.temp_blocks:
169
- new_list_block = {"type": self.list_block_name, "value": self.temp_blocks}
168
+ if list_items:
169
+ new_list_block = {"type": self.list_block_name, "value": list_items}
170
170
  mapped_block_value.append(new_list_block)
171
171
 
172
172
  return mapped_block_value
173
173
 
174
- def map_temp_blocks_to_list_items(self):
175
- new_temp_blocks = []
176
- for block in self.temp_blocks:
177
- new_temp_blocks.append({**block, "type": "item"})
178
- self.temp_blocks = new_temp_blocks
174
+ def map_temp_blocks_to_list_items(self, blocks):
175
+ list_items = []
176
+ for block in blocks:
177
+ list_items.append({**block, "type": "item"})
178
+ return list_items
179
179
 
180
180
  @property
181
181
  def operation_name_fragment(self):
@@ -710,7 +710,7 @@ class StreamValue(MutableSequence):
710
710
  raw_values = OrderedDict(
711
711
  (i, raw_item["value"])
712
712
  for i, raw_item in enumerate(self._raw_data)
713
- if raw_item["type"] == type_name and self._bound_blocks[i] is None
713
+ if self._bound_blocks[i] is None and raw_item["type"] == type_name
714
714
  )
715
715
  # pass the raw block values to bulk_to_python as a list
716
716
  converted_values = child_block.bulk_to_python(raw_values.values())
@@ -6,14 +6,14 @@
6
6
  # Amós Oviedo <amos.oviedo@gmail.com>, 2016
7
7
  # Amós Oviedo <amos.oviedo@gmail.com>, 2016
8
8
  # Amós Oviedo <amos.oviedo@gmail.com>, 2016
9
- # X Bello <xbello@gmail.com>, 2022
9
+ # X Bello <xbello@gmail.com>, 2022,2024
10
10
  msgid ""
11
11
  msgstr ""
12
12
  "Project-Id-Version: Wagtail\n"
13
13
  "Report-Msgid-Bugs-To: \n"
14
14
  "POT-Creation-Date: 2024-10-21 17:53+0100\n"
15
15
  "PO-Revision-Date: 2014-09-11 15:42+0000\n"
16
- "Last-Translator: X Bello <xbello@gmail.com>, 2022\n"
16
+ "Last-Translator: X Bello <xbello@gmail.com>, 2022,2024\n"
17
17
  "Language-Team: Galician (http://app.transifex.com/torchbox/wagtail/language/"
18
18
  "gl/)\n"
19
19
  "MIME-Version: 1.0\n"
@@ -77,7 +77,7 @@ msgid "Hidden field"
77
77
  msgstr "Campo oculto"
78
78
 
79
79
  msgid "submit time"
80
- msgstr "Hora de envío"
80
+ msgstr "hora de envío"
81
81
 
82
82
  msgid "form submission"
83
83
  msgstr "formulario de envío"
@@ -102,7 +102,7 @@ msgid "field type"
102
102
  msgstr "tipo de campo"
103
103
 
104
104
  msgid "required"
105
- msgstr "obligatorio"
105
+ msgstr "obrigatorio"
106
106
 
107
107
  msgid "choices"
108
108
  msgstr "seleccións"
@@ -603,11 +603,13 @@ class TestFormPageWithCustomFormBuilder(WagtailTestUtils, TestCase):
603
603
  html=True,
604
604
  )
605
605
  # check ip address field has rendered
606
- self.assertContains(
607
- response,
608
- '<input type="text" name="device_ip_address" required id="id_device_ip_address" />',
609
- html=True,
610
- )
606
+ # (not comparing HTML directly because https://docs.djangoproject.com/en/5.1/releases/5.1.5/
607
+ # added a maxlength attribute)
608
+ soup = self.get_soup(response.content)
609
+ input = soup.find("input", {"name": "device_ip_address"})
610
+ self.assertEqual(input["type"], "text")
611
+ self.assertEqual(input["required"], "")
612
+ self.assertEqual(input["id"], "id_device_ip_address")
611
613
 
612
614
  def test_post_invalid_form(self):
613
615
  response = self.client.post(
@@ -72,7 +72,7 @@ class CloudfrontBackend(BaseBackend):
72
72
  paths_by_distribution_id[distribution_id].add(url_parsed.path)
73
73
 
74
74
  for distribution_id, paths in paths_by_distribution_id.items():
75
- self._create_invalidation(distribution_id, paths)
75
+ self._create_invalidation(distribution_id, list(paths))
76
76
 
77
77
  def purge(self, url):
78
78
  self.purge_batch([url])
@@ -360,7 +360,7 @@ class TestBackendConfiguration(SimpleTestCase):
360
360
  backends.get("cloudfront").purge("http://torchbox.com/blog/")
361
361
 
362
362
  _create_invalidation.assert_called_once_with(
363
- "frontend", {"/home/events/christmas/"}
363
+ "frontend", ["/home/events/christmas/"]
364
364
  )
365
365
 
366
366
  self.assertTrue(
wagtail/images/blocks.py CHANGED
@@ -242,6 +242,14 @@ class ImageBlock(StructBlock):
242
242
  def render_basic(self, value, context=None):
243
243
  return self.child_blocks["image"].render_basic(value, context=context)
244
244
 
245
+ def get_block_by_content_path(self, value, path_elements):
246
+ if path_elements:
247
+ return super().get_block_by_content_path(
248
+ self._image_to_struct_value(value), path_elements
249
+ )
250
+ else:
251
+ return self.bind(value)
252
+
245
253
  class Meta:
246
254
  icon = "image"
247
255
  template = "wagtailimages/widgets/image.html"
@@ -373,6 +373,37 @@ class TestImageBlock(TestImageChooserBlock):
373
373
  )
374
374
  self.assertIsNone(block.clean(value))
375
375
 
376
+ def test_get_block_by_content_path(self):
377
+ field = StreamPage._meta.get_field("body")
378
+ page = StreamPage(
379
+ body=field.stream_block.to_python(
380
+ [
381
+ {
382
+ "id": "123",
383
+ "type": "image_with_alt",
384
+ "value": {
385
+ "image": self.image.id,
386
+ "alt_text": "Sample alt text",
387
+ "decorative": False,
388
+ },
389
+ },
390
+ ]
391
+ )
392
+ )
393
+ bound_block = field.get_block_by_content_path(page.body, ["123"])
394
+ self.assertEqual(bound_block.block.name, "image_with_alt")
395
+ self.assertIsInstance(bound_block.value, Image)
396
+ self.assertEqual(bound_block.value.id, self.image.id)
397
+
398
+ bound_block = field.get_block_by_content_path(page.body, ["123", "alt_text"])
399
+ self.assertEqual(bound_block.block.name, "alt_text")
400
+ self.assertEqual(bound_block.value, "Sample alt text")
401
+
402
+ bound_block = field.get_block_by_content_path(
403
+ page.body, ["123", "does_not_exist"]
404
+ )
405
+ self.assertIsNone(bound_block)
406
+
376
407
 
377
408
  class TestImageBlockComparison(TestCase):
378
409
  comparison_class = compare.StreamFieldComparison
@@ -1,3 +1,4 @@
1
+ import re
1
2
  import warnings
2
3
  from collections import OrderedDict
3
4
 
@@ -336,9 +337,12 @@ class MySQLSearchQueryCompiler(BaseSearchQueryCompiler):
336
337
 
337
338
  def build_search_query_content(self, query, invert=False):
338
339
  if isinstance(query, PlainText):
339
- terms = query.query_string.split()
340
+ # For Boolean full text search queries in MySQL,
341
+ # non-alphanumeric characters act as separators
342
+ terms = [term for term in re.split(r"\W+", query.query_string) if term]
343
+
340
344
  if not terms:
341
- return None
345
+ return SearchQuery("")
342
346
 
343
347
  last_term = terms.pop()
344
348
 
@@ -68,6 +68,81 @@ class TestMySQLSearchBackend(BackendTests, TransactionTestCase):
68
68
  all_other_titles | {"JavaScript: The Definitive Guide"},
69
69
  )
70
70
 
71
+ def test_empty_search(self):
72
+ results = self.backend.search("", models.Book.objects.all())
73
+ self.assertSetEqual(
74
+ {r.title for r in results},
75
+ set(),
76
+ )
77
+
78
+ results = self.backend.search(" ", models.Book.objects.all())
79
+ self.assertSetEqual(
80
+ {r.title for r in results},
81
+ set(),
82
+ )
83
+
84
+ results = self.backend.search("*", models.Book.objects.all())
85
+ self.assertSetEqual(
86
+ {r.title for r in results},
87
+ set(),
88
+ )
89
+
90
+ def test_empty_autocomplete(self):
91
+ results = self.backend.autocomplete("", models.Book.objects.all())
92
+ self.assertSetEqual(
93
+ {r.title for r in results},
94
+ set(),
95
+ )
96
+
97
+ results = self.backend.autocomplete(" ", models.Book.objects.all())
98
+ self.assertSetEqual(
99
+ {r.title for r in results},
100
+ set(),
101
+ )
102
+
103
+ results = self.backend.autocomplete("*", models.Book.objects.all())
104
+ self.assertSetEqual(
105
+ {r.title for r in results},
106
+ set(),
107
+ )
108
+
109
+ def test_symbols_in_search_term(self):
110
+ # symbols as their own tokens should be ignored
111
+ results = self.backend.search("javascript @ parts", models.Book.objects.all())
112
+ self.assertSetEqual(
113
+ {r.title for r in results},
114
+ {"JavaScript: The good parts"},
115
+ )
116
+
117
+ results = self.backend.search("javascript parts @", models.Book.objects.all())
118
+ self.assertSetEqual(
119
+ {r.title for r in results},
120
+ {"JavaScript: The good parts"},
121
+ )
122
+
123
+ results = self.backend.search("@ javascript parts", models.Book.objects.all())
124
+ self.assertSetEqual(
125
+ {r.title for r in results},
126
+ {"JavaScript: The good parts"},
127
+ )
128
+
129
+ # tokens containing both symbols and alphanumerics should not be discarded
130
+ # or treated as equivalent to the same token without symbols
131
+ results = self.backend.search("java@script parts", models.Book.objects.all())
132
+ self.assertSetEqual(
133
+ {r.title for r in results},
134
+ set(),
135
+ )
136
+
137
+ def test_autocomplete_with_symbols(self):
138
+ # the * is not part of the autocomplete mechanism, but if someone includes it
139
+ # we want it to be gracefully ignored
140
+ results = self.backend.autocomplete("parts javasc*", models.Book.objects.all())
141
+ self.assertSetEqual(
142
+ {r.title for r in results},
143
+ {"JavaScript: The good parts"},
144
+ )
145
+
71
146
  @skip(
72
147
  "The MySQL backend doesn't support choosing individual fields for the search, only (body, title) or (autocomplete) fields may be searched."
73
148
  )
@@ -6,6 +6,7 @@
6
6
  # Alexander Holmbäck <alexander.holmback@creuna.se>, 2017
7
7
  # Jim Brouzoulis <jim.brouzoulis@chalmers.se>, 2017
8
8
  # Martin Sandström <martin@marteinn.se>, 2020-2021
9
+ # Matt Westcott <matthew@torchbox.com>, 2024
9
10
  # Philip Andersen <renegadevi@codeofmagi.net>, 2018-2019
10
11
  # Thomas Kunambi <kunambi@gmail.com>, 2015,2017,2023
11
12
  # Thomas Kunambi <kunambi@gmail.com>, 2015
@@ -16,7 +17,7 @@ msgstr ""
16
17
  "Report-Msgid-Bugs-To: \n"
17
18
  "POT-Creation-Date: 2024-10-21 17:53+0100\n"
18
19
  "PO-Revision-Date: 2014-02-19 19:01+0000\n"
19
- "Last-Translator: Thomas Kunambi <kunambi@gmail.com>, 2015,2017,2023\n"
20
+ "Last-Translator: Matt Westcott <matthew@torchbox.com>, 2024\n"
20
21
  "Language-Team: Swedish (http://app.transifex.com/torchbox/wagtail/language/"
21
22
  "sv/)\n"
22
23
  "MIME-Version: 1.0\n"
@@ -87,8 +88,8 @@ msgstr "Radera"
87
88
  #, python-format
88
89
  msgid "Used %(usage_count)s time"
89
90
  msgid_plural "Used %(usage_count)s times"
90
- msgstr[0] "Använd %(usage_count)sgång"
91
- msgstr[1] "Använd %(usage_count)sgånger"
91
+ msgstr[0] "Använd %(usage_count)s gång"
92
+ msgstr[1] "Använd %(usage_count)s gånger"
92
93
 
93
94
  #, python-format
94
95
  msgid "Are you sure you want to delete this %(snippet_type_name)s?"
@@ -7,3 +7,13 @@ class WagtailSnippetsTestsAppConfig(AppConfig):
7
7
  name = "wagtail.test.snippets"
8
8
  label = "snippetstests"
9
9
  verbose_name = _("Wagtail snippets tests")
10
+
11
+ def ready(self):
12
+ # Test registration of permission order within the group permissions view,
13
+ # as per https://docs.wagtail.org/en/stable/extending/customizing_group_views.html#customizing-the-group-editor-permissions-ordering
14
+ # Invoking `register` from `ready` confirms that it does not perform any database queries -
15
+ # if it did, it would fail (on a standard test run without --keepdb at least) because the
16
+ # test database hasn't been migrated yet.
17
+ from wagtail.users.permission_order import register
18
+
19
+ register("snippetstests.fancysnippet", order=999)
@@ -10,7 +10,7 @@ class MigrationTestMixin:
10
10
  default_operation_and_block_path = []
11
11
  app_name = None
12
12
 
13
- def init_migration(self, revisions_from=None, operations_and_block_path=None):
13
+ def init_migration(self, revisions_from=None, operations_and_block_paths=None):
14
14
  migration = Migration(
15
15
  "test_migration", "wagtail_streamfield_migration_toolkit_test"
16
16
  )
@@ -18,7 +18,7 @@ class MigrationTestMixin:
18
18
  app_name=self.app_name,
19
19
  model_name=self.model.__name__,
20
20
  field_name="content",
21
- operations_and_block_paths=operations_and_block_path
21
+ operations_and_block_paths=operations_and_block_paths
22
22
  or self.default_operation_and_block_path,
23
23
  revisions_from=revisions_from,
24
24
  )
@@ -29,11 +29,11 @@ class MigrationTestMixin:
29
29
  def apply_migration(
30
30
  self,
31
31
  revisions_from=None,
32
- operations_and_block_path=None,
32
+ operations_and_block_paths=None,
33
33
  ):
34
34
  migration = self.init_migration(
35
35
  revisions_from=revisions_from,
36
- operations_and_block_path=operations_and_block_path,
36
+ operations_and_block_paths=operations_and_block_paths,
37
37
  )
38
38
 
39
39
  loader = MigrationLoader(connection=connection)
@@ -13,35 +13,35 @@ class MigrationNameTest(TestCase, MigrationTestMixin):
13
13
  app_name = "wagtail_streamfield_migration_toolkit_test"
14
14
 
15
15
  def test_rename(self):
16
- operations_and_block_path = [
16
+ operations_and_block_paths = [
17
17
  (
18
18
  RenameStreamChildrenOperation(old_name="char1", new_name="renamed1"),
19
19
  "",
20
20
  )
21
21
  ]
22
22
  migration = self.init_migration(
23
- operations_and_block_path=operations_and_block_path
23
+ operations_and_block_paths=operations_and_block_paths
24
24
  )
25
25
 
26
26
  suggested_name = migration.suggest_name()
27
27
  self.assertEqual(suggested_name, "rename_char1_to_renamed1")
28
28
 
29
29
  def test_remove(self):
30
- operations_and_block_path = [
30
+ operations_and_block_paths = [
31
31
  (
32
32
  RemoveStreamChildrenOperation(name="char1"),
33
33
  "",
34
34
  )
35
35
  ]
36
36
  migration = self.init_migration(
37
- operations_and_block_path=operations_and_block_path
37
+ operations_and_block_paths=operations_and_block_paths
38
38
  )
39
39
 
40
40
  suggested_name = migration.suggest_name()
41
41
  self.assertEqual(suggested_name, "remove_char1")
42
42
 
43
43
  def test_multiple(self):
44
- operations_and_block_path = [
44
+ operations_and_block_paths = [
45
45
  (
46
46
  RenameStreamChildrenOperation(old_name="char1", new_name="renamed1"),
47
47
  "",
@@ -52,7 +52,7 @@ class MigrationNameTest(TestCase, MigrationTestMixin):
52
52
  ),
53
53
  ]
54
54
  migration = self.init_migration(
55
- operations_and_block_path=operations_and_block_path
55
+ operations_and_block_paths=operations_and_block_paths
56
56
  )
57
57
 
58
58
  suggested_name = migration.suggest_name()
@@ -7,7 +7,10 @@ from django.db.models.functions import Cast
7
7
  from django.test import TestCase
8
8
  from django.utils import timezone
9
9
 
10
- from wagtail.blocks.migrations.operations import RenameStreamChildrenOperation
10
+ from wagtail.blocks.migrations.operations import (
11
+ RenameStreamChildrenOperation,
12
+ StreamChildrenToListBlockOperation,
13
+ )
11
14
  from wagtail.test.streamfield_migrations import factories, models
12
15
  from wagtail.test.streamfield_migrations.testutils import MigrationTestMixin
13
16
 
@@ -250,3 +253,45 @@ class TestNullStreamField(BaseMigrationTest):
250
253
  self.assert_null_content()
251
254
  self.apply_migration()
252
255
  self.assert_null_content()
256
+
257
+
258
+ class StreamChildrenToListBlockOperationTestCase(BaseMigrationTest):
259
+ model = models.SamplePage
260
+ factory = factories.SamplePageFactory
261
+ has_revisions = True
262
+ app_name = "streamfield_migration_tests"
263
+
264
+ def _get_test_instances(self):
265
+ return self.factory.create_batch(
266
+ size=3,
267
+ # Each content stream field has a single char block instance.
268
+ content__0__char1__value="Char Block 1",
269
+ )
270
+
271
+ def test_state_not_shared_across_instances(self):
272
+ """
273
+ StreamChildrenToListBlockOperation doesn't share state across model instances.
274
+
275
+ As a single operation instance is used to transform the data of multiple model
276
+ instances, we should not store model instance state on the operation instance.
277
+ See https://github.com/wagtail/wagtail/issues/12391.
278
+ """
279
+
280
+ self.apply_migration(
281
+ operations_and_block_paths=[
282
+ (
283
+ StreamChildrenToListBlockOperation(
284
+ block_name="char1", list_block_name="list1"
285
+ ),
286
+ "",
287
+ )
288
+ ]
289
+ )
290
+ for instance in self.model.objects.all().annotate(
291
+ raw_content=Cast(F("content"), JSONField())
292
+ ):
293
+ new_block = instance.raw_content[0]
294
+ self.assertEqual(new_block["type"], "list1")
295
+ self.assertEqual(len(new_block["value"]), 1)
296
+ self.assertEqual(new_block["value"][0]["type"], "item")
297
+ self.assertEqual(new_block["value"][0]["value"], "Char Block 1")
@@ -237,6 +237,24 @@ class TestStreamValueAccess(TestCase):
237
237
  self.assertEqual(fetched_body[1].block_type, "text")
238
238
  self.assertEqual(fetched_body[1].value, "bar")
239
239
 
240
+ def test_can_append_on_queried_instance(self):
241
+ # The test is analog to test_can_append(), but instead of working with the
242
+ # in-memory version from JSONStreamModel.objects.create(), we query a fresh
243
+ # instance from the db.
244
+ # It tests adding data to child blocks that
245
+ # have not yet been lazy loaded. This would previously crash.
246
+ self.json_body = JSONStreamModel.objects.get(pk=self.json_body.pk)
247
+ self.json_body.body.append(("text", "bar"))
248
+ self.json_body.save()
249
+
250
+ fetched_body = JSONStreamModel.objects.get(id=self.json_body.id).body
251
+ self.assertIsInstance(fetched_body, StreamValue)
252
+ self.assertEqual(len(fetched_body), 2)
253
+ self.assertEqual(fetched_body[0].block_type, "text")
254
+ self.assertEqual(fetched_body[0].value, "foo")
255
+ self.assertEqual(fetched_body[1].block_type, "text")
256
+ self.assertEqual(fetched_body[1].value, "bar")
257
+
240
258
  def test_complex_assignment(self):
241
259
  page = StreamPage(title="Test page", body=[])
242
260
  page.body = [