Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
901e3ede39 | ||
|
|
e89f205aa6 | ||
|
|
dccd4f0bba | ||
|
|
99c6b171e4 | ||
|
|
0f5d4cd7b7 | ||
|
|
e256f734df | ||
|
|
9ed2506062 | ||
|
|
adf4634459 | ||
|
|
2dbd09530e | ||
|
|
d8ecbcf293 | ||
|
|
3ad0862c59 | ||
|
|
1b7dce124b | ||
|
|
24c0816042 | ||
|
|
9d6098ddf2 | ||
|
|
4d6b019949 | ||
|
|
cee65fbf9a | ||
|
|
f9707a8bf5 | ||
|
|
1af431dcc2 | ||
|
|
4033bf3748 | ||
|
|
0f5a97fa6e | ||
|
|
8eeb12b600 | ||
|
|
69069e9af3 | ||
|
|
83660ec9ed | ||
|
|
6b9ae466c2 | ||
|
|
5ce3c4a5c8 | ||
|
|
f8df935404 | ||
|
|
ffc1c6c3b7 | ||
|
|
dd4849070a | ||
|
|
44b2f49839 | ||
|
|
0cd67b15cb | ||
|
|
448ede53c6 | ||
|
|
cbd29cf45b | ||
|
|
3414de9ab2 | ||
|
|
30dc805cf6 | ||
|
|
ce8e6b47c1 | ||
|
|
aca97d9f57 | ||
|
|
b539637426 | ||
|
|
b1221d5517 | ||
|
|
5a8c916bc0 | ||
|
|
677221cd9c | ||
|
|
d2efee5943 | ||
|
|
0010935707 | ||
|
|
6fb4df67a9 | ||
|
|
0fa4609220 | ||
|
|
1cdbb9a643 | ||
|
|
e90b3dad01 | ||
|
|
e61a1045f5 | ||
|
|
b89e306df0 | ||
|
|
f002b11106 | ||
|
|
bc4e8a3c82 | ||
|
|
76a4dee451 | ||
|
|
f62c20d0b9 | ||
|
|
ccd28101d6 | ||
|
|
4ca60e07b2 | ||
|
|
6d1926bb63 | ||
|
|
1141aeb524 | ||
|
|
9fec812366 | ||
|
|
a811841735 | ||
|
|
a2307c230a | ||
|
|
7b5fd9bfea | ||
|
|
a7ee4e5909 | ||
|
|
9cc2985d13 | ||
|
|
19beb62f81 | ||
|
|
28be10a1b5 | ||
|
|
444a364a8d | ||
|
|
4a195e7ef6 | ||
|
|
ad64491a98 | ||
|
|
7a2716bf77 | ||
|
|
64c419e6f8 | ||
|
|
23aac4f580 | ||
|
|
b4b658c59d | ||
|
|
4d727015fd | ||
|
|
78f0c9c4a5 | ||
|
|
c2d9219add | ||
|
|
fddcbbff67 | ||
|
|
aa5b1d50b9 | ||
|
|
21359c6c74 | ||
|
|
c38bf04f51 | ||
|
|
5f9ea22941 | ||
|
|
00e13b0811 | ||
|
|
b9e533e31a | ||
|
|
bc0b25d995 | ||
|
|
1a89c1f85f | ||
|
|
37d82d457c | ||
|
|
8f7b30075e | ||
|
|
47479e5e5c | ||
|
|
8fd3ddc4ae | ||
|
|
deab1bfaba | ||
|
|
04729f63b8 | ||
|
|
0ce3434631 | ||
|
|
094129e2be | ||
|
|
3e86ed5d21 | ||
|
|
41bcce09ce | ||
|
|
343c3ee49c | ||
|
|
12d6271b13 | ||
|
|
c65f60771a | ||
|
|
c983aae881 | ||
|
|
1013d7ccdd | ||
|
|
d945c6f843 | ||
|
|
dabe64a8df | ||
|
|
fbc3b1a318 | ||
|
|
6adc1bfd42 | ||
|
|
e7e4d5cf0a | ||
|
|
9f836f5433 | ||
|
|
e3807ec3d6 | ||
|
|
40fa1aff6b | ||
|
|
4787de6968 | ||
|
|
3f7e921cce | ||
|
|
4e414f57e6 | ||
|
|
c98fb887cc | ||
|
|
d2457f2a1d | ||
|
|
e38c38cd58 | ||
|
|
374c5e952f | ||
|
|
38e5ded821 |
No files matched your search
@@ -35,36 +35,39 @@ Flask-Paranoid 0.2.0
|
||||
Flask-Babel 2.0.0 BSD http://github.com/python-babel/flask-babel
|
||||
Flask-Security-Too 4.1.2 MIT https://github.com/Flask-Middleware/flask-security
|
||||
Flask-SocketIO 5.1.1 UNKNOWN https://github.com/miguelgrinberg/flask-socketio
|
||||
WTForms 3.0.0 BSD-3-Clause https://wtforms.readthedocs.io/
|
||||
WTForms 3.0.1 BSD-3-Clause https://wtforms.readthedocs.io/
|
||||
passlib 1.7.4 BSD https://passlib.readthedocs.io
|
||||
pytz 2021.3 MIT http://pythonhosted.org/pytz
|
||||
simplejson 3.17.6 MIT License https://github.com/simplejson/simplejson
|
||||
six 1.16.0 MIT https://github.com/benjaminp/six
|
||||
speaklater3 1.4 UNKNOWN https://github.com/ThomasWaldmann/speaklater
|
||||
sqlparse 0.4.2 BSD-3-Clause https://github.com/andialbrecht/sqlparse
|
||||
psutil 5.8.0 BSD https://github.com/giampaolo/psutil
|
||||
psycopg2 2.9.2 LGPL with exceptions https://psycopg.org/
|
||||
psutil 5.9.0 BSD https://github.com/giampaolo/psutil
|
||||
psycopg2 2.9.3 LGPL with exceptions https://psycopg.org/
|
||||
python-dateutil 2.8.2 Dual License https://github.com/dateutil/dateutil
|
||||
SQLAlchemy 1.4.28 MIT https://www.sqlalchemy.org
|
||||
SQLAlchemy 1.4.31 MIT https://www.sqlalchemy.org
|
||||
bcrypt 3.2.0 Apache License, Version 2.0 https://github.com/pyca/bcrypt/
|
||||
cryptography 3.4.8 BSD or Apache License, Version 2.0 https://github.com/pyca/cryptography
|
||||
sshtunnel 0.4.0 MIT https://github.com/pahaz/sshtunnel
|
||||
ldap3 2.9.1 LGPL v3 https://github.com/cannatag/ldap3
|
||||
gssapi 1.7.2 LICENSE.txt https://github.com/pythongssapi/python-gssapi
|
||||
eventlet 0.33.0 UNKNOWN http://eventlet.net
|
||||
httpagentparser 1.9.1 http://www.opensource.org/licenses/mit-license.php http://shon.github.com/httpagentparser
|
||||
httpagentparser 1.9.2 http://www.opensource.org/licenses/mit-license.php https://github.com/shon/httpagentparser
|
||||
user-agents 2.2.0 MIT https://github.com/selwin/python-user-agents
|
||||
pywinpty 1.1.* Unknown Unknown
|
||||
Authlib 0.15.5 BSD-3-Clause https://authlib.org/
|
||||
requests 2.25.1 Apache 2.0 https://requests.readthedocs.io
|
||||
pyotp 2.6.0 MIT License https://github.com/pyotp/pyotp
|
||||
qrcode 7.3.1 BSD https://github.com/lincolnloop/python-qrcode
|
||||
Pillow 8.3.2 HPND https://python-pillow.org
|
||||
Pillow 9.0.1 HPND https://python-pillow.org
|
||||
boto3 1.20.54 Apache License 2.0 https://github.com/boto/boto3
|
||||
botocore 1.23.54 Apache License 2.0 https://github.com/boto/botocore
|
||||
urllib3 1.26.8 MIT https://urllib3.readthedocs.io/
|
||||
|
||||
NOTE: This report was generated using Python 3.10. Full information may not be
|
||||
shown for Python modules that are not required with this version.
|
||||
|
||||
37 dependencies listed.
|
||||
40 dependencies listed.
|
||||
|
||||
Javascript Dependencies
|
||||
=======================
|
||||
@@ -103,6 +106,7 @@ Name Version
|
||||
@babel/plugin-transform-react-pure-annotations 7.12.1 MIT https://github.com/babel/babel.git
|
||||
@babel/preset-react 7.13.13 MIT https://github.com/babel/babel.git
|
||||
@babel/runtime 7.14.0 MIT https://github.com/babel/babel.git
|
||||
@babel/runtime 7.17.0 MIT https://github.com/babel/babel.git
|
||||
@babel/template 7.14.5 MIT https://github.com/babel/babel.git
|
||||
@babel/traverse 7.14.7 MIT https://github.com/babel/babel.git
|
||||
@babel/types 7.15.4 MIT https://github.com/babel/babel.git
|
||||
@@ -138,6 +142,7 @@ Name Version
|
||||
@projectstorm/react-diagrams-routing 6.6.1 MIT https://github.com/projectstorm/react-diagrams.git
|
||||
@simonwep/pickr 1.8.1 MIT https://github.com/Simonwep/pickr.git
|
||||
@sindresorhus/is 0.7.0 MIT https://github.com/sindresorhus/is.git
|
||||
@szhsin/react-menu 2.3.3 MIT https://github.com/szhsin/react-menu.git
|
||||
@tippyjs/react 4.2.3 MIT git+https://github.com/atomiks/tippyjs-react.git
|
||||
@types/classnames 2.3.1 MIT Unknown
|
||||
@types/component-emitter 1.2.10 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git
|
||||
@@ -152,31 +157,21 @@ Name Version
|
||||
@types/scheduler 0.16.1 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git
|
||||
@types/styled-jsx 2.2.8 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git
|
||||
acitree 4.5.0-rc.7 MIT https://github.com/imsurinder90/jquery-aciTree.git
|
||||
ajv 8.9.0 MIT https://github.com/ajv-validator/ajv.git
|
||||
ajv 6.12.6 MIT https://github.com/ajv-validator/ajv.git
|
||||
ajv 5.5.2 MIT https://github.com/epoberezkin/ajv.git
|
||||
ajv-errors 1.0.1 MIT git+https://github.com/epoberezkin/ajv-errors.git
|
||||
ajv-keywords 3.5.2 MIT git+https://github.com/epoberezkin/ajv-keywords.git
|
||||
alertifyjs 1.7.1 MIT git@github.com:MohammadYounes/AlertifyJS.git
|
||||
alphanum-sort 1.0.2 MIT https://github.com/TrySound/alphanum-sort.git
|
||||
ansi-regex 2.1.1 MIT https://github.com/chalk/ansi-regex.git
|
||||
ansi-styles 3.2.1 MIT https://github.com/chalk/ansi-styles.git
|
||||
ansi-styles 2.2.1 MIT https://github.com/chalk/ansi-styles.git
|
||||
aspen-core 1.0.4 MIT git+https://github.com/neeksandhu/aspen-core.git
|
||||
aspen-decorations 1.1.1 MIT git+https://github.com/neeksandhu/aspen-decorations.git
|
||||
aspen-tree-model 1.0.5 MIT git+https://github.com/neeksandhu/aspen-tree-model.git
|
||||
async 2.6.3 MIT https://github.com/caolan/async.git
|
||||
axios 0.21.4 MIT https://github.com/axios/axios.git
|
||||
babel-code-frame 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-code-frame
|
||||
babel-generator 6.26.1 MIT https://github.com/babel/babel/tree/master/packages/babel-generator
|
||||
babel-messages 6.23.0 MIT https://github.com/babel/babel/tree/master/packages/babel-messages
|
||||
babel-plugin-styled-components 1.12.0 MIT https://github.com/styled-components/babel-plugin-styled-components.git
|
||||
babel-plugin-syntax-jsx 6.18.0 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-jsx
|
||||
babel-runtime 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-runtime
|
||||
babel-template 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-template
|
||||
babel-traverse 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-traverse
|
||||
babel-types 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-types
|
||||
babelify 10.0.0 MIT https://github.com/babel/babelify.git
|
||||
babylon 6.18.0 MIT https://github.com/babel/babylon
|
||||
backbone 1.4.0 MIT https://github.com/jashkenas/backbone.git
|
||||
backbone 1.2.3 MIT https://github.com/jashkenas/backbone.git
|
||||
backbone 1.3.3 MIT https://github.com/jashkenas/backbone.git
|
||||
@@ -193,6 +188,8 @@ bignumber.js 9.0.1
|
||||
bignumber.js 7.2.1 MIT https://github.com/MikeMcl/bignumber.js.git
|
||||
bootstrap 4.6.0 MIT git+https://github.com/twbs/bootstrap.git
|
||||
bootstrap4-toggle 3.6.1 MIT https://github.com/gitbrent/bootstrap4-toggle.git
|
||||
bowser 2.11.0 MIT git+https://github.com/lancedikson/bowser.git
|
||||
brace 0.11.1 MIT git://github.com/thlorenz/brace.git
|
||||
brace-expansion 1.1.11 MIT git://github.com/juliangruber/brace-expansion.git
|
||||
browserfs 1.4.3 MIT https://github.com/jvilk/BrowserFS.git
|
||||
browserslist 4.16.6 MIT https://github.com/browserslist/browserslist.git
|
||||
@@ -201,14 +198,12 @@ camelcase 6.2.0
|
||||
camelize 1.0.0 MIT git://github.com/substack/camelize.git
|
||||
caniuse-api 3.0.0 MIT https://github.com/nyalab/caniuse-api.git
|
||||
chalk 2.4.2 MIT https://github.com/chalk/chalk.git
|
||||
chalk 1.1.3 MIT https://github.com/chalk/chalk.git
|
||||
chart.js 2.9.4 MIT https://github.com/chartjs/Chart.js.git
|
||||
chartjs-color 2.4.1 MIT https://github.com/chartjs/chartjs-color.git
|
||||
chartjs-color-string 0.6.0 MIT https://github.com/chartjs/chartjs-color-string.git
|
||||
classnames 2.3.1 MIT https://github.com/JedWatson/classnames.git
|
||||
closest 0.0.1 MIT https://github.com/ForbesLindesay/closest.git
|
||||
clsx 1.1.1 MIT https://github.com/lukeed/clsx.git
|
||||
co 4.6.0 MIT https://github.com/tj/co.git
|
||||
codemirror 5.59.4 MIT https://github.com/codemirror/CodeMirror.git
|
||||
color-convert 1.9.3 MIT https://github.com/Qix-/color-convert.git
|
||||
color-name 1.1.3 MIT git@github.com:dfcreative/color-name.git
|
||||
@@ -220,8 +215,8 @@ component-emitter 1.3.0
|
||||
concat-map 0.0.1 MIT git://github.com/substack/node-concat-map.git
|
||||
context-menu 2.0.0 MIT https://github.com/chipto/context-menu.git
|
||||
convert-source-map 1.8.0 MIT git://github.com/thlorenz/convert-source-map.git
|
||||
copy-to-clipboard 3.3.1 MIT git+https://github.com/sudodoki/copy-to-clipboard
|
||||
core-js 3.12.1 MIT https://github.com/zloirock/core-js.git
|
||||
core-js 2.6.12 MIT https://github.com/zloirock/core-js.git
|
||||
cosmiconfig 7.0.0 MIT git+https://github.com/davidtheclark/cosmiconfig.git
|
||||
css-color-names 1.0.1 MIT git://github.com/bahamas10/css-color-names.git
|
||||
css-color-names 0.0.4 MIT git://github.com/bahamas10/css-color-names.git
|
||||
@@ -240,10 +235,9 @@ csstype 3.0.8
|
||||
dagre 0.8.5 MIT https://github.com/dagrejs/dagre.git
|
||||
date-fns 2.24.0 MIT https://github.com/date-fns/date-fns
|
||||
debug 4.3.1 MIT git://github.com/visionmedia/debug.git
|
||||
debug 2.6.9 MIT git://github.com/visionmedia/debug.git
|
||||
deep-diff 1.0.2 MIT git://github.com/flitbit/diff.git
|
||||
detect-indent 4.0.0 MIT https://github.com/sindresorhus/detect-indent.git
|
||||
diff-arrays-of-objects 1.1.8 MIT git+https://github.com/malcolmvr/diff-arrays-of-objects.git
|
||||
dom-align 1.12.2 MIT git@github.com:yiminghe/dom-align.git
|
||||
dom-helpers 5.2.0 MIT git+https://github.com/react-bootstrap/dom-helpers.git
|
||||
dom-serializer 1.3.2 MIT git://github.com/cheeriojs/dom-renderer.git
|
||||
dropzone 5.9.3 MIT https://github.com/dropzone/dropzone.git
|
||||
@@ -254,15 +248,12 @@ error-ex 1.3.2
|
||||
escalade 3.1.1 MIT https://github.com/lukeed/escalade.git
|
||||
escape-string-regexp 1.0.5 MIT https://github.com/sindresorhus/escape-string-regexp.git
|
||||
fast-deep-equal 3.1.3 MIT git+https://github.com/epoberezkin/fast-deep-equal.git
|
||||
fast-deep-equal 1.1.0 MIT git+https://github.com/epoberezkin/fast-deep-equal.git
|
||||
fast-json-stable-stringify 2.1.0 MIT git://github.com/epoberezkin/fast-json-stable-stringify.git
|
||||
filename-reserved-regex 2.0.0 MIT https://github.com/sindresorhus/filename-reserved-regex.git
|
||||
follow-redirects 1.14.4 MIT git@github.com:follow-redirects/follow-redirects.git
|
||||
follow-redirects 1.14.8 MIT git@github.com:follow-redirects/follow-redirects.git
|
||||
gensync 1.0.0-beta.2 MIT https://github.com/loganfsmyth/gensync.git
|
||||
globals 11.12.0 MIT https://github.com/sindresorhus/globals.git
|
||||
globals 9.18.0 MIT https://github.com/sindresorhus/globals.git
|
||||
graphlib 2.1.8 MIT https://github.com/dagrejs/graphlib.git
|
||||
has-ansi 2.0.0 MIT https://github.com/sindresorhus/has-ansi.git
|
||||
has-cors 1.1.0 MIT git://github.com/component/has-cors.git
|
||||
has-flag 3.0.0 MIT https://github.com/sindresorhus/has-flag.git
|
||||
has-flag 4.0.0 MIT https://github.com/sindresorhus/has-flag.git
|
||||
@@ -275,33 +266,29 @@ immutability-helper 3.1.1
|
||||
import-fresh 3.3.0 MIT https://github.com/sindresorhus/import-fresh.git
|
||||
imports-loader 2.0.0 MIT https://github.com/webpack-contrib/imports-loader.git
|
||||
insert-if 1.2.0 MIT git+https://github.com/chipto/insert-if.git
|
||||
invariant 2.2.4 MIT https://github.com/zertosh/invariant
|
||||
ip-address 7.1.0 MIT git://github.com/beaugunderson/ip-address.git
|
||||
is-absolute-url 3.0.3 MIT https://github.com/sindresorhus/is-absolute-url.git
|
||||
is-any-array 1.0.0 MIT https://github.com/cheminfo-js/is-any-array.git
|
||||
is-arrayish 0.2.1 MIT https://github.com/qix-/node-is-arrayish.git
|
||||
is-color-stop 1.1.0 MIT git+https://github.com/pigcan/is-color-stop.git
|
||||
is-finite 1.1.0 MIT https://github.com/sindresorhus/is-finite.git
|
||||
is-in-browser 1.1.3 MIT git+https://github.com/tuxsudo/is-in-browser.git
|
||||
is-relative 1.0.0 MIT https://github.com/jonschlinkert/is-relative.git
|
||||
is-unc-path 1.0.0 MIT https://github.com/jonschlinkert/is-unc-path.git
|
||||
istanbul-instrumenter-loader 3.0.1 MIT https://github.com/webpack-contrib/istanbul-instrumenter-loader.git
|
||||
javascript-natural-sort 0.7.1 MIT https://github.com/Bill4Time/javascript-natural-sort.git
|
||||
jquery 3.6.0 MIT https://github.com/jquery/jquery.git
|
||||
jquery-contextmenu 2.9.2 MIT git://github.com/swisnl/jQuery-contextMenu.git
|
||||
jquery-ui 1.13.0 MIT git://github.com/jquery/jquery-ui.git
|
||||
js-tokens 4.0.0 MIT https://github.com/lydell/js-tokens.git
|
||||
js-tokens 3.0.2 MIT https://github.com/lydell/js-tokens.git
|
||||
jsbn 1.1.0 MIT https://github.com/andyperlitch/jsbn.git
|
||||
jsesc 2.5.2 MIT https://github.com/mathiasbynens/jsesc.git
|
||||
jsesc 1.3.0 MIT https://github.com/mathiasbynens/jsesc.git
|
||||
json-bignumber 1.0.2 MIT git@github.com:wbuss/JSONBigNumber.git
|
||||
json-parse-even-better-errors 2.3.1 MIT https://github.com/npm/json-parse-even-better-errors
|
||||
json-schema-traverse 1.0.0 MIT git+https://github.com/epoberezkin/json-schema-traverse.git
|
||||
json-schema-traverse 0.4.1 MIT git+https://github.com/epoberezkin/json-schema-traverse.git
|
||||
json-schema-traverse 0.3.1 MIT git+https://github.com/epoberezkin/json-schema-traverse.git
|
||||
json-source-map 0.6.1 MIT git+https://github.com/epoberezkin/json-source-map.git
|
||||
json5 2.2.0 MIT git+https://github.com/json5/json5.git
|
||||
json5 1.0.1 MIT git+https://github.com/json5/json5.git
|
||||
jsoneditor-react 3.1.2 MIT git+https://github.com/vankop/jsoneditor-react.git
|
||||
jss 10.5.1 MIT https://github.com/cssinjs/jss
|
||||
jss-plugin-camel-case 10.5.1 MIT https://github.com/cssinjs/jss
|
||||
jss-plugin-default-unit 10.5.1 MIT https://github.com/cssinjs/jss
|
||||
@@ -333,10 +320,8 @@ moment 2.29.1
|
||||
moment 2.24.0 MIT https://github.com/moment/moment.git
|
||||
moment-timezone 0.5.33 MIT https://github.com/moment/moment-timezone.git
|
||||
ms 2.1.2 MIT https://github.com/zeit/ms.git
|
||||
ms 2.0.0 MIT https://github.com/zeit/ms.git
|
||||
nanocolors 0.1.12 MIT https://github.com/ai/nanocolors.git
|
||||
nanoid 3.1.23 MIT https://github.com/ai/nanoid.git
|
||||
nanoid 3.1.30 MIT https://github.com/ai/nanoid.git
|
||||
nanoid 3.2.0 MIT https://github.com/ai/nanoid.git
|
||||
nanopop 2.1.0 MIT https://github.com/Simonwep/nanopop.git
|
||||
node-releases 1.1.72 MIT git+https://github.com/chicoxyzzy/node-releases.git
|
||||
normalize-url 4.5.1 MIT https://github.com/sindresorhus/normalize-url.git
|
||||
@@ -391,6 +376,15 @@ postcss-value-parser 4.1.0
|
||||
prop-types 15.7.2 MIT https://github.com/facebook/prop-types.git
|
||||
punycode 2.1.1 MIT https://github.com/bestiejs/punycode.js.git
|
||||
raf 3.4.1 MIT git://github.com/chrisdickinson/raf.git
|
||||
rc-align 4.0.11 MIT git@github.com:react-component/align.git
|
||||
rc-dropdown 3.3.0 MIT git@github.com:react-component/dropdown.git
|
||||
rc-menu 9.3.2 MIT git@github.com:react-component/menu.git
|
||||
rc-motion 2.4.4 MIT git@github.com:react-component/motion.git
|
||||
rc-overflow 1.2.2 MIT git@github.com:react-component/overflow.git
|
||||
rc-resize-observer 1.2.0 MIT git@github.com:react-component/resize-observer.git
|
||||
rc-tabs 11.10.5 MIT git@github.com:react-component/tabs.git
|
||||
rc-trigger 5.2.10 MIT https://github.com/react-component/trigger.git
|
||||
rc-util 5.17.0 MIT git@github.com:react-component/util.git
|
||||
react 16.14.0 MIT git+https://github.com/facebook/react.git
|
||||
react 17.0.2 MIT https://github.com/facebook/react.git
|
||||
react-aspen 1.1.1 MIT https://github.com/neeksandhu/react-aspen.git
|
||||
@@ -403,11 +397,12 @@ react-is 16.13.1
|
||||
react-is 17.0.2 MIT https://github.com/facebook/react.git
|
||||
react-select 4.3.1 MIT https://github.com/JedWatson/react-select/tree/master/packages/react-select
|
||||
react-table 7.7.0 MIT https://github.com/tannerlinsley/react-table
|
||||
react-transition-state 1.1.3 MIT https://github.com/szhsin/react-transition-state.git
|
||||
react-virtualized-auto-sizer 1.0.6 MIT https://github.com/bvaughn/react-virtualized-auto-sizer.git
|
||||
react-window 1.8.6 MIT https://github.com/bvaughn/react-window.git
|
||||
regenerator-runtime 0.13.7 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
|
||||
regenerator-runtime 0.11.1 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
|
||||
repeating 2.0.1 MIT https://github.com/sindresorhus/repeating.git
|
||||
require-from-string 2.0.2 MIT https://github.com/floatdrop/require-from-string.git
|
||||
resize-observer-polyfill 1.5.1 MIT https://github.com/que-etc/resize-observer-polyfill.git
|
||||
resolve-from 4.0.0 MIT https://github.com/sindresorhus/resolve-from.git
|
||||
rgb-regex 1.0.1 MIT https://github.com/regexps/rgb-regex.git
|
||||
rgba-regex 1.0.0 MIT https://github.com/johnotander/rgba-regex.git
|
||||
@@ -416,7 +411,6 @@ safe-buffer 5.1.2
|
||||
scheduler 0.19.1 MIT https://github.com/facebook/react.git
|
||||
scheduler 0.20.2 MIT https://github.com/facebook/react.git
|
||||
schema-utils 3.0.0 MIT https://github.com/webpack/schema-utils.git
|
||||
schema-utils 0.3.0 MIT git+https://github.com/webpack-contrib/schema-utils.git
|
||||
schema-utils 1.0.0 MIT https://github.com/webpack-contrib/schema-utils
|
||||
select2 4.0.13 MIT git://github.com/select2/select2.git
|
||||
shallowequal 1.1.0 MIT https://github.com/dashed/shallowequal.git
|
||||
@@ -428,13 +422,11 @@ socket.io-parser 4.0.4
|
||||
source-list-map 1.1.2 MIT https://github.com/webpack/source-list-map.git
|
||||
split.js 1.6.4 MIT https://github.com/nathancahill/split
|
||||
stable 0.1.8 MIT https://github.com/Two-Screen/stable.git
|
||||
strip-ansi 3.0.1 MIT https://github.com/chalk/strip-ansi.git
|
||||
strip-comments 2.0.1 MIT https://github.com/jonschlinkert/strip-comments.git
|
||||
styled-components 5.2.1 MIT git+https://github.com/styled-components/styled-components.git
|
||||
stylehacks 5.0.1 MIT https://github.com/cssnano/cssnano.git
|
||||
stylis 4.0.10 MIT https://github.com/thysultan/stylis.js
|
||||
supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 2.0.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 7.2.0 MIT https://github.com/chalk/supports-color.git
|
||||
svgo 2.7.0 MIT git://github.com/svg/svgo.git
|
||||
symbol-observable 1.2.0 MIT https://github.com/blesh/symbol-observable.git
|
||||
@@ -445,8 +437,7 @@ tiny-emitter 2.1.0
|
||||
tiny-warning 1.0.3 MIT https://github.com/alexreardon/tiny-warning.git
|
||||
tippy.js 6.3.1 MIT git+https://github.com/atomiks/tippyjs.git
|
||||
to-fast-properties 2.0.0 MIT https://github.com/sindresorhus/to-fast-properties.git
|
||||
to-fast-properties 1.0.3 MIT https://github.com/sindresorhus/to-fast-properties.git
|
||||
trim-right 1.0.1 MIT https://github.com/sindresorhus/trim-right.git
|
||||
toggle-selection 1.0.6 MIT git+https://github.com/sudodoki/toggle-selection
|
||||
unc-path-regex 0.1.2 MIT https://github.com/regexhq/unc-path-regex.git
|
||||
underscore 1.13.1 MIT git://github.com/jashkenas/underscore.git
|
||||
uniqs 2.0.0 MIT git://github.com/fgnass/uniqs.git
|
||||
@@ -477,8 +468,8 @@ minimatch 3.0.4
|
||||
postcss-modules-extract-imports 3.0.0 ISC https://github.com/css-modules/postcss-modules-extract-imports.git
|
||||
postcss-modules-scope 3.0.0 ISC https://github.com/css-modules/postcss-modules-scope.git
|
||||
postcss-modules-values 4.0.0 ISC git+https://github.com/css-modules/postcss-modules-values.git
|
||||
react-timer-hook 3.0.5 ISC git+https://github.com/amrlabib/react-timer-hook.git
|
||||
semver 7.3.4 ISC https://github.com/npm/node-semver
|
||||
semver 5.7.1 ISC https://github.com/npm/node-semver
|
||||
semver 6.3.0 ISC https://github.com/npm/node-semver
|
||||
vanilla-picker 2.11.2 ISC https://github.com/Sphinxxxx/vanilla-picker.git
|
||||
yallist 4.0.0 ISC git+https://github.com/isaacs/yallist.git
|
||||
@@ -486,9 +477,7 @@ yaml 1.10.2
|
||||
ace-builds 1.4.12 BSD-3-Clause https://github.com/ajaxorg/ace-builds.git
|
||||
hoist-non-react-statics 3.3.2 BSD-3-Clause git://github.com/mridgway/hoist-non-react-statics.git
|
||||
hyphenate-style-name 1.0.4 BSD-3-Clause git+ssh://git@github.com/rexxars/hyphenate-style-name.git
|
||||
istanbul-lib-coverage 1.2.1 BSD-3-Clause git@github.com:istanbuljs/istanbuljs.git
|
||||
istanbul-lib-coverage 3.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git
|
||||
istanbul-lib-instrument 1.10.2 BSD-3-Clause git@github.com:istanbuljs/istanbuljs.git
|
||||
istanbul-lib-instrument 4.0.3 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git
|
||||
istanbul-lib-report 3.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git
|
||||
istanbul-lib-source-maps 4.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git
|
||||
@@ -503,15 +492,16 @@ indefinite-observable 2.0.1
|
||||
jmespath 0.15.0 Apache-2.0 git://github.com/jmespath/jmespath.js
|
||||
jsoneditor 9.5.6 Apache-2.0 https://github.com/josdejong/jsoneditor.git
|
||||
paths-js 0.4.11 Apache-2.0 https://github.com/andreaferretti/paths-js.git
|
||||
rc-dock 3.2.10 Apache-2.0 https://github.com/ticlo/rc-dock.git
|
||||
rc-new-window 0.1.13 Apache-2.0 https://github.com/ticlo/rc-new-window.git
|
||||
snapsvg 0.5.1 Apache-2.0 git@github.com:adobe-webplatform/Snap.svg.git
|
||||
caniuse-lite 1.0.30001230 CC-BY-4.0 https://github.com/browserslist/caniuse-lite.git
|
||||
caniuse-lite 1.0.30001309 CC-BY-4.0 https://github.com/browserslist/caniuse-lite.git
|
||||
css-select 4.1.3 BSD-2-Clause git://github.com/fb55/css-select.git
|
||||
css-what 5.1.0 BSD-2-Clause https://github.com/fb55/css-what
|
||||
domelementtype 2.2.0 BSD-2-Clause git://github.com/fb55/domelementtype.git
|
||||
domhandler 4.2.0 BSD-2-Clause git://github.com/fb55/domhandler.git
|
||||
domutils 2.6.0 BSD-2-Clause git://github.com/fb55/domutils.git
|
||||
entities 2.2.0 BSD-2-Clause git://github.com/fb55/entities.git
|
||||
esutils 2.0.3 BSD-2-Clause http://github.com/estools/esutils.git
|
||||
leaflet 1.7.1 BSD-2-Clause git://github.com/Leaflet/Leaflet.git
|
||||
nth-check 2.0.1 BSD-2-Clause https://github.com/fb55/nth-check
|
||||
uri-js 4.4.1 BSD-2-Clause http://github.com/garycourt/uri-js
|
||||
@@ -524,5 +514,5 @@ precond 0.2.3
|
||||
webcabin-docker 2.2.5 MIT* Unknown
|
||||
tablesorter 2.31.3 (MIT OR GPL-2.0) git://github.com/Mottie/tablesorter.git
|
||||
|
||||
452 dependencies listed.
|
||||
439 dependencies listed.
|
||||
|
||||
@@ -211,7 +211,8 @@ REM Main build sequence Ends
|
||||
RD /Q /S "%WD%\web\pgadmin\static\js\generated\.cache" 1> nul 2>&1
|
||||
|
||||
ECHO Copying web directory...
|
||||
XCOPY /S /I /E /H /Y "%WD%\web" "%BUILDROOT%\web" > nul || EXIT /B 1
|
||||
ROBOCOPY /S "%WD%\web" "%BUILDROOT%\web" > nul
|
||||
CALL :CHECK_ROBOCOPY_ERROR
|
||||
|
||||
ECHO Installing javascript dependencies...
|
||||
CD "%BUILDROOT%\web"
|
||||
@@ -272,10 +273,15 @@ REM Main build sequence Ends
|
||||
REM YARN END
|
||||
|
||||
REM WGET
|
||||
FOR /f "tokens=2 delims='" %%i IN ('yarn info nw ^| findstr "latest: "') DO SET "NW_VERSION=%%i"
|
||||
:GET_NW
|
||||
wget https://dl.nwjs.io/v%NW_VERSION%/nwjs-v%NW_VERSION%-win-x64.zip -O "%TMPDIR%\nwjs-v%NW_VERSION%-win-x64.zip"
|
||||
IF %ERRORLEVEL% NEQ 0 GOTO GET_NW
|
||||
REM Comment out the below for loop as the latest version (0.62.0) having
|
||||
REM some problem, so for the time being hardcoded the version to 0.61.0
|
||||
REM FOR /f "tokens=2 delims='" %%i IN ('yarn info nw ^| findstr "latest: "') DO SET "NW_VERSION=%%i"
|
||||
REM :GET_NW
|
||||
REM wget https://dl.nwjs.io/v%NW_VERSION%/nwjs-v%NW_VERSION%-win-x64.zip -O "%TMPDIR%\nwjs-v%NW_VERSION%-win-x64.zip"
|
||||
REM IF %ERRORLEVEL% NEQ 0 GOTO GET_NW
|
||||
|
||||
SET "NW_VERSION=0.61.0"
|
||||
wget https://dl.nwjs.io/v%NW_VERSION%/nwjs-v%NW_VERSION%-win-x64.zip -O "%TMPDIR%\nwjs-v%NW_VERSION%-win-x64.zip"
|
||||
|
||||
tar -C "%TMPDIR%" -xvf "%TMPDIR%\nwjs-v%NW_VERSION%-win-x64.zip" || EXIT /B 1
|
||||
REM WGET END
|
||||
@@ -365,3 +371,6 @@ REM Main build sequence Ends
|
||||
|
||||
EXIT /B 1
|
||||
|
||||
:CHECK_ROBOCOPY_ERROR
|
||||
IF %ERRORLEVEL% GEQ 8 EXIT /B %ERRORLEVEL%
|
||||
EXIT /B 0
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
Use the *Add named restore point* dialog to take a named snapshot of the state
|
||||
of the server for use in a recovery file. To create a named restore point, the
|
||||
server's postgresql.conf file must specify a *wal_level* value of *archive*,
|
||||
*hot_standby*, or *logical*. You must be a database superuser to create a
|
||||
server's postgresql.conf file must specify a *wal_level* value of *replica*,
|
||||
*logical*, or *minimal*. You must be a database superuser to create a
|
||||
restore point.
|
||||
|
||||
.. image:: images/add_restore_point.png
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
.. _cloud_deployment:
|
||||
|
||||
******************************
|
||||
`Cloud Deployment`:index:
|
||||
******************************
|
||||
|
||||
The PostgreSQL server can be deployed on the Amazon AWS cloud using this module.
|
||||
Currently only RDS is available, but in the future more cloud options will be available.
|
||||
|
||||
To launch the *Cloud Deployment...* tool, right click on the *Server Group* or *Server* of the tree control, and select
|
||||
*Deploy a Cloud Instance* from the *Register* menu.
|
||||
|
||||
.. image:: images/cloud_deployment_provider.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
Once you launch the tool, the Amazon RDS is already selected as this is the only option currently available.
|
||||
Click on the *Next* button to proceed further.
|
||||
|
||||
.. image:: images/cloud_deployment_credentials.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
In the Credentials dialog, provide the region in which you want to deploy the instance along with
|
||||
*AWS access key* and *AWS secret access key*.
|
||||
Provide *AWS session token* only if your AWS session is temporary.
|
||||
|
||||
To proceed further, click on the next button. Before going further, pgAdmin will validate your credentials.
|
||||
|
||||
.. image:: images/cloud_deployment_instance.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
Use the fields from the Instance Specification tab to specify the Instance details.
|
||||
|
||||
* Use the *Instance name* field to add an instance name for the PostgreSQL server; the name
|
||||
specified will be displayed in the *Browser* tree control too.
|
||||
|
||||
* Use the *Public IP* field to specify the IP Address range for permitting the inbound traffic.
|
||||
|
||||
* Use the *Database version* field to specify the PostgreSQL version to deploy.
|
||||
|
||||
* Use the *Instance class* field to allocate the computational, network, and memory capacity required by planned workload of this DB instance.
|
||||
|
||||
* Use the *Instance type* field to select the instance type.
|
||||
|
||||
* Use the *Storage type* field to select the instance storage type. Three options are available. General Purpose (SSD) storage, Provisioned IOPS (SSD) and Magnetic storage.
|
||||
|
||||
* Use the *Allocated storage* field to specify the storage capacity in GiB.
|
||||
|
||||
* Use the *Provisioned IOPS* in case of Provisioned IOPS (SSD) storage type.
|
||||
|
||||
.. image:: images/cloud_deployment_database.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
Use the fields from the Database Details tab to specify the Instance details.
|
||||
|
||||
* Use the drop-down list box in the *Server group* field to select the parent
|
||||
node for the server; the server will be displayed in the *Browser* tree
|
||||
control within the specified group.
|
||||
|
||||
* Use the *Database name* field to add the database name for the PostgreSQL server.
|
||||
|
||||
* Use the *Username* field to specify the name of a role that will be used when
|
||||
authenticating with the server.
|
||||
|
||||
* Use the *Password* field to provide a password that will be supplied when
|
||||
authenticating with the server.
|
||||
|
||||
* Use the *Confirm password* field to repeat the password.
|
||||
|
||||
* Enter the listener port number of the server host in the *Port* field.
|
||||
|
||||
.. image:: images/cloud_deployment_review.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
At the end, review the Instance details that you provided. Click on Finish button to deploy the instance on Amazon RDS.
|
||||
|
||||
.. image:: images/cloud_deployment_tree.png
|
||||
:alt: Cloud Deployment Provider
|
||||
:align: center
|
||||
|
||||
Once you click on the finish, one background process will start which will deploy the instance in the cloud
|
||||
and monitor the progress of the deployment. The Server will be added to the tree with the cloud uploading icon.
|
||||
Once the deployment is done, the necessary server details will be updated.
|
||||
@@ -18,7 +18,7 @@ control, and select *Server Group* from the *Create* menu.
|
||||
Use the fields on the *Server* dialog to define the connection properties for
|
||||
each new server that you wish to manage with pgAdmin. To open the *Server*
|
||||
dialog, right-click on the *Servers* node of the tree control, and select
|
||||
*Server* from the *Create* menu.
|
||||
*Server* from the *Register* menu.
|
||||
|
||||
.. toctree::
|
||||
|
||||
|
||||
@@ -17,3 +17,4 @@ will provide detailed information about creating a custom deployment.
|
||||
desktop_deployment
|
||||
server_deployment
|
||||
container_deployment
|
||||
cloud_deployment
|
||||
@@ -78,22 +78,25 @@ Use the *Runtime Menu* to access the *Configuration* dialog:
|
||||
:alt: Runtime Configuration
|
||||
:align: center
|
||||
|
||||
Following are the details of the *Fixed port number?*, *Port Number*, and *Connection
|
||||
Timeout* configuration parameters:
|
||||
Following are the details of the *Fixed port number?*, *Port Number*, *Connection
|
||||
Timeout*, and 'Open Documentation in Default Browser?' configuration parameters:
|
||||
|
||||
.. table::
|
||||
:class: longtable
|
||||
:widths: 2 1 4
|
||||
|
||||
+--------------------------+--------------------+---------------------------------------------------------------+
|
||||
| Key | Type | Purpose |
|
||||
+==========================+====================+===============================================================+
|
||||
| FixedPort | Boolean | Use a fixed network port number rather than a random one. |
|
||||
+--------------------------+--------------------+---------------------------------------------------------------+
|
||||
| PortNumber | Integer | The port number to use, if using a fixed port. |
|
||||
+--------------------------+--------------------+---------------------------------------------------------------+
|
||||
| ConnectionTimeout | Integer | The number of seconds to wait for application server startup. |
|
||||
+--------------------------+--------------------+---------------------------------------------------------------+
|
||||
+----------------------------------------+--------------------+---------------------------------------------------------------+
|
||||
| Key | Type | Purpose |
|
||||
+========================================+====================+===============================================================+
|
||||
| FixedPort | Boolean | Use a fixed network port number rather than a random one. |
|
||||
+----------------------------------------+--------------------+---------------------------------------------------------------+
|
||||
| PortNumber | Integer | The port number to use, if using a fixed port. |
|
||||
+----------------------------------------+--------------------+---------------------------------------------------------------+
|
||||
| ConnectionTimeout | Integer | The number of seconds to wait for application server startup. |
|
||||
+----------------------------------------+--------------------+---------------------------------------------------------------+
|
||||
| Open Documentation in Default Browser | Boolean | By checking this option, all documentation links will open in |
|
||||
| | | the default browser instead of in a new window. |
|
||||
+----------------------------------------+--------------------+---------------------------------------------------------------+
|
||||
|
||||
Log dialog
|
||||
----------
|
||||
|
||||
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 152 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 208 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 83 KiB |
@@ -15,7 +15,6 @@ database, right-click on the *Databases* node, and select *Create Database...*
|
||||
:maxdepth: 1
|
||||
|
||||
database_dialog
|
||||
move_objects
|
||||
resource_group_dialog
|
||||
role_dialog
|
||||
tablespace_dialog
|
||||
|
||||
@@ -53,20 +53,20 @@ following options (in alphabetical order):
|
||||
| *Clear SSH Tunnel Password* | If you have saved the ssh tunnel password, click to clear the saved password. |
|
||||
| | Enable only when password is already saved. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Connect Server...* | Click to open the :ref:`Connect to Server <connect_to_server>` dialog to establish a connection with a server. |
|
||||
| *Connect Server* | Click to open the :ref:`Connect to Server <connect_to_server>` dialog to establish a connection with a server. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Create* | Click *Create* to access a context menu that provides context-sensitive selections. |
|
||||
| | Your selection opens a *Create* dialog for creating a new object. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Delete/Drop* | Click to delete the currently selected object from the server. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Disconnect Server...* | Click to disconnect the currently selected server. |
|
||||
| *Disconnect from server* | Click to disconnect from the currently selected server. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Drop Cascade* | Click to delete the currently selected object and all dependent objects from the server. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Properties...* | Click to review or modify the currently selected object's properties. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Refresh...* | Click to refresh the currently selected object. |
|
||||
| *Refresh* | Click to refresh the currently selected object. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Remove Server* | Click to remove the currently selected server. |
|
||||
+-----------------------------+--------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
.. _move_objects:
|
||||
|
||||
****************************
|
||||
`Move Objects Dialog`:index:
|
||||
****************************
|
||||
|
||||
Use the *Move Objects* dialog to move database objects from one tablespace to
|
||||
another tablespace.
|
||||
|
||||
The *Move Objects* dialog organizes the movement of database objects with the
|
||||
*General* tab; the *SQL* tab displays the SQL code generated by dialog
|
||||
selections.
|
||||
|
||||
.. image:: images/move_objects_general.png
|
||||
:alt: Move objects dialog general tab
|
||||
:align: center
|
||||
|
||||
Use the fields in the *General* tab to identify the items that will be moved and
|
||||
the tablespace to which they will be moved:
|
||||
|
||||
* Use the *New tablespace* drop-down listbox to select a pre-existing
|
||||
tablespace to which the object will be moved. (To create a tablespace, use the
|
||||
*Tablespace* dialog; access the dialog by right clicking *Tablespaces* in the
|
||||
*pgAdmin* tree control and selecting *Create Tablespace...* from the
|
||||
context-menu.)
|
||||
* Use the *Object type* drop-down listbox to select from the following:
|
||||
|
||||
* Select *All* to move all tables, indexes, and materialized views from the
|
||||
current tablespace (currently selected in the *pgAdmin* tree control) to
|
||||
the new tablespace.
|
||||
* Select *Tables* to move tables from the current tablespace to the new
|
||||
tablespace.
|
||||
* Select *Indexes* to move indexes from the current tablespace to the new
|
||||
tablespace.
|
||||
* Select *Materialized views* to move materialized views from the current
|
||||
tablespace to the new tablespace.
|
||||
|
||||
* Use the *Object owner* drop-down listbox to select the role that owns the
|
||||
objects selected in the *Object type* field. This field is optional.
|
||||
|
||||
Click the *SQL* tab to continue.
|
||||
|
||||
Your entries in the *Move Objects* dialog generate a SQL command (see an example
|
||||
below). Use the *SQL* tab for review; revisit the *General* tab to modify the
|
||||
SQL command.
|
||||
|
||||
Example
|
||||
*******
|
||||
|
||||
The following is an example of the sql command generated by user selections in
|
||||
the *Move Objects* dialog:
|
||||
|
||||
.. image:: images/move_objects_sql.png
|
||||
:alt: Move Objects dialog sql tab
|
||||
:align: center
|
||||
|
||||
The example shown demonstrates moving materialized views owned by Alice from
|
||||
tablespace *tbspace_01* to *tbspace_02*.
|
||||
|
||||
* Click the *Help* button (?) to access online help.
|
||||
* Click the *OK* button to save work.
|
||||
* Click the *Cancel* button to exit without saving work.
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,9 @@ notes for it.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
release_notes_6_7
|
||||
release_notes_6_6
|
||||
release_notes_6_5
|
||||
release_notes_6_4
|
||||
release_notes_6_3
|
||||
release_notes_6_2
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Version 6.4
|
||||
************
|
||||
|
||||
Release date: 2021-01-13
|
||||
Release date: 2022-01-13
|
||||
|
||||
This release contains a number of bug fixes and new features since the release of pgAdmin4 6.3.
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
************
|
||||
Version 6.5
|
||||
************
|
||||
|
||||
Release date: 2022-02-11
|
||||
|
||||
This release contains a number of bug fixes and new features since the release of pgAdmin4 6.4.
|
||||
|
||||
New features
|
||||
************
|
||||
|
||||
| `Issue #7139 <https://redmine.postgresql.org/issues/7139>`_ - Added support to open SQL help, Dialog help, and online help in an external web browser.
|
||||
|
||||
Housekeeping
|
||||
************
|
||||
|
||||
| `Issue #7016 <https://redmine.postgresql.org/issues/7016>`_ - Port Dependent, dependencies, statistics panel to React.
|
||||
| `Issue #7017 <https://redmine.postgresql.org/issues/7017>`_ - Port Import/Export dialog to React.
|
||||
| `Issue #7163 <https://redmine.postgresql.org/issues/7163>`_ - Rename the menu 'Disconnect Server' to 'Disconnect from server'.
|
||||
|
||||
Bug fixes
|
||||
*********
|
||||
|
||||
| `Issue #6916 <https://redmine.postgresql.org/issues/6916>`_ - Added flag in runtime to disable GPU hardware acceleration.
|
||||
| `Issue #7035 <https://redmine.postgresql.org/issues/7035>`_ - Fixed an issue where connections keep open to (closed) connections on the initial connection to the database server.
|
||||
| `Issue #7085 <https://redmine.postgresql.org/issues/7085>`_ - Ensure that Partitioned tables should be visible correctly when creating multiple partition levels.
|
||||
| `Issue #7086 <https://redmine.postgresql.org/issues/7086>`_ - Correct documentation for 'Add named restore point'.
|
||||
| `Issue #7100 <https://redmine.postgresql.org/issues/7100>`_ - Fixed an issue where the Browser tree gets disappears when scrolling sequences.
|
||||
| `Issue #7109 <https://redmine.postgresql.org/issues/7109>`_ - Make the size blank for all the directories in the file select dialog.
|
||||
| `Issue #7110 <https://redmine.postgresql.org/issues/7110>`_ - Ensure that cursor should be focused on the first options of the Utility dialogs.
|
||||
| `Issue #7118 <https://redmine.postgresql.org/issues/7118>`_ - Ensure that JSON files should be downloaded properly from the storage manager.
|
||||
| `Issue #7123 <https://redmine.postgresql.org/issues/7123>`_ - Fixed an issue where restore generates incorrect options for the schema.
|
||||
| `Issue #7126 <https://redmine.postgresql.org/issues/7126>`_ - Fixed an issue where the F2 Function key removes browser panel contents.
|
||||
| `Issue #7127 <https://redmine.postgresql.org/issues/7127>`_ - Added validation for Hostname in the server dialog.
|
||||
| `Issue #7135 <https://redmine.postgresql.org/issues/7135>`_ - Enforce the minimum Windows version that the installer will run on.
|
||||
| `Issue #7136 <https://redmine.postgresql.org/issues/7136>`_ - Fixed an issue where the query tool is displaying an incorrect label.
|
||||
| `Issue #7142 <https://redmine.postgresql.org/issues/7142>`_ - Fixed an issue where a warning message was shown after database creation/modification.
|
||||
| `Issue #7145 <https://redmine.postgresql.org/issues/7145>`_ - Ensure that owner should be ignored while comparing extensions.
|
||||
| `Issue #7146 <https://redmine.postgresql.org/issues/7146>`_ - Fixed event trigger comparing issue in Schema Diff tool.
|
||||
| `Issue #7150 <https://redmine.postgresql.org/issues/7150>`_ - Fixed an issue when uploading a CSV throwing an error in the Desktop mode.
|
||||
| `Issue #7151 <https://redmine.postgresql.org/issues/7151>`_ - Fixed value error in the restore dialog.
|
||||
| `Issue #7154 <https://redmine.postgresql.org/issues/7154>`_ - Ensure that the layout should not be reset if a query tool is opened and pgAdmin is restarted.
|
||||
@@ -0,0 +1,33 @@
|
||||
************
|
||||
Version 6.6
|
||||
************
|
||||
|
||||
Release date: 2022-03-10
|
||||
|
||||
This release contains a number of bug fixes and new features since the release of pgAdmin4 6.5.
|
||||
|
||||
New features
|
||||
************
|
||||
|
||||
| `Issue #7177 <https://redmine.postgresql.org/issues/7177>`_ - Added capability to deploy PostgreSQL servers on Amazon RDS.
|
||||
|
||||
Housekeeping
|
||||
************
|
||||
|
||||
| `Issue #7180 <https://redmine.postgresql.org/issues/7180>`_ - Rename the menu 'Disconnect Database' to 'Disconnect from database'.
|
||||
|
||||
|
||||
Bug fixes
|
||||
*********
|
||||
|
||||
| `Issue #6956 <https://redmine.postgresql.org/issues/6956>`_ - Fixed a schema diff issue in which user mappings were not compared correctly.
|
||||
| `Issue #6991 <https://redmine.postgresql.org/issues/6991>`_ - Fixed an issue where pgadmin cannot connect to LDAP when STARTTLS is required before bind.
|
||||
| `Issue #6999 <https://redmine.postgresql.org/issues/6999>`_ - Fixed an issue where a warning is flashed every time for an email address when authentication sources are internal and ldap.
|
||||
| `Issue #7105 <https://redmine.postgresql.org/issues/7105>`_ - Fixed an issue where the parent partition table was not displayed during autocomplete.
|
||||
| `Issue #7124 <https://redmine.postgresql.org/issues/7124>`_ - Fixed the schema diff issue where tables have different column positions and a column has a default value.
|
||||
| `Issue #7152 <https://redmine.postgresql.org/issues/7152>`_ - Added comments column for the functions collection node.
|
||||
| `Issue #7172 <https://redmine.postgresql.org/issues/7172>`_ - Allow users to scroll and enter input when there is a validation error.
|
||||
| `Issue #7173 <https://redmine.postgresql.org/issues/7173>`_ - Fixed an issue where the User Management dialog is not opening.
|
||||
| `Issue #7181 <https://redmine.postgresql.org/issues/7181>`_ - Ensure that the user should be able to add new server with unix socket connection.
|
||||
| `Issue #7186 <https://redmine.postgresql.org/issues/7186>`_ - Fixes an issue where the connect server/database menu was not updated correctly.
|
||||
| `Issue #7202 <https://redmine.postgresql.org/issues/7202>`_ - Ensure that Flask-Security-Too is using the latest version.
|
||||
@@ -0,0 +1,26 @@
|
||||
************
|
||||
Version 6.7
|
||||
************
|
||||
|
||||
Release date: 2022-03-14
|
||||
|
||||
This release contains a number of bug fixes and new features since the release of pgAdmin4 6.6.
|
||||
|
||||
.. note:: **Security Release**
|
||||
|
||||
Please note that this release includes a security update to fix an issue
|
||||
where a user could upload files to directories outside of their storage directory, when using pgAdmin
|
||||
running in server mode.
|
||||
|
||||
Users running pgAdmin in server mode, including the standard container based distribution, should upgrade
|
||||
to this release as soon as possible.
|
||||
|
||||
This issue does not affect users running in desktop mode.
|
||||
|
||||
Bug fixes
|
||||
*********
|
||||
|
||||
| `Issue #7220 <https://redmine.postgresql.org/issues/7220>`_ - Fixed a schema diff issue where difference SQL isn't generated when foreign key values for a table differ.
|
||||
| `Issue #7228 <https://redmine.postgresql.org/issues/7228>`_ - Fixed a schema diff issue where string separator '_$PGADMIN$_' is visible for identical user mappings.
|
||||
| `Issue #7230 <https://redmine.postgresql.org/issues/7230>`_ - Fixed an issue where pgAdmin 4 took ~75 seconds to display the 'Starting pgAdmin' text on the splash screen.
|
||||
| `Issue #7233 <https://redmine.postgresql.org/issues/7233>`_ - Ensure that upload paths are children of the storage directory.
|
||||
@@ -53,7 +53,7 @@ following selections (options appear in alphabetical order):
|
||||
+---------------------------+---------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Disconnect Database...* | Click to terminate a database connection. |
|
||||
+---------------------------+---------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Disconnect Server...* | Click to refresh the currently selected object. |
|
||||
| *Disconnect from server* | Click to disconnect from the currently selected server. |
|
||||
+---------------------------+---------------------------------------------------------------------------------------------------------------------------+
|
||||
| *Drop Cascade* | Click to delete the currently selected object and all dependent objects from the server. |
|
||||
+---------------------------+---------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
@@ -32,8 +32,9 @@ and modify the values for the following parameters:
|
||||
"WEBSERVER_AUTO_CREATE_USER", "Set the value to *True* if you want to automatically
|
||||
create a pgAdmin user corresponding to a successfully authenticated Webserver user.
|
||||
Please note that password is not stored in the pgAdmin database."
|
||||
"WEBSERVER_REMOTE_USER", "The default value is REMOTE_USER, set this variable to any header
|
||||
or environemnt variable to get the webserver remote user details. Possible values: REMOTE_USER,
|
||||
"WEBSERVER_REMOTE_USER", "To get the web server remote user details, set this variable to any header or
|
||||
environment variable name which comes from the web server after webserver authentication.
|
||||
The default value is REMOTE_USER and the possible values are REMOTE_USER,
|
||||
HTTP_X_FORWARDED_USER, X-Forwarded-User."
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@ OS_VERSION=$(cat /etc/os-release | grep "^VERSION_ID=" | awk -F "=" '{ print $2
|
||||
OS_NAME=$(cat /etc/os-release | grep "^ID=" | awk -F "=" '{ print $2 }' | sed 's/"//g')
|
||||
OS_ARCH=$(dpkg-architecture -qDEB_HOST_ARCH)
|
||||
|
||||
# Stop creating pyc files.
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
|
||||
# Common Linux build functions
|
||||
source pkg/linux/build-functions.sh
|
||||
|
||||
@@ -35,6 +38,7 @@ Package: ${APP_NAME}-server
|
||||
Version: ${APP_LONG_VERSION}
|
||||
Architecture: ${OS_ARCH}
|
||||
Section: database
|
||||
Priority: optional
|
||||
Depends: python3, libpq5 (>= 11.0), libgssapi-krb5-2
|
||||
Recommends: postgresql-client | postgresql-client-14 | postgresql-client-13 | postgresql-client-12 | postgresql-client-11 | postgresql-client-10
|
||||
Maintainer: pgAdmin Development Team <pgadmin-hackers@postgresql.org>
|
||||
@@ -57,6 +61,7 @@ Package: ${APP_NAME}-desktop
|
||||
Version: ${APP_LONG_VERSION}
|
||||
Architecture: ${OS_ARCH}
|
||||
Section: database
|
||||
Priority: optional
|
||||
Depends: ${APP_NAME}-server (= ${APP_LONG_VERSION}), libatomic1, xdg-utils
|
||||
Maintainer: pgAdmin Development Team <pgadmin-hackers@postgresql.org>
|
||||
Description: The desktop user interface for pgAdmin. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world.
|
||||
@@ -82,6 +87,7 @@ Package: ${APP_NAME}-web
|
||||
Version: ${APP_LONG_VERSION}
|
||||
Architecture: all
|
||||
Section: database
|
||||
Priority: optional
|
||||
Depends: ${APP_NAME}-server (= ${APP_LONG_VERSION}), apache2, libapache2-mod-wsgi-py3
|
||||
Maintainer: pgAdmin Development Team <pgadmin-hackers@postgresql.org>
|
||||
Description: The web interface for pgAdmin, hosted under Apache HTTPD. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world.
|
||||
@@ -106,6 +112,7 @@ Package: ${APP_NAME}
|
||||
Version: ${APP_LONG_VERSION}
|
||||
Architecture: all
|
||||
Section: database
|
||||
Priority: optional
|
||||
Depends: ${APP_NAME}-server (= ${APP_LONG_VERSION}), ${APP_NAME}-desktop (= ${APP_LONG_VERSION}), ${APP_NAME}-web (= ${APP_LONG_VERSION})
|
||||
Maintainer: pgAdmin Development Team <pgadmin-hackers@postgresql.org>
|
||||
Description: Installs all required components to run pgAdmin in desktop and web modes. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world.
|
||||
|
||||
@@ -65,6 +65,9 @@ _create_python_virtualenv() {
|
||||
sed -i 's/setenv VIRTUAL_ENV .*/setenv VIRTUAL_ENV "\/usr\/pgadmin4\/venv"/g' venv/bin/activate.csh
|
||||
sed -i 's/set -gx VIRTUAL_ENV .*/set -gx VIRTUAL_ENV "\/usr\/pgadmin4\/venv"/g' venv/bin/activate.fish
|
||||
|
||||
# Remove __pycache__
|
||||
find . -name "__pycache__" -type d -print0 | xargs -0 rm -rf
|
||||
|
||||
# Fixup hash bangs
|
||||
sed -i 's/#!.*\/python3/#\!\/usr\/pgadmin4\/venv\/bin\/python3/g' venv/bin/*
|
||||
|
||||
@@ -125,7 +128,10 @@ _build_runtime() {
|
||||
# YARN END
|
||||
|
||||
# WGET:
|
||||
NW_VERSION=$(yarn info nw | grep latest | awk -F "'" '{ print $2}')
|
||||
# Comment out the below line as the latest version (0.62.0) having some
|
||||
# problem, so for the time being hardcoded the version to 0.61.0
|
||||
# NW_VERSION=$(yarn info nw | grep latest | awk -F "'" '{ print $2}')
|
||||
NW_VERSION="0.61.0"
|
||||
|
||||
pushd "${BUILDROOT}" > /dev/null
|
||||
while true;do
|
||||
|
||||
@@ -33,7 +33,10 @@ _build_runtime() {
|
||||
# YARN END
|
||||
|
||||
# WGET:
|
||||
NW_VERSION=$(yarn info nw | grep latest | awk -F "'" '{ print $2}')
|
||||
# Comment out the below line as the latest version (0.62.0) having some
|
||||
# problem, so for the time being hardcoded the version to 0.61.0
|
||||
# NW_VERSION=$(yarn info nw | grep latest | awk -F "'" '{ print $2}')
|
||||
NW_VERSION="0.61.0"
|
||||
|
||||
pushd "${BUILD_ROOT}" > /dev/null
|
||||
while true;do
|
||||
|
||||
@@ -46,8 +46,8 @@ if [ "x${PGADMIN_POSTGRES_DIR}" == "x" ]; then
|
||||
fi
|
||||
|
||||
if [ "x${PGADMIN_PYTHON_VERSION}" == "x" ]; then
|
||||
echo "PGADMIN_PYTHON_VERSION not set. Setting it to the default: 3.9.5"
|
||||
export PGADMIN_PYTHON_VERSION=3.9.5
|
||||
echo "PGADMIN_PYTHON_VERSION not set. Setting it to the default: 3.9.9"
|
||||
export PGADMIN_PYTHON_VERSION=3.9.9
|
||||
fi
|
||||
|
||||
source ${SCRIPT_DIR}/build-functions.sh
|
||||
|
||||
@@ -5,8 +5,10 @@ Redhat distributions.
|
||||
|
||||
## Supported platforms
|
||||
|
||||
* Fedora 30, 31 & 32
|
||||
* RHEL/CentOS 7 & 8
|
||||
* Fedora 34 & 35
|
||||
* RHEL 7 & 8
|
||||
* CentOS 7
|
||||
* Rocky Linux 8 (x86_64)
|
||||
|
||||
## Build configuration
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@ OS_ARCH=$(arch)
|
||||
# Make sure we get the right libpq
|
||||
export PATH=/usr/pgsql-14/bin:$PATH
|
||||
|
||||
# Stop creating pyc files.
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
|
||||
# Common Linux build functions
|
||||
source pkg/linux/build-functions.sh
|
||||
|
||||
@@ -43,6 +46,10 @@ cat << EOF > "${BUILDROOT}/server.spec"
|
||||
%global __provides_exclude_from ^/.*$
|
||||
%global _build_id_links none
|
||||
|
||||
# Disable RPATH checking, as it will fail with some of the paths in the Python
|
||||
# virtualenv, in particular Pillow.libs.
|
||||
%global __brp_check_rpaths %{nil}
|
||||
|
||||
# Bytecompiling Python 3 doesn't work on RHEL/CentOS 7, so make it a no-op
|
||||
%if 0%{?rhel} && 0%{?rhel} == 7
|
||||
%define __python /bin/true
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#define MyAppInvalidPath "Please provide a valid path."
|
||||
#define MyAppErrorMsgIsWin32 "You already have a 32 bit installation of pgAdmin 4. Please uninstall this before installing the 64 bit version."
|
||||
#define MyAppErrorMsgIsWin64 "You already have a 64 bit installation of pgAdmin 4. Please uninstall this before installing the 32 bit version."
|
||||
#define MinimumWindowsVer "6.2.9200"
|
||||
|
||||
[Setup]
|
||||
AppId={#MyAppName}{#MyAppVersion}
|
||||
@@ -35,6 +36,7 @@ UninstallDisplayIcon={app}\runtime\{#MyAppExeName}
|
||||
ArchitecturesInstallIn64BitMode={#MyAppArchitecturesMode}
|
||||
AllowNoIcons=yes
|
||||
WizardImageFile=sidebar.bmp
|
||||
MinVersion={#MinimumWindowsVer}
|
||||
|
||||
[Languages]
|
||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
|
||||
@@ -18,7 +18,7 @@ Flask-WTF==1.*
|
||||
Flask-Compress==1.*
|
||||
Flask-Paranoid==0.*
|
||||
Flask-Babel==2.*
|
||||
Flask-Security-Too==4.*
|
||||
Flask-Security-Too==4.1.*
|
||||
Flask-SocketIO>=5.0.1
|
||||
WTForms==3.*
|
||||
passlib==1.*
|
||||
@@ -44,4 +44,8 @@ Authlib==0.15.*
|
||||
requests==2.25.*
|
||||
pyotp==2.*
|
||||
qrcode==7.*
|
||||
Pillow==8.3.*
|
||||
Pillow==8.3.*; python_version <= '3.6'
|
||||
Pillow==9.*; python_version >= '3.7'
|
||||
boto3==1.20.*
|
||||
botocore==1.23.*
|
||||
urllib3==1.26.*
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 130"><defs><style>.cls-1{stroke:#000;stroke-width:10.19px;}.cls-2{fill:#336791;}.cls-3,.cls-4,.cls-9{fill:none;}.cls-3,.cls-4,.cls-5,.cls-6{stroke:#fff;}.cls-3,.cls-4{stroke-linecap:round;stroke-width:3.4px;}.cls-3{stroke-linejoin:round;}.cls-4{stroke-linejoin:bevel;}.cls-5,.cls-6{fill:#fff;}.cls-5{stroke-width:1.13px;}.cls-6{stroke-width:0.57px;}.cls-7{fill:#2775b6;}.cls-8{fill:#333;}.cls-9{stroke:#333;stroke-width:3px;}</style></defs><title>pgAdmin_PostgreSQL</title><g id="Layer_1" data-name="Layer 1"><g id="Layer_3"><path class="cls-1" d="M95.59,93.65c.77-6.44.54-7.38,5.33-6.34l1.21.11a27.6,27.6,0,0,0,11.34-1.91c6.09-2.83,9.71-7.55,3.7-6.31-13.71,2.83-14.65-1.81-14.65-1.81C117,55.91,123,28.64,117.82,22,103.57,3.76,78.91,12.37,78.5,12.6l-.13,0a48.65,48.65,0,0,0-9.15-.95C63,11.57,58.31,13.29,54.74,16c0,0-44-18.12-41.95,22.8.44,8.7,12.48,65.86,26.84,48.6C44.88,81.08,50,75.75,50,75.75A13.39,13.39,0,0,0,58.65,78l.25-.21a9,9,0,0,0,.1,2.46c-3.7,4.13-2.62,4.86-10,6.38s-3.09,4.29-.22,5c3.48.87,11.53,2.1,17-5.52l-.22.87c1.46,1.16,1.36,8.35,1.56,13.48s.55,9.93,1.6,12.75,2.28,10.1,12,8C88.81,119.46,95,117,95.59,93.65"/><path class="cls-2" d="M117.17,79.2c-13.71,2.83-14.65-1.81-14.65-1.81C117,55.91,123,28.64,117.82,22,103.57,3.76,78.91,12.37,78.5,12.6l-.13,0a48.65,48.65,0,0,0-9.15-.95C63,11.57,58.31,13.29,54.74,16c0,0-44-18.12-41.95,22.8.44,8.7,12.48,65.86,26.84,48.6C44.88,81.08,50,75.75,50,75.75A13.39,13.39,0,0,0,58.65,78l.25-.21A9.41,9.41,0,0,0,59,80.22c-3.7,4.13-2.61,4.86-10,6.38s-3.08,4.29-.21,5c3.48.87,11.53,2.1,17-5.52l-.22.87c1.45,1.16,2.47,7.56,2.3,13.35s-.28,9.77.86,12.88,2.28,10.1,12,8C88.81,119.46,93,115,93.6,107.42,94,102.07,95,102.87,95,98.08l.75-2.26c.87-7.26.14-9.6,5.15-8.51l1.21.11a27.6,27.6,0,0,0,11.34-1.91c6.09-2.83,9.71-7.55,3.7-6.31Z"/><path class="cls-3" d="M66.33,83.36c-.38,13.5.09,27.09,1.41,30.39s4.15,9.73,13.88,7.64c8.12-1.74,11.08-5.11,12.36-12.55.94-5.47,2.77-20.67,3-23.79"/><path class="cls-3" d="M54.67,15.7s-44-18-42,22.93c.44,8.7,12.48,65.87,26.84,48.6,5.25-6.32,10-11.27,10-11.27"/><path class="cls-3" d="M78.45,12.42c-1.52.47,24.49-9.51,39.28,9.38,5.22,6.67-.83,33.94-15.31,55.42"/><path class="cls-4" d="M102.42,77.22s.94,4.64,14.65,1.81c6-1.24,2.4,3.48-3.7,6.31-5,2.32-16.21,2.92-16.39-.29-.47-8.27,5.9-5.76,5.44-7.83-.42-1.87-3.26-3.7-5.15-8.27-1.64-4-22.57-34.58,5.8-30,1-.22-7.4-27-33.95-27.42S43.45,44.14,43.45,44.14"/><path class="cls-3" d="M58.9,80.05c-3.7,4.13-2.61,4.86-10,6.38s-3.09,4.29-.22,5c3.48.87,11.53,2.1,17-5.52,1.66-2.32,0-6-2.28-7-1.1-.46-2.57-1-4.46,1.09Z"/><path class="cls-3" d="M58.66,80c-.38-2.44.79-5.33,2.05-8.71C62.6,66.19,67,61.11,63.47,45c-2.6-12-20-2.5-20-.87a81.48,81.48,0,0,1-.29,16c-1.41,10.06,6.4,18.57,15.39,17.7"/><path class="cls-5" d="M54.51,43.9c-.08.55,1,2,2.45,2.23a2.62,2.62,0,0,0,2.72-1.51c.08-.56-1-1.17-2.44-1.37s-2.65.09-2.73.65Z"/><path class="cls-6" d="M98,42.76c.07.56-1,2-2.45,2.24a2.64,2.64,0,0,1-2.73-1.52c-.07-.55,1-1.16,2.45-1.36s2.65.09,2.73.64Z"/><path class="cls-3" d="M103.07,38.92c.24,4.36-.94,7.33-1.08,12-.22,6.74,3.21,14.46-2,22.19"/></g><path class="cls-7" d="M154.72,28.15h5.16v4.16A12.84,12.84,0,0,1,163.35,29a11.17,11.17,0,0,1,6.28-1.76,11.84,11.84,0,0,1,9.08,4.09c2.48,2.72,3.73,6.62,3.73,11.67q0,10.26-5.38,14.65a12.2,12.2,0,0,1-7.95,2.79,10.78,10.78,0,0,1-6-1.56,13.55,13.55,0,0,1-3.14-3v16h-5.28Zm19.84,24.6Q177,49.65,177,43.5a17,17,0,0,0-1.09-6.44,7.51,7.51,0,0,0-7.53-5.19q-5.49,0-7.52,5.48a21.49,21.49,0,0,0-1.09,7.44A15.64,15.64,0,0,0,160.88,51a8,8,0,0,0,13.68,1.78Z"/><path class="cls-7" d="M206,29.26a14.6,14.6,0,0,1,3,3V28.3h4.86V56.83c0,4-.58,7.13-1.75,9.44q-3.27,6.38-12.35,6.38a15.07,15.07,0,0,1-8.5-2.27,8.86,8.86,0,0,1-3.85-7.1h5.36a6,6,0,0,0,1.52,3.25q1.77,1.75,5.59,1.76,6,0,7.9-4.28,1.1-2.52,1-9a10.39,10.39,0,0,1-3.8,3.57,13.56,13.56,0,0,1-14.75-2.45q-3.81-3.62-3.81-12,0-7.89,3.84-12.31a11.85,11.85,0,0,1,9.27-4.42A11.37,11.37,0,0,1,206,29.26Zm.64,5.66a7.61,7.61,0,0,0-6.09-2.81A7.52,7.52,0,0,0,193,37.32a20.56,20.56,0,0,0-1.08,7.3c0,3.53.72,6.22,2.14,8.07a6.93,6.93,0,0,0,5.76,2.77,8.09,8.09,0,0,0,8-5.13A16.72,16.72,0,0,0,209,43.56Q209,37.73,206.62,34.92Z"/><path class="cls-7" d="M235.16,16.34h6.58l15.62,43H251l-4.5-12.89H229.6l-4.67,12.89h-6Zm9.67,25.4-6.63-19-6.88,19Z"/><path class="cls-7" d="M279.16,29a14.3,14.3,0,0,1,3.18,3.08V16.2h5.07V59.38h-4.75V55a11.33,11.33,0,0,1-4.35,4.19,12.51,12.51,0,0,1-5.75,1.28,11.61,11.61,0,0,1-9-4.4q-3.82-4.41-3.83-11.74a20.35,20.35,0,0,1,3.49-11.88,11.41,11.41,0,0,1,10-5A11.15,11.15,0,0,1,279.16,29ZM267.39,52.5q2.13,3.39,6.82,3.39a7.17,7.17,0,0,0,6-3.14c1.56-2.1,2.35-5.12,2.35-9s-.81-6.9-2.42-8.81a7.56,7.56,0,0,0-6-2.85,7.88,7.88,0,0,0-6.43,3c-1.64,2-2.46,5-2.46,9A15.62,15.62,0,0,0,267.39,52.5Z"/><path class="cls-7" d="M295.29,28h5.21v4.46a17.4,17.4,0,0,1,3.4-3.37,10.24,10.24,0,0,1,5.92-1.79,9.34,9.34,0,0,1,6,1.85,9.61,9.61,0,0,1,2.34,3.1,11.37,11.37,0,0,1,4.13-3.73,11.52,11.52,0,0,1,5.33-1.22q6.33,0,8.62,4.57a15,15,0,0,1,1.23,6.62V59.38H332V3Line truncated
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 768 668"><defs><style>.cls-1{fill:#e9f8ff;opacity:0.9;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:url(#linear-gradient-3);}.cls-5{fill:url(#linear-gradient-4);}.cls-6{fill:url(#linear-gradient-5);}.cls-7{fill:url(#linear-gradient-6);}.cls-8{fill:url(#linear-gradient-7);}.cls-9{fill:url(#linear-gradient-8);}.cls-10{fill:url(#linear-gradient-9);}.cls-11{fill:url(#linear-gradient-10);}.cls-12{fill:url(#linear-gradient-11);}.cls-13{fill:url(#linear-gradient-12);}.cls-14{fill:url(#linear-gradient-13);}.cls-15{stroke:#000;stroke-width:5.11px;}.cls-16{fill:#336791;}.cls-17,.cls-18{fill:none;stroke-linecap:round;stroke-width:1.7px;}.cls-17,.cls-18,.cls-19,.cls-20{stroke:#fff;}.cls-17{stroke-linejoin:round;}.cls-18{stroke-linejoin:bevel;}.cls-19,.cls-20,.cls-21,.cls-23{fill:#fff;}.cls-19{stroke-width:0.57px;}.cls-20{stroke-width:0.29px;}.cls-21{font-size:35px;}.cls-21,.cls-23{font-family:Helvetica-Light, Helvetica;font-weight:300;}.cls-22{font-family:Helvetica-Bold, Helvetica;font-weight:700;}.cls-23{font-size:16px;}</style><linearGradient id="linear-gradient" x1="206.44" y1="286.69" x2="130.27" y2="158.12" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4a519d"/><stop offset="1" stop-color="#643e99"/></linearGradient><linearGradient id="linear-gradient-2" x1="507.22" y1="289.91" x2="430.57" y2="160.52" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-3" x1="505.78" y1="463.51" x2="655.22" y2="463.51" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#5a96bd"/><stop offset="1" stop-color="#5997bd"/></linearGradient><linearGradient id="linear-gradient-4" x1="282.24" y1="332.89" x2="360.13" y2="204.7" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#47539d"/><stop offset="1" stop-color="#534b9b"/></linearGradient><linearGradient id="linear-gradient-5" x1="285.87" y1="154.1" x2="210.32" y2="283.03" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#7c5da9"/><stop offset="1" stop-color="#686cac"/></linearGradient><linearGradient id="linear-gradient-6" x1="733.76" y1="142.12" x2="658.21" y2="271.05" gradientTransform="translate(1310.01 397) rotate(180)" xlink:href="#linear-gradient-5"/><linearGradient id="linear-gradient-7" x1="655.22" y1="345.3" x2="710.53" y2="345.3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4e5ea3"/><stop offset="1" stop-color="#4e5ea3"/></linearGradient><linearGradient id="linear-gradient-8" x1="91.81" y1="377.04" x2="147.13" y2="377.04" xlink:href="#linear-gradient-7"/><linearGradient id="linear-gradient-9" x1="206.9" y1="377.04" x2="356.34" y2="377.04" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3e6ba6"/><stop offset="1" stop-color="#3d6ba6"/></linearGradient><linearGradient id="linear-gradient-10" x1="356.34" y1="377.04" x2="505.78" y2="377.04" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4773ab"/><stop offset="1" stop-color="#4a71ab"/></linearGradient><linearGradient id="linear-gradient-11" x1="505.78" y1="377.04" x2="655.22" y2="377.04" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#396ea7"/><stop offset="1" stop-color="#3e6aa6"/></linearGradient><linearGradient id="linear-gradient-12" x1="356.34" y1="290.76" x2="505.78" y2="290.76" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#535ba3"/><stop offset="1" stop-color="#535ca3"/></linearGradient><linearGradient id="linear-gradient-13" x1="356.34" y1="463.32" x2="505.78" y2="463.32" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1a73a6"/><stop offset="1" stop-color="#1e71a5"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><rect class="cls-1" width="768" height="668" rx="10"/></g><g id="Layer_1" data-name="Layer 1"><polygon class="cls-2" points="206.9 204.49 206.9 290.76 132.19 247.63 57.47 204.49 132.19 161.35 206.9 118.21 206.9 204.49"/><polygon class="cls-3" points="505.78 204.49 505.78 290.76 431.06 247.63 356.34 204.49 431.06 161.35 505.78 118.21 505.78 204.49"/><polygon class="cls-4" points="655.22 463.51 655.22 549.79 580.5 506.65 505.78 463.51 580.5 420.37 655.22 377.24 655.22 463.51"/><polygon class="cls-5" points="356.34 290.76 356.34 377.04 281.62 333.9 206.9 290.76 281.62 247.63 356.34 204.49 356.34 290.76"/><polygon class="cls-6" points="206.9 204.49 206.9 118.21 281.62 161.35 356.34 204.49 281.62 247.63 206.9 290.76 206.9 204.49"/><polygon class="cls-7" points="655.22 204.49 655.22 290.76 580.5 247.63 505.78 204.49 580.5 161.35 655.22 118.21 655.22 204.49"/><polygon class="cls-8" points="655.22 345.3 655.22 313.36 682.88 329.33 710.53 345.3 682.88 361.27 655.22 377.24 655.22 345.3"/><polygon class="cls-9" points="91.81 377.04 91.81 345.11 119.47 361.08 147.13 377.04 119.47 393.01 91.81 408.98 91.81 377.04"/><polygon class="cls-10" points="206.9 377.04 206.9 290.76 281.62 333.9 356.34 377.04 281.62 420.18 206.9 463.32 206.9 377.04"/><pLine truncated
|
||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 8.0 KiB |
@@ -5,11 +5,11 @@
|
||||
"repository": "https://github.com/postgres/pgadmin4.git",
|
||||
"author": "pgAdmin Development Team (https://www.pgadmin.org/)",
|
||||
"license": "PostgreSQL",
|
||||
"chromium-args": "--disable-popup-blocking",
|
||||
"chromium-args": "--disable-popup-blocking --disable-gpu",
|
||||
"user-agent": "Nwjs:%nwver-%osinfo-%chromium_ver",
|
||||
"window": {
|
||||
"width": 440,
|
||||
"height": 170,
|
||||
"width": 750,
|
||||
"height": 600,
|
||||
"toolbar": false,
|
||||
"fullscreen": false,
|
||||
"frame": false,
|
||||
@@ -24,7 +24,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^6.3.0",
|
||||
"nw": "^0.59.0"
|
||||
"nw": "0.61.0"
|
||||
},
|
||||
"scripts": {
|
||||
"linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js ."
|
||||
|
||||
@@ -54,6 +54,22 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card shadow-sm mt-3">
|
||||
<div class="card-header h6">Open Documentation</div>
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<label> By checking this option, all documentation links will open in the default browser instead of in a new window.
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<div class="form-check mr-3">
|
||||
<label class="form-check-label mr-2" for="fixedPortCheck">Open Documentation in Default Browser?</label>
|
||||
<input type="checkbox" class="form-check-input" id="openDocsInBrowser"
|
||||
data-name="open_docs_in_browser"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-2 d-flex fixed-bottom shadow bg-white">
|
||||
<div class="mr-auto" id="status-text"></div>
|
||||
<div class="ml-auto">
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
font-size: 14px;
|
||||
margin: 0 10px;
|
||||
background-color: #fff;
|
||||
background-color: #e9f8ff;
|
||||
}
|
||||
|
||||
.bg {
|
||||
|
||||
@@ -35,6 +35,7 @@ function saveConfiguration() {
|
||||
misc.ConfigureStore.set('fixedPort', document.getElementById('fixedPortCheck').checked);
|
||||
misc.ConfigureStore.set('portNo', parseInt(document.getElementById('portNo').value));
|
||||
misc.ConfigureStore.set('connectionTimeout', parseInt(document.getElementById('timeOut').value));
|
||||
misc.ConfigureStore.set('openDocsInBrowser', document.getElementById('openDocsInBrowser').checked);
|
||||
|
||||
misc.ConfigureStore.saveConfig();
|
||||
|
||||
@@ -61,8 +62,9 @@ function enableDisableSaveButton() {
|
||||
let configData = misc.ConfigureStore.getConfigData();
|
||||
|
||||
if (configData['fixedPort'] !== document.getElementById('fixedPortCheck').checked ||
|
||||
configData['portNo'] !== document.getElementById('portNo').value ||
|
||||
configData['connectionTimeout'] !== document.getElementById('timeOut').value) {
|
||||
configData['portNo'] != document.getElementById('portNo').value ||
|
||||
configData['connectionTimeout'] != document.getElementById('timeOut').value ||
|
||||
configData['openDocsInBrowser'] !== document.getElementById('openDocsInBrowser').checked) {
|
||||
document.getElementById('btnSave').removeAttribute('disabled');
|
||||
} else {
|
||||
document.getElementById('btnSave').setAttribute('disabled', 'disabled');
|
||||
@@ -85,9 +87,15 @@ configWindow.on('loaded', function() {
|
||||
document.getElementById('portNo').value = configData['portNo'];
|
||||
document.getElementById('timeOut').value = configData['connectionTimeout'];
|
||||
|
||||
if (configData['openDocsInBrowser']) {
|
||||
document.getElementById('openDocsInBrowser').checked = true;
|
||||
} else {
|
||||
document.getElementById('openDocsInBrowser').checked = false;
|
||||
}
|
||||
// Add event listeners
|
||||
document.getElementById('btnSave').addEventListener('click', checkConfiguration);
|
||||
document.getElementById('fixedPortCheck').addEventListener('change', onCheckChange);
|
||||
document.getElementById('portNo').addEventListener('change', enableDisableSaveButton);
|
||||
document.getElementById('timeOut').addEventListener('change', enableDisableSaveButton);
|
||||
document.getElementById('openDocsInBrowser').addEventListener('change', enableDisableSaveButton);
|
||||
});
|
||||
@@ -147,7 +147,7 @@ const getAvailablePort = (fixedPort) => {
|
||||
const currentTime = (new Date()).getTime();
|
||||
const serverLogFile = path.join(getLocalAppDataPath(), 'pgadmin4.' + currentTime.toString() + '.log');
|
||||
const configFileName = path.join(getAppDataPath(), 'runtime_config.json');
|
||||
const DEFAULT_CONFIG_DATA = {'fixedPort': false, 'portNo': 5050, 'connectionTimeout': 90, 'zoomLevel': 0};
|
||||
const DEFAULT_CONFIG_DATA = {'fixedPort': false, 'portNo': 5050, 'connectionTimeout': 90, 'zoomLevel': 0, 'openDocsInBrowser': true};
|
||||
|
||||
// This function is used to read the file and return the content
|
||||
const readServerLog = () => {
|
||||
@@ -293,8 +293,8 @@ const setZoomEvents = () => {
|
||||
// This function is used to iterate all open windows and set the zoom level.
|
||||
const setZoomLevelForAllWindows = () => {
|
||||
nw.Window.getAll(function(winArray) {
|
||||
for (var i = 0; i < winArray.length; i++) {
|
||||
winArray[i].zoomLevel = pgAdminWindowObject.zoomLevel;
|
||||
for (let arr_val of winArray) {
|
||||
arr_val.zoomLevel = pgAdminWindowObject.zoomLevel;
|
||||
}
|
||||
})
|
||||
};
|
||||
@@ -336,9 +336,9 @@ const toggleFullScreen = () => {
|
||||
|
||||
// Change the menu label.
|
||||
var menu_label = pgAdminWindowObject.window.document.querySelector('#mnu_toggle_fullscreen_runtime span').innerHTML;
|
||||
if (menu_label.indexOf('Enter Full Screen') > 0) {
|
||||
if (menu_label.indexOf('Enter Full Screen') >= 0) {
|
||||
pgAdminWindowObject.window.document.querySelector('#mnu_toggle_fullscreen_runtime span').innerHTML = menu_label.replace('Enter', 'Exit');
|
||||
} else if (menu_label.indexOf('Exit Full Screen') > 0) {
|
||||
} else if (menu_label.indexOf('Exit Full Screen') >= 0) {
|
||||
pgAdminWindowObject.window.document.querySelector('#mnu_toggle_fullscreen_runtime span').innerHTML = menu_label.replace('Exit', 'Enter');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ let serverCheckUrl = null;
|
||||
|
||||
let serverPort = 5050;
|
||||
|
||||
let docsURLSubStrings = ['www.enterprisedb.com', 'www.postgresql.org', 'www.pgadmin.org', 'help/help'];
|
||||
|
||||
// Paths to the rest of the app
|
||||
let pythonPath = misc.getPythonPath();
|
||||
let pgadminFile = '../web/pgAdmin4.py';
|
||||
@@ -101,7 +103,7 @@ function startDesktopMode() {
|
||||
nw.Window.open('src/html/configure.html', {
|
||||
'frame': true,
|
||||
'width': 600,
|
||||
'height': 420,
|
||||
'height': 585,
|
||||
'position': 'center',
|
||||
'resizable': false,
|
||||
'focus': true,
|
||||
@@ -231,6 +233,20 @@ function launchPgAdminWindow() {
|
||||
// Set the width and height for the new window.
|
||||
pgadminWindow.on('new-win-policy', function(frame, url, policy) {
|
||||
if(!frame) {
|
||||
let openDocsInBrowser = misc.ConfigureStore.get('openDocsInBrowser', true);
|
||||
let isDocURL = false;
|
||||
docsURLSubStrings.forEach(function(key) {
|
||||
if(url.indexOf(key) >= 0) {
|
||||
isDocURL = true;
|
||||
}
|
||||
});
|
||||
|
||||
if (openDocsInBrowser && isDocURL) {
|
||||
// Do not open the window
|
||||
policy.ignore();
|
||||
// Open URL in the external browser.
|
||||
nw.Shell.openExternal(url);
|
||||
} else {
|
||||
policy.setNewWindowManifest({
|
||||
'icon': '../../assets/pgAdmin4.png',
|
||||
'frame': true,
|
||||
@@ -240,6 +256,7 @@ function launchPgAdminWindow() {
|
||||
'width': pgadminWindow.width,
|
||||
'height': pgadminWindow.height,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1008,10 +1008,10 @@ number-is-nan@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
||||
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
|
||||
|
||||
nw@^0.59.0:
|
||||
version "0.59.0"
|
||||
resolved "https://registry.yarnpkg.com/nw/-/nw-0.59.0.tgz#c7eff1622c917834b2b31581ba5c386816d98db1"
|
||||
integrity sha512-cLGZgP+u+nDfgT956Z7timXuyQN8OOi5Ele6OF3yVEkk6CNiMC6m2rblb5aB8y4QNwLf6O+tkt64XxSUPxvutQ==
|
||||
nw@0.61.0:
|
||||
version "0.61.0"
|
||||
resolved "https://registry.yarnpkg.com/nw/-/nw-0.61.0.tgz#c35e80be4ad7a5570659796d66bdc16d11e0e890"
|
||||
integrity sha512-SazcPW9+kplf7/K2KuTaamOFGtKnnH4Gs/cHHRMf9luTkCGe2cFsnb6/fEP5xvu9tpoW9Z/oUKzj9lZ6kylFWQ==
|
||||
dependencies:
|
||||
chalk "~1.1.3"
|
||||
decompress "^4.2.0"
|
||||
|
||||
@@ -43,7 +43,7 @@ APP_ICON = 'pg-icon'
|
||||
|
||||
# Application version number components
|
||||
APP_RELEASE = 6
|
||||
APP_REVISION = 4
|
||||
APP_REVISION = 7
|
||||
|
||||
# Application version suffix, e.g. 'beta1', 'dev'. Usually an empty string
|
||||
# for GA releases.
|
||||
@@ -52,7 +52,7 @@ APP_SUFFIX = ''
|
||||
# Numeric application version for upgrade checks. Should be in the format:
|
||||
# [X]XYYZZ, where X is the release version, Y is the revision, with a leading
|
||||
# zero if needed, and Z represents the suffix, with a leading zero if needed
|
||||
APP_VERSION_INT = 60400
|
||||
APP_VERSION_INT = 60700
|
||||
|
||||
# DO NOT CHANGE!
|
||||
# The application version string, constructed from the components
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
"""Added server id for cloud deployment
|
||||
|
||||
Revision ID: 1586db67b98e
|
||||
Revises: 15c88f765bc8
|
||||
Create Date: 2022-01-04 13:08:05.484598
|
||||
|
||||
"""
|
||||
from pgadmin.model import db
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '1586db67b98e'
|
||||
down_revision = '15c88f765bc8'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
db.engine.execute(
|
||||
'ALTER TABLE process ADD COLUMN server_id INTEGER DEFAULT 0'
|
||||
)
|
||||
db.engine.execute(
|
||||
'ALTER TABLE server ADD COLUMN cloud_status INTEGER DEFAULT 0'
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
# pgAdmin only upgrades, downgrade not implemented.
|
||||
pass
|
||||
@@ -11,6 +11,7 @@
|
||||
"@babel/eslint-parser": "^7.12.13",
|
||||
"@babel/eslint-plugin": "^7.12.13",
|
||||
"@babel/plugin-proposal-object-rest-spread": "^7.10.1",
|
||||
"@babel/plugin-syntax-jsx": "^7.16.0",
|
||||
"@babel/preset-env": "^7.10.2",
|
||||
"@babel/preset-typescript": "^7.8.3",
|
||||
"@emotion/core": "^10.0.14",
|
||||
@@ -18,6 +19,7 @@
|
||||
"@emotion/react": "^11.1.5",
|
||||
"@emotion/styled": "^10.0.14",
|
||||
"@emotion/utils": "^1.0.0",
|
||||
"@svgr/webpack": "^5.5.0",
|
||||
"@wojtekmaj/enzyme-adapter-react-17": "^0.4.1",
|
||||
"autoprefixer": "^10.2.4",
|
||||
"axios-mock-adapter": "^1.17.0",
|
||||
@@ -40,9 +42,10 @@
|
||||
"imagemin-pngquant": "^9.0.1",
|
||||
"imagemin-svgo": "^8.0.0",
|
||||
"is-docker": "^2.1.1",
|
||||
"istanbul-instrumenter-loader": "^3.0.1",
|
||||
"jasmine-core": "^3.6.0",
|
||||
"jasmine-enzyme": "^7.1.2",
|
||||
"karma": "^6.3.2",
|
||||
"karma": "^6.3.15",
|
||||
"karma-babel-preprocessor": "^8.0.0",
|
||||
"karma-browserify": "^8.0.0",
|
||||
"karma-chrome-launcher": "^3.1.0",
|
||||
@@ -63,7 +66,7 @@
|
||||
"sass-resources-loader": "^2.2.1",
|
||||
"style-loader": "^2.0.0",
|
||||
"stylis": "^4.0.7",
|
||||
"svgo": "^1.1.1",
|
||||
"svgo": "^2.7.0",
|
||||
"svgo-loader": "^2.2.0",
|
||||
"terser-webpack-plugin": "^5.1.1",
|
||||
"typescript": "^3.2.2",
|
||||
@@ -86,11 +89,13 @@
|
||||
"@material-ui/pickers": "^3.2.10",
|
||||
"@projectstorm/react-diagrams": "^6.6.1",
|
||||
"@simonwep/pickr": "^1.5.1",
|
||||
"@szhsin/react-menu": "^2.2.0",
|
||||
"@tippyjs/react": "^4.2.0",
|
||||
"@types/classnames": "^2.2.6",
|
||||
"@types/react": "^16.7.18",
|
||||
"@types/react-dom": "^16.0.11",
|
||||
"acitree": "git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7",
|
||||
"ajv": "^8.8.2",
|
||||
"alertifyjs": "git+https://github.com/EnterpriseDB/AlertifyJS/#72c1d794f5b6d4ec13a68d123c08f19021afe263",
|
||||
"aspen-decorations": "^1.0.2",
|
||||
"axios": "^0.21.1",
|
||||
@@ -103,12 +108,14 @@
|
||||
"bootstrap": "^4.3.1",
|
||||
"bootstrap-datepicker": "^1.8.0",
|
||||
"bootstrap4-toggle": "^3.6.1",
|
||||
"brace": "^0.11.1",
|
||||
"browserfs": "^1.4.3",
|
||||
"chart.js": "^2.9.3",
|
||||
"classnames": "^2.2.6",
|
||||
"closest": "^0.0.1",
|
||||
"codemirror": "^5.59.2",
|
||||
"context-menu": "^2.0.0",
|
||||
"copy-to-clipboard": "^3.3.1",
|
||||
"css-loader": "^5.0.1",
|
||||
"cssnano": "^5.0.2",
|
||||
"dagre": "^0.8.4",
|
||||
@@ -120,12 +127,12 @@
|
||||
"imports-loader": "^2.0.0",
|
||||
"insert-if": "^1.1.0",
|
||||
"ip-address": "^7.1.0",
|
||||
"istanbul-instrumenter-loader": "^3.0.1",
|
||||
"jquery": "^3.6.0",
|
||||
"jquery-contextmenu": "^2.9.2",
|
||||
"jquery-ui": "^1.13.0",
|
||||
"json-bignumber": "^1.0.1",
|
||||
"jsoneditor": "^9.5.4",
|
||||
"jsoneditor-react": "^3.1.1",
|
||||
"karma-coverage": "^2.0.3",
|
||||
"leaflet": "^1.5.1",
|
||||
"lodash": "4.*",
|
||||
@@ -138,9 +145,10 @@
|
||||
"path-fx": "^2.0.0",
|
||||
"pathfinding": "^0.4.18",
|
||||
"paths-js": "^0.4.9",
|
||||
"pgadmin4-tree": "git+https://github.com/EnterpriseDB/pgadmin4-treeview/#90e62d4371d3d25a957b3ffc7c6cb81a928da06f",
|
||||
"pgadmin4-tree": "git+https://github.com/EnterpriseDB/pgadmin4-treeview/#bf7ac7be65898883e3e05c9733426152a1da6422",
|
||||
"postcss": "^8.2.15",
|
||||
"raf": "^3.4.1",
|
||||
"rc-dock": "^3.2.9",
|
||||
"react": "^17.0.1",
|
||||
"react-aspen": "^1.1.0",
|
||||
"react-checkbox-tree": "^1.7.2",
|
||||
@@ -148,6 +156,7 @@
|
||||
"react-draggable": "^4.4.4",
|
||||
"react-select": "^4.2.1",
|
||||
"react-table": "^7.6.3",
|
||||
"react-timer-hook": "^3.0.5",
|
||||
"react-virtualized-auto-sizer": "^1.0.6",
|
||||
"react-window": "^1.8.5",
|
||||
"select2": "^4.0.13",
|
||||
@@ -163,7 +172,7 @@
|
||||
"underscore": "^1.13.1",
|
||||
"url-loader": "^1.1.2",
|
||||
"valid-filename": "^2.0.1",
|
||||
"webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#5a5a1c96b89e965cb4900520ca7d5740e6a53afa",
|
||||
"webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#40d025e0d86ee3cf058a52e01d2042113f134cdd",
|
||||
"wkx": "^0.5.0",
|
||||
"xterm": "^4.11.0",
|
||||
"xterm-addon-fit": "^0.5.0",
|
||||
@@ -177,7 +186,7 @@
|
||||
"bundle:watch": "yarn run linter && yarn run webpacker:watch",
|
||||
"bundle:dev": "yarn run linter && yarn run webpacker",
|
||||
"bundle:analyze": "cross-env NODE_ENV=production ANALYZE=true yarn run bundle:dev",
|
||||
"bundle": "cross-env NODE_ENV=production yarn run bundle:dev",
|
||||
"bundle": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 yarn run bundle:dev",
|
||||
"test:karma-once": "yarn run linter && yarn run karma start --single-run",
|
||||
"test:karma": "yarn run linter && yarn run karma start",
|
||||
"test:karma-coverage": "yarn run test:karma-once --reporters coverage,progress",
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
import argparse
|
||||
import os
|
||||
|
||||
|
||||
def load_providers():
|
||||
""" Loads all the providers """
|
||||
providers = {}
|
||||
|
||||
path = os.path.dirname(os.path.realpath(__file__))
|
||||
modules = os.listdir(path + '/providers')
|
||||
|
||||
for filename in modules:
|
||||
filename = path + '/providers/' + filename
|
||||
|
||||
if os.path.isfile(filename):
|
||||
basename = os.path.basename(filename)
|
||||
base, extension = os.path.splitext(basename)
|
||||
|
||||
if extension == ".py" and not basename.startswith("_"):
|
||||
module = __import__("providers." + basename[:-3],
|
||||
fromlist=["providers"])
|
||||
provider = module.load()
|
||||
providers[basename[:-3]] = provider
|
||||
|
||||
return providers
|
||||
|
||||
|
||||
def get_args(providers):
|
||||
""" Creates the parsers and returns the args """
|
||||
# Create the top-level parser
|
||||
parser = argparse.ArgumentParser(prog='pgacloud.py')
|
||||
parser.add_argument('--debug', action=argparse.BooleanOptionalAction,
|
||||
default=True, help='send debug messages to stderr')
|
||||
|
||||
# Create the provider sub-parser
|
||||
parsers = parser.add_subparsers(help='provider help', dest='provider')
|
||||
|
||||
# Load the provider parsers
|
||||
for provider in providers:
|
||||
providers[provider].init_args(parsers)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
return parser, args
|
||||
|
||||
|
||||
def execute_command(providers, parser, args):
|
||||
""" Executes the command in the provider """
|
||||
|
||||
# Switch - for _ in command names. We use - in the CLI syntax for ease of
|
||||
# use, but we need an _ in Python function names
|
||||
if 'command' in args and args.command is not None:
|
||||
args.command = args.command.replace('-', '_')
|
||||
|
||||
# Figure out what provider the command was for (if any) and call the
|
||||
# relevant function. If we don't get a match, print the help
|
||||
if args.provider in providers and \
|
||||
'command' in args and \
|
||||
args.command is not None:
|
||||
command = providers[args.provider].commands()[args.command]
|
||||
command(args)
|
||||
else:
|
||||
# If no provider has been given, display the top level help,
|
||||
# otherwise, call the help() method in the provider
|
||||
if args.provider is None:
|
||||
parser.print_help()
|
||||
else:
|
||||
command = providers[args.provider].commands()['help']
|
||||
command()
|
||||
|
||||
|
||||
def main():
|
||||
""" Entry point """
|
||||
# Load the providers
|
||||
providers = load_providers()
|
||||
|
||||
# Get the args
|
||||
parser, args = get_args(providers)
|
||||
|
||||
# Execute the command
|
||||
execute_command(providers, parser, args)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,31 @@
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
class AbsProvider:
|
||||
""" Abstract provider """
|
||||
parser = None
|
||||
|
||||
def init_args(self, parsers):
|
||||
"""Not Required."""
|
||||
pass
|
||||
|
||||
def commands(self):
|
||||
""" Get the list of commands for the current provider. """
|
||||
attrs = filter(lambda attr: attr.startswith('cmd_'), dir(self))
|
||||
commands = {}
|
||||
|
||||
for attr in attrs:
|
||||
method = getattr(self, attr)
|
||||
commands[attr[4:]] = method
|
||||
|
||||
return commands
|
||||
|
||||
def cmd_help(self):
|
||||
""" Prints the provider level help """
|
||||
self.parser.print_help()
|
||||
@@ -0,0 +1,319 @@
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
""" Amazon RDS PostgreSQL provider """
|
||||
|
||||
import os
|
||||
import time
|
||||
import boto3
|
||||
|
||||
from providers._abstract import AbsProvider
|
||||
from utils.io import debug, error, output
|
||||
from utils.misc import get_my_ip, get_random_id
|
||||
|
||||
DEL_SEC_GROUP_MSG = 'Deleting security group: {}...'
|
||||
|
||||
|
||||
class RdsProvider(AbsProvider):
|
||||
def __init__(self):
|
||||
self._clients = {}
|
||||
self._access_key = None
|
||||
self._secret_key = None
|
||||
self._session_token = None
|
||||
self._database_pass = None
|
||||
self._default_region = None
|
||||
|
||||
# Get the credentials
|
||||
if 'AWS_ACCESS_KEY_ID' in os.environ:
|
||||
self._access_key = os.environ['AWS_ACCESS_KEY_ID']
|
||||
|
||||
if 'AWS_SECRET_ACCESS_KEY' in os.environ:
|
||||
self._secret_key = os.environ['AWS_SECRET_ACCESS_KEY']
|
||||
|
||||
if 'AWS_SESSION_TOKEN' in os.environ:
|
||||
self._session_token = os.environ['AWS_SESSION_TOKEN']
|
||||
|
||||
if 'AWS_DATABASE_PASSWORD' in os.environ:
|
||||
self._database_pass = os.environ['AWS_DATABASE_PASSWORD']
|
||||
|
||||
def init_args(self, parsers):
|
||||
""" Create the command line parser for this provider """
|
||||
self.parser = parsers.add_parser('rds',
|
||||
help='Amazon AWS RDS PostgreSQL',
|
||||
epilog='Credentials are read from '
|
||||
'~/.aws/config by default and '
|
||||
'can be overridden in the '
|
||||
'AWS_ACCESS_KEY_ID and '
|
||||
'AWS_SECRET_ACCESS_KEY '
|
||||
'environment variables. '
|
||||
'The default region is read '
|
||||
'from ~/.aws/config and will '
|
||||
'fall back to us-east-1 if '
|
||||
'not present.')
|
||||
self.parser.add_argument('--region', default=self._default_region,
|
||||
help='name of the AWS region (default: {})'
|
||||
.format(self._default_region))
|
||||
|
||||
# Create the command sub-parser
|
||||
parsers = self.parser.add_subparsers(help='RDS commands',
|
||||
dest='command')
|
||||
|
||||
# Create the create instance command parser
|
||||
parser_create_instance = parsers.add_parser('create-instance',
|
||||
help='create a new '
|
||||
'instance')
|
||||
parser_create_instance.add_argument('--name', required=True,
|
||||
help='name of the instance')
|
||||
parser_create_instance.add_argument('--db-name', default='postgres',
|
||||
help='name of the default '
|
||||
'database '
|
||||
'(default: postgres)')
|
||||
parser_create_instance.add_argument('--db-password', required=False,
|
||||
help='password for the database')
|
||||
parser_create_instance.add_argument('--db-username',
|
||||
default='postgres',
|
||||
help='user name for the database '
|
||||
'(default: postgres)')
|
||||
parser_create_instance.add_argument('--db-port', type=int,
|
||||
default=5432,
|
||||
help='port of the database '
|
||||
'(default: 5432)')
|
||||
parser_create_instance.add_argument('--db-version',
|
||||
default='13.3',
|
||||
help='version of PostgreSQL '
|
||||
'to deploy (default: 13.3)')
|
||||
parser_create_instance.add_argument('--instance-type', required=True,
|
||||
help='machine type for the '
|
||||
'instance nodes, e.g. '
|
||||
'db.m3.large')
|
||||
parser_create_instance.add_argument('--storage-iops', type=int,
|
||||
default=0,
|
||||
help='storage IOPs to allocate '
|
||||
'(default: 0)')
|
||||
parser_create_instance.add_argument('--storage-size', type=int,
|
||||
required=True,
|
||||
help='storage size in GB')
|
||||
parser_create_instance.add_argument('--storage-type', default='gp2',
|
||||
help='storage type for the data '
|
||||
'database (default: gp2)')
|
||||
parser_create_instance.add_argument('--public-ip', default='127.0.0.1',
|
||||
help='Public IP '
|
||||
'(default: 127.0.0.1)')
|
||||
|
||||
# Create the delete instance command parser
|
||||
parser_delete_instance = parsers.add_parser('delete-instance',
|
||||
help='delete an instance')
|
||||
parser_delete_instance.add_argument('--name', required=True,
|
||||
help='name of the instance')
|
||||
parser_delete_instance.add_argument('--security-group',
|
||||
help='name of a security group to'
|
||||
'delete as well')
|
||||
|
||||
##########################################################################
|
||||
# AWS Helper functions
|
||||
##########################################################################
|
||||
def _get_aws_client(self, type, args):
|
||||
""" Create/cache/return an AWS client object """
|
||||
if type in self._clients:
|
||||
return self._clients[type]
|
||||
|
||||
session = boto3.Session(
|
||||
aws_access_key_id=self._access_key,
|
||||
aws_secret_access_key=self._secret_key,
|
||||
aws_session_token=self._session_token
|
||||
)
|
||||
|
||||
self._clients['type'] = session.client(type, region_name=args.region)
|
||||
|
||||
return self._clients['type']
|
||||
|
||||
def _create_security_group(self, args):
|
||||
""" Create a new security group for the instance """
|
||||
ec2 = self._get_aws_client('ec2', args)
|
||||
ip = args.public_ip if args.public_ip else get_my_ip()
|
||||
ip = ip.split(',')
|
||||
|
||||
# Deploy the security group
|
||||
try:
|
||||
name = 'pgacloud_{}_{}_{}'.format(args.name,
|
||||
ip[0].replace('.', '-'),
|
||||
get_random_id())
|
||||
debug(args, 'Creating security group: {}...'.format(name))
|
||||
output({'Creating': 'Creating security group: {}...'.format(name)})
|
||||
response = ec2.create_security_group(
|
||||
Description='Inbound access for {} to RDS instance {}'.format(
|
||||
ip[0], args.name),
|
||||
GroupName=name
|
||||
)
|
||||
except Exception as e:
|
||||
error(args, str(e))
|
||||
|
||||
return response['GroupId']
|
||||
|
||||
def _add_ingress_rule(self, args, security_group):
|
||||
""" Add a local -> PostgreSQL ingress rule to a security group """
|
||||
ec2 = self._get_aws_client('ec2', args)
|
||||
ip = args.public_ip if args.public_ip else\
|
||||
'{}/32'.format(get_my_ip())
|
||||
port = args.db_port or 5432
|
||||
IpRanges = []
|
||||
|
||||
ip = ip.split(',')
|
||||
for i in ip:
|
||||
IpRanges.append({
|
||||
'CidrIp': i,
|
||||
'Description': 'pgcloud client {}'.format(i)
|
||||
})
|
||||
try:
|
||||
output({'Adding': 'Adding ingress rule for: {}...'.format(ip)})
|
||||
debug(args,
|
||||
'Adding ingress rule for: {}...'.format(ip))
|
||||
ec2.authorize_security_group_ingress(
|
||||
GroupId=security_group,
|
||||
IpPermissions=[
|
||||
{
|
||||
'FromPort': port,
|
||||
'ToPort': port,
|
||||
'IpProtocol': 'tcp',
|
||||
'IpRanges': IpRanges
|
||||
},
|
||||
]
|
||||
)
|
||||
except Exception as e:
|
||||
error(args, e)
|
||||
|
||||
def _create_rds_instance(self, args, security_group):
|
||||
""" Create an RDS instance """
|
||||
ec2 = self._get_aws_client('ec2', args)
|
||||
rds = self._get_aws_client('rds', args)
|
||||
|
||||
db_password = self._database_pass if self._database_pass is not None\
|
||||
else args.db_password
|
||||
|
||||
try:
|
||||
debug(args, 'Creating RDS instance: {}...'.format(args.name))
|
||||
rds.create_db_instance(DBInstanceIdentifier=args.name,
|
||||
AllocatedStorage=args.storage_size,
|
||||
DBName=args.db_name,
|
||||
Engine='postgres',
|
||||
Port=args.db_port,
|
||||
EngineVersion=args.db_version,
|
||||
StorageType=args.storage_type,
|
||||
StorageEncrypted=True,
|
||||
Iops=args.storage_iops,
|
||||
AutoMinorVersionUpgrade=True,
|
||||
MultiAZ=False,
|
||||
MasterUsername=args.db_username,
|
||||
MasterUserPassword=db_password,
|
||||
DBInstanceClass=args.instance_type,
|
||||
VpcSecurityGroupIds=[
|
||||
security_group,
|
||||
])
|
||||
|
||||
except rds.exceptions.DBInstanceAlreadyExistsFault as e:
|
||||
try:
|
||||
debug(args, DEL_SEC_GROUP_MSG.format(security_group))
|
||||
ec2.delete_security_group(GroupId=security_group)
|
||||
except Exception:
|
||||
pass
|
||||
error(args, 'RDS instance {} already exists.'.format(args.name))
|
||||
except Exception as e:
|
||||
try:
|
||||
debug(args, DEL_SEC_GROUP_MSG.format(security_group))
|
||||
ec2.delete_security_group(GroupId=security_group)
|
||||
except Exception:
|
||||
pass
|
||||
error(args, str(e))
|
||||
|
||||
# Wait for completion
|
||||
running = True
|
||||
while running:
|
||||
response = rds.describe_db_instances(
|
||||
DBInstanceIdentifier=args.name)
|
||||
|
||||
db_instance = response['DBInstances'][0]
|
||||
status = db_instance['DBInstanceStatus']
|
||||
|
||||
if status != 'creating' and status != 'backing-up':
|
||||
running = False
|
||||
|
||||
if running:
|
||||
time.sleep(5)
|
||||
|
||||
return response['DBInstances']
|
||||
|
||||
def _delete_rds_instance(self, args, name):
|
||||
""" Delete an RDS instance """
|
||||
rds = self._get_aws_client('rds', args)
|
||||
|
||||
debug(args, 'Deleting RDS instance: {}...'.format(name))
|
||||
try:
|
||||
rds.delete_db_instance(
|
||||
DBInstanceIdentifier=name,
|
||||
SkipFinalSnapshot=True,
|
||||
DeleteAutomatedBackups=True
|
||||
)
|
||||
except Exception as e:
|
||||
error(args, str(e))
|
||||
|
||||
# Wait for completion
|
||||
while True:
|
||||
try:
|
||||
rds.describe_db_instances(DBInstanceIdentifier=args.name)
|
||||
except rds.exceptions.DBInstanceNotFoundFault:
|
||||
return
|
||||
except Exception as e:
|
||||
error(args, str(e))
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
def _delete_security_group(self, args, id):
|
||||
""" Delete a security group """
|
||||
ec2 = self._get_aws_client('ec2', args)
|
||||
|
||||
debug(args, 'Deleting security group: {}...'.format(id))
|
||||
try:
|
||||
ec2.delete_security_group(
|
||||
GroupId=id
|
||||
)
|
||||
except Exception as e:
|
||||
error(args, str(e))
|
||||
|
||||
##########################################################################
|
||||
# User commands
|
||||
##########################################################################
|
||||
def cmd_create_instance(self, args):
|
||||
""" Create an RDS instance and security group """
|
||||
security_group = self._create_security_group(args)
|
||||
self._add_ingress_rule(args, security_group)
|
||||
instance = self._create_rds_instance(args, security_group)
|
||||
|
||||
data = {'instance': {
|
||||
'Id': instance[0]['DBInstanceIdentifier'],
|
||||
'Location': instance[0]['AvailabilityZone'],
|
||||
'SecurityGroupId': security_group,
|
||||
'Hostname': instance[0]['Endpoint']['Address'],
|
||||
'Port': instance[0]['Endpoint']['Port'],
|
||||
'Database': instance[0]['DBName'],
|
||||
'Username': instance[0]['MasterUsername']
|
||||
}}
|
||||
|
||||
output(data)
|
||||
|
||||
def cmd_delete_instance(self, args):
|
||||
""" Delete an RDS instance and (optionally) a security group """
|
||||
self._delete_rds_instance(args, args.name)
|
||||
|
||||
if args.security_group is not None:
|
||||
self._delete_security_group(args, args.security_group)
|
||||
|
||||
|
||||
def load():
|
||||
""" Loads the current provider """
|
||||
return RdsProvider()
|
||||
@@ -0,0 +1,38 @@
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
def debug(args, message):
|
||||
""" Print a debug message """
|
||||
if not args.debug:
|
||||
return
|
||||
|
||||
now = datetime.datetime.now()
|
||||
|
||||
print('[{}]: {}'.format(now.strftime("%H:%M:%S"), message),
|
||||
file=sys.stderr, flush=True)
|
||||
|
||||
|
||||
def error(args, message):
|
||||
""" Print an error message and exit """
|
||||
debug(args, message)
|
||||
|
||||
output({'error': message})
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def output(data):
|
||||
""" Dump JSON output from a dict """
|
||||
print(json.dumps(data), flush=True)
|
||||
@@ -0,0 +1,42 @@
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2022, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
import random
|
||||
import string
|
||||
import urllib3
|
||||
import ipaddress
|
||||
|
||||
|
||||
def get_my_ip():
|
||||
""" Return the public IP of this host """
|
||||
http = urllib3.PoolManager()
|
||||
try:
|
||||
external_ip = http.request('GET', 'https://ident.me').data
|
||||
except Exception:
|
||||
try:
|
||||
external_ip = http.request('GET', 'https://ifconfig.me/ip').data
|
||||
except Exception:
|
||||
external_ip = '127.0.0.1'
|
||||
|
||||
if type(external_ip) == bytes:
|
||||
external_ip = external_ip.decode('utf-8')
|
||||
|
||||
ip = ipaddress.ip_address(external_ip)
|
||||
if isinstance(ip, ipaddress.IPv4Address):
|
||||
return '{}/{}'.format(external_ip, 32)
|
||||
elif isinstance(ip, ipaddress.IPv6Address):
|
||||
return '{}/{}'.format(external_ip, 128)
|
||||
|
||||
return '{}/{}'.format(external_ip, 32)
|
||||
|
||||
|
||||
def get_random_id():
|
||||
""" Return a random 10 byte string """
|
||||
letters = string.ascii_letters + string.digits
|
||||
return(''.join(random.choice(letters) for _ in range(10)))
|
||||
@@ -91,7 +91,7 @@ class PgAdmin(Flask):
|
||||
for key in list(module.__dict__.keys()):
|
||||
if isinstance(module.__dict__[key], PgAdminModule):
|
||||
yield module.__dict__[key]
|
||||
except Exception as _:
|
||||
except Exception:
|
||||
return []
|
||||
|
||||
@property
|
||||
@@ -372,7 +372,7 @@ def create_app(app_name=None):
|
||||
os.environ[
|
||||
'CORRUPTED_DB_BACKUP_FILE'] = backup_file_name
|
||||
app.logger.info('Database migration completed.')
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
app.logger.error('Database migration failed')
|
||||
app.logger.error(traceback.format_exc())
|
||||
raise RuntimeError('Migration failed')
|
||||
@@ -384,7 +384,7 @@ def create_app(app_name=None):
|
||||
try:
|
||||
db_upgrade(app)
|
||||
os.environ['CORRUPTED_DB_BACKUP_FILE'] = ''
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
backup_db_file()
|
||||
|
||||
# check all tables are present in the db.
|
||||
@@ -785,11 +785,10 @@ def create_app(app_name=None):
|
||||
)
|
||||
abort(401)
|
||||
login_user(user)
|
||||
elif config.SERVER_MODE and \
|
||||
not current_user.is_authenticated and \
|
||||
request.endpoint in ('redirects.index', 'security.login'):
|
||||
if app.PGADMIN_EXTERNAL_AUTH_SOURCE in [KERBEROS, WEBSERVER]:
|
||||
return authenticate.login()
|
||||
elif config.SERVER_MODE and not current_user.is_authenticated and \
|
||||
request.endpoint in ('redirects.index', 'security.login') and \
|
||||
app.PGADMIN_EXTERNAL_AUTH_SOURCE in [KERBEROS, WEBSERVER]:
|
||||
return authenticate.login()
|
||||
# if the server is restarted the in memory key will be lost
|
||||
# but the user session may still be active. Logout the user
|
||||
# to get the key again when login
|
||||
|
||||
@@ -211,10 +211,14 @@ class AuthSourceManager:
|
||||
|
||||
def validate(self):
|
||||
"""Validate through all the sources."""
|
||||
err_msg = None
|
||||
for src in self.auth_sources:
|
||||
source = get_auth_sources(src)
|
||||
if source.validate(self.form):
|
||||
status, err_msg = source.validate(self.form)
|
||||
if status:
|
||||
return True
|
||||
if err_msg:
|
||||
flash(err_msg, 'warning')
|
||||
return False
|
||||
|
||||
def authenticate(self):
|
||||
|
||||
@@ -54,14 +54,14 @@ class BaseAuthentication(object):
|
||||
form.email.errors = list(form.email.errors)
|
||||
form.email.errors.append(gettext(
|
||||
self.messages('EMAIL_NOT_PROVIDED')))
|
||||
return False
|
||||
return False, None
|
||||
if password is None or password == '':
|
||||
form.password.errors = list(form.password.errors)
|
||||
form.password.errors.append(
|
||||
self.messages('PASSWORD_NOT_PROVIDED'))
|
||||
return False
|
||||
return False, None
|
||||
|
||||
return True
|
||||
return True, None
|
||||
|
||||
def login(self, form):
|
||||
username = form.data['email']
|
||||
@@ -99,10 +99,10 @@ class InternalAuthentication(BaseAuthentication):
|
||||
"""User validation"""
|
||||
# validate the email id first
|
||||
if not validate_email(form.data['email']):
|
||||
flash(self.messages('INVALID_EMAIL'), 'warning')
|
||||
return False
|
||||
return False, self.messages('INVALID_EMAIL')
|
||||
# Flask security validation
|
||||
return form.validate_on_submit()
|
||||
submit = form.validate_on_submit()
|
||||
return submit, None
|
||||
|
||||
def authenticate(self, form):
|
||||
username = form.data['email']
|
||||
|
||||
@@ -163,7 +163,7 @@ class KerberosAuthentication(BaseAuthentication):
|
||||
return gettext("kerberos")
|
||||
|
||||
def validate(self, form):
|
||||
return True
|
||||
return True, None
|
||||
|
||||
def authenticate(self, frm):
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
import ssl
|
||||
import config
|
||||
from ldap3 import Connection, Server, Tls, ALL, ALL_ATTRIBUTES, ANONYMOUS,\
|
||||
SIMPLE
|
||||
SIMPLE, AUTO_BIND_TLS_BEFORE_BIND, AUTO_BIND_NO_TLS
|
||||
from ldap3.core.exceptions import LDAPSocketOpenError, LDAPBindError,\
|
||||
LDAPInvalidScopeError, LDAPAttributeError, LDAPInvalidFilterError,\
|
||||
LDAPStartTLSError, LDAPSSLConfigurationError
|
||||
@@ -29,6 +29,9 @@ from pgadmin.utils.constants import LDAP
|
||||
ERROR_SEARCHING_LDAP_DIRECTORY = gettext(
|
||||
"Error searching the LDAP directory: {}")
|
||||
|
||||
ERROR_CONNECTING_LDAP_SERVER = gettext(
|
||||
"Error connecting to the LDAP server: {}\n")
|
||||
|
||||
|
||||
class LDAPAuthentication(BaseAuthentication):
|
||||
"""Ldap Authentication Class"""
|
||||
@@ -105,45 +108,41 @@ class LDAPAuthentication(BaseAuthentication):
|
||||
if not status:
|
||||
return status, server
|
||||
|
||||
auto_bind = AUTO_BIND_TLS_BEFORE_BIND if self.start_tls \
|
||||
else AUTO_BIND_NO_TLS
|
||||
|
||||
# Create the connection
|
||||
try:
|
||||
if self.anonymous_bind:
|
||||
self.conn = Connection(server,
|
||||
auto_bind=True,
|
||||
auto_bind=auto_bind,
|
||||
authentication=ANONYMOUS
|
||||
)
|
||||
else:
|
||||
self.conn = Connection(server,
|
||||
user=self.bind_user,
|
||||
password=self.bind_pass,
|
||||
auto_bind=True,
|
||||
auto_bind=auto_bind,
|
||||
authentication=SIMPLE
|
||||
)
|
||||
|
||||
except LDAPSocketOpenError as e:
|
||||
current_app.logger.exception(
|
||||
"Error connecting to the LDAP server: {}\n".format(e))
|
||||
return False, gettext("Error connecting to the LDAP server: {}\n"
|
||||
).format(e.args[0])
|
||||
ERROR_CONNECTING_LDAP_SERVER.format(e))
|
||||
return False, ERROR_CONNECTING_LDAP_SERVER.format(e.args[0])
|
||||
except LDAPBindError as e:
|
||||
current_app.logger.exception(
|
||||
"Error binding to the LDAP server.")
|
||||
return False, gettext("Error binding to the LDAP server.")
|
||||
except LDAPStartTLSError as e:
|
||||
current_app.logger.exception(
|
||||
"Error starting TLS: {}\n".format(e))
|
||||
return False, gettext("Error starting TLS: {}\n"
|
||||
).format(e.args[0])
|
||||
except Exception as e:
|
||||
current_app.logger.exception(
|
||||
"Error connecting to the LDAP server: {}\n".format(e))
|
||||
return False, gettext("Error connecting to the LDAP server: {}\n"
|
||||
).format(e.args[0])
|
||||
|
||||
# Enable TLS if STARTTLS is configured
|
||||
if self.start_tls:
|
||||
try:
|
||||
self.conn.start_tls()
|
||||
except LDAPStartTLSError as e:
|
||||
current_app.logger.exception(
|
||||
"Error starting TLS: {}\n".format(e))
|
||||
return False, gettext("Error starting TLS: {}\n"
|
||||
).format(e.args[0])
|
||||
ERROR_CONNECTING_LDAP_SERVER.format(e))
|
||||
return False, ERROR_CONNECTING_LDAP_SERVER.format(e.args[0])
|
||||
|
||||
return True, None
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ class OAuth2Authentication(BaseAuthentication):
|
||||
return self.oauth2_config[self.oauth2_current_client]['OAUTH2_NAME']
|
||||
|
||||
def validate(self, form):
|
||||
return True
|
||||
return True, None
|
||||
|
||||
def login(self, form):
|
||||
profile = self.get_user_profile()
|
||||
|
||||
@@ -74,7 +74,7 @@ class WebserverAuthentication(BaseAuthentication):
|
||||
return gettext("webserver")
|
||||
|
||||
def validate(self, form):
|
||||
return True
|
||||
return True, None
|
||||
|
||||
def get_user(self):
|
||||
username = request.environ.get(config.WEBSERVER_REMOTE_USER)
|
||||
@@ -91,7 +91,7 @@ class WebserverAuthentication(BaseAuthentication):
|
||||
"Webserver authenticate failed.")
|
||||
|
||||
session['pass_enc_key'] = ''.join(
|
||||
(random.choice(string.ascii_lowercase) for x in range(10)))
|
||||
(random.choice(string.ascii_lowercase) for _ in range(10)))
|
||||
useremail = request.environ.get('mail')
|
||||
if not useremail:
|
||||
useremail = ''
|
||||
|
||||
@@ -763,7 +763,7 @@ def index():
|
||||
mfa_enabled=is_mfa_enabled(),
|
||||
login_url=login_url,
|
||||
_=gettext,
|
||||
auth_only_internal=auth_only_internal
|
||||
auth_only_internal=auth_only_internal,
|
||||
))
|
||||
|
||||
# Set the language cookie after login, so next time the user will have that
|
||||
|
||||
@@ -112,6 +112,10 @@ def server_icon_and_background(is_connected, manager, server):
|
||||
return 'icon-shared-server-not-connected{0}'.format(
|
||||
server_background_color
|
||||
)
|
||||
elif server.cloud_status == -1:
|
||||
return 'icon-server-cloud-deploy{0}'.format(
|
||||
server_background_color
|
||||
)
|
||||
else:
|
||||
return 'icon-server-not-connected{0}'.format(
|
||||
server_background_color
|
||||
@@ -256,7 +260,8 @@ class ServerModule(sg.ServerGroupPluginModule):
|
||||
user_name=server.username,
|
||||
shared=server.shared,
|
||||
is_kerberos_conn=bool(server.kerberos_conn),
|
||||
gss_authenticated=manager.gss_authenticated
|
||||
gss_authenticated=manager.gss_authenticated,
|
||||
cloud_status=server.cloud_status
|
||||
)
|
||||
|
||||
@property
|
||||
@@ -998,7 +1003,8 @@ class ServerNode(PGChildNodeView):
|
||||
'tunnel_authentication': tunnel_authentication,
|
||||
'kerberos_conn': bool(server.kerberos_conn),
|
||||
'gss_authenticated': manager.gss_authenticated,
|
||||
'gss_encrypted': manager.gss_encrypted
|
||||
'gss_encrypted': manager.gss_encrypted,
|
||||
'cloud_status': server.cloud_status
|
||||
}
|
||||
|
||||
return ajax_response(response)
|
||||
@@ -1512,10 +1518,10 @@ class ServerNode(PGChildNodeView):
|
||||
# Check if any psql terminal is running for the current disconnecting
|
||||
# server. If any terminate the psql tool connection.
|
||||
if 'sid_soid_mapping' in current_app.config and str(sid) in \
|
||||
current_app.config['sid_soid_mapping']:
|
||||
if str(sid) in current_app.config['sid_soid_mapping']:
|
||||
for i in current_app.config['sid_soid_mapping'][str(sid)]:
|
||||
sio.emit('disconnect-psql', namespace='/pty', to=i)
|
||||
current_app.config['sid_soid_mapping'] and \
|
||||
str(sid) in current_app.config['sid_soid_mapping']:
|
||||
for i in current_app.config['sid_soid_mapping'][str(sid)]:
|
||||
sio.emit('disconnect-psql', namespace='/pty', to=i)
|
||||
|
||||
status = manager.release()
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ define('pgadmin.node.cast', [
|
||||
}),
|
||||
|
||||
getSchema: function(treeNodeInfo, itemNodeData){
|
||||
let schema = new CastSchema({
|
||||
return new CastSchema({
|
||||
getTypeOptions: ()=>getNodeAjaxOptions('get_type', this, treeNodeInfo, itemNodeData),
|
||||
getFuncOptions: (srcTyp, trgtyp) =>
|
||||
{
|
||||
@@ -113,15 +113,14 @@ define('pgadmin.node.cast', [
|
||||
.catch((err)=>{
|
||||
reject(err);
|
||||
});
|
||||
}else{
|
||||
let data = [];
|
||||
} else {
|
||||
data = [];
|
||||
resolve(data);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
);
|
||||
return schema;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import gettext from 'sources/gettext';
|
||||
import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import { isEmptyString } from 'sources/validators';
|
||||
export default class CastSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined, // Name of the cast
|
||||
encoding: 'UTF8',
|
||||
@@ -29,6 +29,16 @@ export default class CastSchema extends BaseUISchema {
|
||||
return 'oid';
|
||||
}
|
||||
|
||||
getCastName(state) {
|
||||
var srctype = state.srctyp;
|
||||
var trgtype = state.trgtyp;
|
||||
if(srctype != undefined && srctype != '' &&
|
||||
trgtype != undefined && trgtype != '')
|
||||
return state.name = srctype+'->'+trgtype;
|
||||
else
|
||||
return state.name = '';
|
||||
}
|
||||
|
||||
get baseFields() {
|
||||
let obj = this;
|
||||
return [{
|
||||
@@ -53,13 +63,7 @@ export default class CastSchema extends BaseUISchema {
|
||||
* target type are set, if yes then fetch values from both
|
||||
* controls and generate cast name
|
||||
*/
|
||||
var srctype = state.srctyp;
|
||||
var trgtype = state.trgtyp;
|
||||
if(srctype != undefined && srctype != '' &&
|
||||
trgtype != undefined && trgtype != '')
|
||||
return state.name = srctype+'->'+trgtype;
|
||||
else
|
||||
return state.name = '';
|
||||
return obj.getCastName(state);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -83,13 +87,7 @@ export default class CastSchema extends BaseUISchema {
|
||||
* target type are set, if yes then fetch values from both
|
||||
* controls and generate cast name
|
||||
*/
|
||||
var srctype = state.srctyp;
|
||||
var trgtype = state.trgtyp;
|
||||
if(srctype != undefined && srctype != '' &&
|
||||
trgtype != undefined && trgtype != '')
|
||||
return state.name = srctype+'->'+trgtype;
|
||||
else
|
||||
return state.name = '';
|
||||
return obj.getCastName(state);
|
||||
},
|
||||
},
|
||||
/*
|
||||
@@ -172,8 +170,7 @@ export default class CastSchema extends BaseUISchema {
|
||||
setError('srctyp', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('srctyp', errmsg);
|
||||
setError('srctyp', null);
|
||||
}
|
||||
|
||||
if (isEmptyString(state.trgtyp)) {
|
||||
@@ -181,8 +178,7 @@ export default class CastSchema extends BaseUISchema {
|
||||
setError('trgtyp', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('trgtyp', errmsg);
|
||||
setError('trgtyp', null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -174,7 +174,8 @@ class EventTriggerView(PGChildNodeView, SchemaDiffObjectCompare):
|
||||
'fopts': [{'get': 'get_event_funcs'}, {'get': 'get_event_funcs'}]
|
||||
})
|
||||
|
||||
keys_to_ignore = ['oid', 'xmin', 'oid-2', 'eventfuncoid']
|
||||
keys_to_ignore = ['oid', 'xmin', 'oid-2', 'eventfuncoid', 'schemaoid',
|
||||
'source']
|
||||
|
||||
def check_precondition(f):
|
||||
"""
|
||||
|
||||
@@ -14,7 +14,7 @@ import { isEmptyString } from 'sources/validators';
|
||||
|
||||
|
||||
export default class EventTriggerSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
oid: undefined,
|
||||
name: undefined,
|
||||
@@ -118,14 +118,12 @@ export default class EventTriggerSchema extends BaseUISchema {
|
||||
setError('eventfunname', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('eventfunname', errmsg);
|
||||
setError('eventfunname', null);
|
||||
}
|
||||
|
||||
} else {
|
||||
errmsg = null;
|
||||
_.each(['eventfunname'], (item) => {
|
||||
setError(item, errmsg);
|
||||
setError(item, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,6 +120,8 @@ class ExtensionView(PGChildNodeView, SchemaDiffObjectCompare):
|
||||
'children': [{'get': 'children'}]
|
||||
})
|
||||
|
||||
keys_to_ignore = ['oid', 'oid-2', 'owner']
|
||||
|
||||
def check_precondition(f):
|
||||
"""
|
||||
This function will behave as a decorator which will checks
|
||||
|
||||
@@ -201,9 +201,9 @@ define('pgadmin.node.extension', [
|
||||
}),
|
||||
getSchema: (treeNodeInfo, itemNodeData)=>{
|
||||
let nodeObj = pgAdmin.Browser.Nodes['extension'];
|
||||
let schema = new ExtensionsSchema(
|
||||
return new ExtensionsSchema(
|
||||
{
|
||||
extensionsList:()=>getNodeAjaxOptions('avails', nodeObj, treeNodeInfo, itemNodeData, { cacheLevel: 'server'},
|
||||
extensionsList:()=>getNodeAjaxOptions('avails', nodeObj, treeNodeInfo, itemNodeData, { cacheLevel: 'server'},
|
||||
(data)=>{
|
||||
let res = [];
|
||||
if (data && _.isArray(data)) {
|
||||
@@ -216,7 +216,6 @@ define('pgadmin.node.extension', [
|
||||
schemaList:()=>getNodeListByName('schema', treeNodeInfo, itemNodeData)
|
||||
}
|
||||
);
|
||||
return schema;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -166,8 +166,7 @@ export default class ExtensionsSchema extends BaseUISchema {
|
||||
setError('name', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('name', errmsg);
|
||||
setError('name', null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import OptionsSchema from '../../../../../static/js/options.ui';
|
||||
|
||||
export default class ForeignServerSchema extends BaseUISchema {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, initValues) {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
fsrvtype: undefined,
|
||||
@@ -83,4 +83,4 @@ export default class ForeignServerSchema extends BaseUISchema {
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ from pgadmin.utils.driver import get_driver
|
||||
from config import PG_DEFAULT_DRIVER
|
||||
from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
|
||||
from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
|
||||
from pgadmin.utils.constants import PGADMIN_STRING_SEPARATOR
|
||||
|
||||
|
||||
class UserMappingModule(CollectionNodeModule):
|
||||
@@ -916,7 +917,14 @@ class UserMappingView(PGChildNodeView, SchemaDiffObjectCompare):
|
||||
# the empty list.
|
||||
if 'umoptions' in data and data['umoptions'] is None:
|
||||
data['umoptions'] = []
|
||||
res[row['name']] = data
|
||||
|
||||
mapping_name = row['name']
|
||||
if 'srvname' in data:
|
||||
mapping_name = \
|
||||
row['name'] + PGADMIN_STRING_SEPARATOR + \
|
||||
data['srvname']
|
||||
|
||||
res[mapping_name] = data
|
||||
|
||||
return res
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import OptionsSchema from '../../../../../../static/js/options.ui';
|
||||
|
||||
export default class UserMappingSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
is_sys_obj: undefined,
|
||||
@@ -53,4 +53,4 @@ export default class UserMappingSchema extends BaseUISchema {
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ FROM pg_catalog.pg_foreign_server srv
|
||||
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=srv.oid AND des.objsubid=0 AND des.classoid='pg_foreign_server'::regclass)
|
||||
WHERE srv.oid = {{fserid}}::oid
|
||||
{% elif fsid or umid %}
|
||||
SELECT u.umid AS oid, u.usename AS name, u.srvid AS fsid, umoptions AS umoptions, fs.srvfdw AS fdwid
|
||||
SELECT u.umid AS oid, u.usename AS name, fs.srvname, u.srvid AS fsid, umoptions AS umoptions, fs.srvfdw AS fdwid
|
||||
FROM pg_catalog.pg_user_mappings u
|
||||
LEFT JOIN pg_catalog.pg_foreign_server fs ON fs.oid = u.srvid
|
||||
{% if fsid %} WHERE u.srvid = {{fsid}}::oid {% endif %} {% if umid %} WHERE u.umid= {{umid}}::oid {% endif %}
|
||||
|
||||
@@ -12,7 +12,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import OptionsSchema from '../../../../static/js/options.ui';
|
||||
|
||||
export default class ForeignDataWrapperSchema extends BaseUISchema {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, initValues) {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
fdwowner: undefined,
|
||||
|
||||
@@ -104,7 +104,7 @@ define('pgadmin.node.language', [
|
||||
}),
|
||||
|
||||
getSchema: function(treeNodeInfo, itemNodeData){
|
||||
let schema = new LanguageSchema(
|
||||
return new LanguageSchema(
|
||||
(privileges)=>getNodePrivilegeRoleSchema(this, treeNodeInfo, itemNodeData, privileges),
|
||||
{
|
||||
lan_functions: ()=>getNodeAjaxOptions('get_functions', this, treeNodeInfo, itemNodeData),
|
||||
@@ -116,7 +116,6 @@ define('pgadmin.node.language', [
|
||||
node_info: treeNodeInfo.server,
|
||||
},
|
||||
);
|
||||
return schema;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import SecLabelSchema from '../../../../static/js/sec_label.ui';
|
||||
import _ from 'lodash';
|
||||
|
||||
export default class LanguageSchema extends BaseUISchema {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, node_info, initValues) {
|
||||
constructor(getPrivilegeRoleSchema, fieldOptions={}, node_info={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
lanowner: (node_info) ? node_info['node_info'].user.name: undefined,
|
||||
@@ -38,13 +38,10 @@ export default class LanguageSchema extends BaseUISchema {
|
||||
}
|
||||
// This function check whether the server is less than 13 or not.
|
||||
isLessThan13(){
|
||||
if(!_.isUndefined(this.node_info)
|
||||
return !_.isUndefined(this.node_info)
|
||||
&& !_.isUndefined(this.node_info['node_info'])
|
||||
&& !_.isUndefined(this.node_info['node_info'].version)
|
||||
&& this.node_info['node_info'].version < 130000)
|
||||
{ return true; }
|
||||
else{ return false; }
|
||||
|
||||
&& this.node_info['node_info'].version < 130000;
|
||||
}
|
||||
isDisabled(state){
|
||||
if (this.templateList.some(template => template.tmplname === state.name)){
|
||||
@@ -228,8 +225,7 @@ export default class LanguageSchema extends BaseUISchema {
|
||||
setError('lanproc', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('lanproc', errmsg);
|
||||
setError('lanproc', null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ define('pgadmin.node.publication', [
|
||||
}),
|
||||
|
||||
getSchema: function(treeNodeInfo, itemNodeData){
|
||||
let schema = new PublicationSchema(
|
||||
return new PublicationSchema(
|
||||
{
|
||||
publicationTable: ()=>getNodeAjaxOptions('get_tables', this, treeNodeInfo, itemNodeData),
|
||||
role:()=>getNodeListByName('role', treeNodeInfo, itemNodeData),
|
||||
@@ -156,7 +156,6 @@ define('pgadmin.node.publication', [
|
||||
node_info: treeNodeInfo.server,
|
||||
},
|
||||
);
|
||||
return schema;
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
@@ -56,7 +56,7 @@ export class DefaultWithSchema extends BaseUISchema {
|
||||
}
|
||||
|
||||
export default class PublicationSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, node_info, initValues) {
|
||||
constructor(fieldOptions={}, node_info={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
pubowner: (node_info) ? node_info['node_info'].user.name: undefined,
|
||||
|
||||
@@ -77,8 +77,7 @@ define('pgadmin.node.aggregate', [
|
||||
],
|
||||
}),
|
||||
getSchema: ()=>{
|
||||
let schema = new AggregateSchema();
|
||||
return schema;
|
||||
return new AggregateSchema();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import gettext from 'sources/gettext';
|
||||
|
||||
export default class AggregateSchema extends BaseUISchema {
|
||||
constructor(fieldOptions = {},initValues) {
|
||||
constructor(fieldOptions = {},initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
oid: undefined,
|
||||
|
||||
@@ -12,7 +12,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
|
||||
|
||||
export default class CatalogObjectColumnSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
attname: undefined,
|
||||
attowner: undefined,
|
||||
|
||||
@@ -107,7 +107,7 @@ define('pgadmin.node.collation', [
|
||||
}),
|
||||
getSchema: (treeNodeInfo, itemNodeData)=>{
|
||||
let nodeObj = pgAdmin.Browser.Nodes['collation'];
|
||||
let schema = new CollationSchema(
|
||||
return new CollationSchema(
|
||||
{
|
||||
rolesList: ()=>getNodeListByName('role', treeNodeInfo, itemNodeData, {cacheLevel: 'server'}),
|
||||
schemaList: ()=>getNodeListByName('schema', treeNodeInfo, itemNodeData, {cacheLevel: 'database'}),
|
||||
@@ -118,7 +118,6 @@ define('pgadmin.node.collation', [
|
||||
schema: ('schema' in treeNodeInfo)? treeNodeInfo.schema.label : ''
|
||||
}
|
||||
);
|
||||
return schema;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import gettext from 'sources/gettext';
|
||||
import { isEmptyString } from 'sources/validators';
|
||||
|
||||
export default class CollationSchema extends BaseUISchema {
|
||||
constructor(fieldOptions = {},initValues) {
|
||||
constructor(fieldOptions = {},initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
oid: undefined,
|
||||
|
||||
@@ -67,7 +67,7 @@ export class DomainConstSchema extends BaseUISchema {
|
||||
}
|
||||
|
||||
export default class DomainSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
oid: undefined,
|
||||
|
||||
@@ -19,7 +19,7 @@ import { getNodeAjaxOptions } from '../../../../../../../static/js/node_ajax';
|
||||
|
||||
|
||||
export default class ForeignTableSchema extends BaseUISchema {
|
||||
constructor(getPrivilegeRoleSchema, getVariableSchema, getColumns, fieldOptions={}, initValues) {
|
||||
constructor(getPrivilegeRoleSchema, getVariableSchema, getColumns, fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined,
|
||||
oid: undefined,
|
||||
@@ -73,7 +73,6 @@ export default class ForeignTableSchema extends BaseUISchema {
|
||||
return t.value;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -133,9 +132,9 @@ export default class ForeignTableSchema extends BaseUISchema {
|
||||
|
||||
if(tabColsResponse) {
|
||||
tabColsResponse.then((res)=>{
|
||||
resolve((state)=>{
|
||||
resolve((tmpstate)=>{
|
||||
let finalCols = res.map((col)=>obj.columnsObj.getNewData(col));
|
||||
finalCols = [...state.columns, ...finalCols];
|
||||
finalCols = [...tmpstate.columns, ...finalCols];
|
||||
return {
|
||||
adding_inherit_cols: false,
|
||||
columns: finalCols,
|
||||
@@ -156,9 +155,9 @@ export default class ForeignTableSchema extends BaseUISchema {
|
||||
removeOid = this.getTableOid(tabName);
|
||||
}
|
||||
if(removeOid) {
|
||||
resolve((state)=>{
|
||||
let finalCols = state.columns;
|
||||
_.remove(state.columns, (col)=>col.inheritedid==removeOid);
|
||||
resolve((tmpstate)=>{
|
||||
let finalCols = tmpstate.columns;
|
||||
_.remove(tmpstate.columns, (col)=>col.inheritedid==removeOid);
|
||||
return {
|
||||
adding_inherit_cols: false,
|
||||
columns: finalCols
|
||||
@@ -239,8 +238,7 @@ export default class ForeignTableSchema extends BaseUISchema {
|
||||
setError('ftsrvname', errmsg);
|
||||
return true;
|
||||
} else {
|
||||
errmsg = null;
|
||||
setError('ftsrvname', errmsg);
|
||||
setError('ftsrvname', null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ class TokenSchema extends BaseUISchema {
|
||||
}
|
||||
|
||||
export default class FTSConfigurationSchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined, // FTS Configuration name
|
||||
owner: undefined, // FTS Configuration owner
|
||||
|
||||
@@ -12,7 +12,7 @@ import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
import OptionsSchema from '../../../../../static/js/options.ui';
|
||||
|
||||
export default class FTSDictionarySchema extends BaseUISchema {
|
||||
constructor(fieldOptions={}, initValues) {
|
||||
constructor(fieldOptions={}, initValues={}) {
|
||||
super({
|
||||
name: undefined, // FTS Dictionary name
|
||||
owner: undefined, // FTS Dictionary owner
|
||||
|
||||
@@ -11,7 +11,7 @@ import gettext from 'sources/gettext';
|
||||
import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
|
||||
export default class FTSParserSchema extends BaseUISchema {
|
||||
constructor(fieldOptions = {}, initValues) {
|
||||
constructor(fieldOptions = {}, initValues={}) {
|
||||
super({
|
||||
name: null,
|
||||
oid: undefined,
|
||||
@@ -66,18 +66,7 @@ export default class FTSParserSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -93,18 +82,7 @@ export default class FTSParserSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -120,18 +98,7 @@ export default class FTSParserSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -147,18 +114,7 @@ export default class FTSParserSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -174,18 +130,7 @@ export default class FTSParserSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@ import gettext from 'sources/gettext';
|
||||
import BaseUISchema from 'sources/SchemaView/base_schema.ui';
|
||||
|
||||
export default class FTSTemplateSchema extends BaseUISchema {
|
||||
constructor(fieldOptions = {}, initValues) {
|
||||
constructor(fieldOptions = {}, initValues={}) {
|
||||
super({
|
||||
name: null,
|
||||
oid: undefined,
|
||||
@@ -66,18 +66,7 @@ export default class FTSTemplateSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -96,18 +85,7 @@ export default class FTSTemplateSchema extends BaseUISchema {
|
||||
controlProps: {
|
||||
allowClear: true,
|
||||
filter: (options) => {
|
||||
let res = [];
|
||||
if (state && obj.isNew(state)) {
|
||||
options.forEach((option) => {
|
||||
if(option && option.label == '') {
|
||||
return;
|
||||
}
|
||||
res.push({ label: option.label, value: option.value });
|
||||
});
|
||||
} else {
|
||||
res = options;
|
||||
}
|
||||
return res;
|
||||
return obj.getFilterOptions(state, options);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -139,8 +139,10 @@ define('pgadmin.node.function', [
|
||||
id: 'pronamespace', label: gettext('Schema'), cell: 'string',
|
||||
control: 'node-list-by-id', type: 'text', cache_level: 'database',
|
||||
node: 'schema', disabled: 'isDisabled', mode: ['create', 'edit'],
|
||||
},
|
||||
],
|
||||
},{
|
||||
id: 'description', label: gettext('Comment'), cell: 'string',
|
||||
type: 'multiline', disabled: 'isDisabled',
|
||||
}],
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||