django-fast-treenode 3.0.2__py3-none-any.whl → 3.0.4__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 (25) hide show
  1. {django_fast_treenode-3.0.2.dist-info → django_fast_treenode-3.0.4.dist-info}/METADATA +24 -25
  2. {django_fast_treenode-3.0.2.dist-info → django_fast_treenode-3.0.4.dist-info}/RECORD +25 -25
  3. {django_fast_treenode-3.0.2.dist-info → django_fast_treenode-3.0.4.dist-info}/WHEEL +1 -1
  4. treenode/admin/admin.py +1 -0
  5. treenode/admin/mixin.py +1 -1
  6. treenode/managers/queries.py +6 -18
  7. treenode/managers/tasks.py +80 -42
  8. treenode/static/vendors/jquery-ui/AUTHORS.txt +384 -384
  9. treenode/static/vendors/jquery-ui/LICENSE.txt +43 -43
  10. treenode/static/vendors/jquery-ui/external/jquery/jquery.js +10716 -10716
  11. treenode/static/vendors/jquery-ui/index.html +297 -297
  12. treenode/static/vendors/jquery-ui/jquery-ui.css +438 -438
  13. treenode/static/vendors/jquery-ui/jquery-ui.js +5222 -5222
  14. treenode/static/vendors/jquery-ui/jquery-ui.min.css +6 -6
  15. treenode/static/vendors/jquery-ui/jquery-ui.min.js +5 -5
  16. treenode/static/vendors/jquery-ui/jquery-ui.structure.css +16 -16
  17. treenode/static/vendors/jquery-ui/jquery-ui.structure.min.css +4 -4
  18. treenode/static/vendors/jquery-ui/jquery-ui.theme.css +439 -439
  19. treenode/static/vendors/jquery-ui/jquery-ui.theme.min.css +4 -4
  20. treenode/static/vendors/jquery-ui/package.json +82 -82
  21. treenode/utils/db/sqlcompat.py +33 -1
  22. treenode/utils/db/sqlquery.py +24 -0
  23. treenode/version.py +2 -2
  24. {django_fast_treenode-3.0.2.dist-info → django_fast_treenode-3.0.4.dist-info}/licenses/LICENSE +0 -0
  25. {django_fast_treenode-3.0.2.dist-info → django_fast_treenode-3.0.4.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
- /*! jQuery UI - v1.14.1 - 2025-04-13
2
- * https://jqueryui.com
3
- * Copyright OpenJS Foundation and other contributors; Licensed MIT */
4
-
1
+ /*! jQuery UI - v1.14.1 - 2025-04-13
2
+ * https://jqueryui.com
3
+ * Copyright OpenJS Foundation and other contributors; Licensed MIT */
4
+
5
5
  .ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;background-image:none}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3}.ui-widget-shadow{box-shadow:0 0 5px #666}
@@ -1,82 +1,82 @@
1
- {
2
- "name": "jquery-ui",
3
- "title": "jQuery UI",
4
- "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
5
- "version": "1.14.1",
6
- "homepage": "https://jqueryui.com",
7
- "author": {
8
- "name": "OpenJS Foundation and other contributors",
9
- "url": "https://github.com/jquery/jquery-ui/blob/1.14.1/AUTHORS.txt"
10
- },
11
- "main": "ui/widget.js",
12
- "maintainers": [
13
- {
14
- "name": "Jörn Zaefferer",
15
- "email": "joern.zaefferer@gmail.com",
16
- "url": "https://bassistance.de"
17
- },
18
- {
19
- "name": "Mike Sherov",
20
- "email": "mike.sherov@gmail.com",
21
- "url": "https://mike.sherov.com"
22
- },
23
- {
24
- "name": "TJ VanToll",
25
- "email": "tj.vantoll@gmail.com",
26
- "url": "https://www.tjvantoll.com"
27
- },
28
- {
29
- "name": "Felix Nagel",
30
- "email": "info@felixnagel.com",
31
- "url": "https://www.felixnagel.com"
32
- },
33
- {
34
- "name": "Alex Schmitz",
35
- "email": "arschmitz@gmail.com",
36
- "url": "https://github.com/arschmitz"
37
- }
38
- ],
39
- "repository": {
40
- "type": "git",
41
- "url": "git://github.com/jquery/jquery-ui.git"
42
- },
43
- "bugs": {
44
- "url": "https://github.com/jquery/jquery-ui/issues"
45
- },
46
- "license": "MIT",
47
- "scripts": {
48
- "build": "grunt build",
49
- "lint": "grunt lint",
50
- "test:server": "node tests/runner/server.js",
51
- "test:unit": "node tests/runner/command.js",
52
- "test": "grunt && npm run test:unit -- -h"
53
- },
54
- "dependencies": {
55
- "jquery": ">=1.12.0 <5.0.0"
56
- },
57
- "devDependencies": {
58
- "body-parser": "1.20.3",
59
- "browserstack-local": "1.5.5",
60
- "commitplease": "3.2.0",
61
- "diff": "5.2.0",
62
- "eslint-config-jquery": "3.0.2",
63
- "exit-hook": "4.0.0",
64
- "express": "4.21.1",
65
- "express-body-parser-error-handler": "1.0.7",
66
- "grunt": "1.6.1",
67
- "grunt-bowercopy": "1.2.5",
68
- "grunt-compare-size": "0.4.2",
69
- "grunt-contrib-concat": "2.1.0",
70
- "grunt-contrib-csslint": "2.0.0",
71
- "grunt-contrib-requirejs": "1.0.0",
72
- "grunt-contrib-uglify": "5.2.2",
73
- "grunt-eslint": "24.0.1",
74
- "grunt-git-authors": "3.2.0",
75
- "grunt-html": "17.1.0",
76
- "load-grunt-tasks": "5.1.0",
77
- "rimraf": "6.0.1",
78
- "selenium-webdriver": "4.26.0",
79
- "yargs": "17.7.2"
80
- },
81
- "keywords": []
82
- }
1
+ {
2
+ "name": "jquery-ui",
3
+ "title": "jQuery UI",
4
+ "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
5
+ "version": "1.14.1",
6
+ "homepage": "https://jqueryui.com",
7
+ "author": {
8
+ "name": "OpenJS Foundation and other contributors",
9
+ "url": "https://github.com/jquery/jquery-ui/blob/1.14.1/AUTHORS.txt"
10
+ },
11
+ "main": "ui/widget.js",
12
+ "maintainers": [
13
+ {
14
+ "name": "Jörn Zaefferer",
15
+ "email": "joern.zaefferer@gmail.com",
16
+ "url": "https://bassistance.de"
17
+ },
18
+ {
19
+ "name": "Mike Sherov",
20
+ "email": "mike.sherov@gmail.com",
21
+ "url": "https://mike.sherov.com"
22
+ },
23
+ {
24
+ "name": "TJ VanToll",
25
+ "email": "tj.vantoll@gmail.com",
26
+ "url": "https://www.tjvantoll.com"
27
+ },
28
+ {
29
+ "name": "Felix Nagel",
30
+ "email": "info@felixnagel.com",
31
+ "url": "https://www.felixnagel.com"
32
+ },
33
+ {
34
+ "name": "Alex Schmitz",
35
+ "email": "arschmitz@gmail.com",
36
+ "url": "https://github.com/arschmitz"
37
+ }
38
+ ],
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git://github.com/jquery/jquery-ui.git"
42
+ },
43
+ "bugs": {
44
+ "url": "https://github.com/jquery/jquery-ui/issues"
45
+ },
46
+ "license": "MIT",
47
+ "scripts": {
48
+ "build": "grunt build",
49
+ "lint": "grunt lint",
50
+ "test:server": "node tests/runner/server.js",
51
+ "test:unit": "node tests/runner/command.js",
52
+ "test": "grunt && npm run test:unit -- -h"
53
+ },
54
+ "dependencies": {
55
+ "jquery": ">=1.12.0 <5.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "body-parser": "1.20.3",
59
+ "browserstack-local": "1.5.5",
60
+ "commitplease": "3.2.0",
61
+ "diff": "5.2.0",
62
+ "eslint-config-jquery": "3.0.2",
63
+ "exit-hook": "4.0.0",
64
+ "express": "4.21.1",
65
+ "express-body-parser-error-handler": "1.0.7",
66
+ "grunt": "1.6.1",
67
+ "grunt-bowercopy": "1.2.5",
68
+ "grunt-compare-size": "0.4.2",
69
+ "grunt-contrib-concat": "2.1.0",
70
+ "grunt-contrib-csslint": "2.0.0",
71
+ "grunt-contrib-requirejs": "1.0.0",
72
+ "grunt-contrib-uglify": "5.2.2",
73
+ "grunt-eslint": "24.0.1",
74
+ "grunt-git-authors": "3.2.0",
75
+ "grunt-html": "17.1.0",
76
+ "load-grunt-tasks": "5.1.0",
77
+ "rimraf": "6.0.1",
78
+ "selenium-webdriver": "4.26.0",
79
+ "yargs": "17.7.2"
80
+ },
81
+ "keywords": []
82
+ }
@@ -125,12 +125,44 @@ class SQLCompat:
125
125
  {set_clause};
126
126
  """
127
127
 
128
+ elif connection.vendor == "sqlite":
129
+ # SQLite workaround via temporary table
130
+ temp_table = "temp_tree_update"
131
+ cols = ["id"] + [cte_alias.get(f, f) for f in update_fields]
132
+ col_defs = ", ".join(f"{c} TEXT" for c in cols)
133
+ insert_cols = ", ".join(cols)
134
+ select_cols = ", ".join(cols)
135
+
136
+ set_clause = ", ".join(
137
+ f"{qf(f)} = (SELECT t.{cte_alias.get(f, f)} FROM {temp_table} t WHERE t.id = {qt}.id)" # noqa
138
+ for f in update_fields
139
+ )
140
+
141
+ return f"""
142
+ DROP TABLE IF EXISTS {temp_table};
143
+ CREATE TEMP TABLE {temp_table} ({col_defs});
144
+
145
+ WITH RECURSIVE tree_cte {cte_header} AS (
146
+ {base_sql}
147
+ UNION ALL
148
+ {recursive_sql}
149
+ )
150
+ INSERT INTO {temp_table} ({insert_cols})
151
+ SELECT {select_cols} FROM tree_cte;
152
+
153
+ UPDATE {qt}
154
+ SET {set_clause}
155
+ WHERE id IN (SELECT id FROM {temp_table});
156
+ """
157
+
128
158
  else:
159
+ # Fallback: subqueries
160
+ # (still buggy in SQLite, hence above workaround)
129
161
  set_clause = ", ".join(
130
162
  f"{qf(f)} = (SELECT t.{f} FROM tree_cte t WHERE t.id = {qt}.id)"
131
163
  for f in update_fields
132
164
  )
133
- where_clause = f"id IN (SELECT id FROM tree_cte)"
165
+ where_clause = "id IN (SELECT id FROM tree_cte)"
134
166
  return f"""
135
167
  WITH RECURSIVE tree_cte {cte_header} AS (
136
168
  {base_sql}
@@ -66,5 +66,29 @@ class SQLQueue:
66
66
  raise
67
67
  self._items.clear()
68
68
 
69
+ @staticmethod
70
+ def wrap_union_all(queries):
71
+ """
72
+ Combine multiple SQL queries using UNION ALL with vendor-specific handling.
73
+ Each query is a tuple: (sql, params).
74
+ Returns a tuple: (combined_sql, combined_params).
75
+ """
76
+ if is_sqlite():
77
+ # SQLite требует одинаковое число и порядок столбцов. Добавим к каждому SELECT псевдонимы.
78
+ def alias_select(sql, alias_prefix, idx):
79
+ return f"SELECT * FROM ({sql}) AS {alias_prefix}_{idx}"
80
+
81
+ wrapped_queries = [
82
+ alias_select(q[0], "q", i) for i, q in enumerate(queries)
83
+ ]
84
+ combined_sql = " UNION ALL ".join(wrapped_queries)
85
+ else:
86
+ combined_sql = " UNION ALL ".join(f"({q[0]})" for q in queries)
87
+
88
+ combined_params = []
89
+ for q in queries:
90
+ combined_params.extend(q[1])
91
+
92
+ return combined_sql, combined_params
69
93
 
70
94
  # The End
treenode/version.py CHANGED
@@ -4,9 +4,9 @@ TreeNode Version Module
4
4
 
5
5
  This module defines the current version of the TreeNode package.
6
6
 
7
- Version: 3.0.2
7
+ Version: 3.0.3
8
8
  Author: Timur Kady
9
9
  Email: timurkady@yandex.com
10
10
  """
11
11
 
12
- __version__ = '3.0.2'
12
+ __version__ = '3.0.4'