ci: Merge branch 'main' into feat/rfc

This commit is contained in:
Robert Sparks 2023-09-15 11:48:44 -05:00
commit 621528ad03
No known key found for this signature in database
GPG key ID: 6E2A6A5775F91318
68 changed files with 747 additions and 330 deletions

View file

@ -17,7 +17,7 @@ jobs:
packages: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View file

@ -19,7 +19,7 @@ jobs:
packages: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View file

@ -10,6 +10,9 @@ on:
workflow_dispatch:
env:
RABBITMQ_VERSION: 3.12-alpine
jobs:
publish:
runs-on: ubuntu-latest
@ -18,7 +21,7 @@ jobs:
packages: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@ -40,5 +43,7 @@ jobs:
file: dev/mq/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/ietf-tools/datatracker-mq:latest
build-args: RABBITMQ_VERSION=${{ env.RABBITMQ_VERSION }}
tags: |
ghcr.io/ietf-tools/datatracker-mq:${{ env.RABBITMQ_VERSION }}
ghcr.io/ietf-tools/datatracker-mq:latest

View file

@ -52,7 +52,7 @@ jobs:
to_tag: ${{ steps.semver.outputs.current }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
@ -124,7 +124,7 @@ jobs:
TO_TAG: ${{needs.prepare.outputs.to_tag}}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
@ -217,7 +217,7 @@ jobs:
- name: Update Baseline Coverage
uses: ncipollo/release-action@v1.13.0
if: ${{ github.event.inputs.updateCoverage == 'true' }}
if: ${{ github.event.inputs.updateCoverage == 'true' || github.ref_name == 'release' }}
with:
allowUpdates: true
tag: baseline
@ -307,7 +307,7 @@ jobs:
PKG_VERSION: ${{needs.prepare.outputs.pkg_version}}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Download a Release Artifact
uses: actions/download-artifact@v3.0.2

View file

@ -26,7 +26,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2

View file

@ -15,6 +15,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 'Dependency Review'
uses: actions/dependency-review-action@v3

View file

@ -29,7 +29,7 @@ jobs:
contents: read
packages: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Login to GitHub Container Registry
uses: docker/login-action@v2

View file

@ -15,7 +15,7 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Refresh DBs
env:

View file

@ -20,7 +20,7 @@ jobs:
image: ghcr.io/ietf-tools/datatracker-db:latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Prepare for tests
run: |
@ -77,7 +77,7 @@ jobs:
project: [chromium, firefox]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
@ -118,7 +118,7 @@ jobs:
image: ghcr.io/ietf-tools/datatracker-db:latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Prepare for tests
run: |

179
.pnp.cjs generated
View file

@ -46,29 +46,29 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@parcel/transformer-inline-string", "npm:2.9.3"],\
["@parcel/transformer-sass", "npm:2.9.3"],\
["@popperjs/core", "npm:2.11.8"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.4"],\
["@twuni/emojify", "npm:1.0.2"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.1"],\
["bootstrap-icons", "npm:1.10.5"],\
["browser-fs-access", "npm:0.34.1"],\
["browserlist", "npm:1.0.1"],\
["c8", "npm:8.0.1"],\
["caniuse-lite", "npm:1.0.30001519"],\
["d3", "npm:7.8.5"],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.2"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.3.0"],\
["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.0"],\
["jquery", "npm:3.7.1"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
["js-cookie", "npm:3.0.5"],\
["list.js", "npm:2.3.1"],\
@ -89,7 +89,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["select2", "npm:4.1.0-rc.0"],\
["select2-bootstrap-5-theme", "npm:1.3.0"],\
["send", "npm:0.18.0"],\
["shepherd.js", "npm:11.1.1"],\
["shepherd.js", "npm:11.2.0"],\
["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.0"],\
["vanillajs-datepicker", "npm:1.3.4"],\
@ -438,12 +438,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0", {\
"packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-5ceedd2a81/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\
["virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0", {\
"packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-01223f6a8e/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\
"packageDependencies": [\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@eslint-community/eslint-utils", "virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-visitor-keys", "npm:3.3.0"]\
],\
"packagePeers": [\
@ -497,20 +497,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@floating-ui/core", [\
["npm:1.2.6", {\
"packageLocation": "./.yarn/cache/@floating-ui-core-npm-1.2.6-083bec342c-e4aa96c435.zip/node_modules/@floating-ui/core/",\
["npm:1.4.1", {\
"packageLocation": "./.yarn/cache/@floating-ui-core-npm-1.4.1-fe89c45d92-be4ab864fe.zip/node_modules/@floating-ui/core/",\
"packageDependencies": [\
["@floating-ui/core", "npm:1.2.6"]\
["@floating-ui/core", "npm:1.4.1"],\
["@floating-ui/utils", "npm:0.1.2"]\
],\
"linkType": "HARD"\
}]\
]],\
["@floating-ui/dom", [\
["npm:1.2.6", {\
"packageLocation": "./.yarn/cache/@floating-ui-dom-npm-1.2.6-9d4be07ec3-2226c6c244.zip/node_modules/@floating-ui/dom/",\
["npm:1.5.2", {\
"packageLocation": "./.yarn/cache/@floating-ui-dom-npm-1.5.2-f1b8ca0c30-3c71eed50b.zip/node_modules/@floating-ui/dom/",\
"packageDependencies": [\
["@floating-ui/dom", "npm:1.2.6"],\
["@floating-ui/core", "npm:1.2.6"]\
["@floating-ui/dom", "npm:1.5.2"],\
["@floating-ui/core", "npm:1.4.1"],\
["@floating-ui/utils", "npm:0.1.2"]\
],\
"linkType": "HARD"\
}]\
]],\
["@floating-ui/utils", [\
["npm:0.1.2", {\
"packageLocation": "./.yarn/cache/@floating-ui-utils-npm-0.1.2-22eefe56f0-3e29fd3c69.zip/node_modules/@floating-ui/utils/",\
"packageDependencies": [\
["@floating-ui/utils", "npm:0.1.2"]\
],\
"linkType": "HARD"\
}]\
@ -2346,17 +2357,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@rollup/pluginutils", [\
["npm:5.0.3", {\
"packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.0.3-33f9e7f020-8efbdeac53.zip/node_modules/@rollup/pluginutils/",\
["npm:5.0.4", {\
"packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.0.4-344c94a032-893d5805ac.zip/node_modules/@rollup/pluginutils/",\
"packageDependencies": [\
["@rollup/pluginutils", "npm:5.0.3"]\
["@rollup/pluginutils", "npm:5.0.4"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3", {\
"packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-e8c80fae3a/0/cache/@rollup-pluginutils-npm-5.0.3-33f9e7f020-8efbdeac53.zip/node_modules/@rollup/pluginutils/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.4", {\
"packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-72dfe81051/0/cache/@rollup-pluginutils-npm-5.0.4-344c94a032-893d5805ac.zip/node_modules/@rollup/pluginutils/",\
"packageDependencies": [\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.4"],\
["@types/estree", "npm:1.0.0"],\
["@types/rollup", null],\
["estree-walker", "npm:2.0.2"],\
@ -2378,10 +2389,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0", {\
"packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-23ff750c09/0/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\
["virtual:0f17270113a645b9ccd471681c6953a9ecf2cc875b79eb96d26d7cb579b1f042c2aaab59d6799ee85bf4e9b312f464a118c211e37c33fa47b3e11095c49e32d7#npm:2.0.0", {\
"packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-148105bc23/0/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\
"packageDependencies": [\
["@sidvind/better-ajv-errors", "virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0"],\
["@sidvind/better-ajv-errors", "virtual:0f17270113a645b9ccd471681c6953a9ecf2cc875b79eb96d26d7cb579b1f042c2aaab59d6799ee85bf4e9b312f464a118c211e37c33fa47b3e11095c49e32d7#npm:2.0.0"],\
["@babel/code-frame", "npm:7.16.7"],\
["@types/ajv", null],\
["ajv", "npm:8.11.0"],\
@ -3180,10 +3191,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["npm:5.3.0", {\
"packageLocation": "./.yarn/cache/bootstrap-npm-5.3.0-240c38a3b2-29a83cc8ca.zip/node_modules/bootstrap/",\
["npm:5.3.1", {\
"packageLocation": "./.yarn/cache/bootstrap-npm-5.3.1-9ad45c2765-f8176376aa.zip/node_modules/bootstrap/",\
"packageDependencies": [\
["bootstrap", "npm:5.3.0"]\
["bootstrap", "npm:5.3.1"]\
],\
"linkType": "SOFT"\
}],\
@ -3200,10 +3211,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "HARD"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0", {\
"packageLocation": "./.yarn/__virtual__/bootstrap-virtual-3c63ba6f80/0/cache/bootstrap-npm-5.3.0-240c38a3b2-29a83cc8ca.zip/node_modules/bootstrap/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.1", {\
"packageLocation": "./.yarn/__virtual__/bootstrap-virtual-94a6bfc3bc/0/cache/bootstrap-npm-5.3.1-9ad45c2765-f8176376aa.zip/node_modules/bootstrap/",\
"packageDependencies": [\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.1"],\
["@popperjs/core", "npm:2.11.8"],\
["@types/popperjs__core", null]\
],\
@ -4619,11 +4630,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint", [\
["npm:8.47.0", {\
"packageLocation": "./.yarn/cache/eslint-npm-8.47.0-84c6b60ea8-1988617f70.zip/node_modules/eslint/",\
["npm:8.48.0", {\
"packageLocation": "./.yarn/cache/eslint-npm-8.48.0-0dd1c36629-f20b359a4f.zip/node_modules/eslint/",\
"packageDependencies": [\
["eslint", "npm:8.47.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["eslint", "npm:8.48.0"],\
["@eslint-community/eslint-utils", "virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0"],\
["@eslint-community/regexpp", "npm:4.8.0"],\
["@eslint/eslintrc", "npm:2.1.2"],\
["@eslint/js", "npm:8.48.0"],\
@ -4680,9 +4691,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/eslint-plugin-import", null],\
["@types/eslint-plugin-n", null],\
["@types/eslint-plugin-promise", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.2"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"]\
],\
"packagePeers": [\
@ -4729,7 +4740,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/typescript-eslint__parser", null],\
["@typescript-eslint/parser", null],\
["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-import-resolver-node", "npm:0.3.7"],\
["eslint-import-resolver-typescript", null],\
["eslint-import-resolver-webpack", null]\
@ -4762,7 +4773,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["globals", "npm:13.21.0"]\
],\
"packagePeers": [\
@ -4785,7 +4796,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-utils", "npm:2.1.0"],\
["regexpp", "npm:3.2.0"]\
],\
@ -4804,14 +4815,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:adc54309e8e54b60324bd0d3562e4cdf4588bb7e8e9bf0e8567ae0b912e220b364ab900a1f69ea824481e4ed94aa6d687c737b8f554fa53b86231581c20d170a#npm:7.1.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-es-x-virtual-7882922717/0/cache/eslint-plugin-es-x-npm-7.1.0-35735e8bbc-a19924313c.zip/node_modules/eslint-plugin-es-x/",\
["virtual:40d6f5c942a7ef0ae65f54bca96af56e7db0d52fb7321d7f8d1da62ed519e1f8c80fdfb1299383ab8a4a5e7182ecc1d4bae33d806b79817d62ed4ad091e77615#npm:7.1.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-es-x-virtual-3346953c48/0/cache/eslint-plugin-es-x-npm-7.1.0-35735e8bbc-a19924313c.zip/node_modules/eslint-plugin-es-x/",\
"packageDependencies": [\
["eslint-plugin-es-x", "virtual:adc54309e8e54b60324bd0d3562e4cdf4588bb7e8e9bf0e8567ae0b912e220b364ab900a1f69ea824481e4ed94aa6d687c737b8f554fa53b86231581c20d170a#npm:7.1.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["eslint-plugin-es-x", "virtual:40d6f5c942a7ef0ae65f54bca96af56e7db0d52fb7321d7f8d1da62ed519e1f8c80fdfb1299383ab8a4a5e7182ecc1d4bae33d806b79817d62ed4ad091e77615#npm:7.1.0"],\
["@eslint-community/eslint-utils", "virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0"],\
["@eslint-community/regexpp", "npm:4.5.1"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"]\
["eslint", "npm:8.48.0"]\
],\
"packagePeers": [\
"@types/eslint",\
@ -4841,7 +4852,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["array.prototype.flatmap", "npm:1.3.1"],\
["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\
["doctrine", "npm:2.1.0"],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-import-resolver-node", "npm:0.3.7"],\
["eslint-module-utils", "virtual:ef2ff17f0affe5aeeb05f2e27f2212e975bb78d898c026b74cc62e05a17de36abb35a54f0831f2ff5fced26e6128bfc2c0cf332f7c60149823619b008d0ea480#npm:2.8.0"],\
["has", "npm:1.0.3"],\
@ -4864,22 +4875,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint-plugin-n", [\
["npm:16.0.1", {\
"packageLocation": "./.yarn/cache/eslint-plugin-n-npm-16.0.1-6a07bf1b46-407002bb06.zip/node_modules/eslint-plugin-n/",\
["npm:16.0.2", {\
"packageLocation": "./.yarn/cache/eslint-plugin-n-npm-16.0.2-6a256d6ab7-44cffe32a3.zip/node_modules/eslint-plugin-n/",\
"packageDependencies": [\
["eslint-plugin-n", "npm:16.0.1"]\
["eslint-plugin-n", "npm:16.0.2"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-adc54309e8/0/cache/eslint-plugin-n-npm-16.0.1-6a07bf1b46-407002bb06.zip/node_modules/eslint-plugin-n/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.2", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-40d6f5c942/0/cache/eslint-plugin-n-npm-16.0.2-6a256d6ab7-44cffe32a3.zip/node_modules/eslint-plugin-n/",\
"packageDependencies": [\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.2"],\
["@eslint-community/eslint-utils", "virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0"],\
["@types/eslint", null],\
["builtins", "npm:5.0.1"],\
["eslint", "npm:8.47.0"],\
["eslint-plugin-es-x", "virtual:adc54309e8e54b60324bd0d3562e4cdf4588bb7e8e9bf0e8567ae0b912e220b364ab900a1f69ea824481e4ed94aa6d687c737b8f554fa53b86231581c20d170a#npm:7.1.0"],\
["eslint", "npm:8.48.0"],\
["eslint-plugin-es-x", "virtual:40d6f5c942a7ef0ae65f54bca96af56e7db0d52fb7321d7f8d1da62ed519e1f8c80fdfb1299383ab8a4a5e7182ecc1d4bae33d806b79817d62ed4ad091e77615#npm:7.1.0"],\
["ignore", "npm:5.2.4"],\
["is-core-module", "npm:2.12.1"],\
["minimatch", "npm:3.1.2"],\
@ -4906,7 +4917,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\
["eslint-utils", "npm:2.1.0"],\
["ignore", "npm:5.2.0"],\
@ -4934,7 +4945,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"]\
["eslint", "npm:8.48.0"]\
],\
"packagePeers": [\
"@types/eslint",\
@ -4955,9 +4966,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-e39e5d6bef/0/cache/eslint-plugin-vue-npm-9.17.0-c32115eab8-2ef53a0387.zip/node_modules/eslint-plugin-vue/",\
"packageDependencies": [\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@eslint-community/eslint-utils", "virtual:0dd1c3662912d25464a284caa5dbde8cc315ca056be4ded44d6f67e20c4895461cf49fc7bff27c35f254bdb0924477031e3e50d50a333908daaff17dcf43b01d#npm:4.4.0"],\
["@types/eslint", null],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["natural-compare", "npm:1.4.0"],\
["nth-check", "npm:2.1.1"],\
["postcss-selector-parser", "npm:6.0.13"],\
@ -5640,20 +5651,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["html-validate", [\
["npm:8.2.0", {\
"packageLocation": "./.yarn/cache/html-validate-npm-8.2.0-51da0ed7e6-793287a454.zip/node_modules/html-validate/",\
["npm:8.3.0", {\
"packageLocation": "./.yarn/cache/html-validate-npm-8.3.0-71b7ba49e2-fd96a96fa7.zip/node_modules/html-validate/",\
"packageDependencies": [\
["html-validate", "npm:8.2.0"]\
["html-validate", "npm:8.3.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0", {\
"packageLocation": "./.yarn/__virtual__/html-validate-virtual-d54cf140bc/0/cache/html-validate-npm-8.2.0-51da0ed7e6-793287a454.zip/node_modules/html-validate/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.3.0", {\
"packageLocation": "./.yarn/__virtual__/html-validate-virtual-0f17270113/0/cache/html-validate-npm-8.3.0-71b7ba49e2-fd96a96fa7.zip/node_modules/html-validate/",\
"packageDependencies": [\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.3.0"],\
["@babel/code-frame", "npm:7.16.7"],\
["@html-validate/stylish", "npm:4.1.0"],\
["@sidvind/better-ajv-errors", "virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0"],\
["@sidvind/better-ajv-errors", "virtual:0f17270113a645b9ccd471681c6953a9ecf2cc875b79eb96d26d7cb579b1f042c2aaab59d6799ee85bf4e9b312f464a118c211e37c33fa47b3e11095c49e32d7#npm:2.0.0"],\
["@types/jest", null],\
["@types/jest-diff", null],\
["@types/jest-snapshot", null],\
@ -6323,10 +6334,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["jquery", [\
["npm:3.7.0", {\
"packageLocation": "./.yarn/cache/jquery-npm-3.7.0-a02a382bf4-907785e133.zip/node_modules/jquery/",\
["npm:3.7.1", {\
"packageLocation": "./.yarn/cache/jquery-npm-3.7.1-eeeac0f21e-4370b8139d.zip/node_modules/jquery/",\
"packageDependencies": [\
["jquery", "npm:3.7.0"]\
["jquery", "npm:3.7.1"]\
],\
"linkType": "HARD"\
}]\
@ -6344,7 +6355,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
["@types/jquery", null],\
["jquery", "npm:3.7.0"]\
["jquery", "npm:3.7.1"]\
],\
"packagePeers": [\
"@types/jquery",\
@ -8097,29 +8108,29 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@parcel/transformer-inline-string", "npm:2.9.3"],\
["@parcel/transformer-sass", "npm:2.9.3"],\
["@popperjs/core", "npm:2.11.8"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.4"],\
["@twuni/emojify", "npm:1.0.2"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.1"],\
["bootstrap-icons", "npm:1.10.5"],\
["browser-fs-access", "npm:0.34.1"],\
["browserlist", "npm:1.0.1"],\
["c8", "npm:8.0.1"],\
["caniuse-lite", "npm:1.0.30001519"],\
["d3", "npm:7.8.5"],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.2"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.3.0"],\
["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.0"],\
["jquery", "npm:3.7.1"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
["js-cookie", "npm:3.0.5"],\
["list.js", "npm:2.3.1"],\
@ -8140,7 +8151,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["select2", "npm:4.1.0-rc.0"],\
["select2-bootstrap-5-theme", "npm:1.3.0"],\
["send", "npm:0.18.0"],\
["shepherd.js", "npm:11.1.1"],\
["shepherd.js", "npm:11.2.0"],\
["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.0"],\
["vanillajs-datepicker", "npm:1.3.4"],\
@ -8388,11 +8399,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["shepherd.js", [\
["npm:11.1.1", {\
"packageLocation": "./.yarn/cache/shepherd.js-npm-11.1.1-c87ab2ed73-1d2a0563b6.zip/node_modules/shepherd.js/",\
["npm:11.2.0", {\
"packageLocation": "./.yarn/cache/shepherd.js-npm-11.2.0-94b9af1487-0e71e63e51.zip/node_modules/shepherd.js/",\
"packageDependencies": [\
["shepherd.js", "npm:11.1.1"],\
["@floating-ui/dom", "npm:1.2.6"],\
["shepherd.js", "npm:11.2.0"],\
["@floating-ui/dom", "npm:1.5.2"],\
["deepmerge", "npm:4.3.1"]\
],\
"linkType": "HARD"\
@ -9151,7 +9162,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["vue-eslint-parser", "virtual:e39e5d6bef7a93bd3b21c5c9ba6ef825c92fc73c8d9c9e01699e1dc11e40fd3bc150ba16509e2cf59495cb098c32b2e4a85c0c21802fddeffc3208b01f4f5a16#npm:9.3.1"],\
["@types/eslint", null],\
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\
["eslint", "npm:8.47.0"],\
["eslint", "npm:8.48.0"],\
["eslint-scope", "npm:7.1.1"],\
["eslint-visitor-keys", "npm:3.3.0"],\
["espree", "npm:9.3.2"],\

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -17,12 +17,12 @@
"luxon": "3.4.0"
},
"devDependencies": {
"eslint": "8.47.0",
"eslint": "8.48.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"
"npm-check-updates": "16.13.2"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -1387,9 +1387,9 @@
}
},
"node_modules/commander": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz",
"integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true,
"engines": {
"node": ">=14"
@ -1765,15 +1765,15 @@
}
},
"node_modules/eslint": {
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@eslint/js": "8.48.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -3997,14 +3997,14 @@
}
},
"node_modules/npm-check-updates": {
"version": "16.10.16",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.16.tgz",
"integrity": "sha512-d8mNYce/l8o5RHPE5ZUp2P1zj9poI7KWQCh5AsTIP3EhicONEhc63mLQQv4/nkCsMb3wCrikx6YOo4BOwN4+1w==",
"version": "16.13.2",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.2.tgz",
"integrity": "sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==",
"dev": true,
"dependencies": {
"chalk": "^5.3.0",
"cli-table3": "^0.6.3",
"commander": "^10.0.0",
"commander": "^10.0.1",
"fast-memoize": "^2.5.2",
"find-up": "5.0.0",
"fp-and-or": "^0.1.3",
@ -4016,6 +4016,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
"make-fetch-happen": "^11.1.1",
"minimatch": "^9.0.3",
"p-map": "^4.0.0",
"pacote": "15.2.0",
@ -4025,7 +4026,7 @@
"rc-config-loader": "^4.1.3",
"remote-git-tags": "^3.0.0",
"rimraf": "^5.0.1",
"semver": "^7.5.3",
"semver": "^7.5.4",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",
@ -7088,9 +7089,9 @@
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
},
"commander": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz",
"integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true
},
"concat-map": {
@ -7372,15 +7373,15 @@
"dev": true
},
"eslint": {
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@eslint/js": "8.48.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -8987,14 +8988,14 @@
}
},
"npm-check-updates": {
"version": "16.10.16",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.16.tgz",
"integrity": "sha512-d8mNYce/l8o5RHPE5ZUp2P1zj9poI7KWQCh5AsTIP3EhicONEhc63mLQQv4/nkCsMb3wCrikx6YOo4BOwN4+1w==",
"version": "16.13.2",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.2.tgz",
"integrity": "sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==",
"dev": true,
"requires": {
"chalk": "^5.3.0",
"cli-table3": "^0.6.3",
"commander": "^10.0.0",
"commander": "^10.0.1",
"fast-memoize": "^2.5.2",
"find-up": "5.0.0",
"fp-and-or": "^0.1.3",
@ -9006,6 +9007,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
"make-fetch-happen": "^11.1.1",
"minimatch": "^9.0.3",
"p-map": "^4.0.0",
"pacote": "15.2.0",
@ -9015,7 +9017,7 @@
"rc-config-loader": "^4.1.3",
"remote-git-tags": "^3.0.0",
"rimraf": "^5.0.1",
"semver": "^7.5.3",
"semver": "^7.5.4",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",

View file

@ -14,11 +14,11 @@
"luxon": "3.4.0"
},
"devDependencies": {
"eslint": "8.47.0",
"eslint": "8.48.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"
"npm-check-updates": "16.13.2"
}
}

View file

@ -10,7 +10,7 @@
"license": "ISC",
"dependencies": {
"@octokit/core": "^4.2.4",
"luxon": "^3.4.2"
"luxon": "^3.4.3"
}
},
"node_modules/@octokit/auth-token": {
@ -141,9 +141,9 @@
}
},
"node_modules/luxon": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.2.tgz",
"integrity": "sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA==",
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz",
"integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==",
"engines": {
"node": ">=12"
}
@ -315,9 +315,9 @@
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
},
"luxon": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.2.tgz",
"integrity": "sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA=="
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz",
"integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg=="
},
"node-fetch": {
"version": "2.6.7",

View file

@ -11,6 +11,6 @@
"license": "ISC",
"dependencies": {
"@octokit/core": "^4.2.4",
"luxon": "^3.4.2"
"luxon": "^3.4.3"
}
}

View file

@ -1,6 +1,8 @@
# Dockerfile for RabbitMQ worker
#
FROM rabbitmq:3-alpine
ARG RABBITMQ_VERSION=3.11-alpine
FROM rabbitmq:${RABBITMQ_VERSION}
LABEL maintainer="IETF Tools Team <tools-discuss@ietf.org>"
# Copy the startup file

View file

@ -0,0 +1,90 @@
# Generated by Django 4.2.4 on 2023-08-23 21:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("doc", "0006_statements"),
]
operations = [
migrations.AlterField(
model_name="docevent",
name="type",
field=models.CharField(
choices=[
("new_revision", "Added new revision"),
("new_submission", "Uploaded new revision"),
("changed_document", "Changed document metadata"),
("added_comment", "Added comment"),
("added_message", "Added message"),
("edited_authors", "Edited the documents author list"),
("deleted", "Deleted document"),
("changed_state", "Changed state"),
("changed_stream", "Changed document stream"),
("expired_document", "Expired document"),
("extended_expiry", "Extended expiry of document"),
("requested_resurrect", "Requested resurrect"),
("completed_resurrect", "Completed resurrect"),
("changed_consensus", "Changed consensus"),
("published_rfc", "Published RFC"),
(
"added_suggested_replaces",
"Added suggested replacement relationships",
),
(
"reviewed_suggested_replaces",
"Reviewed suggested replacement relationships",
),
("changed_action_holders", "Changed action holders for document"),
("changed_group", "Changed group"),
("changed_protocol_writeup", "Changed protocol writeup"),
("changed_charter_milestone", "Changed charter milestone"),
("initial_review", "Set initial review time"),
("changed_review_announcement", "Changed WG Review text"),
("changed_action_announcement", "Changed WG Action text"),
("started_iesg_process", "Started IESG process on document"),
("created_ballot", "Created ballot"),
("closed_ballot", "Closed ballot"),
("sent_ballot_announcement", "Sent ballot announcement"),
("changed_ballot_position", "Changed ballot position"),
("changed_ballot_approval_text", "Changed ballot approval text"),
("changed_ballot_writeup_text", "Changed ballot writeup text"),
("changed_rfc_editor_note_text", "Changed RFC Editor Note text"),
("changed_last_call_text", "Changed last call text"),
("requested_last_call", "Requested last call"),
("sent_last_call", "Sent last call"),
("scheduled_for_telechat", "Scheduled for telechat"),
("iesg_approved", "IESG approved document (no problem)"),
("iesg_disapproved", "IESG disapproved document (do not publish)"),
("approved_in_minute", "Approved in minute"),
("iana_review", "IANA review comment"),
("rfc_in_iana_registry", "RFC is in IANA registry"),
(
"rfc_editor_received_announcement",
"Announcement was received by RFC Editor",
),
("requested_publication", "Publication at RFC Editor requested"),
(
"sync_from_rfc_editor",
"Received updated information from RFC Editor",
),
("requested_review", "Requested review"),
("assigned_review_request", "Assigned review request"),
("closed_review_request", "Closed review request"),
("closed_review_assignment", "Closed review assignment"),
("downref_approved", "Downref approved"),
("posted_related_ipr", "Posted related IPR"),
("removed_related_ipr", "Removed related IPR"),
(
"removed_objfalse_related_ipr",
"Removed Objectively False related IPR",
),
("changed_editors", "Changed BOF Request editors"),
("published_statement", "Published statement"),
],
max_length=50,
),
),
]

View file

@ -956,7 +956,7 @@ class Document(DocumentInfo):
def displayname_with_link(self):
return mark_safe('<a href="%s">%s-%s</a>' % (self.get_absolute_url(), self.name , self.rev))
def ipr(self,states=('posted','removed')):
def ipr(self,states=settings.PUBLISH_IPR_STATES):
"""Returns the IPR disclosures against this document (as a queryset over IprDocRel)."""
# from ietf.ipr.models import IprDocRel
# return IprDocRel.objects.filter(document__docs=self, disclosure__state__in=states) # TODO - clear these comments away
@ -972,11 +972,11 @@ class Document(DocumentInfo):
document__in=[self]
+ self.all_related_that_doc(("obs", "replaces"))
)
.filter(disclosure__state__in=("posted", "removed"))
.filter(disclosure__state__in=settings.PUBLISH_IPR_STATES)
.values_list("disclosure", flat=True)
.distinct()
)
return iprs
def future_presentations(self):
""" returns related SessionPresentation objects for meetings that
@ -1259,6 +1259,7 @@ EVENT_TYPES = [
# IPR events
("posted_related_ipr", "Posted related IPR"),
("removed_related_ipr", "Removed related IPR"),
("removed_objfalse_related_ipr", "Removed Objectively False related IPR"),
# Bofreq Editor events
("changed_editors", "Changed BOF Request editors"),

View file

@ -426,9 +426,50 @@ class ReviewTests(TestCase):
r = self.client.get(req_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, reject_url)
# anonymous user should not be able to reject
self.client.logout()
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 302) # forwards to login page
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "accepted")
# unrelated person should not be able to reject
other_person = PersonFactory()
login_testing_unauthorized(self, other_person.user.username, reject_url)
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 403)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "accepted")
# Check that user can reject it
login_testing_unauthorized(self, assignment.reviewer.person.user.username, reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, escape(assignment.reviewer.person.name))
self.assertNotContains(r, 'can not be rejected')
self.assertContains(r, '<button type="submit"')
# reject
empty_outbox()
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 302)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "rejected")
self.assertNotEqual(assignment.completed_on,None)
e = doc.latest_event()
self.assertEqual(e.type, "closed_review_assignment")
self.assertTrue("rejected" in e.desc)
self.assertEqual(len(outbox), 1)
self.assertNotIn(assignment.reviewer.address, outbox[0]["To"])
self.assertIn("<reviewsecretary@example.com>", outbox[0]["To"])
self.assertTrue("Test message" in get_payload_text(outbox[0]))
self.client.logout()
# get reject page
# Secretary can also reject it
assignment.state_id = 'assigned'
assignment.save()
login_testing_unauthorized(self, "reviewsecretary", reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
@ -452,12 +493,17 @@ class ReviewTests(TestCase):
self.assertNotIn("<reviewsecretary@example.com>", outbox[0]["To"])
self.assertTrue("Test message" in get_payload_text(outbox[0]))
# try again, but now with an expired review request, which should not be allowed (#2277)
# try again, but now with an expired review request,
# which should not be allowed (#2277)
assignment.state_id = 'assigned'
assignment.save()
review_req.deadline = datetime.date(2019, 1, 1)
review_req.save()
self.client.logout()
# Login as reviewer to do this test, so it should fail, as the
# request is past deadline
login_testing_unauthorized(self, assignment.reviewer.person.user.username, reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, escape(assignment.reviewer.person.name))
@ -469,10 +515,67 @@ class ReviewTests(TestCase):
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 200)
self.assertContains(r, 'can not be rejected')
self.client.logout()
# Change settings so that even the reviewer should
# be allowed to reject the request even after past deadline
m = apps.get_model('review', 'ReviewTeamSettings')
for row in m.objects.all():
if row.group.upcase_acronym == review_team.upcase_acronym:
row.allow_reviewer_to_reject_after_deadline = True
row.save(update_fields=['allow_reviewer_to_reject_after_deadline'])
# Test again as user
login_testing_unauthorized(self, assignment.reviewer.person.user.username, reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, escape(assignment.reviewer.person.name))
self.assertNotContains(r, 'can not be rejected')
self.assertContains(r, '<button type="submit"')
# actually reject
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 302)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "assigned")
self.assertEqual(len(outbox), 0)
self.assertEqual(assignment.state_id, "rejected")
self.assertNotEqual(len(outbox), 0)
self.client.logout()
# Log in as secretary and that should still allow rejecting the review
assignment.state_id = 'assigned'
assignment.save()
login_testing_unauthorized(self, "reviewsecretary", reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, escape(assignment.reviewer.person.name))
self.assertNotContains(r, 'can not be rejected')
self.assertContains(r, '<button type="submit"')
# actually reject
empty_outbox()
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 302)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "rejected")
self.assertNotEqual(len(outbox), 0)
# Revert the setting of allow_reviewer_to_reject_after_deadline
# This should not affect the secretary's ability to reject.
m = apps.get_model('review', 'ReviewTeamSettings')
for row in m.objects.all():
if row.group.upcase_acronym == review_team.upcase_acronym:
row.allow_reviewer_to_reject_after_deadline = False
row.save(update_fields=['allow_reviewer_to_reject_after_deadline'])
assignment.state_id = 'assigned'
assignment.save()
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, escape(assignment.reviewer.person.name))
self.assertNotContains(r, 'can not be rejected')
self.assertContains(r, '<button type="submit"')
def make_test_mbox_tarball(self, review_req):
mbox_path = os.path.join(self.review_dir, "testmbox.tar.gz")

View file

@ -154,10 +154,24 @@ class ActionHoldersTests(TestCase):
self.assertGreaterEqual(doc.documentactionholder_set.get(person=self.ad).time_added, right_now)
def test_update_action_holders_add_tag_need_rev(self):
"""Adding need-rev tag adds authors as action holders"""
"""Adding need-rev tag drops AD and adds authors as action holders"""
doc = self.doc_in_iesg_state('pub-req')
first_author = self.authors[0]
doc.action_holders.add(first_author)
doc.action_holders.add(doc.ad)
self.assertCountEqual(doc.action_holders.all(), [first_author, doc.ad])
self.update_doc_state(doc,
doc.get_state('draft-iesg'),
add_tags=['need-rev'],
remove_tags=None)
self.assertCountEqual(doc.action_holders.all(), self.authors)
self.assertNotIn(self.ad, doc.action_holders.all())
# Check case where an author is ad
doc = self.doc_in_iesg_state('pub-req')
doc.ad = first_author
doc.save()
doc.action_holders.add(first_author)
self.assertCountEqual(doc.action_holders.all(), [first_author])
self.update_doc_state(doc,
doc.get_state('draft-iesg'),
@ -175,6 +189,12 @@ class ActionHoldersTests(TestCase):
remove_tags=None)
self.assertCountEqual(doc.action_holders.all(), self.authors)
def test_update_action_holders_add_tag_ad_f_up(self):
doc = self.doc_in_iesg_state('pub-req')
self.assertEqual(doc.action_holders.count(), 0)
self.update_doc_state(doc, doc.get_state('draft-iesg'), add_tags=['ad-f-up'])
self.assertCountEqual(doc.action_holders.all(), [self.ad])
def test_update_action_holders_remove_tag_need_rev(self):
"""Removing need-rev tag drops authors as action holders"""
doc = self.doc_in_iesg_state('pub-req')
@ -189,13 +209,14 @@ class ActionHoldersTests(TestCase):
def test_update_action_holders_add_tag_need_rev_ignores_non_authors(self):
"""Adding need-rev tag does not affect existing action holders"""
doc = self.doc_in_iesg_state('pub-req')
doc.action_holders.add(self.ad)
self.assertCountEqual(doc.action_holders.all(),[self.ad])
other_person = PersonFactory()
doc.action_holders.add(other_person)
self.assertCountEqual(doc.action_holders.all(),[other_person])
self.update_doc_state(doc,
doc.get_state('draft-iesg'),
add_tags=['need-rev'],
remove_tags=None)
self.assertCountEqual(doc.action_holders.all(), [self.ad] + self.authors)
self.assertCountEqual(doc.action_holders.all(), [other_person] + self.authors)
def test_update_action_holders_remove_tag_need_rev_ignores_non_authors(self):
"""Removing need-rev tag does not affect non-author action holders"""

View file

@ -12,6 +12,7 @@ import re
import textwrap
from collections import defaultdict, namedtuple, Counter
from dataclasses import dataclass
from typing import Union
from zoneinfo import ZoneInfo
@ -460,6 +461,21 @@ def add_action_holder_change_event(doc, by, prev_set, reason=None):
)
@dataclass
class TagSetComparer:
before: set[str]
after: set[str]
def changed(self):
return self.before != self.after
def added(self, tag):
return tag in self.after and tag not in self.before
def removed(self, tag):
return tag in self.before and tag not in self.after
def update_action_holders(doc, prev_state=None, new_state=None, prev_tags=None, new_tags=None):
"""Update the action holders for doc based on state transition
@ -473,34 +489,45 @@ def update_action_holders(doc, prev_state=None, new_state=None, prev_tags=None,
if prev_state and new_state:
assert prev_state.type_id == new_state.type_id
# Convert tags to sets of slugs
prev_tag_slugs = {t.slug for t in (prev_tags or [])}
new_tag_slugs = {t.slug for t in (new_tags or [])}
# Convert tags to sets of slugs
tags = TagSetComparer(
before={t.slug for t in (prev_tags or [])},
after={t.slug for t in (new_tags or [])},
)
# Do nothing if state / tag have not changed
if (prev_state == new_state) and (prev_tag_slugs == new_tag_slugs):
if (prev_state == new_state) and not tags.changed():
return None
# Remember original list of action holders to later check if it changed
prev_set = list(doc.action_holders.all())
# Only draft-iesg states are of interest (for now)
if (prev_state != new_state) and (getattr(new_state, 'type_id') == 'draft-iesg'):
# Update the action holders. To get this right for people with more
# than one relationship to the document, do removals first, then adds.
# Remove outdated action holders
iesg_state_changed = (prev_state != new_state) and (getattr(new_state, "type_id", None) == "draft-iesg")
if iesg_state_changed:
# Clear the action_holders list on a state change. This will reset the age of any that get added back.
doc.action_holders.clear()
if doc.ad and new_state.slug not in DocumentActionHolder.CLEAR_ACTION_HOLDERS_STATES:
# Default to responsible AD for states other than these
if tags.removed("need-rev"):
# Removed the 'need-rev' tag - drop authors from the action holders list
DocumentActionHolder.objects.filter(document=doc, person__in=doc.authors()).delete()
elif tags.added("need-rev"):
# Remove the AD if we're asking for a new revision
DocumentActionHolder.objects.filter(document=doc, person=doc.ad).delete()
# Add new action holders
if doc.ad:
# AD is an action holder unless specified otherwise for the new state
if iesg_state_changed and new_state.slug not in DocumentActionHolder.CLEAR_ACTION_HOLDERS_STATES:
doc.action_holders.add(doc.ad)
if prev_tag_slugs != new_tag_slugs:
# If we have added or removed the need-rev tag, add or remove authors as action holders
if ('need-rev' in prev_tag_slugs) and ('need-rev' not in new_tag_slugs):
# Removed the 'need-rev' tag - drop authors from the action holders list
DocumentActionHolder.objects.filter(document=doc, person__in=doc.authors()).delete()
elif ('need-rev' not in prev_tag_slugs) and ('need-rev' in new_tag_slugs):
# Added the 'need-rev' tag - add authors to the action holders list
for auth in doc.authors():
if not doc.action_holders.filter(pk=auth.pk).exists():
doc.action_holders.add(auth)
# If AD follow-up is needed, make sure they are an action holder
if tags.added("ad-f-up"):
doc.action_holders.add(doc.ad)
# Authors get the action if a revision is needed
if tags.added("need-rev"):
for auth in doc.authors():
doc.action_holders.add(auth)
# Now create an event if we changed the set
return add_action_holder_change_event(

View file

@ -354,8 +354,13 @@ class RejectReviewerAssignmentForm(forms.Form):
def reject_reviewer_assignment(request, name, assignment_id):
doc = get_object_or_404(Document, name=name)
review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
review_request_past_deadline = review_assignment.review_request.deadline < date_today(DEADLINE_TZINFO)
allow_reject_request = True
# Only check deadline if the group does not allow rejecting always
if not review_assignment.review_request.team.reviewteamsettings.allow_reviewer_to_reject_after_deadline:
if review_assignment.review_request.deadline < date_today(DEADLINE_TZINFO):
allow_reject_request = False
if not review_assignment.reviewer:
return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
@ -365,7 +370,12 @@ def reject_reviewer_assignment(request, name, assignment_id):
if not (is_reviewer or can_manage_request):
permission_denied(request, "You do not have permission to perform this action")
if request.method == "POST" and request.POST.get("action") == "reject" and not review_request_past_deadline:
# Secretary or whoever can manage review request, has permission
# to reject requests even if the deadline is in the past
if can_manage_request:
allow_reject_request = True
if request.method == "POST" and request.POST.get("action") == "reject" and allow_reject_request:
form = RejectReviewerAssignmentForm(request.POST)
if form.is_valid():
# reject the assignment
@ -406,7 +416,7 @@ def reject_reviewer_assignment(request, name, assignment_id):
'review_req': review_assignment.review_request,
'assignments': review_assignment.review_request.reviewassignment_set.all(),
'form': form,
'review_request_past_deadline': review_request_past_deadline,
'allow_reject_request': allow_reject_request,
})
@login_required

View file

@ -749,6 +749,7 @@ def docs_for_ad(request, name):
if (
not ballot
or doc.get_state_slug("draft") == "repl"
or doc.get_state_slug("draft-iesg") == "defer"
or (doc.telechat_date() and doc.telechat_date() > timezone.now().date())
):
continue
@ -801,7 +802,7 @@ def drafts_in_iesg_process(request):
def recent_drafts(request, days=7):
slowcache = caches['slowpages']
cache_key = f'recentdraftsview{days}'
cache_key = f'recentdraftsview{days}'
cached_val = slowcache.get(cache_key)
if not cached_val:
since = timezone.now()-datetime.timedelta(days=days)

View file

@ -1,7 +1,5 @@
# Copyright The IETF Trust 2007, All Rights Reserved
import os
from django.shortcuts import get_object_or_404, render
import debug # pyflakes:ignore
@ -30,11 +28,3 @@ def state(request, doc, type=None):
statetype = get_object_or_404(StateType, slug=slug)
states = State.objects.filter(used=True, type=statetype).order_by('order')
return render(request, 'help/states.html', {"doc": doc, "type": statetype, "states":states} )
def environment(request):
if request.is_secure():
os.environ['SCHEME'] = "https"
else:
os.environ['SCHEME'] = "http"
os.environ["URL"] = request.build_absolute_uri(".")
return render(request, 'help/environment.html', {"env": os.environ} )

View file

@ -1,7 +1,8 @@
# Copyright The IETF Trust 2007-2020, All Rights Reserved
# Copyright The IETF Trust 2007-2023, All Rights Reserved
# -*- coding: utf-8 -*-
from django.conf import settings
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Atom1Feed
from django.urls import reverse_lazy
@ -19,7 +20,7 @@ class LatestIprDisclosuresFeed(Feed):
feed_url = "/feed/ipr/"
def items(self):
return IprDisclosureBase.objects.filter(state__in=('posted','removed')).order_by('-time')[:30]
return IprDisclosureBase.objects.filter(state__in=settings.PUBLISH_IPR_STATES).order_by('-time')[:30]
def item_title(self, item):
return mark_safe(item.title)

View file

@ -1,4 +1,4 @@
# Copyright The IETF Trust 2007-2020, All Rights Reserved
# Copyright The IETF Trust 2007-2023, All Rights Reserved
# -*- coding: utf-8 -*-
@ -231,6 +231,7 @@ class IprEvent(models.Model):
event_type_map = {
'posted': 'posted_related_ipr',
'removed': 'removed_related_ipr',
'removed_objfalse': 'removed_objfalse_related_ipr',
}
if self.type_id in event_type_map:
for doc in self.disclosure.docs.distinct():

View file

@ -1,11 +1,12 @@
# Copyright The IETF Trust 2007-2019, All Rights Reserved
# Copyright The IETF Trust 2007-2023, All Rights Reserved
#
from django.conf import settings
from django.contrib.sitemaps import GenericSitemap
from ietf.ipr.models import IprDisclosureBase
# changefreq is "never except when it gets updated or withdrawn"
# so skip giving one
queryset = IprDisclosureBase.objects.filter(state__in=('posted','removed'))
queryset = IprDisclosureBase.objects.filter(state__in=settings.PUBLISH_IPR_STATES)
archive = {'queryset':queryset, 'date_field': 'time', 'allow_empty':True }
IPRMap = GenericSitemap(archive) # type: ignore

View file

@ -126,6 +126,11 @@ class IprTests(TestCase):
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertContains(r, 'This IPR disclosure was removed')
def test_show_removed_objfalse(self):
ipr = HolderIprDisclosureFactory(state_id='removed_objfalse')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertContains(r, 'This IPR disclosure was removed as objectively false')
def test_ipr_history(self):
ipr = HolderIprDisclosureFactory()
r = self.client.get(urlreverse("ietf.ipr.views.history", kwargs=dict(id=ipr.pk)))
@ -205,6 +210,24 @@ class IprTests(TestCase):
r = self.client.get(url + "?submit=iprtitle&iprtitle=%s" % quote(ipr.title))
self.assertContains(r, ipr.title)
def test_search_null_characters(self):
"""IPR search gracefully rejects null characters in parameters"""
# Not a combinatorially exhaustive set, but tries to exercise all the parameters
bad_params = [
"option=document_search&document_search=draft-\x00stuff"
"submit=dra\x00ft",
"submit=draft&id=some\x00id",
"submit=draft&id_document_tag=some\x00id",
"submit=draft&id=someid&state=re\x00moved",
"submit=draft&id=someid&state=posted&state=re\x00moved",
"submit=draft&id=someid&state=removed&draft=draft-no\x00tvalid",
"submit=rfc&rfc=rfc\x00123",
]
url = urlreverse("ietf.ipr.views.search")
for query_params in bad_params:
r = self.client.get(f"{url}?{query_params}")
self.assertEqual(r.status_code, 400, f"querystring '{query_params}' should be rejected")
def test_feed(self):
ipr = HolderIprDisclosureFactory()
r = self.client.get("/feed/ipr/")
@ -577,7 +600,7 @@ I would like to revoke this declaration.
self.client.login(username="secretary", password="secretary+password")
# test for presence of pending ipr
num = IprDisclosureBase.objects.filter(state__in=('removed','rejected')).count()
num = IprDisclosureBase.objects.filter(state__in=('removed','removed_objfalse','rejected')).count()
r = self.client.get(url)
self.assertEqual(r.status_code,200)
@ -786,18 +809,28 @@ Subject: test
'New Document already has a "posted_related_ipr" DocEvent')
self.assertEqual(0, doc.docevent_set.filter(type='removed_related_ipr').count(),
'New Document already has a "removed_related_ipr" DocEvent')
self.assertEqual(0, doc.docevent_set.filter(type='removed_objfalse_related_ipr').count(),
'New Document already has a "removed_objfalse_related_ipr" DocEvent')
# A 'posted' IprEvent must create a corresponding DocEvent
IprEventFactory(type_id='posted', disclosure=ipr)
self.assertEqual(1, doc.docevent_set.filter(type='posted_related_ipr').count(),
'Creating "posted" IprEvent did not create a "posted_related_ipr" DocEvent')
self.assertEqual(0, doc.docevent_set.filter(type='removed_related_ipr').count(),
'Creating "posted" IprEvent created a "removed_related_ipr" DocEvent')
self.assertEqual(0, doc.docevent_set.filter(type='removed_objfalse_related_ipr').count(),
'Creating "posted" IprEvent created a "removed_objfalse_related_ipr" DocEvent')
# A 'removed' IprEvent must create a corresponding DocEvent
IprEventFactory(type_id='removed', disclosure=ipr)
self.assertEqual(1, doc.docevent_set.filter(type='posted_related_ipr').count(),
'Creating "removed" IprEvent created a "posted_related_ipr" DocEvent')
self.assertEqual(1, doc.docevent_set.filter(type='removed_related_ipr').count(),
'Creating "removed" IprEvent did not create a "removed_related_ipr" DocEvent')
# A 'removed_objfalse' IprEvent must create a corresponding DocEvent
IprEventFactory(type_id='removed_objfalse', disclosure=ipr)
self.assertEqual(1, doc.docevent_set.filter(type='posted_related_ipr').count(),
'Creating "removed_objfalse" IprEvent created a "posted_related_ipr" DocEvent')
self.assertEqual(1, doc.docevent_set.filter(type='removed_objfalse_related_ipr').count(),
'Creating "removed_objfalse" IprEvent did not create a "removed_objfalse_related_ipr" DocEvent')
# The DocEvent descriptions must refer to the IprEvents
posted_docevent = doc.docevent_set.filter(type='posted_related_ipr').first()
self.assertIn(ipr.title, posted_docevent.desc,
@ -805,6 +838,9 @@ Subject: test
removed_docevent = doc.docevent_set.filter(type='removed_related_ipr').first()
self.assertIn(ipr.title, removed_docevent.desc,
'IprDisclosure title does not appear in DocEvent desc when removed')
removed_objfalse_docevent = doc.docevent_set.filter(type='removed_objfalse_related_ipr').first()
self.assertIn(ipr.title, removed_objfalse_docevent.desc,
'IprDisclosure title does not appear in DocEvent desc when removed as objectively false')
def test_no_revisions_message(self):
draft = WgDraftFactory(rev="02")

View file

@ -1,4 +1,4 @@
# Copyright The IETF Trust 2007-2022, All Rights Reserved
# Copyright The IETF Trust 2007-2023, All Rights Reserved
# -*- coding: utf-8 -*-
@ -10,7 +10,7 @@ from django.contrib import messages
from django.db.models import Q
from django.forms.models import inlineformset_factory, model_to_dict
from django.forms.formsets import formset_factory
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponseBadRequest
from django.shortcuts import render, get_object_or_404, redirect
from django.template.loader import render_to_string
from django.urls import reverse as urlreverse
@ -272,7 +272,7 @@ def add_email(request, id):
@role_required('Secretariat',)
def admin(request, state):
"""Administrative disclosure listing. For non-posted disclosures"""
states = IprDisclosureStateName.objects.filter(slug__in=[state, "rejected"] if state == "removed" else [state])
states = IprDisclosureStateName.objects.filter(slug__in=[state, "rejected", "removed_objfalse"] if state == "removed" else [state])
if not states:
raise Http404
@ -632,11 +632,16 @@ def post(request, id):
def search(request):
search_type = request.GET.get("submit")
if search_type and "\x00" in search_type:
return HttpResponseBadRequest("Null characters are not allowed")
# query field
q = ''
# legacy support
if not search_type and request.GET.get("option", None) == "document_search":
docname = request.GET.get("document_search", "")
if docname and "\x00" in docname:
return HttpResponseBadRequest("Null characters are not allowed")
if docname.startswith("draft-"):
search_type = "draft"
q = docname
@ -646,18 +651,24 @@ def search(request):
if search_type:
form = SearchForm(request.GET)
docid = request.GET.get("id") or request.GET.get("id_document_tag") or ""
if docid and "\x00" in docid:
return HttpResponseBadRequest("Null characters are not allowed")
docs = doc = None
iprs = []
related_iprs = []
# set states
states = request.GET.getlist('state',('posted','removed'))
states = request.GET.getlist('state',settings.PUBLISH_IPR_STATES)
if any("\x00" in state for state in states if state):
return HttpResponseBadRequest("Null characters are not allowed")
if states == ['all']:
states = IprDisclosureStateName.objects.values_list('slug',flat=True)
# get query field
if request.GET.get(search_type):
q = request.GET.get(search_type)
if q and "\x00" in q:
return HttpResponseBadRequest("Null characters are not allowed")
if q or docid:
# Search by RFC number or draft-identifier
@ -781,7 +792,7 @@ def show(request, id):
"""View of individual declaration"""
ipr = get_object_or_404(IprDisclosureBase, id=id).get_child()
if not has_role(request.user, 'Secretariat'):
if ipr.state.slug == 'removed':
if ipr.state.slug in ['removed', 'removed_objfalse']:
return render(request, "ipr/removed.html", {
'ipr': ipr
})
@ -804,10 +815,10 @@ def show(request, id):
def showlist(request):
"""List all disclosures by type, posted only"""
generic = GenericIprDisclosure.objects.filter(state__in=('posted','removed')).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
specific = HolderIprDisclosure.objects.filter(state__in=('posted','removed')).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
thirdpty = ThirdPartyIprDisclosure.objects.filter(state__in=('posted','removed')).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
nondocspecific = NonDocSpecificIprDisclosure.objects.filter(state__in=('posted','removed')).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
generic = GenericIprDisclosure.objects.filter(state__in=settings.PUBLISH_IPR_STATES).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
specific = HolderIprDisclosure.objects.filter(state__in=settings.PUBLISH_IPR_STATES).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
thirdpty = ThirdPartyIprDisclosure.objects.filter(state__in=settings.PUBLISH_IPR_STATES).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
nondocspecific = NonDocSpecificIprDisclosure.objects.filter(state__in=settings.PUBLISH_IPR_STATES).prefetch_related('relatedipr_source_set__target','relatedipr_target_set__source').order_by('-time')
# combine nondocspecific with generic and re-sort
generic = itertools.chain(generic,nondocspecific)

View file

@ -12154,6 +12154,16 @@
"model": "name.iprdisclosurestatename",
"pk": "removed"
},
{
"fields": {
"desc": "",
"name": "Removed Objectively False",
"order": 5,
"used": true
},
"model": "name.iprdisclosurestatename",
"pk": "removed_objfalse"
},
{
"fields": {
"desc": "",
@ -12264,6 +12274,16 @@
"model": "name.ipreventtypename",
"pk": "removed"
},
{
"fields": {
"desc": "",
"name": "Removed Objectively False",
"order": 0,
"used": true
},
"model": "name.ipreventtypename",
"pk": "removed_objfalse"
},
{
"fields": {
"desc": "",

View file

@ -0,0 +1,24 @@
# Copyright The IETF Trust 2023, All Rights Reserved
from django.db import migrations
def forward(apps, schema_editor):
IprDisclosureStateName = apps.get_model("name", "IprDisclosureStateName")
IprDisclosureStateName.objects.create(slug="removed_objfalse", name="Removed Objectively False", order=5)
IprEventTypeName = apps.get_model("name", "IprEventTypeName")
IprEventTypeName.objects.create(slug="removed_objfalse", name="Removed Objectively False")
def reverse(apps, schema_editor):
IprDisclosureStateName = apps.get_model("name", "IprDisclosureStateName")
IprDisclosureStateName.objects.filter(slug="removed_objfalse").delete()
IprEventTypeName = apps.get_model("name", "IprEventTypeName")
IprEventTypeName.objects.filter(slug="removed_objfalse").delete()
class Migration(migrations.Migration):
dependencies = [
("name", "0007_appeal_artifact_typename"),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2023-03-25 06:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('review', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='reviewteamsettings',
name='allow_reviewer_to_reject_after_deadline',
field=models.BooleanField(default=False, verbose_name='Allow reviewer to reject request after deadline.'),
),
]

View file

@ -191,6 +191,7 @@ class ReviewTeamSettings(models.Model):
"""Holds configuration specific to groups that are review teams"""
group = OneToOneField(Group)
autosuggest = models.BooleanField(default=True, verbose_name="Automatically suggest possible review requests")
allow_reviewer_to_reject_after_deadline = models.BooleanField(default=False, verbose_name="Allow reviewer to reject request after deadline.")
reviewer_queue_policy = models.ForeignKey(ReviewerQueuePolicyName, default='RotateAlphabetically', on_delete=models.PROTECT)
review_types = models.ManyToManyField(ReviewTypeName, default=get_default_review_types)
review_results = models.ManyToManyField(ReviewResultName, default=get_default_review_results, related_name='reviewteamsettings_review_results_set')

View file

@ -1269,6 +1269,8 @@ if 'CACHES' not in locals():
},
}
PUBLISH_IPR_STATES = ['posted', 'removed', 'removed_objfalse']
# We provide a secret key only for test and development modes. It's
# absolutely vital that django fails to start in production mode unless a
# secret key has been provided elsewhere, not in this file which is

View file

@ -20,7 +20,7 @@ function replace_with_internal(table, internal_table, i) {
.replaceWith(internal_table[i]
.children("table")
.children("tbody")
.clone());
.clone(true));
}
function field_magic(i, e, fields) {
@ -160,10 +160,10 @@ $(document)
// create the internal table and add list.js to them
var thead = $(this)
.siblings("thead:first")
.clone();
.clone(true);
var tbody = $(this)
.clone();
.clone(true);
var tbody_rows = $(tbody)
.find("tr")
@ -178,7 +178,7 @@ $(document)
var parent = $(table)
.parent()
.clone();
.clone(true);
$(parent)
.children("table")
@ -251,6 +251,7 @@ $(document)
$.each(list_instance, (i, e) => {
e.on("sortComplete", function () {
replace_with_internal(table, internal_table, i);
$(table).find("[data-bs-original-title]").tooltip();
if (i == list_instance.length - 1) {
$(table)
.find("thead:first tr")

View file

@ -1,17 +1,14 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% origin %}
{% load django_bootstrap5 %}
{% block title %}Remove tracking of document {{ name }}{% endblock %}
{% bootstrap_messages %}
<form method="post">
{% csrf_token %}
<p>
Remove {{ name }} from the list?
</p>
<button type="submit"
class="btn btn-primary"
value="Remove tracking of document">
Remove tracking of document
</button>
</form>
{% block content %}
<form method="post">
{% csrf_token %}
<p>
Remove {{ name }} from the list?
</p>
<button type="submit" class="btn btn-primary" value="Remove tracking of document">Remove tracking of document</button>
</form>
{% endblock %}

View file

@ -279,7 +279,7 @@
</a>
</th>
<td class="edit">
{% if iesg_state.slug != 'idexists' and iesg_state.slug != 'dead' and can_edit %}
{% if iesg_state.slug != 'idexists' and iesg_state.slug != 'dead' and can_edit or user|has_role:"Secretariat" %}
<a class="btn btn-primary btn-sm"
href="{% url 'ietf.doc.views_draft.change_state' name=doc.name %}">
Edit
@ -684,7 +684,7 @@
<ul class="dropdown-menu" role="menu">
<li role="presentation">
<a class="dropdown-item"
href="https://mailarchive.ietf.org/arch/search?q=%22{{ doc.name }}%22"
href="https://mailarchive.ietf.org/arch/search/?q=%22{{ doc.name }}%22"
rel="nofollow"
target="_blank">
IETF Mail Archive

View file

@ -49,8 +49,16 @@
<a href="{% url 'ietf.mailtrigger.views.show_triggers' trigger %}"
title="{{ desc }}">{{ trigger }}</a>
</td>
<td>{{ to|join:', '|linkify }}</td>
<td>{{ cc|join:', '|linkify }}</td>
<td>
{% for addr in to %}
{{ addr|linkify }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</td>
<td>
{% for addr in cc %}
{{ addr|linkify }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{# Copyright The IETF Trust 2015-2023, All Rights Reserved #}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Change state for {{ doc }}{% endblock %}
@ -10,6 +10,13 @@
<br>
<small class="text-body-secondary">{{ doc }}</small>
</h1>
{% if state.slug == "dead" %}
<p class="alert alert-warning my-3">
This document is in IESG state "Dead". It is unusual to change
this to anything other than "AD is watching", and this should
never be used as a replacement for Begin IESG Processing.
</p>
{% endif %}
<a class="btn btn-info my-3"
href="{% url 'ietf.doc.views_help.state_help' type="draft-iesg" %}">Help on states</a>
<form class="mt-3" method="post">

View file

@ -66,9 +66,7 @@
</p>
<p>
If you enter the review below, the review will be sent
to {{ review_to|join:", "|linkify }}
{% if review_cc %}, with a CC to {{ review_cc|join:", "|linkify }}{% endif %}
.
to {% for addr in to %}{{ addr|linkify }}{% if not forloop.last %}, {% endif %}{% endfor %}{% if review_cc %}, with a CC to {% for addr in cc %}{{ addr|linkify }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}.
</p>
{% elif assignment %}
<p>

View file

@ -10,7 +10,7 @@
<small class="text-body-secondary">{{ review_req.doc.name }}</small>
</h1>
{% include "doc/review/request_info.html" %}
{% if not review_request_past_deadline %}
{% if allow_reject_request %}
<p class="alert alert-danger my-3">
Do you want to reject this assignment?
</p>

View file

@ -180,5 +180,5 @@
</form>
<p class="text-center pt-5">
<a class="btn btn-outline-primary btn-sm" href="https://www.ietf.org/search">Search page for www.ietf.org website</a>
<a class="btn btn-outline-primary btn-sm" href="https://mailarchive.ietf.org">Search page for IETF mail list archives</a>
<a class="btn btn-outline-primary btn-sm" href="https://mailarchive.ietf.org/arch/">Search page for IETF mail list archives</a>
</p>

View file

@ -47,8 +47,16 @@
<a href="{% url 'ietf.mailtrigger.views.show_triggers' trigger %}"
title="{{ desc }}">{{ trigger }}</a>
</td>
<td>{{ to|join:', '|unescape|linkify }}</td>
<td>{{ cc|join:', '|unescape|linkify }}</td>
<td>
{% for addr in to %}
{{ addr|linkify }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</td>
<td>
{% for addr in cc %}
{{ addr|linkify }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>

View file

@ -103,6 +103,8 @@
IPR Disclosure ID #{{ item.source.id }},
{% if item.source.state.slug == "removed" %}
"{{ item.source.title }}" (which was removed at the request of the submitter)
{% elif item.source.state.slug == "removed_objfalse" %}
"{{ item.source.title }}" (which was removed as objectively false)
{% else %}
"<a href="{% url "ietf.ipr.views.show" id=item.source.id %}">{{ item.source.title }}</a>"
{% endif %}
@ -122,6 +124,8 @@
IPR Disclosure ID #{{ item.target.id }},
{% if item.target.state.slug == "removed" %}
"{{ item.target.title }}" (which was removed at the request of the submitter)
{% elif item.source.state.slug == "removed_objfalse" %}
"{{ item.source.title }}" (which was removed as objectively false)
{% elif item.target.state.slug == "rejected" %}
"{{ item.target.title }}" (which was rejected)
{% elif item.target.state.slug == "parked" %}

View file

@ -1,11 +1,15 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{# Copyright The IETF Trust 2015-2023, All Rights Reserved #}
{% load origin %}
{% block title %}{{ ipr.title }}{% endblock %}
{% block content %}
{% origin %}
<h1>{{ ipr.title }}</h1>
<p class="alert alert-info my-3">
This IPR disclosure was removed at the submitter's request.
{% if ipr.state.slug == "removed" %}
This IPR disclosure was removed at the submitter's request.
{% elif ipr.state.slug == "removed_objfalse" %}
This IPR disclosure was removed as objectively false.
{% endif %}
</p>
{% endblock %}

View file

@ -28,7 +28,7 @@
<tr>
<td>{{ ipr.time|date:"Y-m-d" }}</td>
<td>{{ ipr.id }}</td>
<td><a href="{% url "ietf.ipr.views.show" id=ipr.id %}">{{ ipr.title }}</a>{% if ipr.state_id == 'removed' %}<span class="badge rounded-pill text-bg-info">Removed</span>{% endif %}
<td><a href="{% url "ietf.ipr.views.show" id=ipr.id %}">{{ ipr.title }}</a>{% if ipr.state_id == 'removed' or ipr.state_id == 'removed_objfalse' %}<span class="badge rounded-pill text-bg-info">Removed</span>{% endif %}
{% if ipr.updates %} <br>(Updates ID#: {% for upd in ipr.updates %}{{upd.target_id}}{% if not forloop.last %}, {% endif %}{% endfor %}){% endif %}
</td>
</tr>
@ -70,7 +70,7 @@
<tr>
<td>{{ ipr.disclosure.time|date:"Y-m-d" }}</td>
<td>{{ ipr.disclosure.id }}</td>
<td><a href="{% url "ietf.ipr.views.show" id=ipr.disclosure.id %}">{{ ipr.disclosure.title }}</a>{% if ipr.disclosure.state_id == 'removed' %} (Removed) {% endif %}
<td><a href="{% url "ietf.ipr.views.show" id=ipr.disclosure.id %}">{{ ipr.disclosure.title }}</a>{% if ipr.disclosure.state_id == 'removed' or ipr.disclosure.state_id == 'removed_objfalse' %} (Removed) {% endif %}
{% if ipr.disclosure.updates %} <br>(Updates ID#: {% for upd in ipr.disclosure.updates %}{{upd.target_id}}{% if not forloop.last %}, {% endif %}{% endfor %}){% endif %}
</td>
</tr>

View file

@ -14,7 +14,6 @@ import debug # pyflakes:ignore
from ietf.doc import views_search
from ietf.group.urls import group_urls, grouptype_urls, stream_urls
from ietf.help import views as help_views
from ietf.ipr.sitemaps import IPRMap
from ietf.liaisons.sitemaps import LiaisonMap
from ietf.utils.urls import url
@ -85,7 +84,6 @@ if settings.SERVER_MODE in ('development', 'test'):
urlpatterns += staticfiles_urlpatterns()
urlpatterns += [
url(r'^_test500/$', server_error), #utils_views.exception),
url(r'^environment/$', help_views.environment),
## maybe preserve some static legacy URLs ?
url(r'^(?P<path>(?:images|css|js)/.*)$', static_view.serve, {'document_root': settings.STATIC_ROOT+'ietf/'}),
]

View file

@ -88,8 +88,9 @@ class XMLDraft(Draft):
# check the anchor next
anchor = ref.get("anchor").lower() # always give back lowercase
label = anchor.rstrip("0123456789") # remove trailing digits
if label in series:
number = int(anchor[len(label) :])
maybe_number = anchor[len(label) :]
if label in series and maybe_number.isdigit():
number = int(maybe_number)
return f"{label}{number}"
# if we couldn't find a match so far, try the seriesInfo

View file

@ -18,7 +18,7 @@
"@fullcalendar/vue3": "6.1.8",
"@popperjs/core": "2.11.8",
"@twuni/emojify": "1.0.2",
"bootstrap": "5.3.0",
"bootstrap": "5.3.1",
"bootstrap-icons": "1.10.5",
"browser-fs-access": "0.34.1",
"caniuse-lite": "1.0.30001519",
@ -26,7 +26,7 @@
"file-saver": "2.0.5",
"highcharts": "11.1.0",
"ical.js": "1.5.0",
"jquery": "3.7.0",
"jquery": "3.7.1",
"js-cookie": "3.0.5",
"list.js": "2.3.1",
"lodash": "4.17.21",
@ -42,7 +42,7 @@
"select2": "4.1.0-rc.0",
"select2-bootstrap-5-theme": "1.3.0",
"send": "0.18.0",
"shepherd.js": "11.1.1",
"shepherd.js": "11.2.0",
"slugify": "1.6.6",
"sortablejs": "1.15.0",
"vanillajs-datepicker": "1.3.4",
@ -54,19 +54,19 @@
"@parcel/optimizer-data-url": "2.9.3",
"@parcel/transformer-inline-string": "2.9.3",
"@parcel/transformer-sass": "2.9.3",
"@rollup/pluginutils": "5.0.3",
"@rollup/pluginutils": "5.0.4",
"@vitejs/plugin-vue": "4.3.3",
"browserlist": "latest",
"c8": "8.0.1",
"eslint": "8.47.0",
"eslint": "8.48.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-cypress": "2.14.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-n": "16.0.2",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-vue": "9.17.0",
"html-validate": "8.2.0",
"html-validate": "8.3.0",
"jquery-migrate": "3.4.1",
"parcel": "2.9.3",
"pug": "3.0.2",

View file

@ -16,13 +16,13 @@
},
"devDependencies": {
"@playwright/test": "1.37.1",
"eslint": "8.47.0",
"eslint": "8.48.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-n": "16.0.2",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"
"npm-check-updates": "16.13.2"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -1197,9 +1197,9 @@
}
},
"node_modules/commander": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz",
"integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true,
"engines": {
"node": ">=14"
@ -1587,15 +1587,15 @@
}
},
"node_modules/eslint": {
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@eslint/js": "8.48.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -1796,9 +1796,9 @@
}
},
"node_modules/eslint-plugin-n": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz",
"integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==",
"version": "16.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz",
"integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
@ -3705,14 +3705,14 @@
}
},
"node_modules/npm-check-updates": {
"version": "16.10.16",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.16.tgz",
"integrity": "sha512-d8mNYce/l8o5RHPE5ZUp2P1zj9poI7KWQCh5AsTIP3EhicONEhc63mLQQv4/nkCsMb3wCrikx6YOo4BOwN4+1w==",
"version": "16.13.2",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.2.tgz",
"integrity": "sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==",
"dev": true,
"dependencies": {
"chalk": "^5.3.0",
"cli-table3": "^0.6.3",
"commander": "^10.0.0",
"commander": "^10.0.1",
"fast-memoize": "^2.5.2",
"find-up": "5.0.0",
"fp-and-or": "^0.1.3",
@ -3724,6 +3724,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
"make-fetch-happen": "^11.1.1",
"minimatch": "^9.0.3",
"p-map": "^4.0.0",
"pacote": "15.2.0",
@ -3733,7 +3734,7 @@
"rc-config-loader": "^4.1.3",
"remote-git-tags": "^3.0.0",
"rimraf": "^5.0.1",
"semver": "^7.5.3",
"semver": "^7.5.4",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",
@ -4787,9 +4788,9 @@
"integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
},
"node_modules/semver": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
"integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@ -6561,9 +6562,9 @@
"dev": true
},
"commander": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz",
"integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true
},
"concat-map": {
@ -6858,15 +6859,15 @@
"dev": true
},
"eslint": {
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@eslint/js": "8.48.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -7013,9 +7014,9 @@
}
},
"eslint-plugin-n": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz",
"integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==",
"version": "16.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz",
"integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.4.0",
@ -8409,14 +8410,14 @@
}
},
"npm-check-updates": {
"version": "16.10.16",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.16.tgz",
"integrity": "sha512-d8mNYce/l8o5RHPE5ZUp2P1zj9poI7KWQCh5AsTIP3EhicONEhc63mLQQv4/nkCsMb3wCrikx6YOo4BOwN4+1w==",
"version": "16.13.2",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.2.tgz",
"integrity": "sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==",
"dev": true,
"requires": {
"chalk": "^5.3.0",
"cli-table3": "^0.6.3",
"commander": "^10.0.0",
"commander": "^10.0.1",
"fast-memoize": "^2.5.2",
"find-up": "5.0.0",
"fp-and-or": "^0.1.3",
@ -8428,6 +8429,7 @@
"json-parse-helpfulerror": "^1.0.3",
"jsonlines": "^0.1.1",
"lodash": "^4.17.21",
"make-fetch-happen": "^11.1.1",
"minimatch": "^9.0.3",
"p-map": "^4.0.0",
"pacote": "15.2.0",
@ -8437,7 +8439,7 @@
"rc-config-loader": "^4.1.3",
"remote-git-tags": "^3.0.0",
"rimraf": "^5.0.1",
"semver": "^7.5.3",
"semver": "^7.5.4",
"semver-utils": "^1.1.4",
"source-map-support": "^0.5.21",
"spawn-please": "^2.0.1",
@ -9159,9 +9161,9 @@
"integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
},
"semver": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
"integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"

View file

@ -8,13 +8,13 @@
},
"devDependencies": {
"@playwright/test": "1.37.1",
"eslint": "8.47.0",
"eslint": "8.48.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-n": "16.0.2",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"
"npm-check-updates": "16.13.2"
},
"dependencies": {
"@faker-js/faker": "8.0.2",

View file

@ -69,6 +69,7 @@ tblib>=1.7.0 # So that the django test runner provides tracebacks
tlds>=2022042700 # Used to teach bleach about which TLDs currently exist
tqdm>=4.64.0
Unidecode>=1.3.4
urllib3<2 # v2 causes selenium tests to fail with "Timeout value was <object..." error
weasyprint>=59
xml2rfc>=3.12.4
xym>=0.6,<1.0

106
yarn.lock
View file

@ -295,26 +295,36 @@ __metadata:
languageName: node
linkType: hard
"@eslint/js@npm:^8.47.0":
"@eslint/js@npm:8.48.0":
version: 8.48.0
resolution: "@eslint/js@npm:8.48.0"
checksum: b2755f9c0ee810c886eba3c50dcacb184ba5a5cd1cbc01988ee506ad7340653cae0bd55f1d95c64b56dfc6d25c2caa7825335ffd2c50165bae9996fe0f396851
languageName: node
linkType: hard
"@floating-ui/core@npm:^1.2.6":
version: 1.2.6
resolution: "@floating-ui/core@npm:1.2.6"
checksum: e4aa96c435277f1720d4bc939e17a79b1e1eebd589c20b622d3c646a5273590ff889b8c6e126f7be61873cf8c4d7db7d418895986ea19b8b0d0530de32504c3a
"@floating-ui/core@npm:^1.4.1":
version: 1.4.1
resolution: "@floating-ui/core@npm:1.4.1"
dependencies:
"@floating-ui/utils": ^0.1.1
checksum: be4ab864fe17eeba5e205bd554c264b9a4895a57c573661bbf638357fa3108677fed7ba3269ec15b4da90e29274c9b626d5a15414e8d1fe691e210d02a03695c
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.2.5":
version: 1.2.6
resolution: "@floating-ui/dom@npm:1.2.6"
"@floating-ui/dom@npm:^1.5.1":
version: 1.5.2
resolution: "@floating-ui/dom@npm:1.5.2"
dependencies:
"@floating-ui/core": ^1.2.6
checksum: 2226c6c244b96ae75ab14cc35bb119c8d7b83a85e2ff04e9d9800cffdb17faf4a7cf82db741dd045242ced56e31c8a08e33c8c512c972309a934d83b1f410441
"@floating-ui/core": ^1.4.1
"@floating-ui/utils": ^0.1.1
checksum: 3c71eed50bb22cec8f1f31750ad3d42b3b7b4b29dc6e4351100ff05a62445a5404abb71c733320f8376a8c5e78852e1cfba1b81e22bfc4ca0728f50ca8998dc5
languageName: node
linkType: hard
"@floating-ui/utils@npm:^0.1.1":
version: 0.1.2
resolution: "@floating-ui/utils@npm:0.1.2"
checksum: 3e29fd3c69be2d27bb95ebe54129a6a29ea2d8112b2cbb568168cf2f1e787e6ed6305d743598469476bec28122b7ea3ea4b54a1a2d59d30dc4b4307391472299
languageName: node
linkType: hard
@ -1730,9 +1740,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/pluginutils@npm:5.0.3":
version: 5.0.3
resolution: "@rollup/pluginutils@npm:5.0.3"
"@rollup/pluginutils@npm:5.0.4":
version: 5.0.4
resolution: "@rollup/pluginutils@npm:5.0.4"
dependencies:
"@types/estree": ^1.0.0
estree-walker: ^2.0.2
@ -1742,7 +1752,7 @@ __metadata:
peerDependenciesMeta:
rollup:
optional: true
checksum: 8efbdeac53c58ba7b26c353a0a95acb0286cb6afec9816e0c52c3537404be80af11d897f78416a3339a8a76cbce8600269bdf4853edfdebcc89b2e90c56bf3d9
checksum: 893d5805ac4121fc704926963a0ae4e79e9e2bc8d736c3b28499ab69a404cce5119ca3a4e0c3d3a81d62f1beb3966f35285c36935d94b061794f26e94fed4cd1
languageName: node
linkType: hard
@ -2414,12 +2424,12 @@ __metadata:
languageName: node
linkType: hard
"bootstrap@npm:5.3.0":
version: 5.3.0
resolution: "bootstrap@npm:5.3.0"
"bootstrap@npm:5.3.1":
version: 5.3.1
resolution: "bootstrap@npm:5.3.1"
peerDependencies:
"@popperjs/core": ^2.11.7
checksum: 29a83cc8cac96d70051e265a5da342cc488df8fc76dff6746ef7d155698286cd5bdfa3e52c6ebf09f8e5a97f25929ee97aee36237117732e52b0d3276a72c45c
"@popperjs/core": ^2.11.8
checksum: f8176376aa6c6d8947d58a67f0c57fa0b6b7dcd087ff83454e0d727c07cf33e8107e56aa298045d652f84b53b24ac72457af73e41c5631c9ebdc1909039c5dac
languageName: node
linkType: hard
@ -3832,9 +3842,9 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint-plugin-n@npm:16.0.1":
version: 16.0.1
resolution: "eslint-plugin-n@npm:16.0.1"
"eslint-plugin-n@npm:16.0.2":
version: 16.0.2
resolution: "eslint-plugin-n@npm:16.0.2"
dependencies:
"@eslint-community/eslint-utils": ^4.4.0
builtins: ^5.0.1
@ -3846,7 +3856,7 @@ browserlist@latest:
semver: ^7.5.3
peerDependencies:
eslint: ">=7.0.0"
checksum: 407002bb06c2e4cefd5b1fb582a5e000ed190a47144edc7d7910afc32b4b0e76e4a72773207837ab73b0797f4a84f9ea83f8979d0bcab0225bfe672cd7e0e295
checksum: 44cffe32a3a3cd2a706e82f45fedf79e0af7cae20e7c5f3185707233d941de1058373a27b90e86a8f0e5f9830b02c90116deaa05f139a67556954de72bc4935d
languageName: node
linkType: hard
@ -3967,14 +3977,14 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint@npm:8.47.0":
version: 8.47.0
resolution: "eslint@npm:8.47.0"
"eslint@npm:8.48.0":
version: 8.48.0
resolution: "eslint@npm:8.48.0"
dependencies:
"@eslint-community/eslint-utils": ^4.2.0
"@eslint-community/regexpp": ^4.6.1
"@eslint/eslintrc": ^2.1.2
"@eslint/js": ^8.47.0
"@eslint/js": 8.48.0
"@humanwhocodes/config-array": ^0.11.10
"@humanwhocodes/module-importer": ^1.0.1
"@nodelib/fs.walk": ^1.2.8
@ -4010,7 +4020,7 @@ browserlist@latest:
text-table: ^0.2.0
bin:
eslint: bin/eslint.js
checksum: 1988617f703eadc5c7540468d54dc8e5171cf2bb9483f6172799cd1ff54a9a5e4470f003784e8cef92687eaa14de37172732787040e67817581a20bcb9c15970
checksum: f20b359a4f8123fec5c033577368cc020d42978b1b45303974acd8da7a27063168ee3fe297ab5b35327162f6a93154063e3ce6577102f70f9809aff793db9bd0
languageName: node
linkType: hard
@ -4567,9 +4577,9 @@ browserlist@latest:
languageName: node
linkType: hard
"html-validate@npm:8.2.0":
version: 8.2.0
resolution: "html-validate@npm:8.2.0"
"html-validate@npm:8.3.0":
version: 8.3.0
resolution: "html-validate@npm:8.3.0"
dependencies:
"@babel/code-frame": ^7.10.0
"@html-validate/stylish": ^4.1.0
@ -4595,7 +4605,7 @@ browserlist@latest:
optional: true
bin:
html-validate: bin/html-validate.js
checksum: 793287a4549d9c12692a19b8e5e8de64f745c99300c698488c97ec46cee12261fa27e7ea4e3aa951d42a13642fe74aa63b21b2c5ec3faeee41e0aad92857b255
checksum: fd96a96fa7165976c1adf0bc1b54b53285ff7a355f78e54ad4d77de07d9c6e732e77a8079e5ce5a2a331f35fb9cd6b39f0182c7816f82948008882e9992d38df
languageName: node
linkType: hard
@ -5169,10 +5179,10 @@ browserlist@latest:
languageName: node
linkType: hard
"jquery@npm:3.7.0":
version: 3.7.0
resolution: "jquery@npm:3.7.0"
checksum: 907785e133afc427650a131af5fccef66a404885037513b3d4d7d63aee6409bcc32a39836868c60e59b05aa0fb8ace8961c18b2ee3ffdf6ffdb571d6d7cd88ff
"jquery@npm:3.7.1":
version: 3.7.1
resolution: "jquery@npm:3.7.1"
checksum: 4370b8139d6ae82867eb6f7f21d1edccf1d1bdf41c0840920ea80d366c2cd5dbe1ceebb110ee9772aa839b04400faa1572c5c560b507c688ed7b61cea26c0e27
languageName: node
linkType: hard
@ -6846,29 +6856,29 @@ browserlist@latest:
"@parcel/transformer-inline-string": 2.9.3
"@parcel/transformer-sass": 2.9.3
"@popperjs/core": 2.11.8
"@rollup/pluginutils": 5.0.3
"@rollup/pluginutils": 5.0.4
"@twuni/emojify": 1.0.2
"@vitejs/plugin-vue": 4.3.3
bootstrap: 5.3.0
bootstrap: 5.3.1
bootstrap-icons: 1.10.5
browser-fs-access: 0.34.1
browserlist: latest
c8: 8.0.1
caniuse-lite: 1.0.30001519
d3: 7.8.5
eslint: 8.47.0
eslint: 8.48.0
eslint-config-standard: 17.1.0
eslint-plugin-cypress: 2.14.0
eslint-plugin-import: 2.28.1
eslint-plugin-n: 16.0.1
eslint-plugin-n: 16.0.2
eslint-plugin-node: 11.1.0
eslint-plugin-promise: 6.1.1
eslint-plugin-vue: 9.17.0
file-saver: 2.0.5
highcharts: 11.1.0
html-validate: 8.2.0
html-validate: 8.3.0
ical.js: 1.5.0
jquery: 3.7.0
jquery: 3.7.1
jquery-migrate: 3.4.1
js-cookie: 3.0.5
list.js: 2.3.1
@ -6889,7 +6899,7 @@ browserlist@latest:
select2: 4.1.0-rc.0
select2-bootstrap-5-theme: 1.3.0
send: 0.18.0
shepherd.js: 11.1.1
shepherd.js: 11.2.0
slugify: 1.6.6
sortablejs: 1.15.0
vanillajs-datepicker: 1.3.4
@ -7127,13 +7137,13 @@ browserlist@latest:
languageName: node
linkType: hard
"shepherd.js@npm:11.1.1":
version: 11.1.1
resolution: "shepherd.js@npm:11.1.1"
"shepherd.js@npm:11.2.0":
version: 11.2.0
resolution: "shepherd.js@npm:11.2.0"
dependencies:
"@floating-ui/dom": ^1.2.5
"@floating-ui/dom": ^1.5.1
deepmerge: ^4.3.1
checksum: 1d2a0563b642a71d545e7e7fbca3b0ee7b41a9793833af1eb326bdaace7061c71753415a4480130ce3686496a193572bbbaaf4a08a28d0b37ec003791780ed31
checksum: 0e71e63e51b25aaec83c835ecbe33227e6e583a204b347357ce70092e0024b6eb546f3d0cfd9ee4ac704f2baa81a37ab1a3c449312f495c73f2eadc1310f6f42
languageName: node
linkType: hard