diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index c4f2ee1726..5fd3fb2be6 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -66,7 +66,7 @@
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
- "forwardPorts": [8000, 5432, 5433],
+ "forwardPorts": [3000, 5432, 5433, 8000, 8001],
"portsAttributes": {
"3000": {
@@ -84,6 +84,10 @@
"8000": {
"label": "Datatracker",
"onAutoForward": "notify"
+ },
+ "8001": {
+ "label": "Static",
+ "onAutoForward": "silent"
}
},
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ff72b246a9..6b112ba625 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -144,7 +144,7 @@ jobs:
coverage xml
- name: Upload Coverage Results to Codecov
- uses: codecov/codecov-action@v3.1.3
+ uses: codecov/codecov-action@v3.1.4
with:
files: coverage.xml
@@ -397,7 +397,7 @@ jobs:
steps:
- name: Notify on Slack (Success)
if: ${{ !contains(join(needs.*.result, ','), 'failure') }}
- uses: slackapi/slack-github-action@v1.23.0
+ uses: slackapi/slack-github-action@v1.24.0
with:
channel-id: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }}
payload: |
@@ -420,7 +420,7 @@ jobs:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_GH_BOT }}
- name: Notify on Slack (Failure)
if: ${{ contains(join(needs.*.result, ','), 'failure') }}
- uses: slackapi/slack-github-action@v1.23.0
+ uses: slackapi/slack-github-action@v1.24.0
with:
channel-id: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }}
payload: |
@@ -450,6 +450,8 @@ jobs:
if: ${{ !failure() && !cancelled() && github.event.inputs.sandbox == 'true' }}
needs: [prepare, release]
runs-on: [self-hosted, dev-server]
+ environment:
+ name: sandbox
env:
PKG_VERSION: ${{needs.prepare.outputs.pkg_version}}
@@ -485,6 +487,9 @@ jobs:
if: ${{ !failure() && !cancelled() && github.event.inputs.legacySandbox == 'true' }}
needs: [prepare, release]
runs-on: [self-hosted, legacy-sandbox-server]
+ environment:
+ name: legacy-sandbox
+ url: "https://sandbox.ietf.org"
env:
PKG_VERSION: ${{needs.prepare.outputs.pkg_version}}
diff --git a/.github/workflows/ci-run-tests.yml b/.github/workflows/ci-run-tests.yml
index caabc7511e..e8e9fe324b 100644
--- a/.github/workflows/ci-run-tests.yml
+++ b/.github/workflows/ci-run-tests.yml
@@ -49,7 +49,7 @@ jobs:
coverage xml
- name: Upload Coverage Results to Codecov
- uses: codecov/codecov-action@v3.1.3
+ uses: codecov/codecov-action@v3.1.4
with:
files: coverage.xml
diff --git a/bin/daily b/bin/daily
index 2835a93cc1..c65ab56043 100755
--- a/bin/daily
+++ b/bin/daily
@@ -34,7 +34,7 @@ $DTDIR/ietf/manage.py update_external_command_info
rsync -avzq --delete /a/www/ietf-ftp/iana/yang-parameters/ /a/www/ietf-ftp/yang/ianamod/
# Get Yang models from Yangcatalog.
-rsync -avzq rsync://yangcatalog.org:10873/yangdeps /a/www/ietf-ftp/yang/catalogmod/
+rsync -avzq rsync://rsync.yangcatalog.org:10873/yangdeps /a/www/ietf-ftp/yang/catalogmod/
# Populate the yang repositories
$DTDIR/ietf/manage.py populate_yang_model_dirs -v0
diff --git a/dev/coverage-action/package-lock.json b/dev/coverage-action/package-lock.json
index 15feb073eb..3ef28a7ae0 100644
--- a/dev/coverage-action/package-lock.json
+++ b/dev/coverage-action/package-lock.json
@@ -22,7 +22,7 @@
"eslint-plugin-import": "2.27.5",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
- "npm-check-updates": "16.10.8"
+ "npm-check-updates": "16.10.12"
}
},
"node_modules/@actions/core": {
@@ -158,6 +158,73 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/@mapbox/node-pre-gyp": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz",
@@ -466,6 +533,16 @@
"@octokit/openapi-types": "^11.2.0"
}
},
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@pnpm/config.env-replace": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz",
@@ -2229,6 +2306,34 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+ "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data-encoder": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
@@ -3200,6 +3305,24 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "node_modules/jackspeak": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz",
+ "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jju": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
@@ -3934,9 +4057,9 @@
}
},
"node_modules/npm-check-updates": {
- "version": "16.10.8",
- "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.8.tgz",
- "integrity": "sha512-e+p3rUCvaU0iKOvi+/Xiyx+mLe9/aRTu9Zrc7+TR6H2q+uFgmXEwqbXYN9Ngqsta8gdTjpn751UD5MEOogO5cA==",
+ "version": "16.10.12",
+ "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.12.tgz",
+ "integrity": "sha512-js/Gg9+5RTyOQZnmFcPswLxf4sK/H5AE/8bl4tkleLJTC1gXhQqqELUFwXqppNvx488aXxN52ZY9k9MSSvEW2A==",
"dev": true,
"dependencies": {
"chalk": "^5.2.0",
@@ -3953,7 +4076,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
- "minimatch": "^8.0.3",
+ "minimatch": "^9.0.0",
"p-map": "^4.0.0",
"pacote": "15.1.1",
"parse-github-url": "^1.0.2",
@@ -3961,8 +4084,8 @@
"prompts-ncu": "^3.0.0",
"rc-config-loader": "^4.1.2",
"remote-git-tags": "^3.0.0",
- "rimraf": "^4.4.1",
- "semver": "^7.3.8",
+ "rimraf": "^5.0.0",
+ "semver": "^7.4.0",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",
@@ -4000,15 +4123,19 @@
}
},
"node_modules/npm-check-updates/node_modules/glob": {
- "version": "9.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
- "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz",
+ "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==",
"dev": true,
"dependencies": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2",
+ "path-scurry": "^1.7.0"
+ },
+ "bin": {
+ "glob": "dist/cjs/src/bin.js"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -4018,9 +4145,9 @@
}
},
"node_modules/npm-check-updates/node_modules/minimatch": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
- "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4033,21 +4160,21 @@
}
},
"node_modules/npm-check-updates/node_modules/minipass": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
- "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/npm-check-updates/node_modules/rimraf": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
- "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz",
+ "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==",
"dev": true,
"dependencies": {
- "glob": "^9.2.0"
+ "glob": "^10.2.5"
},
"bin": {
"rimraf": "dist/cjs/src/bin.js"
@@ -4513,13 +4640,13 @@
"dev": true
},
"node_modules/path-scurry": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz",
- "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz",
+ "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==",
"dev": true,
"dependencies": {
- "lru-cache": "^9.0.0",
- "minipass": "^5.0.0"
+ "lru-cache": "^9.1.1",
+ "minipass": "^5.0.0 || ^6.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -4529,21 +4656,21 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.3.tgz",
- "integrity": "sha512-cyjNRew29d4kbgnz1sjDqxg7qg8NW4s+HQzCGjeon7DV5T2yDije16W9HaUFV1dhVEMh+SjrOcK0TomBmf3Egg==",
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz",
+ "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==",
"dev": true,
"engines": {
"node": "14 || >=16.14"
}
},
"node_modules/path-scurry/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/path-type": {
@@ -5040,9 +5167,9 @@
"optional": true
},
"node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+ "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -5384,6 +5511,21 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/string.prototype.trim": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
@@ -5440,6 +5582,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -5986,6 +6141,24 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrap-ansi/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -6198,6 +6371,54 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ }
+ }
+ },
"@mapbox/node-pre-gyp": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz",
@@ -6448,6 +6669,13 @@
"@octokit/openapi-types": "^11.2.0"
}
},
+ "@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true
+ },
"@pnpm/config.env-replace": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz",
@@ -7748,6 +7976,24 @@
"is-callable": "^1.1.3"
}
},
+ "foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "dependencies": {
+ "signal-exit": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+ "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+ "dev": true
+ }
+ }
+ },
"form-data-encoder": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
@@ -8433,6 +8679,16 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "jackspeak": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz",
+ "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==",
+ "dev": true,
+ "requires": {
+ "@isaacs/cliui": "^8.0.2",
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"jju": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
@@ -8987,9 +9243,9 @@
}
},
"npm-check-updates": {
- "version": "16.10.8",
- "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.8.tgz",
- "integrity": "sha512-e+p3rUCvaU0iKOvi+/Xiyx+mLe9/aRTu9Zrc7+TR6H2q+uFgmXEwqbXYN9Ngqsta8gdTjpn751UD5MEOogO5cA==",
+ "version": "16.10.12",
+ "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.12.tgz",
+ "integrity": "sha512-js/Gg9+5RTyOQZnmFcPswLxf4sK/H5AE/8bl4tkleLJTC1gXhQqqELUFwXqppNvx488aXxN52ZY9k9MSSvEW2A==",
"dev": true,
"requires": {
"chalk": "^5.2.0",
@@ -9006,7 +9262,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
- "minimatch": "^8.0.3",
+ "minimatch": "^9.0.0",
"p-map": "^4.0.0",
"pacote": "15.1.1",
"parse-github-url": "^1.0.2",
@@ -9014,8 +9270,8 @@
"prompts-ncu": "^3.0.0",
"rc-config-loader": "^4.1.2",
"remote-git-tags": "^3.0.0",
- "rimraf": "^4.4.1",
- "semver": "^7.3.8",
+ "rimraf": "^5.0.0",
+ "semver": "^7.4.0",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",
@@ -9040,39 +9296,40 @@
"dev": true
},
"glob": {
- "version": "9.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
- "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz",
+ "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==",
"dev": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2",
+ "path-scurry": "^1.7.0"
}
},
"minimatch": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
- "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
"dev": true,
"requires": {
"brace-expansion": "^2.0.1"
}
},
"minipass": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
- "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
"dev": true
},
"rimraf": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
- "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz",
+ "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==",
"dev": true,
"requires": {
- "glob": "^9.2.0"
+ "glob": "^10.2.5"
}
},
"strip-json-comments": {
@@ -9412,25 +9669,25 @@
"dev": true
},
"path-scurry": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz",
- "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz",
+ "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==",
"dev": true,
"requires": {
- "lru-cache": "^9.0.0",
- "minipass": "^5.0.0"
+ "lru-cache": "^9.1.1",
+ "minipass": "^5.0.0 || ^6.0.2"
},
"dependencies": {
"lru-cache": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.3.tgz",
- "integrity": "sha512-cyjNRew29d4kbgnz1sjDqxg7qg8NW4s+HQzCGjeon7DV5T2yDije16W9HaUFV1dhVEMh+SjrOcK0TomBmf3Egg==",
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz",
+ "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==",
"dev": true
},
"minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
"dev": true
}
}
@@ -9766,9 +10023,9 @@
"optional": true
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+ "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
"requires": {
"lru-cache": "^6.0.0"
}
@@ -10030,6 +10287,17 @@
"strip-ansi": "^6.0.1"
}
},
+ "string-width-cjs": {
+ "version": "npm:string-width@4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
"string.prototype.trim": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
@@ -10071,6 +10339,15 @@
"ansi-regex": "^5.0.1"
}
},
+ "strip-ansi-cjs": {
+ "version": "npm:strip-ansi@6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
"strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -10523,6 +10800,17 @@
}
}
},
+ "wrap-ansi-cjs": {
+ "version": "npm:wrap-ansi@7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/dev/coverage-action/package.json b/dev/coverage-action/package.json
index 05ceac94db..289ce9dfbd 100644
--- a/dev/coverage-action/package.json
+++ b/dev/coverage-action/package.json
@@ -19,6 +19,6 @@
"eslint-plugin-import": "2.27.5",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
- "npm-check-updates": "16.10.8"
+ "npm-check-updates": "16.10.12"
}
}
diff --git a/dev/del-old-packages/package-lock.json b/dev/del-old-packages/package-lock.json
index f40c8036db..682d088ff4 100644
--- a/dev/del-old-packages/package-lock.json
+++ b/dev/del-old-packages/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
- "@octokit/core": "^4.2.0",
+ "@octokit/core": "^4.2.1",
"luxon": "^3.3.0"
}
},
@@ -25,9 +25,9 @@
}
},
"node_modules/@octokit/core": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz",
- "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz",
+ "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==",
"dependencies": {
"@octokit/auth-token": "^3.0.0",
"@octokit/graphql": "^5.0.0",
@@ -215,9 +215,9 @@
}
},
"@octokit/core": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz",
- "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz",
+ "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==",
"requires": {
"@octokit/auth-token": "^3.0.0",
"@octokit/graphql": "^5.0.0",
diff --git a/dev/del-old-packages/package.json b/dev/del-old-packages/package.json
index f141a4e115..068b569611 100644
--- a/dev/del-old-packages/package.json
+++ b/dev/del-old-packages/package.json
@@ -10,7 +10,7 @@
"author": "",
"license": "ISC",
"dependencies": {
- "@octokit/core": "^4.2.0",
+ "@octokit/core": "^4.2.1",
"luxon": "^3.3.0"
}
}
diff --git a/docker-compose.yml b/docker-compose.yml
index e910852669..434ec8f46c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -59,6 +59,12 @@ services:
volumes:
- ./docker/configs/pgadmin-servers.json:/pgadmin4/servers.json
+ static:
+ image: ghcr.io/ietf-tools/static:latest
+ restart: unless-stopped
+ ports:
+ - 8001:80
+
mq:
image: rabbitmq:3-alpine
restart: unless-stopped
diff --git a/docker/configs/settings_local.py b/docker/configs/settings_local.py
index a405206c95..4f0d6a2496 100644
--- a/docker/configs/settings_local.py
+++ b/docker/configs/settings_local.py
@@ -55,3 +55,5 @@
SLIDE_STAGING_PATH = 'test/staging/'
DE_GFM_BINARY = '/usr/local/bin/de-gfm'
+
+STATIC_IETF_ORG = "http://localhost:8001"
diff --git a/ietf/doc/feeds.py b/ietf/doc/feeds.py
index 7885e75e31..92871efc33 100644
--- a/ietf/doc/feeds.py
+++ b/ietf/doc/feeds.py
@@ -45,7 +45,7 @@ def subtitle(self, obj):
return "History of change entries for %s." % obj.display_name()
def items(self, obj):
- events = obj.docevent_set.all().order_by("-time","-id")
+ events = obj.docevent_set.all().order_by("-time","-id").select_related("by", "newrevisiondocevent", "submissiondocevent")
augment_events_with_revision(obj, events)
return events
diff --git a/ietf/doc/models.py b/ietf/doc/models.py
index 2e6db02a62..5d0e22683c 100644
--- a/ietf/doc/models.py
+++ b/ietf/doc/models.py
@@ -14,6 +14,7 @@
from lxml import etree
from typing import Optional, TYPE_CHECKING
from weasyprint import HTML as wpHTML
+from weasyprint.text.fonts import FontConfiguration
from django.db import models
from django.core import checks
@@ -626,6 +627,7 @@ def pdfized(self):
stylesheets.append(finders.find("ietf/css/document_html_txt.css"))
else:
text = self.htmlized()
+ stylesheets.append(f'{settings.STATIC_IETF_ORG}/fonts/noto-sans-mono/import.css')
cache = caches["pdfized"]
cache_key = name.split(".")[0]
@@ -635,10 +637,12 @@ def pdfized(self):
pdf = None
if not pdf:
try:
+ font_config = FontConfiguration()
pdf = wpHTML(
string=text, base_url=settings.IDTRACKER_BASE_URL
).write_pdf(
stylesheets=stylesheets,
+ font_config=font_config,
presentational_hints=True,
optimize_size=("fonts", "images"),
)
diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py
index 14dfb9513b..b2e65066aa 100644
--- a/ietf/doc/utils.py
+++ b/ietf/doc/utils.py
@@ -17,6 +17,7 @@
from django.conf import settings
from django.contrib import messages
+from django.db.models import QuerySet
from django.forms import ValidationError
from django.http import Http404
from django.template.loader import render_to_string
@@ -344,11 +345,18 @@ def augment_events_with_revision(doc, events):
"""Take a set of events for doc and add a .rev attribute with the
revision they refer to by checking NewRevisionDocEvents."""
- event_revisions = list(NewRevisionDocEvent.objects.filter(doc=doc).order_by('time', 'id').values('id', 'rev', 'time'))
+ if isinstance(events, QuerySet):
+ qs = events.filter(newrevisiondocevent__isnull=False)
+ else:
+ qs = NewRevisionDocEvent.objects.filter(doc=doc)
+ event_revisions = list(qs.order_by('time', 'id').values('id', 'rev', 'time'))
if doc.type_id == "draft" and doc.get_state_slug() == "rfc":
# add fake "RFC" revision
- e = doc.latest_event(type="published_rfc")
+ if isinstance(events, QuerySet):
+ e = events.filter(type="published_rfc").order_by('time').last()
+ else:
+ e = doc.latest_event(type="published_rfc")
if e:
event_revisions.append(dict(id=e.id, time=e.time, rev="RFC"))
event_revisions.sort(key=lambda x: (x["time"], x["id"]))
diff --git a/ietf/meeting/admin.py b/ietf/meeting/admin.py
index 8c419e8a96..e975dd38a6 100644
--- a/ietf/meeting/admin.py
+++ b/ietf/meeting/admin.py
@@ -97,7 +97,7 @@ class SchedulingEventInline(admin.TabularInline):
class SessionAdmin(admin.ModelAdmin):
list_display = [
- "meeting", "name", "group_acronym", "purpose", "attendees", "has_onsite_tool", "requested", "current_status"
+ "meeting", "name", "group_acronym", "purpose", "attendees", "has_onsite_tool", "chat_room", "requested", "current_status"
]
list_filter = ["purpose", "meeting", ]
raw_id_fields = ["meeting", "group", "materials", "joint_with_groups", "tombstone_for"]
diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py
index f3f660b2f7..822f56b97c 100644
--- a/ietf/meeting/forms.py
+++ b/ietf/meeting/forms.py
@@ -744,7 +744,7 @@ class Meta:
model = Session
fields = (
'purpose', 'name', 'short', 'type', 'requested_duration',
- 'on_agenda', 'agenda_note', 'has_onsite_tool', 'remote_instructions',
+ 'on_agenda', 'agenda_note', 'has_onsite_tool', 'chat_room', 'remote_instructions',
'attendees', 'comments',
)
labels = {'requested_duration': 'Length'}
diff --git a/ietf/meeting/migrations/0004_session_chat_room.py b/ietf/meeting/migrations/0004_session_chat_room.py
new file mode 100644
index 0000000000..9879c8c42f
--- /dev/null
+++ b/ietf/meeting/migrations/0004_session_chat_room.py
@@ -0,0 +1,18 @@
+# Copyright The IETF Trust 2023, All Rights Reserved
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('meeting', '0003_populate_session_has_onsite_tool'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='session',
+ name='chat_room',
+ field=models.CharField(blank=True, help_text='Name of Zulip stream, if different from group acronym', max_length=32),
+ ),
+ ]
diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py
index a652711621..31a887e466 100644
--- a/ietf/meeting/models.py
+++ b/ietf/meeting/models.py
@@ -1052,6 +1052,7 @@ class Session(models.Model):
remote_instructions = models.CharField(blank=True,max_length=1024)
on_agenda = models.BooleanField(default=True, help_text='Is this session visible on the meeting agenda?')
has_onsite_tool = models.BooleanField(default=False, help_text="Does this session use the officially supported onsite and remote tooling?")
+ chat_room = models.CharField(blank=True, max_length=32, help_text='Name of Zulip stream, if different from group acronym')
tombstone_for = models.ForeignKey('Session', blank=True, null=True, help_text="This session is the tombstone for a session that was rescheduled", on_delete=models.CASCADE)
@@ -1285,7 +1286,10 @@ def agenda_file(self):
return self._agenda_file
def chat_room_name(self):
- if self.type_id=='plenary':
+ if self.chat_room:
+ return self.chat_room
+ # At some point, add a migration to add "plenary" chat room name to existing sessions in the database.
+ elif self.type_id=='plenary':
return 'plenary'
else:
return self.group_at_the_time().acronym
diff --git a/ietf/meeting/tests_models.py b/ietf/meeting/tests_models.py
index 2603190fe7..0ccd462715 100644
--- a/ietf/meeting/tests_models.py
+++ b/ietf/meeting/tests_models.py
@@ -138,3 +138,11 @@ def test_chat_archive_url(self):
self.assertEqual(session_with_jabber.chat_archive_url(), 'https://www.ietf.org/jabber/logs/fakeacronym?C=M;O=D')
chatlog = SessionPresentationFactory(session=session_with_jabber, document__type_id='chatlog').document
self.assertEqual(session_with_jabber.chat_archive_url(), chatlog.get_href())
+
+ def test_chat_room_name(self):
+ session = SessionFactory(group__acronym='xyzzy')
+ self.assertEqual(session.chat_room_name(), 'xyzzy')
+ session.type_id = 'plenary'
+ self.assertEqual(session.chat_room_name(), 'plenary')
+ session.chat_room = 'fnord'
+ self.assertEqual(session.chat_room_name(), 'fnord')
diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py
index 449ad03a35..e65adaf0c6 100644
--- a/ietf/meeting/tests_views.py
+++ b/ietf/meeting/tests_views.py
@@ -3975,6 +3975,7 @@ def test_edit_session(self):
'remote_instructions': 'Do this do that',
'attendees': '103',
'comments': 'So much to say',
+ 'chat_room': 'xyzzy',
}
r = self.client.post(url, post_data)
self.assertNoFormPostErrors(r)
@@ -3989,6 +3990,7 @@ def test_edit_session(self):
self.assertEqual(session.remote_instructions, 'Do this do that')
self.assertEqual(session.attendees, 103)
self.assertEqual(session.comments, 'So much to say')
+ self.assertEqual(session.chat_room, 'xyzzy')
# Verify return to correct schedule when sched query parameter is present
other_schedule = ScheduleFactory(meeting=session.meeting)
diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py
index 8e915b74db..805f1ab747 100644
--- a/ietf/nomcom/tests.py
+++ b/ietf/nomcom/tests.py
@@ -2599,7 +2599,7 @@ def test_elig_by_author(self):
self.assertEqual(set(list_eligible(nomcom=nomcom)),set(eligible))
Person.objects.filter(pk__in=[p.pk for p in eligible.union(ineligible)]).delete()
-class rfc8989bisEligibilityTests(TestCase):
+class rfc9389EligibilityTests(TestCase):
def setUp(self):
super().setUp()
diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py
index 4c91bfd1d9..d666ed816e 100644
--- a/ietf/nomcom/utils.py
+++ b/ietf/nomcom/utils.py
@@ -513,7 +513,7 @@ def list_eligible(nomcom=None, date=None, base_qs=None):
elif eligibility_date.year in (2021,2022):
return list_eligible_8989(date=eligibility_date, base_qs=base_qs)
elif eligibility_date.year > 2022:
- return list_eligible_8989bis(date=eligibility_date, base_qs=base_qs)
+ return list_eligible_9389(date=eligibility_date, base_qs=base_qs)
else:
return Person.objects.none()
@@ -551,8 +551,8 @@ def list_eligible_8788(date, base_qs=None):
def get_8989_eligibility_querysets(date, base_qs):
return get_threerule_eligibility_querysets(date, base_qs, three_of_five_callable=three_of_five_eligible_8713)
-def get_8989bis_eligibility_querysets(date, base_qs):
- return get_threerule_eligibility_querysets(date, base_qs, three_of_five_callable=three_of_five_eligible_8989bis)
+def get_9389_eligibility_querysets(date, base_qs):
+ return get_threerule_eligibility_querysets(date, base_qs, three_of_five_callable=three_of_five_eligible_9389)
def get_threerule_eligibility_querysets(date, base_qs, three_of_five_callable):
if not base_qs:
@@ -605,10 +605,10 @@ def list_eligible_8989(date, base_qs=None):
author_pks = author_qs.values_list('pk',flat=True)
return remove_disqualified(Person.objects.filter(pk__in=set(three_of_five_pks).union(set(officer_pks)).union(set(author_pks))))
-def list_eligible_8989bis(date, base_qs=None):
+def list_eligible_9389(date, base_qs=None):
if not base_qs:
base_qs = Person.objects.all()
- three_of_five_qs, officer_qs, author_qs = get_8989bis_eligibility_querysets(date, base_qs)
+ three_of_five_qs, officer_qs, author_qs = get_9389_eligibility_querysets(date, base_qs)
three_of_five_pks = three_of_five_qs.values_list('pk',flat=True)
officer_pks = officer_qs.values_list('pk',flat=True)
author_pks = author_qs.values_list('pk',flat=True)
@@ -653,12 +653,11 @@ def three_of_five_eligible_8713(previous_five, queryset=None):
queryset = Person.objects.all()
return queryset.filter(meetingregistration__meeting__in=list(previous_five),meetingregistration__attended=True).annotate(mtg_count=Count('meetingregistration')).filter(mtg_count__gte=3)
-def three_of_five_eligible_8989bis(previous_five, queryset=None):
+def three_of_five_eligible_9389(previous_five, queryset=None):
""" Return a list of Person records who attended at least
3 of the 5 type_id='ietf' meetings before the given
date. Does not disqualify anyone based on held roles.
This variant bases the calculation on Meeting.Session and MeetingRegistration.checked_in
- Leadership will have to create a new RFC specifying eligibility (RFC8989 is timing out) before it can be used.
"""
if queryset is None:
queryset = Person.objects.all()
diff --git a/ietf/settings.py b/ietf/settings.py
index 00e7f292fe..db3acab1ef 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -137,7 +137,6 @@
# Absolute path to the directory static files should be collected to.
# Example: "/var/www/example.com/static/"
-
SERVE_CDN_PHOTOS = True
SERVE_CDN_FILES_LOCALLY_IN_DEV_MODE = True
@@ -157,6 +156,8 @@
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
+STATIC_IETF_ORG = "https://static.ietf.org"
+
WSGI_APPLICATION = "ietf.wsgi.application"
AUTHENTICATION_BACKENDS = ( 'ietf.ietfauth.backends.CaseInsensitiveModelBackend', )
@@ -315,7 +316,12 @@ def skip_unreadable_post(record):
X_FRAME_OPTIONS = 'SAMEORIGIN'
-CSRF_TRUSTED_ORIGINS = ['ietf.org', '*.ietf.org', 'meetecho.com', '*.meetecho.com', 'gather.town', '*.gather.town', ]
+CSRF_TRUSTED_ORIGINS = [
+ 'ietf.org',
+ '*.ietf.org',
+ 'meetecho.com',
+ '*.meetecho.com',
+]
CSRF_COOKIE_SAMESITE = 'None'
CSRF_COOKIE_SECURE = True
@@ -532,7 +538,9 @@ def skip_unreadable_post(record):
IDNITS_SERVICE_URL = "https://author-tools.ietf.org/idnits"
# Content security policy configuration (django-csp)
-CSP_DEFAULT_SRC = ("'self'", "'unsafe-inline'", f"data: {IDTRACKER_BASE_URL} https://www.ietf.org/ https://analytics.ietf.org/ https://fonts.googleapis.com/")
+# (In current production, the Content-Security-Policy header is completely set by nginx configuration, but
+# we try to keep this in sync to avoid confusion)
+CSP_DEFAULT_SRC = ("'self'", "'unsafe-inline'", f"data: {IDTRACKER_BASE_URL} http://ietf.org/ https://www.ietf.org/ https://analytics.ietf.org/ https://static.ietf.org")
# The name of the method to use to invoke the test suite
TEST_RUNNER = 'ietf.utils.test_runner.IetfTestRunner'
diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py
index 3f12e50c5e..dfc6f2835b 100644
--- a/ietf/submit/utils.py
+++ b/ietf/submit/utils.py
@@ -1265,7 +1265,11 @@ def process_and_validate_submission(submission):
# Parse text, whether uploaded or generated from XML
text_metadata = process_submission_text(submission.name, submission.rev)
- if xml_metadata and xml_metadata["title"] != text_metadata["title"]:
+ if (
+ ".txt" in submission.file_types
+ and xml_metadata
+ and xml_metadata["title"] != text_metadata["title"]
+ ):
raise SubmissionError(
f"Text Internet-Draft title ({text_metadata['title']}) "
f"disagrees with XML Internet-Draft title ({xml_metadata['title']})"
@@ -1275,13 +1279,14 @@ def process_and_validate_submission(submission):
if xml_metadata is not None:
# Items preferred / only available from XML
submission.xml_version = xml_metadata["xml_version"]
+ submission.title = xml_metadata["title"]
submission.authors = xml_metadata["authors"]
else:
# Items to get from text only if XML not available
+ submission.title = text_metadata["title"]
submission.authors = text_metadata["authors"]
# Items always to get from text, even when XML is available
- submission.title = text_metadata["title"] # verified above this agrees with XML, if present
submission.abstract = text_metadata["abstract"]
submission.document_date = text_metadata["document_date"]
submission.pages = text_metadata["pages"]
diff --git a/ietf/templates/base.html b/ietf/templates/base.html
index c5dd43fef5..dd8a491583 100644
--- a/ietf/templates/base.html
+++ b/ietf/templates/base.html
@@ -15,8 +15,8 @@
{% block title %}No title{% endblock %}
-
-
+
+